diff --git a/.travis/install.sh b/.travis/install.sh new file mode 100644 index 00000000..5ee7683c --- /dev/null +++ b/.travis/install.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -e +set -x + +if [[ "$(uname -s)" == 'Darwin' ]]; then + brew update || brew update + brew outdated pyenv || brew upgrade pyenv + brew install pyenv-virtualenv + brew install cmake || brew upgrade cmake || true + + if which pyenv > /dev/null; then + eval "$(pyenv init -)" + fi + + pyenv install 3.7.1 + pyenv virtualenv 3.7.1 conan + pyenv rehash + pyenv activate conan +fi + +pip install conan --upgrade +pip install conan_package_tools + +conan user \ No newline at end of file diff --git a/.travis/run.sh b/.travis/run.sh new file mode 100644 index 00000000..0a3488ee --- /dev/null +++ b/.travis/run.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +set -e +set -x + +if [[ "$(uname -s)" == 'Darwin' ]]; then + if which pyenv > /dev/null; then + eval "$(pyenv init -)" + fi + pyenv activate conan +fi + +python build.py diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..fbe1c7cb --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.0) +project(OpenCLHeaders VERSION 2.2 LANGUAGES NONE) + +add_library(OpenCLHeaders INTERFACE) +add_library(OpenCL::OpenCLHeaders ALIAS OpenCLHeaders) +target_include_directories(OpenCLHeaders INTERFACE + $ + $ +) + +install(TARGETS OpenCLHeaders EXPORT OpenCLHeadersTargets) + +include(GNUInstallDirs) + +install(DIRECTORY "CL" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +export(EXPORT OpenCLHeadersTargets + FILE "${PROJECT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersTargets.cmake" + NAMESPACE OpenCL:: +) +file(WRITE "${PROJECT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersConfig.cmake" + "include(\"\${CMAKE_CURRENT_LIST_DIR}/OpenCLHeadersTargets.cmake\")" +) + +set(config_package_location ${CMAKE_INSTALL_DATADIR}/cmake/OpenCLHeaders) +install(EXPORT OpenCLHeadersTargets + FILE OpenCLHeadersTargets.cmake + NAMESPACE OpenCL:: + DESTINATION ${config_package_location} +) +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersConfig.cmake + DESTINATION ${config_package_location} +) + +unset(CMAKE_SIZEOF_VOID_P) +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion +) +install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/OpenCLHeaders/OpenCLHeadersConfigVersion.cmake" + DESTINATION ${config_package_location} +) diff --git a/README.md b/README.md index 757e56e1..8a33588e 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,27 @@ https://github.com/KhronosGroup/OpenCL-Headers Issues, proposed fixes for issues, and other suggested changes should be created using Github. +## CMake Package +While the headers may just be copied as-is, this repository also contains a +CMake script with an install rule to allow for packaging the headers. + +```bash +cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/path/to/desired/prefix +cmake --build build --target install +``` + +To consume the package: + +```bash +cmake path/to/opencl/app -DOpenCLHeaders_ROOT=/chosen/install/prefix +``` + +```cmake +add_executable(app main.cpp) +find_package(OpenCLHeaders REQUIRED) +target_link_libraries(app PRIVATE OpenCL::OpenCLHeaders) +``` + ## Branch Structure The OpenCL API headers in this repository are Unified headers and are designed @@ -28,7 +49,7 @@ the OpenCL API version. For example, to enforce usage of no more than the OpenCL 1.2 APIs, you may include the OpenCL API headers as follows: -``` +```c #define CL_TARGET_OPENCL_VERSION 120 #include ``` diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..560f9fcd --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,17 @@ +build: false + +environment: + PYTHON: "C:\\Python37" + + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + CONAN_VISUAL_VERSIONS: 12 + +install: + - set PATH=%PYTHON_HOME%;%PYTHON_HOME%/Scripts/;%PATH% + - pip.exe install conan --upgrade + - pip.exe install conan_package_tools + - conan user # It creates the conan data directory + +test_script: + - python build.py diff --git a/build.py b/build.py new file mode 100644 index 00000000..d535b23c --- /dev/null +++ b/build.py @@ -0,0 +1,11 @@ +from cpt.packager import ConanMultiPackager +import datetime + +if __name__ == "__main__": + builder = ConanMultiPackager( + username="khronos", + login_username="khronos", + channel="stable" + ) + builder.add_common_builds() + builder.run() diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 00000000..345e0605 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,23 @@ +from conans import ConanFile, tools, CMake +import os + + +class OpenCLHeadersConan(ConanFile): + name = "opencl-headers" + version = "20190502" + license = "Apache-2.0" + author = "Khronos Group " + url = "https://github.com/KhronosGroup/OpenCL-ICD-Loader" + description = "Khronos OpenCL Headers" + topics = ("khronos", "opencl", "headers") + exports_sources = "CMakeLists.txt", "CL/*" + no_copy_source = True + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + cmake.install() + + def package_id(self): + self.info.header_only() \ No newline at end of file diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt new file mode 100644 index 00000000..5418842a --- /dev/null +++ b/test_package/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.0) +project(PackageTest C) + +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +find_package(OpenCLHeaders REQUIRED) + +add_executable(example example.c) +target_link_libraries(example OpenCL::OpenCLHeaders) diff --git a/test_package/conanfile.py b/test_package/conanfile.py new file mode 100644 index 00000000..c3341f9a --- /dev/null +++ b/test_package/conanfile.py @@ -0,0 +1,17 @@ +import os +from conans import ConanFile, CMake, tools + + +class OpenCLHeadersTestConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + generators = "cmake" + + def build(self): + cmake = CMake(self) + cmake.configure() + cmake.build() + + def test(self): + if not tools.cross_building(self.settings): + os.chdir("bin") + self.run(".%sexample" % os.sep) diff --git a/test_package/example.c b/test_package/example.c new file mode 100644 index 00000000..56d0c7a1 --- /dev/null +++ b/test_package/example.c @@ -0,0 +1,9 @@ +#define CL_TARGET_OPENCL_VERSION 220 +#include + +int main(void) { + cl_platform_id id; + cl_int result; + result = 0; + return result; +}