diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e85aeff..8f418f51 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,37 +1,13 @@ cmake_minimum_required(VERSION 3.0) project (yaml C) +include(GNUInstallDirs) set (YAML_VERSION_MAJOR 0) set (YAML_VERSION_MINOR 1) set (YAML_VERSION_PATCH 7) set (YAML_VERSION_STRING "${YAML_VERSION_MAJOR}.${YAML_VERSION_MINOR}.${YAML_VERSION_PATCH}") -option(BUILD_SHARED_LIBS "Build libyaml as a shared library" OFF) - -# -# Output directories for a build tree -# -if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -endif() - -# -# Install relative directories -# -if(NOT DEFINED INSTALL_LIB_DIR) - set(INSTALL_LIB_DIR lib) -endif() -if(NOT DEFINED INSTALL_BIN_DIR) - set(INSTALL_BIN_DIR bin) -endif() -if(NOT DEFINED INSTALL_INCLUDE_DIR) - set(INSTALL_INCLUDE_DIR include) -endif() -if(NOT DEFINED INSTALL_CMAKE_DIR) - set(INSTALL_CMAKE_DIR cmake) -endif() - # # Build library # @@ -46,36 +22,52 @@ set(SRCS src/writer.c ) +include_directories(${CMAKE_SOURCE_DIR}/src) +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) + +add_definitions(-DHAVE_CONFIG_H) +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + set(config_h ${CMAKE_CURRENT_BINARY_DIR}/include/config.h) configure_file( cmake/config.h.in ${config_h} ) -add_library(yaml ${SRCS}) - -if(NOT BUILD_SHARED_LIBS) - set_target_properties(yaml - PROPERTIES OUTPUT_NAME yaml_static - ) -endif() - -set_target_properties(yaml - PROPERTIES DEFINE_SYMBOL YAML_DECLARE_EXPORT +option(YAML_BUILD_STATIC "Build static library" TRUE) +if(YAML_BUILD_STATIC) + add_library(yaml-static STATIC ${SRCS}) + set_target_properties(yaml-static PROPERTIES OUTPUT_NAME yaml) + if(MSVC) + set_target_properties(yaml-static PROPERTIES PREFIX "lib") + # compiler: import, runtime, static + # msvc: yaml.lib, yaml.dll, libyaml.lib + # mingw: libyaml.dll.a, libyaml.dll, libyaml.a + endif() + set(YAML_LIB_TARGET yaml-static) + target_compile_definitions(yaml-static + PUBLIC + YAML_DECLARE_EXPORT=1 + YAML_DECLARE_STATIC=1 ) + list(APPEND YAML_INSTALL_TARGETS yaml-static) +endif() -target_compile_definitions(yaml - PRIVATE HAVE_CONFIG_H - PUBLIC - $<$>:YAML_DECLARE_STATIC> - $<$:_CRT_SECURE_NO_WARNINGS> - ) +option(YAML_BUILD_SHARED "Build shared library" TRUE) +if(YAML_BUILD_SHARED) + add_library(yaml SHARED ${SRCS}) + set(YAML_LIB_TARGET yaml) + set_target_properties(yaml PROPERTIES DEFINE_SYMBOL YAML_DECLARE_EXPORT) + list(APPEND YAML_INSTALL_TARGETS yaml) +endif() -target_include_directories(yaml PUBLIC - $ - $ - $ - ) +if(YAML_BUILD_SHARED AND YAML_BUILD_STATIC) + set_target_properties(yaml PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(yaml-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) +endif() # # Install rules @@ -84,15 +76,15 @@ install( FILES include/yaml.h ${config_h} - DESTINATION include COMPONENT Development + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT Development ) install( - TARGETS yaml + TARGETS ${YAML_INSTALL_TARGETS} EXPORT yamlTargets - RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT Runtime - LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT Development - ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT Development + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT Runtime + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT Development + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT Development ) # @@ -109,13 +101,11 @@ endif() include(CMakePackageConfigHelpers) # Configure 'yamlConfig.cmake' for a build tree -set(CONFIG_DIR_CONFIG ${PROJECT_BINARY_DIR}) set(config_file ${PROJECT_BINARY_DIR}/yamlConfig.cmake) configure_package_config_file( yamlConfig.cmake.in ${config_file} - INSTALL_DESTINATION ${PROJECT_BINARY_DIR} - PATH_VARS CONFIG_DIR_CONFIG + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake NO_CHECK_REQUIRED_COMPONENTS_MACRO ) @@ -131,18 +121,17 @@ configure_package_config_file( yamlConfig.cmake.in ${install_config_file} INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/${INSTALL_CMAKE_DIR} - PATH_VARS CONFIG_DIR_CONFIG NO_CHECK_REQUIRED_COMPONENTS_MACRO ) install( FILES ${install_config_file} - DESTINATION ${INSTALL_CMAKE_DIR} COMPONENT Development + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake COMPONENT Development ) # Configure and install 'yamlTargets.cmake' for an install tree install(EXPORT yamlTargets FILE yamlTargets.cmake - DESTINATION ${INSTALL_CMAKE_DIR} + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake COMPONENT Development ) @@ -156,5 +145,5 @@ write_basic_package_version_file( # ... and install for an install tree install( FILES ${config_version_file} - DESTINATION ${INSTALL_CMAKE_DIR} COMPONENT Development + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake COMPONENT Development ) diff --git a/appveyor.yml b/appveyor.yml index 24d24d20..23b9baa2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,8 +12,9 @@ build_script: # Use 32-bit default generator ("Visual Studio 12 2013" or "Visual Studio 14 2015") - cmake . -- cmake --build . --config release --clean-first -- ctest -C release +- cmake --build . --config Release --clean-first +- C:\cygwin\bin\sh -c "cp Release/yaml.dll tests/Release" +- ctest -C Release # # Autoconf based in-source build and tests under Cygwin using gcc diff --git a/src/yaml_private.h b/src/yaml_private.h index fe25141d..a49bdfcc 100644 --- a/src/yaml_private.h +++ b/src/yaml_private.h @@ -1,5 +1,5 @@ #if HAVE_CONFIG_H -#include +#include "config.h" #endif #include