aboutsummaryrefslogtreecommitdiff
path: root/cmake/Win32Subsystem.cmake
blob: 8546fd913ae0bada8b3b15baea308198105a02f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function(target_use_windows_subsystem TARGET_NAME)
	if(WIN32)
		function(handle_msvc_style_compiler)
			target_link_options(${TARGET_NAME} PRIVATE /SUBSYSTEM:windows /ENTRY:mainCRTStartup)
		endfunction()

		if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
			# GCC (MinGW)
			# Supposedly the flag -mwindows would automatically make the executable use GUI subsystem
			# But, when subsystem is set to GUI, linker will only search WinMain and wWinMain but not the standard main (it seems like)
			# so creating GUI executable fails and the linker silently reverts to the default, CUI subsystem
			target_link_options(${TARGET_NAME} PRIVATE -Wl,-subsystem,windows)
			target_link_options(${TARGET_NAME} PRIVATE -Wl,-entry,mainCRTStartup)
		elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
			if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
				# MSVC-style argument clang (clang-cl.exe)
				handle_msvc_style_compiler()
			elseif(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
				# GNU-style argument clang (clang.exe and clang++.exe)
				target_link_options(${TARGET_NAME} PRIVATE -Wl,-subsystem:windows)
				target_link_options(${TARGET_NAME} PRIVATE -Wl,-entry:mainCRTStartup)
			endif()
		elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
			handle_msvc_style_compiler()

			# Use updated __cplusplus macro
			# https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus
			target_compile_options(${TARGET_NAME} PUBLIC /Zc:__cplusplus)
		endif()
	endif()
endfunction()