据我所知,更改cmake使用的目标C ++编译器的最佳方法是在调用cmake之前更改CXX
环境变量:
$ export CXX="clang++" && cmake --build
Travis CI构建会根据构建的设置相应地设置CXX
和CC
。所以如果你在.travis.yml
:
language: cpp
compiler:
- gcc
- clang
script:
- cmake --build
- ./bin/foo
第一次cmake
应该使用GCC而Clang不是后者?
相反,GCC构建编译得很好(它是cmake使用的默认编译器),但Clang版本也使用GCC:
0.01s $ echo $ CC $ CXX
clang clang ++
命令“echo $ CC $ CXX”以0退出。0.02s $ $ CXX - 版本
clang 3.4版(标签/ RELEASE_34 / final)目标:x86_64-unknown-linux-gnu线程模型:posix正在运行:cmake -G“Unix Makefiles”-Wno-dev ../cmake
- C编译器标识是GNU
- CXX编译器标识是GNU
- 检查工作C编译器:/ usr / bin / gcc
- 检查工作C编译器:/ usr / bin / gcc - 工作
- 检测C编译器ABI信息
- 检测C编译器ABI信息 - 完成
- 检查CXX编译器是否正常工作:/ usr / bin / c ++
- 检查工作CXX编译器:/ usr / bin / c ++ - 工作
- 检测CXX编译器ABI信息
- 检测CXX编译器ABI信息 - 完成
我甚至试图在通话之前再次设置这些变量:
- if [ "$CXX" == "clang++" ]; then export CXX="clang++" && cmake --build; fi
- if [ "$CXX" == "g++" ]; then export CXX="g++" && cmake --build; fi
我认为这没什么意义......
Here是使用GCC的成功构建,here是(假定为)clang构建。
我的问题是:如何在Travis CI下更改cmake使用的编译器?
Here是我的.travis.yml。
答案 0 :(得分:11)
在.travis.yml
我们看到:
- if [ "$CXX" == "clang++" ]; then export CXX="clang++" && bii cpp:build; fi
- if [ "$CXX" == "g++" ]; then export CXX="g++" && bii cpp:build; fi
biicode
的命令bii cpp:build
使用biicode
的默认生成器运行CMake,对于UNIX平台(GNU工具链)"Unix Makefiles"
。阅读:Biicode C++ documentation - Generators and IDEs。
您的日志中会显示此行为:Running: cmake -G "Unix Makefiles" -Wno-dev ../cmake
(https://travis-ci.org/Manu343726/Turbo/jobs/33889114,第257行)
CMake并不总是寻找环境变量CXX/CC
(如CMake FAQ中所述)。这取决于选定的发电机。当我在没有生成器的情况下调用CMake时,它对我有用(我的travis文件:https://github.com/quepas/Graph-ene/blob/master/.travis.yml)。
cmake -D
格式单独使用CMake
biicode
以使用正确的CMake生成器(Biicode C++ Configuration)或使用biicode
的自定义工具链(Biicode - Using custom toolchain)答案 1 :(得分:1)
您可以使用矩阵。如果您有许多不同的编译器(例如gcc5,gcc6,clang3.7,clang3.8),这将特别有用:
language: generic # Works better in most cases
matrix:
include:
- env: CXX=g++ CC=gcc
# additional apt settings if needed
- env: CXX=clang++ CC=clang
script:
- ...
如果你有不同版本的编译器,可以扩展它:
[…]
matrix:
include:
- env: CXX=g++-5 CC=gcc-5
- env: CXX=g++-6 CC=gcc-6
- env: CXX=clang++-3.8 CC=clang-3.8
[…]
它也不会复制脚本步骤并保持文件清除 if ... else ... 部分。