Сделать с несколькими компиляторами

При использовании функций C++14/C++11 и включений STL, GCC и clang ведут себя по-разному. LibC++ имеет тенденцию включать вещи неявно, в то время как libstdC++, кажется, имеет тенденцию требовать явных включений. GCC -Wedantic, кажется, немного более педантичен, чем Clang -Wpedantic.

Я хочу иметь make-файл, который пытается собрать с обоими этими компиляторами, чтобы ловить ошибки. Каков наилучший способ сделать это?

1 ответ

Как общее правило, makeРабота заключается только в тестировании с одним конкретным набором опций. Тестирование нескольких конфигураций - это работа сценария более высокого уровня.

Во-первых, настройте свой проект так, чтобы он мог выполнять сборки вне дерева. Обычно скрипт называется configure используется для этого.

Затем для каждой конфигурации создайте сборку вне дерева:

pushd; mkdir build-gcc-libstdc++ && cd build-gcc-libstdc++ && ../configure CXX='g++'; popd
pushd; mkdir build-gcc-libc++ && cd build-gcc-libc++ && ../configure CXX='g++-libc++'; popd
pushd; mkdir build-clang-libstdc++ && cd build-clang-libstdc++ && ../configure CXX='clang++'; popd
pushd; mkdir build-clang-libc++ && cd build-clang-libc++ && ../configure CXX='clang++-libc++'; popd

(Вы также можете сделать это для нескольких версий gcc, поскольку заголовки также сильно различаются между ними).

Чтобы запустить их все, сделайте:

make -C build-gcc-libstdc++ [targets ...] &&
make -C build-gcc-libc++ [targets ...] &&
make -C build-clang-libstdc++ [targets ...] &&
make -C build-clang-libc++ [targets ...]

но обычно я просто строю с конфигурацией по умолчанию и позволяю travis ловить ошибки из других конфигураций. Обратите внимание, что я не использую libC++: https://github.com/themanaworld/tmwa/blob/master/.travis.yml

Другие вопросы по тегам