Разделение объектов и исходного кода с помощью make-файла

StackOverflow https://stackoverflow.com/questions/1015836

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня были проблемы с тем, чтобы мои 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 $@

Забыл вопросительный знак в конце, надеюсь, это сделает мой комментарий более понятным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top