CMake: Implement 'threads' Option

Add the GODOT_THREADS option and related supporting code
Includes naming cleanups
pull/1698/head
Samuel Nicholas 2025-01-31 20:51:37 +10:30
parent ee2a895ea4
commit 91f81f51e1
4 changed files with 45 additions and 38 deletions

View File

@ -155,6 +155,8 @@ function( common_compiler_flags )
$<$<STREQUAL:${GODOT_PRECISION},double>:REAL_T_IS_DOUBLE> $<$<STREQUAL:${GODOT_PRECISION},double>:REAL_T_IS_DOUBLE>
$<${IS_MSVC}:$<${DISABLE_EXCEPTIONS}:_HAS_EXCEPTIONS=0>> $<${IS_MSVC}:$<${DISABLE_EXCEPTIONS}:_HAS_EXCEPTIONS=0>>
$<${THREADS_ENABLED}:THREADS_ENABLED>
) )
target_link_options( ${TARGET_NAME} target_link_options( ${TARGET_NAME}

View File

@ -107,7 +107,8 @@ function( godotcpp_options )
set( GODOT_ARCH "" CACHE STRING "Target CPU Architecture") set( GODOT_ARCH "" CACHE STRING "Target CPU Architecture")
set_property( CACHE GODOT_ARCH PROPERTY STRINGS ${ARCH_LIST} ) set_property( CACHE GODOT_ARCH PROPERTY STRINGS ${ARCH_LIST} )
#TODO threads set( GODOT_THREADS ON CACHE BOOL "Enable threading support" )
#TODO compiledb #TODO compiledb
#TODO compiledb_file #TODO compiledb_file
@ -240,16 +241,15 @@ function( godotcpp_generate )
### Platform is derived from the toolchain target ### Platform is derived from the toolchain target
# See GeneratorExpressions PLATFORM_ID and CMAKE_SYSTEM_NAME # See GeneratorExpressions PLATFORM_ID and CMAKE_SYSTEM_NAME
set( SYSTEM_NAME string( CONCAT SYSTEM_NAME
$<$<PLATFORM_ID:Android>:android> "$<$<PLATFORM_ID:Android>:android.${ANDROID_ABI}>"
$<$<PLATFORM_ID:iOS>:ios> "$<$<PLATFORM_ID:iOS>:ios>"
$<$<PLATFORM_ID:Linux>:linux> "$<$<PLATFORM_ID:Linux>:linux>"
$<$<PLATFORM_ID:Darwin>:macos> "$<$<PLATFORM_ID:Darwin>:macos>"
$<$<PLATFORM_ID:Emscripten>:web> "$<$<PLATFORM_ID:Emscripten>:web>"
$<$<PLATFORM_ID:Windows>:windows> "$<$<PLATFORM_ID:Windows>:windows>"
$<$<PLATFORM_ID:Msys>:windows> "$<$<PLATFORM_ID:Msys>:windows>"
) )
string(REPLACE ";" "" SYSTEM_NAME "${SYSTEM_NAME}")
### Use the arch from the toolchain if it isn't set manually ### Use the arch from the toolchain if it isn't set manually
if( GODOT_ARCH ) if( GODOT_ARCH )
@ -263,6 +263,8 @@ function( godotcpp_generate )
set( DISABLE_EXCEPTIONS "$<BOOL:${GODOT_DISABLE_EXCEPTIONS}>") set( DISABLE_EXCEPTIONS "$<BOOL:${GODOT_DISABLE_EXCEPTIONS}>")
set( THREADS_ENABLED "$<BOOL:${GODOT_THREADS}>" )
# GODOT_DEV_BUILD # GODOT_DEV_BUILD
set( RELEASE_TYPES "Release;MinSizeRel") set( RELEASE_TYPES "Release;MinSizeRel")
get_property( IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) get_property( IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG )
@ -272,8 +274,6 @@ function( godotcpp_generate )
message( WARNING "=> GODOT_DEV_BUILD implies a Debug-like build but CMAKE_BUILD_TYPE is '${CMAKE_BUILD_TYPE}'") message( WARNING "=> GODOT_DEV_BUILD implies a Debug-like build but CMAKE_BUILD_TYPE is '${CMAKE_BUILD_TYPE}'")
endif () endif ()
set( IS_DEV_BUILD "$<BOOL:${GODOT_DEV_BUILD}>") set( IS_DEV_BUILD "$<BOOL:${GODOT_DEV_BUILD}>")
# The .dev portion of the name if GODOT_DEV_BUILD is true.
set( DEV_TAG "$<${IS_DEV_BUILD}:.dev>" )
### Define our godot-cpp library targets ### Define our godot-cpp library targets
foreach ( TARGET_ALIAS template_debug template_release editor ) foreach ( TARGET_ALIAS template_debug template_release editor )
@ -283,6 +283,17 @@ function( godotcpp_generate )
set( DEBUG_FEATURES "$<NOT:$<STREQUAL:${TARGET_ALIAS},template_release>>" ) set( DEBUG_FEATURES "$<NOT:$<STREQUAL:${TARGET_ALIAS},template_release>>" )
set( HOT_RELOAD "$<IF:${HOT_RELOAD-UNSET},${DEBUG_FEATURES},$<BOOL:${GODOT_USE_HOT_RELOAD}>>" ) set( HOT_RELOAD "$<IF:${HOT_RELOAD-UNSET},${DEBUG_FEATURES},$<BOOL:${GODOT_USE_HOT_RELOAD}>>" )
# Suffix
string( CONCAT GODOT_SUFFIX
"$<1:.${SYSTEM_NAME}>"
"$<1:.${TARGET_ALIAS}>"
"$<${IS_DEV_BUILD}:.dev>"
"$<$<STREQUAL:${GODOT_PRECISION},double>:.double>"
"$<1:.${SYSTEM_ARCH}>"
# TODO IOS_SIMULATOR
"$<$<NOT:${THREADS_ENABLED}>:.nothreads>"
)
# the godot-cpp.* library targets # the godot-cpp.* library targets
add_library( ${TARGET_NAME} STATIC EXCLUDE_FROM_ALL ) add_library( ${TARGET_NAME} STATIC EXCLUDE_FROM_ALL )
add_library( godot-cpp::${TARGET_ALIAS} ALIAS ${TARGET_NAME} ) add_library( godot-cpp::${TARGET_ALIAS} ALIAS ${TARGET_NAME} )
@ -311,14 +322,17 @@ function( godotcpp_generate )
POSITION_INDEPENDENT_CODE ON POSITION_INDEPENDENT_CODE ON
BUILD_RPATH_USE_ORIGIN ON BUILD_RPATH_USE_ORIGIN ON
PREFIX lib PREFIX "lib"
OUTPUT_NAME "${PROJECT_NAME}.${SYSTEM_NAME}.${TARGET_ALIAS}${DEV_TAG}.${SYSTEM_ARCH}" OUTPUT_NAME "${PROJECT_NAME}${GODOT_SUFFIX}"
ARCHIVE_OUTPUT_DIRECTORY "$<1:${CMAKE_BINARY_DIR}/bin>" ARCHIVE_OUTPUT_DIRECTORY "$<1:${CMAKE_BINARY_DIR}/bin>"
# Things that are handy to know for dependent targets # Things that are handy to know for dependent targets
GODOT_PLATFORM "${SYSTEM_NAME}" GODOT_PLATFORM "${SYSTEM_NAME}"
GODOT_TARGET "${TARGET_ALIAS}" GODOT_TARGET "${TARGET_ALIAS}"
GODOT_ARCH "${SYSTEM_ARCH}" GODOT_ARCH "${SYSTEM_ARCH}"
GODOT_PRECISION "${GODOT_PRECISION}"
GODOT_SUFFIX "${GODOT_SUFFIX}"
# Some IDE's respect this property to logically group targets # Some IDE's respect this property to logically group targets
FOLDER "godot-cpp" FOLDER "godot-cpp"

View File

@ -27,6 +27,7 @@ function( web_generate )
-sSIDE_MODULE -sSIDE_MODULE
-sSUPPORT_LONGJMP=wasm -sSUPPORT_LONGJMP=wasm
-fno-exceptions -fno-exceptions
$<${THREADS_ENABLED}:-sUSE_PTHREADS=1>
) )
target_link_options( ${TARGET_NAME} target_link_options( ${TARGET_NAME}

View File

@ -18,7 +18,6 @@ generate_doc_source( "${DOC_DATA_SOURCE}" "${DOC_XML}" )
foreach( TARGET_ALIAS template_debug template_release editor ) foreach( TARGET_ALIAS template_debug template_release editor )
set( TARGET_NAME "godot-cpp.test.${TARGET_ALIAS}" ) set( TARGET_NAME "godot-cpp.test.${TARGET_ALIAS}" )
set( LINK_TARGET "godot-cpp::${TARGET_ALIAS}" )
add_library( ${TARGET_NAME} SHARED EXCLUDE_FROM_ALL ) add_library( ${TARGET_NAME} SHARED EXCLUDE_FROM_ALL )
@ -31,20 +30,20 @@ foreach( TARGET_ALIAS template_debug template_release editor )
src/tests.h src/tests.h
) )
set( OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/project/bin/" )
# conditionally add doc data to compile output # conditionally add doc data to compile output
if( TARGET_ALIAS MATCHES "editor|template_debug" ) if( TARGET_ALIAS MATCHES "editor|template_debug" )
target_sources( ${TARGET_NAME} PRIVATE "${DOC_DATA_SOURCE}" ) target_sources( ${TARGET_NAME} PRIVATE "${DOC_DATA_SOURCE}" )
endif( ) endif()
# Link to godot-cpp target
set( LINK_TARGET "godot-cpp::${TARGET_ALIAS}" )
target_link_libraries( ${TARGET_NAME} PRIVATE ${LINK_TARGET} ) target_link_libraries( ${TARGET_NAME} PRIVATE ${LINK_TARGET} )
### Get useful properties of the library ### Get useful properties from godot-cpp target
get_target_property( GODOT_PLATFORM ${LINK_TARGET} GODOT_PLATFORM ) get_target_property( GODOT_SUFFIX ${LINK_TARGET} GODOT_SUFFIX )
get_target_property( GODOT_TARGET ${LINK_TARGET} GODOT_TARGET ) get_target_property( OSX_ARCH ${LINK_TARGET} OSX_ARCHITECTURES )
get_target_property( GODOT_ARCH ${LINK_TARGET} GODOT_ARCH )
set( OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/project/bin/" )
set( DEV_TAG "$<$<BOOL:${GODOT_DEV_BUILD}>:.dev>" )
set_target_properties( ${TARGET_NAME} set_target_properties( ${TARGET_NAME}
PROPERTIES PROPERTIES
@ -66,7 +65,7 @@ foreach( TARGET_ALIAS template_debug template_release editor )
PDB_OUTPUT_DIRECTORY "$<1:${OUTPUT_DIR}>" #MSVC Only, ignored on other platforms PDB_OUTPUT_DIRECTORY "$<1:${OUTPUT_DIR}>" #MSVC Only, ignored on other platforms
PREFIX "lib" PREFIX "lib"
OUTPUT_NAME "gdexample.${GODOT_PLATFORM}.${GODOT_TARGET}${DEV_TAG}.${GODOT_ARCH}" OUTPUT_NAME "gdexample${GODOT_SUFFIX}"
# Some IDE's respect this property to logically group targets # Some IDE's respect this property to logically group targets
FOLDER "godot-cpp" FOLDER "godot-cpp"
@ -74,21 +73,12 @@ foreach( TARGET_ALIAS template_debug template_release editor )
# CMAKE_SYSTEM_NAME refers to the target system # CMAKE_SYSTEM_NAME refers to the target system
if( CMAKE_SYSTEM_NAME STREQUAL Darwin ) if( CMAKE_SYSTEM_NAME STREQUAL Darwin )
get_target_property( OSX_ARCH ${LINK_TARGET} OSX_ARCHITECTURES )
set( OUTPUT_DIR "${OUTPUT_DIR}/libgdexample.macos.${TEST_TARGET}.framework")
set_target_properties( ${TARGET_NAME} set_target_properties( ${TARGET_NAME}
PROPERTIES PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "$<1:${OUTPUT_DIR}>"
RUNTIME_OUTPUT_DIRECTORY "$<1:${OUTPUT_DIR}>"
OUTPUT_NAME "gdexample.macos.${TARGET_ALIAS}${DEV_TAG}"
SUFFIX "" SUFFIX ""
OUTPUT_DIR "${OUTPUT_DIR}/libgdexample.macos.${TARGET_ALIAS}.framework"
#macos options
OSX_ARCHITECTURES "${OSX_ARCH}" OSX_ARCHITECTURES "${OSX_ARCH}"
) )
endif () endif()
endforeach() endforeach()