Подтвердить что ты не робот

Переопределить цель в make файле, чтобы добавить дополнительные команды?

На работе мы используем общий make файл, который включает в себя другие make файлы (через оператор include), и он имеет общую "чистую" цель, которая убивает некоторые распространенные файлы. Я хочу добавить к этой цели в свой новый make файл, чтобы я мог удалить некоторые определенные файлы, но если я добавлю чистую цель в свой make файл, он просто переопределит старый файл.

Я знаю, что могу просто создать новую цель с новым именем и попросить ее очистить, а затем сделать другие вещи, но ради согласованности я бы хотел просто позвонить, сделать чистым и сделать все.

Возможно ли это?

4b9b3361

Ответ 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