diff --git a/CMakeLists.txt b/CMakeLists.txt index 58050201..1ee1e50c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,7 +72,107 @@ else () check_symbol_exists(open fcntl.h HAVE_OPEN) endif () -add_subdirectory(include/fmt) +function(add_headers VAR) + set(headers ${${VAR}}) + foreach (header ${ARGN}) + set(headers ${headers} include/fmt/${header}) + endforeach() + set(${VAR} ${headers} PARENT_SCOPE) +endfunction() + +# Define the fmt library, its includes and the needed defines. +# format.cc is added to FMT_HEADERS for the header-only configuration. +add_headers(FMT_HEADERS format.h format.cc locale.h ostream.h ostream.cc + printf.h printf.cc string.h time.h write.h) +if (HAVE_OPEN) + add_headers(FMT_HEADERS posix.h) + add_headers(FMT_SOURCES posix.cc) +endif () + +add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst) + +option(FMT_CPPFORMAT "Build cppformat library for backward compatibility." OFF) +if (FMT_CPPFORMAT) + message(WARNING "The cppformat library is deprecated, use fmt instead.") + add_library(cppformat ${FMT_SOURCES} ${FMT_HEADERS}) +endif () + +# Starting with CMake 3.1 the CXX_STANDARD property can be used instead. +target_compile_options(fmt PUBLIC ${CPP14_FLAG}) +if (FMT_PEDANTIC) + target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS}) +endif () + +target_include_directories(fmt PUBLIC + $ + $) + +set_target_properties(fmt PROPERTIES + VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}) + +if (BUILD_SHARED_LIBS) + if (UNIX AND NOT APPLE) + # Fix rpmlint warning: + # unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6. + target_link_libraries(fmt -Wl,--as-needed) + endif () + target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED) +endif () + +# Additionally define a header-only library when CMake is new enough. +if (CMAKE_VERSION VERSION_GREATER 3.1.0 OR CMAKE_VERSION VERSION_EQUAL 3.1.0) + add_library(fmt-header-only INTERFACE) + + target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1) + + target_include_directories(fmt-header-only INTERFACE + $ + $) +endif () + +# Install targets. +if (FMT_INSTALL) + include(CMakePackageConfigHelpers) + set(FMT_CMAKE_DIR lib/cmake/fmt CACHE STRING + "Installation directory for cmake files, relative to ${CMAKE_INSTALL_PREFIX}.") + set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake) + set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake) + set(targets_export_name fmt-targets) + + set (INSTALL_TARGETS fmt) + if (TARGET fmt-header-only) + set(INSTALL_TARGETS ${INSTALL_TARGETS} fmt-header-only) + endif () + + set(FMT_LIB_DIR lib CACHE STRING + "Installation directory for libraries, relative to ${CMAKE_INSTALL_PREFIX}.") + + # Generate the version, config and target files into the build directory. + write_basic_package_version_file( + ${version_config} + VERSION ${FMT_VERSION} + COMPATIBILITY AnyNewerVersion) + configure_package_config_file( + ${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in + ${project_config} + INSTALL_DESTINATION ${FMT_CMAKE_DIR}) + export(TARGETS ${INSTALL_TARGETS} + FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) + + # Install version, config and target files. + install( + FILES ${project_config} ${version_config} + DESTINATION ${FMT_CMAKE_DIR}) + install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}) + + # Install the library and headers. + install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name} + DESTINATION ${FMT_LIB_DIR}) + install(FILES ${FMT_HEADERS} DESTINATION include/fmt) + if (FMT_CPPFORMAT) + install(TARGETS cppformat DESTINATION ${FMT_LIB_DIR}) + endif () +endif () if (FMT_DOC) add_subdirectory(doc) diff --git a/include/fmt/CMakeLists.txt b/include/fmt/CMakeLists.txt deleted file mode 100644 index d53a3ae5..00000000 --- a/include/fmt/CMakeLists.txt +++ /dev/null @@ -1,95 +0,0 @@ -# Define the fmt library, its includes and the needed defines. -# format.cc is added to FMT_HEADERS for the header-only configuration. -set(FMT_HEADERS format.h format.cc locale.h ostream.h ostream.cc printf.h - printf.cc string.h time.h write.h) -if (HAVE_OPEN) - set(FMT_HEADERS ${FMT_HEADERS} posix.h) - set(FMT_SOURCES ${FMT_SOURCES} posix.cc) -endif () - -add_library(fmt - ${FMT_SOURCES} ${FMT_HEADERS} ../../README.rst ../../ChangeLog.rst) - -option(FMT_CPPFORMAT "Build cppformat library for backward compatibility." OFF) -if (FMT_CPPFORMAT) - message(WARNING "The cppformat library is deprecated, use fmt instead.") - add_library(cppformat ${FMT_SOURCES} ${FMT_HEADERS}) -endif () - -# Starting with cmake 3.1 the CXX_STANDARD property can be used instead. -target_compile_options(fmt PUBLIC ${CPP14_FLAG}) -if (FMT_PEDANTIC) - target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS}) -endif () - -target_include_directories(fmt PUBLIC - $ - $) - -set_target_properties(fmt PROPERTIES - VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}) - -if (BUILD_SHARED_LIBS) - if (UNIX AND NOT APPLE) - # Fix rpmlint warning: - # unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6. - target_link_libraries(fmt -Wl,--as-needed) - endif () - target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED) -endif () - -#------------------------------------------------------------------------------ -# additionally define a header only library when cmake is new enough -if (CMAKE_VERSION VERSION_GREATER 3.1.0 OR CMAKE_VERSION VERSION_EQUAL 3.1.0) - add_library(fmt-header-only INTERFACE) - - target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1) - - target_include_directories(fmt-header-only INTERFACE - $ - $) -endif () - -# Install targets. -if (FMT_INSTALL) - include(CMakePackageConfigHelpers) - set(FMT_CMAKE_DIR lib/cmake/fmt CACHE STRING - "Installation directory for cmake files, relative to ${CMAKE_INSTALL_PREFIX}.") - set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake) - set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake) - set(targets_export_name fmt-targets) - - set (INSTALL_TARGETS fmt) - if (TARGET fmt-header-only) - set(INSTALL_TARGETS ${INSTALL_TARGETS} fmt-header-only) - endif () - - set(FMT_LIB_DIR lib CACHE STRING - "Installation directory for libraries, relative to ${CMAKE_INSTALL_PREFIX}.") - - # Generate the version, config and target files into the build directory. - write_basic_package_version_file( - ${version_config} - VERSION ${FMT_VERSION} - COMPATIBILITY AnyNewerVersion) - configure_package_config_file( - ${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in - ${project_config} - INSTALL_DESTINATION ${FMT_CMAKE_DIR}) - export(TARGETS ${INSTALL_TARGETS} - FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) - - # Install version, config and target files. - install( - FILES ${project_config} ${version_config} - DESTINATION ${FMT_CMAKE_DIR}) - install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}) - - # Install the library and headers. - install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name} - DESTINATION ${FMT_LIB_DIR}) - install(FILES ${FMT_HEADERS} DESTINATION include/fmt) - if (FMT_CPPFORMAT) - install(TARGETS cppformat DESTINATION ${FMT_LIB_DIR}) - endif () -endif ()