summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorJean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>2017-11-30 08:14:27 -0500
committerIan Stapleton Cordasco <graffatcolmingov@gmail.com>2017-11-30 07:14:27 -0600
commitfe3d086fa75a289d6e4085df6f855f4c88c8d7c2 (patch)
tree02cc993cdd3d0322861daf4eb09ad636afeb4cd3 /CMakeLists.txt
parent660242d6a418f0348c61057ed3052450527b3abf (diff)
downloadlibyaml-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.txt162
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
+ )