несколько Makefile для одного проекта - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь построить проект с несколькими включенными модулями. дерево файлов выглядит следующим образом:

enter image description here

отдельные файлы Makefile для lib_one, lib_two и Main. cpp работают нормально, генерируя 2 DLL и EXE для проекта, но требует войти в каждый каталог и выполнить команду 'make' для каждого модуля.

Теперь я хочу создать Makefile в каталоге верхнего уровня ('/ project'), который запускает сборку для всех другие модули (DLL и EXE) один раз. Основываясь на некоторых результатах поиска, я получил что-то вроде этого:

lib_one := ./src/lib_one
lib_two := ./src/lib_two
libraries := $(lib_one) $(lib_two)
player    := ./src

.PHONY: all $(player) $(libraries)
all: $(player)

$(player) $(libraries):
        $(MAKE) --directory=$@

$(player): $(libraries)

, когда я выполняю команду 'make', я получил эту ошибку:

Makefile:10: ***.  Stop.

(строка 10 такова: $(MAKE) --directory=$@). Помимо способа исправить эту ошибку, я ищу способ выполнить sh следующие 3 вещи:

1) объектные файлы (*.o) из всех модулей (DLL и EXE) должны быть хранит в каталоге build там же, где и в каталоге src.

2) конечные файлы (*.dll и *.exe) должны быть помещены в каталог reelease вместе с каталогами src и build.

3) если бы элемент 2 был возможен, было бы неплохо, если бы каждый тип файла был помещен в определенный каталог c внутри release (bin для * 1033) *, lib для *.dll и shared для других типов). также, даже если exe и dll находятся в разных каталогах, можно было бы запустить исполняемый файл из этого каталога (чтобы он выполнял поиск необходимых библиотек в ../lib наряду с другими обычными местами?).

1 Ответ

0 голосов
/ 07 января 2020

@ Максим, скорее всего, является причиной ошибки - пробелы и табуляции. Что касается других ваших вопросов go, без использования нерекурсивного make вы можете сделать что-то вроде:

Makefile:

export base_dir := ${CURDIR}
export obj_dir := ${base_dir}/build
export release_dir := ${base_dir}/release   

lib_one := ${base_dir}/src/lib_one
lib_two := ${base_dir}/src/lib_two
libraries := $(lib_one) $(lib_two)
player    := ${base_dir}/src

.PHONY: all $(player) $(libraries)
all: $(player)

$(player) $(libraries): | ${obj_dir} ${release_dir}
        $(MAKE) --directory=$@

$(player): $(libraries)

${obj_dir} ${release_dir} :
        @mkdir -f $@

Подфайлы будут иметь доступ к любому экспортированная переменная из родительского объекта (см. здесь ), поэтому в них вы можете делать такие вещи, как:

${obj_dir}/%.o : %.c
       @echo  compiling "$^ ==> $@"
       $(CC) -c -o $@ $^ $(CFLAGS)

, которые скомпилируют объекты в правильный каталог.

Однако будьте осторожны - если у вас есть два компонента, которые создают объектный файл с одинаковым именем, потому что они создаются в одном и том же каталоге, вы столкнетесь с потенциально трудным для отладки состоянием гонки. Обычно каждый компонент создает объектные файлы в своем собственном уникальном каталоге, чтобы избежать этой самой вещи.

...