首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ Cmake没有在Travis服务器上设置编译器语言标准

C++ Cmake没有在Travis服务器上设置编译器语言标准
EN

Stack Overflow用户
提问于 2018-07-10 16:11:19
回答 1查看 367关注 0票数 0

我正在开发自己的开源编程语言解释器项目,我可能会犯一些愚蠢的错误,因为我在Cmake方面并不复杂,而且我第一次尝试Travis CI。我的项目通过执行PC在bash终端上编译(运行Ubuntu 16.04LTSGCC 8.1Cmake 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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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++17std=gnu++17支持这些特性。以下是我在特拉维斯CI上的最新不成功构建的链接。

我不明白,因为我更新了GCC,我的第一个简单的代码生成器程序运行良好(但是如果我从tests/CMakeLists.txt中删除set(CMAKE_CXX_FLAGS ...),这个程序会在set(CMAKE_CXX_FLAGS ...)上编译,但也不会在Travis CI服务器上编译)。我在这里做什么?是因为特拉维斯使用的Cmake 3.9吗?

我的.travis.yml配置文件:

代码语言:javascript
复制
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抱歉)

EN

回答 1

Stack Overflow用户

发布于 2018-07-10 17:23:04

通过将CMAKE_CXX_FLAGS作为缓存变量,我终于解决了一个问题:

代码语言:javascript
复制
set(CMAKE_CXX_FLAGS "-g -std=gnu++2a -Werror \
                     -Wno-error=variadic-macros \
                     -Werror=implicit-fallthrough"
                    CACHE STRING "compiler flags")

虽然我不认为这是一个漂亮的解决方案,我仍然不明白为什么它编译在我的PC上,而不是在Travis CI

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51269927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档