我正在开发自己的开源编程语言解释器项目,我可能会犯一些愚蠢的错误,因为我在Cmake方面并不复杂,而且我第一次尝试Travis CI。我的项目通过执行PC在bash终端上编译(运行Ubuntu 16.04LTS、GCC 8.1和Cmake 3.12.0-rc2),测试由scripts/run_tests.sh执行。Build script创建一个cmake-build-debug目录,运行cmake,然后构建和执行简单的cmake-build-debug/lexertl_gen/lexert_gen.out程序,以便在我的include文件夹中为主项目生成一个头文件。之后,它在编译选项std=gnu++2a的同时构建主项目和它的测试。
下面是我所有的CMakeLists.txt (下面描述了这个问题):
根CMakeLists.txt
cmake_minimum_required(VERSION 3.9.0)
set(INCLUDE_ROOT "/usr/local/include")
set(BOOST_ROOT "${INCLUDE_ROOT}/boost_1_67_0")
set(LEXERTL_ROOT "${INCLUDE_ROOT}/lexertl")
set(GTEST_ROOT "${INCLUDE_ROOT}/googletest")
set(CMAKE_CXX_FLAGS "-g -std=gnu++2a -Werror \
-Wno-error=variadic-macros \
-Werror=implicit-fallthrough")
file(GLOB SOURCES "src/*.cpp")
include_directories(include ${BOOST_ROOT} ${LEXERTL_ROOT} ${GTEST_ROOT})
add_library(calamity_core ${SOURCES})
project(lexer.out)
add_executable(${PROJECT_NAME} main_lexer.cpp)
target_link_libraries(${PROJECT_NAME} m calamity_core)
project(parser.out)
add_executable(${PROJECT_NAME} main_parser.cpp)
target_link_libraries(${PROJECT_NAME} m calamity_core)
project(tests.out)
add_subdirectory(tests)
project(lexertl_gen.out)
add_subdirectory(lexertl_gen)tests/CMakeLists.txt
cmake_minimum_required(VERSION 3.9.0)
set(CMAKE_CXX_FLAGS "-g -std=gnu++2a -Werror \
-Wno-error=variadic-macros \
-Werror=implicit-fallthrough")
add_subdirectory(/usr/local/include/googletest ../gtets-build)
add_executable(${PROJECT_NAME} tests.cpp)
target_link_libraries(${PROJECT_NAME} gtest gtest_main gmock calamity_core)lexertl_gen/CMakeLists.txt
cmake_minimum_required(VERSION 3.9.0)
set(CMAKE_CXX_FLAGS "-g -std=gnu++2a -Werror \
-Wno-error=variadic-macros \
-Werror=implicit-fallthrough")
set(SOURCES ../src/token.cpp
../src/var_substring.cpp
../src/cui.cpp
../src/message_exception.cpp)
add_executable(lexertl_gen.out main_lexertl_gen.cpp ${SOURCES})最终,我决定将Travis CI添加到我的项目中。我编写了一个bootstrap.sh脚本来安装和配置所有依赖项(我还安装了GCC 8.1,因为安装在Travis CI服务器上的默认GCC 4.8.4不支持gnu++2a)。这个脚本运行得很好,但是当在scripts/build_all.sh服务器上运行Travis CI服务器GCC时,它没有设置gnu++2a来编译我的主要测试项目,它抱怨使用了inline变量、std::is_integral和其他现代的C++工具,明确提到了std=c++17或std=gnu++17支持这些特性。以下是我在特拉维斯CI上的最新不成功构建的链接。
我不明白,因为我更新了GCC,我的第一个简单的代码生成器程序运行良好(但是如果我从tests/CMakeLists.txt中删除set(CMAKE_CXX_FLAGS ...),这个程序会在set(CMAKE_CXX_FLAGS ...)上编译,但也不会在Travis CI服务器上编译)。我在这里做什么?是因为特拉维斯使用的Cmake 3.9吗?
我的.travis.yml配置文件:
language: cpp
sudo: required
dist: trusty
compiler:
- g++
os:
- linux
script:
- ./bootstrap.sh; cd scripts; ./build_all.sh; ./run_tests.sh
env:
global:
- LANG="en_US.UTF-8"
matrix:
include:
- os: linux
addons:
apt:
compiler: gcc
sources:
- ubuntu-toolchain-r-test
packages:
- g++-8
env: COMPILER=g++-8链接到我在GitHub上的项目。 (为空README.md抱歉)
发布于 2018-07-10 17:23:04
通过将CMAKE_CXX_FLAGS作为缓存变量,我终于解决了一个问题:
set(CMAKE_CXX_FLAGS "-g -std=gnu++2a -Werror \
-Wno-error=variadic-macros \
-Werror=implicit-fallthrough"
CACHE STRING "compiler flags")虽然我不认为这是一个漂亮的解决方案,我仍然不明白为什么它编译在我的PC上,而不是在Travis CI上
https://stackoverflow.com/questions/51269927
复制相似问题