-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
305 lines (284 loc) · 14.8 KB
/
CMakeLists.txt
File metadata and controls
305 lines (284 loc) · 14.8 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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
# =============================================================================
# C4D_MMD_Tool — Repository root workflow (dependencies + selected SDK plugin + optional installer)
# =============================================================================
# Typical usage (from repository root):
# Recommended: CMake presets (see CMakePresets.json in this directory)
# cmake --preset dev-windows
# cmake --build --preset workflow-dev
# cmake --preset package-windows
# cmake --build --preset inno-installer
# Or initial cache: cmake -S . -B _build_msvc -C cmake/initial_cache/dev.example.cmake
# Manual:
# cmake -S . -B _build_msvc -G "Ninja"
# cmake --build _build_msvc --target cmt-deps-build
# cmake --build _build_msvc --target cmt-sdk-configure
# cmake --build _build_msvc --target cmt-sdk-build
# One-shot (configure + build plugin):
# cmake --build _build_msvc --target cmt-workflow
#
# Root targets cmt-sdk-* / cmt-workflow do NOT use sdk_*/CMakePresets.json — they run
# cmake -S <sdk> -B <binaryDir> -G ... and cmake --build <binaryDir> ...
# You may still use presets manually inside sdk_* (e.g. cmake --preset windows_vs2022_v143).
#
# Optional cache: CMT_SDK_DIR, CMT_SDK_BINARY_DIR, CMT_SDK_GENERATOR, CMT_SDK_MSVC_ARCH, CMT_SDK_TOOLSET,
# CMT_SDK_SKIP_VS_A_AND_T (ON for Ninja/Xcode on Linux/macOS)
#
# Windows installer: cmt-package configures + Release-builds mmdtool in ALL sdk_* required by
# installer_script.iss, then runs ISCC. One command: cmake --build --preset inno-installer.
#
# Requires CMake 3.23+ (--build --preset for root repo presets). sdk_* may use a newer CMake.
# =============================================================================
cmake_minimum_required(VERSION 3.23)
project(CMT_Project_Workflow LANGUAGES NONE)
option(CMT_WITH_DEPENDENCY_SUBDIR "Add dependency/ and register cmt-deps-build and related targets" ON)
option(CMT_DEPS_ENABLE_LIBMMD_TESTS "Enable libMMD CTest in root dependency/ subproject (cache or preset dev-windows-deps-test)" OFF)
# --- Dependencies (bullet3 + libMMD as CMake subdirectories; no dependency/install) ---
if(CMT_WITH_DEPENDENCY_SUBDIR)
add_subdirectory(dependency)
endif()
# --- Cinema SDK and plugin (no sdk_* --preset; explicit -S/-B/--build) ---
set(CMT_SDK_DIR "${CMAKE_SOURCE_DIR}/sdk_2026" CACHE PATH "Path to sdk_* tree (must contain top-level CMakeLists.txt)")
set(CMT_SDK_BINARY_DIR "" CACHE PATH "SDK CMake build directory (-B); empty defaults to <repo>/_build_msvc/<sdk_name>")
set(CMT_SDK_GENERATOR "Visual Studio 17 2022" CACHE STRING "CMake -G when configuring the SDK (e.g. Ninja Multi-Config, Xcode)")
set(CMT_SDK_MSVC_ARCH "x64" CACHE STRING "Windows Visual Studio -A (ignored when CMT_SDK_SKIP_VS_A_AND_T is ON)")
set(CMT_SDK_TOOLSET "v143" CACHE STRING "Windows Visual Studio -T toolset (ignored when CMT_SDK_SKIP_VS_A_AND_T is ON)")
option(CMT_SDK_SKIP_VS_A_AND_T "Do not pass -A/-T when configuring the SDK (use for Ninja/Xcode on Linux/macOS)" OFF)
set(CMT_SDK_BUILD_CONFIG "Debug" CACHE STRING "Build configuration: Debug | Release | RelWithDebInfo | MinSizeRel")
set(CMT_SDK_BUILD_TARGET "mmdtool" CACHE STRING "Build only this target; empty = default/all targets")
# All sdk_* trees for cmt-package / cmt-sdk-configure-all (matches installer XdlSdkRel, deduplicated)
set(_CMT_ALL_SDK_TREES sdk_r20 sdk_r21 sdk_r23 sdk_r25 sdk_2023 sdk_2024 sdk_2025 sdk_2026)
cmake_path(ABSOLUTE_PATH CMT_SDK_DIR NORMALIZE OUTPUT_VARIABLE CMT_SDK_DIR_ABS)
if(CMT_SDK_BINARY_DIR STREQUAL "")
cmake_path(GET CMT_SDK_DIR_ABS FILENAME _CMT_SDK_DIRNAME)
set(CMT_SDK_BINARY_DIR "${CMAKE_SOURCE_DIR}/_build_msvc/${_CMT_SDK_DIRNAME}" CACHE PATH "SDK CMake build directory (-B)" FORCE)
endif()
cmake_path(ABSOLUTE_PATH CMT_SDK_BINARY_DIR NORMALIZE OUTPUT_VARIABLE CMT_SDK_BINARY_DIR_ABS)
set(_CMT_SDK_CONFIGURE_ARGS -S "${CMT_SDK_DIR_ABS}" -B "${CMT_SDK_BINARY_DIR_ABS}" -G "${CMT_SDK_GENERATOR}")
if(NOT CMT_SDK_SKIP_VS_A_AND_T)
if(NOT CMT_SDK_MSVC_ARCH STREQUAL "")
list(APPEND _CMT_SDK_CONFIGURE_ARGS -A "${CMT_SDK_MSVC_ARCH}")
endif()
if(NOT CMT_SDK_TOOLSET STREQUAL "")
list(APPEND _CMT_SDK_CONFIGURE_ARGS -T "${CMT_SDK_TOOLSET}")
endif()
endif()
# macOS architecture for SDK configure; override with x86_64 for older SDKs (R20–R23) that lack ARM support
set(CMT_SDK_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "macOS architectures for SDK build (e.g. x86_64 for pre-S24 SDKs)")
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin" AND CMT_SDK_GENERATOR STREQUAL "Xcode")
list(APPEND _CMT_SDK_CONFIGURE_ARGS "-D" "CMAKE_OSX_ARCHITECTURES=${CMT_SDK_OSX_ARCHITECTURES}")
endif()
# Forward pre-built dependency dir to SDK configure so it skips add_subdirectory for deps
if(NOT CMT_DEPS_PREBUILT_DIR STREQUAL "")
cmake_path(ABSOLUTE_PATH CMT_DEPS_PREBUILT_DIR NORMALIZE OUTPUT_VARIABLE _CMT_DEPS_PREBUILT_ABS)
list(APPEND _CMT_SDK_CONFIGURE_ARGS "-D" "CMT_DEPS_PREBUILT_DIR:PATH=${_CMT_DEPS_PREBUILT_ABS}")
else()
# SDK CMakeCache may still hold CMT_DEPS_PREBUILT_DIR from a previous cmt-package / manual run.
# That skips add_subdirectory(libMMD) and breaks mmdtool linking (LNK2019) when prebuilt/lib is empty.
list(APPEND _CMT_SDK_CONFIGURE_ARGS "-U" "CMT_DEPS_PREBUILT_DIR")
endif()
# --- Packaging (Inno Setup, optional) ---
set(CMT_INNO_SETUP_ISCC "" CACHE FILEPATH "Path to Inno Setup ISCC.exe; empty disables cmt-package")
set(CMT_ISS_MAIN "${CMAKE_SOURCE_DIR}/setup/Common/installer_script.iss" CACHE FILEPATH "Main .iss script")
set(CMT_ISS_EXTRA_ARGS "" CACHE STRING "Extra arguments for ISCC, e.g. /DPluginVersion=0.5.0 /DSdkBuildDir=_build_msvc")
# -----------------------------------------------------------------------------
# cmt-sdk-configure — Configure the selected SDK (same as cmake -S/-B, not sdk presets)
# -----------------------------------------------------------------------------
add_custom_target(cmt-sdk-configure
COMMAND ${CMAKE_COMMAND} ${_CMT_SDK_CONFIGURE_ARGS}
USES_TERMINAL
COMMENT "Configure SDK: -S ${CMT_SDK_DIR_ABS} -B ${CMT_SDK_BINARY_DIR_ABS}"
)
# -----------------------------------------------------------------------------
# cmt-sdk-configure-all — Configure every sdk_* (same -G/-A/-T as single-SDK path)
# SDK build dirs: <repo>/<root-build-dir-name>/<sdk> (e.g. _build_msvc/sdk_2026)
# -----------------------------------------------------------------------------
cmake_path(GET CMAKE_BINARY_DIR FILENAME _CMT_ROOT_BUILDDIR_NAME)
set(_CMT_SDK_CONFIGURE_ALL_COMMANDS "")
foreach(_sdk_dir IN LISTS _CMT_ALL_SDK_TREES)
set(_sdk_src "${CMAKE_SOURCE_DIR}/${_sdk_dir}")
set(_sdk_bin "${CMAKE_SOURCE_DIR}/${_CMT_ROOT_BUILDDIR_NAME}/${_sdk_dir}")
set(_sdk_cfg -S "${_sdk_src}" -B "${_sdk_bin}" -G "${CMT_SDK_GENERATOR}")
if(NOT CMT_SDK_SKIP_VS_A_AND_T)
if(NOT CMT_SDK_MSVC_ARCH STREQUAL "")
list(APPEND _sdk_cfg -A "${CMT_SDK_MSVC_ARCH}")
endif()
if(NOT CMT_SDK_TOOLSET STREQUAL "")
list(APPEND _sdk_cfg -T "${CMT_SDK_TOOLSET}")
endif()
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin" AND CMT_SDK_GENERATOR STREQUAL "Xcode")
list(APPEND _sdk_cfg "-D" "CMAKE_OSX_ARCHITECTURES=${CMT_SDK_OSX_ARCHITECTURES}")
endif()
if(NOT CMT_DEPS_PREBUILT_DIR STREQUAL "")
cmake_path(ABSOLUTE_PATH CMT_DEPS_PREBUILT_DIR NORMALIZE OUTPUT_VARIABLE _CMT_DEPS_PREBUILT_ABS)
list(APPEND _sdk_cfg "-D" "CMT_DEPS_PREBUILT_DIR:PATH=${_CMT_DEPS_PREBUILT_ABS}")
else()
list(APPEND _sdk_cfg "-U" "CMT_DEPS_PREBUILT_DIR")
endif()
list(APPEND _CMT_SDK_CONFIGURE_ALL_COMMANDS COMMAND ${CMAKE_COMMAND} ${_sdk_cfg})
endforeach()
add_custom_target(cmt-sdk-configure-all
${_CMT_SDK_CONFIGURE_ALL_COMMANDS}
USES_TERMINAL
VERBATIM
COMMENT "Configure all sdk_* under ${CMAKE_SOURCE_DIR}/${_CMT_ROOT_BUILDDIR_NAME}/<sdk>"
)
# -----------------------------------------------------------------------------
# cmt-sdk-build — Build the plugin in the selected SDK
# -----------------------------------------------------------------------------
if(NOT CMT_SDK_BUILD_TARGET STREQUAL "")
add_custom_target(cmt-sdk-build
COMMAND ${CMAKE_COMMAND} --build "${CMT_SDK_BINARY_DIR_ABS}" --config "${CMT_SDK_BUILD_CONFIG}" --target "${CMT_SDK_BUILD_TARGET}"
USES_TERMINAL
COMMENT "Build plugin (${CMT_SDK_BUILD_CONFIG}, target=${CMT_SDK_BUILD_TARGET})"
)
else()
add_custom_target(cmt-sdk-build
COMMAND ${CMAKE_COMMAND} --build "${CMT_SDK_BINARY_DIR_ABS}" --config "${CMT_SDK_BUILD_CONFIG}"
USES_TERMINAL
COMMENT "Build SDK default targets (${CMT_SDK_BUILD_CONFIG})"
)
endif()
# -----------------------------------------------------------------------------
# cmt-workflow — Configure SDK then build plugin
# -----------------------------------------------------------------------------
if(CMT_SDK_BUILD_TARGET STREQUAL "")
add_custom_target(cmt-workflow
COMMAND ${CMAKE_COMMAND} ${_CMT_SDK_CONFIGURE_ARGS}
COMMAND ${CMAKE_COMMAND} --build "${CMT_SDK_BINARY_DIR_ABS}" --config "${CMT_SDK_BUILD_CONFIG}"
USES_TERMINAL
COMMENT "configure + build SDK (${CMT_SDK_BUILD_CONFIG})"
)
else()
add_custom_target(cmt-workflow
COMMAND ${CMAKE_COMMAND} ${_CMT_SDK_CONFIGURE_ARGS}
COMMAND ${CMAKE_COMMAND} --build "${CMT_SDK_BINARY_DIR_ABS}" --config "${CMT_SDK_BUILD_CONFIG}" --target "${CMT_SDK_BUILD_TARGET}"
USES_TERMINAL
COMMENT "configure + build target ${CMT_SDK_BUILD_TARGET} (${CMT_SDK_BUILD_CONFIG})"
)
endif()
if(CMT_WITH_DEPENDENCY_SUBDIR)
add_dependencies(cmt-workflow cmt-deps-build)
endif()
# -----------------------------------------------------------------------------
# cmt-package — Build ALL SDKs (Release) + Inno Setup installer (one-click)
# SDK list matches XdlSdkRel in installer_script.iss (deduplicated).
# -----------------------------------------------------------------------------
if(NOT CMT_INNO_SETUP_ISCC STREQUAL "")
cmake_path(ABSOLUTE_PATH CMT_INNO_SETUP_ISCC NORMALIZE OUTPUT_VARIABLE _CMT_ISCC_ABS)
cmake_path(ABSOLUTE_PATH CMT_ISS_MAIN NORMALIZE OUTPUT_VARIABLE _CMT_ISS_ABS)
if(NOT EXISTS "${_CMT_ISCC_ABS}")
message(WARNING
"CMT_INNO_SETUP_ISCC not found: ${_CMT_ISCC_ABS}\n"
"Set the cache to your ISCC.exe. Common locations:\n"
" C:/Program Files/Inno Setup 6/ISCC.exe\n"
" C:/Program Files (x86)/Inno Setup 6/ISCC.exe"
)
endif()
if(NOT EXISTS "${_CMT_ISS_ABS}")
message(FATAL_ERROR "Installer script not found: ${_CMT_ISS_ABS}")
endif()
if(NOT CMT_ISS_EXTRA_ARGS STREQUAL "")
separate_arguments(_CMT_ISS_EXTRA NATIVE_COMMAND "${CMT_ISS_EXTRA_ARGS}")
endif()
# Build shared deps (bullet3 + libMMD) once; all SDKs link pre-built .libs.
set(_cmt_deps_prebuilt "${CMAKE_SOURCE_DIR}/_build_msvc/cmt_deps_prebuilt")
set(_cmt_deps_bin "${CMAKE_SOURCE_DIR}/_build_msvc/cmt_deps")
set(_cmt_deps_cfg
-S "${CMAKE_SOURCE_DIR}/dependency"
-B "${_cmt_deps_bin}"
-G "${CMT_SDK_GENERATOR}"
"-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=${_cmt_deps_prebuilt}/lib"
"-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=${_cmt_deps_prebuilt}/lib"
)
if(NOT CMT_SDK_SKIP_VS_A_AND_T)
if(NOT CMT_SDK_MSVC_ARCH STREQUAL "")
list(APPEND _cmt_deps_cfg -A "${CMT_SDK_MSVC_ARCH}")
endif()
if(NOT CMT_SDK_TOOLSET STREQUAL "")
list(APPEND _cmt_deps_cfg -T "${CMT_SDK_TOOLSET}")
endif()
endif()
set(_CMT_PACKAGE_COMMANDS
COMMAND ${CMAKE_COMMAND} ${_cmt_deps_cfg}
COMMAND ${CMAKE_COMMAND} --build "${_cmt_deps_bin}" --config Release
COMMAND ${CMAKE_COMMAND} --build "${_cmt_deps_bin}" --config Debug
)
foreach(_sdk IN LISTS _CMT_ALL_SDK_TREES)
set(_sdk_src "${CMAKE_SOURCE_DIR}/${_sdk}")
set(_sdk_bin "${CMAKE_SOURCE_DIR}/_build_msvc/${_sdk}")
set(_sdk_cfg -S "${_sdk_src}" -B "${_sdk_bin}" -G "${CMT_SDK_GENERATOR}"
"-DCMT_DEPS_PREBUILT_DIR:PATH=${_cmt_deps_prebuilt}"
)
if(NOT CMT_SDK_SKIP_VS_A_AND_T)
if(NOT CMT_SDK_MSVC_ARCH STREQUAL "")
list(APPEND _sdk_cfg -A "${CMT_SDK_MSVC_ARCH}")
endif()
if(NOT CMT_SDK_TOOLSET STREQUAL "")
list(APPEND _sdk_cfg -T "${CMT_SDK_TOOLSET}")
endif()
endif()
list(APPEND _CMT_PACKAGE_COMMANDS
COMMAND ${CMAKE_COMMAND} ${_sdk_cfg}
COMMAND ${CMAKE_COMMAND} --build "${_sdk_bin}" --config Release --target mmdtool
)
endforeach()
if(CMT_ISS_EXTRA_ARGS STREQUAL "")
add_custom_target(cmt-package
${_CMT_PACKAGE_COMMANDS}
COMMAND "${_CMT_ISCC_ABS}" "${_CMT_ISS_ABS}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
USES_TERMINAL
VERBATIM
COMMENT "Build all SDKs (Release) + Inno Setup installer"
)
else()
add_custom_target(cmt-package
${_CMT_PACKAGE_COMMANDS}
COMMAND "${_CMT_ISCC_ABS}" ${_CMT_ISS_EXTRA} "${_CMT_ISS_ABS}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
USES_TERMINAL
VERBATIM
COMMENT "Build all SDKs (Release) + Inno Setup installer"
)
endif()
if(CMT_WITH_DEPENDENCY_SUBDIR)
add_dependencies(cmt-package cmt-deps-build)
endif()
endif()
# -----------------------------------------------------------------------------
# cmt-clean — Remove root _build_msvc directory (root project + all SDK build trees)
# -----------------------------------------------------------------------------
add_custom_target(cmt-clean
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_SOURCE_DIR}/_build_msvc"
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_SOURCE_DIR}/_build_clangcl"
COMMENT "Remove _build_msvc and _build_clangcl (root project + all SDK build trees)"
)
# -----------------------------------------------------------------------------
# cmt-clean-deps — Remove legacy third-party dirs and all cmt_deps trees
#
# Plugin builds (sdk_* with mmdtool_plugin_dependencies_add) place Bullet/libMMD under
# <repo>/_build_msvc/sdk_2026/cmt_deps (CMAKE_BINARY_DIR of the SDK project)
# Root "dependency/" workflow uses <repo>/_build_msvc/cmt_deps
# The old target only removed ${CMAKE_BINARY_DIR}/cmt_deps (root configure), so SDK
# builds were never cleaned — we glob common _build_*/*/cmt_deps patterns below.
# -----------------------------------------------------------------------------
set(_CMT_CLEAN_DEPS_EXTRA_COMMANDS "")
file(GLOB _CMT_CMT_DEPS_SDK_GLOB
"${CMAKE_SOURCE_DIR}/_build_msvc/*/cmt_deps"
"${CMAKE_SOURCE_DIR}/_build_ninja/*/cmt_deps"
"${CMAKE_SOURCE_DIR}/_build_clangcl/*/cmt_deps"
"${CMAKE_SOURCE_DIR}/_build_xcode/*/cmt_deps"
)
foreach(_d IN LISTS _CMT_CMT_DEPS_SDK_GLOB)
list(APPEND _CMT_CLEAN_DEPS_EXTRA_COMMANDS COMMAND ${CMAKE_COMMAND} -E rm -rf "${_d}")
endforeach()
add_custom_target(cmt-clean-deps
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_SOURCE_DIR}/dependency/bullet3/build"
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_SOURCE_DIR}/dependency/libMMD/build"
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_SOURCE_DIR}/dependency/install"
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_BINARY_DIR}/cmt_deps"
COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_SOURCE_DIR}/_build_msvc/cmt_deps"
${_CMT_CLEAN_DEPS_EXTRA_COMMANDS}
COMMENT "Remove legacy dependency/*build, dependency/install, root cmt_deps, and sdk_* cmt_deps under _build_*"
)