@@ -4,7 +4,7 @@ function( godotcpp_options )
4
4
#TODO target
5
5
6
6
# Input from user for GDExtension interface header and the API JSON file
7
- set (GODOT_GDEXTENSION_DIR "gdextension" CACHE PATH
7
+ set (GODOT_GDEXTENSION_DIR "${PROJECT_SOURCE_DIR} / gdextension" CACHE PATH
8
8
"Path to a custom directory containing GDExtension interface header and API JSON file ( /path/to/gdextension_dir )" )
9
9
set (GODOT_CUSTOM_API_FILE "" CACHE FILEPATH
10
10
"Path to a custom GDExtension API JSON file (takes precedence over `gdextension_dir`) ( /path/to/custom_api_file )" )
@@ -42,6 +42,8 @@ function( godotcpp_options )
42
42
option (GODOT_SYSTEM_HEADERS "Expose headers as SYSTEM." ON )
43
43
option (GODOT_WARNING_AS_ERROR "Treat warnings as errors" OFF )
44
44
45
+ option (GODOT_CPP_INSTALL "Enables target install for exporting godot-cpp cmake configuration" ON )
46
+
45
47
# Run options commands on the following to populate cache for all platforms.
46
48
# This type of thing is typically done conditionally
47
49
# But as scons shows all options so shall we.
@@ -203,10 +205,11 @@ function( godotcpp_generate )
203
205
set (GODOT_SYSTEM_HEADERS_ATTRIBUTE SYSTEM )
204
206
endif ()
205
207
206
- target_include_directories (${PROJECT_NAME} ${GODOT_SYSTEM_HEADERS_ATTRIBUTE} PUBLIC
207
- include
208
- ${CMAKE_CURRENT_BINARY_DIR} /gen/include
209
- ${GODOT_GDEXTENSION_DIR}
208
+ target_include_directories (${PROJECT_NAME} ${GODOT_CPP_SYSTEM_HEADERS_ATTRIBUTE} PUBLIC
209
+ $< BUILD_INTERFACE:${PROJECT_SOURCE_DIR} /include>
210
+ $< BUILD_INTERFACE:${PROJECT_BINARY_DIR} /gen/include>
211
+ $< BUILD_INTERFACE:${GODOT_GDEXTENSION_DIR} >
212
+ $< INSTALL_INTERFACE:include>
210
213
)
211
214
212
215
# Add the compile flags
@@ -235,6 +238,67 @@ function( godotcpp_generate )
235
238
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} /bin"
236
239
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} /bin"
237
240
OUTPUT_NAME "${OUTPUT_NAME} "
241
+ EXPORT_NAME "cpp" # This ensures that the exported target is godot::cpp
238
242
)
239
243
240
244
endfunction ()
245
+
246
+ function ( godotcpp_install )
247
+ if (NOT GODOT_CPP_INSTALL )
248
+ return ()
249
+ endif ()
250
+
251
+ include ("CMakePackageConfigHelpers" )
252
+ include ("GNUInstallDirs" )
253
+
254
+ # Install the library and headers to their respective install location
255
+ # CMAKE_INSTALL_ are used to allow the package manager to chose the install location
256
+ install (TARGETS "godot-cpp"
257
+ EXPORT "godot-cpp-config"
258
+ ARCHIVE
259
+ DESTINATION "${CMAKE_INSTALL_LIBDIR} "
260
+ )
261
+ install (
262
+ DIRECTORY
263
+ "${PROJECT_SOURCE_DIR} /include/"
264
+ "${PROJECT_BINARY_DIR} /gen/include/"
265
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR} "
266
+ )
267
+
268
+ # Install the gdextension files
269
+ # The gdextension header is assumed to be the root include directory
270
+ # As the JSON file is neither a header nor lib file it goes to the datadir
271
+ install (FILES "${GODOT_GDEXTENSION_DIR} /gdextension_interface.h"
272
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR} "
273
+ )
274
+ install (FILES "${GODOT_GDEXTENSION_DIR} /extension_api.json"
275
+ DESTINATION "${CMAKE_INSTALL_DATADIR} /godot-cpp"
276
+ )
277
+
278
+ # Install the export config file
279
+ # This allows this library to be easily consumed by cmake projects:
280
+ # find_package("godot-cpp" CONFIG REQUIRED)
281
+ # target_link_libaries("my-project" PRIVATE "godot::cpp")
282
+ install (EXPORT "godot-cpp-config"
283
+ NAMESPACE "godot::"
284
+ DESTINATION "${CMAKE_INSTALL_DATADIR} /godot-cpp"
285
+ )
286
+
287
+ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.19" ) # string(JSON...) only available in cmake v3.19+
288
+ # Use the JSON api file to get the version
289
+ file (READ "${GODOT_GDEXTENSION_DIR} /extension_api.json" GODOT_GDEXTENSION_API_JSON )
290
+ # GODOT_API_VERSION_MAJOR = GODOT_GDEXTENSION_API_JSON["header"]["version_major"]
291
+ string (JSON GODOT_API_VERSION_MAJOR GET "${GODOT_GDEXTENSION_API_JSON} " "header" "version_major" )
292
+ string (JSON GODOT_API_VERSION_MINOR GET "${GODOT_GDEXTENSION_API_JSON} " "header" "version_minor" )
293
+ string (JSON GODOT_API_VERSION_PATCH GET "${GODOT_GDEXTENSION_API_JSON} " "header" "version_patch" )
294
+ set (GODOT_API_VERSION "${GODOT_API_VERSION_MAJOR} .${GODOT_API_VERSION_MINOR} .${GODOT_API_VERSION_PATCH} " )
295
+ # Install the config version file so that the gdextension version can be specified in find_package
296
+ write_basic_package_version_file ("${PROJECT_BINARY_DIR} /godot-cpp-config-version.cmake"
297
+ VERSION "${GODOT_API_VERSION} "
298
+ COMPATIBILITY SameMinorVersion
299
+ )
300
+ install (FILES "${PROJECT_BINARY_DIR} /godot-cpp-config-version.cmake"
301
+ DESTINATION "${CMAKE_INSTALL_DATADIR} /godot-cpp"
302
+ )
303
+ endif ()
304
+ endfunction ()
0 commit comments