diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e8a528d8..79fbacd52 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,12 +15,14 @@ if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) set(YAML_CPP_MAIN_PROJECT ON) endif() +# Include required modules include(CMakePackageConfigHelpers) include(CMakeDependentOption) include(CheckCXXCompilerFlag) include(GNUInstallDirs) include(CTest) +# Project options option(YAML_CPP_BUILD_CONTRIB "Enable yaml-cpp contrib in library" ON) option(YAML_CPP_BUILD_TOOLS "Enable parse tools" ON) option(YAML_BUILD_SHARED_LIBS "Build yaml-cpp shared library" ${BUILD_SHARED_LIBS}) @@ -30,126 +32,66 @@ option(YAML_CPP_DISABLE_UNINSTALL "Disable uninstallation of yaml-cpp" OFF) option(YAML_USE_SYSTEM_GTEST "Use system googletest if found" OFF) option(YAML_ENABLE_PIC "Use Position-Independent Code " ON) +# Dependent options cmake_dependent_option(YAML_CPP_BUILD_TESTS "Enable yaml-cpp tests" OFF "BUILD_TESTING;YAML_CPP_MAIN_PROJECT" OFF) cmake_dependent_option(YAML_MSVC_SHARED_RT "MSVC: Build yaml-cpp with shared runtime libs (/MD)" ON "CMAKE_SYSTEM_NAME MATCHES Windows" OFF) + +# Installation paths set(YAML_CPP_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/yaml-cpp" CACHE STRING "Path to install the CMake package to") - + +# Find clang-format if formatting is enabled if (YAML_CPP_FORMAT_SOURCE) find_program(YAML_CPP_CLANG_FORMAT_EXE NAMES clang-format) endif() +# Set shared/static label if (YAML_BUILD_SHARED_LIBS) - set(yaml-cpp-type SHARED) set(yaml-cpp-label-postfix "shared") else() - set(yaml-cpp-type STATIC) set(yaml-cpp-label-postfix "static") endif() +# Set up compiler flags and variables set(build-shared $) set(build-windows-dll $,${build-shared}>) set(not-msvc $>) set(msvc-shared_rt $) +# Set MSVC runtime library if (NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$:Debug>$<${msvc-shared_rt}:DLL>) endif() -set(contrib-pattern "src/contrib/*.cpp") -set(src-pattern "src/*.cpp") -if (CMAKE_VERSION VERSION_GREATER 3.12) - list(INSERT contrib-pattern 0 CONFIGURE_DEPENDS) - list(INSERT src-pattern 0 CONFIGURE_DEPENDS) -endif() - -file(GLOB yaml-cpp-contrib-sources ${contrib-pattern}) -file(GLOB yaml-cpp-sources ${src-pattern}) - +# Define MSVC runtime variables for use in subdirectories set(msvc-rt $) - set(msvc-rt-mtd-static $) set(msvc-rt-mt-static $) - set(msvc-rt-mtd-dll $) set(msvc-rt-mt-dll $) - set(backport-msvc-runtime $) -add_library(yaml-cpp ${yaml-cpp-type} "") -add_library(yaml-cpp::yaml-cpp ALIAS yaml-cpp) - -set_property(TARGET yaml-cpp - PROPERTY - MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY}) -set_property(TARGET yaml-cpp - PROPERTY - CXX_STANDARD_REQUIRED ON) - -if (NOT YAML_BUILD_SHARED_LIBS) - set_property(TARGET yaml-cpp PROPERTY POSITION_INDEPENDENT_CODE ${YAML_ENABLE_PIC}) -endif() - -target_include_directories(yaml-cpp - PUBLIC - $ - $ - PRIVATE - $) - -if (NOT DEFINED CMAKE_CXX_STANDARD) - set_target_properties(yaml-cpp - PROPERTIES - CXX_STANDARD 11) -endif() - -if(YAML_CPP_MAIN_PROJECT) - target_compile_options(yaml-cpp - PRIVATE - $<${not-msvc}:-Wall -Wextra -Wshadow -Weffc++ -Wno-long-long> - $<${not-msvc}:-pedantic -pedantic-errors>) -endif() - -target_compile_options(yaml-cpp - PRIVATE - $<$:-MTd> - $<$:-MT> - $<$:-MDd> - $<$:-MD> - - # /wd4127 = disable warning C4127 "conditional expression is constant" - # http://msdn.microsoft.com/en-us/library/6t66728h.aspx - # /wd4355 = disable warning C4355 "'this' : used in base member initializer list - # http://msdn.microsoft.com/en-us/library/3c594ae3.aspx - $<$:/W3 /wd4127 /wd4355>) - -target_compile_definitions(yaml-cpp - PUBLIC - $<$>:YAML_CPP_STATIC_DEFINE> - PRIVATE - $<${build-windows-dll}:${PROJECT_NAME}_DLL> - $<$>:YAML_CPP_NO_CONTRIB>) - -target_sources(yaml-cpp - PRIVATE - $<$:${yaml-cpp-contrib-sources}> - ${yaml-cpp-sources}) - +# Set debug postfix if (NOT DEFINED CMAKE_DEBUG_POSTFIX) set(CMAKE_DEBUG_POSTFIX "d") endif() +# Build the library +add_subdirectory(src) + +# Set version properties set_target_properties(yaml-cpp PROPERTIES VERSION "${PROJECT_VERSION}" SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" PROJECT_LABEL "yaml-cpp ${yaml-cpp-label-postfix}" DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}") +# Configure package files set(EXPORT_TARGETS yaml-cpp::yaml-cpp) configure_package_config_file( "${PROJECT_SOURCE_DIR}/yaml-cpp-config.cmake.in" @@ -164,6 +106,7 @@ write_basic_package_version_file( configure_file(yaml-cpp.pc.in yaml-cpp.pc @ONLY) +# Installation if (YAML_CPP_INSTALL) install(TARGETS yaml-cpp EXPORT yaml-cpp-targets @@ -184,14 +127,17 @@ if (YAML_CPP_INSTALL) DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) endif() +# Add tests if enabled if(YAML_CPP_BUILD_TESTS) add_subdirectory(test) endif() +# Add tools if enabled if(YAML_CPP_BUILD_TOOLS) add_subdirectory(util) endif() +# Add formatting target if enabled if (YAML_CPP_FORMAT_SOURCE AND YAML_CPP_CLANG_FORMAT_EXE) add_custom_target(format COMMAND clang-format --style=file -i $ @@ -201,7 +147,7 @@ if (YAML_CPP_FORMAT_SOURCE AND YAML_CPP_CLANG_FORMAT_EXE) VERBATIM) endif() -# uninstall target +# Add uninstall target if(YAML_CPP_INSTALL AND NOT YAML_CPP_DISABLE_UNINSTALL AND NOT TARGET uninstall) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" @@ -210,4 +156,4 @@ if(YAML_CPP_INSTALL AND NOT YAML_CPP_DISABLE_UNINSTALL AND NOT TARGET uninstall) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) -endif() +endif() \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..02ca1b104 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,89 @@ +# yaml-cpp source directory + +# Core source files +set(YAML_CPP_SOURCES + binary.cpp + convert.cpp + depthguard.cpp + directives.cpp + emit.cpp + emitfromevents.cpp + emitter.cpp + emitterstate.cpp + emitterutils.cpp + exceptions.cpp + exp.cpp + fptostring.cpp + memory.cpp + node.cpp + node_data.cpp + nodebuilder.cpp + nodeevents.cpp + null.cpp + ostream_wrapper.cpp + parse.cpp + parser.cpp + regex_yaml.cpp + scanner.cpp + scanscalar.cpp + scantag.cpp + scantoken.cpp + simplekey.cpp + singledocparser.cpp + stream.cpp + tag.cpp +) + +# Main library definition +if (YAML_BUILD_SHARED_LIBS) + set(yaml-cpp-type SHARED) +else() + set(yaml-cpp-type STATIC) +endif() + +# Create library target +add_library(yaml-cpp ${yaml-cpp-type} "") +add_library(yaml-cpp::yaml-cpp ALIAS yaml-cpp) + +# Set library properties +set_property(TARGET yaml-cpp + PROPERTY + MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY}) +set_property(TARGET yaml-cpp + PROPERTY + CXX_STANDARD_REQUIRED ON) + +if (NOT YAML_BUILD_SHARED_LIBS) + set_property(TARGET yaml-cpp PROPERTY POSITION_INDEPENDENT_CODE ${YAML_ENABLE_PIC}) +endif() + +# Add include directories +target_include_directories(yaml-cpp + PUBLIC + $ + $ + PRIVATE + $) + +# Set C++ standard +if (NOT DEFINED CMAKE_CXX_STANDARD) + set_target_properties(yaml-cpp + PROPERTIES + CXX_STANDARD 11) +endif() + +# Add compile options and definitions +target_compile_definitions(yaml-cpp + PUBLIC + $<$>:YAML_CPP_STATIC_DEFINE> + PRIVATE + $<${build-windows-dll}:${PROJECT_NAME}_DLL> + $<$>:YAML_CPP_NO_CONTRIB>) + +# Add sources to the target +target_sources(yaml-cpp + PRIVATE + ${YAML_CPP_SOURCES}) + +# Add contrib directory +add_subdirectory(contrib) diff --git a/src/contrib/CMakeLists.txt b/src/contrib/CMakeLists.txt new file mode 100644 index 000000000..ddeeb505e --- /dev/null +++ b/src/contrib/CMakeLists.txt @@ -0,0 +1,14 @@ +# yaml-cpp contrib directory + +# Contrib source files +set(YAML_CPP_CONTRIB_SOURCES + graphbuilder.cpp + graphbuilderadapter.cpp +) + +# Add contrib sources to the main target if enabled +if(YAML_CPP_BUILD_CONTRIB) + target_sources(yaml-cpp + PRIVATE + ${YAML_CPP_CONTRIB_SOURCES}) +endif()