Home | History | Annotate | Download | only in loader
      1 include_directories(
      2     ${CMAKE_CURRENT_SOURCE_DIR}
      3     ${CMAKE_CURRENT_BINARY_DIR}
      4     ${PROJECT_BINARY_DIR}
      5     ${CMAKE_BINARY_DIR}
      6 )
      7 
      8 # Check for the existance of the secure_getenv or __secure_getenv commands
      9 include(CheckFunctionExists)
     10 CHECK_FUNCTION_EXISTS(secure_getenv HAVE_SECURE_GETENV)
     11 CHECK_FUNCTION_EXISTS(__secure_getenv HAVE___SECURE_GETENV)
     12 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/loader_cmake_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/loader_cmake_config.h)
     13 
     14 # Fetch header version from vulkan.h
     15 file(STRINGS "../include/vulkan/vulkan.h" lines REGEX "^#define VK_HEADER_VERSION [0-9]+")
     16 list(LENGTH lines len)
     17 if(${len} EQUAL 1)
     18     string(REGEX MATCHALL "[0-9]+" vk_header_version ${lines})
     19 else()
     20     MESSAGE(FATAL_ERROR "Unable to fetch version from vulkan.h")
     21 endif()
     22 
     23 if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
     24     add_definitions(-DVK_USE_PLATFORM_WIN32_KHR -DWIN32_LEAN_AND_MEAN)
     25     set(DisplayServer Win32)
     26     if (NOT MSVC_VERSION LESS 1900)
     27         # Enable control flow guard
     28         message(STATUS "Building loader with control flow guard")
     29         add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/guard:cf>")
     30         set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /guard:cf")
     31         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /guard:cf")
     32     endif()
     33 elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
     34     add_definitions(-DVK_USE_PLATFORM_ANDROID_KHR)
     35 elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
     36     if (BUILD_WSI_XCB_SUPPORT)
     37         add_definitions(-DVK_USE_PLATFORM_XCB_KHR)
     38     endif()
     39 
     40     if (BUILD_WSI_XLIB_SUPPORT)
     41        add_definitions(-DVK_USE_PLATFORM_XLIB_KHR -DVK_USE_PLATFORM_XLIB_XRANDR_EXT)
     42     endif()
     43 
     44     if (BUILD_WSI_WAYLAND_SUPPORT)
     45        add_definitions(-DVK_USE_PLATFORM_WAYLAND_KHR)
     46     endif()
     47 
     48     if (BUILD_WSI_MIR_SUPPORT)
     49         add_definitions(-DVK_USE_PLATFORM_MIR_KHR)
     50         include_directories(${MIR_INCLUDE_DIR})
     51     endif()
     52 else()
     53     message(FATAL_ERROR "Unsupported Platform!")
     54 endif()
     55 
     56 if (WIN32)
     57 	FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-${MAJOR}.def DEF_FILE)
     58 	FILE(READ ${DEF_FILE} DEF_TEXT)
     59 	STRING(REGEX REPLACE "vulkan-${MAJOR}.dll" "${API_LOWERCASE}-${MAJOR}.dll" DEF_EDITED "${DEF_TEXT}" )
     60 	FILE(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${API_LOWERCASE}-${MAJOR}.def" "${DEF_EDITED}")
     61 endif()
     62 
     63 # DEBUG enables runtime loader ICD verification
     64 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG")
     65 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
     66 
     67 set(NORMAL_LOADER_SRCS
     68     extension_manual.c
     69     loader.c
     70     loader.h
     71     vk_loader_platform.h
     72     vk_loader_layer.h
     73     trampoline.c
     74     wsi.c
     75     wsi.h
     76     debug_report.c
     77     debug_report.h
     78     gpa_helper.h
     79     ../libs/cjson/includes/cJSON.h
     80     ../libs/cjson/cJSON.c
     81     murmurhash.c
     82     murmurhash.h
     83 )
     84 
     85 set(OPT_LOADER_SRCS
     86     dev_ext_trampoline.c
     87     phys_dev_ext.c
     88 )
     89 
     90 # Check for assembler support
     91 set(ASM_FAILURE_MSG "The build will fall back on building with C code\n")
     92 set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG}Note that this may be unsafe, as the C code requires tail-call optimizations to remove")
     93 set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG} the stack frame for certain calls. If the compiler does not do this, then unknown device")
     94 set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG} extensions will suffer from a corrupted stack.")
     95 if (WIN32)
     96     enable_language(ASM_MASM)
     97     if (CMAKE_ASM_MASM_COMPILER_WORKS)
     98         if (NOT CMAKE_CL_64)
     99             set(CMAKE_ASM_MASM_FLAGS ${CMAKE_ASM_MASM_FLAGS} /safeseh)
    100         endif()
    101         set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain_masm.asm)
    102 
    103         add_executable(asm_offset asm_offset.c)
    104         add_dependencies(asm_offset generate_helper_files loader_gen_files)
    105         add_custom_command(OUTPUT gen_defines.asm DEPENDS asm_offset COMMAND asm_offset MASM)
    106         add_custom_target(loader_asm_gen_files DEPENDS gen_defines.asm)
    107         set_target_properties(loader_asm_gen_files PROPERTIES FOLDER ${LVL_TARGET_FOLDER})
    108     else()
    109         message(WARNING "Could not find working MASM assebler\n${ASM_FAILURE_MSG}")
    110         set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain.c)
    111         add_custom_target(loader_asm_gen_files)
    112     endif()
    113 else()
    114     enable_language(ASM-ATT)
    115     set(CMAKE_ASM-ATT_COMPILE_FLAGS "${CMAKE_ASM-ATT_COMPILE_FLAGS} $ENV{ASFLAGS}")
    116     set(CMAKE_ASM-ATT_COMPILE_FLAGS "${CMAKE_ASM-ATT_COMPILE_FLAGS} -I\"${CMAKE_CURRENT_BINARY_DIR}\"")
    117 
    118     file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/asm_test.asm ".intel_syntax noprefix\n.text\n.global sample\nsample:\nmov ecx, [eax + 16]\n")
    119     try_compile(ASSEMBLER_WORKS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/asm_test.asm)
    120     file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/asm_test.asm)
    121     if (ASSEMBLER_WORKS)
    122         set(CMAKE_ASM-ATT_FLAGS "$ENV{ASFLAGS} -I\"${CMAKE_CURRENT_BINARY_DIR}\"")
    123         set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain_gas.asm)
    124         add_executable(asm_offset asm_offset.c)
    125         add_dependencies(asm_offset generate_helper_files loader_gen_files)
    126         add_custom_command(OUTPUT gen_defines.asm DEPENDS asm_offset COMMAND asm_offset GAS)
    127         add_custom_target(loader_asm_gen_files DEPENDS gen_defines.asm)
    128     else()
    129         message(WARNING "Could not find working x86 GAS assembler\n${ASM_FAILURE_MSG}")
    130         set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain.c)
    131         add_custom_target(loader_asm_gen_files)
    132     endif()
    133 endif()
    134 
    135 run_vk_xml_generate(loader_extension_generator.py vk_loader_extensions.h)
    136 run_vk_xml_generate(loader_extension_generator.py vk_loader_extensions.c)
    137 add_custom_target(loader_gen_files DEPENDS
    138         vk_loader_extensions.h
    139         vk_loader_extensions.c
    140     )
    141 set_target_properties(loader_gen_files PROPERTIES FOLDER ${LVL_TARGET_FOLDER})
    142 
    143 if (WIN32)
    144     # Use static MSVCRT libraries
    145     foreach(configuration in CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO
    146                              CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO)
    147         if(${configuration} MATCHES "/MD")
    148             string(REGEX REPLACE "/MD" "/MT" ${configuration} "${${configuration}}")
    149         endif()
    150     endforeach()
    151 
    152     if (ENABLE_WIN10_ONECORE)
    153     # Note  When linking your app or driver to OneCore.lib, be sure to remove any links to non-umbrella libs (such as kernel32.lib). 
    154         set(CMAKE_CXX_STANDARD_LIBRARIES " ") # space is intentional
    155         set(CMAKE_C_STANDARD_LIBRARIES ${CMAKE_CXX_STANDARD_LIBRARIES})
    156     endif()
    157 
    158     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
    159     # Build dev_ext_trampoline.c with -O2 to allow tail-call optimization.
    160     # Build other C files with normal options
    161     # setup two Cmake targets (loader-norm and loader-opt) for the different compilation flags
    162     separate_arguments(LOCAL_C_FLAGS_DBG WINDOWS_COMMAND ${CMAKE_C_FLAGS_DEBUG})
    163     set(CMAKE_C_FLAGS_DEBUG " ")
    164     separate_arguments(LOCAL_C_FLAGS_REL WINDOWS_COMMAND ${CMAKE_C_FLAGS_RELEASE})
    165 
    166     add_library(loader-norm-dy OBJECT ${NORMAL_LOADER_SRCS} dirent_on_windows.c)
    167     add_dependencies(loader-norm-dy generate_helper_files loader_gen_files)
    168     target_compile_definitions(loader-norm-dy PUBLIC LOADER_DYNAMIC_LIB)
    169     target_compile_options(loader-norm-dy PUBLIC "$<$<CONFIG:DEBUG>:${LOCAL_C_FLAGS_DBG}>")
    170 
    171     add_library(loader-opt-dy OBJECT ${OPT_LOADER_SRCS})
    172     add_dependencies(loader-opt-dy generate_helper_files loader_gen_files loader_asm_gen_files)
    173     target_compile_definitions(loader-opt-dy PUBLIC LOADER_DYNAMIC_LIB)
    174     target_compile_options(loader-opt-dy PUBLIC "$<$<CONFIG:DEBUG>:${LOCAL_C_FLAGS_REL}>")
    175 
    176     add_library(loader-norm-st OBJECT ${NORMAL_LOADER_SRCS} dirent_on_windows.c)
    177     add_dependencies(loader-norm-st generate_helper_files loader_gen_files)
    178     target_compile_options(loader-norm-st PUBLIC "$<$<CONFIG:DEBUG>:${LOCAL_C_FLAGS_DBG}>")
    179 
    180     add_library(loader-opt-st OBJECT ${OPT_LOADER_SRCS})
    181     add_dependencies(loader-opt-st generate_helper_files loader_gen_files loader_asm_gen_files)
    182     target_compile_options(loader-opt-st PUBLIC "$<$<CONFIG:DEBUG>:${LOCAL_C_FLAGS_REL}>")
    183 
    184     add_library(${API_LOWERCASE}-${MAJOR} SHARED $<TARGET_OBJECTS:loader-opt-dy> $<TARGET_OBJECTS:loader-norm-dy> ${CMAKE_CURRENT_BINARY_DIR}/${API_LOWERCASE}-${MAJOR}.def ${CMAKE_CURRENT_SOURCE_DIR}/loader.rc)
    185     add_library(VKstatic.${MAJOR} STATIC $<TARGET_OBJECTS:loader-opt-st> $<TARGET_OBJECTS:loader-norm-st>)
    186     # Suppress conflicting libs warning for debug builds.
    187     set_target_properties(${API_LOWERCASE}-${MAJOR} PROPERTIES LINK_FLAGS_DEBUG /ignore:4098)
    188     set_target_properties(VKstatic.${MAJOR} PROPERTIES OUTPUT_NAME VKstatic.${MAJOR})
    189 
    190     if (ENABLE_WIN10_ONECORE)
    191         target_link_libraries(${API_LOWERCASE}-${MAJOR} OneCoreUAP.lib LIBCMT.LIB LIBCMTD.LIB LIBVCRUNTIME.LIB LIBUCRT.LIB)
    192         set_target_properties(${API_LOWERCASE}-${MAJOR} PROPERTIES LINK_FLAGS   "/NODEFAULTLIB")
    193     else()
    194         target_link_libraries(${API_LOWERCASE}-${MAJOR} Cfgmgr32)
    195     endif()
    196 
    197     add_dependencies(${API_LOWERCASE}-${MAJOR} generate_helper_files loader_gen_files loader_asm_gen_files)
    198 
    199     if (CMAKE_GENERATOR MATCHES "^Visual Studio.*")
    200         file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/${API_LOWERCASE}-${MAJOR}.dll COPY_SRC_PATH)
    201         file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../demos/$<CONFIGURATION>/ COPY_DST_PATH)
    202         file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../tests/$<CONFIGURATION>/ COPY_DST_TEST_PATH)
    203     else()
    204         file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${API_LOWERCASE}-${MAJOR}.dll COPY_SRC_PATH)
    205         file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../demos/ COPY_DST_PATH)
    206         file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../tests/ COPY_DST_TEST_PATH)
    207     endif()
    208     add_custom_command(TARGET ${API_LOWERCASE}-${MAJOR} POST_BUILD
    209       COMMAND xcopy /Y /I ${COPY_SRC_PATH} ${COPY_DST_PATH})
    210     add_custom_command(TARGET ${API_LOWERCASE}-${MAJOR} POST_BUILD
    211       COMMAND xcopy /Y /I ${COPY_SRC_PATH} ${COPY_DST_TEST_PATH})
    212 
    213 else()
    214     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
    215 
    216     # Clang (and not gcc) warns about redefining a typedef with the same types, so disable that warning.
    217     # Note that it will still throw an error if a typedef is redefined with a different type.
    218     if (CMAKE_C_COMPILER_ID MATCHES "Clang")
    219         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-typedef-redefinition")
    220     endif()
    221 
    222     add_library(${API_LOWERCASE} SHARED ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS})
    223     add_dependencies(${API_LOWERCASE} generate_helper_files loader_gen_files loader_asm_gen_files)
    224     target_compile_definitions(${API_LOWERCASE} PUBLIC -DLOADER_DYNAMIC_LIB)
    225     set_target_properties(${API_LOWERCASE} PROPERTIES SOVERSION "1" VERSION "1.0.${vk_header_version}")
    226     target_link_libraries(${API_LOWERCASE} -ldl -lpthread -lm)
    227 
    228     if(INSTALL_LVL_FILES)
    229         install(TARGETS ${API_LOWERCASE} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
    230     endif()
    231 
    232     # Generate pkg-config file.
    233     include(FindPkgConfig QUIET)
    234     if(PKG_CONFIG_FOUND)
    235         set(VK_API_VERSION "1.0.${vk_header_version}")
    236         foreach(LIB ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS})
    237             set(PRIVATE_LIBS "${PRIVATE_LIBS} -l${LIB}")
    238         endforeach()
    239         configure_file("vulkan.pc.in" "vulkan.pc" @ONLY)
    240         if(INSTALL_LVL_FILES)
    241             install(FILES       "${CMAKE_CURRENT_BINARY_DIR}/vulkan.pc"
    242                     DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
    243         endif()
    244     endif()
    245 endif()
    246