Используйте один make run для сборки (я не фанат рекурсивного make).Не используйте $(shell)
, так как это снижает производительность.Поместите сборочные продукты во временный каталог.
Эскиз:
subdir1-srcs := $(addprefix subdir1/,1.cc 2.cc 3.cc)
subdir1-objs := ${subdir1-srcs:subdir1/%.cc=subdir1/obj/%.o)
bin/prog1: ${subdir1-objs} ; gcc $^ -o $@
${subdir1-objs}: subdir1/obj/%.o: subdir1/%.cc # Static pattern rules rule
gcc -c $< -o $@
${subdir1-objs}: subdir1/obj/.mkdir # Need to create folder before compiling
subdir1/obj/.mkdir:
mkdir -p ${@D}
touch $@
Вы видите здесь плиту котла?Несколько функций вместе с $(eval)
должны позволять вам писать:
$(call build,bin/prog1,subdir1,1.cc 2.cc 3.cc)
$(call build,bin/prog2,subdir2,a.cc b.cc c.cc d.cc)
, причем эти цели автоматически добавляются как зависимости от фальшивых all
и прекрасно -j
совместимых (просто наберите make -j5 all
длястроить).