Add support for OpenCLOn12 ICD (#103)
[platform/upstream/OpenCL-ICD-Loader.git] / CMakeLists.txt
1 cmake_minimum_required (VERSION 2.8.11)
2
3 project (OPENCL_ICD_LOADER)
4 include (GNUInstallDirs)
5 find_package (Threads REQUIRED)
6
7 # The option below allows building the ICD Loader library as a shared library
8 # (ON, default) or a static library (OFF).
9 #
10 # Khronos OpenCL Working Group strongly recommends building and using the ICD
11 # loader as a shared library due to the following benefits:
12 #
13 # 1. The shared library can be updated independent of the application. This
14 #    allows releasing new fixes and features in the ICD loader without updating
15 #    the application.
16 #
17 #    In rare cases when there are backward-incompatible changes to the ICD
18 #    loader (due to platform requirements, for instance), using a shared
19 #    library allows updating the library to make the transition seamless to
20 #    installed applications.
21 #
22 # 2. On platforms that require the ICD mechanism there are multiple vendors
23 #    shipping their OpenCL implementations. The vendor installers collaborate
24 #    to make sure that the installed ICD shared library version is suitable for
25 #    working with all vendor implementations installed on the system.
26 #
27 #    If applications statically link to ICD Loader then that version of the ICD
28 #    loader may not work with one or more installed vendor implementations.
29 #
30 # Using the OpenCL ICD loader as a static library is NOT recommended for
31 # end-user installations in general. However in some controlled environments it
32 # may be useful to simplify the build and distribution of the application. E.g.
33 # in test farms, or in cases where the end-user system configs are known in
34 # advance. Use it with discretion.
35 option (BUILD_SHARED_LIBS "Build shared libs" ON)
36
37 include(CheckFunctionExists)
38 check_function_exists(secure_getenv HAVE_SECURE_GETENV)
39 check_function_exists(__secure_getenv HAVE___SECURE_GETENV)
40 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/loader/icd_cmake_config.h.in
41     ${CMAKE_CURRENT_BINARY_DIR}/icd_cmake_config.h)
42
43 set (OPENCL_ICD_LOADER_SOURCES
44     loader/icd.c
45     loader/icd.h
46     loader/icd_dispatch.c
47     loader/icd_dispatch.h
48     loader/icd_envvars.h
49     loader/icd_platform.h)
50
51 if (WIN32)
52     list (APPEND OPENCL_ICD_LOADER_SOURCES 
53         loader/windows/icd_windows.c
54         loader/windows/icd_windows.h
55         loader/windows/icd_windows_dxgk.c
56         loader/windows/icd_windows_dxgk.h
57         loader/windows/icd_windows_envvars.c
58         loader/windows/icd_windows_hkr.c
59         loader/windows/icd_windows_hkr.h
60         loader/windows/icd_windows_apppackage.cpp
61         loader/windows/icd_windows_apppackage.h
62         loader/windows/OpenCL.def
63         loader/windows/OpenCL.rc)
64     # Only add the DXSDK include directory if the environment variable is
65     # defined.  Since the DXSDK has merged into the Windows SDK, this is
66     # only required in rare cases.
67     if (DEFINED ENV{DXSDK_DIR} AND NOT (MINGW OR MSYS OR CYGWIN))
68         include_directories ($ENV{DXSDK_DIR}/Include)
69     endif ()
70 else ()
71     list (APPEND OPENCL_ICD_LOADER_SOURCES
72         loader/linux/icd_linux.c
73         loader/linux/icd_linux_envvars.c
74         loader/linux/icd_exports.map)
75 endif ()
76
77 set (OPENCL_ICD_LOADER_HEADERS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/inc CACHE PATH "Path to OpenCL Headers")
78
79 add_library (OpenCL ${OPENCL_ICD_LOADER_SOURCES})
80 set_target_properties (OpenCL PROPERTIES VERSION "1.2" SOVERSION "1")
81
82 if (WIN32)
83     target_link_libraries (OpenCL cfgmgr32.lib RuntimeObject.lib)
84
85     option (OPENCL_ICD_LOADER_REQUIRE_WDK "Build with D3DKMT support, which requires the Windows WDK." ON)
86     if (OPENCL_ICD_LOADER_REQUIRE_WDK)
87         if(DEFINED ENV{WDKContentRoot})
88             file(GLOB D3DKMT_HEADER "$ENV{WDKContentRoot}/Include/*/km/d3dkmthk.h")
89         else()
90             file(GLOB D3DKMT_HEADER "$ENV{HOMEDRIVE}/Program Files */Windows Kits/10/Include/*/km/d3dkmthk.h")
91         endif()
92
93         if(D3DKMT_HEADER)
94             list(GET D3DKMT_HEADER -1 LATEST_D3DKMT_HEADER)
95             get_filename_component(WDK_DIRECTORY ${LATEST_D3DKMT_HEADER} DIRECTORY)
96             get_filename_component(WDK_DIRECTORY ${WDK_DIRECTORY} DIRECTORY)
97             message(STATUS "Found the Windows WDK in: ${WDK_DIRECTORY}")
98             target_compile_definitions(OpenCL PRIVATE OPENCL_ICD_LOADER_REQUIRE_WDK)
99             target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/um)
100             target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/km)
101             target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/shared)
102         else()
103             message(FATAL_ERROR "The Windows WDK was not found. Consider disabling OPENCL_ICD_LOADER_REQUIRE_WDK. Aborting.")
104         endif()
105     endif()
106
107     if(NOT USE_DYNAMIC_VCXX_RUNTIME)
108         string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
109         string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
110         string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
111         string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
112         string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
113         string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
114         string(REPLACE "/MDd" "/MTd" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
115         string(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
116     endif()
117 else()
118     if (APPLE)
119         target_link_libraries (OpenCL ${CMAKE_THREAD_LIBS_INIT})
120     else ()
121         set_target_properties (OpenCL PROPERTIES LINK_FLAGS "-Wl,--version-script -Wl,${CMAKE_CURRENT_SOURCE_DIR}/loader/linux/icd_exports.map")
122         target_link_libraries (OpenCL ${CMAKE_THREAD_LIBS_INIT})
123     endif ()
124 endif ()
125
126 include_directories (${OPENCL_ICD_LOADER_HEADERS_DIR})
127 add_definitions (-DCL_TARGET_OPENCL_VERSION=220)
128
129 target_include_directories (OpenCL PRIVATE ${CMAKE_CURRENT_BINARY_DIR} loader)
130 target_link_libraries (OpenCL ${CMAKE_DL_LIBS})
131
132 include (CTest)
133 if (BUILD_TESTING)
134     add_subdirectory (test)
135 endif()
136
137 install (TARGETS OpenCL
138     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
139     ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
140     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})