blob: 9c8173fa382ebcf1316679b694351168565ef60c [file] [log] [blame]
Jon Ashburnd38bfb12014-10-14 19:15:22 -06001include_directories(
Mark Young0f183a82017-02-28 09:58:04 -07002 ${CMAKE_CURRENT_SOURCE_DIR}
3 ${CMAKE_CURRENT_BINARY_DIR}
4 ${CMAKE_PROJECT_BINARY_DIR}
5 ${CMAKE_BINARY_DIR}
Jon Ashburnd38bfb12014-10-14 19:15:22 -06006)
Mark Young0f183a82017-02-28 09:58:04 -07007
Mark Youngba7ee022017-03-09 10:41:25 -07008# Check for the existance of the secure_getenv or __secure_getenv commands
9include(CheckFunctionExists)
10CHECK_FUNCTION_EXISTS(secure_getenv HAVE_SECURE_GETENV)
11CHECK_FUNCTION_EXISTS(__secure_getenv HAVE___SECURE_GETENV)
12CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/loader_cmake_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/loader_cmake_config.h)
13
Karl Schultzb4d31af2017-03-10 14:58:10 -070014# Fetch header version from vulkan.h
15file(STRINGS "../include/vulkan/vulkan.h" lines REGEX "^#define VK_HEADER_VERSION [0-9]+")
16list(LENGTH lines len)
17if(${len} EQUAL 1)
18 string(REGEX MATCHALL "[0-9]+" vk_header_version ${lines})
19else()
20 MESSAGE(FATAL_ERROR "Unable to fetch version from vulkan.h")
21endif()
22
Tony Barbour29cc9522016-12-07 11:18:19 -070023if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
24 add_definitions(-DVK_USE_PLATFORM_WIN32_KHR -DWIN32_LEAN_AND_MEAN)
25 set(DisplayServer Win32)
Mark Lobodzinskifaef4e72017-10-05 11:18:52 -060026 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()
Tony Barbour29cc9522016-12-07 11:18:19 -070033elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
34 add_definitions(-DVK_USE_PLATFORM_ANDROID_KHR)
35elseif(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)
Mark Young39389872017-01-19 21:10:49 -070041 add_definitions(-DVK_USE_PLATFORM_XLIB_KHR -DVK_USE_PLATFORM_XLIB_XRANDR_EXT)
Tony Barbour29cc9522016-12-07 11:18:19 -070042 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)
Tony Barbourc53c7272016-12-07 10:19:21 -070050 include_directories(${MIR_INCLUDE_DIR})
Tony Barbour29cc9522016-12-07 11:18:19 -070051 endif()
52else()
53 message(FATAL_ERROR "Unsupported Platform!")
54endif()
Chia-I Wu0c105342014-08-03 09:31:26 +080055
David Pinedo0c083652015-07-09 12:44:38 -060056if (WIN32)
Lenny Komow78413162016-12-23 14:12:18 -070057 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}")
David Pinedo0c083652015-07-09 12:44:38 -060061endif()
Tony Barbour1d825c72015-06-18 16:29:32 -060062
Courtney Goeltzenleuchter64ca9232015-02-10 18:40:14 -070063# DEBUG enables runtime loader ICD verification
64set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG")
65set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
Mark Lobodzinski391bb6d2015-01-09 15:12:03 -060066
Jon Ashburn761de4b2016-03-11 10:58:56 -070067set(NORMAL_LOADER_SRCS
Mark Youngd66edd52017-03-10 17:31:18 -070068 extension_manual.c
Jon Ashburn2077e382015-06-29 11:25:34 -060069 loader.c
70 loader.h
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060071 vk_loader_platform.h
Mark Lobodzinskib87f9022016-05-24 16:04:56 -060072 vk_loader_layer.h
Jon Ashburn2077e382015-06-29 11:25:34 -060073 trampoline.c
Ian Elliott954fa342015-10-30 15:28:23 -060074 wsi.c
75 wsi.h
Jon Ashburn2077e382015-06-29 11:25:34 -060076 debug_report.c
77 debug_report.h
Jon Ashburn2077e382015-06-29 11:25:34 -060078 gpa_helper.h
79 cJSON.c
80 cJSON.h
Jon Ashburnfc1031e2015-11-17 15:31:02 -070081 murmurhash.c
82 murmurhash.h
Jon Ashburn2077e382015-06-29 11:25:34 -060083)
Ian Elliott19628802015-02-04 12:06:46 -070084
Mark Young0f183a82017-02-28 09:58:04 -070085set(OPT_LOADER_SRCS
Jon Ashburn761de4b2016-03-11 10:58:56 -070086 dev_ext_trampoline.c
Mark Young39389872017-01-19 21:10:49 -070087 phys_dev_ext.c
Jon Ashburn761de4b2016-03-11 10:58:56 -070088)
89
Lenny Komow5ed93f22017-06-08 16:41:02 -060090# Check for assembler support
91set(ASM_FAILURE_MSG "The build will fall back on building with C code\n")
92set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG}Note that this may be unsafe, as the C code requires tail-call optimizations to remove")
93set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG} the stack frame for certain calls. If the compiler does not do this, then unknown device")
94set(ASM_FAILURE_MSG "${ASM_FAILURE_MSG} extensions will suffer from a corrupted stack.")
95if (WIN32)
96 enable_language(ASM_MASM)
97 if (CMAKE_ASM_MASM_COMPILER_WORKS)
Lenny Komowba800b82017-06-22 11:45:47 -060098 if (NOT CMAKE_CL_64)
99 set(CMAKE_ASM_MASM_FLAGS ${CMAKE_ASM_MASM_FLAGS} /safeseh)
100 endif()
Lenny Komowea568fe2017-07-03 14:48:38 -0600101 set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain_masm.asm)
Lenny Komow5ed93f22017-06-08 16:41:02 -0600102
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 else()
108 message(WARNING "Could not find working MASM assebler\n${ASM_FAILURE_MSG}")
Lenny Komowea568fe2017-07-03 14:48:38 -0600109 set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain.c)
Lenny Komow5ed93f22017-06-08 16:41:02 -0600110 add_custom_target(loader_asm_gen_files)
111 endif()
112else()
Lenny Komowb8133f52017-06-09 15:21:06 -0600113 enable_language(ASM-ATT)
Lenny Komowd3953da2017-06-29 15:40:12 -0600114 set(CMAKE_ASM-ATT_FLAGS "${CMAKE_ASM-ATT_FLAGS} $ENV{ASFLAGS}")
115 set(CMAKE_ASM-ATT_FLAGS "${CMAKE_ASM-ATT_FLAGS} -I\"${CMAKE_CURRENT_BINARY_DIR}\"")
Józef Kuciae0ab1482017-06-16 13:28:14 +0200116
Lenny Komowd3953da2017-06-29 15:40:12 -0600117 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/asm_test.asm ".intel_syntax noprefix\n.text\n.global sample\nsample:\nmov ecx, [eax + 16]\n")
118 try_compile(ASSEMBLER_WORKS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/asm_test.asm)
119 file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/asm_test.asm)
120 if (ASSEMBLER_WORKS)
Lenny Komowea568fe2017-07-03 14:48:38 -0600121 set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain_gas.asm)
Lenny Komowb8133f52017-06-09 15:21:06 -0600122 add_executable(asm_offset asm_offset.c)
123 add_dependencies(asm_offset generate_helper_files loader_gen_files)
124 add_custom_command(OUTPUT gen_defines.asm DEPENDS asm_offset COMMAND asm_offset GAS)
125 add_custom_target(loader_asm_gen_files DEPENDS gen_defines.asm)
126 else()
Lenny Komowd3953da2017-06-29 15:40:12 -0600127 message(WARNING "Could not find working x86 GAS assembler\n${ASM_FAILURE_MSG}")
Lenny Komowea568fe2017-07-03 14:48:38 -0600128 set(OPT_LOADER_SRCS ${OPT_LOADER_SRCS} unknown_ext_chain.c)
Lenny Komowb8133f52017-06-09 15:21:06 -0600129 add_custom_target(loader_asm_gen_files)
130 endif()
Lenny Komow5ed93f22017-06-08 16:41:02 -0600131endif()
132
Mark Young634bd7b2017-03-06 13:57:13 -0700133run_vk_xml_generate(loader_extension_generator.py vk_loader_extensions.h)
134run_vk_xml_generate(loader_extension_generator.py vk_loader_extensions.c)
135add_custom_target(loader_gen_files DEPENDS
136 vk_loader_extensions.h
137 vk_loader_extensions.c
138 )
Mark Young0f183a82017-02-28 09:58:04 -0700139
Jon Ashburn2077e382015-06-29 11:25:34 -0600140if (WIN32)
Dustin Gravesabe8b472016-05-31 16:32:29 -0600141 # Use static MSVCRT libraries
142 foreach(configuration in CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO
143 CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO)
144 if(${configuration} MATCHES "/MD")
145 string(REGEX REPLACE "/MD" "/MT" ${configuration} "${${configuration}}")
146 endif()
147 endforeach()
148
Jon Ashburnce816b62016-01-12 11:33:33 -0700149 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
Jon Ashburn761de4b2016-03-11 10:58:56 -0700150 # Build dev_ext_trampoline.c with -O2 to allow tail-call optimization.
151 # Build other C files with normal options
152 # setup two Cmake targets (loader-norm and loader-opt) for the different compilation flags
153 separate_arguments(LOCAL_C_FLAGS_DBG WINDOWS_COMMAND ${CMAKE_C_FLAGS_DEBUG})
154 set(CMAKE_C_FLAGS_DEBUG " ")
155 separate_arguments(LOCAL_C_FLAGS_REL WINDOWS_COMMAND ${CMAKE_C_FLAGS_RELEASE})
Jon Ashburn2077e382015-06-29 11:25:34 -0600156
Jon Ashburn761de4b2016-03-11 10:58:56 -0700157 add_library(loader-norm OBJECT ${NORMAL_LOADER_SRCS} dirent_on_windows.c)
Mark Young634bd7b2017-03-06 13:57:13 -0700158 add_dependencies(loader-norm generate_helper_files loader_gen_files)
Mark Young0f183a82017-02-28 09:58:04 -0700159
Jon Ashburn761de4b2016-03-11 10:58:56 -0700160 target_compile_options(loader-norm PUBLIC "$<$<CONFIG:DEBUG>:${LOCAL_C_FLAGS_DBG}>")
161 add_library(loader-opt OBJECT ${OPT_LOADER_SRCS})
Lenny Komow5ed93f22017-06-08 16:41:02 -0600162 add_dependencies(loader-opt generate_helper_files loader_gen_files loader_asm_gen_files)
Mark Young0f183a82017-02-28 09:58:04 -0700163
Jon Ashburn761de4b2016-03-11 10:58:56 -0700164 target_compile_options(loader-opt PUBLIC "$<$<CONFIG:DEBUG>:${LOCAL_C_FLAGS_REL}>")
Lenny Komow78413162016-12-23 14:12:18 -0700165 add_library(${API_LOWERCASE}-${MAJOR} SHARED $<TARGET_OBJECTS:loader-opt> $<TARGET_OBJECTS:loader-norm> ${CMAKE_CURRENT_BINARY_DIR}/${API_LOWERCASE}-${MAJOR}.def ${CMAKE_CURRENT_SOURCE_DIR}/loader.rc)
Jon Ashburn761de4b2016-03-11 10:58:56 -0700166 add_library(VKstatic.${MAJOR} STATIC $<TARGET_OBJECTS:loader-opt> $<TARGET_OBJECTS:loader-norm>)
Karl Schultz80b8aca2017-01-24 14:44:26 -0800167 # Suppress conflicting libs warning for debug builds.
168 set_target_properties(${API_LOWERCASE}-${MAJOR} PROPERTIES LINK_FLAGS_DEBUG /ignore:4098)
David Pinedo0c083652015-07-09 12:44:38 -0600169 set_target_properties(VKstatic.${MAJOR} PROPERTIES OUTPUT_NAME VKstatic.${MAJOR})
Slawomir Cygan9a2fa0e2017-07-03 16:47:52 +0200170 target_link_libraries(${API_LOWERCASE}-${MAJOR} shlwapi Cfgmgr32)
Lenny Komow5ed93f22017-06-08 16:41:02 -0600171 add_dependencies(${API_LOWERCASE}-${MAJOR} generate_helper_files loader_gen_files loader_asm_gen_files)
Mark Young0f183a82017-02-28 09:58:04 -0700172
Nekotekina92443502016-07-08 15:49:13 +0300173 target_link_libraries(VKstatic.${MAJOR} shlwapi)
Mark Muellerb33052d2016-04-18 11:04:36 -0600174 if (CMAKE_GENERATOR MATCHES "^Visual Studio.*")
Lenny Komow63fc1692016-11-07 10:44:23 -0700175 file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>/${API_LOWERCASE}-${MAJOR}.dll COPY_SRC_PATH)
Mark Muellerb33052d2016-04-18 11:04:36 -0600176 file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../demos/$<CONFIGURATION>/ COPY_DST_PATH)
177 file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../tests/$<CONFIGURATION>/ COPY_DST_TEST_PATH)
178 else()
Lenny Komow63fc1692016-11-07 10:44:23 -0700179 file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${API_LOWERCASE}-${MAJOR}.dll COPY_SRC_PATH)
Mark Muellerb33052d2016-04-18 11:04:36 -0600180 file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../demos/ COPY_DST_PATH)
181 file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../tests/ COPY_DST_TEST_PATH)
182 endif()
Lenny Komow63fc1692016-11-07 10:44:23 -0700183 add_custom_command(TARGET ${API_LOWERCASE}-${MAJOR} POST_BUILD
Jon Ashburnf8b3c892016-03-28 14:43:53 -0600184 COMMAND xcopy /Y /I ${COPY_SRC_PATH} ${COPY_DST_PATH})
Lenny Komow63fc1692016-11-07 10:44:23 -0700185 add_custom_command(TARGET ${API_LOWERCASE}-${MAJOR} POST_BUILD
Jon Ashburnf8b3c892016-03-28 14:43:53 -0600186 COMMAND xcopy /Y /I ${COPY_SRC_PATH} ${COPY_DST_TEST_PATH})
Jon Ashburnfd679d82016-03-25 15:57:50 -0600187
Jon Ashburnbb7e35b2016-02-12 16:39:20 -0700188else()
Jon Ashburnce816b62016-01-12 11:33:33 -0700189 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
Ian Elliott19628802015-02-04 12:06:46 -0700190
Mark Young0f183a82017-02-28 09:58:04 -0700191 add_library(${API_LOWERCASE} SHARED ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS})
Lenny Komow5ed93f22017-06-08 16:41:02 -0600192 add_dependencies(${API_LOWERCASE} generate_helper_files loader_gen_files loader_asm_gen_files)
Karl Schultzb4d31af2017-03-10 14:58:10 -0700193 set_target_properties(${API_LOWERCASE} PROPERTIES SOVERSION "1" VERSION "1.0.${vk_header_version}")
Lenny Komow63fc1692016-11-07 10:44:23 -0700194 target_link_libraries(${API_LOWERCASE} -ldl -lpthread -lm)
Mark Young0f183a82017-02-28 09:58:04 -0700195
Karl Schultz19b9e632017-06-12 11:23:57 -0600196 if(INSTALL_LVL_FILES)
197 install(TARGETS ${API_LOWERCASE} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
198 endif()
Karl Schultzb4d31af2017-03-10 14:58:10 -0700199
200 # Generate pkg-config file.
201 include(FindPkgConfig QUIET)
202 if(PKG_CONFIG_FOUND)
203 set(VK_API_VERSION "1.0.${vk_header_version}")
204 foreach(LIB ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS})
205 set(PRIVATE_LIBS "${PRIVATE_LIBS} -l${LIB}")
206 endforeach()
207 configure_file("vulkan.pc.in" "vulkan.pc" @ONLY)
Karl Schultz19b9e632017-06-12 11:23:57 -0600208 if(INSTALL_LVL_FILES)
209 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/vulkan.pc"
210 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
211 endif()
Karl Schultzb4d31af2017-03-10 14:58:10 -0700212 endif()
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700213endif()