Автоматическая генерация предпосылок для make-файла (gnu-make) - PullRequest
0 голосов
/ 30 января 2012

У меня есть переменная в одном из моих make-файлов, которая содержит список архивных файлов, которые мне нужно сгенерировать в следующей форме:

/libpath/mylib1/obj/mylib1.a
/libpath/mylib2/obj/mylib2.a
/libpath/mylib3/obj/mylib3.a

и так далее.Я создал правило для создания каждого из них, в основном он сканирует родительскую папку для файлов .cpp и создает предварительные условия .o в подпапке / obj (поэтому, если / libpath / mylib1 содержит foo.cpp и bar.cpp, тогдапредварительными условиями являются /libpath/mylib1/obj/foo.o и /libpath/mylib1/obj/bar.o и т. д.).Единственный способ заставить это работать - это .SECONDEXPANSION: я создаю список файлов .cpp, удаляю папку и расширение, добавляю суффикс к расширению .o, а затем добавляю префикс к целевой папке:

%.a: $$(addprefix $$(dir $$@),$$(addsuffix .o,$$(basename $$(notdir $$(wildcard $$(dir $$@)../*.cpp)))))

Это прекрасно работает, но я не могу не чувствовать, что иду по этому поводу слишком сложно.Есть ли лучший / более чистый способ делать такие вещи?

1 Ответ

1 голос
/ 30 января 2012

Я бы предложил только извлечь логику в макрос и использовать ее в качестве предварительного условия. Также я бы предпочел patsubst функция вместо notdir + basename + addsuffix и $(@D) автоматическая переменная вместо $(dir $@).

lib_objects = $(patsubst %.cpp,$(@D)/%.o,$(notdir $(wildcard $(@D)/../*.cpp)))

%.a: $$(lib_objects)

ИМО, выглядит немного лучше, не правда ли?

...