diff --git a/CMakeLists.txt b/CMakeLists.txt index db16097..6492fa6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,29 @@ option(MSVC_STHREADED_RT "MSVC: Build with single-threaded static runtime libs ( ### ### Sources, headers, directories and libs ### + +# From http://www.cmake.org/pipermail/cmake/2010-March/035992.html: +# function to collect all the sources from sub-directories +# into a single list +function(add_sources) + get_property(is_defined GLOBAL PROPERTY SRCS_LIST DEFINED) + if(NOT is_defined) + define_property(GLOBAL PROPERTY SRCS_LIST + BRIEF_DOCS "List of source files" + FULL_DOCS "List of all source files in the entire project") + endif() + # make absolute paths + set(SRCS) + foreach(s IN LISTS ARGN) + if(NOT IS_ABSOLUTE "${s}") + get_filename_component(s "${s}" ABSOLUTE) + endif() + list(APPEND SRCS "${s}") + endforeach() + # append to global list + set_property(GLOBAL APPEND PROPERTY SRCS_LIST "${SRCS}") +endfunction(add_sources) + set(header_directory "include/yaml-cpp/") file(GLOB sources "src/[a-zA-Z]*.cpp") @@ -68,6 +91,16 @@ else() add_definitions(-DYAML_CPP_NO_CONTRIB) endif() +set(library_sources + ${sources} + ${public_headers} + ${private_headers} + ${contrib_sources} + ${contrib_public_headers} + ${contrib_private_headers} +) +add_sources(${library_sources}) + if(VERBOSE) message(STATUS "sources: ${sources}") message(STATUS "public_headers: ${public_headers}") @@ -87,6 +120,9 @@ include_directories(${Boost_INCLUDE_DIRS}) ### ### General compilation settings ### +set(yaml_c_flags ${CMAKE_C_FLAGS}) +set(yaml_cxx_flags ${CMAKE_CXX_FLAGS}) + if(BUILD_SHARED_LIBS) set(LABEL_SUFFIX "shared") else() @@ -113,8 +149,9 @@ if(WIN32) endif() endif() -# GCC specialities -if(CMAKE_COMPILER_IS_GNUCXX) +# GCC or Clang specialities +if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR + "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") ### General stuff if(WIN32) set(CMAKE_SHARED_LIBRARY_PREFIX "") # DLLs do not have a "lib" prefix @@ -140,10 +177,10 @@ if(CMAKE_COMPILER_IS_GNUCXX) set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} ${FLAG_TESTED}") endif() # - set(CMAKE_CXX_FLAGS "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long ${CMAKE_CXX_FLAGS}") + set(yaml_cxx_flags "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long ${yaml_cxx_flags}") ### Make specific - if(${CMAKE_BUILD_TOOL} STREQUAL make OR ${CMAKE_BUILD_TOOL} STREQUAL gmake) + if(${CMAKE_BUILD_TOOL} MATCHES make OR ${CMAKE_BUILD_TOOL} MATCHES gmake) add_custom_target(debuggable $(MAKE) clean COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR} COMMENT "Adjusting settings for debug compilation" @@ -178,7 +215,7 @@ if(MSVC) endif() # correct linker options - foreach(flag_var CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + foreach(flag_var yaml_c_flags yaml_cxx_flags) foreach(config_name "" DEBUG RELEASE MINSIZEREL RELWITHDEBINFO) set(var_name "${flag_var}") if(NOT "${config_name}" STREQUAL "") @@ -204,7 +241,7 @@ if(MSVC) # /W3 = set warning level; see http://msdn.microsoft.com/en-us/library/thxezb7y.aspx # /wd4127 = disable warning C4127 "conditional expression is constant"; see 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 - set(CMAKE_CXX_FLAGS "/W3 /wd4127 /wd4355 /D_SCL_SECURE_NO_WARNINGS ${CMAKE_CXX_FLAGS}") + set(yaml_cxx_flags "/W3 /wd4127 /wd4355 /D_SCL_SECURE_NO_WARNINGS ${yaml_cxx_flags}") endif() @@ -232,13 +269,9 @@ set(_INSTALL_DESTINATIONS ### ### Library ### -add_library(yaml-cpp - ${sources} - ${public_headers} - ${private_headers} - ${contrib_sources} - ${contrib_public_headers} - ${contrib_private_headers} +add_library(yaml-cpp ${library_sources}) +set_target_properties(yaml-cpp PROPERTIES + COMPILE_FLAGS "${yaml_c_flags} ${yaml_cxx_flags}" ) set_target_properties(yaml-cpp PROPERTIES @@ -286,3 +319,12 @@ if(YAML_CPP_BUILD_TOOLS) add_subdirectory(test) add_subdirectory(util) endif() + +### Formatting +if(${CMAKE_BUILD_TOOL} MATCHES make OR ${CMAKE_BUILD_TOOL} MATCHES gmake) + get_property(all_sources GLOBAL PROPERTY SRCS_LIST) + add_custom_target(format + COMMAND clang-format --style=file -i ${all_sources} + COMMENT "Running clang-format" + VERBATIM) +endif() \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index dcdab35..606ccab 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,18 +1,24 @@ set(gtest_force_shared_crt ${MSVC_SHARED_RT} CACHE BOOL "Use shared (DLL) run-time lib even when Google Test built as a static lib.") add_subdirectory(gmock-1.7.0) -include_directories(gmock-1.7.0/gtest/include) -include_directories(gmock-1.7.0/include) +include_directories(SYSTEM gmock-1.7.0/gtest/include) +include_directories(SYSTEM gmock-1.7.0/include) if(WIN32 AND BUILD_SHARED_LIBS) add_definitions("-DGTEST_LINKED_AS_SHARED_LIBRARY") endif() +if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR + "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + set(yaml_test_flags "-Wno-c99-extensions -Wno-variadic-macros -Wno-sign-compare") +endif() + file(GLOB test_headers [a-z_]*.h) file(GLOB test_sources [a-z_]*.cpp integration/[a-z_]*.cpp node/[a-z_]*.cpp) file(GLOB test_new_api_sources new-api/[a-z]*.cpp) list(APPEND test_sources ${test_new_api_sources}) +add_sources(${test_sources} ${test_headers}) include_directories(${YAML_CPP_SOURCE_DIR}/test) @@ -20,6 +26,9 @@ add_executable(run-tests ${test_sources} ${test_headers} ) +set_target_properties(run-tests PROPERTIES + COMPILE_FLAGS "${yaml_c_flags} ${yaml_cxx_flags} ${yaml_test_flags}" +) target_link_libraries(run-tests yaml-cpp gtest gmock) #add_test(yaml-reader-test run-tests) diff --git a/util/CMakeLists.txt b/util/CMakeLists.txt index 28a3603..8a69631 100644 --- a/util/CMakeLists.txt +++ b/util/CMakeLists.txt @@ -1,8 +1,11 @@ +add_sources(parse.cpp) add_executable(parse parse.cpp) target_link_libraries(parse yaml-cpp) +add_sources(sandbox.cpp) add_executable(sandbox sandbox.cpp) target_link_libraries(sandbox yaml-cpp) +add_sources(read.cpp) add_executable(read read.cpp) target_link_libraries(read yaml-cpp)