Как вы можете предложить reinierpost, вы можете определить псевдо-цель для каждого из ваших компиляторов. Псевдо-цель - это цель, не связанная с ней.
Но поскольку make действительно доволен действительными файловыми целями (цели считаются актуальными или не основаны на их последней дате изменения), вы также можете использовать результат своего сюжета в качестве цели. И, как также было предложено, вы можете обернуть все это в конструкцию foreach
- eval
- call
, чтобы разложить ваш код. Что-то вроде:
COMPILERS = clang++ g++
define PLOT_compiler
plotfile-$(1): CXX = $(1)
plotfiles += plotfile-$(1)
endef
$(foreach compiler,$(COMPILERS),$(eval $(call PLOT_compiler,$(compiler))))
all: $(plotfiles)
plotfile-%:
<generate plot file using the CXX variable>
foreach
- eval
- call
конструкция конкретизирует один набор делать заявления за компилятором, как это определено в переменной PLOT_compiler
.
Если вы предпочитаете собирать все результаты в одном файле с именем, скажем, plots.txt
вы можете вместо этого использовать:
COMPILERS = clang++ g++
define PLOT_compiler
plotfile-$(1): CXX = $(1)
plotfiles += plotfile-$(1)
endef
$(foreach compiler,$(COMPILERS),$(eval $(call PLOT_compiler,$(compiler))))
plots.txt: $(plotfiles)
cat $(plotfiles) > [email protected]
plotfile-%:
<generate plot file using the CXX variable>
clean:
rm -f $(plotfiles)
ultraclean:
rm -f $(plotfiles) plots.txt
В clean
и ultraclean
цели поможет вам держать ваше рабочее место в чистоте. Вы можете легко проверить все это, заменив <generate plot file using the CXX variable>
рецепт на echo $(CXX) > [email protected]
, а также:
make
make clean
cat plots.txt
Почему вы против рекурсивного вызова? Как вы планируете обеспечить, чтобы все файлы объектов были перестроены каждый раз с помощью правильного компилятора, а также связанная с ним программа? Я думаю, вы направились в неправильном направлении, но я не совсем уверен, как отправить вас в правильном направлении. Возможно, вам нужен каталог «benchmark-1» (sub-), где вы создаете исполняемый файл для 'g ++' и 'benchmark-2' (подкаталог), где вы создаете исполняемый файл для' clang ++ '.Источник может исходить из исходного (родительского) каталога - возможно, через VPATH. Но я этого не пробовал. _ [... продолжение ...] _ –
_ [... продолжение ...] _ То, что я обычно делаю, это 'make clean; сделать тест CXX = g ++; чистить; сделать тест CXX = g ++; сделать чистым' или что-то подобное. Окончательный 'make clean' гарантирует, что следующая сборка ведет себя правильно, независимо от последовательности или успеха предыдущих операций. –