C ++ CMake的不设置编译语言标准特拉维斯CI服务器上

问题描述 投票:0回答:1

我在开发自己的开源编程语言翻译项目,我可以做出愚蠢的错误,因为我不是在Cmake复杂,我试图首次Travis CI。我的项目通过执行PC我从Bash终端Ubuntu 16.04LTS(运行GCC 8.1Cmake 3.12.0-rc2scripts/build_all.sh)编译和测试由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,因为安装GCC 4.8.4服务器上默认Travis CI不支持gnu++2a)。这个脚本运行良好,但是当涉及到scripts/build_all.sh服务器GCC运行Travis CI没有设置gnu++2a编译我的主要项目,测试,它抱怨使用inline变量,std::is_integral等现代C ++的东西,明确提的是,这些功能都在支持std=c++17std=gnu++17Here is the link to my latest unsuccessful build on Travis CI.

我不明白这一点,因为我更新GCC和我的第一个简单的代码生成的程序运行良好(不过,如果我从set(CMAKE_CXX_FLAGS ...)删除tests/CMakeLists.txt这个程序编译我的PCTravis 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

Link to my project on GitHub.(抱歉空README.md

c++ cmake travis-ci
1个回答
0
投票

嗯,我终于解决了通过使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

© www.soinside.com 2019 - 2024. All rights reserved.