GNU Makefile, компиляция должна провалиться - PullRequest
2 голосов
/ 15 марта 2011

У меня есть коллекция примеров, которые я хочу , чтобы они не компилировались . Какой лучший способ сделать это с * 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 может заставить неудачные тесты работать .... Нетривиально, но выполнимо. Я думаю, что мог бы сделать это, верно?

1 Ответ

1 голос
/ 15 марта 2011
  1. У меня работает. Что вы получаете в echo?
  2. Тогда вам нужно отменить условие в if. Прямо сейчас он закрывается, когда файл не компилируется и AFAIU вам нужно наоборот.
  3. Почему это не очень хорошая идея? Но вы можете написать скрипт, который будет вызывать $(CXX) и возвращать правильный код ошибки (0, если он не компилируется). Тогда у вас могут быть нормальные цели с этим сценарием. Я не очень хорошо разбираюсь в особенностях GNU make, возможно, это возможно благодаря встроенному материалу.

Дополнительно и дополнительно:
1. Давайте сначала заставим вещь работать:)
2. Лично я не использую python, поэтому здесь не вижу необходимости =: P

...