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 @@ -152,12 +152,32 @@ extension BuildParameters {
152
152
args = [ " -alias " , " _ \( target. c99name) _main " , " _main " ]
153
153
case . elf:
154
154
args = [ " --defsym " , " main= \( target. c99name) _main " ]
155
+ case . coff:
156
+ // If the user is specifying a custom entry point name that isn't "main", assume they may be setting WinMain or wWinMain
157
+ // and don't do any modifications ourselves. In that case the linker will infer the WINDOWS subsystem and call WinMainCRTStartup,
158
+ // which will then call the custom entry point. And WinMain/wWinMain != main, so this still won't run into duplicate symbol
159
+ // issues when called from a test target, which always uses main.
160
+ if let customEntryPointFunctionName = findCustomEntryPointFunctionName ( of: target) , customEntryPointFunctionName != " main " {
161
+ return nil
162
+ }
163
+ args = [ " /ALTERNATENAME:main= \( target. c99name) _main " , " /SUBSYSTEM:CONSOLE " ]
155
164
default :
156
165
return nil
157
166
}
158
167
return args. asSwiftcLinkerFlags ( )
159
168
}
160
169
170
+ private func findCustomEntryPointFunctionName( of target: ResolvedModule ) -> String ? {
171
+ let flags = createScope ( for: target) . evaluate ( . OTHER_SWIFT_FLAGS)
172
+ var it = flags. makeIterator ( )
173
+ while let value = it. next ( ) {
174
+ if value == " -Xfrontend " && it. next ( ) == " -entry-point-function-name " && it. next ( ) == " -Xfrontend " {
175
+ return it. next ( )
176
+ }
177
+ }
178
+ return nil
179
+ }
180
+
161
181
/// Returns the scoped view of build settings for a given target.
162
182
func createScope( for target: ResolvedModule ) -> BuildSettings . Scope {
163
183
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