nmake makefile, связывающий файлы объектов в подпапке - PullRequest
0 голосов
/ 20 апреля 2010

Мой make-файл определяет команду ссылки:

prod_link = $(LINK) $(LINK_FLAGS) -o$(PROD_OUT) $(PROD_OBJS)

, где $(PROD_OBJS) - список объектных файлов в форме:

PROD_OBJS = objfile1.obj objfile2.obj objfile3.obj ... objfileN.obj

Теперь сам make-файл находится в корневом каталоге.моего каталога проекта.Грязно иметь объект и перечислять файлы в корне, я хотел бы поместить их в подпапку.

Работает сборка и вывод файлов obj в подпапку, я делаю это с суффиксами и логическим выводом:

.s.obj:
    $(ASSEMBLY) $(FLAGS) $*.s -o Objects\$*.obj

Проблема состоит в том, чтобы передать папку Objects в команду ссылки.

Я попытался:

prod_link = $(LINK) $(LINK_FLAGS) -o$(PROD_OUT) Objects\$(PROD_OBJS)

, но только первый файл всписок объектных файлов получает имя папки.

Как передать подпапку Objects во все файлы моего списка $(PROD_OBJS)?


РЕДАКТИРОВАТЬ

Я также пытался

PROD_OBJS = $(patsubst %.ss,Object\%.obj, $(PROD_SRC))

, но получил:

makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.

Это довольно странно ...

Ответы [ 2 ]

0 голосов
/ 02 сентября 2015

Очень поздно на вечеринку, но в случае, если кто-то еще столкнется с той же проблемой:

Эта ошибка

makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.

вызвано тем, что nmake не поддерживает синтаксис patsubst. Вы можете обойти это, используя альтернативный синтаксис

$(var:suffix=replacement)

вместо

$(patsubst %suffix,%replacement,$(var))

(это также действует в gnumake).

0 голосов
/ 24 декабря 2010

nmake - это , а не GNUMake, и это скорее мусор. Подробнее см. NMAKE Reference .

Что касается вашей проблемы (перевод 1.o 2.o 3.o в d/1.o d/2/o d/3.o), попробуйте

OBJS= 1.o 2.o 3.o
# Looks wierd I know, but basically change ' ' to ' d/'
# (and it's not very robust!)
OBJS_WITH_PREFIX= d/$(OBJS: = d/)
!ERROR [$(OBJS_WITH_PREFIX)]

Кстати, ваше правило паттерна обманывает nmake. Вы говорите .s.obj:, что говорит «вот как конвертировать файл .s в .obj», но затем команды, которые вы даете, фактически создают объект в подпапке. Вы должны были начать правило шаблона с .s{Objects\}.obj:. Для получения дополнительной информации см. Документацию ( Поиск путей в правилах ).

...