【问题标题】:Make with multiple compilers使用多个编译器制作
【发布时间】:2015-04-02 21:54:16
【问题描述】:

当使用 C++14/C++11 特性和 STL 包含时,GCC 和 clang 有不同的行为。 Libc++ 倾向于隐式包含事物,而 libstdc++ 似乎倾向于要求显式包含。 GCC -Wpedantic 似乎比 clang -Wpedantic 更迂腐。

我想要的是有一个尝试使用这两种编译器构建的makefile,以捕获错误。最好的方法是什么?

【问题讨论】:

    标签: gcc makefile clang libstdc++ libc++


    【解决方案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

    【讨论】:

    • 是什么阻止您制作一个在您的 makefile 中包含所有这些选项的目标?
    • @CarlNorum Nothing(请记住使用${MAKE} 而不是make),但在大多数工作流程中它的用处非常有限。快速周转对于 WIP 构建最重要,在提交时输入 make poly./make-poly.sh 并没有太大区别
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多