Как Makefile может использовать отдельные каталоги для исходного кода и двоичных файлов? - PullRequest
16 голосов
/ 07 февраля 2012

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

В идеале хотелось бы иметь

project_dir
|-Makefile
|-run_tests.sh
|
|__source
|  |-program1.cpp
|  |-program2.cpp
|
|__bin
   |-program1
   |-program2

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

#Current make system
BIN=./bin/
SOURCE=./source/

LIST=program1 program2...

all: $(LIST)

%:  $(SOURCE)%.cpp
    $(CC) $(INC) $< $(CFLAGS) -o $(BIN)$@ $(LIBS)

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

Сейчас я думал только о том, чтобы написать программу для создания make-файла, но я не хочу этого делать.

Ответы [ 3 ]

19 голосов
/ 07 февраля 2012

Вы были почти там ...

#Current make system
BIN=./bin/
SOURCE=./source/

LIST=$(BIN)/program1 $(BIN)/program2...

all: $(LIST)

$(BIN)/%:  $(SOURCE)%.cpp
    $(CC) $(INC) $< $(CFLAGS) -o $@ $(LIBS)

Вы также можете сделать LIST проще, используя следующие

PROG=program1 program2
LIST=$(addprefix $(BIN)/, $(PROG))
3 голосов
/ 21 сентября 2017

Вот полная готовая версия Makefile.

Подготовьте папку со следующим каталогом

для файлов .o: /build/ для файлов .cpp: /src/ для двоичных файлов: /bin/

Затем используйте следующий Makefile в /

CC          = g++
LD          = g++ 
CFLAG       = -Wall
PROG_NAME   = prog

SRC_DIR     = ./src
BUILD_DIR   = ./build
BIN_DIR     = ./bin
SRC_LIST = $(wildcard $(SRC_DIR)/*.cpp)
OBJ_LIST = $(BUILD_DIR)/$(notdir $(SRC_LIST:.cpp=.o))

.PHONY: all clean $(PROG_NAME) compile

all: $(PROG_NAME)

compile: 
    $(CC) -c $(CFLAG) $(SRC_LIST) -o $(OBJ_LIST)

$(PROG_NAME): compile
    $(LD) $(OBJ_LIST) -o $(BIN_DIR)/$@

clean:
    rm -f $(BIN_DIR)/$(PROG_NAME) $(BUILD_DIR)/*.o

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

2 голосов
/ 07 февраля 2012

Простое решение: используйте automake.

Если вы хотите сделать это вручную, вам нужно использовать директиву vpath или переменную окружения VPATH. Руководство по GNU make содержит раздел о них. Поместите ваш Makefile непосредственно в каталог bin, установите VPATH в исходный каталог, и неявные правила снова будут работать.

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