GNU make не удаляет промежуточные файлы - PullRequest
4 голосов
/ 29 июня 2011

Мой make-файл выглядит так:

# The names of targets that can be built.  Used in the list of valid targets when no target is specified, and when building all targets.
TARGETS := libAurora.a libAurora.so

# The place to put the finished binaries.
TARGET_DIRECTORY := ./Binaries

# The compiler to use to compile the source code into object files.
COMPILER := g++

# Used when compiling source files into object files.
COMPILER_OPTIONS := -I. -Wall -Wextra -fPIC -g -O4

# The archiver to use to consolidate the object files into one library.
ARCHIVER := ar

# Options to be passed to the archiver.
ARCHIVER_OPTIONS := -r -c -s

SOURCE_FILES := $(shell find Source -type f -name *.cpp)
OBJECT_FILES := $(SOURCE_FILES:.cpp=.o)

.PHONY: Default # The default target, which gives instructions, can be called regardless of whether or not files need to be updated.
.INTERMEDIATE: $(OBJECT_FILES) # Specifying the object files as intermediates deletes them automatically after the build process.

Default:
    @echo "Please specify a target, or use \"All\" to build all targets.  Valid targets:"
    @echo "$(TARGETS)"

All: $(TARGETS)

lib%.a: $(OBJECT_FILES)
    $(ARCHIVER) $(ARCHIVER_OPTIONS) $(TARGET_DIRECTORY)/$@ $(OBJECT_FILES)

lib%.so: $(OBJECT_FILES)
    $(ARCHIVER) $(ARCHIVER_OPTIONS) $(TARGET_DIRECTORY)/$@ $(OBJECT_FILES)  

%.o:
    $(COMPILER) $(COMPILER_OPTIONS) -c -o $@ $*.cpp

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

Странно то, что он отлично работает на другой машине. Это наводит меня на мысль, что это другая версия make, но man make по-прежнему показывает ее как «утилиту GNU make».

Почему make не удаляет промежуточные файлы?

РЕДАКТИРОВАТЬ: make -v сообщает о версии 3.81.

РЕДАКТИРОВАТЬ: После удаления файлов .o вручную (т. Е. С чистого листа), make All производит следующий вывод:

g++ -I. -Wall -Wextra -fPIC -g -O4 -c -o Source/File/File.o Source/File/File.cpp
g++ -I. -Wall -Wextra -fPIC -g -O4 -c -o Source/Timer/Timer.o Source/Timer/Timer.cpp
ar -r -c -s ./Binaries/libAurora.a Source/File/File.o Source/Timer/Timer.o
ar -r -c -s ./Binaries/libAurora.so Source/File/File.o Source/Timer/Timer.o

Ответы [ 2 ]

4 голосов
/ 29 июня 2011

Убедитесь, что файлов нет, прежде чем начать сборку проекта. Док четко говорит:

Следовательно, промежуточный файл, который не существовал до make, также не существует после make.

Если это не проблема, вы должны опубликовать отладочный вывод из make.

3 голосов
/ 29 июня 2011

Итак, я скопировал это на свою машину и смог воспроизвести и вашу проблему, и решение.

Обратите внимание, что в вашей цели .INTERMEDIATE вы используете $(OBJECT_FILES) в качестве предварительного условия, но для правила, которое создает файлы .o, вы используете правило шаблона. Это смущает make и не признает, что оба относятся к одному и тому же. Есть два решения этой проблемы:

  1. Измените предпосылки .INTERMEDIATE с $(OBJECT_FILES) на %.o, чтобы оно выглядело как

    .INTERMEDIATE: %.o
    
  2. Измените правило для создания файлов .o на

    $(OBJECT_FILES): $(SOURCE_FILES)
        $(COMPILER) $(COMPILER_OPTIONS) -c $< -o $@
    

    или что-то в этом роде.

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

Более подробную информацию о промежуточной цели можно найти здесь .

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