【发布时间】:2018-07-10 16:11:19
【问题描述】:
我正在开发一个自己的开源编程语言解释器项目,我可能会犯一些愚蠢的错误,因为我在Cmake 方面并不成熟,而且我是第一次尝试Travis CI。我的项目通过执行scripts/build_all.sh 在我的PC(运行Ubuntu 16.04LTS、GCC 8.1 和Cmake 3.12.0-rc2)上从bash 终端编译,测试由scripts/run_tests.sh 执行。
构建脚本创建一个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)
测试/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)。该脚本运行良好,但是当在Travis CI 服务器上运行scripts/build_all.sh 时,GCC 无法设置gnu++2a 以使用测试编译我的主项目,它抱怨使用inline 变量、std::is_integral 和其他现代C++东西,明确提到std=c++17 或std=gnu++17 支持这些功能。 Here is the link to my latest unsuccessful build on Travis CI.
我不明白,因为我更新了GCC,并且我的第一个简单代码生成器程序运行良好(尽管如果我从tests/CMakeLists.txt 中删除set(CMAKE_CXX_FLAGS ...),这个程序在我的PC 上编译但不编译在Travis CI 服务器上)。我在这里做什么错了?是因为Travis使用的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
Link to my project on GitHub.(抱歉为空README.md)
【问题讨论】: