Сделать с несколькими компиляторами
При использовании функций 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