toxcore/cmake/ModulePackage.cmake
Carsten Brandt 3520eee05d SO versions for cmake and libtool
this updates the version-sync script to generate proper SO versions
which will be used by cmake and libtool to create version symlinks
on the system when a library is installed as well as setting the SO
version in the binary.

To see what this does, you have to configure tox with a prefix:

    ./configure --prefix=/tmp/tox-with-libtool
    mkdir cbuild && cd cbuild && cmake -DCMAKE_INSTALL_PREFIX=/tmp/tox-with-cmake ..

Then run `make && make install`.

in both instances you should see the following installed in `lib/`:

    libtoxcore.so -> libtoxcore.so.1.4.0
    libtoxcore.so.1 -> libtoxcore.so.1.4.0
    libtoxcore.so.1.4.0

inside the binary the soname should be the one with .1 and it should not
contain the full version:

    $ objdump -p libtoxcore.so.1.4.0 | grep SONAME
      SONAME               libtoxcore.so.1
2017-01-18 11:20:07 +01:00

94 lines
2.7 KiB
CMake

option(ENABLE_SHARED "Build shared (dynamic) libraries for all modules" ON)
option(ENABLE_STATIC "Build static libraries for all modules" ON)
option(COMPILE_AS_CXX "Compile all C code as C++ code" OFF)
if(NOT ENABLE_SHARED AND NOT ENABLE_STATIC)
message(WARNING
"Both static and shared libraries are disabled; "
"enabling only shared libraries. Use -DENABLE_SHARED or -DENABLE_STATIC to "
"select one manually.")
set(ENABLE_SHARED ON)
endif()
find_package(PkgConfig REQUIRED)
if(COMPILE_AS_CXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__STDC_FORMAT_MACROS=1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__STDC_LIMIT_MACROS=1")
endif()
macro(set_source_language)
if(COMPILE_AS_CXX)
foreach(srcfile ${ARGN})
get_filename_component(srcext ${srcfile} EXT)
if(${srcext} STREQUAL ".c")
set_source_files_properties(${srcfile} PROPERTIES LANGUAGE CXX)
endif()
endforeach()
endif()
endmacro()
function(add_c_executable exec)
set_source_language(${ARGN})
add_executable(${exec} ${ARGN})
endfunction()
function(pkg_use_module mod)
pkg_search_module(${mod} ${ARGN})
if(${mod}_FOUND)
link_directories(${${mod}_LIBRARY_DIRS})
include_directories(${${mod}_INCLUDE_DIRS})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${${mod}_CFLAGS_OTHER}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${${mod}_CFLAGS_OTHER}" PARENT_SCOPE)
foreach(dir ${${mod}_INCLUDE_DIRS})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isystem ${dir}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${dir}" PARENT_SCOPE)
endforeach()
endif()
endfunction()
function(add_module lib)
set_source_language(${ARGN})
if(ENABLE_SHARED)
add_library(${lib}_shared SHARED ${ARGN})
set_target_properties(${lib}_shared PROPERTIES
OUTPUT_NAME ${lib}
VERSION ${SOVERSION}
SOVERSION ${SOVERSION_MAJOR}
)
install(TARGETS ${lib}_shared DESTINATION "lib")
endif()
if(ENABLE_STATIC)
add_library(${lib}_static STATIC ${ARGN})
set_target_properties(${lib}_static PROPERTIES OUTPUT_NAME ${lib})
install(TARGETS ${lib}_static DESTINATION "lib")
endif()
endfunction()
function(target_link_modules target)
if(TARGET ${target}_shared)
set(_targets ${_targets} ${target}_shared)
endif()
if(TARGET ${target}_static)
set(_targets ${_targets} ${target}_static)
endif()
if(NOT _targets)
set(_targets ${_targets} ${target})
endif()
foreach(target ${_targets})
foreach(dep ${ARGN})
if(TARGET ${dep}_shared)
target_link_libraries(${target} ${dep}_shared)
elseif(TARGET ${dep}_static)
target_link_libraries(${target} ${dep}_static)
else()
target_link_libraries(${target} ${dep})
endif()
endforeach()
endforeach()
endfunction()