Указание каталога сборки в файле make - PullRequest
4 голосов
/ 08 января 2012

Я относительно новичок в создании файлов ручной работы.Я собрал основной файл make для сборки библиотеки.Я хочу сохранить все временные файлы .o в каталоге сборки и сохранить исполняемый файл в каталоге bin.

Моя структура каталогов выглядит следующим образом:

root
   src/
   include/
   build/
   bin/
   Makefile

, и этокак выглядит мой make-файл:

SHLIB = pg_extlib

SRC =  src/file1.c \
       src/file2.c

OBJS = build/file1.o \
       build/file2.o

debug_build:
    gcc -g -fPIC -c $(SRC) -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude
    gcc -shared -o bin/$(SHLIB).so $(OBJS) -lm -lpq -lmylib_core


clean:
    rm -f $(SHLIB) $(OBJS) 

.o файлы правильно размещаются в папке сборки, но они также появляются в корневой папке (где находится Makefile).Как мне это исправить?

1 Ответ

5 голосов
/ 08 января 2012

Я вижу, как вы получаете объектные (.o) файлы в корневой папке, но я понятия не имею, как вы получаете их в папке сборки.

Давайте рассмотрим это поэтапно. Сначала мы дадим объектным файлам свои собственные правила:

# Note the use of "-o ..."
build/file1.o:
    gcc -g -fPIC -c src/file1.c -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o build/file1.o

build/file2.o:
    gcc -g -fPIC -c src/file2.c -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o build/file2.o

debug_build: $(OBJS)
    gcc -shared -o bin/$(SHLIB).so $(OBJS) -lm -lpq -lmylib_core

Это эффективно, но грубо. Объектные файлы теперь входят в build/, но есть много избыточности, нет обработки зависимостей. Поэтому мы вводим предварительные условия, и, предполагая, что вы используете GNUMake (что вам следует), мы можем использовать Автоматические переменные (и я сокращу строку -I только для удобства чтения):

build/file1.o: src/file1.c
    gcc -g -fPIC -c $< -I... -o $@

build/file2.o: src/file2.c
    gcc -g -fPIC -c $< -I... -o $@

debug_build: $(OBJS)
    gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core

Обратите внимание, что команды в правилах объекта теперь точно такие же. Таким образом, мы можем объединить эти два правила несколькими способами. Самое простое это:

build/file1.o: src/file1.c
build/file2.o: src/file2.c

build/file1.o build/file2.o:
    gcc -g -fPIC -c $< -I... -o $@

Теперь еще один или два небольших изменения, и мы готовы идти:

build/file1.o: src/file1.c
build/file2.o: src/file2.c

build/file1.o build/file2.o:
    gcc -g -fPIC -c $< -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o $@

debug_build: $(OBJS)
    gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core

Есть более изощренные трюки, но пока этого должно быть достаточно.

...