Могу ли я контролировать выходной каталог для файлов .d denpendency для проекта c ++? - PullRequest
0 голосов
/ 12 ноября 2019

У меня есть следующий универсальный Makefile для моего проекта c ++. Недавно я переместил свой компилятор из GNU в компилятор PGI и обнаружил, что файлы зависимостей больше не хранятся в BUILD_PATH, а вместо этого в SRC_PATH. Можно ли в любом случае сохранить их все в BUILD_PATH, чтобы сохранить папку src в чистоте?

OBJECTS = $(SOURCES:$(SRC_PATH)/%.$(SRC_EXT)=$(BUILD_PATH)/%.o)
DEP = $(OBJECTS:.o=.d)

CPP_FLAGS = -std=c++11 -g -Wall -MD

.PHONY: default_target
default_target: release

.PHONY: release
release: dirs
    @$(MAKE) all

.PHONY: dirs
dirs:
    @echo "Creating directories"
    @mkdir -p $(dir $(OBJECTS))
    @mkdir -p $(BIN_PATH)

.PHONY: clean
clean:
    @echo "Deleting $(BIN_NAME) symlink"
    @$(RM) $(BIN_NAME)
    @echo "Deleting directories"
    @$(RM) -r $(BUILD_PATH)
    @$(RM) -r $(BIN_PATH)
    @$(RM) $(DEPS)

# checks the executable and symlinks to the output
.PHONY: all
all: $(BIN_PATH)/$(BIN_NAME)
    @echo "Making symlink: $(BIN_NAME) -> $<"
    @$(RM) $(BIN_NAME)
    @ln -s $(BIN_PATH)/$(BIN_NAME) $(BIN_NAME)

# Creation of the executable
$(BIN_PATH)/$(BIN_NAME): $(OBJECTS)
    @echo "Linking: $@"
    $(CXX) $(CPPFLAGS) $(LFLAGS) -o $@ $(OBJECTS) $(LIBS)

# Add dependency files, if they exist
-include $(DEPS)

# Source file rules
# After the first compilation they will be joined with the rules from the
# dependency files to provide header dependencies
$(BUILD_PATH)/%.o: $(SRC_PATH)/%.$(SRC_EXT)
    @echo "Compiling: $< -> $@"
    $(CXX) $(CPP_FLAGS) $(LFLAGS) -c $< -o $@ $(LIBS) 


1 Ответ

0 голосов
/ 12 ноября 2019

Компилятор PGI описывает '-MD':

-MD Создает список зависимостей make и печатает их в файл file.d, где file является корневым именем файла. в процессе компиляции.

Не предлагает никаких вариантов управления местоположением. Аналогично, GCC:

-MD -MD эквивалентно файлу -M -MF, за исключением того, что -E не подразумевается. Драйвер определяет файл в зависимости от того, задана ли опция -o. Если это так, драйвер использует свой аргумент, но с суффиксом .d, в противном случае он берет имя входного файла, удаляет все компоненты каталога и суффикс и применяет суффикс .d.

На первый взгляд, две опции:

  1. В правиле "% .o" добавьте команду для 'mv' '.d', если она создана в SRC, в BUILD_PATH
  2. Добавьте явное правило с помощью '-M' и перенаправьте стандартный вывод в папку BUILD_PATH.

Я думаю, что # 1 проще:

$(BUILD_PATH)/%.o: $(SRC_PATH)/%.$(SRC_EXT)
    @echo "Compiling: $< -> $@"
    $(CXX) $(CPP_FLAGS) $(LFLAGS) -c $< -o $@ $(LIBS) 
    [ -f "${^D}/$*.d" ] && mv -f "${^D}/${*}.d" "${@D}/" || true

Не удалось протестировать с компилятором PGI (без PGIкомпилятор для меня), так что я надеюсь, что он на самом деле будет работать.

...