From eb5694ca2a629f707736cbf203b21472ba6a0716 Mon Sep 17 00:00:00 2001 From: Antonin Descampe Date: Sun, 28 Nov 2010 17:07:04 +0000 Subject: [PATCH] changed cmake behaviour: executables are now always statically linked. When -DBUIL_SHARED_LIBS option is ON (the default), the shared versions of the libraries are also built (but executables remain linked against the static libraries). --- CHANGES | 3 ++ CMakeLists.txt | 2 +- INSTALL | 2 ++ codec/CMakeLists.txt | 6 ++-- jp3d/codec/CMakeLists.txt | 6 ++-- jp3d/libjp3dvm/CMakeLists.txt | 55 ++++++++++++++++++++++++++--------- jpwl/CMakeLists.txt | 50 +++++++++++++++++++++++++------ libopenjpeg/CMakeLists.txt | 50 +++++++++++++++++++++---------- mj2/CMakeLists.txt | 12 ++++---- 9 files changed, 133 insertions(+), 53 deletions(-) diff --git a/CHANGES b/CHANGES index b47b7c8f..8d4589a4 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,9 @@ What's New for OpenJPEG ! : changed + : added +November 28, 2010 +! [antonin] changed cmake behaviour: executables are now always statically linked. When -DBUIL_SHARED_LIBS option is ON (the default), the shared versions of the libraries are also built (but not linked against executables). + November 25, 2010 * [antonin] fix compilation and DLL creation of libopenjpeg with MSYS/MinGW (from vincent.torri, see issue 47 on googlecode) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c6cc2e5..cbabdb6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,7 @@ CONFIGURE_FILE( #----------------------------------------------------------------------------- # OpenJPEG build configuration options. -OPTION(BUILD_SHARED_LIBS "Build OpenJPEG with shared libraries." ON) +OPTION(BUILD_SHARED_LIBS "Build OpenJPEG shared libraries." ON) #----------------------------------------------------------------------------- SET (EXECUTABLE_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all executables.") diff --git a/INSTALL b/INSTALL index 9058d4e2..444e6a33 100644 --- a/INSTALL +++ b/INSTALL @@ -51,10 +51,12 @@ else: make clean Binaries are located in the 'bin' directory. +Executables are always statically linked. Main available cmake flags: * To specify the install path: '-DCMAKE_INSTALL_PREFIX=/path' * To build the shared libraries: '-DBUILD_SHARED_LIBS:bool=on' (default: 'ON') + Note: when using this option, shared libraries are built but executables remain linked against the corresponding static libraries. * To build the CODEC executables: '-DBUILD_CODEC:bool=on' (default: 'ON') * To build the MJ2 executables: '-DBUILD_MJ2:bool=on' (default: 'OFF') * To build the JPWL executables and JPWL library: '-DBUILD_JPWL:bool=on' (default: 'OFF') diff --git a/codec/CMakeLists.txt b/codec/CMakeLists.txt index 4a9d63df..cb2afead 100644 --- a/codec/CMakeLists.txt +++ b/codec/CMakeLists.txt @@ -16,9 +16,7 @@ ENDIF(DONT_HAVE_GETOPT) # Do the proper thing when building static...if only there was configured # headers or def files instead -IF(NOT BUILD_SHARED_LIBS) - ADD_DEFINITIONS(-DOPJ_STATIC) -ENDIF(NOT BUILD_SHARED_LIBS) +ADD_DEFINITIONS(-DOPJ_STATIC) # Headers file are located here: INCLUDE_DIRECTORIES( @@ -35,7 +33,7 @@ ENDIF(TIFF_FOUND) # Loop over all executables: FOREACH(exe j2k_to_image image_to_j2k j2k_dump) ADD_EXECUTABLE(${exe} ${exe}.c ${common_SRCS}) - TARGET_LINK_LIBRARIES(${exe} ${OPJ_PREFIX}openjpeg ${LCMS_LIB}) + TARGET_LINK_LIBRARIES(${exe} ${OPENJPEG_LIBRARY_NAME}.static ${LCMS_LIB}) IF(PNG_FOUND) TARGET_LINK_LIBRARIES(${exe} ${PNG_LIBRARIES}) ENDIF(PNG_FOUND) diff --git a/jp3d/codec/CMakeLists.txt b/jp3d/codec/CMakeLists.txt index 24595c7a..bf08bc00 100644 --- a/jp3d/codec/CMakeLists.txt +++ b/jp3d/codec/CMakeLists.txt @@ -27,16 +27,14 @@ ENDIF(DONT_HAVE_GETOPT) # Do the proper thing when building static...if only there was configured # headers or def files instead -IF(NOT BUILD_SHARED_LIBS) - ADD_DEFINITIONS(-DOPJ_STATIC) -ENDIF(NOT BUILD_SHARED_LIBS) +ADD_DEFINITIONS(-DOPJ_STATIC) #FIND_PACKAGE(TIFF REQUIRED) # Loop over all executables: FOREACH(exe jp3d_to_volume volume_to_jp3d) ADD_EXECUTABLE(${exe} ${exe}.c ${common_SRCS}) - TARGET_LINK_LIBRARIES(${exe} ${OPJ_PREFIX}openjp3dvm) # ${TIFF_LIBRARIES}) + TARGET_LINK_LIBRARIES(${exe} ${OPENJPEG_LIBRARY_NAME}_JP3D.static) # ${TIFF_LIBRARIES}) # On unix you need to link to the math library: IF(UNIX) TARGET_LINK_LIBRARIES(${exe} m) diff --git a/jp3d/libjp3dvm/CMakeLists.txt b/jp3d/libjp3dvm/CMakeLists.txt index 4c0fae41..4e9d241f 100644 --- a/jp3d/libjp3dvm/CMakeLists.txt +++ b/jp3d/libjp3dvm/CMakeLists.txt @@ -10,25 +10,54 @@ SET(JP3DVM_SRCS bio.c cio.c dwt.c event.c jp3d.c jp3d_lib.c mct.c mqc.c openjpeg.c pi.c raw.c t1.c t1_3d.c t2.c tcd.c tgt.c volume.c ) -# Pass proper definition to preprocessor to generate shared lib -IF(WIN32) - IF(BUILD_SHARED_LIBS) - ADD_DEFINITIONS(-DOPJ_EXPORTS) - ELSE(BUILD_SHARED_LIBS) - ADD_DEFINITIONS(-DOPJ_STATIC) - ENDIF(BUILD_SHARED_LIBS) -ENDIF(WIN32) +IF(LCMS_INCLUDE_DIR) + INCLUDE_DIRECTORIES( ${LCMS_INCLUDE_DIR} ) +ENDIF(LCMS_INCLUDE_DIR) -# Create the library -#ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS}) -ADD_LIBRARY(${OPJ_PREFIX}openjp3dvm ${JP3DVM_SRCS}) -SET_TARGET_PROPERTIES(${OPJ_PREFIX}openjp3dvm +# Build the static library +IF(WIN32) + ADD_DEFINITIONS(-DOPJ_STATIC) +ENDIF(WIN32) +ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}_JP3D.static STATIC ${JP3DVM_SRCS}) +SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JP3D.static PROPERTIES OUTPUT_NAME ${OPENJPEG_LIBRARY_NAME}_JP3D) +SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JP3D.static PROPERTIES VERSION 1.3.0 SOVERSION 1) +IF(LCMS_LIB) +TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME}_JP3D.static ${LCMS_LIB}) +ENDIF(LCMS_LIB) # Install library -INSTALL_TARGETS(/lib/ ${OPJ_PREFIX}openjp3dvm) +INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}_JP3D.static +DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries +) + +# If BUILD_SHARED_LIBS is ON, also build the shared library +IF(BUILD_SHARED_LIBS) + # replace flag for static build with flag for shared build + IF(WIN32) + REMOVE_DEFINITIONS(-DOPJ_STATIC) + ADD_DEFINITIONS(-DOPJ_EXPORTS) + ENDIF(WIN32) + # Create the shared library + ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}_JP3D.shared SHARED ${JP3DVM_SRCS}) + SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JP3D.shared PROPERTIES OUTPUT_NAME ${OPENJPEG_LIBRARY_NAME}_JP3D) + SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JP3D.shared + PROPERTIES + VERSION 1.3.0 + SOVERSION 1) + IF(LCMS_LIB) + TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME}_JP3D.shared ${LCMS_LIB}) + ENDIF(LCMS_LIB) + # Install library + INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}_JP3D.shared + DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries + ) + IF(WIN32) + REMOVE_DEFINITIONS(-DOPJ_EXPORTS) + ENDIF(WIN32) +ENDIF(BUILD_SHARED_LIBS) # Install includes files INSTALL(FILES openjpeg.h diff --git a/jpwl/CMakeLists.txt b/jpwl/CMakeLists.txt index ee4856d0..9788b717 100755 --- a/jpwl/CMakeLists.txt +++ b/jpwl/CMakeLists.txt @@ -33,19 +33,51 @@ IF(DONT_HAVE_GETOPT) ) ENDIF(DONT_HAVE_GETOPT) -ADD_LIBRARY(openjpeg_JPWL ${JPWL_SRCS} ${OPJ_SRCS}) -SET_TARGET_PROPERTIES(openjpeg_JPWL PROPERTIES - ${OPENJPEG_LIBRARY_PROPERTIES}) +IF(LCMS_INCLUDE_DIR) + INCLUDE_DIRECTORIES( ${LCMS_INCLUDE_DIR} ) +ENDIF(LCMS_INCLUDE_DIR) -INSTALL(TARGETS openjpeg_JPWL +# Build the static library +IF(WIN32) + ADD_DEFINITIONS(-DOPJ_STATIC) +ENDIF(WIN32) +ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}_JPWL.static STATIC ${JPWL_SRCS} ${OPJ_SRCS}) +SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JPWL.static PROPERTIES OUTPUT_NAME ${OPENJPEG_LIBRARY_NAME}_JPWL) +SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JPWL.static PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) +IF(LCMS_LIB) + TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME}_JPWL.static ${LCMS_LIB}) +ENDIF(LCMS_LIB) +# Install library +INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}_JPWL.static DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ) +# If BUILD_SHARED_LIBS is ON, also build the shared library +IF(BUILD_SHARED_LIBS) + # replace flag for static build with flag for shared build + IF(WIN32) + REMOVE_DEFINITIONS(-DOPJ_STATIC) + ADD_DEFINITIONS(-DOPJ_EXPORTS) + ENDIF(WIN32) + # Create the shared library + ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}_JPWL.shared SHARED ${JPWL_SRCS} ${OPJ_SRCS}) + SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JPWL.shared PROPERTIES OUTPUT_NAME ${OPENJPEG_LIBRARY_NAME}_JPWL) + SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JPWL.shared PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) + IF(LCMS_LIB) + TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME}_JPWL.shared ${LCMS_LIB}) + ENDIF(LCMS_LIB) + # Install library + INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}_JPWL.shared + DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries + ) + IF(WIN32) + REMOVE_DEFINITIONS(-DOPJ_EXPORTS) + ENDIF(WIN32) +ENDIF(BUILD_SHARED_LIBS) + # Do the proper thing when building static...if only there was configured # headers or def files instead -IF(NOT BUILD_SHARED_LIBS) - ADD_DEFINITIONS(-DOPJ_STATIC) -ENDIF(NOT BUILD_SHARED_LIBS) +ADD_DEFINITIONS(-DOPJ_STATIC) INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/libopenjpeg @@ -64,7 +96,7 @@ ADD_EXECUTABLE(JPWL_j2k_to_image ../codec/index.c ../codec/j2k_to_image.c ) -TARGET_LINK_LIBRARIES(JPWL_j2k_to_image ${OPJ_PREFIX}openjpeg_JPWL ${LCMS_LIB}) +TARGET_LINK_LIBRARIES(JPWL_j2k_to_image ${OPENJPEG_LIBRARY_NAME}_JPWL.static ${LCMS_LIB}) IF(PNG_FOUND) TARGET_LINK_LIBRARIES(JPWL_j2k_to_image ${PNG_LIBRARIES}) ENDIF(PNG_FOUND) @@ -81,7 +113,7 @@ ADD_EXECUTABLE(JPWL_image_to_j2k ../codec/index.c ../codec/image_to_j2k.c ) -TARGET_LINK_LIBRARIES(JPWL_image_to_j2k ${OPJ_PREFIX}openjpeg_JPWL ${LCMS_LIB}) +TARGET_LINK_LIBRARIES(JPWL_image_to_j2k ${OPENJPEG_LIBRARY_NAME}_JPWL.static ${LCMS_LIB}) IF(PNG_FOUND) TARGET_LINK_LIBRARIES(JPWL_image_to_j2k ${PNG_LIBRARIES}) ENDIF(PNG_FOUND) diff --git a/libopenjpeg/CMakeLists.txt b/libopenjpeg/CMakeLists.txt index 96192b7b..eb891d89 100644 --- a/libopenjpeg/CMakeLists.txt +++ b/libopenjpeg/CMakeLists.txt @@ -21,31 +21,51 @@ SET(OPENJPEG_SRCS tgt.c opj_convert.c ) + IF(LCMS_INCLUDE_DIR) INCLUDE_DIRECTORIES( ${LCMS_INCLUDE_DIR} ) ENDIF(LCMS_INCLUDE_DIR) -# Pass proper definition to preprocessor to generate shared lib -IF(WIN32) - IF(BUILD_SHARED_LIBS) - ADD_DEFINITIONS(-DOPJ_EXPORTS) - ELSE(BUILD_SHARED_LIBS) - ADD_DEFINITIONS(-DOPJ_STATIC) - ENDIF(BUILD_SHARED_LIBS) -ENDIF(WIN32) -# Create the library -ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS}) -SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME} PROPERTIES - ${OPENJPEG_LIBRARY_PROPERTIES}) +# Build the static library +IF(WIN32) + ADD_DEFINITIONS(-DOPJ_STATIC) +ENDIF(WIN32) +ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}.static STATIC ${OPENJPEG_SRCS}) +SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}.static PROPERTIES OUTPUT_NAME ${OPENJPEG_LIBRARY_NAME}) +SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}.static PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) IF(LCMS_LIB) - TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME} ${LCMS_LIB}) + TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME}.static ${LCMS_LIB}) ENDIF(LCMS_LIB) # Install library -INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME} +INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}.static EXPORT OpenJPEGTargets - DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries + DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ) +# If BUILD_SHARED_LIBS is ON, also build the shared library +IF(BUILD_SHARED_LIBS) + # replace flag for static build with flag for shared build + IF(WIN32) + REMOVE_DEFINITIONS(-DOPJ_STATIC) + ADD_DEFINITIONS(-DOPJ_EXPORTS) + ENDIF(WIN32) + # Create the shared library + ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}.shared SHARED ${OPENJPEG_SRCS}) + SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}.shared PROPERTIES OUTPUT_NAME ${OPENJPEG_LIBRARY_NAME}) + SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}.shared PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) + IF(LCMS_LIB) + TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME}.shared ${LCMS_LIB}) + ENDIF(LCMS_LIB) + # Install library + INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}.shared + EXPORT OpenJPEGTargets + DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries + ) + IF(WIN32) + REMOVE_DEFINITIONS(-DOPJ_EXPORTS) + ENDIF(WIN32) +ENDIF(BUILD_SHARED_LIBS) + # Install includes files INSTALL(FILES openjpeg.h DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR}/${subdir} COMPONENT Headers diff --git a/mj2/CMakeLists.txt b/mj2/CMakeLists.txt index d8ca819b..f678ee83 100644 --- a/mj2/CMakeLists.txt +++ b/mj2/CMakeLists.txt @@ -9,9 +9,7 @@ INCLUDE_DIRECTORIES( # Do the proper thing when building static...if only there was configured # headers or def files instead -IF(NOT BUILD_SHARED_LIBS) - ADD_DEFINITIONS(-DOPJ_STATIC) -ENDIF(NOT BUILD_SHARED_LIBS) +ADD_DEFINITIONS(-DOPJ_STATIC) ADD_EXECUTABLE(frames_to_mj2 frames_to_mj2.c @@ -19,7 +17,7 @@ ADD_EXECUTABLE(frames_to_mj2 mj2_convert.c mj2.c ) -TARGET_LINK_LIBRARIES(frames_to_mj2 ${OPJ_PREFIX}openjpeg ${LCMS_LIB}) +TARGET_LINK_LIBRARIES(frames_to_mj2 ${OPENJPEG_LIBRARY_NAME}.static ${LCMS_LIB}) IF(UNIX) TARGET_LINK_LIBRARIES(frames_to_mj2 m) ENDIF(UNIX) @@ -30,7 +28,7 @@ ADD_EXECUTABLE(mj2_to_frames mj2_convert.c mj2.c ) -TARGET_LINK_LIBRARIES(mj2_to_frames ${OPJ_PREFIX}openjpeg ${LCMS_LIB}) +TARGET_LINK_LIBRARIES(mj2_to_frames ${OPENJPEG_LIBRARY_NAME}.static ${LCMS_LIB}) IF(UNIX) TARGET_LINK_LIBRARIES(mj2_to_frames m) ENDIF(UNIX) @@ -38,7 +36,7 @@ ENDIF(UNIX) ADD_EXECUTABLE(extract_j2k_from_mj2 extract_j2k_from_mj2.c mj2.c ) -TARGET_LINK_LIBRARIES(extract_j2k_from_mj2 ${OPJ_PREFIX}openjpeg ${LCMS_LIB}) +TARGET_LINK_LIBRARIES(extract_j2k_from_mj2 ${OPENJPEG_LIBRARY_NAME}.static ${LCMS_LIB}) IF(UNIX) TARGET_LINK_LIBRARIES(extract_j2k_from_mj2 m) ENDIF(UNIX) @@ -46,7 +44,7 @@ ENDIF(UNIX) ADD_EXECUTABLE(wrap_j2k_in_mj2 wrap_j2k_in_mj2.c mj2.c ) -TARGET_LINK_LIBRARIES(wrap_j2k_in_mj2 ${OPJ_PREFIX}openjpeg ${LCMS_LIB}) +TARGET_LINK_LIBRARIES(wrap_j2k_in_mj2 ${OPENJPEG_LIBRARY_NAME}.static ${LCMS_LIB}) IF(UNIX) TARGET_LINK_LIBRARIES(wrap_j2k_in_mj2 m) ENDIF(UNIX)