diff options
Diffstat (limited to 'build/cmake')
-rw-r--r-- | build/cmake/CMakeLists.txt | 130 | ||||
-rw-r--r-- | build/cmake/CopyImportedTargetProperties.cmake | 88 | ||||
-rw-r--r-- | build/cmake/glew-config.cmake | 46 | ||||
-rw-r--r-- | build/cmake/testbuild/CMakeLists.txt | 24 | ||||
-rw-r--r-- | build/cmake/testbuild/main.c | 23 |
5 files changed, 311 insertions, 0 deletions
diff --git a/build/cmake/CMakeLists.txt b/build/cmake/CMakeLists.txt new file mode 100644 index 0000000..1563f9f --- /dev/null +++ b/build/cmake/CMakeLists.txt @@ -0,0 +1,130 @@ +if ( NOT DEFINED CMAKE_BUILD_TYPE ) + set( CMAKE_BUILD_TYPE Release CACHE STRING "Build type" ) +endif () + +project (glew) + +cmake_minimum_required (VERSION 2.4) + +if (COMMAND cmake_policy) + cmake_policy (SET CMP0003 NEW) +endif() + +set(CMAKE_DEBUG_POSTFIX d) + +option (BUILD_UTILS "utilities" ON) + +set (GLEW_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../..) + +# get version from config/version +file (STRINGS ${GLEW_DIR}/config/version _VERSION_MAJOR_STRING REGEX "GLEW_MAJOR[ ]*=[ ]*[0-9]+.*") +string (REGEX REPLACE "GLEW_MAJOR[ ]*=[ ]*([0-9]+)" "\\1" CPACK_PACKAGE_VERSION_MAJOR ${_VERSION_MAJOR_STRING}) +file (STRINGS ${GLEW_DIR}/config/version _VERSION_MINOR_STRING REGEX "GLEW_MINOR[ ]*=[ ]*[0-9]+.*") +string (REGEX REPLACE "GLEW_MINOR[ ]*=[ ]*([0-9]+)" "\\1" CPACK_PACKAGE_VERSION_MINOR ${_VERSION_MINOR_STRING}) +file (STRINGS ${GLEW_DIR}/config/version _VERSION_PATCH_STRING REGEX "GLEW_MICRO[ ]*=[ ]*[0-9]+.*") +string (REGEX REPLACE "GLEW_MICRO[ ]*=[ ]*([0-9]+)" "\\1" CPACK_PACKAGE_VERSION_PATCH ${_VERSION_PATCH_STRING}) +set (GLEW_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}) + +set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +if (WIN32) + set (GLEW_LIB_NAME glew32) +else () + set (GLEW_LIB_NAME GLEW) + set (DLL_PREFIX lib) +endif () + +find_package (OpenGL REQUIRED) +set (GLEW_LIBRARIES ${OPENGL_LIBRARIES}) + +add_definitions (-DGLEW_NO_GLU) + +include_directories (${GLEW_DIR}/include) + +add_library (glew SHARED ${GLEW_DIR}/src/glew.c) +set_target_properties (glew PROPERTIES COMPILE_DEFINITIONS "GLEW_BUILD" OUTPUT_NAME "${GLEW_LIB_NAME}" PREFIX "${DLL_PREFIX}") +add_library (glew_s STATIC ${GLEW_DIR}/src/glew.c) +set_target_properties (glew_s PROPERTIES COMPILE_DEFINITIONS "GLEW_STATIC" OUTPUT_NAME "${GLEW_LIB_NAME}" PREFIX lib) +target_link_libraries (glew ${GLEW_LIBRARIES}) +target_link_libraries (glew_s ${GLEW_LIBRARIES}) + +add_library(glewmx SHARED ${GLEW_DIR}/src/glew.c ) +set_target_properties (glewmx PROPERTIES COMPILE_DEFINITIONS "GLEW_BUILD;GLEW_MX" OUTPUT_NAME "${GLEW_LIB_NAME}mx" PREFIX "${DLL_PREFIX}") +add_library(glewmx_s STATIC ${GLEW_DIR}/src/glew.c ) +set_target_properties (glewmx_s PROPERTIES COMPILE_DEFINITIONS "GLEW_STATIC;GLEW_MX" OUTPUT_NAME "${GLEW_LIB_NAME}mx" PREFIX lib) +target_link_libraries (glewmx ${GLEW_LIBRARIES}) +target_link_libraries (glewmx_s ${GLEW_LIBRARIES}) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + set(MAYBE_EXPORT "") +else() + target_compile_definitions(glew_s INTERFACE "GLEW_STATIC") + target_compile_definitions(glewmx INTERFACE "GLEW_MX") + target_compile_definitions(glewmx_s INTERFACE "GLEW_STATIC;GLEW_MX") + foreach(t glew glew_s glewmx glewmx_s) + target_include_directories(${t} PUBLIC $<INSTALL_INTERFACE:include>) + endforeach() + set(MAYBE_EXPORT EXPORT glew-targets) +endif() + +set(targets_to_install "") +if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS) + list(APPEND targets_to_install glew glewmx) +endif() + +if(NOT DEFINED BUILD_SHARED_LIBS OR NOT BUILD_SHARED_LIBS) + list(APPEND targets_to_install glew_s glewmx_s) +endif() + +install ( TARGETS ${targets_to_install} + ${MAYBE_EXPORT} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib${LIB_SUFFIX} + ARCHIVE DESTINATION lib${LIB_SUFFIX} +) + +if (BUILD_UTILS) + add_executable (glewinfo ${GLEW_DIR}/src/glewinfo.c) + target_link_libraries (glewinfo glew) + + add_executable (visualinfo ${GLEW_DIR}/src/visualinfo.c) + target_link_libraries (visualinfo glew) + + install ( TARGETS glewinfo visualinfo + DESTINATION bin) +endif () + +set (prefix ${CMAKE_INSTALL_PREFIX}) +set (exec_prefix \${prefix}) +set (libdir \${prefix}/lib) +set (includedir \${prefix}/include) +set (includedir \${prefix}/include) +set (version ${GLEW_VERSION}) +set (libname ${GLEW_LIB_NAME}) +set (cflags) +set (requireslib glu) +configure_file (${GLEW_DIR}/glew.pc.in ${GLEW_DIR}/glew.pc @ONLY) +set (cflags "-DGLEW_MX") +set (libname ${GLEW_LIB_NAME}mx) +configure_file (${GLEW_DIR}/glew.pc.in ${GLEW_DIR}/glewmx.pc @ONLY) + +install(FILES ${GLEW_DIR}/glew.pc ${GLEW_DIR}/glewmx.pc + DESTINATION lib/pkgconfig +) + +install (FILES + ${GLEW_DIR}/include/GL/wglew.h + ${GLEW_DIR}/include/GL/glew.h + ${GLEW_DIR}/include/GL/glxew.h + DESTINATION include/GL) + +if(MAYBE_EXPORT) + install(EXPORT glew-targets DESTINATION lib/cmake/glew + NAMESPACE GLEW::) + install(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/glew-config.cmake + ${CMAKE_CURRENT_SOURCE_DIR}/CopyImportedTargetProperties.cmake + DESTINATION lib/cmake/glew) +endif() diff --git a/build/cmake/CopyImportedTargetProperties.cmake b/build/cmake/CopyImportedTargetProperties.cmake new file mode 100644 index 0000000..a7ade98 --- /dev/null +++ b/build/cmake/CopyImportedTargetProperties.cmake @@ -0,0 +1,88 @@ +#.rst: +# CopyImportedTargetProperties +# -------------------------- +# +# Copies the `INTERFACE*` and `IMPORTED*` properties from a target +# to another one. +# This function can be used to duplicate an `IMPORTED` or an `ALIAS` library +# with a different name since ``add_library(... ALIAS ...)`` does not work +# for those targets. +# +# :: +# +# copy_imported_target_properties(<source-target> <destination-target>) +# +# The function copies all the `INTERFACE*` and `IMPORTED*` target +# properties from `<source-target>` to `<destination-target>`. +# +# The function uses the `IMPORTED_CONFIGURATIONS` property to determine +# which configuration-dependent properties should be copied +# (`IMPORTED_LOCATION_<CONFIG>`, etc...) +# +# Example: +# +# Internally the CMake project of ZLIB builds the ``zlib`` and +# ``zlibstatic`` targets which can be exported in the ``ZLIB::`` namespace +# with the ``install(EXPORT ...)`` command. +# +# The config-module will then create the import libraries ``ZLIB::zlib`` and +# ``ZLIB::zlibstatic``. To use ``ZLIB::zlibstatic`` under the standard +# ``ZLIB::ZLIB`` name we need to create the ``ZLIB::ZLIB`` imported library +# and copy the appropriate properties: +# +# add_library(ZLIB::ZLIB STATIC IMPORTED) +# copy_imported_target_properties(ZLIB::zlibstatic ZLIB::ZLIB) +# + +function(copy_imported_target_properties src_target dest_target) + + set(config_dependent_props + IMPORTED_IMPLIB + IMPORTED_LINK_DEPENDENT_LIBRARIES + IMPORTED_LINK_INTERFACE_LANGUAGES + IMPORTED_LINK_INTERFACE_LIBRARIES + IMPORTED_LINK_INTERFACE_MULTIPLICITY + IMPORTED_LOCATION + IMPORTED_NO_SONAME + IMPORTED_SONAME + ) + + # copy configuration-independent properties + foreach(prop + ${config_dependent_props} + IMPORTED_CONFIGURATIONS + INTERFACE_AUTOUIC_OPTIONS + INTERFACE_COMPILE_DEFINITIONS + INTERFACE_COMPILE_FEATURES + INTERFACE_COMPILE_OPTIONS + INTERFACE_INCLUDE_DIRECTORIES + INTERFACE_LINK_LIBRARIES + INTERFACE_POSITION_INDEPENDENT_CODE + INTERFACE_SOURCES + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES + ) + get_property(is_set TARGET ${src_target} PROPERTY ${prop} SET) + if(is_set) + get_target_property(v ${src_target} ${prop}) + set_target_properties(${dest_target} PROPERTIES ${prop} "${v}") + # message(STATUS "set_target_properties(${dest_target} PROPERTIES ${prop} ${v})") + endif() + endforeach() + + # copy configuration-dependent properties + get_target_property(imported_configs ${src_target} + IMPORTED_CONFIGURATIONS) + + foreach(config ${imported_configs}) + foreach(prop_prefix ${config_dependent_props}) + set(prop ${prop_prefix}_${config}) + get_property(is_set TARGET ${src_target} PROPERTY ${prop} SET) + if(is_set) + get_target_property(v ${src_target} ${prop}) + set_target_properties(${dest_target} + PROPERTIES ${prop} "${v}") + # message(STATUS "set_target_properties(${dest_target} PROPERTIES ${prop} ${v})") + endif() + endforeach() + endforeach() +endfunction() diff --git a/build/cmake/glew-config.cmake b/build/cmake/glew-config.cmake new file mode 100644 index 0000000..8d2907a --- /dev/null +++ b/build/cmake/glew-config.cmake @@ -0,0 +1,46 @@ +# This config-module creates the following import libraries: +# +# - GLEW::glew and GLEW::glewmx shared libs +# - GLEW::glew_s and GLEW::glewmx_s static libs +# +# Additionally GLEW::GLEW and GLEW::GLEWMX will be created as an +# copy of either the shared (default) or the static libs. +# +# Dependending on the setting of BUILD_SHARED_LIBS at GLEW build time +# either the static or shared versions may not be available. +# +# Set GLEW_USE_STATIC_LIBS to OFF or ON to force using the shared +# or static libs for GLEW::GLEW and GLEW::GLEWMX +# + +include(${CMAKE_CURRENT_LIST_DIR}/glew-targets.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/CopyImportedTargetProperties.cmake) + +# decide which import library (glew/glew_s and glewmx/glewmx_s) +# needs to be copied to GLEW::GLEW and GLEW::GLEWMX +set(_glew_target_postfix "") +set(_glew_target_type SHARED) +if(DEFINED GLEW_USE_STATIC_LIBS) + # if defined, use only static or shared + if(GLEW_USE_STATIC_LIBS) + set(_glew_target_postfix "_s") + endif() + # else use static only if no shared +elseif(NOT TARGET GLEW::glew AND TARGET GLEW::glew_s) + set(_glew_target_postfix "_s") +endif() +if(_glew_target_postfix STREQUAL "") + set(_glew_target_type SHARED) +else() + set(_glew_target_type STATIC) +endif() + +# CMake doesn't allow creating ALIAS lib for an IMPORTED lib +# so create imported ones and copy the properties +foreach(_glew_target glew glewmx) + set(_glew_src_target "GLEW::${_glew_target}${_glew_target_postfix}") + string(TOUPPER "GLEW::${_glew_target}" _glew_dest_target) + add_library(${_glew_dest_target} ${_glew_target_type} IMPORTED) + # message(STATUS "add_library(${_glew_dest_target} ${_glew_target_type} IMPORTED)") + copy_imported_target_properties(${_glew_src_target} ${_glew_dest_target}) +endforeach() diff --git a/build/cmake/testbuild/CMakeLists.txt b/build/cmake/testbuild/CMakeLists.txt new file mode 100644 index 0000000..275e24d --- /dev/null +++ b/build/cmake/testbuild/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 2.8.12) +project(glew-cmake-test) + +find_package(GLEW REQUIRED CONFIG) +find_package(OpenGL REQUIRED) + +add_executable(cmake-test main.c) +set_target_properties(cmake-test PROPERTIES DEBUG_POSTFIX _d) +target_link_libraries(cmake-test PRIVATE GLEW::GLEW ${OPENGL_LIBRARIES}) +target_include_directories(cmake-test PRIVATE ${OPENGL_INCLUDE_DIR}) + +if(CMAKE_VERSION VERSION_LESS 3.0) + set(cgex $<CONFIGURATION>) +else() + set(cgex $<CONFIG>) +endif() + +target_compile_definitions(cmake-test PRIVATE + -DGLEW_CMAKE_TEST_CONFIG=${cgex} + -DGLEW_CMAKE_TEST_TARGET_FILE_NAME=$<TARGET_FILE_NAME:GLEW::GLEW> + -DGLEW_CMAKE_TEST_TARGET_TYPE=$<TARGET_PROPERTY:GLEW::GLEW,TYPE> + ) + +install(TARGETS cmake-test DESTINATION bin) diff --git a/build/cmake/testbuild/main.c b/build/cmake/testbuild/main.c new file mode 100644 index 0000000..5975817 --- /dev/null +++ b/build/cmake/testbuild/main.c @@ -0,0 +1,23 @@ +#include <GL/glew.h> + +#include <stdio.h> +#include <stdlib.h> + +#define S(x) SS(x) +#define SS(x) #x + +int main(int argc, char* argv[]) { + printf("GLEW CMake test, %s build\n", + S(GLEW_CMAKE_TEST_CONFIG)); + printf("-- linked to %s which is %s\n", + S(GLEW_CMAKE_TEST_TARGET_FILE_NAME), + S(GLEW_CMAKE_TEST_TARGET_TYPE)); + const GLubyte* v = glewGetString(GLEW_VERSION); + if(v) { + printf("-- glewGetString(GLEW_VERSION) returns %s\n-- test passed.\n", v); + return EXIT_SUCCESS; + } else { + printf("-- glewGetString(GLEW_VERSION) returns NULL\n-- test failed.\n"); + return EXIT_FAILURE; + } +} |