diff --git a/third_party/spirv-tools/CMakeLists.txt b/third_party/spirv-tools/CMakeLists.txt index 8c6fe41e1e..affc49ed8e 100644 --- a/third_party/spirv-tools/CMakeLists.txt +++ b/third_party/spirv-tools/CMakeLists.txt @@ -28,7 +28,15 @@ endif() set_property(GLOBAL PROPERTY USE_FOLDERS ON) -enable_testing() +set(SPIRV-Headers_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../spirv-headers) + +if (APPLE) + set(CMAKE_MACOSX_RPATH ON) +endif (APPLE) +set(SPIRV_SKIP_EXECUTABLES_OPTION ON) +set(SPIRV_SKIP_TESTS_OPTION ON) +set(SKIP_SPIRV_TOOLS_INSTALL ON) + set(SPIRV_TOOLS "SPIRV-Tools") include(GNUInstallDirs) @@ -67,7 +75,6 @@ if ("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE "Debug") endif() -option(SKIP_SPIRV_TOOLS_INSTALL "Skip installation" ${SKIP_SPIRV_TOOLS_INSTALL}) if(NOT ${SKIP_SPIRV_TOOLS_INSTALL}) set(ENABLE_SPIRV_TOOLS_INSTALL ON) endif() @@ -84,7 +91,7 @@ set(SPIRV_LIB_FUZZING_ENGINE_LINK_OPTIONS "" CACHE STRING "Used by OSS-Fuzz to c option(SPIRV_BUILD_LIBFUZZER_TARGETS "Build libFuzzer targets" OFF) -option(SPIRV_WERROR "Enable error on warning" ON) +set(SPIRV_WERROR OFF) if(("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") OR (("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") AND (NOT CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))) set(COMPILER_IS_LIKE_GNU TRUE) endif() @@ -351,8 +358,6 @@ endif() add_subdirectory(source) add_subdirectory(tools) -add_subdirectory(test) -add_subdirectory(examples) if(ENABLE_SPIRV_TOOLS_INSTALL) install( @@ -374,42 +379,3 @@ endif() set(SPIRV_LIBRARIES "-lSPIRV-Tools-opt -lSPIRV-Tools -lSPIRV-Tools-link") set(SPIRV_SHARED_LIBRARIES "-lSPIRV-Tools-shared") -# Build pkg-config file -# Use a first-class target so it's regenerated when relevant files are updated. -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc - COMMAND ${CMAKE_COMMAND} - -DCHANGES_FILE=${CMAKE_CURRENT_SOURCE_DIR}/CHANGES - -DTEMPLATE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools.pc.in - -DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DSPIRV_LIBRARIES=${SPIRV_LIBRARIES} - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake - DEPENDS "CHANGES" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools.pc.in" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake") -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc - COMMAND ${CMAKE_COMMAND} - -DCHANGES_FILE=${CMAKE_CURRENT_SOURCE_DIR}/CHANGES - -DTEMPLATE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools-shared.pc.in - -DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc - -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} - -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR} - -DSPIRV_SHARED_LIBRARIES=${SPIRV_SHARED_LIBRARIES} - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake - DEPENDS "CHANGES" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools-shared.pc.in" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake") -add_custom_target(spirv-tools-pkg-config - ALL - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc) - -# Install pkg-config file -if (ENABLE_SPIRV_TOOLS_INSTALL) - install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc - ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc - DESTINATION - ${CMAKE_INSTALL_LIBDIR}/pkgconfig) -endif() diff --git a/third_party/spirv-tools/source/CMakeLists.txt b/third_party/spirv-tools/source/CMakeLists.txt index fd2d963d86..20635ab598 100644 --- a/third_party/spirv-tools/source/CMakeLists.txt +++ b/third_party/spirv-tools/source/CMakeLists.txt @@ -338,16 +338,7 @@ endfunction() # Always build ${SPIRV_TOOLS}-shared. This is expected distro packages, and # unlike the other SPIRV_TOOLS target, defaults to hidden symbol visibility. -add_library(${SPIRV_TOOLS}-shared SHARED ${SPIRV_SOURCES}) -if (SPIRV_TOOLS_USE_MIMALLOC) - target_link_libraries(${SPIRV_TOOLS}-shared PRIVATE mimalloc-static) -endif() -spirv_tools_default_target_options(${SPIRV_TOOLS}-shared) -set_target_properties(${SPIRV_TOOLS}-shared PROPERTIES CXX_VISIBILITY_PRESET hidden) -target_compile_definitions(${SPIRV_TOOLS}-shared - PRIVATE SPIRV_TOOLS_IMPLEMENTATION - PUBLIC SPIRV_TOOLS_SHAREDLIB -) + if(SPIRV_TOOLS_BUILD_STATIC) add_library(${SPIRV_TOOLS}-static STATIC ${SPIRV_SOURCES}) @@ -363,14 +354,14 @@ if(SPIRV_TOOLS_BUILD_STATIC) add_library(${SPIRV_TOOLS} ALIAS ${SPIRV_TOOLS}-static) endif() - set(SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS}-static ${SPIRV_TOOLS}-shared) + set(SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS}-static) else() add_library(${SPIRV_TOOLS} ${SPIRV_TOOLS_LIBRARY_TYPE} ${SPIRV_SOURCES}) if (SPIRV_TOOLS_USE_MIMALLOC) target_link_libraries(${SPIRV_TOOLS} PRIVATE mimalloc-static) endif() spirv_tools_default_target_options(${SPIRV_TOOLS}) - set(SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS} ${SPIRV_TOOLS}-shared) + set(SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS}) endif() if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") diff --git a/third_party/spirv-tools/tnt/filament_changes.py b/third_party/spirv-tools/tnt/filament_changes.py new file mode 100644 index 0000000000..e7a0c301d2 --- /dev/null +++ b/third_party/spirv-tools/tnt/filament_changes.py @@ -0,0 +1,69 @@ +import re +import sys +import os + +def process_file(filepath, replacements): + """Reads a file, applies a series of regex replacements, and writes it back.""" + try: + # Create a backup before modifying + backup_path = filepath + '.bak' + with open(filepath, 'r') as f_in, open(backup_path, 'w') as f_out: + content = f_in.read() + f_out.write(content) + except FileNotFoundError: + print(f"Error: File not found at {filepath}", file=sys.stderr) + sys.exit(1) + + # Apply all replacements + for pattern, replacement in replacements: + content = re.sub(pattern, replacement, content, flags=re.MULTILINE) + + # Write the modified content back to the original file + with open(filepath, 'w') as f: + f.write(content) + +def main(): + """Main function to define and process all file changes.""" + # Make the script location-aware. It's in third_party/spirv-tools/tnt. + # The files to patch are in third_party/spirv-tools. + script_dir = os.path.dirname(os.path.abspath(__file__)) + spirv_tools_dir = os.path.abspath(os.path.join(script_dir, '..')) + + # Define replacements for third_party/spirv-tools/CMakeLists.txt + spirv_tools_cmakelist = os.path.join(spirv_tools_dir, "CMakeLists.txt") + spirv_tools_replacements = [ + (r"^(set_property\(GLOBAL PROPERTY USE_FOLDERS ON\))", + r"\1\n\n" + r"set(SPIRV-Headers_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../spirv-headers)\n\n" + r"if (APPLE)\n" + r" set(CMAKE_MACOSX_RPATH ON)\n" + r"endif (APPLE)\n" + r"set(SPIRV_SKIP_EXECUTABLES_OPTION ON)\n" + r"set(SPIRV_SKIP_TESTS_OPTION ON)\n" + r"set(SKIP_SPIRV_TOOLS_INSTALL ON)"), + (r"enable_testing\(\)\n", ""), + (r'option\(SKIP_SPIRV_TOOLS_INSTALL "Skip installation" \$\{SKIP_SPIRV_TOOLS_INSTALL\}\)\n', ""), + (r'option\(SPIRV_WERROR "Enable error on warning" ON\)', + r"set(SPIRV_WERROR OFF)"), + (r"add_subdirectory\(test\)\n", ""), + (r"add_subdirectory\(examples\)\n", ""), + (r"^# Build pkg-config file[\s\S]*?^endif\(\)\n", ""), + ] + process_file(spirv_tools_cmakelist, spirv_tools_replacements) + + # Define replacements for third_party/spirv-tools/source/CMakeLists.txt + spirv_source_cmakelist = os.path.join(spirv_tools_dir, "source", "CMakeLists.txt") + spirv_source_replacements = [ + (r"^add_library\(\$\{SPIRV_TOOLS\}\-shared[\s\S]*?^\)", ""), + (r"set\(SPIRV_TOOLS_TARGETS \$\{SPIRV_TOOLS\}-static \$\{SPIRV_TOOLS\}\-shared\)", + r"set(SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS}-static)"), + (r"set\(SPIRV_TOOLS_TARGETS \$\{SPIRV_TOOLS\} \$\{SPIRV_TOOLS\}\-shared\)", + r"set(SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS})"), + ] + process_file(spirv_source_cmakelist, spirv_source_replacements) + + print("Changes applied successfully using the corrected Python script.") + print("Backup files with .bak extension have been created.") + +if __name__ == "__main__": + main() diff --git a/third_party/spirv-tools/tnt/update_spirv-tools.sh b/third_party/spirv-tools/tnt/update_spirv-tools.sh index abea78ce5a..7dcdfea15d 100755 --- a/third_party/spirv-tools/tnt/update_spirv-tools.sh +++ b/third_party/spirv-tools/tnt/update_spirv-tools.sh @@ -91,6 +91,9 @@ mv "${EXTRACTED_DIR}" spirv-tools_new rsync -a --delete --exclude=tnt/ spirv-tools_new/ spirv-tools/ +echo "Applying Filament-specific patches..." +python3 "${SCRIPT_DIR}/filament_changes.py" + echo "Cleaning up..." rm -rf "${ZIP_FILE_NAME}" spirv-tools_new "${TEMP_DIR}"