Skip to content

Commit d61ac21

Browse files
committed
Refactored CMake
1 parent a5956ae commit d61ac21

File tree

2 files changed

+152
-74
lines changed

2 files changed

+152
-74
lines changed

CMakeLists.txt

Lines changed: 8 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,7 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
2323
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
2424
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
2525

26-
if(DEFINED VCPKG_TARGET_ARCHITECTURE)
27-
set(DIRECTX_ARCH ${VCPKG_TARGET_ARCHITECTURE})
28-
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Ww][Ii][Nn]32$")
29-
set(DIRECTX_ARCH x86)
30-
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$")
31-
set(DIRECTX_ARCH x64)
32-
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$")
33-
set(DIRECTX_ARCH arm)
34-
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64$")
35-
set(DIRECTX_ARCH arm64)
36-
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64EC$")
37-
set(DIRECTX_ARCH arm64ec)
38-
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Ww][Ii][Nn]32$")
39-
set(DIRECTX_ARCH x86)
40-
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Xx]64$")
41-
set(DIRECTX_ARCH x64)
42-
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]$")
43-
set(DIRECTX_ARCH arm)
44-
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]64$")
45-
set(DIRECTX_ARCH arm64)
46-
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]64EC$")
47-
set(DIRECTX_ARCH arm64ec)
48-
endif()
26+
include(build/CompilerAndLinker.cmake)
4927

5028
add_executable(${PROJECT_NAME} WIN32
5129
ddraw.cpp
@@ -75,66 +53,23 @@ if(BUILD_WITH_NEW_DX12)
7553
endif()
7654

7755
if(MSVC)
78-
target_compile_options(${PROJECT_NAME} PRIVATE /W4 /GR- "$<$<NOT:$<CONFIG:DEBUG>>:/guard:cf>")
79-
target_link_options(${PROJECT_NAME} PRIVATE /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO)
80-
81-
if((CMAKE_SIZEOF_VOID_P EQUAL 4) AND (NOT ${DIRECTX_ARCH} MATCHES "^arm"))
82-
target_link_options(${PROJECT_NAME} PRIVATE /SAFESEH)
83-
endif()
84-
85-
if((MSVC_VERSION GREATER_EQUAL 1924)
86-
AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0)))
87-
target_compile_options(${PROJECT_NAME} PRIVATE /ZH:SHA_256)
88-
endif()
89-
90-
if((MSVC_VERSION GREATER_EQUAL 1928)
91-
AND (CMAKE_SIZEOF_VOID_P EQUAL 8)
92-
AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0)))
93-
target_compile_options(${PROJECT_NAME} PRIVATE "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>")
94-
target_link_options(${PROJECT_NAME} PRIVATE "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>")
95-
endif()
96-
else()
97-
target_compile_definitions(${PROJECT_NAME} PRIVATE $<IF:$<CONFIG:DEBUG>,_DEBUG,NDEBUG>)
56+
target_compile_options(${PROJECT_NAME} PRIVATE /W4 /GR-)
9857
endif()
9958

100-
if(NOT ${DIRECTX_ARCH} MATCHES "^arm")
101-
if(${CMAKE_SIZEOF_VOID_P} EQUAL "4")
102-
set(ARCH_SSE2 $<$<CXX_COMPILER_ID:MSVC>:/arch:SSE2> $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse2>)
103-
else()
104-
set(ARCH_SSE2 $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-msse2>)
105-
endif()
106-
107-
target_compile_options(${PROJECT_NAME} PRIVATE ${ARCH_SSE2})
108-
endif()
59+
target_compile_definitions(${PROJECT_NAME} PRIVATE ${COMPILER_DEFINES})
60+
target_compile_options(${PROJECT_NAME} PRIVATE ${COMPILER_SWITCHES})
61+
target_link_options(${PROJECT_NAME} PRIVATE ${LINKER_SWITCHES})
10962

