|
3 | 3 | cmake_minimum_required (VERSION 3.21) |
4 | 4 |
|
5 | 5 | function(file_add_depends FILE) |
6 | | - message(STATUS "Add file system dependency: ${FILE}") |
7 | | - if(EXISTS "${FILE}") |
8 | | - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${FILE}) # generally watches for changes |
| 6 | + cmake_parse_arguments(ADDITIONAL_ARGS "EXISTENCE_ONLY" "" "" ${ARGN}) |
| 7 | + |
| 8 | + if(ADDITIONAL_ARGS_EXISTENCE_ONLY) |
| 9 | + message(STATUS "Add file system dependency on existence: ${FILE}") |
| 10 | + file(GLOB _ CONFIGURE_DEPENDS "${FILE}") |
9 | 11 | else() |
10 | | - file(GLOB _ CONFIGURE_DEPENDS ${FILE}) # trick to trigger reconfigure if the file comes into existence |
| 12 | + message(STATUS "Add file system dependency: ${FILE}") |
| 13 | + if(EXISTS "${FILE}") |
| 14 | + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${FILE}") |
| 15 | + else() |
| 16 | + # Trigger reconfigure if the file comes into existence |
| 17 | + file(GLOB _ CONFIGURE_DEPENDS "${FILE}") |
| 18 | + endif() |
11 | 19 | endif() |
12 | 20 | endfunction() |
13 | 21 |
|
@@ -123,64 +131,64 @@ else() |
123 | 131 | endif() |
124 | 132 |
|
125 | 133 |
|
126 | | -# Add source to this project's executable. |
| 134 | +# Create the OpenSHC.exe target, should not require the game |
127 | 135 | add_executable(OpenSHC.exe WIN32 src/entry.cpp ${CORE_SOURCES} ${OPENSHC_SOURCES}) |
128 | 136 | set_target_properties(OpenSHC.exe PROPERTIES OUTPUT_NAME ${OPEN_SHC_NAME}) |
| 137 | +set_target_properties(OpenSHC.exe PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/EXE") |
129 | 138 | target_compile_definitions(OpenSHC.exe PRIVATE OPEN_SHC_EXE) |
130 | 139 | target_precompile_headers(OpenSHC.exe PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${PCH_FILE}>) |
131 | 140 |
|
| 141 | + |
| 142 | + |
| 143 | +# Create custom target that pulls in the required dependencies to run the exe |
| 144 | +# NOTE: There seems to be an issue with our naming here, causing the depends to look for "OpenSHC.exe.exe" instead |
| 145 | +add_custom_target(OpenSHC.exe.runnable DEPENDS OpenSHC.exe.exe) |
| 146 | + |
132 | 147 | # Checks if a binkw32_real is present and uses this instead |
133 | 148 | file_add_depends("${CRUSADER_DIR}/binkw32_real.dll") |
134 | 149 | if(EXISTS "${CRUSADER_DIR}/binkw32_real.dll") |
135 | | - target_file_copy_if_different(OpenSHC.exe "${CRUSADER_DIR}/binkw32_real.dll" "$<TARGET_FILE_DIR:OpenSHC.exe>/binkw32.dll") |
| 150 | + target_file_copy_if_different(OpenSHC.exe.runnable "${CRUSADER_DIR}/binkw32_real.dll" "$<TARGET_FILE_DIR:OpenSHC.exe>/binkw32.dll") |
136 | 151 | else() |
137 | | - target_file_copy_if_different(OpenSHC.exe "${CRUSADER_DIR}/binkw32.dll" "$<TARGET_FILE_DIR:OpenSHC.exe>/binkw32.dll") |
| 152 | + target_file_copy_if_different(OpenSHC.exe.runnable "${CRUSADER_DIR}/binkw32.dll" "$<TARGET_FILE_DIR:OpenSHC.exe>/binkw32.dll") |
138 | 153 | endif() |
139 | | -target_file_copy_if_different(OpenSHC.exe "${CRUSADER_DIR}/Mss32.dll" "$<TARGET_FILE_DIR:OpenSHC.exe>/Mss32.dll") |
| 154 | +target_file_copy_if_different(OpenSHC.exe.runnable "${CRUSADER_DIR}/Mss32.dll" "$<TARGET_FILE_DIR:OpenSHC.exe>/Mss32.dll") |
140 | 155 |
|
141 | 156 | # shfolder is a normal windows lib, however, the game needs to work with the games version, so we still copy it |
142 | 157 | # it should be checked later if the compiler emits a shfolder.dll on its own or if it statically links, which we do not want |
143 | | -target_file_copy_if_different(OpenSHC.exe "${CRUSADER_DIR}/shfolder.dll" "$<TARGET_FILE_DIR:OpenSHC.exe>/shfolder.dll") |
| 158 | +target_file_copy_if_different(OpenSHC.exe.runnable "${CRUSADER_DIR}/shfolder.dll" "$<TARGET_FILE_DIR:OpenSHC.exe>/shfolder.dll") |
144 | 159 |
|
145 | 160 |
|
146 | 161 |
|
147 | | -# Place the dll and its pdb in the OpenSHC module folder for live testing |
148 | | -set(OPEN_SHC_DLL_DEST "${CRUSADER_DIR}/ucp/modules/${OPEN_SHC_NAME}-${OPEN_SHC_VERSION}" CACHE PATH "Path for OpenSHC.dll and OpenSHC.pdb") |
149 | | - |
| 162 | +# Create the OpenSHC.dll target, should not require the game |
150 | 163 | add_library(OpenSHC.dll SHARED src/entry.cpp ${CORE_SOURCES} ${OPENSHC_SOURCES}) |
151 | 164 | set_target_properties(OpenSHC.dll PROPERTIES OUTPUT_NAME ${OPEN_SHC_NAME}) |
| 165 | +set_target_properties(OpenSHC.dll PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/DLL") |
152 | 166 | target_compile_definitions(OpenSHC.dll PRIVATE OPEN_SHC_DLL) |
153 | 167 | target_precompile_headers(OpenSHC.dll PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${PCH_FILE}>) |
154 | 168 |
|
155 | | -# Using module folder as runtime output to properly place the dll and other libs |
156 | | -set_target_properties(OpenSHC.dll PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${OPEN_SHC_DLL_DEST}) |
| 169 | + |
| 170 | + |
| 171 | +# Create custom target that deploys the DLL and the required UCP files to the modules folder |
| 172 | +add_custom_target(OpenSHC.dll.deploy DEPENDS OpenSHC.dll) |
| 173 | +set(OPEN_SHC_DLL_DEST "${CRUSADER_DIR}/ucp/modules/${OPEN_SHC_NAME}-${OPEN_SHC_VERSION}") |
157 | 174 |
|
158 | 175 | # Ensure the module folder exists |
159 | | -file(MAKE_DIRECTORY ${OPEN_SHC_DLL_DEST}) |
160 | | -file_add_depends("${OPEN_SHC_DLL_DEST}") |
161 | | - |
162 | | -# This strange workaround does ensure that the module folder is generated and that a config change regenerates the dll. |
163 | | -# It "only" costs a file creation and a compare minimum while not changing the actual source. Found no other way. |
164 | | -set(BUILD_TRIGGER_FILE "${OPEN_SHC_DLL_DEST}/buildtrigger.c") |
165 | | -add_custom_target( |
166 | | - OpenSHC.dll.trigger |
167 | | - BYPRODUCTS ${BUILD_TRIGGER_FILE} |
168 | | - COMMAND ${CMAKE_COMMAND} -E echo "// $<CONFIG>" > ${BUILD_TRIGGER_FILE}.tmp |
169 | | - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${BUILD_TRIGGER_FILE}.tmp ${BUILD_TRIGGER_FILE} |
170 | | - COMMAND ${CMAKE_COMMAND} -E remove ${BUILD_TRIGGER_FILE}.tmp |
171 | | - VERBATIM |
| 176 | +add_custom_command(TARGET OpenSHC.dll.deploy POST_BUILD |
| 177 | + COMMAND ${CMAKE_COMMAND} -E make_directory "${OPEN_SHC_DLL_DEST}" |
172 | 178 | ) |
173 | | -target_sources(OpenSHC.dll PRIVATE ${BUILD_TRIGGER_FILE}) |
174 | | -add_dependencies(OpenSHC.dll OpenSHC.dll.trigger) |
| 179 | + |
| 180 | +# Copy exe and pdb is possible |
| 181 | +target_file_copy_if_different(OpenSHC.dll.deploy "$<TARGET_FILE:OpenSHC.dll>" "${OPEN_SHC_DLL_DEST}/$<TARGET_FILE_NAME:OpenSHC.dll>") |
| 182 | +target_file_copy_if_different(OpenSHC.dll.deploy "$<TARGET_PDB_FILE:OpenSHC.dll>" "${OPEN_SHC_DLL_DEST}/$<TARGET_PDB_FILE_NAME:OpenSHC.dll>") |
175 | 183 |
|
176 | 184 | # Copy ucp definition files |
177 | 185 | file_dependent_read_list("${CMAKE_SOURCE_DIR}/cmake/ucp-definition.txt" UCP_DEFINITION) |
178 | 186 | foreach(FILE IN LISTS UCP_DEFINITION) |
179 | 187 | get_filename_component(DIR "${FILE}" DIRECTORY) |
180 | 188 | if (DIR) |
181 | | - add_custom_command(TARGET OpenSHC.dll POST_BUILD |
| 189 | + add_custom_command(TARGET OpenSHC.dll.deploy POST_BUILD |
182 | 190 | COMMAND ${CMAKE_COMMAND} -E make_directory "${OPEN_SHC_DLL_DEST}/${DIR}" |
183 | 191 | ) |
184 | 192 | endif() |
185 | | - target_file_copy_if_different(OpenSHC.dll "${CMAKE_SOURCE_DIR}/ucp/${FILE}" "${OPEN_SHC_DLL_DEST}/${FILE}") |
| 193 | + target_file_copy_if_different(OpenSHC.dll.deploy "${CMAKE_SOURCE_DIR}/ucp/${FILE}" "${OPEN_SHC_DLL_DEST}/${FILE}") |
186 | 194 | endforeach() |
0 commit comments