Merged CMakeLists.txt from issue 87 - now it's cleaner, and supports Windows much better

This commit is contained in:
jbeder
2011-03-02 04:37:55 +00:00
parent 3192d29e66
commit 0823af5369

View File

@@ -1,82 +1,244 @@
cmake_minimum_required(VERSION 2.6) ###
### CMake settings
project (YAML_CPP) ###
## Due to Mac OSX we need to keep compatibility with CMake 2.6
set(LIB_TYPE SHARED) # see http://www.cmake.org/Wiki/CMake_Policies
cmake_minimum_required(VERSION 2.6)
if(IPHONE) # see http://www.cmake.org/cmake/help/cmake-2-8-docs.html#policy:CMP0012
set(CMAKE_OSX_SYSROOT iphoneos4.2) if(POLICY CMP0012)
set(CMAKE_OSX_ARCHITECTURES "armv6;armv7") cmake_policy(SET CMP0012 OLD)
set(LIB_TYPE) endif()
endif(IPHONE) # see http://www.cmake.org/cmake/help/cmake-2-8-docs.html#policy:CMP0015
if(POLICY CMP0015)
if(CMAKE_COMPILER_IS_GNUCC) cmake_policy(SET CMP0015 OLD)
set(CMAKE_CXX_FLAGS "-O2 -Wall -Wextra -pedantic -Wno-long-long ${CMAKE_CXX_FLAGS}") endif()
endif(CMAKE_COMPILER_IS_GNUCC)
include(CheckCXXCompilerFlag)
if(MSVC)
set(LIB_TYPE) # I can't figure out how CMake handles Windows shared libraries
set(CMAKE_CXX_FLAGS "/W3 /wd4127 /wd4355 /D_SCL_SECURE_NO_WARNINGS ${CMAKE_CXX_FLAGS}") ###
endif(MSVC) ### Project settings
###
set(YAML_CPP_VERSION_MAJOR "0") project(YAML_CPP)
set(YAML_CPP_VERSION_MINOR "2")
set(YAML_CPP_VERSION_PATCH "5") set(YAML_CPP_VERSION_MAJOR "0")
set(YAML_CPP_VERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}.${YAML_CPP_VERSION_PATCH}") set(YAML_CPP_VERSION_MINOR "2")
set(YAML_CPP_VERSION_PATCH "5")
enable_testing() set(YAML_CPP_VERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}.${YAML_CPP_VERSION_PATCH}")
option(YAML_CPP_BUILD_TOOLS "Enables or disables testing and parse tools" true) enable_testing()
if(WIN32)
set(_library_dir bin) # .dll are in PATH, like executables ###
else(WIN32) ### Project options
set(_library_dir lib) ###
endif(WIN32) ## Project stuff
option(YAML_CPP_BUILD_TOOLS "Enable testing and parse tools" ON)
set(INCLUDE_INSTALL_DIR include/yaml-cpp)
set(LIB_INSTALL_DIR ${_library_dir}${LIB_SUFFIX}) ## Build options
# --> General
# # see http://www.cmake.org/cmake/help/cmake2.6docs.html#variable:BUILD_SHARED_LIBS
set(_INSTALL_DESTINATIONS # http://www.cmake.org/cmake/help/cmake2.6docs.html#command:add_library
RUNTIME DESTINATION bin option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF)
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
ARCHIVE DESTINATION lib${LIB_SUFFIX} # --> Apple
) option(APPLE_UNIVERSAL_BIN "Apple: Build universal binary" OFF)
#
file(GLOB public_headers include/yaml-cpp/[a-z]*.h) # --> Microsoft Visual C++
file(GLOB private_headers src/[a-z]*.h) # see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx
file(GLOB sources src/[a-z]*.cpp) # http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
option(MSVC_SHARED_RT "MSVC: Build with shared runtime libs (/MD)" ON)
include_directories(${YAML_CPP_SOURCE_DIR}/include) option(MSVC_STHREADED_RT "MSVC: Build with single-threaded static runtime libs (/ML until VS .NET 2003)" OFF)
add_library(yaml-cpp
${LIB_TYPE}
${public_headers} ###
${private_headers} ### Sources, headers, directories and libs
${sources} ###
) file(GLOB sources "src/[a-zA-Z]*.cpp")
set_target_properties(yaml-cpp PROPERTIES file(GLOB public_headers "include/yaml-cpp/[a-zA-Z]*.h")
VERSION "${YAML_CPP_VERSION}" file(GLOB private_headers "src/[a-zA-Z]*.h")
SOVERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}"
) if(VERBOSE)
message(STATUS "sources: ${sources}")
if(IPHONE) message(STATUS "public_headers: ${public_headers}")
set_target_properties(yaml-cpp PROPERTIES XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "3.0") message(STATUS "private_headers: ${private_headers}")
endif(IPHONE) endif()
install(TARGETS yaml-cpp ${_INSTALL_DESTINATIONS}) include_directories(${YAML_CPP_SOURCE_DIR}/include)
install(
FILES ${public_headers}
DESTINATION ${INCLUDE_INSTALL_DIR} ###
) ### General compilation settings
###
if(UNIX) if(BUILD_SHARED_LIBS)
set(PC_FILE ${CMAKE_BINARY_DIR}/yaml-cpp.pc) set(LABEL_SUFFIX "shared")
configure_file("yaml-cpp.pc.cmake" ${PC_FILE} @ONLY) else()
install(FILES ${PC_FILE} DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) set(LABEL_SUFFIX "static")
endif(UNIX) endif()
if(YAML_CPP_BUILD_TOOLS) if(APPLE)
add_subdirectory (test) if(APPLE_UNIVERSAL_BIN)
add_subdirectory (util) set(CMAKE_OSX_ARCHITECTURES ppc;i386)
endif(YAML_CPP_BUILD_TOOLS) endif()
endif()
if(IPHONE)
set(CMAKE_OSX_SYSROOT "iphoneos4.2")
set(CMAKE_OSX_ARCHITECTURES "armv6;armv7")
endif()
if(WIN32)
if(BUILD_SHARED_LIBS)
add_definitions(-D${PROJECT_NAME}_DLL) # use or build Windows DLL
endif()
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "C:/")
endif()
endif()
# GCC specialities
if(CMAKE_COMPILER_IS_GNUCXX)
### General stuff
if(WIN32)
set(CMAKE_SHARED_LIBRARY_PREFIX "") # DLLs do not have a "lib" prefix
set(CMAKE_IMPORT_LIBRARY_PREFIX "") # same for DLL import libs
set(CMAKE_LINK_DEF_FILE_FLAG "") # CMake workaround (2.8.3)
endif()
### Project stuff
set(GCC_EXTRA_OPTIONS "")
#
set(FLAG_TESTED "-Wextra")
check_cxx_compiler_flag(${FLAG_TESTED} FLAG_WEXTRA)
if(FLAG_WEXTRA)
set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} ${FLAG_TESTED}")
endif()
#
set(CMAKE_CXX_FLAGS "-O2 -Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long ${CMAKE_CXX_FLAGS}")
endif()
# Microsoft VisualC++ specialities
if(MSVC)
### General stuff
# a) Change MSVC runtime library settings (/MD[d], /MT[d], /ML[d] (single-threaded until VS 2003))
# plus set lib suffix for later use and project label accordingly
# see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx
# http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
set(LIB_RT_SUFFIX "md") # CMake defaults to /MD for MSVC
set(LIB_RT_OPTION "/MD")
#
if(NOT MSVC_SHARED_RT) # User wants to have static runtime libraries (/MT, /ML)
if(MSVC_STHREADED_RT) # User wants to have old single-threaded static runtime libraries
set(LIB_RT_SUFFIX "ml")
set(LIB_RT_OPTION "/ML")
if(NOT ${MSVC_VERSION} LESS 1400)
message(FATAL_ERROR "Single-threaded static runtime libraries (/ML) only available until VS .NET 2003 (7.1).")
endif()
else()
set(LIB_RT_SUFFIX "mt")
set(LIB_RT_OPTION "/MT")
endif()
# correct linker options
foreach(flag_var CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
foreach(config_name "" DEBUG RELEASE MINSIZEREL RELWITHDEBINFO)
set(var_name "${flag_var}")
if(NOT "${config_name}" STREQUAL "")
set(var_name "${var_name}_${config_name}")
endif()
string(REPLACE "/MD" "${LIB_RT_OPTION}" ${var_name} "${${var_name}}")
endforeach()
endforeach()
endif()
#
set(LABEL_SUFFIX "${LABEL_SUFFIX} ${LIB_RT_OPTION}")
# b) Change prefix for static libraries
set(CMAKE_STATIC_LIBRARY_PREFIX "lib") # to distinguish static libraries from DLL import libs
# c) Correct suffixes for static libraries
if(NOT BUILD_SHARED_LIBS)
### General stuff
set(LIB_TARGET_SUFFIX "${LIB_SUFFIX}${LIB_RT_SUFFIX}")
endif()
### Project stuff
# /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}")
endif()
###
### General install settings
###
if(WIN32)
set(_library_dir bin) # .dll are in PATH, like executables
else()
set(_library_dir lib)
endif()
set(INCLUDE_INSTALL_DIR include/yaml-cpp)
set(LIB_INSTALL_DIR "${_library_dir}${LIB_SUFFIX}")
set(_INSTALL_DESTINATIONS
RUNTIME DESTINATION bin
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
)
###
### Library
###
add_library(yaml-cpp
${sources}
${public_headers}
${private_headers}
)
set_target_properties(yaml-cpp PROPERTIES
VERSION "${YAML_CPP_VERSION}"
SOVERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}"
PROJECT_LABEL "yaml-cpp ${LABEL_SUFFIX}"
)
if(IPHONE)
set_target_properties(yaml-cpp PROPERTIES
XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "3.0"
)
endif()
if(MSVC)
if(NOT BUILD_SHARED_LIBS)
# correct library names
set_target_properties(yaml-cpp PROPERTIES
DEBUG_POSTFIX "${LIB_TARGET_SUFFIX}d"
RELEASE_POSTFIX "${LIB_TARGET_SUFFIX}"
MINSIZEREL_POSTFIX "${LIB_TARGET_SUFFIX}"
RELWITHDEBINFO_POSTFIX "${LIB_TARGET_SUFFIX}"
)
endif()
endif()
install(TARGETS yaml-cpp ${_INSTALL_DESTINATIONS})
install(
FILES ${public_headers}
DESTINATION ${INCLUDE_INSTALL_DIR}
)
if(UNIX)
set(PC_FILE ${CMAKE_BINARY_DIR}/yaml-cpp.pc)
configure_file("yaml-cpp.pc.cmake" ${PC_FILE} @ONLY)
install(FILES ${PC_FILE} DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
endif()
###
### Extras
###
if(YAML_CPP_BUILD_TOOLS)
add_subdirectory(test)
add_subdirectory(util)
endif()