110-
if ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
63+
if ( CMAKE_CXX_COMPILER_ID MATCHES "Clang|IntelLLVM" )
11164
target_compile_options(${PROJECT_NAME} PRIVATE
11265
"-Wpedantic" "-Wextra"
11366
"-Wno-c++98-compat" "-Wno-c++98-compat-pedantic"
11467
"-Wno-language-extension-token" "-Wno-switch"
11568
"-Wno-missing-field-initializers")
11669
target_compile_options(${PROJECT_NAME} PRIVATE ${WarningsEXE})
11770
elseif ( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" )
118-
target_compile_options(${PROJECT_NAME} PRIVATE /sdl /permissive- /JMC- /Zc:__cplusplus /Zc:inline)
119-
12071
if(ENABLE_CODE_ANALYSIS)
121-
target_compile_options(${PROJECT_NAME} PRIVATE /analyze)
122-
endif()
123-
124-
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.26)
125-
target_compile_options(${PROJECT_NAME} PRIVATE /Zc:preprocessor /wd5105)
126-
endif()
127-
128-
if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27) AND (NOT (${DIRECTX_ARCH} MATCHES "^arm")))
129-
target_link_options(${PROJECT_NAME} PRIVATE /CETCOMPAT)
130-
endif()
131-
132-
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28)
133-
target_compile_options(${PROJECT_NAME} PRIVATE /Zc:lambda)
134-
endif()
135-
136-
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.35)
137-
target_compile_options(${PROJECT_NAME} PRIVATE /Zc:checkGwOdr $<$<VERSION_GREATER_EQUAL:${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION},10.0.22000>:/Zc:templateScope>)
72+
target_compile_options(${PROJECT_NAME} PRIVATE /analyze /WX)
13873
endif()
13974
endif()
14075

@@ -147,14 +82,13 @@ if(WIN32)
14782
set(WINVER 0x0601)
14883
endif()
14984

150-
target_compile_definitions(${PROJECT_NAME} PRIVATE _MBCS _WIN32_WINNT=${WINVER})
85+
target_compile_definitions(${PROJECT_NAME} PRIVATE _WIN32_WINNT=${WINVER})
15186
endif()
15287

15388
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME})
15489

15590
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
15691

157-
15892
if(WIN32)
15993
if(${DIRECTX_ARCH} STREQUAL "x86")
16094
set(NUGET_ARCH win32)

