Разделение объектов и исходного кода с помощью make-файла
Вопрос
У меня были проблемы с тем, чтобы мои make-файлы работали так, как я хочу.Прежде всего, я хотел бы сказать, что это POSIX make, например http://www.opengroup.org/onlinepubs/009695399/utilities/make.html Мне нужна моя система сборки, чтобы работать как с BSD, так и с GNU (Linux).
Мне нужен make-файл, не требующий обслуживания.Я хочу, чтобы он просто скомпилировал все файлы .c и .asm в src/ и поместил объектные файлы в objs/, а затем связал все в objs/ с двоичным файлом.
Я могу многое сделать, но не могу заставить его разделить исходный и obj-файлы.
Я согласен, если для этого потребуется небольшой встроенный сценарий оболочки (с использованием определенного POSIX /bin/sh), но я просто не могу заставить зависимости работать правильно.Я хочу, чтобы объектный файл создавался только в том случае, если исходный файл новее.
Мне ближе всего это:
${C_OBJS}: ${HDRS} ${*:objs/%=src/%}.c ${CC} ${CFLAGS} -c ${*:objs/%=src/%}.c -o $*.o
Проблема в том, что я все равно должен указать C_OBJS=objs/foo.o и тому подобное, а также это едва ли не POSIX и, следовательно, компилируется с помощью BSD make, но не GNU make.
Решение
Версия make для POSIX не поддерживает явным образом имена файлов с косой чертой, а также не обеспечивает отделения исходных файлов в другом каталоге от объектных файлов.И, как заметил @caskey, он не поддерживает никаких обозначений с использованием '%
', хотя он отмечает, что такие правила существуют, и рекомендует зарезервировать их для использования в качестве метасимволов.
Следовательно, вы, вероятно, не сможете делать то, что хотите, со стандартом POSIX. make
.
На практике вы часто можете делать то, что хотите, с помощью конкретных реализаций make
, но в результате makefile
имеет ограниченную мобильность.
Рассмотрите возможность использования какой-либо системы генерации make-файлов - cmake
или автоинструменты (autoconf
, libtool
, automake
, и т. д).Или одна из многочисленных переработок основных концепций make
:
- сконы
- муравей
- торт
- готовить
- бюстгальтеры
- ...и о десятке я забыл или не слышал...
Другие советы
POSIX make не поддерживает такие конструкции, как?
objs/%.o : src/%.c
${CC} ${CFLAGS} -c $< -o $@
Забыл вопросительный знак в конце, надеюсь, это сделает мой комментарий более понятным.