mirror of
https://github.com/Perlmint/glew-cmake.git
synced 2024-11-11 09:33:49 +00:00
cmake: install config-module
Installs a config module if CMake verion >= 2.8.12. The config-module creates the import library targets built in the project (glew, glew_s, glewmx, glewmx_s) but in accordance with the FindGLEW module shipped with CMake, it also creates GLEW::GLEW and GLEW::GLEWMX. GLEW::GLEW and GLEW::GLEWMX will be simply copies of glew/glewmx or glew_s/glewmx_s. If both versions are available they alias the shared versions. The default behaviour can be changed either when installing or when using the package: - Set BUILD_SHARED_LIBS to OFF or ON when building and installing GLEW. This controls which libraries (shared or static) will be installed (and not which will be built). - Set GLEW_USE_STATIC_LIBS to OFF or ON before calling `find_package(GLEW CONFIG REQUIRED)` to force the config-module to create GLEW::GLEW and GLEWMX as aliases to glew/glewmx or glew_s/glewmx_s The script ./cmake-testbuild.sh is added to test the CMake build and config-module. See instructions there.
This commit is contained in:
parent
a4a87f9466
commit
d2e6823451
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -2,3 +2,4 @@
|
|||||||
*.png binary
|
*.png binary
|
||||||
build/*/* text eol=crlf
|
build/*/* text eol=crlf
|
||||||
CMakeLists.txt text eol=lf
|
CMakeLists.txt text eol=lf
|
||||||
|
build/cmake/* text eol=lf
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -15,3 +15,4 @@
|
|||||||
/bin
|
/bin
|
||||||
/lib
|
/lib
|
||||||
/tmp
|
/tmp
|
||||||
|
/out
|
||||||
|
@ -10,6 +10,8 @@ if (COMMAND cmake_policy)
|
|||||||
cmake_policy (SET CMP0003 NEW)
|
cmake_policy (SET CMP0003 NEW)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_DEBUG_POSTFIX d)
|
||||||
|
|
||||||
option (BUILD_UTILS "utilities" ON)
|
option (BUILD_UTILS "utilities" ON)
|
||||||
|
|
||||||
set (GLEW_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../..)
|
set (GLEW_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../..)
|
||||||
@ -55,7 +57,29 @@ set_target_properties (glewmx_s PROPERTIES COMPILE_DEFINITIONS "GLEW_STATIC;GLEW
|
|||||||
target_link_libraries (glewmx ${GLEW_LIBRARIES})
|
target_link_libraries (glewmx ${GLEW_LIBRARIES})
|
||||||
target_link_libraries (glewmx_s ${GLEW_LIBRARIES})
|
target_link_libraries (glewmx_s ${GLEW_LIBRARIES})
|
||||||
|
|
||||||
install ( TARGETS glew glew_s glewmx glewmx_s
|
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
|
RUNTIME DESTINATION bin
|
||||||
LIBRARY DESTINATION lib${LIB_SUFFIX}
|
LIBRARY DESTINATION lib${LIB_SUFFIX}
|
||||||
ARCHIVE DESTINATION lib${LIB_SUFFIX}
|
ARCHIVE DESTINATION lib${LIB_SUFFIX}
|
||||||
@ -95,3 +119,12 @@ install (FILES
|
|||||||
${GLEW_DIR}/include/GL/glew.h
|
${GLEW_DIR}/include/GL/glew.h
|
||||||
${GLEW_DIR}/include/GL/glxew.h
|
${GLEW_DIR}/include/GL/glxew.h
|
||||||
DESTINATION include/GL)
|
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()
|
||||||
|
88
build/cmake/CopyImportedTargetProperties.cmake
Normal file
88
build/cmake/CopyImportedTargetProperties.cmake
Normal file
@ -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()
|
46
build/cmake/glew-config.cmake
Normal file
46
build/cmake/glew-config.cmake
Normal file
@ -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()
|
24
build/cmake/testbuild/CMakeLists.txt
Normal file
24
build/cmake/testbuild/CMakeLists.txt
Normal file
@ -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 $<CONFIG>)
|
||||||
|
else()
|
||||||
|
set(cgex $<CONFIGURATION>)
|
||||||
|
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)
|
23
build/cmake/testbuild/main.c
Normal file
23
build/cmake/testbuild/main.c
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
70
cmake-testbuild.sh
Executable file
70
cmake-testbuild.sh
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# This script tests the CMake build:
|
||||||
|
#
|
||||||
|
# - builds the main CMakeLists.txt
|
||||||
|
# - builds and runs a small test app in a separate build tree so
|
||||||
|
# the config-module is tested, too
|
||||||
|
#
|
||||||
|
# Options (environment variables):
|
||||||
|
#
|
||||||
|
# - The variable BUILD_SHARED_LIBS will be forwarded to the CMake project
|
||||||
|
# that builds and installs the GLEW libraries. Set BUILD_SHARED_LIBS to
|
||||||
|
# ON or OFF to install only static or shared libs. Leave it unset to
|
||||||
|
# install both.
|
||||||
|
#
|
||||||
|
# Note: BUILD_SHARED_LIBS controls only what to install not what to build.
|
||||||
|
#
|
||||||
|
# - GLEW_USE_STATIC_LIBS will be forwarded to the test project that calls
|
||||||
|
# `find_package` to find GLEW. Set GLEW_USE_STATIC LIBS to ON or OFF force
|
||||||
|
# finding the shared or static versions of GLEW. Leave it unset to find
|
||||||
|
# the shared or what is available.
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
#
|
||||||
|
# Build & install shared + static, find default (shared)
|
||||||
|
#
|
||||||
|
# ./cmake-testbuild.shh
|
||||||
|
#
|
||||||
|
# Build & install shared + static, find static
|
||||||
|
#
|
||||||
|
# GLEW_USE_STATIC_LIBS=ON ./cmake-testbuild.sh
|
||||||
|
#
|
||||||
|
# Install static only (still build both)
|
||||||
|
#
|
||||||
|
# BUILD_SHARED_LIBS=OFF ./cmake-testbuild.sh
|
||||||
|
#
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
rm -rf out/include
|
||||||
|
rm -rf out/lib*
|
||||||
|
rm -rf out/bin
|
||||||
|
|
||||||
|
if [ -n "$BUILD_SHARED_LIBS" ]; then
|
||||||
|
bsl=-DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS
|
||||||
|
else
|
||||||
|
bsl=-UBUILD_SHARED_LIBS
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$GLEW_USE_STATIC_LIBS" ]; then
|
||||||
|
gusl=-DGLEW_USE_STATIC_LIBS=$GLEW_USE_STATIC_LIBS
|
||||||
|
else
|
||||||
|
gusl=-UGLEW_USE_STATIC_LIBS
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmake -Hbuild/cmake -Bout/build/glew -DCMAKE_INSTALL_PREFIX=${PWD}/out -DCMAKE_BUILD_TYPE=Debug $bsl
|
||||||
|
cmake --build out/build/glew --target install --config Debug
|
||||||
|
cmake out/build/glew -DCMAKE_BUILD_TYPE=Release
|
||||||
|
cmake --build out/build/glew --target install --config Release --clean-first
|
||||||
|
|
||||||
|
cmake -Hbuild/cmake/testbuild -Bout/build/cmake-testbuild -DCMAKE_INSTALL_PREFIX=${PWD}/out -DCMAKE_PREFIX_PATH=${PWD}/out -DCMAKE_BUILD_TYPE=Debug $gusl
|
||||||
|
cmake --build out/build/cmake-testbuild --target install --config Debug
|
||||||
|
|
||||||
|
cmake out/build/cmake-testbuild -DCMAKE_BUILD_TYPE=Release
|
||||||
|
cmake --build out/build/cmake-testbuild --target install --config Release --clean-first
|
||||||
|
|
||||||
|
export LD_LIBRARY_PATH=${PWD}/out/lib:$LD_LIBRARY_PATH
|
||||||
|
|
||||||
|
out/bin/cmake-test_d
|
||||||
|
out/bin/cmake-test
|
Loading…
Reference in New Issue
Block a user