Как построить make зависимость, когда целевое имя не является именем файла

вы можете использовать простое понимание списка:

x=[1,2,3,4]
y=[3,4,5]
common = [i for i in x if i in y]
common: [3,4]
0
задан tt_pre 18 January 2019 в 12:13
поделиться

2 ответа

Зависимость 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
ответ дан igagis 18 January 2019 в 12:13
поделиться

Я боюсь, что вы не можете сделать это напрямую, и вам придется помочь себе с промежуточной целью, которая делает связь между целью и ее выходом ясной (и, следовательно, дает возможность решить, когда она нужна или не нужна). чтобы быть переделанным:

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, вы можете определить его следующим образом:

[111 ]

Поскольку мы знаем, что эта цель на самом деле не создает сам файл, мы можем приложить немного усилий, чтобы найти его результат (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 вместе взятых.

0
ответ дан Ondrej K. 18 January 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: