diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml index d520ae92..3cc71a23 100644 --- a/.github/workflows/presubmit.yml +++ b/.github/workflows/presubmit.yml @@ -17,8 +17,14 @@ jobs: repository: KhronosGroup/OpenCL-Headers path: inc - run: mkdir -p build - - run: cd build - - run: cmake .. + - run: cd inc + - run: cmake . -DCMAKE_INSTALL_PREFIX=$(pwd) + working-directory: inc + - run: make install + working-directory: inc + - run: cd ../build + working-directory: build + - run: cmake .. -DOpenCLHeaders_DIR=/home/runner/work/OpenCL-ICD-Loader/OpenCL-ICD-Loader/inc/share/cmake/OpenCLHeaders -DBUILD_TESTING=OFF working-directory: build - run: cmake --build . working-directory: build diff --git a/CMakeLists.txt b/CMakeLists.txt index 05455afd..e2a928d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,6 @@ cmake_minimum_required (VERSION 3.1) - -project (OpenCL-ICD-Loader VERSION 1.2) +project (OpenCL-ICD-Loader VERSION 1.2 LANGUAGES C) include (GNUInstallDirs) -find_package (Threads REQUIRED) # The option below allows building the ICD Loader library as a shared library # (ON, default) or a static library (OFF). @@ -40,83 +38,24 @@ check_function_exists(__secure_getenv HAVE___SECURE_GETENV) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/loader/icd_cmake_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/icd_cmake_config.h) -set (OPENCL_ICD_LOADER_SOURCES - loader/icd.c - loader/icd.h - loader/icd_dispatch.c - loader/icd_dispatch.h - loader/icd_dispatch_generated.c - loader/icd_envvars.h - loader/icd_platform.h) - -if (WIN32) - list (APPEND OPENCL_ICD_LOADER_SOURCES - loader/windows/adapter.h - loader/windows/icd_windows.c - loader/windows/icd_windows.h - loader/windows/icd_windows_dxgk.c - loader/windows/icd_windows_dxgk.h - loader/windows/icd_windows_envvars.c - loader/windows/icd_windows_hkr.c - loader/windows/icd_windows_hkr.h - loader/windows/icd_windows_apppackage.cpp - loader/windows/icd_windows_apppackage.h - loader/windows/OpenCL.def - loader/windows/OpenCL.rc) - # Only add the DXSDK include directory if the environment variable is - # defined. Since the DXSDK has merged into the Windows SDK, this is - # only required in rare cases. - if (DEFINED ENV{DXSDK_DIR} AND NOT (MINGW OR MSYS OR CYGWIN)) - include_directories ($ENV{DXSDK_DIR}/Include) - endif () -else () - list (APPEND OPENCL_ICD_LOADER_SOURCES - loader/linux/icd_linux.c - loader/linux/icd_linux_envvars.c - loader/linux/icd_exports.map) -endif () +set (CMAKE_C_STANDARD 99) +set (CMAKE_C_STANDARD_REQUIRED ON) +set (CMAKE_C_EXTENSIONS OFF) set (OPENCL_ICD_LOADER_HEADERS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/inc CACHE PATH "Path to OpenCL Headers") -add_library (OpenCL ${OPENCL_ICD_LOADER_SOURCES}) -set_target_properties (OpenCL PROPERTIES VERSION "1.2" SOVERSION "1") -target_include_directories(OpenCL SYSTEM PUBLIC ${OPENCL_ICD_LOADER_HEADERS_DIR}) - -if (WIN32) - target_link_libraries (OpenCL cfgmgr32.lib runtimeobject.lib) - - option (OPENCL_ICD_LOADER_DISABLE_OPENCLON12 "Disable support for OpenCLOn12. Support for OpenCLOn12 should only be disabled when building an import lib to link with, and must be enabled when building an ICD loader for distribution!" OFF) - if (OPENCL_ICD_LOADER_DISABLE_OPENCLON12) - target_compile_definitions(OpenCL PRIVATE OPENCL_ICD_LOADER_DISABLE_OPENCLON12) - endif() - - if(NOT USE_DYNAMIC_VCXX_RUNTIME) - string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") - string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") - string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}") - string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}") - string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") - string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - string(REPLACE "/MDd" "/MTd" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") - string(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") - endif() -else() - if (APPLE) - target_link_libraries (OpenCL ${CMAKE_THREAD_LIBS_INIT}) - else () - set_target_properties (OpenCL PROPERTIES LINK_FLAGS "-Wl,--version-script -Wl,${CMAKE_CURRENT_SOURCE_DIR}/loader/linux/icd_exports.map") - if (OPENCL_ICD_LOADER_PIC) - set_target_properties(OpenCL PROPERTIES POSITION_INDEPENDENT_CODE ON) - endif () - target_link_libraries (OpenCL ${CMAKE_THREAD_LIBS_INIT}) - endif () +if (WIN32 AND NOT USE_DYNAMIC_VCXX_RUNTIME) + string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") + string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") + string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}") + string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}") + string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") + string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + string(REPLACE "/MDd" "/MTd" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") + string(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") endif () -include_directories (${OPENCL_ICD_LOADER_HEADERS_DIR}) -add_definitions (-DCL_TARGET_OPENCL_VERSION=300) - -target_include_directories (OpenCL PRIVATE ${CMAKE_CURRENT_BINARY_DIR} loader) -target_link_libraries (OpenCL ${CMAKE_DL_LIBS}) +add_subdirectory (loader) option (OPENCL_ICD_LOADER_BUILD_TESTING "Enable support for OpenCL ICD Loader testing." OFF) @@ -127,7 +66,29 @@ if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR OPENCL_ICD_LOADER_BUILD_TESTING) add_subdirectory (test) endif() -install (TARGETS OpenCL - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) +export(EXPORT OpenCLTargets + FILE "${PROJECT_BINARY_DIR}/OpenCL/OpenCLTargets.cmake" + NAMESPACE OpenCL::) +configure_file(cmake/OpenCLConfig.cmake + "${PROJECT_BINARY_DIR}/OpenCL/OpenCLConfig.cmake" + COPYONLY) + +set(config_package_location ${CMAKE_INSTALL_LIBDIR}/cmake/OpenCL) +install(EXPORT OpenCLTargets + FILE OpenCLTargets.cmake + NAMESPACE OpenCL:: + DESTINATION ${config_package_location}) +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCL/OpenCLConfig.cmake + DESTINATION ${config_package_location} + COMPONENT Devel) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/OpenCL/OpenCLConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion) +install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/OpenCL/OpenCLConfigVersion.cmake" + DESTINATION ${config_package_location} + COMPONENT Devel) diff --git a/cmake/OpenCLConfig.cmake b/cmake/OpenCLConfig.cmake new file mode 100644 index 00000000..0a4e4a77 --- /dev/null +++ b/cmake/OpenCLConfig.cmake @@ -0,0 +1,7 @@ +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/Modules") + +include(CMakeFindDependencyMacro) +find_dependency(Threads REQUIRED) +find_dependency(OpenCLHeaders REQUIRED) + +include("${CMAKE_CURRENT_LIST_DIR}/OpenCLTargets.cmake") diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt new file mode 100644 index 00000000..3590fdba --- /dev/null +++ b/loader/CMakeLists.txt @@ -0,0 +1,43 @@ +find_package (Threads REQUIRED) +find_package (OpenCLHeaders REQUIRED) + +add_library(OpenCL + ${CMAKE_CURRENT_SOURCE_DIR}/icd.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd.h + ${CMAKE_CURRENT_SOURCE_DIR}/icd_dispatch.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd_dispatch.h + ${CMAKE_CURRENT_SOURCE_DIR}/icd_envvars.h + ${CMAKE_CURRENT_SOURCE_DIR}/icd_platform.h +) + +set_target_properties(OpenCL PROPERTIES + SOVERSION ${PROJECT_VERSION_MAJOR} + VERSION ${PROJECT_VERSION} +) + +target_link_libraries(OpenCL + PUBLIC Threads::Threads OpenCL::OpenCLHeaders ${CMAKE_DL_LIBS}) +target_compile_definitions(OpenCL PRIVATE CL_TARGET_OPENCL_VERSION=220) + +if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + add_subdirectory(windows) +elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + add_subdirectory(linux) +endif() + +install (TARGETS OpenCL EXPORT OpenCLTargets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +if (UNIX) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/OpenCL.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/OpenCL.pc.configured + @ONLY) + file(GENERATE + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/OpenCL.pc + INPUT ${CMAKE_CURRENT_BINARY_DIR}/OpenCL.pc.configured) + install (FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCL.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +endif() + diff --git a/loader/OpenCL.pc.in b/loader/OpenCL.pc.in new file mode 100644 index 00000000..b4e94d99 --- /dev/null +++ b/loader/OpenCL.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=$ + +Name: OpenCL +Description: OpenCL Installable Client Driver Loader +Version: @PROJECT_VERSION@ +Libs: ${libdir}/$ @CMAKE_THREAD_LIBS_INIT@ -l@CMAKE_DL_LIBS@ +Cflags: -I$, -I> diff --git a/loader/linux/CMakeLists.txt b/loader/linux/CMakeLists.txt new file mode 100644 index 00000000..ca974c4f --- /dev/null +++ b/loader/linux/CMakeLists.txt @@ -0,0 +1,16 @@ +target_sources(OpenCL PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/icd_linux.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd_linux_envvars.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd_exports.map +) + +target_include_directories (OpenCL PRIVATE ${PROJECT_BINARY_DIR}) + +target_compile_definitions(OpenCL PRIVATE _DEFAULT_SOURCE) +set_property(TARGET OpenCL APPEND PROPERTY + LINK_FLAGS -Wl,--version-script="${CMAKE_CURRENT_SOURCE_DIR}/icd_exports.map" +) +set_property(TARGET OpenCL APPEND PROPERTY + LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/icd_exports.map" +) + diff --git a/loader/linux/icd_linux.c b/loader/linux/icd_linux.c index bb21b2ab..5f571b0c 100644 --- a/loader/linux/icd_linux.c +++ b/loader/linux/icd_linux.c @@ -16,8 +16,8 @@ * OpenCL is a trademark of Apple Inc. used under license by Khronos. */ -#include "icd.h" -#include "icd_envvars.h" +#include "../icd.h" +#include "../icd_envvars.h" #include #include diff --git a/loader/windows/CMakeLists.txt b/loader/windows/CMakeLists.txt new file mode 100644 index 00000000..8ea9be53 --- /dev/null +++ b/loader/windows/CMakeLists.txt @@ -0,0 +1,43 @@ +target_sources(OpenCL PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/icd_windows.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd_windows.h + ${CMAKE_CURRENT_SOURCE_DIR}/icd_windows_dxgk.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd_windows_dxgk.h + ${CMAKE_CURRENT_SOURCE_DIR}/icd_windows_envvars.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd_windows_hkr.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd_windows_hkr.h + ${CMAKE_CURRENT_SOURCE_DIR}/OpenCL.def + ${CMAKE_CURRENT_SOURCE_DIR}/OpenCL.rc +) + +# Only add the DXSDK include directory if the environment variable is +# defined. Since the DXSDK has merged into the Windows SDK, this is +# only required in rare cases. +if (DEFINED ENV{DXSDK_DIR} AND NOT (MINGW OR MSYS OR CYGWIN)) + target_include_directories(OpenCL PRIVATE $ENV{DXSDK_DIR}/Include) +endif () + +target_link_libraries(OpenCL PUBLIC cfgmgr32) + +option (OPENCL_ICD_LOADER_REQUIRE_WDK "Build with D3DKMT support, which requires the Windows WDK." ON) + if (OPENCL_ICD_LOADER_REQUIRE_WDK) + if(DEFINED ENV{WDKContentRoot}) + file(GLOB D3DKMT_HEADER "$ENV{WDKContentRoot}/Include/*/km/d3dkmthk.h") + else() + file(GLOB D3DKMT_HEADER "$ENV{HOMEDRIVE}/Program Files */Windows Kits/10/Include/*/km/d3dkmthk.h") + endif() + + if(D3DKMT_HEADER) + list(GET D3DKMT_HEADER -1 LATEST_D3DKMT_HEADER) + get_filename_component(WDK_DIRECTORY ${LATEST_D3DKMT_HEADER} DIRECTORY) + get_filename_component(WDK_DIRECTORY ${WDK_DIRECTORY} DIRECTORY) + message(STATUS "Found the Windows WDK in: ${WDK_DIRECTORY}") + target_compile_definitions(OpenCL PRIVATE OPENCL_ICD_LOADER_REQUIRE_WDK) + target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/um) + target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/km) + target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/shared) + else() + message(FATAL_ERROR "The Windows WDK was not found. Consider disabling OPENCL_ICD_LOADER_REQUIRE_WDK. Aborting.") + endif() + endif() + diff --git a/loader/windows/icd_windows.c b/loader/windows/icd_windows.c index 19a0e7ae..d67f7632 100644 --- a/loader/windows/icd_windows.c +++ b/loader/windows/icd_windows.c @@ -18,7 +18,7 @@ #include -#include "icd.h" +#include "../icd.h" #include "icd_windows.h" #include "icd_windows_hkr.h" #include "icd_windows_dxgk.h" diff --git a/loader/windows/icd_windows_hkr.c b/loader/windows/icd_windows_hkr.c index 58d5c0c5..2ded002c 100644 --- a/loader/windows/icd_windows_hkr.c +++ b/loader/windows/icd_windows_hkr.c @@ -16,7 +16,7 @@ * OpenCL is a trademark of Apple Inc. used under license by Khronos. */ -#include "icd.h" +#include "../icd.h" #include "icd_windows_hkr.h" #include #include "icd_windows_dxgk.h" diff --git a/test/driver_stub/CMakeLists.txt b/test/driver_stub/CMakeLists.txt index 47b3bd27..63659daa 100644 --- a/test/driver_stub/CMakeLists.txt +++ b/test/driver_stub/CMakeLists.txt @@ -1,5 +1,9 @@ - -set (OPENCL_DRIVER_STUB_SOURCES cl.c cl_ext.c cl_gl.c icd.c) +set (OPENCL_DRIVER_STUB_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/cl.c + ${CMAKE_CURRENT_SOURCE_DIR}/cl_ext.c + ${CMAKE_CURRENT_SOURCE_DIR}/cl_gl.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd.c + ) if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") list (APPEND OPENCL_DRIVER_STUB_SOURCES driver_stub.def) @@ -8,3 +12,5 @@ endif () add_library (OpenCLDriverStub ${OPENCL_DRIVER_STUB_SOURCES}) target_link_libraries (OpenCLDriverStub IcdLog) + +target_compile_definitions(OpenCLDriverStub PRIVATE CL_TARGET_OPENCL_VERSION=220) diff --git a/test/loader_test/CMakeLists.txt b/test/loader_test/CMakeLists.txt index ddc675b4..cd079373 100644 --- a/test/loader_test/CMakeLists.txt +++ b/test/loader_test/CMakeLists.txt @@ -1,15 +1,18 @@ add_executable (icd_loader_test - test_kernel.c - main.c - test_platforms.c - icd_test_match.c - test_program_objects.c - test_sampler_objects.c - test_buffer_object.c - test_cl_runtime.c - callbacks.c - test_create_calls.c - test_clgl.c - test_image_objects.c ) + ${CMAKE_CURRENT_SOURCE_DIR}/test_kernel.c + ${CMAKE_CURRENT_SOURCE_DIR}/main.c + ${CMAKE_CURRENT_SOURCE_DIR}/test_platforms.c + ${CMAKE_CURRENT_SOURCE_DIR}/icd_test_match.c + ${CMAKE_CURRENT_SOURCE_DIR}/test_program_objects.c + ${CMAKE_CURRENT_SOURCE_DIR}/test_sampler_objects.c + ${CMAKE_CURRENT_SOURCE_DIR}/test_buffer_object.c + ${CMAKE_CURRENT_SOURCE_DIR}/test_cl_runtime.c + ${CMAKE_CURRENT_SOURCE_DIR}/callbacks.c + ${CMAKE_CURRENT_SOURCE_DIR}/test_create_calls.c + ${CMAKE_CURRENT_SOURCE_DIR}/test_clgl.c + ${CMAKE_CURRENT_SOURCE_DIR}/test_image_objects.c + ) target_link_libraries (icd_loader_test OpenCL IcdLog) + +target_compile_definitions(icd_loader_test PRIVATE CL_TARGET_OPENCL_VERSION=220) diff --git a/test/log/CMakeLists.txt b/test/log/CMakeLists.txt index 93dea6c6..aeb08a78 100644 --- a/test/log/CMakeLists.txt +++ b/test/log/CMakeLists.txt @@ -1,4 +1,9 @@ -add_library (IcdLog icd_test_log.c) +add_library (IcdLog + ${CMAKE_CURRENT_SOURCE_DIR}/icd_test_log.c +) + if (WIN32) target_compile_definitions (IcdLog PRIVATE _CRT_SECURE_NO_WARNINGS) endif() + +target_compile_definitions(IcdLog PRIVATE CL_TARGET_OPENCL_VERSION=220)