вы можете использовать простое понимание списка:
x=[1,2,3,4]
y=[3,4,5]
common = [i for i in x if i in y]
common: [3,4]
Зависимость target_b
должна быть самой действительной целью или файлом, который уже существует
target_a : file.txt
echo "this is target_a"
touch 0_$@
target_b : target_a
echo "executing target_b"
touch 0_$@
, если вы хотите «создать псевдоним» для создания файла 0_target_a
для target_a
» к действию "можно добавить промежуточное правило:
0_target_a : file.txt
echo "creating 0_target_a"
touch 0_$@
target_a : 0_target_a
target_b : target_a
echo "executing target_b"
touch 0_$@
Я боюсь, что вы не можете сделать это напрямую, и вам придется помочь себе с промежуточной целью, которая делает связь между целью и ее выходом ясной (и, следовательно, дает возможность решить, когда она нужна или не нужна). чтобы быть переделанным:
0_target_a: file.txt
echo "this is target_a"
touch $@
target_b: 0_target_a
echo "executing target_b"
touch 0_$@
Т.е. определение правила для цели 0_target_a
и обновление touch
соответственно даст вам поведение, которое вы хотели, так как make теперь понимает правило, связь между целью и файлом 0_target_a
и знать, когда его не нужно переделывать как зависимость target_b
. Теперь, если вы все еще хотите иметь автономный target_a
, который бы генерировал файл 0_target_a
, вы можете определить его следующим образом:
Поскольку мы знаем, что эта цель на самом деле не создает сам файл, мы можем приложить немного усилий, чтобы найти его результат (target_a
), а также предотвратить конфликты, если такой файл будет создан, объявив его как фальшивый. [1123 ]
На самом деле вы, возможно, захотите дать вашему target_b
такое же лечение, как и в других случаях (опять же, make не имеет h информация для понимания связи между target_b
и 0_target_b
) make target_b
всегда переделывается, даже если файл уже создан.
Весь файл make будет выглядеть так:
[112 ]Если это повторяющаяся тема по всему файлу, вы также можете выразить отношение во второй и третьей строке, задав правило статического шаблона:
target_a target_b: %: 0_%
Это определяет правило, которое является любой целью ( первый '%' без чего-либо еще) имеет обязательное условие префикса 0_
, за которым следует имя цели (0_%
, 0_
плюс основа, которая в данном случае является целевым именем во всей его полноте в соответствии с предыдущим %
) , и делает это правило применимым к целям target_a
и target_a
. Это правило не имеет рецепта и, следовательно, описывает только целевые / обязательные отношения между ними.
Другими словами, это означает то же самое, что и полные примеры строк 2 и 3 вместе взятых.