включаемые файлы зависят от цели - PullRequest
3 голосов
/ 19 ноября 2010

У меня есть Makefile, который включает в себя make-файлы из подкаталогов.Тем не менее, я хочу включить эти «sub» -makefiles на основе выбранной цели.

Справочная информация заключается в том, что подфайлы make определяют разные объектные файлы, и в зависимости от этих объектных файлов целевой исполняемый файл должен бытьсоздал.

Предполагая, что sub-makefile1 устанавливает переменную

OBJECTS := foo.o foo1.o

sub-makefile2 устанавливает

OBJECTS := bar.o bar1.o

И общее правило будет:

lib/%.so: $(OBJECTS)
    link $^ -o $@

Цели (например):

foo: lib/foo.so
bar: lib/bar.so

, тогда как цель foo должна включать make-файл foo, target bar - make-файл bar.

Любая идея, как обращаться сэта ситуация?

Спасибо, Кристиан

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Бета упомянула $(MAKECMDGOALS), но не описала его:

ifeq ($(MAKECMDGOALS),foo)
include sub-makefile1
endif
ifeq ($(MAKECMDGOALS),bar)
include sub-makefile2
endif

# Rest of Makefile follows...

Это не такая уж хорошая идея, поскольку она будет работать, только когда make вызывается в интерактивном режиме.Вы можете обойти это, создав правила для foo и bar, которые рекурсивно вызывают make:

ifeq ($(MAKECMDGOALS),foo)
include sub-makefile1
foo: # ...
    # Normal commands to build foo
else
foo:
    $(MAKE) $<
endif

ifeq ($(MAKECMDGOALS),bar)
include sub-makefile2
bar: # ...
    # Normal commands to build bar
else
bar:
    $(MAKE) $<
endif
2 голосов
/ 19 ноября 2010

Конкретная вещь, которую вы запрашиваете - условное включение - сложна в Make.Это можно сделать, но это не элегантно.

Есть несколько способов получить желаемый эффект.Вы можете использовать условную на MAKECMDGOALS.Вы можете сделать так, чтобы ваш make-файл вызывал второй make-файл и передавал ему имя используемого подкаталога.Но (не зная больше о ситуации), я думаю, что этот способ самый аккуратный:

include sub-makefile1
FOO_OBJECTS := $(OBJECTS)

include sub-makefile2
BAR_OBJECTS := $(OBJECTS)

lib/%.so:
    link $^ -o $@

lib/foo.so: $(FOO_OBJECTS)

lib/bar.so: $(BAR_OBJECTS)

foo bar : % : lib/%.so

(Вы можете быть умнее с именами переменных, такими как foo_OBJECTS, чтобы сохранить одну или две строки, но я советую против.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...