build/CompilerAndLinker.cmake

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
# This modules provides variables with recommended Compiler and Linker switches
2+
#
3+
# Copyright (c) Microsoft Corporation.
4+
# Licensed under the MIT License.
5+
6+
set(COMPILER_DEFINES "")
7+
set(COMPILER_SWITCHES "")
8+
set(LINKER_SWITCHES "")
9+
10+
#--- Determines target architecture if not explicitly set
11+
if(DEFINED VCPKG_TARGET_ARCHITECTURE)
12+
set(DIRECTX_ARCH ${VCPKG_TARGET_ARCHITECTURE})
13+
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Ww][Ii][Nn]32$")
14+
set(DIRECTX_ARCH x86)
15+
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$")
16+
set(DIRECTX_ARCH x64)
17+
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$")
18+
set(DIRECTX_ARCH arm)
19+
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64$")
20+
set(DIRECTX_ARCH arm64)
21+
elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64EC$")
22+
set(DIRECTX_ARCH arm64ec)
23+
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Ww][Ii][Nn]32$")
24+
set(DIRECTX_ARCH x86)
25+
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Xx]64$")
26+
set(DIRECTX_ARCH x64)
27+
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]$")
28+
set(DIRECTX_ARCH arm)
29+
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]64$")
30+
set(DIRECTX_ARCH arm64)
31+
elseif(CMAKE_VS_PLATFORM_NAME_DEFAULT MATCHES "^[Aa][Rr][Mm]64EC$")
32+
set(DIRECTX_ARCH arm64ec)
33+
endif()
34+
35+
#--- Determines host architecture
36+
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "[Aa][Rr][Mm]64|aarch64|arm64")
37+
set(DIRECTX_HOST_ARCH arm64)
38+
else()
39+
set(DIRECTX_HOST_ARCH x64)
40+
endif()
41+
42+
#--- This legacy tool still uses MB instead of UNICODE
43+
if(WIN32)
44+
list(APPEND COMPILER_DEFINES _MBCS)
45+
endif()
46+
47+
#--- General MSVC-like SDL options
48+
if(MSVC)
49+
list(APPEND COMPILER_SWITCHES "$<$<NOT:$<CONFIG:DEBUG>>:/guard:cf>")
50+
list(APPEND LINKER_SWITCHES /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO)
51+
52+
if((${DIRECTX_ARCH} STREQUAL "x86")
53+
OR ((CMAKE_SIZEOF_VOID_P EQUAL 4) AND (NOT (${DIRECTX_ARCH} MATCHES "^arm"))))
54+
list(APPEND LINKER_SWITCHES /SAFESEH)
55+
endif()
56+
57+
if((MSVC_VERSION GREATER_EQUAL 1928)
58+
AND (CMAKE_SIZEOF_VOID_P EQUAL 8)
59+
AND (NOT (TARGET OpenEXR::OpenEXR))
60+
AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang|IntelLLVM")) OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0)))
61+
list(APPEND COMPILER_SWITCHES "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>")
62+
list(APPEND LINKER_SWITCHES "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>")
63+
endif()
64+
else()
65+
list(APPEND COMPILER_DEFINES $<IF:$<CONFIG:DEBUG>,_DEBUG,NDEBUG>)
66+
endif()
67+
68+
#--- Target architecture switches
69+
if(NOT (${DIRECTX_ARCH} MATCHES "^arm"))
70+
if((${DIRECTX_ARCH} STREQUAL "x86") OR (CMAKE_SIZEOF_VOID_P EQUAL 4))
71+
set(ARCH_SSE2 $<$<CXX_COMPILER_ID:MSVC,Intel>:/arch:SSE2> $<$<NOT:$<CXX_COMPILER_ID:MSVC,Intel>>:-msse2>)
72+
else()
73+
set(ARCH_SSE2 $<$<NOT:$<CXX_COMPILER_ID:MSVC,Intel>>:-msse2>)
74+
endif()
75+
76+
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
77+
list(APPEND ARCH_SSE2 -mfpmath=sse)
78+
endif()
79+
80+
list(APPEND COMPILER_SWITCHES ${ARCH_SSE2})
81+
endif()
82+
83+
#--- Compiler-specific switches
84+
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|IntelLLVM")
85+
if(MSVC AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0))
86+
list(APPEND COMPILER_SWITCHES /ZH:SHA_256)
87+
endif()
88+
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
89+
list(APPEND COMPILER_SWITCHES /Zc:__cplusplus /Zc:inline /fp:fast /Qdiag-disable:161)
90+
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
91+
list(APPEND COMPILER_SWITCHES /sdl /Zc:inline /fp:fast)
92+
93+
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
94+
message(STATUS "Building using Whole Program Optimization")
95+
list(APPEND COMPILER_SWITCHES $<$<NOT:$<CONFIG:Debug>>:/Gy /Gw>)
96+
endif()
97+
98+
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.10)
99+
list(APPEND COMPILER_SWITCHES /permissive-)
100+
endif()
101+
102+
if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.11)
103+
AND OpenMP_CXX_FOUND)
104+
# OpenMP in MSVC is not compatible with /permissive- unless you disable two-phase lookup
105+
list(APPEND COMPILER_SWITCHES /Zc:twoPhase-)
106+
endif()
107+
108+
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.14)
109+
list(APPEND COMPILER_SWITCHES /Zc:__cplusplus)
110+
endif()
111+
112+
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.15)
113+
list(APPEND COMPILER_SWITCHES /JMC-)
114+
endif()
115+
116+
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.24)
117+
list(APPEND COMPILER_SWITCHES /ZH:SHA_256)
118+
endif()
119+
120+
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.26)
121+
list(APPEND COMPILER_SWITCHES /Zc:preprocessor /wd5104 /wd5105)
122+
endif()
123+
124+
if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27) AND (NOT (${DIRECTX_ARCH} MATCHES "^arm")))
125+
list(APPEND LINKER_SWITCHES /CETCOMPAT)
126+
endif()
127+
128+
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28)
129+
list(APPEND COMPILER_SWITCHES /Zc:lambda)
130+
endif()
131+
132+
if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.29)
133+
AND (NOT VCPKG_TOOLCHAIN))
134+
list(APPEND COMPILER_SWITCHES /external:W4)
135+
endif()
136+
137+
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.35)
138+
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
139+
list(APPEND COMPILER_SWITCHES $<$<NOT:$<CONFIG:Debug>>:/Zc:checkGwOdr>)
140+
endif()
141+
142+
list(APPEND COMPILER_SWITCHES $<$<VERSION_GREATER_EQUAL:${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION},10.0.22000>:/Zc:templateScope>)
143+
endif()
144+
endif()

0 commit comments

Comments
 (0)