Как отменить промежуточное удаление файла - PullRequest
35 голосов
/ 09 марта 2012

У меня есть программный стек, который создает некоторые промежуточные файлы как часть процесса сборки.Возникла какая-то проблема, и сборка сломалась.Я хочу взглянуть на эти промежуточные сгенерированные файлы.К моему удивлению, эти файлы удаляются как часть процесса сборки.

Removing intermediate files...
rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o

Я просмотрел Makefiles и не вижу явных правил их удаления.Могут ли быть какие-то неявные правила удаления промежуточных файлов.Если да, как я могу отключить эти неявные правила?

Я вижу печать Removing intermediate files..., только если make выполняется с опцией --debug.

skmt@tux:~/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

Ответы [ 3 ]

41 голосов
/ 13 марта 2012

Вы также можете использовать .SECONDARY, который сохранит указанные файлы, даже если сборка не нарушится.

, например

 .SECONDARY:
40 голосов
/ 09 марта 2012

Если вы используете GNUMake, вы можете использовать специальную цель .PRECIOUS:

.PRECIOUS: fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o

или просто

.PRECIOUS: %.c %.o

Единственный эффект - эти файлы не будутудаляется, если Make убит или прерван.

7 голосов
/ 22 марта 2017

Существует ограничение на использование целей, которое влияет на поведение .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:.

Принято использовать эти специальные цели без зависимости, но я думаю, что это было бы очень грязным кодированием и могло бы вызвать побочные эффекты.Некоторые люди просто ставят .PRECIOUS: или .SECONDARY: без dep, и позже они жалуются, что им нужно запустить make clean после сломанной сборки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...