构建 C 项目

本指南涵盖的内容 #

有关语言版本和其他构建环境特定信息,请访问我们的参考页面

本指南涵盖了特定于 C 项目的构建环境和配置主题。请务必先阅读我们的 教程通用构建配置 指南。

C 项目的 CI 环境 #

Travis CI 虚拟机是 64 位的,并提供以下版本的

  • gcc
  • clang
  • 核心 GNU 构建工具链(autotools、make)、cmake、scons

Travis CI 上的 C 项目默认假定您使用 Autotools 和 Make。

有关虚拟机上的精确版本,请查阅构建日志中的“构建系统信息”。

依赖项管理 #

由于社区中关于依赖项管理没有占主导地位的约定,因此 Travis CI 会跳过 C 项目的依赖项安装。

如果在测试运行之前需要安装依赖项,请覆盖 .travis.yml 中的 install: 键。

install: make get-deps

请参阅 构建配置指南 以了解更多信息。

选择要测试的编译器 #

您可以针对 GCC 或 Clang 或两者都进行项目测试。为此,请使用 .travis.yml 中的 compiler: 键指定要使用的编译器。例如,要使用 Clang 构建

compiler: clang

或 GCC 和 Clang

compiler:
  - clang
  - gcc

针对两个编译器进行测试将在构建矩阵中创建(至少)两行。对于每一行,Travis CI C 构建器都将导出 CCCC_FOR_BUILD 环境变量以指向 gccclang

在 macOS 上,gccclang 的别名。设置特定的 GCC 版本 以在 macOS 上使用 GCC。

OpenMP 项目 #

OpenMP 项目应将环境变量 OMP_NUM_THREADS 设置为一个合理的小值(例如,4)。OpenMP 检测托管硬件上的核心,而不是运行测试的虚拟机上的核心。

MPI 项目 #

默认环境变量 $CC 已知会干扰 MPI 项目。在这种情况下,我们建议取消设置它

before_install:
  - test -n $CC && unset CC

C11/C++11(及更高版本)和工具链版本控制 #

如果您的项目需要与 C11、C++11 或更新的语言标准兼容的工具,则可能需要升级编译器和/或构建工具。本节专门介绍如何升级 GCC、clang 和 cmake;对于其他依赖项,请参阅 安装依赖项

Linux 上的 GCC #

请注意,GCC 对 ISO C11 的支持已达到与 ISO C99 相同的完整性水平(在 4.9 中),并且 C++11 在 5.1 中功能齐全(C++ 语言支持在 4.8.1 中功能齐全,但标准库直到 稍后 才支持所有 C++11 功能,特别是 <regex> 的支持直到 4.9 才存在)。

要将 GCC 升级到更新版本,您必须从 ubuntu-toolchain-r-test 源安装相应的版本;请参见下面的示例

matrix:
  include:
    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-4.9
      env:
         - MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-5
      env:
         - MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-6
      env:
        - MATRIX_EVAL="CC=gcc-6 && CXX=g++-6"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-7
      env:
        - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7"

before_install:
    - eval "${MATRIX_EVAL}"

macOS 上的 GCC #

在 macOS 上,gccclang 的别名,g++clang++ 的别名。因此,您必须将 CC 和 CXX 设置为特定的 gcc/g++ 版本

matrix:
  include:
    - os: osx
      osx_image: xcode8
      env:
        - MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9"

    - os: osx
      osx_image: xcode8
      env:
        - MATRIX_EVAL="brew install gcc5 && CC=gcc-5 && CXX=g++-5"

    - os: osx
      osx_image: xcode8
      env:
        - MATRIX_EVAL="brew install gcc6 && CC=gcc-6 && CXX=g++-6"

    - os: osx
      osx_image: xcode8
      env:
        - MATRIX_EVAL="brew install gcc && CC=gcc-7 && CXX=g++-7"

before_install:
    - eval "${MATRIX_EVAL}"

FreeBSD 上的 GCC #

Travis CI FreeBSD 镜像附带 GCC 10.0.0(默认情况下它不在基本系统中)。

要将 GCC 升级到更新版本,请从软件包中安装相应的版本;请参见下面的示例

os: freebsd
addons:
    pkg:
      - gcc10
    env:
      - CC=gcc10
      - CXX=g++10

Linux 上的 Clang #

请注意,从 Clang 3.3 开始,C++11 支持已完成

要将 Clang 升级到更新版本,您必须从 llvm-toolchain-* 源安装相应的版本(还必须引入 ubuntu-toolchain-r-test 源以进行依赖项解析);请参见下面的示例

matrix:
  include:
    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.6
          packages:
            - clang-3.6
      env:
        - MATRIX_EVAL="CC=clang-3.6 && CXX=clang++-3.6"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.7
          packages:
            - clang-3.7
      env:
        - MATRIX_EVAL="CC=clang-3.7 && CXX=clang++-3.7"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.8
          packages:
            - clang-3.8
      env:
        - MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

    # works on Trusty
    - os: linux
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-3.9
          packages:
            - clang-3.9
      env:
        - MATRIX_EVAL="CC=clang-3.9 && CXX=clang++-3.9"

    # works on Trusty
    - os: linux
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-4.0
          packages:
            - clang-4.0
      env:
        - MATRIX_EVAL="CC=clang-4.0 && CXX=clang++-4.0"

    # works on Trusty
    - os: linux
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-5.0
          packages:
            - clang-5.0
      env:
        - MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0"

before_install:
    - eval "${MATRIX_EVAL}"

macOS 上的 Clang #

在 macOS 上,clang 的版本由 osx_image 的选择控制。您可以在 此处 找到可用的 osx_image 列表。

matrix:
  include:
    - os: osx
      osx_image: xcode10.1

    - os: osx
      osx_image: xcode9.4

您可以在 此处 找到 Xcode 附带的 clang 版本。

FreeBSD 上的 Clang #

Clang 是 FreeBSD 上的默认编译器

FreeBSD 附带 Clang 8.0.1

要将 Clang 升级到更新版本,请从软件包中安装相应的版本;请参见下面的示例

os: freebsd
addons:
    pkg:
      - llvm90
    env:
      - CC=/usr/local/bin/clang90    # llvm90 installs it to /usr/local/bin/clang90
      - CXX=/usr/local/bin/clang++90 # llvm90 installs it to /usr/local/bin/clang++90

Clang 是 FreeBSD 上的默认编译器

CMake #

您可以从 george-edison55-precise-backports 源将 cmake 升级到 Precise 上的 3.2.3(请注意,cmake-data 软件包包含 Aptitude 不会自动解析的依赖项),例如

addons:
  apt:
    sources:
      - george-edison55-precise-backports
    packages:
      - cmake-data
      - cmake

在 macOS 上,cmake 的版本由 osx_image 的选择控制。

构建配置参考 #

您可以在我们的 Travis CI 构建配置参考 中找到有关 C 的构建配置格式的更多信息。