Skip to content

Commit

Permalink
Merge pull request #362 from aciidb0mb3r/cpp-support
Browse files Browse the repository at this point in the history
Add Cpp support
  • Loading branch information
ddunbar committed May 21, 2016
2 parents baa8716 + d5c4339 commit 1d99181
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 3 deletions.
1 change: 1 addition & 0 deletions Sources/Build/Command.compile(ClangModule).swift
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ extension Command {
var args = module.basicArgs
args += module.optimizationFlags(conf)
args += ["-L\(prefix)"]
args += module.languageLinkArgs
args += module.linkFlags
args += module.sources.compilePathsForBuildDir(wd).map{$0.object}
args += Xld
Expand Down
39 changes: 39 additions & 0 deletions Sources/Build/misc.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,45 @@ extension CModule {
}
}

extension String {
var isCpp: Bool {
guard let ext = self.fileExt else {
return false
}
return Sources.validCppExtensions.contains(ext)
}
}

extension ClangModule {
// Returns language specific arguments for a ClangModule.
var languageLinkArgs: [String] {
var args = [String]()
// Check if this module contains any cpp file.
var linkCpp = self.containsCppFiles

// Otherwise check if any of its dependencies contains a cpp file.
// FIXME: It is expensive to iterate over all of the dependencies.
// Figure out a way to cache this kind of lookups.
if !linkCpp {
for case let dep as ClangModule in recursiveDependencies {
if dep.containsCppFiles {
linkCpp = true
break
}
}
}
// Link C++ if found any cpp source.
if linkCpp {
args += ["-lc++"]
}
return args
}

var containsCppFiles: Bool {
return sources.paths.contains { $0.isCpp }
}
}

extension ClangModule {

public enum ModuleMapError: ErrorProtocol {
Expand Down
2 changes: 1 addition & 1 deletion Sources/PackageLoading/PackageExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ extension Package {
private func modulify(_ path: String, name: String) throws -> Module {
let walked = walk(path, recursing: shouldConsiderDirectory).map{ $0 }

let cSources = walked.filter{ isValidSource($0, validExtensions: Sources.validCExtensions) }
let cSources = walked.filter{ isValidSource($0, validExtensions: Sources.validCFamilyExtensions) }
let swiftSources = walked.filter{ isValidSource($0, validExtensions: Sources.validSwiftExtensions) }

if !cSources.isEmpty {
Expand Down
8 changes: 6 additions & 2 deletions Sources/PackageModel/Sources.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ public struct Sources {
static public var validSwiftExtensions = Set<String>(["swift"])

static public var validCExtensions = Set<String>(["c", "m"])

static public var validExtensions = { validSwiftExtensions.union(validCExtensions) }()

static public var validCppExtensions = Set<String>(["mm", "cc", "cpp", "cxx"])

static public var validCFamilyExtensions = validCExtensions.union(validCppExtensions)

static public var validExtensions = { validSwiftExtensions.union(validCExtensions).union(validCFamilyExtensions) }()
}

0 comments on commit 1d99181

Please sign in to comment.