diff --git a/CMakeLists.txt b/CMakeLists.txt index f8a862f..507eb2c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,9 +46,8 @@ -cmake_minimum_required (VERSION 2.8) -# required for exports? cmake_minimum_required (VERSION 2.8.6) -project (jansson C) +cmake_minimum_required (VERSION 3.1) +project(jansson C) # Options option(JANSSON_BUILD_SHARED_LIBS "Build shared libraries." OFF) @@ -70,17 +69,17 @@ if (UNIX) endif () # Set some nicer output dirs. -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) -set(JANSSON_TEMP_DIR ${PROJECT_BINARY_DIR}/tmp) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) +set(JANSSON_TEMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/tmp) # Give the debug version a different postfix for windows, # so both the debug and release version can be built in the # same build-tree on Windows (MSVC). -if (WIN32) +if (WIN32 AND NOT CMAKE_DEBUG_POSTFIX) set(CMAKE_DEBUG_POSTFIX "_d") -endif (WIN32) +endif() # This is how I thought it should go # set (JANSSON_VERSION "2.3.1") @@ -104,12 +103,12 @@ include (CheckTypeSize) if (MSVC) # Turn off Microsofts "security" warnings. add_definitions( "/W3 /D_CRT_SECURE_NO_WARNINGS /wd4005 /wd4996 /nologo" ) - + if (JANSSON_STATIC_CRT) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") endif() - + endif() if (NOT WIN32 AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)) @@ -350,7 +349,7 @@ set(JANSSON_HDR_PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/utf.h ${CMAKE_CURRENT_BINARY_DIR}/private_include/jansson_private_config.h) -set(JANSSON_HDR_PUBLIC +set(JANSSON_HDR_PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h) @@ -359,24 +358,24 @@ source_group("Library Private Headers" FILES ${JANSSON_HDR_PRIVATE}) source_group("Library Public Headers" FILES ${JANSSON_HDR_PUBLIC}) if(JANSSON_BUILD_SHARED_LIBS) - add_library(jansson SHARED - ${JANSSON_SRC} - ${JANSSON_HDR_PRIVATE} - ${JANSSON_HDR_PUBLIC} + add_library(jansson SHARED + ${JANSSON_SRC} + ${JANSSON_HDR_PRIVATE} + ${JANSSON_HDR_PUBLIC} src/jansson.def) set_target_properties(jansson PROPERTIES VERSION ${JANSSON_VERSION} SOVERSION ${JANSSON_SOVERSION}) else() - add_library(jansson + add_library(jansson ${JANSSON_SRC} - ${JANSSON_HDR_PRIVATE} + ${JANSSON_HDR_PRIVATE} ${JANSSON_HDR_PUBLIC}) endif() if (JANSSON_EXAMPLES) - add_executable(simple_parse "${PROJECT_SOURCE_DIR}/examples/simple_parse.c") + add_executable(simple_parse "${CMAKE_CURRENT_SOURCE_DIR}/examples/simple_parse.c") target_link_libraries(simple_parse jansson) endif() @@ -386,12 +385,12 @@ if (JANSSON_BUILD_DOCS) find_package(Sphinx) if (NOT SPHINX_FOUND) - message(WARNING "Sphinx not found. Cannot generate documentation! + message(WARNING "Sphinx not found. Cannot generate documentation! Set -DJANSSON_BUILD_DOCS=OFF to get rid of this message.") else() if (Sphinx_VERSION_STRING VERSION_LESS 1.0) - message(WARNING "Your Sphinx version is too old! - This project requires Sphinx v1.0 or above to produce + message(WARNING "Your Sphinx version is too old! + This project requires Sphinx v1.0 or above to produce proper documentation (you have v${Sphinx_VERSION_STRING}). You will get output but it will have errors.") endif() @@ -444,7 +443,7 @@ if (JANSSON_BUILD_DOCS) list(APPEND DOC_TARGETS latex) endif() endif() - + # The doc target will build all documentation targets. add_custom_target(doc) @@ -528,7 +527,7 @@ if (NOT JANSSON_WITHOUT_TESTS) # Create executables and tests/valgrind tests for API tests. foreach (test ${api_tests}) - build_testprog(${test} ${PROJECT_SOURCE_DIR}/test/suites/api) + build_testprog(${test} ${CMAKE_CURRENT_SOURCE_DIR}/test/suites/api) if (JANSSON_TEST_WITH_VALGRIND) add_test(memcheck__${test} @@ -542,12 +541,12 @@ if (NOT JANSSON_WITHOUT_TESTS) endforeach () # Test harness for the suites tests. - build_testprog(json_process ${PROJECT_SOURCE_DIR}/test/bin) + build_testprog(json_process ${CMAKE_CURRENT_SOURCE_DIR}/test/bin) set(SUITE_TEST_CMD ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/json_process) set(SUITES encoding-flags valid invalid invalid-unicode) foreach (SUITE ${SUITES}) - file(GLOB TESTDIRS ${jansson_SOURCE_DIR}/test/suites/${SUITE}/*) + file(GLOB TESTDIRS test/suites/${SUITE}/*) foreach (TESTDIR ${TESTDIRS}) if (IS_DIRECTORY ${TESTDIR}) @@ -589,7 +588,7 @@ if (NOT JANSSON_WITHOUT_TESTS) # Enable using "make check" just like the autotools project. # By default cmake creates a target "make test" - add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} + add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS json_process ${api_tests}) endif () @@ -621,80 +620,67 @@ set(VERSION ${JANSSON_DISPLAY_VERSION}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/jansson.pc.in ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc @ONLY) -# Make sure the paths are absolute. +# Make sure the paths are relative. foreach(p LIB BIN INCLUDE CMAKE) set(var JANSSON_INSTALL_${p}_DIR) - if(NOT IS_ABSOLUTE "${${var}}") - set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") - endif() endforeach() -# Export targets (This is used for other CMake projects to easily find the libraries and include files). -export(TARGETS jansson - FILE "${PROJECT_BINARY_DIR}/JanssonTargets.cmake") -export(PACKAGE jansson) - # Generate the config file for the build-tree. -set(JANSSON__INCLUDE_DIRS - "${PROJECT_SOURCE_DIR}/include" - "${PROJECT_BINARY_DIR}/include") +set(JANSSON__INCLUDE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}/include" + "${CMAKE_CURRENT_BINARY_DIR}/include") set(JANSSON_INCLUDE_DIRS ${JANSSON__INCLUDE_DIRS} CACHE PATH "Jansson include directories") -configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in - ${PROJECT_BINARY_DIR}/JanssonConfig.cmake - @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/janssonConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/janssonConfig.cmake + @ONLY) + # Generate the config file for the installation tree. -file(RELATIVE_PATH - REL_INCLUDE_DIR - "${JANSSON_INSTALL_CMAKE_DIR}" - "${JANSSON_INSTALL_INCLUDE_DIR}") # Calculate the relative directory from the Cmake dir. +include(CMakePackageConfigHelpers) -# Note the EVENT_CMAKE_DIR is defined in JanssonConfig.cmake.in, -# we escape it here so it's evaluated when it is included instead -# so that the include dirs are given relative to where the -# config file is located. -set(JANSSON__INCLUDE_DIRS - "\${JANSSON_CMAKE_DIR}/${REL_INCLUDE_DIR}") -configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in - ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake - @ONLY) +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/cmake/janssonConfigVersion.cmake" + VERSION ${JANSSON_VERSION} + COMPATIBILITY ExactVersion +) -# Generate version info for both build-tree and install-tree. -configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfigVersion.cmake.in - ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake - @ONLY) - -# Define the public headers. -set_target_properties(jansson PROPERTIES PUBLIC_HEADER "${JANSSON_HDR_PUBLIC}") -#TODO: fix this. +configure_package_config_file( + "cmake/janssonConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake/janssonConfig.cmake" + INSTALL_DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" +) # # Install targets. # option(JANSSON_INSTALL "Generate installation target" ON) if (JANSSON_INSTALL) -install(TARGETS jansson - EXPORT JanssonTargets - LIBRARY DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib - ARCHIVE DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib - RUNTIME DESTINATION "${JANSSON_INSTALL_BIN_DIR}" COMPONENT lib # Windows DLLs - PUBLIC_HEADER DESTINATION "${JANSSON_INSTALL_INCLUDE_DIR}" COMPONENT dev) + install(TARGETS jansson + EXPORT janssonTargets + LIBRARY DESTINATION "lib" + ARCHIVE DESTINATION "lib" + RUNTIME DESTINATION "bin" + INCLUDES DESTINATION "include") -# Install the pkg-config. -install (FILES - ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc - DESTINATION ${JANSSON_INSTALL_LIB_DIR}/pkgconfig COMPONENT dev) + install(FILES ${JANSSON_HDR_PUBLIC} + DESTINATION "include") -# Install the configs. -install(FILES - ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake - ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake - DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" COMPONENT dev) + # Install the pkg-config. + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc + DESTINATION lib/pkgconfig) -# Install exports for the install-tree. -install(EXPORT JanssonTargets - DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" COMPONENT dev) + # Install the configs. + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/cmake/janssonConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/cmake/janssonConfigVersion.cmake + DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}") + + # Install exports for the install-tree. + install(EXPORT janssonTargets + NAMESPACE jansson:: + DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}") endif() # For use when simply using add_library from a parent project to build jansson. -set(JANSSON_LIBRARIES jansson CACHE STRING "Jansson libraries") +set(JANSSON_LIBRARIES jansson CACHE STRING "jansson libraries") diff --git a/cmake/JanssonConfig.cmake.in b/cmake/JanssonConfig.cmake.in deleted file mode 100644 index d00b3c4..0000000 --- a/cmake/JanssonConfig.cmake.in +++ /dev/null @@ -1,17 +0,0 @@ -# - Config file for the jansson package -# It defines the following variables -# JANSSON_INCLUDE_DIRS - include directories for FooBar -# JANSSON_LIBRARIES - libraries to link against - -# Get the path of the current file. -get_filename_component(JANSSON_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) - -# Set the include directories. -set(JANSSON_INCLUDE_DIRS "@JANSSON__INCLUDE_DIRS@") - -# Include the project Targets file, this contains definitions for IMPORTED targets. -include(${JANSSON_CMAKE_DIR}/JanssonTargets.cmake) - -# IMPORTED targets from JanssonTargets.cmake -set(JANSSON_LIBRARIES jansson) - diff --git a/cmake/JanssonConfigVersion.cmake.in b/cmake/JanssonConfigVersion.cmake.in deleted file mode 100644 index 83b0d74..0000000 --- a/cmake/JanssonConfigVersion.cmake.in +++ /dev/null @@ -1,11 +0,0 @@ -set(PACKAGE_VERSION "@JANSSON_DISPLAY_VERSION@") - -# Check whether the requested PACKAGE_FIND_VERSION is compatible -if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_COMPATIBLE FALSE) -else() - set(PACKAGE_VERSION_COMPATIBLE TRUE) - if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_EXACT TRUE) - endif() -endif() diff --git a/cmake/janssonConfig.cmake.in b/cmake/janssonConfig.cmake.in new file mode 100644 index 0000000..abd6793 --- /dev/null +++ b/cmake/janssonConfig.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/janssonTargets.cmake") +check_required_components("@PROJECT_NAME@")