【问题标题】:C++ Cmake doesn't set compiler language standard on Travis CI serverC++ Cmake 没有在 Travis CI 服务器上设置编译器语言标准
【发布时间】:2018-07-10 16:11:19
【问题描述】:

我正在开发一个自己的开源编程语言解释器项目,我可能会犯一些愚蠢的错误,因为我在Cmake 方面并不成熟,而且我是第一次尝试Travis CI。我的项目通过执行scripts/build_all.sh 在我的PC(运行Ubuntu 16.04LTSGCC 8.1Cmake 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++17std=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

【问题讨论】:

    标签: c++ cmake travis-ci


    【解决方案1】:

    我终于通过将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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多