diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2024-10-11 21:06:23 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-11 21:06:23 +0800 |
| commit | e91e1d4d54a14d985626318e5cf46635bfa4006d (patch) | |
| tree | 18e5d045235b743429821c249b5611b70c8cd02d /source/slang/CMakeLists.txt | |
| parent | dfab34e4bf508fc517d4d645ebb3b6b1179a5003 (diff) | |
Restrict stdlib embed macros to single source file (#5251)
* Restrict stdlib embed macros to single source file
* Build slang-without-embedded-stdlib with the same target type as libslang
To avoid building everything twice
Diffstat (limited to 'source/slang/CMakeLists.txt')
| -rw-r--r-- | source/slang/CMakeLists.txt | 188 |
1 files changed, 76 insertions, 112 deletions
diff --git a/source/slang/CMakeLists.txt b/source/slang/CMakeLists.txt index 78d2376a7..27600e3f8 100644 --- a/source/slang/CMakeLists.txt +++ b/source/slang/CMakeLists.txt @@ -1,50 +1,3 @@ -# -# Compiling the meta.slang files -# - -# List of *.meta.slang headers -glob_append(SLANG_STDLIB_META_SOURCE "*.meta.slang") - -set(SLANG_STDLIB_META_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/stdlib-meta") - -# Generate the output file list -set(SLANG_STDLIB_META_GENERATED_HEADERS) -foreach(meta_source ${SLANG_STDLIB_META_SOURCE}) - file( - RELATIVE_PATH - meta_source_relative - ${CMAKE_CURRENT_LIST_DIR} - ${meta_source} - ) - list( - APPEND - SLANG_STDLIB_META_GENERATED_HEADERS - "${SLANG_STDLIB_META_OUTPUT_DIR}/${meta_source_relative}.h" - ) -endforeach() - -add_custom_command( - OUTPUT ${SLANG_STDLIB_META_GENERATED_HEADERS} - COMMAND ${CMAKE_COMMAND} -E make_directory ${SLANG_STDLIB_META_OUTPUT_DIR} - COMMAND - slang-generate ${SLANG_STDLIB_META_SOURCE} --target-directory - ${SLANG_STDLIB_META_OUTPUT_DIR} - DEPENDS ${SLANG_STDLIB_META_SOURCE} slang-generate - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - VERBATIM -) - -add_library( - slang-meta-headers - INTERFACE - EXCLUDE_FROM_ALL - ${SLANG_STDLIB_META_GENERATED_HEADERS} -) -set_target_properties(slang-meta-headers PROPERTIES FOLDER generated) -target_include_directories( - slang-meta-headers - INTERFACE ${SLANG_STDLIB_META_OUTPUT_DIR} -) # # generate capability files @@ -211,33 +164,6 @@ slang_add_target( ) # -# Generate an embeddable stdlib -# - -set(SLANG_STDLIB_GENERATED_HEADER - ${CMAKE_CURRENT_BINARY_DIR}/slang-stdlib-generated.h -) -add_custom_command( - OUTPUT ${SLANG_STDLIB_GENERATED_HEADER} - COMMAND - slang-bootstrap -archive-type riff-lz4 -save-stdlib-bin-source - ${SLANG_STDLIB_GENERATED_HEADER} - DEPENDS slang-bootstrap - VERBATIM -) -add_library( - slang-stdlib-embed-headers - INTERFACE - EXCLUDE_FROM_ALL - ${SLANG_STDLIB_GENERATED_HEADER} -) -set_target_properties(slang-stdlib-embed-headers PROPERTIES FOLDER generated) -target_include_directories( - slang-stdlib-embed-headers - INTERFACE ${CMAKE_CURRENT_BINARY_DIR} -) - -# # Generate the version header # @@ -247,60 +173,98 @@ configure_file(${slang_SOURCE_DIR}/slang-tag-version.h.in slang-version-header/s # Slang itself # -set(slang_common_args - EXTRA_SOURCE_DIRS ${SLANG_RECORD_REPLAY_SYSTEM} +set(slang_build_args USE_EXTRA_WARNINGS + EXTRA_COMPILE_OPTIONS_PRIVATE + # a warning is disabled for a memset boundary check. + # everything looked fine and it is unclear why the checking fails + $<$<CXX_COMPILER_ID:GNU>:-Wno-error=stringop-overflow> + # slang.h is in the project root, so include that directory in the interface + # for slang + INCLUDE_DIRECTORIES_PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/slang-version-header + EXPORT_MACRO_PREFIX SLANG + EXPORT_TYPE_AS ${SLANG_LIB_TYPE} + EXTRA_SOURCE_DIRS ${SLANG_RECORD_REPLAY_SYSTEM} +) +set(slang_link_args LINK_WITH_PRIVATE core + prelude compiler-core slang-capability-defs slang-capability-lookup slang-reflect-headers slang-lookup-tables SPIRV-Headers - EXTRA_COMPILE_OPTIONS_PRIVATE - # a warning is disabled for a memset boundary check. - # everything looked fine and it is unclear why the checking fails - $<$<CXX_COMPILER_ID:GNU>:-Wno-error=stringop-overflow> - # slang.h is in the project root, so include that directory in the interface - # for slang +) +set(slang_interface_args INCLUDE_DIRECTORIES_PUBLIC ${slang_SOURCE_DIR} - INCLUDE_DIRECTORIES_PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/slang-version-header - EXPORT_MACRO_PREFIX SLANG +) +set(slang_public_lib_args + PUBLIC_HEADERS + ${slang_SOURCE_DIR}/slang*.h + ${CMAKE_CURRENT_BINARY_DIR}/slang-version-header/*.h + LINK_WITH_PRIVATE + $<IF:$<BOOL:${SLANG_EMBED_STDLIB}>,slang-embedded-stdlib,slang-no-embedded-stdlib> + $<IF:$<BOOL:${SLANG_EMBED_STDLIB_SOURCE}>,slang-embedded-stdlib-source,slang-no-embedded-stdlib-source> + INSTALL ) # # Minimal static slang used in generating the embedded stdlib # -slang_add_target( - . - OBJECT - ${slang_common_args} - TARGET_NAME slang-no-embedded-stdlib - EXCLUDE_FROM_ALL - LINK_WITH_PRIVATE slang-meta-headers - EXTRA_COMPILE_DEFINITIONS_PUBLIC SLANG_STATIC - EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_WITHOUT_EMBEDDED_STD_LIB - FOLDER generators -) - # -# Slang with whatever options +# Slang itself # -slang_add_target( - . - ${SLANG_LIB_TYPE} - ${slang_common_args} - LINK_WITH_PRIVATE - prelude - $<$<BOOL:${SLANG_EMBED_STDLIB}>:slang-stdlib-embed-headers> - $<$<BOOL:${SLANG_EMBED_STDLIB_SOURCE}>:slang-meta-headers> - EXTRA_COMPILE_DEFINITIONS_PRIVATE - $<$<NOT:$<BOOL:${SLANG_EMBED_STDLIB}>>:SLANG_WITHOUT_EMBEDDED_STD_LIB> - $<$<NOT:$<BOOL:${SLANG_EMBED_STDLIB_SOURCE}>>:SLANG_DISABLE_STDLIB_SOURCE> - EXPORT_MACRO_PREFIX SLANG - INSTALL - PUBLIC_HEADERS ${slang_SOURCE_DIR}/slang*.h ${CMAKE_CURRENT_BINARY_DIR}/slang-version-header/*.h -) +if(NOT SLANG_EMBED_STDLIB) + # If we're not embedding stdlib we can just do a normal build of slang, + # including all the options, this can also serve as our no embedded stdlib + # library for slang-bootstrap (not that we need that anyway) + slang_add_target( + . + ${SLANG_LIB_TYPE} + ${slang_build_args} + ${slang_link_args} + ${slang_interface_args} + ${slang_public_lib_args} + ) + add_library(slang-without-embedded-stdlib ALIAS slang) +else() + # However if we're embedding stdlib, we need to make two different + # libraries, one with the embedded stdlib and one without, so first define + # the shared objects as one target so we don't build them twice. + slang_add_target( + . + OBJECT + ${slang_build_args} + ${slang_link_args} + TARGET_NAME slang-common-objects + EXCLUDE_FROM_ALL + ) + slang_add_target( + . + ${SLANG_LIB_TYPE} + ${slang_link_args} + ${slang_interface_args} + NO_SOURCE + TARGET_NAME + slang-without-embedded-stdlib + EXCLUDE_FROM_ALL + LINK_WITH_PRIVATE + slang-common-objects + slang-no-embedded-stdlib + slang-embedded-stdlib-source + ) + slang_add_target( + . + ${SLANG_LIB_TYPE} + ${slang_link_args} + ${slang_interface_args} + ${slang_public_lib_args} + LINK_WITH_PRIVATE + slang-common-objects + NO_SOURCE + ) +endif() |
