2016-04-05 2 views
0

У меня есть файл makefile с линией, содержащий список компонентов с правой стороны. Я хочу использовать макрос $ ^, чтобы архивировать список, который находится в другом каталоге. Следующая строка просто использовать первый компонент в другом каталоге, а остальное обрабатывается в текущем каталоге, который является неправильным:

libExApp.a: xapp_e.o xsage_e.o users.o id.o prog.o 
    ar rc [email protected] ia32/$^ 

Если я использую фигурные скобки {}, то нет запятой между файлами, которые будут обрабатываться в тот же каталог.

Итак, как я могу использовать несколько компонентов, все обработанные в одном каталоге.

+1

Вы должны указать файлы, которые используете в качестве зависимостей, и просто использовать 'ar rc $ @ $ ^' в качестве рецепта. Кроме того, рассмотрите возможность отказа от использования рецептов, которые создают файлы в одном каталоге из файлов в другом; «make» на самом деле не был разработан с учетом этого, и хотя это можно сделать, я предпочитаю просто идти с традиционным способом делать вещи, а именно создавать все файлы на месте и использовать цель «install» для копирования их к месту назначения. – reinierpost

+0

@reinierpost make can * абсолютно * обрабатывает цели и предпосылки в произвольных каталогах. Хотя, конечно, некоторые части этого могут усложниться. Тем не менее, это не то же самое касается создания целей в * установленных * местах. Это не то, что нужно сделать. –

+0

@ Этан Рейснер: Конечно, может, я просто советую против этого. – reinierpost

ответ

3

Не делайте этого. Сделай это правильно. Скажите сделать, где актуальных предварительных условий, а затем просто используйте $^ нормально.

libExApp.a: ia32/xapp_e.o ia32/xsage_e.o ia32/users.o ia32/id.o ia32/prog.o 
     ar rc [email protected] $^ 

Или, чтобы избежать повторения ia32 префикса вы можете использовать функцию addprefix.

libExApp.a: $(addprefix ia32/,xapp_e.o xsage_e.o users.o id.o prog.o) 
     ar rc [email protected] $^ 
+0

Второй вариант является хорошим и коротким, но единственная проблема заключается в том, что он изменяет целевые имена i.e xapp_e.o xsage_e.o users.o id.o prog.o. У меня много похожих строк, и я не хочу менять имена целей. Есть ли способ изменить макрос $ ^? – Masood

+1

Вы * можете * использовать '$ (addprefix)' on '$ ^' в рецепте, но вы * не должны *, поскольку он * будет * путать make и вещи ** не будут работать корректно. Например, делая это, вы сообщаете make для * build * объектов 'xapp_e.o' и т. Д. В текущем каталоге (и используйте их для проверки свежестью' libExApp.a'), а затем, чтобы * на самом деле * связать * копий * этих файлов из каталога 'ia32', который может быть или не быть вообще связан. То есть, вы явно ** нарушаете механизмы работы make. Так что, не делайте этого. –

Смежные вопросы