File tree Expand file tree Collapse file tree 2 files changed +22
-2
lines changed Expand file tree Collapse file tree 2 files changed +22
-2
lines changed Original file line number Diff line number Diff line change @@ -151,12 +151,32 @@ extension BuildParameters {
151
151
args = [ " -alias " , " _ \( target. c99name) _main " , " _main " ]
152
152
case . elf:
153
153
args = [ " --defsym " , " main= \( target. c99name) _main " ]
154
+ case . coff:
155
+ // If the user is specifying a custom entry point name that isn't "main", assume they may be setting WinMain or wWinMain
156
+ // and don't do any modifications ourselves. In that case the linker will infer the WINDOWS subsystem and call WinMainCRTStartup,
157
+ // which will then call the custom entry point. And WinMain/wWinMain != main, so this still won't run into duplicate symbol
158
+ // issues when called from a test target, which always uses main.
159
+ if let customEntryPointFunctionName = findCustomEntryPointFunctionName ( of: target) , customEntryPointFunctionName != " main " {
160
+ return nil
161
+ }
162
+ args = [ " /ALTERNATENAME:main= \( target. c99name) _main " , " /SUBSYSTEM:CONSOLE " ]
154
163
default :
155
164
return nil
156
165
}
157
166
return args. asSwiftcLinkerFlags ( )
158
167
}
159
168
169
+ private func findCustomEntryPointFunctionName( of target: ResolvedModule ) -> String ? {
170
+ let flags = createScope ( for: target) . evaluate ( . OTHER_SWIFT_FLAGS)
171
+ var it = flags. makeIterator ( )
172
+ while let value = it. next ( ) {
173
+ if value == " -Xfrontend " && it. next ( ) == " -entry-point-function-name " && it. next ( ) == " -Xfrontend " {
174
+ return it. next ( )
175
+ }
176
+ }
177
+ return nil
178
+ }
179
+
160
180
/// Returns the scoped view of build settings for a given target.
161
181
func createScope( for target: ResolvedModule ) -> BuildSettings . Scope {
162
182
BuildSettings . Scope ( target. underlying. buildSettings, environment: buildEnvironment)
Original file line number Diff line number Diff line change @@ -3875,7 +3875,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
3875
3875
observabilityScope: observability. topScope
3876
3876
) )
3877
3877
}
3878
- let supportingTriples : [ Basics . Triple ] = [ . x86_64Linux, . x86_64MacOS]
3878
+ let supportingTriples : [ Basics . Triple ] = [ . x86_64Linux, . x86_64MacOS, . x86_64Windows ]
3879
3879
for triple in supportingTriples {
3880
3880
let result = try await createResult ( for: triple)
3881
3881
let exe = try result. moduleBuildDescription ( for: " exe " ) . swift ( ) . compileArguments ( )
@@ -3884,7 +3884,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
3884
3884
XCTAssertMatch ( linkExe, [ . contains( " exe_main " ) ] )
3885
3885
}
3886
3886
3887
- let unsupportingTriples : [ Basics . Triple ] = [ . wasi, . windows ]
3887
+ let unsupportingTriples : [ Basics . Triple ] = [ . wasi]
3888
3888
for triple in unsupportingTriples {
3889
3889
let result = try await createResult ( for: triple)
3890
3890
let exe = try result. moduleBuildDescription ( for: " exe " ) . swift ( ) . compileArguments ( )
You can’t perform that action at this time.
0 commit comments