From e88509d0e87eaa6f41603bfd7b07b653527e88c0 Mon Sep 17 00:00:00 2001 From: Evan Wilde Date: Wed, 26 Oct 2022 16:11:51 -0700 Subject: Swift: Omit output-file-map when used as a linker Swift is used as the linker for non-swift files because it needs to pull files like swiftrt.o in when swift symbols are present to ensure that the swift runtime is linked. The swift driver uses clang as the underlying linker, which pulls in crtbegin.o and friends when appropriate, so using Swift as a linker for C/C++ libraries is fine. The output-file-map was getting passed to all Swift invocations, regardless of whether or not we generated one. This patch changes it so that we only include the output-file-map in the Swift compiler invocation if we have actually generated the file. --- Modules/CMakeSwiftInformation.cmake | 6 ++-- Source/cmNinjaNormalTargetGenerator.cxx | 8 +---- Source/cmNinjaTargetGenerator.cxx | 54 ++++++++++++++++++++------------- Source/cmNinjaTargetGenerator.h | 3 ++ Source/cmRulePlaceholderExpander.cxx | 5 --- Source/cmRulePlaceholderExpander.h | 2 +- Tests/SwiftMixLib/CMakeLists.txt | 3 ++ Tests/SwiftMixLib/main.c | 3 ++ 8 files changed, 47 insertions(+), 37 deletions(-) create mode 100644 Tests/SwiftMixLib/main.c diff --git a/Modules/CMakeSwiftInformation.cmake b/Modules/CMakeSwiftInformation.cmake index a0cd9da..62f7ef2 100644 --- a/Modules/CMakeSwiftInformation.cmake +++ b/Modules/CMakeSwiftInformation.cmake @@ -103,7 +103,7 @@ if(NOT CMAKE_Swift_NUM_THREADS MATCHES "^[0-9]+$") endif() if(NOT CMAKE_Swift_CREATE_SHARED_LIBRARY) - set(CMAKE_Swift_CREATE_SHARED_LIBRARY " -output-file-map -j ${CMAKE_Swift_NUM_THREADS} -num-threads ${CMAKE_Swift_NUM_THREADS} -emit-library -o -module-name -module-link-name -emit-module -emit-module-path -emit-dependencies ${CMAKE_Swift_IMPLIB_LINKER_FLAGS} ") + set(CMAKE_Swift_CREATE_SHARED_LIBRARY " -j ${CMAKE_Swift_NUM_THREADS} -num-threads ${CMAKE_Swift_NUM_THREADS} -emit-library -o -module-name -module-link-name -emit-module -emit-module-path -emit-dependencies ${CMAKE_Swift_IMPLIB_LINKER_FLAGS} ") endif() if(NOT CMAKE_Swift_CREATE_SHARED_MODULE) @@ -111,11 +111,11 @@ if(NOT CMAKE_Swift_CREATE_SHARED_MODULE) endif() if(NOT CMAKE_Swift_LINK_EXECUTABLE) - set(CMAKE_Swift_LINK_EXECUTABLE " -output-file-map -j ${CMAKE_Swift_NUM_THREADS} -num-threads ${CMAKE_Swift_NUM_THREADS} -emit-executable -o -emit-dependencies ") + set(CMAKE_Swift_LINK_EXECUTABLE " -j ${CMAKE_Swift_NUM_THREADS} -num-threads ${CMAKE_Swift_NUM_THREADS} -emit-executable -o -emit-dependencies ") endif() if(NOT CMAKE_Swift_CREATE_STATIC_LIBRARY) - set(CMAKE_Swift_CREATE_STATIC_LIBRARY " -output-file-map -j ${CMAKE_Swift_NUM_THREADS} -num-threads ${CMAKE_Swift_NUM_THREADS} -emit-library -static -o -module-name -module-link-name -emit-module -emit-module-path -emit-dependencies ") + set(CMAKE_Swift_CREATE_STATIC_LIBRARY " -j ${CMAKE_Swift_NUM_THREADS} -num-threads ${CMAKE_Swift_NUM_THREADS} -emit-library -static -o -module-name -module-link-name -emit-module -emit-module-path -emit-dependencies ") set(CMAKE_Swift_ARCHIVE_CREATE " crs ") set(CMAKE_Swift_ARCHIVE_FINISH "") diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index bda8a5f..895a4c3 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -372,7 +372,6 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile, vars.SwiftLibraryName = "$SWIFT_LIBRARY_NAME"; vars.SwiftModule = "$SWIFT_MODULE"; vars.SwiftModuleName = "$SWIFT_MODULE_NAME"; - vars.SwiftOutputFileMap = "$SWIFT_OUTPUT_FILE_MAP"; vars.SwiftSources = "$SWIFT_SOURCES"; vars.Defines = "$DEFINES"; @@ -1072,12 +1071,6 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( cmOutputConverter::SHELL); }(vars["SWIFT_MODULE_NAME"]); - const std::string map = cmStrCat(gt->GetSupportDirectory(), '/', config, - '/', "output-file-map.json"); - vars["SWIFT_OUTPUT_FILE_MAP"] = - this->GetLocalGenerator()->ConvertToOutputFormat( - this->ConvertToNinjaPath(map), cmOutputConverter::SHELL); - vars["SWIFT_SOURCES"] = [this, config]() -> std::string { std::vector sources; std::stringstream oss; @@ -1101,6 +1094,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( vars["DEFINES"] = this->GetDefines("Swift", config); vars["FLAGS"] = this->GetFlags("Swift", config); vars["INCLUDES"] = this->GetIncludes("Swift", config); + this->GenerateSwiftOutputFileMap(config, vars["FLAGS"]); } // Compute specific libraries to link with. diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index e4427f5..ae6a510 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -1177,30 +1177,42 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements( } this->GetImplFileStream(fileConfig) << "\n"; +} - if (!this->Configs[config].SwiftOutputMap.empty()) { - std::string const mapFilePath = - cmStrCat(this->GeneratorTarget->GetSupportDirectory(), '/', config, '/', - "output-file-map.json"); - std::string const targetSwiftDepsPath = [this, config]() -> std::string { - cmGeneratorTarget const* target = this->GeneratorTarget; - if (cmValue name = target->GetProperty("Swift_DEPENDENCIES_FILE")) { - return *name; - } - return this->ConvertToNinjaPath( - cmStrCat(target->GetSupportDirectory(), '/', config, '/', - target->GetName(), ".swiftdeps")); - }(); +void cmNinjaTargetGenerator::GenerateSwiftOutputFileMap( + const std::string& config, std::string& flags) +{ + if (this->Configs[config].SwiftOutputMap.empty()) { + return; + } - // build the global target dependencies - // https://github.com/apple/swift/blob/master/docs/Driver.md#output-file-maps - Json::Value deps(Json::objectValue); - deps["swift-dependencies"] = targetSwiftDepsPath; - this->Configs[config].SwiftOutputMap[""] = deps; + std::string const targetSwiftDepsPath = [this, config]() -> std::string { + cmGeneratorTarget const* target = this->GeneratorTarget; + if (cmValue name = target->GetProperty("Swift_DEPENDENCIES_FILE")) { + return *name; + } + return this->ConvertToNinjaPath(cmStrCat(target->GetSupportDirectory(), + '/', config, '/', + target->GetName(), ".swiftdeps")); + }(); - cmGeneratedFileStream output(mapFilePath); - output << this->Configs[config].SwiftOutputMap; - } + std::string mapFilePath = + cmStrCat(this->GeneratorTarget->GetSupportDirectory(), '/', config, '/', + "output-file-map.json"); + + // build the global target dependencies + // https://github.com/apple/swift/blob/master/docs/Driver.md#output-file-maps + Json::Value deps(Json::objectValue); + deps["swift-dependencies"] = targetSwiftDepsPath; + this->Configs[config].SwiftOutputMap[""] = deps; + + cmGeneratedFileStream output(mapFilePath); + output << this->Configs[config].SwiftOutputMap; + + // Add flag + this->LocalGenerator->AppendFlags(flags, "-output-file-map"); + this->LocalGenerator->AppendFlagEscape(flags, + ConvertToNinjaPath(mapFilePath)); } namespace { diff --git a/Source/cmNinjaTargetGenerator.h b/Source/cmNinjaTargetGenerator.h index 4b4cf8d..c43b650 100644 --- a/Source/cmNinjaTargetGenerator.h +++ b/Source/cmNinjaTargetGenerator.h @@ -163,6 +163,9 @@ protected: void EmitSwiftDependencyInfo(cmSourceFile const* source, const std::string& config); + void GenerateSwiftOutputFileMap(const std::string& config, + std::string& flags); + void ExportObjectCompileCommand( std::string const& language, std::string const& sourceFileName, std::string const& objectDir, std::string const& objectFileName, diff --git a/Source/cmRulePlaceholderExpander.cxx b/Source/cmRulePlaceholderExpander.cxx index b63d11c..638bb42 100644 --- a/Source/cmRulePlaceholderExpander.cxx +++ b/Source/cmRulePlaceholderExpander.cxx @@ -119,11 +119,6 @@ std::string cmRulePlaceholderExpander::ExpandVariable( return this->ReplaceValues->SwiftModuleName; } } - if (this->ReplaceValues->SwiftOutputFileMap) { - if (variable == "SWIFT_OUTPUT_FILE_MAP") { - return this->ReplaceValues->SwiftOutputFileMap; - } - } if (this->ReplaceValues->SwiftSources) { if (variable == "SWIFT_SOURCES") { return this->ReplaceValues->SwiftSources; diff --git a/Source/cmRulePlaceholderExpander.h b/Source/cmRulePlaceholderExpander.h index 23ec405..5d1f199 100644 --- a/Source/cmRulePlaceholderExpander.h +++ b/Source/cmRulePlaceholderExpander.h @@ -64,7 +64,7 @@ public: const char* SwiftLibraryName = nullptr; const char* SwiftModule = nullptr; const char* SwiftModuleName = nullptr; - const char* SwiftOutputFileMap = nullptr; + const char* SwiftOutputFileMapOption = nullptr; const char* SwiftSources = nullptr; const char* ISPCHeader = nullptr; const char* CudaCompileMode = nullptr; diff --git a/Tests/SwiftMixLib/CMakeLists.txt b/Tests/SwiftMixLib/CMakeLists.txt index 40d3498..a52fc94 100644 --- a/Tests/SwiftMixLib/CMakeLists.txt +++ b/Tests/SwiftMixLib/CMakeLists.txt @@ -4,3 +4,6 @@ project(SwiftMixLib C CXX Swift) add_library(SwiftMixedLib lib.c lib.cpp lib.swift) add_executable(Swifty main.swift) target_link_libraries(Swifty PUBLIC SwiftMixedLib) + +add_executable(c_main main.c) +target_link_libraries(c_main PUBLIC SwiftMixedLib) diff --git a/Tests/SwiftMixLib/main.c b/Tests/SwiftMixLib/main.c new file mode 100644 index 0000000..6ecf984 --- /dev/null +++ b/Tests/SwiftMixLib/main.c @@ -0,0 +1,3 @@ +int main(int argc, char* argv[]) +{ +} -- cgit v0.12