Автоматические переменные для настройки Makefile.am
У меня есть каталог /src, содержащий все мои исходные файлы, и /bin для хранения всех двоичных файлов после выполнения команды make. Каталог выглядит примерно так:
/BuildDirectory
- - /src
- - /bin
- - configure
- - Makefile.am
- - configure.ac
- - ...
Теперь в Makefile.am я должен указать:
bin_PROGRAMS = bin/x bin/y bin/z bin/k ...
bin_x_SOURCES = src/x.cpp
bin_y_SOURCES = src/y.cpp
bin_z_SOURCES = src/z.cpp
Есть ли какая-либо переменная, которая может помочь избавиться от всех "bin/" и "src/"?
Например, я просто указываю:
$BIN = bin
$SRC = src
И они будут искать правильные файлы в правильных папках и компилировать их в нужные места.
Спасибо
Ответы
Ответ 1
Вы можете воспользоваться удаленным зданием. Поместите этот make файл в каталог bin:
VPATH = ../src
bin_PROGRAMS = x y z k ...
x_SOURCES = x.cpp
y_SOURCES = y.cpp
z_SOURCES = z.cpp
Теперь замените текущий Makefile.am на этот:
SUBDIRS = bin
Теперь настройте файл configure.ac и создайте файл bin/Makefile
AC_CONFIG_FILES([Makefile
bin/Makefile])
и вы должны быть установлены на всю жизнь.
Ответ 2
Не знаю. Если вы хотите отделить свои скомпилированные файлы от исходных файлов, помните, что вы можете строить за пределами дерева:
$ cd foo-1.2.3
$ mkdir build
$ cd build
$ ../configure
$ make
$ make install
Если это то, что вы хотите сделать, вы можете сделать Makefile.am
проще, создав двоичные файлы без префикса каталога (и все же ссылаясь на вещи в src/
вручную).
Ответ 3
Если вы пытаетесь сделать то, что, я думаю, вы пытаетесь сделать, вы пытаетесь достичь чего-то вроде:
SRCDIR = src
BINDIR = bin
bin_PROGRAMS = $(BINDIR)/x $(BINDIR)/y $(BINDIR)/z
bin_x_SOURCES = $(SRCDIR)/x.cpp
bin_y_SOURCES = $(SRCDIR)/y.cpp
bin_z_SOURCES = $(SRCDIR)/z.cpp
Я тестировал это несколько раз в разных формах, и он не будет компилировать код, как это было бы с вашим примером; Я как-то убедился, что он компилирует C на одном этапе:
gmake[1]: *** No rule to make target `bin/x.c', needed by `x.o'. Stop.
Таким образом, я уверен, что это невозможно. К сожалению.