diff --git a/CMakeLists.txt b/CMakeLists.txt index 35b43f4..ae4dea2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,15 +17,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - -IF(BIICODE) - include(biicode/cmake/tools) - ADD_BIICODE_TARGETS() - ACTIVATE_CPP11(INTERFACE ${BII_BLOCK_TARGET}) -RETURN() - -ENDIF() - cmake_minimum_required(VERSION 3.1) project(cxxopts) @@ -36,35 +27,62 @@ set(VERSION "1.2.0") option(CXXOPTS_BUILD_EXAMPLES "Set to ON to build examples" ON) option(CXXOPTS_BUILD_TESTS "Set to ON to build tests" OFF) -set(CXXOPTS_LINKER_LIBRARIES "") -set(CXXOPTS_USE_UNICODE_HELP FALSE CACHE BOOL "Use ICU Unicode library") -if(CXXOPTS_USE_UNICODE_HELP) - - find_package(PkgConfig) - - pkg_check_modules(ICU REQUIRED icu-uc) - - set(CXXOPTS_LINKER_LIBRARIES "${ICU_LDFLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ICU_CFLAGS} -DCXXOPTS_USE_UNICODE") +# request c++11 without gnu extension for the whole project and enable more warnings +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_EXTENSIONS OFF) +if(MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W2") +elseif(CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -Wshadow") endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -Wshadow") - add_library(cxxopts INTERFACE) -target_sources( - cxxopts INTERFACE - ${CMAKE_CURRENT_SOURCE_DIR}/include/cxxopts.hpp - ) -target_include_directories( - cxxopts INTERFACE - include/ - ) -target_link_libraries( - cxxopts - INTERFACE ${CXXOPTS_LINKER_LIBRARIES} - ) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/cxxopts.hpp DESTINATION include) +# optionally, enable unicode support using the ICU library +set(CXXOPTS_USE_UNICODE_HELP FALSE CACHE BOOL "Use ICU Unicode library") +if(CXXOPTS_USE_UNICODE_HELP) + find_package(PkgConfig) + pkg_check_modules(ICU REQUIRED icu-uc) + + target_link_libraries(cxxopts INTERFACE ${ICU_LDFLAGS}) + target_compile_options(cxxopts INTERFACE ${ICU_CFLAGS}) + target_compile_definitions(cxxopts INTERFACE CXXOPTS_USE_UNICODE) +endif() + +target_include_directories(cxxopts INTERFACE + $ + $ + ) + +include(CMakePackageConfigHelpers) +set(CXXOPTS_CMAKE_DIR "lib/cmake/cxxopts" CACHE STRING + "Installation directory for cmake files, relative to ${CMAKE_INSTALL_PREFIX}.") +set(version_config "${PROJECT_BINARY_DIR}/cxxopts-config-version.cmake") +set(project_config "${PROJECT_BINARY_DIR}/cxxopts-config.cmake") +set(targets_export_name cxxopts-targets) + +# Generate the version, config and target files into the build directory. +write_basic_package_version_file( + ${version_config} + VERSION ${VERSION} + COMPATIBILITY AnyNewerVersion) +configure_package_config_file( + ${PROJECT_SOURCE_DIR}/cxxopts-config.cmake.in + ${project_config} + INSTALL_DESTINATION ${CXXOPTS_CMAKE_DIR}) +export(TARGETS cxxopts NAMESPACE cxxopts:: + FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) + +# Install version, config and target files. +install( + FILES ${project_config} ${version_config} + DESTINATION ${CXXOPTS_CMAKE_DIR}) +install(EXPORT ${targets_export_name} DESTINATION ${CXXOPTS_CMAKE_DIR} + NAMESPACE cxxopts::) + +# Install the header file and export the target +install(TARGETS cxxopts EXPORT ${targets_export_name} DESTINATION lib) +install(FILES ${PROJECT_SOURCE_DIR}/include/cxxopts.hpp DESTINATION include) add_subdirectory(src) add_subdirectory(test) diff --git a/biicode.conf b/biicode.conf deleted file mode 100644 index f70f465..0000000 --- a/biicode.conf +++ /dev/null @@ -1,4 +0,0 @@ -# Biicode configuration file - -[requirements] - biicode/cmake: 3 diff --git a/cxxopts-config.cmake.in b/cxxopts-config.cmake.in new file mode 100644 index 0000000..c9efaf1 --- /dev/null +++ b/cxxopts-config.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include(${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake) +check_required_components(cxxopts) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9a79b08..eec97b7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,10 +21,4 @@ if(CXXOPTS_BUILD_EXAMPLES) add_executable(example example.cpp) target_link_libraries(example cxxopts) - - if (MSVC) - target_compile_options(example PUBLIC /W2) - elseif(CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") - target_compile_options(example PUBLIC -std=c++11 -Wall) - endif() endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 734e902..0920e90 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,13 +1,32 @@ if (CXXOPTS_BUILD_TESTS) add_executable(options_test main.cpp options.cpp) target_link_libraries(options_test cxxopts) - - if (MSVC) - target_compile_options(options_test PUBLIC /W2) - elseif(CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") - target_compile_options(options_test PUBLIC -std=c++11 -Wall) - endif() - add_test(options options_test) -endif() + # test if the targets are findable from the build directory + add_test(find-package-test ${CMAKE_CTEST_COMMAND} + -C ${CMAKE_BUILD_TYPE} + --build-and-test + "${CMAKE_CURRENT_SOURCE_DIR}/find-package-test" + "${CMAKE_CURRENT_BINARY_DIR}/find-package-test" + --build-generator ${CMAKE_GENERATOR} + --build-makeprogram ${CMAKE_MAKE_PROGRAM} + --build-options + "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + "-Dcxxopts_DIR=${PROJECT_BINARY_DIR}" + ) + + # test if the targets are findable when add_subdirectory is used + add_test(add-subdirectory-test ${CMAKE_CTEST_COMMAND} + -C ${CMAKE_BUILD_TYPE} + --build-and-test + "${CMAKE_CURRENT_SOURCE_DIR}/add-subdirectory-test" + "${CMAKE_CURRENT_BINARY_DIR}/add-subdirectory-test" + --build-generator ${CMAKE_GENERATOR} + --build-makeprogram ${CMAKE_MAKE_PROGRAM} + --build-options + "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + ) +endif() diff --git a/test/add-subdirectory-test/CMakeLists.txt b/test/add-subdirectory-test/CMakeLists.txt new file mode 100644 index 0000000..6c92299 --- /dev/null +++ b/test/add-subdirectory-test/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.1) + +project(cxxopts-test) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_EXTENSIONS OFF) + +add_subdirectory(../.. cxxopts EXCLUDE_FROM_ALL) + +add_executable(library-test "../../src/example.cpp") +target_link_libraries(library-test cxxopts) diff --git a/test/find-package-test/CMakeLists.txt b/test/find-package-test/CMakeLists.txt new file mode 100644 index 0000000..77d5831 --- /dev/null +++ b/test/find-package-test/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.1) + +project(cxxopts-test) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_EXTENSIONS OFF) + +find_package(cxxopts REQUIRED) + +add_executable(library-test "../../src/example.cpp") +target_link_libraries(library-test cxxopts::cxxopts)