Чистый способ написать Makefile для выполнения сборки из исходного кода - PullRequest
0 голосов
/ 11 ноября 2019

Используя простой сценарий структуры папок с папкой проекта, где в этом корне находится сборка и папка источников:

project
- build
- sources

В папке источников находится hello.cpp:

#include <iostream>

using namespace std;

int main() {
  cout << "Hello world!\n";
}

и Makefile:

SOURCE_DIRECTORIES = ../ch1

vpath %.cpp $(SOURCE_DIRECTORIES)

hello: hello.cpp
    g++ ${SOURCE_DIRECTORIES}/hello.cpp -o hello

Я запускаю вот так из папки сборки:

make -f ../sources/Makefile

Вышеописанное работает, но vpath не так полезен. Даже с vpath я должен добавить путь SOURCE_DIRECTORIES в командной строке. Я мог бы также не использовать vpath и просто использовать $ (SOURCE_DIRECTORIES), где это необходимо.

Это также немного хрупко, поскольку папка сборки должна находиться на том же уровне, что и папка источников. Но я могу жить с этим.

Это лучший подход? Я думаю, что должен быть лучший способ сделать это.

1 Ответ

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

Вам не нужно использовать vpath, вот способ поместить makefile в исходный каталог и позволить ему использовать переменную BUILD с соответствующим каталогом сборки:

-include makefile.in # optionally read in config file

BUILD ?= build # or some other default...

$(BUILD)/hello: $(BUILD)/hello.o
    $(CXX) -o $@ $<

$(BUILD)/%.o: %.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ -c $<

Таким образом, по умолчанию выводится все в src/build (следовательно, нет реальной сборки вне исходного кода), но вы можете просто изменить это поведение с помощью makefile.in файла «конфигурации», который может быть просто

BUILD = ../build

Этого достаточно, поскольку в makefile, BUILD ?= гарантирует, что переменная установлена ​​в правую часть, только если она еще не определена.

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