* Unbundle jsoncpp * Remove forcing C++98 * Remove forcing CMAKE_BUILD_TYPE * Remove -fPIC globally * Fix LFS macro definitions * Make building static library optional * Use GNUInstallDirs conventions * Install .pc file See also: https://bugs.gentoo.org/show_bug.cgi?id=550144 Taken from https://github.com/pezmaster31/bamtools/pull/139 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,14 @@ project( BamTools ) # Cmake requirements -cmake_minimum_required( VERSION 2.6.4 ) +cmake_minimum_required( VERSION 3.0 ) + +# on macOS, MACOSX_RPATH is enabled by default on more recent versions +# of CMake. Disable this behaviour, and let user enable it if need be. +cmake_policy( SET CMP0042 OLD ) + +# Adhere to GNU filesystem layout conventions +include( GNUInstallDirs ) # Force the build directory to be different from source directory macro( ENSURE_OUT_OF_SOURCE_BUILD MSG ) @@ -34,18 +41,21 @@ set( BamTools_VERSION_MINOR 4 ) set( BamTools_VERSION_BUILD 1 ) -# set our library and executable destination dirs -set( EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin" ) -set( LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/lib" ) - # define compiler flags for all code -set( CMAKE_BUILD_TYPE Release ) -set( CMAKE_CXX_FLAGS_RELEASE "-std=c++98 ${CMAKE_CXX_FLAGS_RELEASE}" ) -add_definitions( -Wall -D_FILE_OFFSET_BITS=64 ) +add_definitions( -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE ) +add_compile_options( -Wall ) # ----------------------------------------------- # handle platform-/environment-specific defines +# Make building the static library optional +option( BUILD_STATIC "Build static libbamtools archive" OFF ) +if( BUILD_STATIC ) + set( BAMTOOLS_CMD_LDFLAGS BamTools-static ) +else() + set( BAMTOOLS_CMD_LDFLAGS BamTools ) +endif() + # If planning to run in Node.js environment, run: # cmake -DEnableNodeJS=true if( EnableNodeJS ) @@ -57,6 +67,11 @@ add_definitions( -DSUN_OS ) endif() +# find system JsonCpp +find_package( PkgConfig ) +pkg_search_module( JSONCPP jsoncpp>=1 ) + + # ------------------------------------------- # add our includes root path --- a/src/api/CMakeLists.txt +++ b/src/api/CMakeLists.txt @@ -10,7 +10,6 @@ # add compiler definitions add_definitions( -DBAMTOOLS_API_LIBRARY ) # (for proper exporting of library symbols) -add_definitions( -fPIC ) # (attempt to force PIC compiling on CentOS, not being set on shared libs by CMake) # fetch all internal source files add_subdirectory( internal ) @@ -31,18 +30,6 @@ ${InternalSources} ) -# create main BamTools API shared library -add_library( BamTools SHARED ${BamToolsAPISources} ) -set_target_properties( BamTools PROPERTIES - SOVERSION "2.4.1" - OUTPUT_NAME "bamtools" ) - -# create main BamTools API static library -add_library( BamTools-static STATIC ${BamToolsAPISources} ) -set_target_properties( BamTools-static PROPERTIES - OUTPUT_NAME "bamtools" - PREFIX "lib" ) - # link libraries automatically with zlib (and Winsock2, if applicable) if( WIN32 ) set( APILibs z ws2_32 ) @@ -50,12 +37,23 @@ set( APILibs z ) endif() -target_link_libraries( BamTools ${APILibs} ) -target_link_libraries( BamTools-static ${APILibs} ) +# create main BamTools API shared library +add_library( BamTools SHARED ${BamToolsAPISources} ) +set_target_properties( BamTools PROPERTIES + SOVERSION "2.4.1" + OUTPUT_NAME "bamtools" ) +target_link_libraries( BamTools ${APILibs} ) +install( TARGETS BamTools LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ) -# set library install destinations -install( TARGETS BamTools LIBRARY DESTINATION "lib/bamtools" RUNTIME DESTINATION "bin") -install( TARGETS BamTools-static ARCHIVE DESTINATION "lib/bamtools") +# create main BamTools API static library +if( BUILD_STATIC ) + add_library( BamTools-static STATIC ${BamToolsAPISources} ) + set_target_properties( BamTools-static PROPERTIES + OUTPUT_NAME "bamtools" + PREFIX "lib" ) + target_link_libraries( BamTools-static ${APILibs} ) + install( TARGETS BamTools-static ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" ) +endif() # export API headers include(../ExportHeader.cmake) --- a/src/bamtools.pc.in +++ b/src/bamtools.pc.in @@ -0,0 +1,11 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ + +Name: BamTools +Description: BamTools is a C++ library for reading and manipulating BAM files +Version: @BamTools_VERSION_MAJOR@.@BamTools_VERSION_MINOR@.@BamTools_VERSION_BUILD@ + +Libs: -L${libdir} -lbamtools +Cflags: -I${includedir} --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,3 +14,7 @@ include( ExportHeader.cmake ) set( SharedIncludeDir "shared" ) ExportHeader( SharedHeaders shared/bamtools_global.h ${SharedIncludeDir} ) + +# configure and install pkg-config file +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/bamtools.pc.in ${CMAKE_CURRENT_BINARY_DIR}/bamtools-1.pc @ONLY ) +install( FILES ${CMAKE_CURRENT_BINARY_DIR}/bamtools-1.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) --- a/src/ExportHeader.cmake +++ b/src/ExportHeader.cmake @@ -18,10 +18,10 @@ add_custom_command( TARGET ${MODULE} COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" - "${CMAKE_SOURCE_DIR}/include/${DEST}/${FILENAME}" ) + "${CMAKE_CURRENT_BINARY_DIR}/include/${DEST}/${FILENAME}" ) # make sure files are properly 'installed' - install( FILES "${FILE}" DESTINATION "include/bamtools/${DEST}" ) + install( FILES "${FILE}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/bamtools/${DEST}" ) endfunction( ExportHeader ) --- a/src/third_party/CMakeLists.txt +++ b/src/third_party/CMakeLists.txt @@ -5,5 +5,3 @@ # src/third-party/ # ========================== -# list third-party subdirectories to build in -add_subdirectory( jsoncpp ) --- a/src/toolkit/CMakeLists.txt +++ b/src/toolkit/CMakeLists.txt @@ -35,10 +35,14 @@ OUTPUT_NAME "bamtools" ) # make version info available in application -configure_file( bamtools_version.h.in ${BamTools_SOURCE_DIR}/src/toolkit/bamtools_version.h ) +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/bamtools_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/bamtools_version.h ) +include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) + +# set include paths for system JsonCpp +target_include_directories( bamtools_cmd PRIVATE ${JSONCPP_INCLUDE_DIRS} ) # define libraries to link -target_link_libraries( bamtools_cmd BamTools BamTools-utils jsoncpp ) +target_link_libraries( bamtools_cmd BamTools-utils ${BAMTOOLS_CMD_LDFLAGS} ${JSONCPP_LDFLAGS} ) # set application install destinations -install( TARGETS bamtools_cmd DESTINATION "bin") +install( TARGETS bamtools_cmd DESTINATION "${CMAKE_INSTALL_BINDIR}" ) --- a/src/utils/CMakeLists.txt +++ b/src/utils/CMakeLists.txt @@ -8,9 +8,8 @@ # list include paths include_directories( ${BamTools_SOURCE_DIR}/src/api ) -# add compiler definitions +# add compiler definitions add_definitions( -DBAMTOOLS_UTILS_LIBRARY ) # (for proper exporting of library symbols) -add_definitions( -fPIC ) # (attempt to force PIC compiling on CentOS, not being set on shared libs by CMake) # create BamTools utils library add_library( BamTools-utils STATIC