Commit f089255ad04fd3306ebca7d9dcc46b215202ece6

Authored by Henry Schreiner
Committed by GitHub
1 parent 51861584

Adding support for conan.io (#83)

* Adding fix for #75, rename requires to needs

* Removing check for install commands (should still be run in subproject)

* Adding conan build

* Some small changes to CMake

* Adding nicer Travis code

* Adding package test, find works now
.appveyor.yml
@@ -5,12 +5,17 @@ branches: @@ -5,12 +5,17 @@ branches:
5 install: 5 install:
6 - set PATH=C:\Python36;%PATH% 6 - set PATH=C:\Python36;%PATH%
7 - cmake --version 7 - cmake --version
  8 + - pip install conan
  9 + - conan user
  10 + - conan --version
8 11
9 build_script: 12 build_script:
10 - mkdir build 13 - mkdir build
11 - cd build 14 - cd build
12 - cmake .. -DCLI_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_GENERATOR="Visual Studio 14 2015" 15 - cmake .. -DCLI_SINGLE_FILE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_GENERATOR="Visual Studio 14 2015"
13 - cmake --build . 16 - cmake --build .
  17 + - cd ..
  18 + - conan create . CLIUtils/CLI11
14 19
15 test_script: 20 test_script:
16 - ctest --output-on-failure -C Debug 21 - ctest --output-on-failure -C Debug
.ci/run_codecov.sh
1 set -evx 1 set -evx
2 2
3 cd ${TRAVIS_BUILD_DIR} 3 cd ${TRAVIS_BUILD_DIR}
  4 +mkdir -p build
4 cd build 5 cd build
5 cmake .. -DCLI_SINGLE_FILE_TESTS=OFF -DCLI_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Coverage 6 cmake .. -DCLI_SINGLE_FILE_TESTS=OFF -DCLI_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Coverage
6 cmake --build . -- -j2 7 cmake --build . -- -j2
.gitignore
1 a.out* 1 a.out*
2 *.swp 2 *.swp
3 /*build* 3 /*build*
  4 +/test_package/build
4 /Makefile 5 /Makefile
5 /CMakeFiles/* 6 /CMakeFiles/*
6 /cmake_install.cmake 7 /cmake_install.cmake
.travis.yml
@@ -30,8 +30,11 @@ matrix: @@ -30,8 +30,11 @@ matrix:
30 - clang-tidy-3.9 30 - clang-tidy-3.9
31 env: 31 env:
32 - COMPILER=3.9 32 - COMPILER=3.9
33 - - CHECK_STYLE=yes  
34 - CLI_CXX_STD=14 33 - CLI_CXX_STD=14
  34 + script:
  35 + - cd "${TRAVIS_BUILD_DIR}"
  36 + - scripts/check_style.sh
  37 + - .ci/check_tidy.sh
35 - compiler: clang 38 - compiler: clang
36 addons: 39 addons:
37 apt: 40 apt:
@@ -39,8 +42,13 @@ matrix: @@ -39,8 +42,13 @@ matrix:
39 - clang-3.5 42 - clang-3.5
40 env: 43 env:
41 - COMPILER=3.5 44 - COMPILER=3.5
42 - - DEPLOY_MAT=yes  
43 - DOXYFILE=$TRAVIS_BUILD_DIR/docs/Doxyfile 45 - DOXYFILE=$TRAVIS_BUILD_DIR/docs/Doxyfile
  46 + after_success:
  47 + - |
  48 + if [ "${TRAVIS_BRANCH}" == "master" ] && [ "${TRAVIS_PULL_REQUEST}" == "false" ]
  49 + then
  50 + echo "Updating docs" && cd $TRAVIS_BUILD_DIR && .ci/build_docs.sh
  51 + fi
44 - compiler: gcc 52 - compiler: gcc
45 addons: 53 addons:
46 apt: 54 apt:
@@ -52,8 +60,12 @@ matrix: @@ -52,8 +60,12 @@ matrix:
52 - lcov 60 - lcov
53 env: 61 env:
54 - COMPILER=6 62 - COMPILER=6
55 - - COVERALLS=yes  
56 - CLI_CXX_STD=14 63 - CLI_CXX_STD=14
  64 + before_install:
  65 + - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
  66 + - cd $TRAVIS_BUILD_DIR
  67 + - . .ci/build_lcov.sh
  68 + - .ci/run_codecov.sh
57 - compiler: gcc 69 - compiler: gcc
58 addons: 70 addons:
59 apt: 71 apt:
@@ -61,38 +73,34 @@ matrix: @@ -61,38 +73,34 @@ matrix:
61 - g++-4.7 73 - g++-4.7
62 env: 74 env:
63 - COMPILER=4.7 75 - COMPILER=4.7
  76 + before_install:
  77 + - python -m pip install --user conan
  78 + - conan user
  79 + after_success:
  80 + - conan create . CLIUtils/CLI11
64 - os: osx 81 - os: osx
  82 + compiler: clang
65 before_install: 83 before_install:
  84 + - brew update
  85 + - echo 'brew "python"' > Brewfile
  86 + - echo 'brew "conan"' >> Brewfile
  87 + - brew bundle
66 - python -m ensurepip --user 88 - python -m ensurepip --user
  89 + - conan user
  90 + after_success:
  91 + - conan create . CLIUtils/CLI11
67 install: 92 install:
68 - python -c 'import sys; print(sys.version_info[:])' 93 - python -c 'import sys; print(sys.version_info[:])'
69 - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps" 94 - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
70 - if [ "$TRAVIS_OS_NAME" = "linux" ]; then cd $TRAVIS_BUILD_DIR && . .ci/prepare_altern.sh ; fi 95 - if [ "$TRAVIS_OS_NAME" = "linux" ]; then cd $TRAVIS_BUILD_DIR && . .ci/prepare_altern.sh ; fi
71 - if [ "$TRAVIS_OS_NAME" = "linux" ] ; then cd $TRAVIS_BUILD_DIR && . .ci/build_cmake.sh ; fi 96 - if [ "$TRAVIS_OS_NAME" = "linux" ] ; then cd $TRAVIS_BUILD_DIR && . .ci/build_cmake.sh ; fi
72 - if [ "$TRAVIS_OS_NAME" = "linux" ] ; then cd $TRAVIS_BUILD_DIR && . .ci/build_doxygen.sh ; fi 97 - if [ "$TRAVIS_OS_NAME" = "linux" ] ; then cd $TRAVIS_BUILD_DIR && . .ci/build_doxygen.sh ; fi
73 -- if [ -n "$COVERALLS" ] ; then cd $TRAVIS_BUILD_DIR && . .ci/build_lcov.sh ; fi  
74 - cd "${DEPS_DIR}" 98 - cd "${DEPS_DIR}"
75 - if [ "$(python -c 'import sys; print(sys.version_info[0])')" = "2" ] ; then python -m pip install --user pathlib ; fi 99 - if [ "$(python -c 'import sys; print(sys.version_info[0])')" = "2" ] ; then python -m pip install --user pathlib ; fi
76 - cmake --version 100 - cmake --version
77 script: 101 script:
78 - cd "${TRAVIS_BUILD_DIR}" 102 - cd "${TRAVIS_BUILD_DIR}"
79 -- |  
80 - if [ -n "$CHECK_STYLE" ]  
81 - then  
82 - scripts/check_style.sh  
83 - .ci/check_tidy.sh  
84 - else  
85 - .ci/travis.sh  
86 - fi  
87 -after_success:  
88 -- if [ -n "$COVERALLS" ] ; then cd $TRAVIS_BUILD_DIR && .ci/run_codecov.sh ; fi  
89 -- echo "${TRAVIS_BRANCH}"  
90 -- echo "${TRAVIS_PULL_REQUEST}"  
91 -- |  
92 - if [ "${TRAVIS_BRANCH}" == "master" ] && [ "${TRAVIS_PULL_REQUEST}" == "false" ] && [ -n "$DEPLOY_MAT" ]  
93 - then  
94 - echo "Updating docs" && cd $TRAVIS_BUILD_DIR && .ci/build_docs.sh  
95 - fi 103 +- .ci/travis.sh
96 deploy: 104 deploy:
97 provider: releases 105 provider: releases
98 api_key: 106 api_key:
CMakeLists.txt
1 cmake_minimum_required(VERSION 3.4 FATAL_ERROR) 1 cmake_minimum_required(VERSION 3.4 FATAL_ERROR)
2 2
3 -project(CLI11 CXX) 3 +project(CLI11 LANGUAGES CXX)
4 4
5 -SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) 5 +SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
6 6
7 set(CLI_CXX_STD "11" CACHE STRING "The CMake standard to require") 7 set(CLI_CXX_STD "11" CACHE STRING "The CMake standard to require")
8 8
@@ -51,10 +51,43 @@ endif() @@ -51,10 +51,43 @@ endif()
51 51
52 file(GLOB CLI_headers "${CMAKE_CURRENT_SOURCE_DIR}/include/CLI/*") 52 file(GLOB CLI_headers "${CMAKE_CURRENT_SOURCE_DIR}/include/CLI/*")
53 # To see in IDE, must be listed for target 53 # To see in IDE, must be listed for target
  54 +
54 add_library(CLI11 INTERFACE) 55 add_library(CLI11 INTERFACE)
55 -target_include_directories(CLI11 INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include") 56 +
  57 +# Duplicated because CMake adds the current source dir if you don't.
  58 +target_include_directories(CLI11 INTERFACE
  59 + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  60 + $<INSTALL_INTERFACE:include>)
  61 +
  62 +# Make add_subdirectory work like find_package
  63 +add_library(CLI11::CLI11 ALIAS CLI11)
  64 +
  65 +# This folder should be installed
56 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/CLI DESTINATION include) 66 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/CLI DESTINATION include)
57 67
  68 +# Use find_package on the installed package
  69 +# Since we have no custom code, we can directly write this
  70 +# to Config.cmake (otherwise we'd have a custom config and would
  71 +# import Targets.cmake
  72 +
  73 +# Make an export target
  74 +install(TARGETS CLI11
  75 + EXPORT CLI11Targets)
  76 +
  77 +# Install the export target as a file
  78 +install(EXPORT CLI11Targets
  79 + FILE CLI11Config.cmake
  80 + NAMESPACE CLI11::
  81 + DESTINATION lib/cmake/CLI11)
  82 +
  83 +# Use find_package on the installed package
  84 +export(TARGETS CLI11
  85 + NAMESPACE CLI11::
  86 + FILE CLI11Targets.cmake)
  87 +
  88 +# Register in the user cmake package registry
  89 +export(PACKAGE CLI11)
  90 +
58 # Single file test 91 # Single file test
59 find_package(PythonInterp) 92 find_package(PythonInterp)
60 if(CUR_PROJ AND PYTHONINTERP_FOUND) 93 if(CUR_PROJ AND PYTHONINTERP_FOUND)
cmake/AddGoogletest.cmake
@@ -15,7 +15,7 @@ download_project(PROJ googletest @@ -15,7 +15,7 @@ download_project(PROJ googletest
15 ) 15 )
16 16
17 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) 17 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
18 -add_subdirectory(${googletest_SOURCE_DIR} ${googletest_SOURCE_DIR}) 18 +add_subdirectory(${googletest_SOURCE_DIR} ${googletest_SOURCE_DIR} EXCLUDE_FROM_ALL)
19 19
20 if (CMAKE_CONFIGURATION_TYPES) 20 if (CMAKE_CONFIGURATION_TYPES)
21 add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} 21 add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
conanfile.py 0 โ†’ 100644
  1 +from conans import ConanFile, CMake
  2 +
  3 +class HelloConan(ConanFile):
  4 + name = "CLI11"
  5 + version = "1.3.0"
  6 + url = "https://github.com/CLIUtils/CLI11"
  7 + settings = "os", "compiler", "arch", "build_type"
  8 + license = "BSD 3 clause"
  9 + description = "Command Line Interface toolkit for C++11"
  10 +
  11 + exports_sources = "LICENCE", "include/*", "cmake/*", "CMakeLists.txt", "tests/*"
  12 +
  13 + def build(self): # this is not building a library, just tests
  14 + cmake = CMake(self)
  15 + cmake.definitions["CLI_EXAMPLES"] = "OFF"
  16 + cmake.definitions["CLI_SINGLE_FILE"] = "OFF"
  17 + cmake.configure()
  18 + cmake.build()
  19 + cmake.test()
  20 + cmake.install()
  21 +
  22 + def package_id(self):
  23 + self.info.header_only()
test_package/CMakeLists.txt 0 โ†’ 100644
  1 +project(PackageTest CXX)
  2 +cmake_minimum_required(VERSION 3.1)
  3 +
  4 +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
  5 +conan_basic_setup()
  6 +
  7 +set(CMAKE_CXX_STANDARD 11)
  8 +set(CMAKE_CXX_EXTENSIONS OFF)
  9 +set(CMAKE_CXX_STANDARD_REQUIRED ON)
  10 +
  11 +message(STATUS "${CMAKE_PREFIX_PATH}")
  12 +
  13 +find_package(CLI11 CONFIG REQUIRED)
  14 +
  15 +add_executable(example example.cpp)
  16 +target_link_libraries(example CLI11::CLI11)
test_package/conanfile.py 0 โ†’ 100644
  1 +from conans import ConanFile, CMake
  2 +import os
  3 +
  4 +class HelloTestConan(ConanFile):
  5 + settings = "os", "compiler", "build_type", "arch"
  6 + generators = "cmake"
  7 +
  8 + def build(self):
  9 + cmake = CMake(self)
  10 + cmake.configure()
  11 + cmake.build()
  12 +
  13 + def imports(self):
  14 + self.copy("*.dll", dst="bin", src="bin")
  15 + self.copy("*.dylib*", dst="bin", src="lib")
  16 +
  17 + def test(self):
  18 + os.chdir("bin")
  19 + self.run(".%sexample" % os.sep)
test_package/example.cpp 0 โ†’ 100644
  1 +// This file is a "Hello, world!" CLI11 program
  2 +
  3 +#include "CLI/CLI.hpp"
  4 +
  5 +#include <iostream>
  6 +
  7 +int main(int argc, char **argv) {
  8 +
  9 + CLI::App app("Some nice discription");
  10 +
  11 + int x = 0;
  12 + app.add_option("-x", x, "an integer value", true /* show default */);
  13 +
  14 + bool flag;
  15 + app.add_flag("-f,--flag", flag, "a flag option");
  16 +
  17 + CLI11_PARSE(app, argc, argv);
  18 +
  19 + return 0;
  20 +}