mirror of
				https://github.com/Perlmint/glew-cmake.git
				synced 2025-11-03 22:04:16 +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
 | 
			
		||||
build/*/*      text eol=crlf
 | 
			
		||||
CMakeLists.txt text eol=lf
 | 
			
		||||
build/cmake/*  text eol=lf
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -15,3 +15,4 @@
 | 
			
		||||
/bin
 | 
			
		||||
/lib
 | 
			
		||||
/tmp
 | 
			
		||||
/out
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,8 @@ 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}/../..)
 | 
			
		||||
@ -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_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
 | 
			
		||||
          LIBRARY 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/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()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										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