Переопределить цель в make файле, чтобы добавить дополнительные команды?
На работе мы используем общий make файл, который включает в себя другие make файлы (через оператор include), и он имеет общую "чистую" цель, которая убивает некоторые распространенные файлы. Я хочу добавить к этой цели в свой новый make файл, чтобы я мог удалить некоторые определенные файлы, но если я добавлю чистую цель в свой make файл, он просто переопределит старый файл.
Я знаю, что могу просто создать новую цель с новым именем и попросить ее очистить, а затем сделать другие вещи, но ради согласованности я бы хотел просто позвонить, сделать чистым и сделать все.
Возможно ли это?
Ответы
Ответ 1
Вы можете написать свой собственный чистый и сделать его предпосылкой общей очистки.
clean: myclean
myclean:
rm whatever
Сначала вы запустите. Если по какой-то причине вы хотите, чтобы обычный чист работал первым, тогда решение будет более сложным.
Ответ 2
Я видел это в нескольких магазинах. Наиболее распространенный подход - использовать правила двойной толстой кишки, предполагая, что вы используете что-то вроде GNU make. В вашем общем makefile у вас будет что-то вроде этого:
clean::
# standard cleanup, like remove all .o's:
rm -f *.o
Обратите внимание, что есть два двоеточия, следующие за clean
, а не только один!
В вашем другом make файле вы просто объявляете clean
снова, как правило с двойной колонией:
clean::
# custom cleanup, like remove my special generated files:
rm -f *.h.gen
Когда вы вызываете make clean
, GNU make автоматически выполнит обе эти "ветки" чистого правила:
% make clean
rm -f *.o
rm -f *.h.gen
Это просто настроить, и он складывается довольно аккуратно, я думаю. Обратите внимание, что специально, потому что это правило с двумя двоеточиями, вы не получаете ошибок "переопределяющих команд", которые вы обычно получаете, когда вы определяете два правила для одной и той же цели. Такой тип правил двойной толстой кишки.
Ответ 3
Кажется, что общее правило makefile должно называться чем-то вроде common-clean
. Затем каждый основной файл make объявит свое чистое правило как
clean: common-clean
и вы настроены.
Если это не вариант, вы можете взглянуть на правила двойного двоеточия, но они вводят целый ряд проблем для рассмотреть.
Ответ 4
Использовать неявные правила:
existing-target: my-extention
my-extention:
echo running command 1
echo running command 2
Очень просто сделать учебник для увеличения.
При использовании :: вы можете столкнуться с проблемами, так как make жалуется, когда вы смешиваете правила двоеточия : и двойные двоеточие :::
a:
echo a
a::
echo aa
приведет к:
. . .
*** target file `a' has both : and :: entries. Stop.
Ответ 5
Для наших мы определяем переменную EXTRAFILESTOCLEAN, затем, когда выполняется чистое правило, у нее есть шаг, чтобы удалить все, что указано в переменной EXTRAFILESTOCLEAN
clean:
rm -f *.o
ifdef $(EXTRAFILESTOCLEAN)
rm -f $(EXTRAFILESTOCLEAN)
endif
Это может вызвать непредвиденные проблемы, если вы установите эту переменную на странные значения, но вы можете защитить их, добавив префиксы или другие тесты.
Ответ 6
Добавление другого возможного решения, которое я видел для потомков... Я знаю, что OP опасался изменения общего файла makefile, но что-то вроде этого работает и требует минимальных изменений.
локальный makefile 1:
CLEAN=MyExe1 MyExe2
....
include /my/common/makefile
local makefile 2:
CLEAN=MyExe3 MyExe4
....
include /my/common/makefile
общий файл makefile:
clean:
rm -f *.dep *.o *.a $(CLEAN)
В основном идея состоит в том, чтобы определить некоторую переменную (в данном случае CLEAN
) в каждом локальном make файле со всеми конкретными элементами, которые вы хотите удалить. Затем общий файл makefile запускает rm -f
для всех распространенных типов файлов для удаления, плюс все, что было специально отмечено для удаления в каждом локальном make файле с помощью переменной CLEAN
. Если нет ничего конкретного для удаления, просто опустите объявление переменной или оставьте его пустым (CLEAN=
)
Итак, если мы запустим make clean
для локального make файла 1, он выполнит
rm -f *.dep *.o *.a MyExe1 MyExe2
И если мы запустим make clean
для локального make файла 2, он выполнит
rm -f *.dep *.o *.a MyExe3 MyExe4