diff options
author | Jean-Christophe Fillion-Robin <jchris.fillionr@kitware.com> | 2017-11-30 08:14:27 -0500 |
---|---|---|
committer | Ian Stapleton Cordasco <graffatcolmingov@gmail.com> | 2017-11-30 07:14:27 -0600 |
commit | fe3d086fa75a289d6e4085df6f855f4c88c8d7c2 (patch) | |
tree | 02cc993cdd3d0322861daf4eb09ad636afeb4cd3 /CMakeLists.txt | |
parent | 660242d6a418f0348c61057ed3052450527b3abf (diff) | |
download | libyaml-git-fe3d086fa75a289d6e4085df6f855f4c88c8d7c2.tar.gz |
Improve CMake build system
New build options
-----------------
* Add option BUILD_TESTING by default ON
See https://cmake.org/cmake/help/v2.8.12/cmake.html#module:CTest
* Simplify library type selection using standard option BUILD_SHARED_LIBS
See https://cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html
yamlConfig.cmake
----------------
* Generate and install yamlConfig.cmake, yamlConfigVersion.cmake and yamlTargets.cmake
* Bump CMake version and explicitly associate include dirs with targets
See https://cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#include-directories-and-usage-requirements
* Ensure building against libyaml using "find_package(yaml)" uses expected compile options: Set HAVE_CONFIG_H
as private compile option, YAML_DECLARE_STATIC as public
Testing
-------
* Build all examples from "tests" directory
CMake Best practices
--------------------
* configure "config.h" based on version info found in CMakeLists.txt
* Ensure buildsystem re-generation listing sources (best-practice)
It is not recommended to use GLOB to collect a list of source files from
the source tree. If no CMakeLists.txt file changes when a source is added
or removed then the generated build system cannot know when to ask CMake
to regenerate.
See https://cmake.org/cmake/help/v3.8/command/file.html
Compilation warnings
--------------------
* Set _CRT_SECURE_NO_WARNINGS if building using VisualStudio
This will avoid warnings like this one:
```
C:\projects\libyaml\tests\run-emitter.c(268): warning C4996: 'fopen':
This function or variable may be unsafe. Consider using fopen_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for
details.
```
Continuous Integration
----------------------
* travis: Install CMake >= 3.x using scikit-ci-addons
* Add comments to appveyor.yml and run-tests.sh
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 162 |
1 files changed, 147 insertions, 15 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index e47f5ef..5e85aef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,5 @@ -# Minimal CMake project for building a static library under Windows. -cmake_minimum_required (VERSION 2.8) +cmake_minimum_required(VERSION 3.0) project (yaml C) set (YAML_VERSION_MAJOR 0) @@ -8,21 +7,154 @@ set (YAML_VERSION_MINOR 1) set (YAML_VERSION_PATCH 7) set (YAML_VERSION_STRING "${YAML_VERSION_MAJOR}.${YAML_VERSION_MINOR}.${YAML_VERSION_PATCH}") -file (GLOB SRC src/*.c) +option(BUILD_SHARED_LIBS "Build libyaml as a shared library" OFF) -include_directories (include win32) -add_library (yaml SHARED ${SRC}) -set_target_properties(yaml PROPERTIES COMPILE_FLAGS "-DYAML_DECLARE_EXPORT -DHAVE_CONFIG_H") +# +# Output directories for a build tree +# +if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +endif() -add_library (yaml_static STATIC ${SRC}) -set_target_properties(yaml_static PROPERTIES COMPILE_FLAGS "-DYAML_DECLARE_STATIC -DHAVE_CONFIG_H") +# +# 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() -add_executable (test-version tests/test-version.c) -target_link_libraries(test-version yaml) -add_test(NAME version COMMAND test-version) +# +# Build library +# +set(SRCS + src/api.c + src/dumper.c + src/emitter.c + src/loader.c + src/parser.c + src/reader.c + src/scanner.c + src/writer.c + ) -add_executable (test-reader tests/test-reader.c) -target_link_libraries(test-reader yaml) -add_test(NAME reader COMMAND test-reader) +set(config_h ${CMAKE_CURRENT_BINARY_DIR}/include/config.h) +configure_file( + cmake/config.h.in + ${config_h} + ) -enable_testing() +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 + ) + +target_compile_definitions(yaml + PRIVATE HAVE_CONFIG_H + PUBLIC + $<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:YAML_DECLARE_STATIC> + $<$<BOOL:${MSVC}>:_CRT_SECURE_NO_WARNINGS> + ) + +target_include_directories(yaml PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include> + $<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}> + ) + +# +# Install rules +# +install( + FILES + include/yaml.h + ${config_h} + DESTINATION include COMPONENT Development + ) + +install( + TARGETS yaml + EXPORT yamlTargets + RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT Runtime + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT Development + ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT Development + ) + +# +# Add tests +# +include(CTest) # This module defines BUILD_TESTING option +if(BUILD_TESTING) + add_subdirectory(tests) +endif() + +# +# Generate 'yamlConfig.cmake', 'yamlConfigVersion.cmake' and 'yamlTargets.cmake' +# +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 + NO_CHECK_REQUIRED_COMPONENTS_MACRO + ) + +# Configure 'yamlTargets.cmake' for a build tree +export(TARGETS yaml + FILE ${PROJECT_BINARY_DIR}/yamlTargets.cmake + ) + +# Configure and install 'yamlConfig.cmake' for an install tree +set(CONFIG_DIR_CONFIG ${INSTALL_CMAKE_DIR}) +set(install_config_file ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/yamlConfig.cmake ) +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 + ) + +# Configure and install 'yamlTargets.cmake' for an install tree +install(EXPORT yamlTargets + FILE yamlTargets.cmake + DESTINATION ${INSTALL_CMAKE_DIR} + COMPONENT Development + ) + +# Configure 'yamlConfigVersion.cmake' for a build tree +set(config_version_file ${PROJECT_BINARY_DIR}/yamlConfigVersion.cmake) +write_basic_package_version_file( + ${config_version_file} + VERSION ${YAML_VERSION_STRING} + COMPATIBILITY AnyNewerVersion +) +# ... and install for an install tree +install( + FILES ${config_version_file} + DESTINATION ${INSTALL_CMAKE_DIR} COMPONENT Development + ) |