-
-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
213 lines (189 loc) · 8.31 KB
/
CMakeLists.txt
File metadata and controls
213 lines (189 loc) · 8.31 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
cmake_minimum_required(VERSION 3.12)
project(pac LANGUAGES C CXX)
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
include(CheckIPOSupported)
check_ipo_supported(RESULT lto_supported OUTPUT error)
set(CMAKE_CXX_STANDARD 20)
if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
endif()
if (CMAKE_BUILD_TYPE MATCHES "Debug")
set(JNGL_RECORD 1)
endif()
if( ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
set(USE_FLAGS "-s USE_SDL=2 -s USE_FREETYPE=1 -s USE_VORBIS=1 -s USE_LIBPNG=1 -s DISABLE_EXCEPTION_CATCHING=0 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${USE_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${USE_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${USE_FLAGS} -s ASSERTIONS=1 -s FULL_ES3=1 --pre-js ${CMAKE_CURRENT_SOURCE_DIR}/pre.js -lidbfs.js -s FORCE_FILESYSTEM -s INITIAL_MEMORY=1024MB --preload-file data ") #-s ALLOW_MEMORY_GROWTH=1 --source-map-base https://pac4.gitlab.io/pac/ -g
if (CMAKE_BUILD_TYPE MATCHES "Debug")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -O0 -g --source-map-base http://0.0.0.0:8000/") # https://developer.chrome.com/blog/wasm-debugging-2020/ and https://groups.google.com/g/emscripten-discuss/c/DEmpyGoq6kE --source-map-base https://pac4.gitlab.io/pac/
endif()
SET(CMAKE_EXECUTABLE_SUFFIX ".html")
endif()
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/subprojects/jngl/CMakeLists.txt")
execute_process(
COMMAND git submodule update --init subprojects/jngl
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND_ERROR_IS_FATAL ANY
)
endif()
add_subdirectory(subprojects/jngl)
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/subprojects/spine-runtimes/spine-cpp")
execute_process(
COMMAND git submodule update --init subprojects/spine-runtimes
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND_ERROR_IS_FATAL ANY
)
endif()
set(SPINE_SET_COMPILER_FLAGS OFF CACHE BOOL "Set compiler flags" FORCE)
add_compile_definitions(SPINE_USE_STD_FUNCTION)
add_subdirectory(subprojects/spine-runtimes/spine-cpp)
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/subprojects/schnacker/CMakeLists.txt")
execute_process(
COMMAND git submodule update --init --recursive subprojects/schnacker
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND_ERROR_IS_FATAL ANY
)
endif()
add_subdirectory(subprojects/schnacker/)
set(PAC_SANITIZE_ADDRESS_DEFAULT ON)
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" OR ANDROID OR CMAKE_BUILD_TYPE MATCHES "Release")
set(PAC_SANITIZE_ADDRESS_DEFAULT OFF)
endif()
option(PAC_SANITIZE_ADDRESS "Enable AddressSanitizer" ${PAC_SANITIZE_ADDRESS_DEFAULT})
if(PAC_SANITIZE_ADDRESS AND NOT EMSCRIPTEN)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
endif()
file(GLOB SOURCES CONFIGURE_DEPENDS
src/*.cpp
src/input/*.cpp
src/dialog/*.cpp
)
if (NOT CMAKE_BUILD_TYPE MATCHES "Release" AND NOT ANDROID AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/subprojects/gifanimcplusplus/gifanim.h")
execute_process(
COMMAND git submodule update --init --recursive subprojects/gifanimcplusplus
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND_ERROR_IS_FATAL ANY
)
endif()
file(GLOB SOURCESGIF CONFIGURE_DEPENDS
subprojects/gifanimcplusplus/*.cpp)
list (APPEND SOURCES ${SOURCESGIF})
endif()
if(ANDROID)
add_library(native_app_glue STATIC
${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
add_library(pac SHARED ${SOURCES})
# Export ANativeActivity_onCreate(),
# Refer to: https://github.com/android-ndk/ndk/issues/381.
set_property(TARGET pac APPEND_STRING PROPERTY LINK_FLAGS " -u ANativeActivity_onCreate")
target_link_libraries(pac PRIVATE
android
native_app_glue
EGL
GLESv3
OpenSLES
log
z
)
else()
if(WIN32)
add_executable(pac ${SOURCES})
else()
add_executable(pac ${SOURCES})
endif()
endif()
if (APPLE)
find_library(CoreServices CoreServices)
target_link_libraries(pac PRIVATE $<$<CONFIG:Debug>:${CoreServices}>)
endif()
target_link_libraries(pac PRIVATE
jngl spine-cpp schnacker
)
# Ensure bundled Lua headers take precedence over system Lua (e.g. Homebrew's Lua 5.5)
target_include_directories(pac BEFORE PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/subprojects/schnacker/subprojects/lua/include)
# Add Tests
if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" AND NOT IOS AND NOT ANDROID AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
add_subdirectory(test)
endif()
if(IOS)
file(GLOB ios_data "data/*")
list(APPEND ios_data ios/Storyboard.storyboard ios/logo_front_fullHD.png)
set_source_files_properties(${ios_data} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
target_sources(pac PRIVATE subprojects/jngl/src/ios/test/main.mm ios/Media.xcassets ${ios_data})
set_source_files_properties(ios/Media.xcassets PROPERTIES
MACOSX_PACKAGE_LOCATION Resources
)
# https://github.com/wrld3d/wrld-example-app/blob/72218e1783c90b7ae1470f41dca1c9eedd6e2678/ios/CMakeLists.txt
set_target_properties(
pac
PROPERTIES
MACOSX_BUNDLE YES
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_LIST_DIR}/ios/Info.plist"
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.bixense.pac"
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
XCODE_ATTRIBUTE_INSTALL_PATH "/Applications" # otherwise Xcode will create an empty Archive
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
# XCODE_ATTRIBUTE_DEVELOPMENT_TEAM 4DMBNMNYSA
)
# set_target_properties(freetype PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
# set_target_properties(jngl PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
# set_target_properties(ogg PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
# set_target_properties(vorbis PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
# set_target_properties(vorbisfile PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
# set_target_properties(webpdecode PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
# set_target_properties(webpdspdecode PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
# set_target_properties(webputilsdecode PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
endif()
file(GLOB GFX_FILES RELATIVE ${CMAKE_SOURCE_DIR}/data CONFIGURE_DEPENDS data/*.webp data/*.png
data/*/*.webp)
file(GLOB SFX_FILES RELATIVE ${CMAKE_SOURCE_DIR}/data data/sfx/*.ogg)
# configure_file(src/engine/datafiles.hpp.in include/datafiles.hpp @ONLY)
target_include_directories(pac PRIVATE ${CMAKE_BINARY_DIR}/include
# subprojects/spine-runtimes/spine-cpp/spine-cpp/include
subprojects/schnacker/src)
if (NOT CMAKE_BUILD_TYPE MATCHES "Release" AND NOT ANDROID AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
target_include_directories(pac PRIVATE subprojects/gifanimcplusplus)
endif()
if(WIN32)
target_compile_definitions(pac PRIVATE _USE_MATH_DEFINES UNICODE)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set_target_properties(pac PROPERTIES WIN32_EXECUTABLE 1)
endif()
if(ANDROID)
target_include_directories(pac PRIVATE
${ANDROID_NDK}/sources/android/native_app_glue)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
if(lto_supported)
message(STATUS "IPO / LTO enabled")
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE)
set_property(TARGET pac jngl spine-cpp schnacker PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(STATUS "IPO / LTO not supported: <${error}>")
endif()
endif()
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
target_compile_options(pac PUBLIC "/ZI")
target_link_options(pac PUBLIC "/INCREMENTAL")
set(lto_supported FALSE)
endif()
if(MSVC)
target_compile_options(pac PRIVATE /W4)
# TODO add /WX
else()
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
target_compile_options(pac PRIVATE -std=c++20 -Wall -Wextra -pedantic -Wno-long-long -Wunused -Wnon-virtual-dtor -Wno-align-mismatch -Wpedantic -Wpointer-arith -Wno-missing-braces)
# -Wdangling only works with clang
# TODO Add -Wshadow -Wconversion -Wmissing-prototypes -Werror
# -std=c++20 -O3 -fsanitize=fuzzer,address,undefined -fPIE
endif()
endif()
option(ALPACA_CLANG_TIDY "Run clang-tidy on source files" OFF)
if(ALPACA_CLANG_TIDY)
set_target_properties(pac PROPERTIES CXX_CLANG_TIDY "clang-tidy;--use-color")
endif()