Home | History | Annotate | Download | only in layers
      1 cmake_minimum_required (VERSION 2.8.11)
      2 
      3 macro(run_vk_helper subcmd)
      4     add_custom_command(OUTPUT ${ARGN}
      5         COMMAND ${PYTHON_CMD} ${PROJECT_SOURCE_DIR}/vk_helper.py --${subcmd} ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan.h --abs_out_dir ${CMAKE_CURRENT_BINARY_DIR}
      6         DEPENDS ${PROJECT_SOURCE_DIR}/vk_helper.py ${PROJECT_SOURCE_DIR}/include/vulkan/vulkan.h
      7     )
      8 endmacro()
      9 
     10 macro(run_vk_layer_xml_generate dependency output)
     11     add_custom_command(OUTPUT ${output}
     12         COMMAND ${PYTHON_CMD} ${PROJECT_SOURCE_DIR}/lvl_genvk.py -registry ${PROJECT_SOURCE_DIR}/vk.xml ${output}
     13         DEPENDS ${PROJECT_SOURCE_DIR}/vk.xml ${PROJECT_SOURCE_DIR}/generator.py ${PROJECT_SOURCE_DIR}/${dependency} ${PROJECT_SOURCE_DIR}/lvl_genvk.py ${PROJECT_SOURCE_DIR}/reg.py
     14     )
     15 endmacro()
     16 
     17 set(LAYER_JSON_FILES
     18     VkLayer_core_validation
     19     VkLayer_image
     20     VkLayer_object_tracker
     21     VkLayer_unique_objects
     22     VkLayer_parameter_validation
     23     VkLayer_swapchain
     24     VkLayer_threading
     25     )
     26 
     27 if (WIN32)
     28     if (NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR))
     29         if (CMAKE_GENERATOR MATCHES "^Visual Studio.*")
     30             foreach (config_file ${LAYER_JSON_FILES})
     31                 FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/windows/${config_file}.json src_json)
     32                 FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/${config_file}.json dst_json)
     33                 add_custom_target(${config_file}-json ALL
     34                     COMMAND copy ${src_json} ${dst_json}
     35                     VERBATIM
     36                     )
     37                 add_dependencies(${config_file}-json ${config_file})
     38             endforeach(config_file)
     39         else()
     40             foreach (config_file ${LAYER_JSON_FILES})
     41                 FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/windows/${config_file}.json src_json)
     42                 FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${config_file}.json dst_json)
     43                 add_custom_target(${config_file}-json ALL
     44                     COMMAND copy ${src_json} ${dst_json}
     45                     VERBATIM
     46                     )
     47                 add_dependencies(${config_file}-json ${config_file})
     48             endforeach(config_file)
     49         endif()
     50     endif()
     51 else()
     52     # extra setup for out-of-tree builds
     53     if (NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR))
     54         foreach (config_file ${LAYER_JSON_FILES})
     55             add_custom_target(${config_file}-json ALL
     56                 COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/linux/${config_file}.json
     57                 VERBATIM
     58                 )
     59                 add_dependencies(${config_file}-json ${config_file})
     60         endforeach(config_file)
     61     endif()
     62 endif()
     63 
     64 # Add targets for JSON file install on Linux.
     65 # Need to remove the "./" from the library path before installing to /etc.
     66 if(UNIX)
     67     foreach (config_file ${LAYER_JSON_FILES})
     68         add_custom_target(${config_file}-staging-json ALL
     69             COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/staging-json
     70             COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/linux/${config_file}.json ${CMAKE_CURRENT_BINARY_DIR}/staging-json
     71             COMMAND sed -i -e "/\"library_path\":/s$./libVkLayer$libVkLayer$" ${CMAKE_CURRENT_BINARY_DIR}/staging-json/${config_file}.json
     72             VERBATIM
     73             DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/linux/${config_file}.json
     74             )
     75         install(FILES ${CMAKE_CURRENT_BINARY_DIR}/staging-json/${config_file}.json DESTINATION /etc/vulkan/explicit_layer.d)
     76     endforeach(config_file)
     77 endif()
     78 
     79 if (WIN32)
     80     macro(add_vk_layer target)
     81     add_custom_command(OUTPUT VkLayer_${target}.def
     82         COMMAND ${PYTHON_CMD} ${PROJECT_SOURCE_DIR}/vk-generate.py ${DisplayServer} win-def-file VkLayer_${target} layer > VkLayer_${target}.def
     83         DEPENDS ${PROJECT_SOURCE_DIR}/vk-generate.py ${PROJECT_SOURCE_DIR}/vulkan.py
     84     )
     85     add_library(VkLayer_${target} SHARED ${ARGN} VkLayer_${target}.def)
     86     target_link_Libraries(VkLayer_${target} VkLayer_utils)
     87     add_dependencies(VkLayer_${target} generate_dispatch_table_helper generate_vk_layer_helpers generate_enum_string_helper VkLayer_utils)
     88     endmacro()
     89 else()
     90     macro(add_vk_layer target)
     91     add_library(VkLayer_${target} SHARED ${ARGN})
     92     target_link_Libraries(VkLayer_${target} VkLayer_utils)
     93     add_dependencies(VkLayer_${target} generate_dispatch_table_helper generate_vk_layer_helpers generate_enum_string_helper VkLayer_utils)
     94     set_target_properties(VkLayer_${target} PROPERTIES LINK_FLAGS "-Wl,-Bsymbolic,--exclude-libs,ALL")
     95     install(TARGETS VkLayer_${target} DESTINATION lib)
     96     endmacro()
     97 endif()
     98 
     99 include_directories(
    100     ${CMAKE_CURRENT_SOURCE_DIR}
    101     ${CMAKE_CURRENT_SOURCE_DIR}/../loader
    102     ${CMAKE_CURRENT_SOURCE_DIR}/../include/vulkan
    103     ${CMAKE_CURRENT_BINARY_DIR}
    104 )
    105 
    106 if (WIN32)
    107     set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D_CRT_SECURE_NO_WARNINGS")
    108     set (CMAKE_C_FLAGS_RELEASE   "${CMAKE_C_FLAGS_RELEASE} -D_CRT_SECURE_NO_WARNINGS")
    109     set (CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG} -D_CRT_SECURE_NO_WARNINGS /bigobj")
    110     set (CMAKE_C_FLAGS_DEBUG     "${CMAKE_C_FLAGS_DEBUG} -D_CRT_SECURE_NO_WARNINGS /bigobj")
    111 else()
    112     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpointer-arith -Wno-unused-function -Wno-sign-compare")
    113     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith -Wno-unused-function -Wno-sign-compare")
    114 endif()
    115 
    116 add_custom_command(OUTPUT vk_dispatch_table_helper.h
    117     COMMAND ${PYTHON_CMD} ${PROJECT_SOURCE_DIR}/vk-generate.py AllPlatforms dispatch-table-ops layer > vk_dispatch_table_helper.h
    118     DEPENDS ${PROJECT_SOURCE_DIR}/vk-generate.py ${PROJECT_SOURCE_DIR}/vulkan.py)
    119 
    120 run_vk_helper(gen_enum_string_helper vk_enum_string_helper.h)
    121 run_vk_helper(gen_struct_wrappers
    122     vk_struct_string_helper.h
    123     vk_struct_string_helper_cpp.h
    124     vk_struct_string_helper_no_addr.h
    125     vk_struct_string_helper_no_addr_cpp.h
    126     vk_struct_size_helper.h
    127     vk_struct_size_helper.c
    128     vk_struct_wrappers.h
    129     vk_struct_wrappers.cpp
    130     vk_safe_struct.h
    131 # Don't list vk_safe_struct.cpp as OUTPUT to avoid duplicate builds.
    132 # If listed here use of it for add_library will cause it to be created
    133 # independently of custom target generate_vk_layer_helpers .
    134 # That breaks parallel builds.
    135 #   vk_safe_struct.cpp
    136 )
    137 
    138 # Let gen_struct_wrappers really create vk_safe_struct.cpp
    139 add_custom_command(OUTPUT vk_safe_struct.cpp
    140     COMMAND echo defer making vk_safe_struct.cpp
    141 )
    142 
    143 set_source_files_properties(
    144     vk_struct_string_helper.h
    145     vk_struct_string_helper_cpp.h
    146     vk_struct_string_helper_no_addr.h
    147     vk_struct_string_helper_no_addr_cpp.h
    148     vk_struct_size_helper.h
    149     vk_struct_size_helper.c
    150     vk_struct_wrappers.h
    151     vk_struct_wrappers.cpp
    152     vk_safe_struct.h
    153     vk_safe_struct.cpp
    154     PROPERTIES GENERATED TRUE)
    155 
    156 add_custom_target(generate_enum_string_helper DEPENDS
    157     vk_enum_string_helper.h
    158 )
    159 
    160 add_custom_target(generate_dispatch_table_helper DEPENDS
    161     vk_dispatch_table_helper.h
    162 )
    163 
    164 add_custom_target(generate_vk_layer_helpers DEPENDS
    165     vk_struct_string_helper.h
    166     vk_struct_string_helper_no_addr.h
    167     vk_struct_string_helper_cpp.h
    168     vk_struct_string_helper_no_addr_cpp.h
    169     vk_struct_size_helper.h
    170     vk_struct_size_helper.c
    171     vk_struct_wrappers.h
    172     vk_struct_wrappers.cpp
    173     vk_safe_struct.h
    174     vk_safe_struct.cpp
    175 )
    176 
    177 run_vk_layer_xml_generate(threading_generator.py thread_check.h)
    178 run_vk_layer_xml_generate(parameter_validation_generator.py parameter_validation.h)
    179 run_vk_layer_xml_generate(unique_objects_generator.py unique_objects_wrappers.h)
    180 
    181 # Layer Utils Library
    182 # For Windows, we use a static lib because the Windows loader has a fairly restrictive loader search
    183 # path that can't be easily modified to point it to the same directory that contains the layers.
    184 if (WIN32)
    185     add_library(VkLayer_utils STATIC vk_layer_config.cpp vk_layer_extension_utils.cpp vk_layer_utils.cpp)
    186 else()
    187     add_library(VkLayer_utils SHARED vk_layer_config.cpp vk_layer_extension_utils.cpp vk_layer_utils.cpp)
    188     install(TARGETS VkLayer_utils DESTINATION lib)
    189 endif()
    190 
    191 add_vk_layer(core_validation core_validation.cpp vk_layer_table.cpp vk_safe_struct.cpp descriptor_sets.cpp)
    192 add_vk_layer(object_tracker object_tracker.cpp vk_layer_table.cpp)
    193 add_vk_layer(image image.cpp vk_layer_table.cpp)
    194 add_vk_layer(swapchain swapchain.cpp vk_layer_table.cpp)
    195 # generated
    196 add_vk_layer(threading threading.cpp thread_check.h vk_layer_table.cpp)
    197 add_vk_layer(unique_objects unique_objects.cpp unique_objects_wrappers.h vk_layer_table.cpp vk_safe_struct.cpp)
    198 add_vk_layer(parameter_validation parameter_validation.cpp parameter_validation.h vk_layer_table.cpp)
    199 
    200 # Core validation has additional dependencies
    201 target_include_directories(VkLayer_core_validation PRIVATE ${GLSLANG_SPIRV_INCLUDE_DIR})
    202 target_include_directories(VkLayer_core_validation PRIVATE ${SPIRV_TOOLS_INCLUDE_DIR})
    203 target_link_libraries(VkLayer_core_validation ${SPIRV_TOOLS_LIBRARIES})
    204