diff --git a/CMakeLists.txt b/CMakeLists.txt index d440600d3..470f2d2ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,8 @@ else() option(WITH_SDL2APPLICATION "Build Sdl2Application library" OFF) endif() +option(BUILD_STATIC "Build static libraries (default are shared)" OFF) +cmake_dependent_option(BUILD_STATIC_PIC "Build static libraries with position-independent code" OFF "BUILD_STATIC" OFF) option(BUILD_TESTS "Build unit tests." OFF) if(BUILD_TESTS) enable_testing() @@ -95,6 +97,12 @@ if(TARGET_DESKTOP_GLES) set(MAGNUM_TARGET_DESKTOP_GLES 1) endif() +if(NOT BUILD_STATIC) + set(SHARED_OR_STATIC SHARED) +else() + set(SHARED_OR_STATIC STATIC) +endif() + # Installation paths include(CorradeLibSuffix) set(MAGNUM_BINARY_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0528e4ca5..0ae0fee42 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -156,9 +156,13 @@ add_library(MagnumObjects OBJECT ${Magnum_SRCS}) set_target_properties(MagnumObjects MagnumMathObjects PROPERTIES COMPILE_FLAGS "-DMagnumObjects_EXPORTS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") # Main library -add_library(Magnum SHARED +add_library(Magnum ${SHARED_OR_STATIC} $ $) +if(BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(Magnum PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) +endif() set(Magnum_LIBS ${CORRADE_UTILITY_LIBRARY} ${CORRADE_PLUGINMANAGER_LIBRARY}) @@ -216,12 +220,12 @@ endif() if(BUILD_TESTS) # Libraries with graceful assert for testing - add_library(MagnumMathTestLib SHARED + add_library(MagnumMathTestLib ${SHARED_OR_STATIC} $) set_target_properties(MagnumMathTestLib PROPERTIES COMPILE_FLAGS -DCORRADE_GRACEFUL_ASSERT) target_link_libraries(MagnumMathTestLib ${CORRADE_UTILITY_LIBRARY}) - add_library(MagnumTestLib SHARED + add_library(MagnumTestLib ${SHARED_OR_STATIC} $ $) set_target_properties(MagnumTestLib PROPERTIES COMPILE_FLAGS -DCORRADE_GRACEFUL_ASSERT) diff --git a/src/DebugTools/CMakeLists.txt b/src/DebugTools/CMakeLists.txt index 8d09c7346..a80d6e435 100644 --- a/src/DebugTools/CMakeLists.txt +++ b/src/DebugTools/CMakeLists.txt @@ -46,7 +46,11 @@ set(MagnumDebugTools_HEADERS magnumDebugToolsVisibility.h) -add_library(MagnumDebugTools SHARED ${MagnumDebugTools_SRCS}) +add_library(MagnumDebugTools ${SHARED_OR_STATIC} ${MagnumDebugTools_SRCS}) +if(BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(MagnumDebugTools PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) +endif() target_link_libraries(MagnumDebugTools Magnum MagnumMeshTools diff --git a/src/MeshTools/CMakeLists.txt b/src/MeshTools/CMakeLists.txt index b28bd7c77..fc0b2cd15 100644 --- a/src/MeshTools/CMakeLists.txt +++ b/src/MeshTools/CMakeLists.txt @@ -48,12 +48,21 @@ set(MagnumMeshTools_HEADERS # Set shared library flags for the objects, as they will be part of shared lib # TODO: fix when CMake sets target_EXPORTS for OBJECT targets as well add_library(MagnumMeshToolsObjects OBJECT ${MagnumMeshTools_SRCS}) -set_target_properties(MagnumMeshToolsObjects PROPERTIES COMPILE_FLAGS "-DMagnumMeshToolsObjects_EXPORTS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") +if(NOT BUILD_SHARED OR BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(MagnumMeshToolsObjects PROPERTIES COMPILE_FLAGS "-DMagnumMeshToolsObjects_EXPORTS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") +else() + set_target_properties(MagnumMeshToolsObjects PROPERTIES COMPILE_FLAGS "-DMagnumMeshToolsObjects_EXPORTS") +endif() # Main library -add_library(MagnumMeshTools SHARED +add_library(MagnumMeshTools ${SHARED_OR_STATIC} $ ${MagnumMeshTools_GracefulAssert_SRCS}) +if(BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(MagnumMeshTools PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) +endif() target_link_libraries(MagnumMeshTools Magnum) install(TARGETS MagnumMeshTools DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}) @@ -61,7 +70,7 @@ install(FILES ${MagnumMeshTools_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_DI if(BUILD_TESTS) # Library with graceful assert for testing - add_library(MagnumMeshToolsTestLib SHARED + add_library(MagnumMeshToolsTestLib ${SHARED_OR_STATIC} $ ${MagnumMeshTools_GracefulAssert_SRCS}) set_target_properties(MagnumMeshToolsTestLib PROPERTIES COMPILE_FLAGS "-DCORRADE_GRACEFUL_ASSERT -DMagnumMeshTools_EXPORTS") diff --git a/src/Physics/CMakeLists.txt b/src/Physics/CMakeLists.txt index aa4a2afe2..ef1d51a51 100644 --- a/src/Physics/CMakeLists.txt +++ b/src/Physics/CMakeLists.txt @@ -52,7 +52,11 @@ set(MagnumPhysics_HEADERS magnumPhysicsVisibility.h) -add_library(MagnumPhysics SHARED ${MagnumPhysics_SRCS}) +add_library(MagnumPhysics ${SHARED_OR_STATIC} ${MagnumPhysics_SRCS}) +if(BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(MagnumPhysics PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) +endif() target_link_libraries(MagnumPhysics Magnum MagnumSceneGraph) install(TARGETS MagnumPhysics DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}) diff --git a/src/Primitives/CMakeLists.txt b/src/Primitives/CMakeLists.txt index 24b978fa5..6c44f1c81 100644 --- a/src/Primitives/CMakeLists.txt +++ b/src/Primitives/CMakeLists.txt @@ -46,7 +46,11 @@ set(MagnumPrimitives_HEADERS magnumPrimitivesVisibility.h) -add_library(MagnumPrimitives SHARED ${MagnumPrimitives_SRCS}) +add_library(MagnumPrimitives ${SHARED_OR_STATIC} ${MagnumPrimitives_SRCS}) +if(BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(Magnum PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) +endif() target_link_libraries(MagnumPrimitives Magnum) install(TARGETS MagnumPrimitives DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}) diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 41bec81e3..e2658cd0f 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -73,10 +73,15 @@ set(MagnumSceneGraph_HEADERS # Set shared library flags for the objects, as they will be part of shared lib # TODO: fix when CMake sets target_EXPORTS for OBJECT targets as well add_library(MagnumSceneGraphObjects OBJECT ${MagnumSceneGraph_SRCS}) -set_target_properties(MagnumSceneGraphObjects PROPERTIES COMPILE_FLAGS "-DMagnumSceneGraphObjects_EXPORTS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") +if(NOT BUILD_STATIC OR BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(MagnumSceneGraphObjects PROPERTIES COMPILE_FLAGS "-DMagnumSceneGraphObjects_EXPORTS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") +else() + set_target_properties(MagnumSceneGraphObjects PROPERTIES COMPILE_FLAGS "-DMagnumSceneGraphObjects_EXPORTS") +endif() # SceneGraph library -add_library(MagnumSceneGraph SHARED +add_library(MagnumSceneGraph ${SHARED_OR_STATIC} $ ${MagnumSceneGraph_GracefulAssert_SRCS}) target_link_libraries(MagnumSceneGraph Magnum) @@ -86,7 +91,7 @@ install(FILES ${MagnumSceneGraph_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL_D if(BUILD_TESTS) # Library with graceful assert for testing - add_library(MagnumSceneGraphTestLib SHARED + add_library(MagnumSceneGraphTestLib ${SHARED_OR_STATIC} $ ${MagnumSceneGraph_GracefulAssert_SRCS}) set_target_properties(MagnumSceneGraphTestLib PROPERTIES COMPILE_FLAGS "-DCORRADE_GRACEFUL_ASSERT -DMagnumSceneGraph_EXPORTS") diff --git a/src/Shaders/CMakeLists.txt b/src/Shaders/CMakeLists.txt index 225b1b0c0..6d2a92cf0 100644 --- a/src/Shaders/CMakeLists.txt +++ b/src/Shaders/CMakeLists.txt @@ -49,7 +49,11 @@ set(MagnumShaders_HEADERS magnumShadersVisibility.h) -add_library(MagnumShaders SHARED ${MagnumShaders_SRCS}) +add_library(MagnumShaders ${SHARED_OR_STATIC} ${MagnumShaders_SRCS}) +if(BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(MagnumShaders PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) +endif() target_link_libraries(MagnumShaders Magnum) install(TARGETS MagnumShaders DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}) diff --git a/src/Text/CMakeLists.txt b/src/Text/CMakeLists.txt index 4ae369cdc..fa28db8d1 100644 --- a/src/Text/CMakeLists.txt +++ b/src/Text/CMakeLists.txt @@ -36,7 +36,11 @@ set(MagnumText_HEADERS magnumTextVisibility.h) -add_library(MagnumText SHARED ${MagnumText_SRCS}) +add_library(MagnumText ${SHARED_OR_STATIC} ${MagnumText_SRCS}) +if(BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(MagnumText PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) +endif() target_link_libraries(MagnumText Magnum MagnumTextureTools) install(TARGETS MagnumText DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR}) diff --git a/src/TextureTools/CMakeLists.txt b/src/TextureTools/CMakeLists.txt index 701f299e5..01e7a6811 100644 --- a/src/TextureTools/CMakeLists.txt +++ b/src/TextureTools/CMakeLists.txt @@ -37,7 +37,11 @@ set(MagnumTextureTools_HEADERS magnumTextureToolsVisibility.h) -add_library(MagnumTextureTools SHARED ${MagnumTextureTools_SRCS}) +add_library(MagnumTextureTools ${SHARED_OR_STATIC} ${MagnumTextureTools_SRCS}) +if(BUILD_STATIC_PIC) + # TODO: CMake 2.8.9 has this as POSITION_INDEPENDENT_CODE property + set_target_properties(MagnumTextureTools PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) +endif() target_link_libraries(MagnumTextureTools Magnum) install(TARGETS MagnumTextureTools DESTINATION ${MAGNUM_LIBRARY_INSTALL_DIR})