[MAKEFILE]: Как скопировать cpp исходных файлов из разных исходных папок в одну целевую папку и использовать эти cpp файлы для сборки с помощью MAKE - PullRequest
0 голосов
/ 07 мая 2020

Мой текущий make-файл выглядит следующим образом, и он правильно строит цели. Но не удается создать цели в одном экземпляре, то есть когда длина пути к исходным файлам становится слишком длинной. Поэтому я хочу собрать все мои исходные файлы в разных папках в один исходный каталог, а затем выполнить сборку.

Любые указания о том, как я могу изменить следующий make-файл для создания плоского исходного каталога и использовать файлы в этом каталоге для сборки с помощью make

PROJ_DIR := ../
SRC_DIR += $(PROJ_DIR)project
SRC_FILES += $(wildcard $(SRC_DIR)/*/source/*.cpp)
OBJ_DIR := $(PROJ_DIR)TASK
OBJ_FILES += $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))

CXXFLAGS := --c++14

CC_INCLUDE_PATH += -I$(PROJ_DIR)project/include

.PHONY: all clean dirs

all: $(OBJ_DIR) $(OBJ_FILES) 
    "$(COMPILERBIN)"/cc.exe -rvn crackLib.a $(OBJ_FILES)

clean:
    @rm -rf crackLib.a $(OBJ_DIR) $(FLAT_INC_DIR)  

# Build target for directory creation. Intermediate build files will be placed here.
$(OBJ_DIR):
    mkdir -p $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
    "$(COMPILERBIN)"/cc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

$(OBJ_DIR)/%.o: $(TSM_SRC_DIR)/%.cpp
    "$(COMPILERBIN)"/cc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

$(OBJ_DIR)/%.o: $(SL_SRC_DIR)/%.cpp
    "$(COMPILERBIN)"/cc.exe $(CXXFLAGS) -c -o $@ $< $(CC_INCLUDE_PATH) 

-include $(OBJ_FILES:.o=.d)

1 Ответ

0 голосов
/ 07 мая 2020

Предположим, у нас есть исходный файл $(SRC_DIR)/longpath/source/foo.cpp, и мы хотим построить объектный файл $(OBJ_DIR)/foo.o. Мы могли бы wi sh для этого правила:

$(OBJ_DIR)/foo.o: $(SRC_DIR)/longpath/source/foo.cpp
    ... $< -o $@

Но мы не знаем путь, когда пишем make-файл, поэтому мы должны попросить Make выяснить это во время сборки.

Есть несколько способов сделать это. Самый простой - использовать директиву vpath .

Если мы заранее определим путь, мы могли бы написать это:

vpath %.cpp $(SRC_DIR)/longpath/source

$(OBJ_DIR)/foo.o: foo.cpp
    ... $< -o $@

Make будет использовать vpath для поиска исходного файла и использования его полного пути в качестве предварительного условия (и, следовательно, $<).

Директива vpath может принимать несколько каталогов, и хотя мы не знаем путь заранее мы знаем, как их вычислить:

vpath %.cpp $(dir $(SRC_FILES))

$(OBJ_DIR)/foo.o: foo.cpp
    ... $< -o $@

И как только мы подтвердим, что это работает, мы можем переключиться на шаблонное правило:

$(OBJ_DIR)/%.o: %.cpp
    ... $< -o $@

и изменить OBJ_FILES соответственно:

OBJ_FILES += $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(notdir $(SRC_FILES)))

all: $(OBJ_FILES)
    ... $^
...