-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
205 lines (162 loc) · 5.41 KB
/
CMakeLists.txt
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
cmake_minimum_required(VERSION 3.16)
set(
CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file"
)
project(
wowpkg
VERSION 0.3.1
DESCRIPTION "A CLI World of Warcraft addon manager"
LANGUAGES C
)
set(WOWPKG_C_STANDARD 11)
option(WOWPKG_ENABLE_SANITIZERS "Build with or without sanitizers" OFF)
option(WOWPKG_ENABLE_TESTS "Build tests" OFF)
option(WOWPKG_USE_DEVELOPMENT_PATHS "Determines what paths will be used to find some files" OFF)
# Compiler flags that enable warnings.
set(WFLAGS)
# Mainly used for Windows. Adds extra optimization flags when building for
# release builds. These flags get added to WFLAGS.
set(WFLAGS_RELEASE)
# Linker flags.
set(LDFLAGS)
# Mainly used for Windows. Adds extra optimization linker flags for release
# builds. These flags get added to LDFLAGS.
set(LDFLAGS_RELEASE)
# Sanitizer flags.
set(SANSFLAGS)
# Path to catalog directory in project.
set(WOWPKG_CATALOG_PATH)
# Includes all compile time defines.
set(WOWPKG_DEFINES)
# List of libraries that will be linked to targets.
set(WOWPKG_LIBS)
# Path to user files for project. This location is where the program will search
# for user config files and is where it will save user specific data.
set(WOWPKG_USER_FILE_DIR)
if (WOWPKG_ENABLE_TESTS AND NOT WOWPKG_USE_DEVELOPMENT_PATHS)
message(WARNING "[${PROJECT_NAME}] enabling tests without using development paths may cause tests to fail")
endif()
if (WOWPKG_ENABLE_TESTS)
include(CTest)
enable_testing()
endif()
find_package(CURL CONFIG REQUIRED)
find_package(cJSON CONFIG REQUIRED)
find_package(unofficial-minizip CONFIG REQUIRED)
set(WOWPKG_LIBS CURL::libcurl cjson unofficial::minizip::minizip)
if (MSVC)
# CMake does not set proper release flags for MSVC.
set(WFLAGS_RELEASE /O2 /GL /DNDEBUG /Zi /Gy)
set(WFLAGS /W4 "$<$<CONFIG:Release>:${WFLAGS_RELEASE}>")
set(LDFLAGS_RELEASE /DEBUG /INCREMENTAL:NO /OPT:REF /OPT:ICF)
set(LDFLAGS "$<$<CONFIG:Release>:${LDFLAGS_RELEASE}>")
# A lot of the functions suggested by this are not available on other
# systems -- so just ignore the warnings.
set(WOWPKG_DEFINES _CRT_SECURE_NO_WARNINGS)
else()
set(
WFLAGS
-Wall
-Wextra
-Wshadow
-Wdouble-promotion
-Wconversion
-Wpedantic
-Wcast-align
-Wstrict-prototypes
-Wwrite-strings
-Winit-self
-Wformat=2
-Wstrict-overflow=2
-Wcast-qual
-Wundef
-Wswitch-default
-fstack-protector-strong
-Wparentheses
-Wunused-macros
-Wswitch-enum
-Wstrict-aliasing
)
endif()
if (WOWPKG_ENABLE_SANITIZERS)
message(STATUS "[${PROJECT_NAME}] enabling sanitizers")
if (MSVC)
set(SANFLAGS /fsanitize=address)
set(WFLAGS ${WFLAGS} ${SANFLAGS})
else()
set(
SANFLAGS
-fsanitize=address
-fsanitize=undefined
-fsanitize=float-divide-by-zero
-fsanitize=float-cast-overflow
-fno-sanitize-recover=all
-fno-sanitize=null
-fno-sanitize=alignment
)
set (WFLAGS ${WFLAGS} ${SANFLAGS})
if (APPLE)
set(LDFLAGS ${SANFLAGS} -static-libsan)
else()
set(LDFLAGS ${SANFLAGS} -static-libasan)
endif()
endif()
endif()
set(
SRC_FILES
${PROJECT_SOURCE_DIR}/src/addon.c
${PROJECT_SOURCE_DIR}/src/appstate.c
${PROJECT_SOURCE_DIR}/src/command.c
${PROJECT_SOURCE_DIR}/src/config.c
${PROJECT_SOURCE_DIR}/src/ini.c
${PROJECT_SOURCE_DIR}/src/list.c
${PROJECT_SOURCE_DIR}/src/osapi.c
${PROJECT_SOURCE_DIR}/src/zipper.c
)
list(APPEND WOWPKG_DEFINES WOWPKG_VERSION="${PROJECT_VERSION}")
if(WOWPKG_USE_DEVELOPMENT_PATHS)
message(STATUS "[${PROJECT_NAME}] building with development paths")
list(APPEND WOWPKG_DEFINES
WOWPKG_USER_FILE_DIR="${PROJECT_SOURCE_DIR}/dev_only"
WOWPKG_CATALOG_PATH="${PROJECT_SOURCE_DIR}/catalog"
)
endif()
add_subdirectory(src)
if (WOWPKG_ENABLE_TESTS)
message(STATUS "[${PROJECT_NAME}] enabling tests")
add_subdirectory(test)
endif()
if (APPLE)
# Assume if Apple that DragNDrop generator is being used. This generator will
# be setup so that there is a single directory that can be dragged to the
# Applications directory.
install(
TARGETS wowpkg
CONFIGURATIONS Release
RUNTIME DESTINATION ${PROJECT_NAME}/bin
)
install(DIRECTORY catalog DESTINATION ${PROJECT_NAME})
else()
install(
TARGETS wowpkg
CONFIGURATIONS Release
RUNTIME DESTINATION bin
)
install(DIRECTORY catalog DESTINATION .)
endif()
if (WIN32)
install(FILES ${PROJECT_SOURCE_DIR}/build/src/Release/cjson.dll DESTINATION bin)
install(FILES ${PROJECT_SOURCE_DIR}/build/src/Release/libcurl.dll DESTINATION bin)
install(FILES ${PROJECT_SOURCE_DIR}/build/src/Release/zlib1.dll DESTINATION bin)
endif()
set(CPACK_VERBATIM_VARIABLES true)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_VENDOR ${PROJECT_NAME})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_DESCRIPTION})
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROJECT_NAME})
set(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE)
set(CPACK_RESOURCE_FILE_README ${PROJECT_SOURCE_DIR}/README.md)
set(CPACK_MONOLITHIC_INSTALL true)
include(CPack)