diff options
| author | Juan Ramos <juan@lunarg.com> | 2023-09-22 11:43:06 -0600 |
|---|---|---|
| committer | Juan Ramos <114601453+juan-lunarg@users.noreply.github.com> | 2023-09-22 12:43:49 -0600 |
| commit | 9616098f617c4a53ecb72a1456bb229989e2d0e4 (patch) | |
| tree | b3d64fe1b07b2486cc4ed41867bfebe61fef10b4 /icd | |
| parent | 6944374dff6d0f9aa9735ca38811ffa6437d955f (diff) | |
| download | usermoji-9616098f617c4a53ecb72a1456bb229989e2d0e4.tar.xz | |
cmake: Fix ICD json logic
closes #861
Diffstat (limited to 'icd')
| -rw-r--r-- | icd/CMakeLists.txt | 200 | ||||
| -rw-r--r-- | icd/VkICD_mock_icd.json.in (renamed from icd/macos/VkICD_mock_icd.json) | 3 | ||||
| -rw-r--r-- | icd/linux/VkICD_mock_icd.json | 12 | ||||
| -rw-r--r-- | icd/windows/VkICD_mock_icd.json | 12 |
4 files changed, 93 insertions, 134 deletions
diff --git a/icd/CMakeLists.txt b/icd/CMakeLists.txt index 3311f572..f36849de 100644 --- a/icd/CMakeLists.txt +++ b/icd/CMakeLists.txt @@ -16,6 +16,10 @@ # limitations under the License. # ~~~ +if (ANDROID) + return() +endif() + # These variables enable downstream users to customize the CMake targets # based on the target API variant (e.g. Vulkan SC) set(MOCK_ICD_NAME VkICD_mock_icd) @@ -23,8 +27,6 @@ set(GENERATED generated) if(WIN32) add_definitions(-DVK_USE_PLATFORM_WIN32_KHR -DVK_USE_PLATFORM_WIN32_KHX -DWIN32_LEAN_AND_MEAN) -elseif(ANDROID) - add_definitions(-DVK_USE_PLATFORM_ANDROID_KHR -DVK_USE_PLATFORM_ANDROID_KHX) elseif(APPLE) add_definitions(-DVK_USE_PLATFORM_MACOS_MVK) elseif(UNIX AND NOT APPLE) # i.e. Linux @@ -43,128 +45,110 @@ else() message(FATAL_ERROR "Unsupported Platform!") endif() -# Copy or link the JSON files to the binary directory for ease of use in the build tree. -if(WIN32) - # extra setup for out-of-tree builds - if(NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) - if(CMAKE_GENERATOR MATCHES "^Visual Studio.*") - file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/windows/${MOCK_ICD_NAME}.json src_json) - file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${MOCK_ICD_NAME}.json dst_json) - add_custom_target(VkICD_mock_icd-json ALL COMMAND copy ${src_json} ${dst_json} VERBATIM) - set_target_properties(VkICD_mock_icd-json PROPERTIES FOLDER ${TOOLS_HELPER_FOLDER}) - else() - file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/windows/${MOCK_ICD_NAME}.json src_json) - file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${MOCK_ICD_NAME}.json dst_json) - add_custom_target(VkICD_mock_icd-json ALL COMMAND copy ${src_json} ${dst_json} VERBATIM) - endif() - endif() -elseif(APPLE) - # extra setup for out-of-tree builds - if(NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) - if(CMAKE_GENERATOR MATCHES "^Xcode.*") - add_custom_target(mk_icd_config_dir ALL - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>) - add_custom_target(VkICD_mock_icd-json ALL - DEPENDS mk_icd_config_dir - COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/macos/${MOCK_ICD_NAME}.json - $<CONFIG> ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${MOCK_ICD_NAME}.json - VERBATIM) - else() - add_custom_target(VkICD_mock_icd-json ALL - COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/macos/${MOCK_ICD_NAME}.json - ${MOCK_ICD_NAME}.json - VERBATIM) - endif() +add_custom_target(generate_icd_files + DEPENDS mock_icd.cpp ${GENERATED}/function_definitions.h ${GENERATED}/function_declarations.h +) +set_target_properties( + generate_icd_files PROPERTIES FOLDER ${TOOLS_HELPER_FOLDER} +) + +add_library(VkICD_mock_icd MODULE) +target_sources(VkICD_mock_icd PRIVATE mock_icd.cpp) +target_link_libraries(VkICD_mock_icd PRIVATE Vulkan::Headers) + +target_include_directories(VkICD_mock_icd PRIVATE + ${GENERATED} + . +) +if(BUILD_WSI_WAYLAND_SUPPORT) + target_include_directories(VkICD_mock_icd PRIVATE ${WAYLAND_CLIENT_INCLUDE_DIR}) +endif() + +if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU|Clang") + target_compile_options(VkICD_mock_icd PRIVATE + -Wpointer-arith + -Wno-unused-function + -Wno-sign-compare + ) + + if (ENABLE_ADDRESS_SANITIZER) + target_compile_options(VkICD_mock_icd PUBLIC -fsanitize=address) + target_link_options(VkICD_mock_icd PUBLIC -fsanitize=address) endif() +endif() + +if(MSVC) + target_compile_options(VkICD_mock_icd PRIVATE /bigobj) + target_compile_definitions(VkICD_mock_icd PRIVATE _CRT_SECURE_NO_WARNINGS) + target_link_options(VkICD_mock_icd PRIVATE /DEF:${CMAKE_CURRENT_SOURCE_DIR}/${MOCK_ICD_NAME}.def) +elseif(MINGW) + target_sources(VkICD_mock_icd PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${MOCK_ICD_NAME}.def) else() - # extra setup for out-of-tree builds - if(NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) - add_custom_target(VkICD_mock_icd-json ALL - COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/linux/${MOCK_ICD_NAME}.json - ${MOCK_ICD_NAME}.json - VERBATIM) + if(APPLE) + set_target_properties(VkICD_mock_icd PROPERTIES SUFFIX ".dylib") endif() + message(DEBUG "Mock ICD Functions are exported via EXPORT") endif() -# For ICD with a direct dependency on a project with the same name, use it. -if(NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) - add_dependencies(VkICD_mock_icd-json VkICD_mock_icd) +set_target_properties(VkICD_mock_icd PROPERTIES OUTPUT_NAME ${MOCK_ICD_NAME}) + +# Installing the Mock ICD to system directories is probably not desired since this ICD is not a very complete implementation. +# Require the user to ask that it be installed if they really want it. +option(INSTALL_ICD "Install icd") +if (INSTALL_ICD) + message(STATUS "Installing Mock ICD") endif() -add_custom_target(generate_icd_files DEPENDS mock_icd.cpp ${GENERATED}/function_definitions.h ${GENERATED}/function_declarations.h) -set_target_properties(generate_icd_files PROPERTIES FOLDER ${TOOLS_HELPER_FOLDER}) - -include_directories(${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/${GENERATED} - ${CMAKE_CURRENT_BINARY_DIR} - ${PROJECT_BINARY_DIR} - ${CMAKE_BINARY_DIR}) -if(BUILD_WSI_WAYLAND_SUPPORT) - include_directories(${WAYLAND_CLIENT_INCLUDE_DIR}) + +# There are 2 primary deliverables for the mock driver. +# - The actual library (lib)VkICD_mock_icd.(dll|so|dylib) +# - The respective json file, VkICD_mock_icd.json +# This code generates the appropriate json for both local testing and the installation. +# NOTE: For WIN32 the JSON and dll MUST be placed in the same location, due to Win32 using a relative path for installation. +set(INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${MOCK_ICD_NAME}.json.in") +set(INTERMEDIATE_FILE "${CMAKE_CURRENT_BINARY_DIR}/json/mock_icd.json") +set(OUTPUT_FILE_FINAL_NAME "${MOCK_ICD_NAME}.json") +set(LAYER_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}) +if (WIN32) + set(LAYER_INSTALL_DIR ${CMAKE_INSTALL_BINDIR}) # WIN32/MINGW expect the dll in the `bin` dir, this matches our WIN32 SDK process endif() -if(WIN32) - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D_CRT_SECURE_NO_WARNINGS") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D_CRT_SECURE_NO_WARNINGS") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -D_CRT_SECURE_NO_WARNINGS") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_CRT_SECURE_NO_WARNINGS") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_CRT_SECURE_NO_WARNINGS /bigobj") - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_CRT_SECURE_NO_WARNINGS /bigobj") - # Turn off transitional "changed behavior" warning message for Visual Studio versions prior to 2015. The changed behavior is - # that constructor initializers are now fixed to clear the struct members. - add_compile_options("$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,19>>:/wd4351>") +if (WIN32) + set(JSON_LIBRARY_PATH ".\\\\${MOCK_ICD_NAME}.dll") +elseif(APPLE) + set(JSON_LIBRARY_PATH "./lib${MOCK_ICD_NAME}.dylib") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpointer-arith -Wno-unused-function -Wno-sign-compare") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith -Wno-unused-function -Wno-sign-compare") + set(JSON_LIBRARY_PATH "./lib${MOCK_ICD_NAME}.so") endif() +configure_file(${INPUT_FILE} ${INTERMEDIATE_FILE} @ONLY) -if(WIN32) - file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${MOCK_ICD_NAME}.def DEF_FILE) - add_custom_target(copy-mock_icd-def-file ALL - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DEF_FILE} ${MOCK_ICD_NAME}.def - VERBATIM) - set_target_properties(copy-mock_icd-def-file PROPERTIES FOLDER ${TOOLS_HELPER_FOLDER}) - add_library(VkICD_mock_icd SHARED mock_icd.cpp ${MOCK_ICD_NAME}.def) - target_link_libraries(VkICD_mock_icd PRIVATE Vulkan::Headers) - if(INSTALL_ICD) - install(TARGETS VkICD_mock_icd DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() -elseif(APPLE) - add_library(VkICD_mock_icd SHARED mock_icd.cpp ) - target_link_libraries(VkICD_mock_icd PRIVATE Vulkan::Headers) - set_target_properties(VkICD_mock_icd PROPERTIES LINK_FLAGS "-Wl") - if(INSTALL_ICD) - install(TARGETS VkICD_mock_icd DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +# To support both multi/single configuration generators just copy the json to the correct directory +add_custom_command(TARGET VkICD_mock_icd POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${INTERMEDIATE_FILE} $<TARGET_FILE_DIR:VkICD_mock_icd>/${OUTPUT_FILE_FINAL_NAME} +) + +# For UNIX-based systems, `library_path` should not contain a relative path (indicated by "./") before installing to system directories +# This json isn't used for regular local development, it's used for installation +if (UNIX) + set(UNIX_INTERMEDIATE_FILE "${CMAKE_CURRENT_BINARY_DIR}/json/unix_install_mock_icd.json") + + if(APPLE) + set(JSON_LIBRARY_PATH "lib${MOCK_ICD_NAME}.dylib") + else() + set(JSON_LIBRARY_PATH "lib${MOCK_ICD_NAME}.so") endif() -else() - add_library(VkICD_mock_icd SHARED mock_icd.cpp ) - target_link_libraries(VkICD_mock_icd PRIVATE Vulkan::Headers) - set_target_properties(VkICD_mock_icd PROPERTIES LINK_FLAGS "-Wl,-export-dynamic,-Bsymbolic,--exclude-libs,ALL") - if((UNIX AND NOT APPLE) AND INSTALL_ICD) # i.e. Linux - install(TARGETS VkICD_mock_icd DESTINATION ${CMAKE_INSTALL_LIBDIR}) + + configure_file(${INPUT_FILE} ${UNIX_INTERMEDIATE_FILE} @ONLY) + + if (INSTALL_ICD) + install(FILES ${UNIX_INTERMEDIATE_FILE} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/vulkan/icd.d RENAME ${OUTPUT_FILE_FINAL_NAME}) endif() - if (ENABLE_ADDRESS_SANITIZER) - target_compile_options(VkICD_mock_icd PUBLIC -fsanitize=address) - target_link_options(VkICD_mock_icd PUBLIC -fsanitize=address) - endif () endif() -set_target_properties(VkICD_mock_icd PROPERTIES OUTPUT_NAME ${MOCK_ICD_NAME}) - -# JSON file(s) install targets. For Linux, need to remove the "./" from the library path before installing to system directories. -if((UNIX AND NOT APPLE) AND INSTALL_ICD) # i.e. Linux - add_custom_target(VkICD_mock_icd-staging-json ALL - COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/staging-json - COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/linux/${MOCK_ICD_NAME}.json ${CMAKE_CURRENT_BINARY_DIR}/staging-json - COMMAND sed -i -e "/\"library_path\":/s$./libVkICD$libVkICD$" - ${CMAKE_CURRENT_BINARY_DIR}/staging-json/${MOCK_ICD_NAME}.json - VERBATIM - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/linux/${MOCK_ICD_NAME}.json) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/staging-json/${MOCK_ICD_NAME}.json - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${API_TYPE}/icd.d) +if (WIN32 AND INSTALL_ICD) + install(FILES ${INTERMEDIATE_FILE} DESTINATION ${LAYER_INSTALL_DIR} RENAME ${OUTPUT_FILE_FINAL_NAME}) endif() -# Windows uses the JSON file as-is. -if(WIN32 AND INSTALL_ICD) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/windows/${MOCK_ICD_NAME}.json DESTINATION ${CMAKE_INSTALL_BINDIR}) +if (INSTALL_ICD) + install(TARGETS VkICD_mock_icd DESTINATION ${LAYER_INSTALL_DIR}) endif() diff --git a/icd/macos/VkICD_mock_icd.json b/icd/VkICD_mock_icd.json.in index 71019868..f550bb27 100644 --- a/icd/macos/VkICD_mock_icd.json +++ b/icd/VkICD_mock_icd.json.in @@ -1,8 +1,7 @@ { "file_format_version" : "1.0.1", "ICD": { - "library_path": "./libVkICD_mock_icd.dylib", + "library_path": "@JSON_LIBRARY_PATH@", "api_version": "1.1.97" } } - diff --git a/icd/linux/VkICD_mock_icd.json b/icd/linux/VkICD_mock_icd.json deleted file mode 100644 index bf32f8e6..00000000 --- a/icd/linux/VkICD_mock_icd.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "file_format_version" : "1.0.1", - "ICD": { - "library_path": "./libVkICD_mock_icd.so", - "api_version": "1.1.97" - } -} - - - - - diff --git a/icd/windows/VkICD_mock_icd.json b/icd/windows/VkICD_mock_icd.json deleted file mode 100644 index d192f5c2..00000000 --- a/icd/windows/VkICD_mock_icd.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "file_format_version" : "1.0.1", - "ICD": { - "library_path": ".\\VkICD_mock_icd.dll", - "api_version": "1.1.97" - } -} - - - - - |
