У меня есть коллекция примеров, которые я хочу , чтобы они не компилировались . Какой лучший способ сделать это с * GNU Makefile ?
test_nocompile: $(NOCOMPILE_CPP)
for cpp in $(NOCOMPILE_CPP) ; do \
echo === $$cpp === ; \
if $(CXX) $(CXXFLAGS) -c -o fail.o $$cpp ; then echo ok ; else exit 1; fi ; \
done
Как видите, у меня тут несколько трудностей:
- Доступ к переменной оболочки-для
cpp
: $cpp
, \$cpp
и $$cpp
оба не работают.
- Даже с моим
if
make останавливается после первой неудачной компиляции g ++. Но это именно то, что я хочу. Я хочу, чтобы сбой g ++ - компиляция считалась правильным поведением.
- Оболочки для циклов в Makefiles - не лучшая идея. Есть ли способ лучше? Я не могу думать об одном, потому что, поскольку я ожидаю, что компиляция потерпит неудачу, у меня нет правильной цели, верно?
Дополнительно и дополнительно:
- Если бы мне удалось заставить работать fail-check выше, я мог бы попробовать второй проход компиляции, на этот раз с дополнительным
-DEXCLUDE_FAIL
, который вычеркивает строку из моих примеров и тогда код должен скомпилироваться. Есть идеи?
- или для этого нужно написать скрипт Python ...? ; -)
Edit:
Я думаю, что мой "продвинутый и дополнительный" дал мне очень хорошую идею прямо сейчас. Я мог бы снова использовать проверку зависимостей. Просто набросок здесь:
NOCOMPILE_CPP := $(wildcard nocompile/ *.cpp)
NOCOMPILE_XFAILS := $(addsuffix .xfail,$(basename $(NOCOMPILE_CPP)))
%.xfail: %.cpp
if $(CXX) $(CXXFLAGS) -o $@ $< ; then exit 1 ; else echo OK ; fi
$(CXX) $(CXXFLAGS) -DEXCLUDE_FAILCODE -o $@ $<
test_nocompile: $(NOCOMPILE_XFAILS)
Это элегантно? Тогда мне нужно только выяснить, как -DEXCLUDE_FAILCODE
может заставить неудачные тесты работать .... Нетривиально, но выполнимо. Я думаю, что мог бы сделать это, верно?