Fetching contributors…
Cannot retrieve contributors at this time
85 lines (67 sloc) 2.4 KB

Package Manager C/C++ Language Standard Support


This proposal adds support for declaring the language standard for C and C++ targets in a SwiftPM package.


The C++ language standard is one of the most important build setting needed to compile C++ targets. We want to add some mechanism to declare it until we get the complete build settings feature, which is deferred from the Swift 4 release.

Proposed solution

We will add support to the package manifest declaration to specify the C and C++ language standards:

let package = Package(
    name: "CHTTP",
    cLanguageStandard: .c89,
    cxxLanguageStandard: .cxx11

These settings will apply to all the C and C++ targets in the package. The default value of these properties will be nil, i.e., a language standard flag will not be passed when invoking the C/C++ compiler.

Once we get the build settings feature, we will deprecate these properties.

Detailed design

The C/C++ language standard will be defined by the enums below and updated as per the Clang compiler repository.

public enum CLanguageStandard {
    case c89
    case c90
    case iso9899_1990
    case iso9899_199409
    case gnu89
    case gnu90
    case c99
    case iso9899_1999
    case gnu99
    case c11
    case iso9899_2011
    case gnu11

public enum CXXLanguageStandard {
    case cxx98
    case cxx03
    case gnucxx98
    case gnucxx03
    case cxx11
    case gnucxx11
    case cxx14
    case gnucxx14
    case cxx1z
    case gnucxx1z

Impact on existing code

There will be no impact on existing packages because this is a new API and the default behaviour remains unchanged.

Alternatives considered

We considered adding this property at target level but we think that will pollute the target namespace. Moreover, this is a temporary measure until we get the build settings feature.