Как отменить промежуточное удаление файлов
У меня есть программный стек, который создает некоторые промежуточные файлы как часть процесса сборки. Возникает некоторая проблема, и сборка ломается. Я хочу посмотреть на эти промежуточные созданные файлы. К моему удивлению, эти файлы удаляются как часть процесса сборки.
Removing intermediate files...
rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o
Я прошел через Makefile, я не вижу никаких явных правил, удаляющих их. Могут ли быть какие-либо неявные правила для удаления промежуточных файлов. Если да, то как я могу отключить эти неявные правила?
Я вижу печать Removing intermediate files...
, только если make выполняется с опцией --debug
.
[email protected]:~/coding/factorial/ut$ make --debug
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu
Reading makefiles...
Updating goal targets....
File `check' does not exist.
File `test_dept_run' does not exist.
File `fact_test' does not exist.
File `fact_using_proxies.o' does not exist.
File `fact_test_without_proxies' does not exist.
File `fact_test_without_proxies.o' does not exist.
File `fact_test_without_proxies.c' does not exist.
File `fact_test_main.c' does not exist.
Must remake target `fact_test_main.c'.
nm -p fact_test.o | build_main_from_symbols >fact_test_main.c
Successfully remade target file `fact_test_main.c'.
Must remake target `fact_test_without_proxies.c'.
cp fact_test_main.c fact_test_without_proxies.c
Successfully remade target file `fact_test_without_proxies.c'.
Must remake target `fact_test_without_proxies.o'.
gcc -I../src -c -o fact_test_without_proxies.o fact_test_without_proxies.c
Successfully remade target file `fact_test_without_proxies.o'.
Must remake target `fact_test_without_proxies'.
gcc fact_test_without_proxies.o fact.o fact_test.o -o fact_test_without_proxies
fact.o: In function `unknown':
fact.c:(.text+0x67): undefined reference to `do_update'
collect2: ld returned 1 exit status
make: *** [fact_test_without_proxies] Error 1
Removing intermediate files...
rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o
Ответы
Ответ 1
Если вы используете GNUMake, вы можете использовать специальную цель .PRECIOUS
:
.PRECIOUS: fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o
или просто
.PRECIOUS: %.c %.o
Единственный эффект заключается в том, что эти файлы не будут удалены, если Make был убит или прерван.
Ответ 2
Вы также можете использовать .SECONDARY, который сохранит указанные файлы, даже если сборка не сломается.
например.
.SECONDARY:
Ответ 3
Существует ограничение на использование целей, которое влияет на поведение .PRECIOUS:
У меня есть цели A/%. foo: и B/%. foo:, поэтому я установил:
.PRECIOUS: %.foo
и это не сработало; Я не понимаю, почему, но расширение не работает таким образом; Мне пришлось явно перечислять цели точно так, как они написаны:
.PRECIOUS: A/%.foo B/%.foo
Но даже после чтения https://www.gnu.org/software/make/manual/html_node/Special-Targets.html Я не понимаю разницы между .PRECIOUS: и .SECONDARY:.
Он согласился использовать эти специальные цели, но не думаю, но я думаю, что это было бы очень грязное кодирование и ожидало бы побочных эффектов. Некоторые люди просто поставили. ПРЕЦИЗИРУЮТ: или. СЕКУНДАРЬ: без депо, а потом они жалуются, что им нужно бегать, чистить после сломанной сборки...