2014-01-31 3 views
1

У меня файл structre какMakefile не собирание зависимостей, когда в переменной

/ 
|- Makefile 
|- libs 
    |- lib1 
    |- lib2 
|- src 
    |- file.cpp 

У меня есть один Makefile верхнего уровня, который включает в себя Rules.mk файл в каждом подкаталоге. Правило файла src зависит от lib1 и lib2, которые также создаются в make-файле.

теперь у меня есть цель, как:

# predefined rule 
COMP := gcc -o [email protected] $< $(FLAGS) 

file.o: OBJS := libs/lib1/lib1.o libs/lib2/lib2.o 
file.o: file.cpp $(OBJS) 
    $(COMP) $(OBJS) 

при создании материала (цель по умолчанию file.o) жалуется на библиотеки не там. Когда я добавляю эхо в задачу file.o и распечатываю $(OBJS), он распечатывает все библиотеки, которые я ему назначил, но make не вызывает их создание.

Когда я заменяю переменную $ (OBJS) в зависимостях с именами файлов, она запускает сборки и, очевидно, находит необходимые библиотеки.

Я думал, что это может иметь какое-то отношение к .SECONDARYEXPANSION, но это не должно быть, поскольку я не использую задержанные переменные.

Заранее благодарен!

С уважением Крис

PS: проект находится на Github в любом случае, следующий файл содержит правила я говорю: https://github.com/janhancic/CHIC/blob/242c0ceee558c2eb4b21fe73e94a9ab5f3fe0b49/src/Rules.mk

ответ

1

Вы не можете это сделать. Документация для GNU make очень понятна: целевые переменные доступны ТОЛЬКО внутри рецепт. Они недоступны в целевых или предварительных списках. В предварительном списке make make будет расшифровывать значение $(OBJS) значение глобальной переменной OBJS или пустую строку, если она не существует; НЕ к целевому значению переменной.

Однако, я не понимаю, почему вы пишете это:

file.o: OBJS := libs/lib1/lib1.o libs/lib2/lib2.o 

, когда вы могли бы просто написать это:

file.o: libs/lib1/lib1.o libs/lib2/lib2.o 

и он работает нормально?

+0

Спасибо большое, что все объясняет! :) Вчера я смотрел страницу руководства около 2 часов, но не видел этого ... возможно, было слишком поздно, чтобы сосредоточиться Да, это то, что я сделал, чтобы обойти это, но я установил TGT для связи, и я также хочу, чтобы задача зависела от нее, поэтому я хотел использовать целевую специфическую переменную в зависимостях, а также – deadc0de

+0

Страница руководства - это просто краткое справочное руководство.Он не содержит всего, что нужно знать об использовании GNU make: это было бы слишком долго. Вы должны посмотреть руководство пользователя GNU. Это должно быть доступно вам, где бы вы ни находили программу make, или вы можете прочитать ее в Интернете http://www.gnu.org/software/make/manual/. Обратите внимание, что онлайн-версия предназначена для последней версии; там могут быть зафиксированы там, что ваша версия не поддерживает, если она старше. – MadScientist

+0

Я боюсь, что я не понимаю, что вы подразумеваете под «установить целевую переменную для привязки, и я также хочу, чтобы задача зависела от нее»; можете ли вы изменить свой вопрос, чтобы показать пример этого? Поскольку полный набор предварительных условий доступен для рецепта с использованием автоматических переменных: вам не нужно назначать переменную отдельно для них. Но, возможно, я просто не понимаю. Однако мы можем только предложить решения вопросов, которые действительно заданы :-). – MadScientist

0

В дополнение к тому, что Безумный учёный уже сказал,

COMP := gcc -o [email protected] $< $(FLAGS) 

использует непосредственное задание, которое оценивает выражение справа сразу, в результате чего существенно COMP := gcc -o $(FLAGS). Используйте отложенное назначение вместо:

COMP = gcc -o [email protected] $< $(FLAGS) 
Смежные вопросы