From a061275eba5a91d0e0ce006b0ec187d31c60f7bf Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 25 Apr 2018 18:57:21 -0400 Subject: [PATCH] Moving to submodules, adding sanitizer (#111) --- .appveyor.yml | 1 + .gitmodules | 6 + cmake/AddGoogletest.cmake | 44 +----- cmake/DownloadProject.CMakeLists.cmake.in | 17 --- cmake/DownloadProject.cmake | 164 ---------------------- conanfile.py | 2 +- extern/googletest | 1 + extern/sanitizers | 1 + tests/CMakeLists.txt | 20 +++ 9 files changed, 32 insertions(+), 224 deletions(-) create mode 100644 .gitmodules delete mode 100644 cmake/DownloadProject.CMakeLists.cmake.in delete mode 100644 cmake/DownloadProject.cmake create mode 160000 extern/googletest create mode 160000 extern/sanitizers diff --git a/.appveyor.yml b/.appveyor.yml index 91a95a011..294511870 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -3,6 +3,7 @@ branches: - master install: + - git submodule update --init --recursive - set PATH=C:\Python36;%PATH% - cmake --version - pip install conan diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..2b5117d2c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "extern/googletest"] + path = extern/googletest + url = ../../google/googletest.git +[submodule "extern/sanitizers"] + path = extern/sanitizers + url = ../../arsenm/sanitizers-cmake diff --git a/cmake/AddGoogletest.cmake b/cmake/AddGoogletest.cmake index e6bf162ae..fb603e269 100644 --- a/cmake/AddGoogletest.cmake +++ b/cmake/AddGoogletest.cmake @@ -7,48 +7,8 @@ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) set(BUILD_SHARED_LIBS OFF) -if(CMAKE_VERSION VERSION_LESS 3.11) - set(UPDATE_DISCONNECTED_IF_AVAILABLE "UPDATE_DISCONNECTED 1") - include(DownloadProject) - download_project(PROJ googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.8.0 - UPDATE_DISCONNECTED 1 - QUIET - ) - - # CMake warning suppression will not be needed in version 1.9 - set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE BOOL "") - add_subdirectory(${googletest_SOURCE_DIR} ${googletest_SOURCE_DIR} EXCLUDE_FROM_ALL) -else() - include(FetchContent) - FetchContent_Declare(googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.8.0) - FetchContent_GetProperties(googletest) - if(NOT googletest_POPULATED) - FetchContent_Populate(googletest) - set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE BOOL "") - add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL) - endif() -endif() - - - -if(CMAKE_CONFIGURATION_TYPES) - add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} - --force-new-ctest-process --output-on-failure - --build-config "$") -else() - add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} - --force-new-ctest-process --output-on-failure) -endif() -set_target_properties(check PROPERTIES FOLDER "Scripts") - -#include_directories(${gtest_SOURCE_DIR}/include) - -# More modern way to do the last line, less messy but needs newish CMake: -# target_include_directories(gtest INTERFACE ${gtest_SOURCE_DIR}/include) +set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE BOOL "") +add_subdirectory("${CLI11_SOURCE_DIR}/extern/googletest" "${CLI11_BINARY_DIR}/extern/googletest" EXCLUDE_FROM_ALL) if(GOOGLE_TEST_INDIVIDUAL) diff --git a/cmake/DownloadProject.CMakeLists.cmake.in b/cmake/DownloadProject.CMakeLists.cmake.in deleted file mode 100644 index 89be4fdd4..000000000 --- a/cmake/DownloadProject.CMakeLists.cmake.in +++ /dev/null @@ -1,17 +0,0 @@ -# Distributed under the OSI-approved MIT License. See accompanying -# file LICENSE or https://github.com/Crascit/DownloadProject for details. - -cmake_minimum_required(VERSION 2.8.2) - -project(${DL_ARGS_PROJ}-download NONE) - -include(ExternalProject) -ExternalProject_Add(${DL_ARGS_PROJ}-download - ${DL_ARGS_UNPARSED_ARGUMENTS} - SOURCE_DIR "${DL_ARGS_SOURCE_DIR}" - BINARY_DIR "${DL_ARGS_BINARY_DIR}" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) diff --git a/cmake/DownloadProject.cmake b/cmake/DownloadProject.cmake deleted file mode 100644 index 798c74b63..000000000 --- a/cmake/DownloadProject.cmake +++ /dev/null @@ -1,164 +0,0 @@ -# Distributed under the OSI-approved MIT License. See accompanying -# file LICENSE or https://github.com/Crascit/DownloadProject for details. -# -# MODULE: DownloadProject -# -# PROVIDES: -# download_project( PROJ projectName -# [PREFIX prefixDir] -# [DOWNLOAD_DIR downloadDir] -# [SOURCE_DIR srcDir] -# [BINARY_DIR binDir] -# [QUIET] -# ... -# ) -# -# Provides the ability to download and unpack a tarball, zip file, git repository, -# etc. at configure time (i.e. when the cmake command is run). How the downloaded -# and unpacked contents are used is up to the caller, but the motivating case is -# to download source code which can then be included directly in the build with -# add_subdirectory() after the call to download_project(). Source and build -# directories are set up with this in mind. -# -# The PROJ argument is required. The projectName value will be used to construct -# the following variables upon exit (obviously replace projectName with its actual -# value): -# -# projectName_SOURCE_DIR -# projectName_BINARY_DIR -# -# The SOURCE_DIR and BINARY_DIR arguments are optional and would not typically -# need to be provided. They can be specified if you want the downloaded source -# and build directories to be located in a specific place. The contents of -# projectName_SOURCE_DIR and projectName_BINARY_DIR will be populated with the -# locations used whether you provide SOURCE_DIR/BINARY_DIR or not. -# -# The DOWNLOAD_DIR argument does not normally need to be set. It controls the -# location of the temporary CMake build used to perform the download. -# -# The PREFIX argument can be provided to change the base location of the default -# values of DOWNLOAD_DIR, SOURCE_DIR and BINARY_DIR. If all of those three arguments -# are provided, then PREFIX will have no effect. The default value for PREFIX is -# CMAKE_BINARY_DIR. -# -# The QUIET option can be given if you do not want to show the output associated -# with downloading the specified project. -# -# In addition to the above, any other options are passed through unmodified to -# ExternalProject_Add() to perform the actual download, patch and update steps. -# The following ExternalProject_Add() options are explicitly prohibited (they -# are reserved for use by the download_project() command): -# -# CONFIGURE_COMMAND -# BUILD_COMMAND -# INSTALL_COMMAND -# TEST_COMMAND -# -# Only those ExternalProject_Add() arguments which relate to downloading, patching -# and updating of the project sources are intended to be used. Also note that at -# least one set of download-related arguments are required. -# -# If using CMake 3.2 or later, the UPDATE_DISCONNECTED option can be used to -# prevent a check at the remote end for changes every time CMake is run -# after the first successful download. See the documentation of the ExternalProject -# module for more information. It is likely you will want to use this option if it -# is available to you. Note, however, that the ExternalProject implementation contains -# bugs which result in incorrect handling of the UPDATE_DISCONNECTED option when -# using the URL download method or when specifying a SOURCE_DIR with no download -# method. Fixes for these have been created, the last of which is scheduled for -# inclusion in CMake 3.8.0. Details can be found here: -# -# https://gitlab.kitware.com/cmake/cmake/commit/bdca68388bd57f8302d3c1d83d691034b7ffa70c -# https://gitlab.kitware.com/cmake/cmake/issues/16428 -# -# If you experience build errors related to the update step, consider avoiding -# the use of UPDATE_DISCONNECTED. -# -# EXAMPLE USAGE: -# -# include(DownloadProject) -# download_project(PROJ googletest -# GIT_REPOSITORY https://github.com/google/googletest.git -# GIT_TAG master -# UPDATE_DISCONNECTED 1 -# QUIET -# ) -# -# add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) -# -#======================================================================================== - - -set(_DownloadProjectDir "${CMAKE_CURRENT_LIST_DIR}") - -include(CMakeParseArguments) - -function(download_project) - - set(options QUIET) - set(oneValueArgs - PROJ - PREFIX - DOWNLOAD_DIR - SOURCE_DIR - BINARY_DIR - # Prevent the following from being passed through - CONFIGURE_COMMAND - BUILD_COMMAND - INSTALL_COMMAND - TEST_COMMAND - ) - set(multiValueArgs "") - - cmake_parse_arguments(DL_ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - # Hide output if requested - if (DL_ARGS_QUIET) - set(OUTPUT_QUIET "OUTPUT_QUIET") - else() - unset(OUTPUT_QUIET) - message(STATUS "Downloading/updating ${DL_ARGS_PROJ}") - endif() - - # Set up where we will put our temporary CMakeLists.txt file and also - # the base point below which the default source and binary dirs will be - if (NOT DL_ARGS_PREFIX) - set(DL_ARGS_PREFIX "${CMAKE_BINARY_DIR}") - endif() - if (NOT DL_ARGS_DOWNLOAD_DIR) - set(DL_ARGS_DOWNLOAD_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-download") - endif() - - # Ensure the caller can know where to find the source and build directories - if (NOT DL_ARGS_SOURCE_DIR) - set(DL_ARGS_SOURCE_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-src") - endif() - if (NOT DL_ARGS_BINARY_DIR) - set(DL_ARGS_BINARY_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-build") - endif() - set(${DL_ARGS_PROJ}_SOURCE_DIR "${DL_ARGS_SOURCE_DIR}" PARENT_SCOPE) - set(${DL_ARGS_PROJ}_BINARY_DIR "${DL_ARGS_BINARY_DIR}" PARENT_SCOPE) - - # Create and build a separate CMake project to carry out the download. - # If we've already previously done these steps, they will not cause - # anything to be updated, so extra rebuilds of the project won't occur. - configure_file("${_DownloadProjectDir}/DownloadProject.CMakeLists.cmake.in" - "${DL_ARGS_DOWNLOAD_DIR}/CMakeLists.txt") - execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - ${OUTPUT_QUIET} - WORKING_DIRECTORY "${DL_ARGS_DOWNLOAD_DIR}" - ) - if(result) - message(FATAL_ERROR "CMake step for ${DL_ARGS_PROJ} failed: ${result}") - endif() - execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - ${OUTPUT_QUIET} - WORKING_DIRECTORY "${DL_ARGS_DOWNLOAD_DIR}" - ) - if(result) - message(FATAL_ERROR "Build step for ${DL_ARGS_PROJ} failed: ${result}") - endif() - -endfunction() diff --git a/conanfile.py b/conanfile.py index 7a32f711d..efbaaca2e 100644 --- a/conanfile.py +++ b/conanfile.py @@ -18,7 +18,7 @@ class HelloConan(ConanFile): license = "BSD 3 clause" description = "Command Line Interface toolkit for C++11" - exports_sources = "LICENSE", "README.md", "include/*", "cmake/*", "CMakeLists.txt", "tests/*" + exports_sources = "LICENSE", "README.md", "include/*", "extern/*", "cmake/*", "CMakeLists.txt", "tests/*" def build(self): # this is not building a library, just tests cmake = CMake(self) diff --git a/extern/googletest b/extern/googletest new file mode 160000 index 000000000..ec44c6c16 --- /dev/null +++ b/extern/googletest @@ -0,0 +1 @@ +Subproject commit ec44c6c1675c25b9827aacd08c02433cccde7780 diff --git a/extern/sanitizers b/extern/sanitizers new file mode 160000 index 000000000..6947cff3a --- /dev/null +++ b/extern/sanitizers @@ -0,0 +1 @@ +Subproject commit 6947cff3a9c9305eb9c16135dd81da3feb4bf87f diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bb592ab4a..80e1a6a8a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,3 +1,21 @@ +if(NOT EXISTS "${CLI11_SOURCE_DIR}/extern/googletest/CMakeLists.txt") + message(FATAL_ERROR "You have requested tests be built, but googletest is not downloaded. Please run: + git submodule update --init") +endif() + +# If submodule is available, add sanitizers +# Set SANITIZE_ADDRESS, SANITIZE_MEMORY, SANITIZE_THREAD or SANITIZE_UNDEFINED +if(EXISTS "${CLI11_SOURCE_DIR}/extern/sanitizers/cmake/FindSanitizers.cmake") + set(CMAKE_MODULE_PATH "${CLI11_SOURCE_DIR}/extern/sanitizers/cmake" ${CMAKE_MODULE_PATH}) + find_package(Sanitizers) + if(SANITIZE_ADDRESS) + message(STATUS "You might want to use \"${ASan_WRAPPER}\" to run your program") + endif() +else() + macro(add_sanitizers) + endmacro() +endif() + set(GOOGLE_TEST_INDIVIDUAL OFF) include(AddGoogletest) @@ -23,6 +41,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) foreach(T ${CLI11_TESTS}) add_executable(${T} ${T}.cpp ${CLI11_headers}) + add_sanitizers(${T}) target_link_libraries(${T} PUBLIC CLI11) add_gtest(${T}) @@ -40,6 +59,7 @@ endforeach() foreach(T ${CLI11_MULTIONLY_TESTS}) add_executable(${T} ${T}.cpp ${CLI11_headers}) + add_sanitizers(${T}) target_link_libraries(${T} PUBLIC CLI11) add_gtest(${T})