Swift: Add option to pass package name to swiftc invocation

Add a `Swift_PACKAGE_NAME` target property to specify the package name.

Fixes: #26886
This commit is contained in:
Evan Wilde
2026-04-28 15:24:05 -04:00
committed by Brad King
parent 635f71737c
commit 94faee3099
11 changed files with 108 additions and 0 deletions
+1
View File
@@ -415,6 +415,7 @@ syn keyword cmakeProperty contained
\ Swift_LANGUAGE_VERSION
\ Swift_MODULE_DIRECTORY
\ Swift_MODULE_NAME
\ Swift_PACKAGE_NAME
\ Swift_SEPARATE_MODULE_EMISSION
\ TARGET_ARCHIVES_MAY_BE_SHARED_LIBS
\ TARGET_MESSAGES
+1
View File
@@ -427,6 +427,7 @@ Properties on Targets
/prop_tgt/Swift_LANGUAGE_VERSION
/prop_tgt/Swift_MODULE_DIRECTORY
/prop_tgt/Swift_MODULE_NAME
/prop_tgt/Swift_PACKAGE_NAME
/prop_tgt/Swift_SEPARATE_MODULE_EMISSION
/prop_tgt/SYMBOLIC
/prop_tgt/SYSTEM
+18
View File
@@ -0,0 +1,18 @@
Swift_PACKAGE_NAME
------------------
.. versionadded:: 4.4
Specify the Swift package name for a target.
This property sets the package name passed to the Swift compiler via the
``-package-name`` flag, which enables the package access control in Swift
code.
.. note::
Package access control was added in Swift 5.8 and Xcode 15. This target
property has no effect when using an earlier version of Swift or Xcode.
Setting this property to the empty string will result in the target being
compiled without a package name.
+5
View File
@@ -0,0 +1,5 @@
swift-package-name
------------------
* The :prop_tgt:`Swift_PACKAGE_NAME` target property was added to
specify a Swift package name.
+1
View File
@@ -59,6 +59,7 @@ set(CMAKE_Swift_RESPONSE_FILE_LINK_FLAG @)
set(CMAKE_Swift_RESPONSE_FILE_FLAG @)
set(CMAKE_Swift_COMPILE_OPTIONS_COLOR_DIAGNOSTICS -color-diagnostics)
set(CMAKE_Swift_COMPILE_OPTIONS_COLOR_DIAGNOSTICS_OFF -no-color-diagnostics)
set(CMAKE_Swift_PACKAGE_NAME_FLAG -package-name)
set(CMAKE_Swift_LINKER_PREFERENCE 50)
set(CMAKE_Swift_LINKER_PREFERENCE_PROPAGATES 1)
+25
View File
@@ -2820,6 +2820,22 @@ void cmGeneratorTarget::AddSwiftTargetFlags(std::string& flags) const
flags += " -swift-version " + *version;
}
}
if (!this->GetGlobalGenerator()->IsXcode() &&
cmSystemTools::VersionCompare(
cmSystemTools::OP_GREATER_EQUAL,
this->Makefile->GetDefinition("CMAKE_Swift_COMPILER_VERSION"),
"5.8")) {
// Note: The Xcode generator sets the `SWIFT_PACKAGE_NAME` BuildSettings
// attribute
std::string const packageName = this->GetSwiftPackageName();
if (!packageName.empty()) {
std::string const packageFlag =
this->Makefile->GetSafeDefinition("CMAKE_Swift_PACKAGE_NAME_FLAG");
// Add the package name to the flags
flags += " " + packageFlag + " " + packageName;
}
}
}
void cmGeneratorTarget::AddCUDAToolkitFlags(std::string& flags) const
@@ -6183,6 +6199,15 @@ std::string cmGeneratorTarget::BuildDatabasePath(
"_build_database.json");
}
std::string cmGeneratorTarget::GetSwiftPackageName() const
{
std::string packageName;
if (cmValue projectName = this->GetProperty("Swift_PACKAGE_NAME")) {
packageName = *projectName;
}
return packageName;
}
std::string cmGeneratorTarget::GetSwiftModuleName() const
{
return this->GetPropertyOrDefault("Swift_MODULE_NAME", this->GetName());
+3
View File
@@ -640,6 +640,9 @@ public:
std::string GetClangTidyExportFixesDirectory(std::string const& lang) const;
/** Return the Swift package name for this target. */
std::string GetSwiftPackageName() const;
/** Return the swift module name for this target. */
std::string GetSwiftModuleName() const;
+9
View File
@@ -2723,6 +2723,15 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
break;
}
}
// Add SWIFT_PACKAGE_NAME
if (this->XcodeVersion >= 150) {
std::string const packageName = gtgt->GetSwiftPackageName();
if (!packageName.empty()) {
buildSettings->AddAttribute("SWIFT_PACKAGE_NAME",
this->CreateString(packageName));
}
}
}
std::string extraLinkOptions;
@@ -0,0 +1,27 @@
if(RunCMake_GENERATOR MATCHES "Ninja")
if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
set(path "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/impl-Debug.ninja")
else()
set(path "${RunCMake_TEST_BINARY_DIR}/build.ninja")
endif()
file(READ "${path}" build_ninja)
if(NOT build_ninja MATCHES "Swift_COMPILER__L1[^\n]*(\n [^\n]+)*\n FLAGS = [^\n]*-package-name SwiftPackageTest")
string(APPEND RunCMake_TEST_FAILED
"Expected L1 compile FLAGS to contain -package-name SwiftPackageTest\n")
endif()
if(build_ninja MATCHES "Swift_COMPILER__L2[^\n]*(\n [^\n]+)*\n FLAGS = [^\n]*-package-name")
string(APPEND RunCMake_TEST_FAILED
"L2 compile FLAGS should not contain -package-name\n")
endif()
elseif(RunCMake_GENERATOR MATCHES "Xcode")
file(READ
"${RunCMake_TEST_BINARY_DIR}/PackageName.xcodeproj/project.pbxproj"
pbxproj)
if(NOT pbxproj MATCHES "SWIFT_PACKAGE_NAME = SwiftPackageTest")
string(APPEND RunCMake_TEST_FAILED
"Expected SWIFT_PACKAGE_NAME = SwiftPackageTest in Xcode project for L1\n")
endif()
endif()
+13
View File
@@ -0,0 +1,13 @@
cmake_policy(SET CMP0157 NEW)
enable_language(Swift)
add_library(L1 L.swift)
set_target_properties(L1 PROPERTIES
Swift_PACKAGE_NAME "SwiftPackageTest"
)
add_library(L2 L.swift)
set_target_properties(L2 PROPERTIES
Swift_PACKAGE_NAME ""
)
+5
View File
@@ -182,3 +182,8 @@ if(RunCMake_GENERATOR MATCHES "Ninja")
run_cmake(CMP0214-OLD)
run_cmake(CMP0214-NEW-CMP0157-OLD)
endif()
if(NOT RunCMake_GENERATOR STREQUAL "Xcode" OR
(RunCMake_GENERATOR STREQUAL "Xcode" AND XCODE_VERSION VERSION_GREATER_EQUAL 15.0))
run_cmake(PackageName)
endif()