From 93f7cb74e256eb818e4d254c9a00493fa9944e9d Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 10:13:28 +0100 Subject: [PATCH 01/30] Reset testing with last pkg.template Updated with new release --- LICENSE | 2 +- README.rst | 7 - appveyor.yml | 65 +- cmake/Hunter | 17 + cmake/configs/default.cmake | 753 +++++++++++++----- cmake/find/FindBoost.cmake | 26 + cmake/find/FindEigen.cmake | 11 - cmake/find/FindJPEG.cmake | 22 - cmake/find/FindOpenSSL.cmake | 20 +- cmake/find/FindSQLite3.cmake | 67 -- cmake/find/Findodb.cmake | 4 +- cmake/modules/hunter_add_package.cmake | 78 +- cmake/modules/hunter_add_version.cmake | 16 +- cmake/modules/hunter_apply_copy_rules.cmake | 4 +- .../modules/hunter_apply_gate_settings.cmake | 106 ++- cmake/modules/hunter_autotools_project.cmake | 354 +++----- .../hunter_boost_component_b2_args.cmake | 10 +- cmake/modules/hunter_cache_run.cmake | 4 +- cmake/modules/hunter_cacheable.cmake | 12 +- .../hunter_calculate_config_sha1.cmake | 141 +++- cmake/modules/hunter_calculate_self.cmake | 10 +- .../hunter_calculate_toolchain_sha1.cmake | 72 +- .../hunter_check_download_error_message.cmake | 10 +- cmake/modules/hunter_check_flush_needed.cmake | 20 +- cmake/modules/hunter_cmake_args.cmake | 48 +- cmake/modules/hunter_config.cmake | 157 +++- .../modules/hunter_configuration_types.cmake | 50 +- cmake/modules/hunter_create_args_file.cmake | 51 +- cmake/modules/hunter_create_cache_file.cmake | 75 +- .../hunter_create_cache_meta_directory.cmake | 59 +- .../hunter_create_dependency_entry.cmake | 10 +- cmake/modules/hunter_create_deps_info.cmake | 18 +- cmake/modules/hunter_download.cmake | 373 ++++++--- .../hunter_download_cache_meta_file.cmake | 201 +++-- .../hunter_download_cache_raw_file.cmake | 72 +- ...hunter_experimental_add_host_project.cmake | 44 +- cmake/modules/hunter_fatal_error.cmake | 12 +- cmake/modules/hunter_finalize.cmake | 89 ++- .../hunter_flush_cache_variables.cmake | 34 +- .../modules/hunter_generate_qt_5_5_info.cmake | 8 +- .../modules/hunter_generate_qt_5_6_info.cmake | 8 +- cmake/modules/hunter_generate_qt_info.cmake | 52 +- cmake/modules/hunter_get_package_deps.cmake | 10 +- .../hunter_get_package_deps_recurse.cmake | 6 +- .../hunter_init_not_found_counter.cmake | 8 +- cmake/modules/hunter_initialize.cmake | 41 +- .../modules/hunter_install_boost_config.cmake | 8 +- cmake/modules/hunter_internal_error.cmake | 4 +- cmake/modules/hunter_jobs_number.cmake | 41 +- .../hunter_libsodium_install_tools.cmake | 16 +- cmake/modules/hunter_load_from_cache.cmake | 23 +- cmake/modules/hunter_lock_directory.cmake | 40 +- cmake/modules/hunter_make_directory.cmake | 8 +- cmake/modules/hunter_pack_directory.cmake | 27 +- ...unter_patch_unrelocatable_text_files.cmake | 13 +- cmake/modules/hunter_pick_scheme.cmake | 14 +- cmake/modules/hunter_qt_add_module.cmake | 10 +- .../modules/hunter_register_dependency.cmake | 8 +- .../hunter_report_broken_package.cmake | 2 +- cmake/modules/hunter_save_to_cache.cmake | 63 +- .../modules/hunter_set_config_location.cmake | 6 +- cmake/modules/hunter_setup_msvc.cmake | 58 +- .../hunter_sleep_before_download.cmake | 4 +- .../hunter_test_string_not_empty.cmake | 11 - cmake/modules/hunter_unpack_directory.cmake | 162 +++- cmake/modules/hunter_user_error.cmake | 2 +- cmake/modules/hunter_wiki.cmake | 13 - cmake/projects/Android-Apk/hunter.cmake | 77 ++ .../projects/Android-Build-Tools/hunter.cmake | 35 + .../hunter.cmake | 22 + .../projects/Android-Google-APIs/hunter.cmake | 22 + .../Android-Google-Repository/hunter.cmake | 22 + .../hunter.cmake | 44 + .../Android-SDK-Platform-tools/hunter.cmake | 103 +++ .../Android-SDK-Platform/hunter.cmake | 11 + cmake/projects/Android-SDK-Tools/hunter.cmake | 34 + cmake/projects/Android-SDK/hunter.cmake | 33 + .../Android-Support-Repository/hunter.cmake | 11 + cmake/projects/Assimp/hunter.cmake | 24 + .../schemes/url_sha1_avahi_autotools.cmake.in | 18 +- cmake/projects/BZip2/hunter.cmake | 45 +- cmake/projects/Boost/atomic/hunter.cmake | 2 +- cmake/projects/Boost/chrono/hunter.cmake | 2 +- cmake/projects/Boost/context/hunter.cmake | 2 +- cmake/projects/Boost/coroutine/hunter.cmake | 2 +- cmake/projects/Boost/date_time/hunter.cmake | 2 +- cmake/projects/Boost/exception/hunter.cmake | 2 +- cmake/projects/Boost/filesystem/hunter.cmake | 2 +- cmake/projects/Boost/generate.sh | 3 + cmake/projects/Boost/graph/hunter.cmake | 2 +- .../Boost/graph_parallel/hunter.cmake | 2 +- cmake/projects/Boost/hunter.cmake | 175 +++- cmake/projects/Boost/hunter.cmake.in | 2 +- cmake/projects/Boost/iostreams/hunter.cmake | 2 +- cmake/projects/Boost/locale/hunter.cmake | 2 +- cmake/projects/Boost/log/hunter.cmake | 2 +- cmake/projects/Boost/math/hunter.cmake | 2 +- cmake/projects/Boost/mpi/hunter.cmake | 2 +- .../Boost/program_options/hunter.cmake | 2 +- cmake/projects/Boost/python/hunter.cmake | 2 +- cmake/projects/Boost/random/hunter.cmake | 2 +- cmake/projects/Boost/regex/hunter.cmake | 2 +- .../Boost/schemes/url_sha1_boost.cmake.in | 170 ++-- .../url_sha1_boost_ios_library.cmake.in | 140 ++-- .../schemes/url_sha1_boost_library.cmake.in | 307 ++++--- .../projects/Boost/serialization/hunter.cmake | 2 +- cmake/projects/Boost/signals/hunter.cmake | 2 +- cmake/projects/Boost/system/hunter.cmake | 2 +- cmake/projects/Boost/test/hunter.cmake | 2 +- cmake/projects/Boost/thread/hunter.cmake | 2 +- cmake/projects/Boost/timer/hunter.cmake | 2 +- cmake/projects/Boost/wave/hunter.cmake | 2 +- cmake/projects/CURL/hunter.cmake | 106 ++- cmake/projects/Clang/hunter.cmake | 33 + cmake/projects/ClangToolsExtra/hunter.cmake | 22 + cmake/projects/CppNetlibUri/hunter.cmake | 11 + cmake/projects/Eigen/hunter.cmake | 136 +++- cmake/projects/GPUImage/hunter.cmake | 21 +- cmake/projects/GTest/hunter.cmake | 90 ++- cmake/projects/IntSizeof/hunter.cmake | 22 - cmake/projects/Jpeg/hunter.cmake | 22 + cmake/projects/LLVM/hunter.cmake | 50 +- cmake/projects/LLVMCompilerRT/hunter.cmake | 24 +- cmake/projects/Leathers/hunter.cmake | 14 +- cmake/projects/Libssh2/hunter.cmake | 6 +- cmake/projects/Lua/hunter.cmake | 60 +- cmake/projects/MySQL-client/hunter.cmake | 42 +- cmake/projects/OpenBLAS/hunter.cmake | 67 +- .../OpenBLAS/schemes/OpenBLAS.cmake.in | 74 +- cmake/projects/OpenCV-Extra/hunter.cmake | 99 +++ cmake/projects/OpenCV/hunter.cmake | 280 ++++++- cmake/projects/OpenSSL/hunter.cmake | 254 +++++- .../OpenSSL/schemes/url_sha1_openssl.cmake.in | 128 ++- .../schemes/url_sha1_openssl_ios.cmake.in | 65 +- .../schemes/url_sha1_openssl_windows.cmake.in | 75 +- ...url_sha1_openssl_windows_1_1_plus.cmake.in | 80 +- cmake/projects/PNG/hunter.cmake | 66 ++ cmake/projects/PocoCpp/hunter.cmake | 44 + cmake/projects/PostgreSQL/hunter.cmake | 36 +- cmake/projects/Protobuf/hunter.cmake | 101 ++- cmake/projects/Qt/ep-stages/qt-build.cmake.in | 14 + .../Qt/ep-stages/qt-configure.cmake.in | 20 +- .../projects/Qt/ep-stages/qt-install.cmake.in | 44 +- cmake/projects/Qt/generate.sh | 16 + cmake/projects/Qt/hunter.cmake | 102 +++ cmake/projects/Qt/hunter.cmake.in | 90 ++- cmake/projects/Qt/qt3d/hunter.cmake | 90 ++- cmake/projects/Qt/qtactiveqt/hunter.cmake | 90 ++- .../projects/Qt/qtandroidextras/hunter.cmake | 90 ++- cmake/projects/Qt/qtbase/hunter.cmake | 90 ++- cmake/projects/Qt/qtcanvas3d/hunter.cmake | 90 ++- cmake/projects/Qt/qtconnectivity/hunter.cmake | 90 ++- cmake/projects/Qt/qtdeclarative/hunter.cmake | 90 ++- cmake/projects/Qt/qtdoc/hunter.cmake | 90 ++- cmake/projects/Qt/qtenginio/hunter.cmake | 90 ++- .../Qt/qtgraphicaleffects/hunter.cmake | 90 ++- cmake/projects/Qt/qtimageformats/hunter.cmake | 90 ++- cmake/projects/Qt/qtlocation/hunter.cmake | 90 ++- cmake/projects/Qt/qtmacextras/hunter.cmake | 90 ++- cmake/projects/Qt/qtmultimedia/hunter.cmake | 90 ++- cmake/projects/Qt/qtquick1/hunter.cmake | 90 ++- .../projects/Qt/qtquickcontrols/hunter.cmake | 90 ++- .../projects/Qt/qtquickcontrols2/hunter.cmake | 90 ++- cmake/projects/Qt/qtscript/hunter.cmake | 90 ++- cmake/projects/Qt/qtsensors/hunter.cmake | 90 ++- cmake/projects/Qt/qtserialport/hunter.cmake | 90 ++- cmake/projects/Qt/qtsvg/hunter.cmake | 90 ++- cmake/projects/Qt/qttools/hunter.cmake | 90 ++- cmake/projects/Qt/qttranslations/hunter.cmake | 90 ++- cmake/projects/Qt/qtwayland/hunter.cmake | 90 ++- cmake/projects/Qt/qtwebchannel/hunter.cmake | 90 ++- cmake/projects/Qt/qtwebengine/hunter.cmake | 90 ++- .../Qt/qtwebkit-examples/hunter.cmake | 90 ++- cmake/projects/Qt/qtwebkit/hunter.cmake | 90 ++- cmake/projects/Qt/qtwebsockets/hunter.cmake | 90 ++- cmake/projects/Qt/qtwebview/hunter.cmake | 90 ++- cmake/projects/Qt/qtwinextras/hunter.cmake | 90 ++- cmake/projects/Qt/qtx11extras/hunter.cmake | 90 ++- cmake/projects/Qt/qtxmlpatterns/hunter.cmake | 90 ++- .../projects/Qt/schemes/url_sha1_qt.cmake.in | 119 ++- cmake/projects/QtAndroidCMake/hunter.cmake | 33 + cmake/projects/QtCMakeExtra/hunter.cmake | 143 ++++ cmake/projects/RapidJSON/hunter.cmake | 33 + cmake/projects/SDL2/hunter.cmake | 132 +++ cmake/projects/SQLite3/hunter.cmake | 32 - .../url_sha1_sqlite3_autotools.cmake.in | 55 -- .../Sources-for-Android-SDK/hunter.cmake | 11 + cmake/projects/Sugar/hunter.cmake | 187 ----- cmake/projects/TIFF/hunter.cmake | 22 + cmake/projects/ZLIB/hunter.cmake | 46 +- cmake/projects/ZMQPP/hunter.cmake | 22 + cmake/projects/ZeroMQ/hunter.cmake | 11 + cmake/projects/cereal/hunter.cmake | 30 +- cmake/projects/cvmatio/hunter.cmake | 11 + cmake/projects/damageproto/hunter.cmake | 2 +- cmake/projects/dest/hunter.cmake | 11 + cmake/projects/dlib/hunter.cmake | 243 ++++++ cmake/projects/dri2proto/hunter.cmake | 2 +- cmake/projects/dri3proto/hunter.cmake | 2 +- cmake/projects/drm/hunter.cmake | 13 +- cmake/projects/eos/hunter.cmake | 25 +- cmake/projects/fixesproto/hunter.cmake | 8 +- cmake/projects/flatbuffers/hunter.cmake | 12 +- cmake/projects/fmt/hunter.cmake | 34 + cmake/projects/freetype/hunter.cmake | 54 ++ cmake/projects/geos/hunter.cmake | 5 +- cmake/projects/gflags/hunter.cmake | 29 + cmake/projects/glew/hunter.cmake | 12 +- cmake/projects/glfw/hunter.cmake | 87 +- cmake/projects/glm/hunter.cmake | 55 +- cmake/projects/glog/hunter.cmake | 54 +- cmake/projects/glproto/hunter.cmake | 2 +- cmake/projects/hdf5/hunter.cmake | 12 + cmake/projects/ice/hunter.cmake | 24 +- cmake/projects/inputproto/hunter.cmake | 19 +- cmake/projects/intltool/hunter.cmake | 7 +- cmake/projects/irrXML/hunter.cmake | 11 + cmake/projects/kbproto/hunter.cmake | 20 +- cmake/projects/libdaemon/hunter.cmake | 7 +- cmake/projects/libogg/hunter.cmake | 26 +- cmake/projects/libsodium/hunter.cmake | 37 +- ..._sha1_libsodium_autogen_autotools.cmake.in | 22 +- .../url_sha1_libsodium_msbuild.cmake.in | 34 +- cmake/projects/minizip/hunter.cmake | 14 + cmake/projects/msgpack/hunter.cmake | 11 + cmake/projects/nlohmann-json/hunter.cmake | 25 - cmake/projects/odb-boost/hunter.cmake | 2 +- .../url_sha1_odb-boost_autotools.cmake.in | 20 +- .../url_sha1_odb-mysql_autotools.cmake.in | 20 +- .../url_sha1_odb-pgsql_autotools.cmake.in | 20 +- cmake/projects/odb-sqlite/hunter.cmake | 4 +- .../url_sha1_odb-sqlite_autotools.cmake.in | 28 +- cmake/projects/odb/hunter.cmake | 4 +- cmake/projects/ogles_gpgpu/hunter.cmake | 176 ++++ cmake/projects/pciaccess/hunter.cmake | 2 +- cmake/projects/presentproto/hunter.cmake | 2 +- cmake/projects/pthread-stubs/hunter.cmake | 20 +- cmake/projects/randrproto/hunter.cmake | 2 + cmake/projects/renderproto/hunter.cmake | 8 +- cmake/projects/sm/hunter.cmake | 13 +- cmake/projects/sparsehash/hunter.cmake | 5 + cmake/projects/spdlog/hunter.cmake | 77 ++ cmake/projects/thread-pool-cpp/hunter.cmake | 22 + cmake/projects/websocketpp/hunter.cmake | 27 +- cmake/projects/x11/hunter.cmake | 15 +- cmake/projects/xau/hunter.cmake | 15 +- cmake/projects/xcb-proto/hunter.cmake | 19 +- cmake/projects/xcb/hunter.cmake | 21 +- cmake/projects/xcb/schemes/xcb.cmake.in | 48 +- cmake/projects/xcursor/hunter.cmake | 2 + cmake/projects/xdamage/hunter.cmake | 2 +- cmake/projects/xext/hunter.cmake | 3 +- cmake/projects/xextproto/hunter.cmake | 20 +- cmake/projects/xf86vidmodeproto/hunter.cmake | 6 +- cmake/projects/xfixes/hunter.cmake | 16 +- cmake/projects/xgboost/hunter.cmake | 89 +++ cmake/projects/xinerama/hunter.cmake | 2 + cmake/projects/xineramaproto/hunter.cmake | 2 + cmake/projects/xorg-macros/hunter.cmake | 20 +- cmake/projects/xproto/hunter.cmake | 15 +- cmake/projects/xrandr/hunter.cmake | 3 +- cmake/projects/xrender/hunter.cmake | 3 +- cmake/projects/xshmfence/hunter.cmake | 13 +- cmake/projects/xtrans/hunter.cmake | 20 +- cmake/projects/xxf86vm/hunter.cmake | 6 +- .../url_sha1_autogen_autotools.cmake.in | 42 +- cmake/schemes/url_sha1_autotools.cmake.in | 43 +- cmake/schemes/url_sha1_cmake.cmake.in | 97 ++- cmake/schemes/url_sha1_download.cmake.in | 19 +- cmake/schemes/url_sha1_ios_sim.cmake.in | 26 +- cmake/schemes/url_sha1_unpack.cmake.in | 38 +- .../schemes/url_sha1_unpack_install.cmake.in | 24 +- cmake/templates/BoostConfig.cmake.in | 42 +- docs/conf.py | 10 +- docs/contacts.rst | 28 +- docs/contributing.rst | 111 ++- docs/creating-new.rst | 11 +- docs/creating-new/cmake-dependencies.rst | 109 --- docs/creating-new/cmake.rst | 9 - docs/creating-new/custom.rst | 9 - docs/donations.rst | 7 - ...nteraction-with-other-package-managers.rst | 4 - .../faq/why-binaries-from-server-not-used.rst | 133 +--- docs/index.rst | 60 +- docs/jenkins.sh | 2 +- docs/make.sh | 2 +- docs/overview.rst | 6 +- docs/overview/anything.rst | 13 +- docs/overview/automatic.rst | 44 +- docs/overview/binaries.rst | 37 +- docs/overview/compatibility.rst | 66 +- docs/overview/customization.rst | 10 +- docs/overview/customization/build-types.rst | 2 +- docs/overview/customization/config-id.rst | 60 +- docs/overview/customization/hunter-id.rst | 6 +- docs/overview/customization/toolchain-id.rst | 69 +- docs/overview/dry.rst | 16 +- docs/overview/everywhere.rst | 4 + docs/overview/shareable.rst | 20 +- docs/overview/what-is-it.rst | 19 +- docs/packages.rst | 45 +- docs/packages/all-packages.rst | 5 - docs/quick-start/boost-components.rst | 16 +- docs/quick-start/cmake.rst | 69 +- docs/reference.rst | 2 + docs/reference/errors.rst | 6 + docs/reference/internal-modules.rst | 6 + .../hunter_package_scheme.rst | 23 +- docs/reference/terminology/hunterize.rst | 2 +- docs/reference/user-modules.rst | 6 + docs/reference/user-variables.rst | 457 ++++++++++- docs/requirements.txt | 7 +- docs/spelling.txt | 51 ++ docs/user-guides/cmake-user.rst | 11 +- docs/user-guides/hunter-developer.rst | 12 +- docs/user-guides/hunter-user.rst | 54 +- .../images/cmake-hunter-environment.png | Bin 97041 -> 133160 bytes docs/user-guides/regular.rst | 2 +- .../yed/cmake-hunter-environment.graphml | 250 +++--- donate.md | 19 - examples/Android-SDK-Platform/CMakeLists.txt | 2 +- examples/BZip2/CMakeLists.txt | 8 + examples/Boost-chrono/CMakeLists.txt | 13 +- examples/Boost-compute/CMakeLists.txt | 5 +- examples/Boost-filesystem/CMakeLists.txt | 31 +- examples/Boost-iostreams/CMakeLists.txt | 15 +- examples/Boost-process/CMakeLists.txt | 5 +- examples/Boost-serialization/CMakeLists.txt | 2 +- examples/Boost-system/CMakeLists.txt | 17 +- examples/Boost-thread/CMakeLists.txt | 7 +- examples/Boost-uuid/CMakeLists.txt | 5 +- examples/Boost/CMakeLists.txt | 38 +- examples/Eigen/CMakeLists.txt | 22 +- examples/GTest/CMakeLists.txt | 16 +- examples/GTest/foo.cpp | 19 + examples/Jpeg/CMakeLists.txt | 7 +- examples/Leathers/CMakeLists.txt | 5 + examples/Lua/CMakeLists.txt | 46 +- examples/MySQL-client/CMakeLists.txt | 4 +- examples/OpenCV/CMakeLists.txt | 10 +- examples/OpenSSL-imported/CMakeLists.txt | 19 - examples/OpenSSL-imported/foo.cpp | 4 - examples/OpenSSL/CMakeLists.txt | 6 +- examples/PNG/CMakeLists.txt | 32 +- examples/SDL2/CMakeLists.txt | 14 +- examples/SQLite3/CMakeLists.txt | 17 - .../Sources-for-Android-SDK/CMakeLists.txt | 2 +- examples/Sugar/CMakeLists.txt | 21 - examples/ZLIB/CMakeLists.txt | 29 +- examples/ZeroMQ/CMakeLists.txt | 6 +- examples/ccv/CMakeLists.txt | 2 + examples/common.cmake | 38 +- examples/dlib/CMakeLists.txt | 10 +- examples/flatbuffers/CMakeLists.txt | 9 +- examples/fmt/CMakeLists.txt | 2 +- examples/fmt/fmtexample.cpp | 7 +- examples/freetype/CMakeLists.txt | 14 +- examples/freetype/foo.cpp | 18 - examples/gflags/CMakeLists.txt | 2 +- examples/gflags/foo.cpp | 4 +- examples/glfw/CMakeLists.txt | 3 +- examples/glm/core_func_common.cpp | 1 + examples/glog/CMakeLists.txt | 8 +- examples/minizip/foo.cpp | 4 - examples/nlohmann-json/CMakeLists.txt | 15 - examples/nlohmann-json/main.cpp | 27 - examples/qt-camera/AndroidManifest.xml.in | 38 +- examples/qt-camera/CMakeLists.txt | 56 +- examples/qt-camera/main.cpp | 4 - examples/qt-core/CMakeLists.txt | 5 + examples/qt-core/main.cpp | 4 - examples/qt-qml/CMakeLists.txt | 29 +- examples/qt-qml/main.cpp | 5 +- examples/qt-widgets/CMakeLists.txt | 10 + examples/qt-widgets/main.cpp | 4 - examples/spdlog/foo.cpp | 2 + examples/x11/CMakeLists.txt | 5 +- examples/xau/CMakeLists.txt | 4 + examples/xcb/CMakeLists.txt | 4 + examples/xgboost/CMakeLists.txt | 2 +- examples/xgboost/foo.cpp | 4 +- jenkins.py | 100 +-- maintenance/local-upload/opencv/run-osx.sh | 28 - maintenance/local-upload/qt/run-linux.sh | 41 - maintenance/local-upload/qt/run-osx.sh | 63 -- maintenance/local-upload/qt/run-win.bat | 55 -- maintenance/upload-cache-to-github.py | 479 ----------- scripts/ShowPredefined.cpp | 616 ++++++++++++++ scripts/autotools-merge-lipo.cmake.in | 124 ++- scripts/clear-all.cmake | 13 +- scripts/clear-all.sh | 7 + scripts/create-toolchain-info.cmake | 38 +- scripts/predefined.list | 154 ++++ scripts/try-copy-license.cmake | 97 +-- tests/hunter_create_args_file/CMakeLists.txt | 32 + .../CMakeLists.txt | 14 +- tests/hunter_create_deps_info/CMakeLists.txt | 24 +- tests/hunter_generate_qt_info/CMakeLists.txt | 10 +- tests/hunter_get_package_deps/CMakeLists.txt | 6 +- .../CMakeLists.txt | 24 +- .../hunter_register_dependency/CMakeLists.txt | 20 +- tests/hunter_unpack_directory/CMakeLists.txt | 14 +- tests/issue/109/unit/CMakeLists.txt | 1 + tests/issue/22/CMakeLists.txt | 32 +- tests/issue/24/unit/CMakeLists.txt | 19 +- tests/simple/CMakeLists.txt | 6 +- 406 files changed, 13162 insertions(+), 4883 deletions(-) delete mode 100644 README.rst delete mode 100644 cmake/find/FindEigen.cmake delete mode 100644 cmake/find/FindJPEG.cmake delete mode 100644 cmake/find/FindSQLite3.cmake delete mode 100644 cmake/modules/hunter_test_string_not_empty.cmake delete mode 100644 cmake/modules/hunter_wiki.cmake delete mode 100644 cmake/projects/IntSizeof/hunter.cmake delete mode 100644 cmake/projects/SQLite3/hunter.cmake delete mode 100644 cmake/projects/SQLite3/schemes/url_sha1_sqlite3_autotools.cmake.in delete mode 100644 cmake/projects/Sugar/hunter.cmake delete mode 100644 cmake/projects/nlohmann-json/hunter.cmake delete mode 100644 docs/creating-new/cmake-dependencies.rst delete mode 100644 docs/creating-new/cmake.rst delete mode 100644 docs/creating-new/custom.rst delete mode 100644 docs/donations.rst delete mode 100644 docs/packages/all-packages.rst delete mode 100644 donate.md delete mode 100644 examples/OpenSSL-imported/CMakeLists.txt delete mode 100644 examples/OpenSSL-imported/foo.cpp delete mode 100644 examples/SQLite3/CMakeLists.txt delete mode 100644 examples/Sugar/CMakeLists.txt delete mode 100644 examples/freetype/foo.cpp delete mode 100644 examples/nlohmann-json/CMakeLists.txt delete mode 100644 examples/nlohmann-json/main.cpp mode change 100644 => 100755 examples/qt-qml/CMakeLists.txt delete mode 100755 maintenance/local-upload/opencv/run-osx.sh delete mode 100755 maintenance/local-upload/qt/run-linux.sh delete mode 100755 maintenance/local-upload/qt/run-osx.sh delete mode 100644 maintenance/local-upload/qt/run-win.bat delete mode 100755 maintenance/upload-cache-to-github.py diff --git a/LICENSE b/LICENSE index 519974325..64ea4d530 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013-2016, Ruslan Baratov +Copyright (c) 2013-2018, Ruslan Baratov All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/README.rst b/README.rst deleted file mode 100644 index 54d8fdf50..000000000 --- a/README.rst +++ /dev/null @@ -1,7 +0,0 @@ -Hunter CI testing -================= - -This repository is for deep per-package testing. -The only pull requests accepting here is about continuous integration testing on Travis/AppVeyor, i.e. should only affect ``.travis.yml`` or ``appveyor.yml`` (in some rare cases ``jenkins.py``). Please contribute other stuff to https://github.com/ruslo/hunter. - -Thanks. diff --git a/appveyor.yml b/appveyor.yml index 723f26107..479ba6640 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,17 +4,32 @@ environment: global: # This variable used only if '--upload' added to 'jenkins.py' GITHUB_USER_PASSWORD: - secure: uW6WWlvCt7CRvvdO9ePjbymPcPNuV1C6HGF8u7Ey6EI= + secure: LNJ5FPxb7CPXpslLdb63M1Z2344XY5kxQOsnE1RQ6O+hslNqTHk7pvbS+YB5+05P matrix: # FIXME: # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1053/job/l4ud1nf8pbo11tkh - # - TOOLCHAIN: "default" - # PROJECT_DIR: examples\hdf5 + #- TOOLCHAIN: "default" + # PROJECT_DIR: examples\hdf5 + + #- TOOLCHAIN: "ninja-vs-15-2017-win64-cxx17" + # PROJECT_DIR: examples\hdf5 + + #- TOOLCHAIN: "ninja-vs-15-2017-win64" + # PROJECT_DIR: examples\hdf5 + + - TOOLCHAIN: "ninja-vs-14-2015-win64" + PROJECT_DIR: examples\hdf5 - TOOLCHAIN: "ninja-vs-12-2013-win64" PROJECT_DIR: examples\hdf5 + - TOOLCHAIN: "nmake-vs-15-2017-win64-cxx17" + PROJECT_DIR: examples\hdf5 + + - TOOLCHAIN: "nmake-vs-15-2017-win64" + PROJECT_DIR: examples\hdf5 + - TOOLCHAIN: "nmake-vs-12-2013-win64" PROJECT_DIR: examples\hdf5 @@ -38,8 +53,23 @@ environment: # FIXME: # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1053/job/l4ud1nf8pbo11tkh - # - TOOLCHAIN: "vs-14-2015" - # PROJECT_DIR: examples\hdf5 + - TOOLCHAIN: "vs-14-2015" + PROJECT_DIR: examples\hdf5 + + - TOOLCHAIN: "vs-14-2015-win64" + PROJECT_DIR: examples\hdf5 + + - TOOLCHAIN: "vs-15-2017" + PROJECT_DIR: examples\hdf5 + + - TOOLCHAIN: "vs-15-2017-win64" + PROJECT_DIR: examples\hdf5 + + - TOOLCHAIN: "vs-16-2019" + PROJECT_DIR: examples\hdf5 + + - TOOLCHAIN: "vs-16-2019-win64" + PROJECT_DIR: examples\hdf5 - TOOLCHAIN: "vs-9-2008" PROJECT_DIR: examples\hdf5 @@ -47,17 +77,24 @@ environment: - TOOLCHAIN: "mingw" PROJECT_DIR: examples\hdf5 + - TOOLCHAIN: "mingw-cxx14" + PROJECT_DIR: examples\hdf5 + + - TOOLCHAIN: "mingw-cxx17" + PROJECT_DIR: examples\hdf5 + # FIXME: # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1053/job/mtnnis065ibe658y - # - TOOLCHAIN: "msys" - # PROJECT_DIR: examples\hdf5 + - TOOLCHAIN: "msys" + PROJECT_DIR: examples\hdf5 install: # Python 3 - cmd: set PATH=C:\Python34-x64;C:\Python34-x64\Scripts;%PATH% - # Install Python package 'requests' + # Install Python package 'requests', 'gitpython' - cmd: pip install requests + - cmd: pip install gitpython # Install latest Polly toolchains and scripts - cmd: appveyor DownloadFile https://github.com/ruslo/polly/archive/master.zip @@ -78,13 +115,19 @@ install: # * http://stackoverflow.com/a/3870338/2288008 - cmd: set PATH=%PATH:C:\Program Files\Git\usr\bin;=% - # Use MinGW from Qt tools because version is higher - # * http://www.appveyor.com/docs/installed-software#qt - - cmd: set MINGW_PATH=C:\Qt\Tools\mingw492_32\bin + # Save git.exe in HUNTER_GIT_EXECUTABLE for upload + # * https://docs.hunter.sh/en/latest/reference/user-variables.html#hunter-git-executable + # Variable will be used in CMake so it's okay to use Unix style '/' + - cmd: set HUNTER_GIT_EXECUTABLE=C:/Program Files/Git/bin/git.exe + + - cmd: set MINGW_PATH=C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin # MSYS2 location - cmd: set MSYS_PATH=C:\msys64\usr\bin + # Visual Studio 15 2017: Mimic behavior of older versions + - cmd: set VS150COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools + build_script: - cmd: python .\jenkins.py diff --git a/cmake/Hunter b/cmake/Hunter index 07e94fe23..92465b0a2 100644 --- a/cmake/Hunter +++ b/cmake/Hunter @@ -7,15 +7,32 @@ else() set(HUNTER_CMAKE_HUNTER_ 1) endif() +if(CMAKE_VERSION VERSION_LESS "3.2") + message( + FATAL_ERROR + "At least CMake version 3.2 required for Hunter dependency management." + " Update CMake or set HUNTER_ENABLED to OFF." + ) +endif() + option(HUNTER_ENABLED "Enable Hunter package manager support" ON) option(HUNTER_STATUS_PRINT "Print working status" ON) option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) +set( + HUNTER_CONFIGURATION_TYPES + "Release;Debug" + CACHE + STRING + "Hunter configuration types" +) + ### add cmake modules to search path list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/modules") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/find") include(hunter_add_package) # For user project +include(hunter_private_data) # For user project include(hunter_initialize) # Basic initialization - only check arguments of HunterGate. Further diff --git a/cmake/configs/default.cmake b/cmake/configs/default.cmake index 243341db0..82cede5ec 100644 --- a/cmake/configs/default.cmake +++ b/cmake/configs/default.cmake @@ -1,226 +1,585 @@ -# Copyright (c) 2013-2015, Ruslan Baratov +# Copyright (c) 2013-2018, Ruslan Baratov # All rights reserved. # Do not place header guards here -# Unset: -# * ${PACKAGE_NAME}_ROOT (CMake variable) -# * ${PACKAGE_NAME}_ROOT (CMake cache variable) -# * ${PACKAGE_NAME}_ROOT (environment variable) - # Set CMake variables: # * HUNTER_${PACKAGE_NAME}_VERSION -# * HUNTER_${PACKAGE_NAME}_CMAKE_ARGS (optionally) # Usage: -# hunter_config(Foo VERSION 1.0.0) -# hunter_config(Boo VERSION 1.2.3z CMAKE_ARGS BOO_WITH_A=ON) - -# Wiki: -# * https://github.com/ruslo/hunter/wiki/dev.modules#hunter_config +# hunter_default_version(Foo VERSION 1.0.0) +# hunter_default_version(Boo VERSION 1.2.3z) -include(hunter_config) +include(hunter_default_version) include(hunter_user_error) # NOTE: no names with spaces! -hunter_config(AllTheFlopsThreads VERSION 0.1-p0) -hunter_config(Android-Apk VERSION 1.1.7) -hunter_config(Android-Build-Tools VERSION 22.0.1) -hunter_config(Android-Google-Repository VERSION 25) -hunter_config(Android-Modules VERSION 1.0.0) -hunter_config(Android-SDK VERSION 0.0.3) -hunter_config(Android-SDK-Platform-tools VERSION r23.1.0) -hunter_config(Android-SDK-Tools VERSION 24.4.1) -hunter_config(Android-Support-Repository VERSION 28) -hunter_config(ArrayFire VERSION 3.3.1-p0) -hunter_config(Assimp VERSION 3.2-p1) -hunter_config(Async++ VERSION 0.0.3-hunter) -hunter_config(Avahi VERSION 0.6.31) -hunter_config(BZip2 VERSION 1.0.6-p1) -hunter_config(Boost VERSION 1.62.0) -hunter_config(BoostCompute VERSION 0.5-p0) -hunter_config(BoostProcess VERSION 0.5) -hunter_config(CLAPACK VERSION 3.2.1) -hunter_config(CURL VERSION 7.49.1-DEV-v4) -hunter_config(Clang VERSION 3.6.2) -hunter_config(ClangToolsExtra VERSION ${HUNTER_Clang_VERSION}) -hunter_config(Comet VERSION 4.0.2) -hunter_config(CppNetlib VERSION 0.10.1-hunter-3) -hunter_config(CppNetlibUri VERSION 1.0.4-hunter) -hunter_config(CsvParserCPlusPlus VERSION 1.0.1) -hunter_config(Eigen VERSION 3.2.4-p0) -hunter_config(Expat VERSION 2.1.1) -hunter_config(GPUImage VERSION 0.1.6-p6) -hunter_config(GSL VERSION 2.1.0-p2) -hunter_config(Igloo VERSION 1.1.1-hunter) -hunter_config(IntSizeof VERSION 1.0.0) -hunter_config(Jpeg VERSION 9b-p1) -hunter_config(JsonSpirit VERSION 0.0.4-hunter) -hunter_config(LLVM VERSION ${HUNTER_Clang_VERSION}) -hunter_config(LLVMCompilerRT VERSION ${HUNTER_Clang_VERSION}) -hunter_config(Leathers VERSION 0.1.6) -hunter_config(Libcxx VERSION ${HUNTER_Clang_VERSION}) -hunter_config(Libcxxabi VERSION ${HUNTER_Clang_VERSION}) -hunter_config(Libssh2 VERSION 1.7.0) -hunter_config(Lua VERSION 5.3.2) -hunter_config(MySQL-client VERSION 6.1.6) -hunter_config(OpenBLAS VERSION 0.2.19-p0) -hunter_config(OpenCV VERSION 3.1.0-p2) -hunter_config(OpenCV-Extra VERSION 3.0.0) -hunter_config(OpenSSL VERSION 1.0.2j) -hunter_config(PNG VERSION 1.6.16-p4) -hunter_config(PocoCpp VERSION 1.7.4) -hunter_config(PostgreSQL VERSION 9.5.0) -hunter_config(Protobuf VERSION 3.0.0-p1) -hunter_config(Qt VERSION 5.5.1-cvpixelbuffer-2-p7) -hunter_config(QtAndroidCMake VERSION 1.0.6) -hunter_config(QtCMakeExtra VERSION 1.0.19) -hunter_config(QtQmlManager VERSION 1.0.0) -hunter_config(RapidJSON VERSION 1.0.2-p2) -hunter_config(SDL2 VERSION 2.0.4-p2) -hunter_config(SQLite3 VERSION autoconf-3080803) #R-Tree enabled -hunter_config(Sober VERSION 0.1.3) -hunter_config(Sugar VERSION 1.2.2) -hunter_config(TIFF VERSION 4.0.2-p3) -hunter_config(WTL VERSION 9.1.5321) -hunter_config(Washer VERSION 0.1.2) -hunter_config(WinSparkle VERSION 0.4.0) -hunter_config(ZLIB VERSION 1.2.8-p3) -hunter_config(ZMQPP VERSION 4.1.2) -hunter_config(ZeroMQ VERSION 4.1.4-p2) -hunter_config(caffe VERSION rc3-p2) -hunter_config(ccv VERSION 0.7-p6) -hunter_config(cereal VERSION 1.1.2-p5) -hunter_config(clBLAS VERSION 2.10.0-p0) -hunter_config(convertutf VERSION 1.0.1) -hunter_config(crashpad VERSION v0.0.1-p0) -hunter_config(crashup VERSION 0.0.2) -hunter_config(cvmatio VERSION 1.0.27-p3) -hunter_config(damageproto VERSION 1.2.1) -hunter_config(dbus VERSION 1.10.0-hunter-4) -hunter_config(dest VERSION 0.8.0-p3) -hunter_config(dlib VERSION 18.17-p1) -hunter_config(dri2proto VERSION 2.8) -hunter_config(dri3proto VERSION 1.0) -hunter_config(drm VERSION 2.4.67) -hunter_config(eos VERSION 0.6.1-p0) -hunter_config(fixesproto VERSION 5.0) -hunter_config(flatbuffers VERSION 1.3.0-p3) -hunter_config(fmt VERSION 3.0.0) -hunter_config(freetype VERSION 2.6.2) -hunter_config(geos VERSION 3.4.2) -hunter_config(gflags VERSION 2.1.2-p0) -hunter_config(glew VERSION 2.0.0) -hunter_config(glfw VERSION 3.2-p0) -hunter_config(glm VERSION 0.9.7.6) -hunter_config(glog VERSION 0.3.4-p1) -hunter_config(glproto VERSION 1.4.17) -hunter_config(half VERSION 1.1.0-p1) -hunter_config(hdf5 VERSION 1.8.15-p1) -hunter_config(ice VERSION 1.0.8) -hunter_config(inputproto VERSION 2.2) -hunter_config(intltool VERSION 0.51.0) -hunter_config(ios_sim VERSION 3.1.1) -hunter_config(ippicv VERSION 20151201) -hunter_config(irrXML VERSION 1.2) -hunter_config(kbproto VERSION 1.0.6) -hunter_config(libdaemon VERSION 0.14) -hunter_config(libogg VERSION 1.3.2-cmake3) -hunter_config(libsodium VERSION 1.0.10) -hunter_config(libyuv VERSION 1514-p3) -hunter_config(log4cplus VERSION 1.2.0-p0) -hunter_config(mini_chromium VERSION 0.0.1-p2) -hunter_config(minizip VERSION 1.0.1-p1) -hunter_config(msgpack VERSION 1.4.1) -hunter_config(nlohmann-json VERSION 1.0.0-rc1-hunter-3) -hunter_config(odb VERSION 2.4.0) -hunter_config(odb-boost VERSION 2.4.0) -hunter_config(odb-compiler VERSION 2.4.0) -hunter_config(odb-mysql VERSION 2.4.0) -hunter_config(odb-pgsql VERSION 2.4.0) -hunter_config(odb-sqlite VERSION 2.4.0) -hunter_config(ogles_gpgpu VERSION 0.1.1) -hunter_config(openddlparser VERSION 0.1.0-p2) -hunter_config(pciaccess VERSION 0.13.4) -hunter_config(poly2tri VERSION 1.0.0) -hunter_config(polyclipping VERSION 4.8.8-p0) # for Assimp -hunter_config(presentproto VERSION 1.0) -hunter_config(pthread-stubs VERSION 0.3) -hunter_config(rabbitmq-c VERSION 0.7.0-p1) -hunter_config(randrproto VERSION 1.3.2) -hunter_config(renderproto VERSION 0.11.1) -hunter_config(sm VERSION 1.2.1) -hunter_config(sparsehash VERSION 2.0.2) -if(MSVC_VERSION LESS 1900) - # for VS12 - version without support C++11 - hunter_config(spdlog VERSION 1.0.0-p0) +hunter_default_version(ARM_NEON_2_x86_SSE VERSION 1.0.0-p0) +hunter_default_version(AllTheFlopsThreads VERSION 0.1-p0) +hunter_default_version(Android-Apk VERSION 1.1.14) +hunter_default_version(Android-Build-Tools VERSION 27.0.3) +hunter_default_version(Android-Google-Repository VERSION 58) +hunter_default_version(Android-Modules VERSION 1.0.0) +hunter_default_version(Android-SDK VERSION 0.0.6) +hunter_default_version(Android-SDK-Platform-tools VERSION r28.0.0) +hunter_default_version(Android-SDK-Tools VERSION 25.2.5) +hunter_default_version(Android-Support-Repository VERSION 47) +hunter_default_version(AngelScript VERSION 2.30-p0) +hunter_default_version(ArrayFire VERSION 3.3.1-p0) +hunter_default_version(Assimp VERSION 5.0.0-07779a7a) +hunter_default_version(Async++ VERSION 0.0.3-hunter) +hunter_default_version(Avahi VERSION 0.6.31) +hunter_default_version(BZip2 VERSION 1.0.6-p4) +hunter_default_version(Beast VERSION 1.0.0-b84-hunter-0) + +if(MINGW) + # https://github.com/boostorg/build/issues/301 + hunter_default_version(Boost VERSION 1.64.0) +else() + hunter_default_version(Boost VERSION 1.70.0-p0) +endif() + +hunter_default_version(BoostCompute VERSION 0.5-p0) +hunter_default_version(BoostProcess VERSION 0.5) +hunter_default_version(BoringSSL VERSION 0.0.0-0f5ecd3a8-p0) +hunter_default_version(Box2D VERSION 2.3.1-p0) +hunter_default_version(CLAPACK VERSION 3.2.1) +hunter_default_version(CLI11 VERSION 1.8.0) +hunter_default_version(CURL VERSION 7.60.0-p2) +hunter_default_version(CapnProto VERSION 0.7.0) +hunter_default_version(Catch VERSION 2.9.1) +hunter_default_version(Clang VERSION 6.0.1-p0) +hunter_default_version(ClangToolsExtra VERSION 6.0.1) # Clang +hunter_default_version(Comet VERSION 4.0.2) +hunter_default_version(CppNetlib VERSION 0.10.1-hunter-3) +hunter_default_version(CppNetlibUri VERSION 1.0.5-hunter) +hunter_default_version(CreateLaunchers VERSION 0.2.1) +hunter_default_version(CsvParserCPlusPlus VERSION 1.0.1) +hunter_default_version(Eigen VERSION 3.3.7) +hunter_default_version(EnumGroup VERSION 0.0.1) +hunter_default_version(Expat VERSION 2.1.1) +hunter_default_version(FP16 VERSION 0.0.0-febbb1c-p0) +hunter_default_version(FakeIt VERSION 2.0.3) +hunter_default_version(Fruit VERSION 3.1.1-p0) +hunter_default_version(FunctionalPlus VERSION 0.2-p0) +hunter_default_version(GPUImage VERSION 0.1.6-p9) +hunter_default_version(GSL VERSION 2.1.0-p2) + +if(MSVC80) + hunter_default_version(GTest VERSION 1.7.0-hunter-6) else() - hunter_config(spdlog VERSION 0.11.0-p0) + hunter_default_version(GTest VERSION 1.8.0-hunter-p11) endif() -hunter_config(szip VERSION 2.1.0-p1) -hunter_config(thread-pool-cpp VERSION 1.0.0-p2) -hunter_config(tinydir VERSION 1.2-p0) -hunter_config(websocketpp VERSION 0.7.0-p2) -hunter_config(wxWidgets VERSION 3.0.2) -hunter_config(x11 VERSION 1.5.0) -hunter_config(xau VERSION 1.0.7) -hunter_config(xcb VERSION 1.11.1) -hunter_config(xcb-proto VERSION 1.11) -hunter_config(xcursor VERSION 1.1.13) -hunter_config(xdamage VERSION 1.1.4) -hunter_config(xext VERSION 1.3.1) -hunter_config(xextproto VERSION 7.2.1) -hunter_config(xf86vidmodeproto VERSION 2.3.1) -hunter_config(xfixes VERSION 5.0.1) -hunter_config(xgboost VERSION 0.40-p4) -hunter_config(xinerama VERSION 1.1.2) -hunter_config(xineramaproto VERSION 1.1.2) -hunter_config(xorg-macros VERSION 1.17) -hunter_config(xproto VERSION 7.0.23) -hunter_config(xrandr VERSION 1.3.2) -hunter_config(xrender VERSION 0.9.7) -hunter_config(xshmfence VERSION 1.2) -hunter_config(xtrans VERSION 1.2.7) -hunter_config(xxf86vm VERSION 1.1.2) - -if(MINGW OR MSVC80) - hunter_config(GTest VERSION 1.7.0-hunter-6) + +hunter_default_version(HalideIR VERSION 0.0-32057b5-p0) +hunter_default_version(HastyNoise VERSION 0.8.2) +hunter_default_version(ICU VERSION 63.1-p5) +hunter_default_version(IF97 VERSION 2.1.2) +hunter_default_version(Igloo VERSION 1.1.1-hunter) +hunter_default_version(Jpeg VERSION 9c-p0) +hunter_default_version(JsonSpirit VERSION 0.0.4-hunter) +hunter_default_version(LAPACK VERSION 3.7.1) +hunter_default_version(LLVM VERSION 6.0.1-p0) # Clang +hunter_default_version(LLVMCompilerRT VERSION 6.0.1) # Clang +hunter_default_version(Leathers VERSION 0.1.8) +hunter_default_version(Leptonica VERSION 1.74.2-p4) +hunter_default_version(LibCDS VERSION 2.3.1) +hunter_default_version(Libcxx VERSION 3.6.2) # Clang +hunter_default_version(Libcxxabi VERSION 3.6.2) # Clang +hunter_default_version(Libevent VERSION 2.1.8-p4) +hunter_default_version(Libssh2 VERSION 1.7.0) +hunter_default_version(LodePNG VERSION 0.0.0-p1) +hunter_default_version(Lua VERSION 5.3.2-p2) +hunter_default_version(MathFu VERSION 1.1.0-p0) +hunter_default_version(Microsoft.GSL VERSION 2.0.0-p0) +hunter_default_version(MySQL-client VERSION 6.1.9-p1) +hunter_default_version(NASM VERSION 2.12.02) +hunter_default_version(NLopt VERSION 2.5.0-p0) +hunter_default_version(ONNX VERSION 1.4.1-p0) +hunter_default_version(OpenAL VERSION 1.18.2) +hunter_default_version(OpenBLAS VERSION 0.3.3) +hunter_default_version(OpenCL VERSION 2.1-p3) +hunter_default_version(OpenCL-cpp VERSION 2.0.10-p0) +hunter_default_version(OpenCV VERSION 4.0.0-p3) +hunter_default_version(OpenCV-Extra VERSION 4.0.0) +hunter_default_version(OpenNMTTokenizer VERSION 1.11.0-p1) +hunter_default_version(OpenSSL VERSION 1.1.1c) +hunter_default_version(OpenSceneGraph VERSION 3.6.3-p0) +hunter_default_version(PNG VERSION 1.6.26-p6) +hunter_default_version(PROJ4 VERSION 5.0.0) +hunter_default_version(PhysUnits VERSION 1.1.0-p0) +hunter_default_version(PocoCpp VERSION 1.7.9-p1) +hunter_default_version(PostgreSQL VERSION 10.0.0) +hunter_default_version(Protobuf VERSION 3.7.1-p0) + +string(COMPARE EQUAL "${CMAKE_SYSTEM_NAME}" "Linux" _is_linux) +if(_is_linux OR MINGW) + # qt-qml example is broken on Linux + # qt-core example is broken on MinGW + hunter_default_version(Qt VERSION 5.5.1-cvpixelbuffer-2-p9) +elseif(IOS OR ANDROID) + hunter_default_version(Qt VERSION 5.9.1-p0) else() - hunter_config(GTest VERSION 1.8.0-hunter-p2) + hunter_default_version(Qt VERSION 5.11.3) endif() +hunter_default_version(QtAndroidCMake VERSION 1.0.9) +hunter_default_version(QtCMakeExtra VERSION 1.0.34) +hunter_default_version(QtPropertyEditor VERSION 2.1.3-p0) +hunter_default_version(QtQmlManager VERSION 1.0.0) +hunter_default_version(Qwt VERSION 6.1-p3) +hunter_default_version(RapidJSON VERSION 1.1.0-66eb606-p0) +hunter_default_version(RapidXML VERSION 1.13) +hunter_default_version(RedisClient VERSION 0.6.1-p1) +hunter_default_version(SDL2 VERSION 2.0.7-p3) +hunter_default_version(SDL_image VERSION 2.0.1-p1) +hunter_default_version(SDL_mixer VERSION 2.0.2-p0) +hunter_default_version(SDL_ttf VERSION 2.0.14-p0) +hunter_default_version(SimpleSignal VERSION 0.0.0-79c3f68-p1) +hunter_default_version(Snappy VERSION 1.1.7) +hunter_default_version(Sober VERSION 0.1.3) +hunter_default_version(Sqlpp11 VERSION 0.57-p0) +hunter_default_version(SuiteSparse VERSION 5.1.2-p0) +hunter_default_version(TCLAP VERSION 1.2.2-p1) +hunter_default_version(TIFF VERSION 4.0.2-p5) +hunter_default_version(Tesseract VERSION 3.05.01-hunter-3) +hunter_default_version(Urho3D VERSION 1.7-p15) +hunter_default_version(VulkanMemoryAllocator VERSION 2.1.0-p0) +hunter_default_version(WDC VERSION 1.1.5) +hunter_default_version(WTL VERSION 9.1.5321) +hunter_default_version(Washer VERSION 0.1.2) +hunter_default_version(WebKit VERSION 0.0.2-p0) +hunter_default_version(WebP VERSION 1.0.2-p3) +hunter_default_version(WinSparkle VERSION 0.4.0) +hunter_default_version(YAJL VERSION 2.1.0-p0) +hunter_default_version(ZLIB VERSION 1.2.11-p1) +hunter_default_version(ZMQPP VERSION 4.2.0-p0) +hunter_default_version(ZeroMQ VERSION 4.2.3-p1) + +hunter_default_version(acf VERSION 0.1.14) +hunter_default_version(actionlib VERSION 1.11.13-p0) +hunter_default_version(aes VERSION 0.0.1-p1) +hunter_default_version(aglet VERSION 1.2.2) +hunter_default_version(android_arm64_v8a_system_image_packer VERSION 1.0.0) +hunter_default_version(android_arm_eabi_v7a_system_image_packer VERSION 1.0) +hunter_default_version(android_build_tools_packer VERSION 1.0.0) +hunter_default_version(android_google_apis_intel_x86_atom_system_image_packer VERSION 1.0.0) +hunter_default_version(android_google_apis_packer VERSION 1.0.0) +hunter_default_version(android_google_repository_packer VERSION 1.0.0) +hunter_default_version(android_intel_x86_atom_system_image_packer VERSION 1.0.0) +hunter_default_version(android_mips_system_image_packer VERSION 1.0.0) +hunter_default_version(android_sdk_packer VERSION 1.0.0) +hunter_default_version(android_sdk_platform_packer VERSION 1.0.0) +hunter_default_version(android_sdk_platform_tools_packer VERSION 1.0.0) +hunter_default_version(android_sdk_tools_packer VERSION 1.0.3) +hunter_default_version(android_support_repository_packer VERSION 1.0.0) +hunter_default_version(angles VERSION 1.9.11-p0) +hunter_default_version(arabica VERSION 0.0.0-a202766-p0) +hunter_default_version(autobahn-cpp VERSION 0.2.0) +hunter_default_version(autoutils VERSION 0.3.0) +hunter_default_version(aws-c-common VERSION 0.2.1-p0) +hunter_default_version(benchmark VERSION 1.4.0) +hunter_default_version(bento4 VERSION 1.5.1-628-e6ee435-p0) +hunter_default_version(binaryen VERSION 1.38.28-p1) +hunter_default_version(bison VERSION 3.0.4-p0) +hunter_default_version(boost-pba VERSION 1.0.0-p0) +hunter_default_version(botan VERSION 2.11.0-110af9494) +hunter_default_version(breakpad VERSION 0.0.0-12ecff3-p2) +hunter_default_version(bullet VERSION 2.87-p0) +hunter_default_version(c-ares VERSION 1.14.0-p0) +hunter_default_version(caffe VERSION rc3-p2) +hunter_default_version(catkin VERSION 0.7.17-p0) +hunter_default_version(cctz VERSION 2.2.0) +hunter_default_version(ccv VERSION 0.7-p6) +hunter_default_version(cereal VERSION 1.2.2-p0) +hunter_default_version(ceres-solver VERSION 1.14.0-p1) +hunter_default_version(check_ci_tag VERSION 1.0.0) +hunter_default_version(civetweb VERSION 1.11-p0) +hunter_default_version(clBLAS VERSION 2.10.0-p0) +hunter_default_version(class_loader VERSION 0.4.1-p0) +hunter_default_version(cmcstl2 VERSION 0.0.0-bee0705e99) +hunter_default_version(convertutf VERSION 1.0.1) +hunter_default_version(corrade VERSION 2019.01) +hunter_default_version(cpp_redis VERSION 3.5.0-h1) +hunter_default_version(cppcodec VERSION 0.2-p0) +hunter_default_version(cpr VERSION 1.3.0) +hunter_default_version(cpuinfo VERSION 0.0.0-d5e37ad-p0) +hunter_default_version(crashpad VERSION v0.0.1-p0) +hunter_default_version(crashup VERSION 0.0.2) +hunter_default_version(crc32c VERSION 1.0.5) +hunter_default_version(cryptopp VERSION 8.2.0-p0) +hunter_default_version(ctti VERSION 0.0.2) +hunter_default_version(cub VERSION 1.8.0-p0) +hunter_default_version(cvmatio VERSION 1.0.28) +hunter_default_version(cvsteer VERSION 0.1.2) +hunter_default_version(cxxopts VERSION 2.1.1-pre) +hunter_default_version(czmq VERSION 4.0.2-p1) +hunter_default_version(damageproto VERSION 1.2.1) +hunter_default_version(date VERSION 2.4.1) +hunter_default_version(dbus VERSION 1.10.0-hunter-4) +hunter_default_version(debug_assert VERSION 1.3.2) +hunter_default_version(dest VERSION 0.8.0-p4) +hunter_default_version(dlib VERSION 19.17-p0) +hunter_default_version(dlpack VERSION 0.2-0acb731) +hunter_default_version(dmlc-core VERSION 0.3-3943914-p0) +hunter_default_version(doctest VERSION 2.2.0) +hunter_default_version(double-conversion VERSION 3.1.4) +hunter_default_version(draco VERSION 1.3.4-p0) +hunter_default_version(dri2proto VERSION 2.8) +hunter_default_version(dri3proto VERSION 1.0) +hunter_default_version(drishti VERSION 0.8.9) +hunter_default_version(drishti_assets VERSION 1.8) +hunter_default_version(drishti_faces VERSION 1.2) +hunter_default_version(drm VERSION 2.4.94) +hunter_default_version(duktape VERSION 2.2.1-p0) +hunter_default_version(dynalo VERSION 1.0.3) +hunter_default_version(eigen3-nnls VERSION 1.0.1) +hunter_default_version(enet VERSION 1.3.13-p1) +hunter_default_version(entityx VERSION 1.3.0-p1) +hunter_default_version(eos VERSION 0.12.1) +hunter_default_version(ethash VERSION 0.5.0) +hunter_default_version(farmhash VERSION 1.1) +hunter_default_version(ffmpeg VERSION n4.1-dev-45499e557c-p7) +hunter_default_version(fft2d VERSION 1.0.0-p0) +hunter_default_version(fixesproto VERSION 5.0) +hunter_default_version(flatbuffers VERSION 1.8.0-p1) +hunter_default_version(flex VERSION 2.6.4) +hunter_default_version(fmt VERSION 5.2.1) +hunter_default_version(folly VERSION 2018.10.22.00-p4) +hunter_default_version(freetype VERSION 2.9.1-p1) +hunter_default_version(frugally-deep VERSION 0.2.2-p0) +hunter_default_version(gRPC VERSION 1.17.2-p0) +hunter_default_version(gauze VERSION 0.7.1) +hunter_default_version(gemmlowp VERSION 1.0.0) +hunter_default_version(geos VERSION 3.4.2) +hunter_default_version(getopt VERSION 1.0.0-p0) +hunter_default_version(gflags VERSION 2.2.1) +hunter_default_version(giflib VERSION 5.1.4-p1) +hunter_default_version(glbinding VERSION 3.0.2-p0) +hunter_default_version(glew VERSION 2.0.0-p1) +hunter_default_version(glfw VERSION 3.3.0-f9923e9-p0) +hunter_default_version(glib VERSION 2.54.0) if(ANDROID) - string(COMPARE EQUAL "${ANDROID_NATIVE_API_LEVEL}" "" _is_empty) + #compile error in the latest glm on Android + hunter_default_version(glm VERSION 0.9.9.0) +else() + hunter_default_version(glm VERSION 0.9.9.2) +endif() +hunter_default_version(globjects VERSION 1.1.0-p0) +hunter_default_version(glog VERSION 0.4.0) +hunter_default_version(glproto VERSION 1.4.17) +hunter_default_version(glslang VERSION 7.7.2767-p0) +hunter_default_version(gst_plugins_bad VERSION 1.10.4) +hunter_default_version(gst_plugins_base VERSION 1.10.4) +hunter_default_version(gst_plugins_good VERSION 1.10.4) +hunter_default_version(gst_plugins_ugly VERSION 1.10.4) +hunter_default_version(gstreamer VERSION 1.10.4) +hunter_default_version(gumbo VERSION 0.10.1) +hunter_default_version(h3 VERSION 3.0.7) +hunter_default_version(half VERSION 1.1.0-p1) +hunter_default_version(harfbuzz VERSION 1.7.6-p2) +hunter_default_version(hdf5 VERSION 1.10.5-hp1) +hunter_default_version(highwayhash VERSION 0.0.0) +hunter_default_version(http-parser VERSION 2.8.0) +hunter_default_version(hunter_venv VERSION 1.0.1) +hunter_default_version(ice VERSION 1.0.9) +hunter_default_version(icu-le-hb VERSION 1.0.3-231788a-p0) +hunter_default_version(icu-lx VERSION 63.1-p1) +hunter_default_version(imagequant VERSION 2.12.2-p0) +hunter_default_version(imgui VERSION 1.70.p0) +hunter_default_version(imshow VERSION 1.0.0-p0) +hunter_default_version(inja VERSION 0.1.1) +hunter_default_version(inputproto VERSION 2.3) +hunter_default_version(intltool VERSION 0.51.0) +hunter_default_version(intsizeof VERSION 2.0.2) +hunter_default_version(intx VERSION 0.2.0) +hunter_default_version(ios_sim VERSION 3.1.1) +hunter_default_version(ippicv VERSION 20151201) +hunter_default_version(iroha-ed25519 VERSION 2.0.0) +hunter_default_version(irrXML VERSION 1.2-p0) +hunter_default_version(jaegertracing VERSION 0.4.1) +hunter_default_version(jansson VERSION 2.11.0) +hunter_default_version(jasper VERSION 2.0.14-p3) +hunter_default_version(jo_jpeg VERSION 0.0.1) + +if(MSVC_VERSION LESS 1600) + # for VS10 - version without support C++11 + hunter_default_version(jsoncpp VERSION 0.7.0) +else() + hunter_default_version(jsoncpp VERSION 1.8.0) +endif() + +hunter_default_version(kNet VERSION 2.7-p1) +hunter_default_version(kbproto VERSION 1.0.7) +hunter_default_version(lcms VERSION 2.9-p0) +hunter_default_version(lehrfempp VERSION 0.7.20) +hunter_default_version(leveldb VERSION 1.22) +hunter_default_version(libcpuid VERSION 0.4.0) +hunter_default_version(libdaemon VERSION 0.14) +hunter_default_version(libdill VERSION 1.6) +hunter_default_version(libevhtp VERSION 1.2.16-p4) +hunter_default_version(libffi VERSION 3.2.1) +hunter_default_version(libigl VERSION 2.0.0-e33f534-p1) +hunter_default_version(libjson-rpc-cpp VERSION 0.7.0-p3) +hunter_default_version(libmill VERSION 1.18) +hunter_default_version(libogg VERSION 1.3.3-p0) +hunter_default_version(libpcre VERSION 8.41) +hunter_default_version(librtmp VERSION 2.4.0-p0) +hunter_default_version(libscrypt VERSION 1.21-p1) +hunter_default_version(libsodium VERSION 1.0.16-p0) +hunter_default_version(libunibreak VERSION 4.0) +hunter_default_version(libusb VERSION 1.0.22) +hunter_default_version(libuv VERSION 1.24.0-p1) +hunter_default_version(libxdg-basedir VERSION 1.2.0) +hunter_default_version(libxml2 VERSION 2.9.7-p0) +hunter_default_version(libyuv VERSION 1514-p3) +hunter_default_version(libzip VERSION 1.5.2-d68a667-p0) +hunter_default_version(lmdb VERSION 0.9.21-p2) +hunter_default_version(lmdbxx VERSION 0.9.14.0) +hunter_default_version(log4cplus VERSION 1.2.0-p0) +hunter_default_version(lz4 VERSION 1.8.0-p2) +hunter_default_version(lzma VERSION 5.2.3-p4) +hunter_default_version(magnum VERSION 2019.01) +hunter_default_version(md5 VERSION 1.6) +hunter_default_version(mini_chromium VERSION 0.0.1-p2) +hunter_default_version(minizip VERSION 1.0.1-p3) +hunter_default_version(mkl VERSION 20190502) +hunter_default_version(mkldnn VERSION 0.19-p0) +hunter_default_version(mng VERSION 2.0.3-p2) +hunter_default_version(mojoshader VERSION 0.0.1) +hunter_default_version(mongoose VERSION 6.10) +hunter_default_version(mpark_variant VERSION 1.0.0) +hunter_default_version(msgpack VERSION 1.4.1-p2) +hunter_default_version(mshadow VERSION 1.1-1d79ecf-p0) +hunter_default_version(mtplz VERSION 0.1-p3) +hunter_default_version(mxnet VERSION 1.5.0.rc1-b64e00a-p0) +hunter_default_version(nanoflann VERSION 1.2.3-p0) +hunter_default_version(nanosvg VERSION 0.0.0-2b08dee-p0) +hunter_default_version(ncnn VERSION 20180314-p2) +hunter_default_version(ncursesw VERSION 6.1) +hunter_default_version(nlohmann_fifo_map VERSION 0.0.0-0dfbf5d-p1) +hunter_default_version(nlohmann_json VERSION 3.6.1) +hunter_default_version(nsync VERSION 1.14-p1) +hunter_default_version(odb VERSION 2.4.0) +hunter_default_version(odb-boost VERSION 2.4.0) +hunter_default_version(odb-compiler VERSION 2.4.0) +hunter_default_version(odb-mysql VERSION 2.4.0) +hunter_default_version(odb-pgsql VERSION 2.4.0) +hunter_default_version(odb-sqlite VERSION 2.4.0) +hunter_default_version(ogles_gpgpu VERSION 0.3.6) +hunter_default_version(oniguruma VERSION 6.8.1-p0) +hunter_default_version(onmt VERSION 0.4.1-p2) +hunter_default_version(openddlparser VERSION 0.1.0-p2) +hunter_default_version(opentracing-cpp VERSION 1.5.0) +hunter_default_version(pcg VERSION 0.0.0-p1) +hunter_default_version(pciaccess VERSION 0.13.4) +hunter_default_version(pcre2 VERSION 10.13-p0) +hunter_default_version(pegtl VERSION 2.8.1) + +# pip packages +hunter_default_version(pip_GitPython VERSION 2.1.11) +hunter_default_version(pip_astroid VERSION 2.2.5) +hunter_default_version(pip_boto3 VERSION 1.9.130) +hunter_default_version(pip_botocore VERSION 1.12.130) +hunter_default_version(pip_certifi VERSION 2019.3.9) +hunter_default_version(pip_chardet VERSION 3.0.4) +hunter_default_version(pip_cpplint VERSION 1.4.4) +hunter_default_version(pip_decorator VERSION 4.4.0) +hunter_default_version(pip_gitdb VERSION 2.0.5) +hunter_default_version(pip_idna VERSION 2.8) +hunter_default_version(pip_jmespath VERSION 0.9.4) +hunter_default_version(pip_lazy-object-proxy VERSION 1.3.1) +hunter_default_version(pip_nose VERSION 1.3.7) +hunter_default_version(pip_nose-timer VERSION 0.7.5) +hunter_default_version(pip_numpy VERSION 1.16.2) +hunter_default_version(pip_pylint VERSION 2.3.1) +hunter_default_version(pip_python-dateutil VERSION 2.8.0) +hunter_default_version(pip_requests VERSION 2.21.0) +hunter_default_version(pip_six VERSION 1.12.0) +hunter_default_version(pip_smmap VERSION 2.0.5) +hunter_default_version(pip_urllib3 VERSION 1.24.1) +hunter_default_version(pip_wrapt VERSION 1.11.1) + +hunter_default_version(pluginlib VERSION 1.12.1-p0) +hunter_default_version(poly2tri VERSION 1.0.0) +hunter_default_version(polyclipping VERSION 4.8.8-p0) # for Assimp +hunter_default_version(presentproto VERSION 1.0) +hunter_default_version(prometheus-cpp VERSION 0.6.0-p2) +hunter_default_version(protobuf-c VERSION 1.3.0-p1) +hunter_default_version(pthread-stubs VERSION 0.4) +hunter_default_version(pugixml VERSION 1.8.1) +hunter_default_version(pybind11 VERSION 2.2.4) +hunter_default_version(qhull VERSION 7.2.0-p1) +hunter_default_version(quickjs VERSION 2019-07-21-p0) +hunter_default_version(rabbitmq-c VERSION 0.7.0-p1) +hunter_default_version(rabit VERSION 0.0.0-p2) +hunter_default_version(randrproto VERSION 1.3.2) +hunter_default_version(rang VERSION 3.1.0-p0) + +if(MSVC) + if(MSVC_VERSION LESS 1916) + hunter_default_version(range-v3 VERSION vcpkg5-p) + else() + hunter_default_version(range-v3 VERSION 0.5.0) + endif() +else() + hunter_default_version(range-v3 VERSION 0.5.0) +endif() + +hunter_default_version(re2 VERSION 2017.11.01-p0) +hunter_default_version(readline VERSION 6.3) +hunter_default_version(recastnavigation VERSION 1.4-p0) +hunter_default_version(renderproto VERSION 0.11.1) +hunter_default_version(rocksdb VERSION 5.14.2) +hunter_default_version(ros VERSION 1.14.6-p0) +hunter_default_version(ros_comm VERSION 1.14.3-p1) +hunter_default_version(ros_comm_msgs VERSION 1.11.2-p0) +hunter_default_version(ros_common_msgs VERSION 1.12.7-p0) +hunter_default_version(ros_console_bridge VERSION 0.4.3-p0) +hunter_default_version(ros_environment VERSION 1.2.1-p0) +hunter_default_version(ros_gencpp VERSION 0.6.2-p0) +hunter_default_version(ros_geneus VERSION 2.2.6-p0) +hunter_default_version(ros_genlisp VERSION 0.4.16-p0) +hunter_default_version(ros_genmsg VERSION 0.5.12-p0) +hunter_default_version(ros_gennodejs VERSION 2.0.1-p0) +hunter_default_version(ros_genpy VERSION 0.6.8-p0) +hunter_default_version(ros_message_generation VERSION 0.4.0-p0) +hunter_default_version(ros_message_runtime VERSION 0.4.12-p0) +hunter_default_version(ros_std_msgs VERSION 0.5.12-p0) +hunter_default_version(rosconsole VERSION 1.13.10-p0) +hunter_default_version(roscpp_core VERSION 0.6.12-p0) +hunter_default_version(rospack VERSION 2.5.3-p0) +hunter_default_version(s3 VERSION 0.0.0-287e4be-p1) +hunter_default_version(sds VERSION 2.0.0) +hunter_default_version(sentencepiece VERSION 0.1.8-p1) +hunter_default_version(shaka_player_embedded VERSION 0.1.0-beta-p1) +hunter_default_version(sleef VERSION 3.3.1-p1) +hunter_default_version(sm VERSION 1.2.3) +hunter_default_version(soil VERSION 1.0.4) +hunter_default_version(sources_for_android_sdk_packer VERSION 1.0.0) +hunter_default_version(sparsehash VERSION 2.0.2) + +if(MSVC_VERSION LESS 1800) + # for VS12 - version without support C++11 + hunter_default_version(spdlog VERSION 1.0.0-p0) +else() + hunter_default_version(spdlog VERSION 1.3.1-p0) +endif() + +hunter_default_version(spirv-cross VERSION 20190220) +hunter_default_version(sqlite3 VERSION 3.27.2-p0) +hunter_default_version(sse2neon VERSION 1.0.0-p0) +hunter_default_version(stanhull VERSION 0.0.1) +hunter_default_version(state_machine VERSION 1.1) +hunter_default_version(stb VERSION 0.0.0-e6afb9c-p0) +hunter_default_version(stdext-path VERSION 0.0.1-p0) +hunter_default_version(stormlib VERSION 9.21-p1) +hunter_default_version(sugar VERSION 1.3.0) +hunter_default_version(szip VERSION 2.1.0-p1) +hunter_default_version(tacopie VERSION 3.2.0-h1) +hunter_default_version(taocpp-json VERSION 1.0.0-beta.11-e0895587) +hunter_default_version(tcl VERSION core8.6.8) +hunter_default_version(termcolor VERSION 1.0.0) +hunter_default_version(tf VERSION 1.12.0-p0) +hunter_default_version(tf2 VERSION 0.6.5-p0) +hunter_default_version(thread-pool-cpp VERSION 1.1.0) +hunter_default_version(thrift VERSION 0.12.0-p0) +hunter_default_version(tinydir VERSION 1.2-p0) +hunter_default_version(tinyxml2 VERSION 6.2.0-p1) +hunter_default_version(tmxparser VERSION 2.1.0-ab4125b-p1) +hunter_default_version(toluapp VERSION 1.0.93-p1) +hunter_default_version(tomcrypt VERSION 1.18.2-p1) +hunter_default_version(tommath VERSION 1.0.1-p0) +hunter_default_version(tvm VERSION 0.5-a4bc50e-p0) +hunter_default_version(type_safe VERSION 0.2.1-p2) +hunter_default_version(units VERSION 2.3.1) +hunter_default_version(utf8 VERSION 2.3.4-p1) +hunter_default_version(util_linux VERSION 2.30.1) +hunter_default_version(v8 VERSION 7.4.98-p3) +hunter_default_version(vectorial VERSION 0.0.0-ae7dc88-p0) +hunter_default_version(vorbis VERSION 1.3.6-p1) +hunter_default_version(websocketpp VERSION 0.8.1-p0) +hunter_default_version(wt VERSION 4.0.4-p0) +hunter_default_version(wxWidgets VERSION 3.0.2) +hunter_default_version(wyrm VERSION 0.1.0) +hunter_default_version(x11 VERSION 1.6.7) +hunter_default_version(x264 VERSION snapshot-20190513-2245) +hunter_default_version(xau VERSION 1.0.9) +hunter_default_version(xcb VERSION 1.13) +hunter_default_version(xcb-proto VERSION 1.13) +hunter_default_version(xcursor VERSION 1.1.13) +hunter_default_version(xdamage VERSION 1.1.4) +hunter_default_version(xext VERSION 1.3.1) +hunter_default_version(xextproto VERSION 7.3.0) +hunter_default_version(xf86vidmodeproto VERSION 2.3.1) +hunter_default_version(xfixes VERSION 5.0.3) +hunter_default_version(xgboost VERSION 0.7.0-p4) +hunter_default_version(xi VERSION 1.6.1) +hunter_default_version(xinerama VERSION 1.1.2) +hunter_default_version(xineramaproto VERSION 1.1.2) +hunter_default_version(xorg-macros VERSION 1.19.2) +hunter_default_version(xproto VERSION 7.0.31) +hunter_default_version(xrandr VERSION 1.3.2) +hunter_default_version(xrender VERSION 0.9.7) +hunter_default_version(xshmfence VERSION 1.3) +hunter_default_version(xtrans VERSION 1.4.0) +hunter_default_version(xxf86vm VERSION 1.1.2) +hunter_default_version(xxhash VERSION 0.6.5-p0) +hunter_default_version(yaml-cpp VERSION 0.6.2-0f9a586-p1) +hunter_default_version(zip VERSION 0.1.15) +hunter_default_version(zookeeper VERSION 3.4.9-p2) + +if(ANDROID) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "" _is_empty) if(_is_empty) - hunter_user_error("ANDROID_NATIVE_API_LEVEL is empty") + hunter_user_error("CMAKE_SYSTEM_VERSION is empty") endif() - string(COMPARE EQUAL "${ANDROID_NATIVE_API_LEVEL}" "21" _is_api_21) - string(COMPARE EQUAL "${ANDROID_NATIVE_API_LEVEL}" "19" _is_api_19) - string(COMPARE EQUAL "${ANDROID_NATIVE_API_LEVEL}" "16" _is_api_16) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "24" _is_api_24) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "22" _is_api_22) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "21" _is_api_21) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "19" _is_api_19) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "16" _is_api_16) + + set(__HUNTER_LAST_DEFAULT_VERSION_NAME "") # Reset alphabetical order checker if(_is_api_21) - hunter_config(Android-Google-APIs VERSION 21_r01) - hunter_config(Android-Google-APIs-Intel-x86-Atom-System-Image VERSION 21_r10) - hunter_config(Android-Intel-x86-Atom-System-Image VERSION 21) - hunter_config(Android-SDK-Platform VERSION 21_r02) - hunter_config(Sources-for-Android-SDK VERSION 21) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 21_r04) + hunter_default_version(Android-Google-APIs VERSION 21_r01) + hunter_default_version(Android-Google-APIs-Intel-x86-Atom-System-Image VERSION 21_r10) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 21_r05) + hunter_default_version(Android-SDK-Platform VERSION 21_r02) + hunter_default_version(Sources-for-Android-SDK VERSION 21) elseif(_is_api_19) - hunter_config(Android-Google-APIs VERSION 19_r18) - hunter_config(Android-Intel-x86-Atom-System-Image VERSION 19) - hunter_config(Android-SDK-Platform VERSION 19_r04) - hunter_config(Sources-for-Android-SDK VERSION 19) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 19_r05) + hunter_default_version(Android-Google-APIs VERSION 19_r18) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 19) + hunter_default_version(Android-SDK-Platform VERSION 19_r04) + hunter_default_version(Sources-for-Android-SDK VERSION 19) elseif(_is_api_16) - hunter_config(Android-Google-APIs VERSION 16_r04) - hunter_config(Android-Intel-x86-Atom-System-Image VERSION 16) - hunter_config(Android-SDK-Platform VERSION 16_r05) - hunter_config(Sources-for-Android-SDK VERSION 16) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 16_r04) + hunter_default_version(Android-Google-APIs VERSION 16_r04) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 16) + hunter_default_version(Android-MIPS-System-Image VERSION 16_r04) + hunter_default_version(Android-SDK-Platform VERSION 16_r05) + hunter_default_version(Sources-for-Android-SDK VERSION 16) + elseif(_is_api_22) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 22_r02) + hunter_default_version(Android-Google-APIs VERSION 22_r01) + hunter_default_version(Android-Google-APIs-Intel-x86-Atom-System-Image VERSION 22_r21) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 22_r06) + hunter_default_version(Android-SDK-Platform VERSION 22_r02) + hunter_default_version(Sources-for-Android-SDK VERSION 22) + elseif(_is_api_24) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 24_r07) + hunter_default_version(Android-ARM64-v8a-System-Image VERSION 24_r07) + hunter_default_version(Android-Google-APIs VERSION 24_r1) + hunter_default_version(Android-Google-APIs-Intel-x86-Atom-System-Image VERSION 24_r20) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 24_r08) + hunter_default_version(Android-SDK-Platform VERSION 24_r02) + hunter_default_version(Sources-for-Android-SDK VERSION 24) else() - hunter_user_error( - "Android API (ANDROID_NATIVE_API_LEVEL)" - " Expected: `21`, `19`, `16`" - " Got: `${ANDROID_NATIVE_API_LEVEL}`" - ) + # TODO: Add more versions endif() endif() diff --git a/cmake/find/FindBoost.cmake b/cmake/find/FindBoost.cmake index de7c74add..c3f3a9cb5 100644 --- a/cmake/find/FindBoost.cmake +++ b/cmake/find/FindBoost.cmake @@ -1030,6 +1030,19 @@ foreach(COMPONENT ${Boost_FIND_COMPONENTS}) ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION} ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG} ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT} ) + + # In Hunter it's possible to have only one variant in root, + # so it's okay to add all of them to search. + foreach(__type i x a m) + foreach(__bit 32 64) + list( + APPEND + _boost_RELEASE_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${__type}${__bit} + ) + endforeach() + endforeach() + if(_boost_STATIC_RUNTIME_WORKAROUND) set(_boost_RELEASE_STATIC_ABI_TAG "-s${_boost_RELEASE_ABI_TAG}") list(APPEND _boost_RELEASE_NAMES @@ -1072,6 +1085,19 @@ foreach(COMPONENT ${Boost_FIND_COMPONENTS}) ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG} ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED} ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT} ) + + # In Hunter it's possible to have only one variant in root, + # so it's okay to add all of them to search. + foreach(__type i x a m) + foreach(__bit 32 64) + list( + APPEND + _boost_DEBUG_NAMES + ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${__type}${__bit} + ) + endforeach() + endforeach() + if(_boost_STATIC_RUNTIME_WORKAROUND) set(_boost_DEBUG_STATIC_ABI_TAG "-s${_boost_DEBUG_ABI_TAG}") list(APPEND _boost_DEBUG_NAMES diff --git a/cmake/find/FindEigen.cmake b/cmake/find/FindEigen.cmake deleted file mode 100644 index 7158a593b..000000000 --- a/cmake/find/FindEigen.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2015, Ruslan Baratov -# All rights reserved. - -if(NOT TARGET Eigen::eigen) - add_library(Eigen::eigen INTERFACE IMPORTED) - set_target_properties( - Eigen::eigen - PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${HUNTER_INSTALL_PREFIX}/include/eigen3" - ) -endif() diff --git a/cmake/find/FindJPEG.cmake b/cmake/find/FindJPEG.cmake deleted file mode 100644 index c5257e8f4..000000000 --- a/cmake/find/FindJPEG.cmake +++ /dev/null @@ -1,22 +0,0 @@ -if(HUNTER_STATUS_DEBUG) - message("[hunter] Custom FindJPEG module") -endif() - -find_package(JPEG CONFIG REQUIRED) -set(JPEG_LIBRARY JPEG::jpeg) -set(JPEG_INCLUDE_DIR "${JPEG_ROOT}/include") - -# handle the QUIETLY and REQUIRED arguments and set JPEG_FOUND to TRUE if -# all listed variables are TRUE -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(JPEG REQUIRED_VARS JPEG_LIBRARY JPEG_INCLUDE_DIR) - -if(JPEG_FOUND) - set(JPEG_LIBRARIES ${JPEG_LIBRARY}) -endif() - -# Do not mark as advanced: -# * JPEG_INCLUDE_DIR -# * JPEG_LIBRARY -# Problem with FindJasper. Looks like it's loading standard module anyway so -# expect some variables to be visible, otherwise will start a search again. diff --git a/cmake/find/FindOpenSSL.cmake b/cmake/find/FindOpenSSL.cmake index e765c99e2..c9265523f 100644 --- a/cmake/find/FindOpenSSL.cmake +++ b/cmake/find/FindOpenSSL.cmake @@ -118,8 +118,11 @@ if(WIN32 AND NOT CYGWIN) find_library(LIB_EAY_DEBUG NAMES + libcrypto${_OPENSSL_MSVC_RT_MODE}d + libcryptod libeay32${_OPENSSL_MSVC_RT_MODE}d libeay32d + cryptod HINTS "${OPENSSL_ROOT}" PATH_SUFFIXES @@ -128,8 +131,11 @@ if(WIN32 AND NOT CYGWIN) find_library(LIB_EAY_RELEASE NAMES + libcrypto${_OPENSSL_MSVC_RT_MODE} + libcrypto libeay32${_OPENSSL_MSVC_RT_MODE} libeay32 + crypto HINTS "${OPENSSL_ROOT}" PATH_SUFFIXES @@ -138,8 +144,11 @@ if(WIN32 AND NOT CYGWIN) find_library(SSL_EAY_DEBUG NAMES + libssl${_OPENSSL_MSVC_RT_MODE}d + libssld ssleay32${_OPENSSL_MSVC_RT_MODE}d ssleay32d + ssld HINTS "${OPENSSL_ROOT}" PATH_SUFFIXES @@ -148,6 +157,8 @@ if(WIN32 AND NOT CYGWIN) find_library(SSL_EAY_RELEASE NAMES + libssl${_OPENSSL_MSVC_RT_MODE} + libssl ssleay32${_OPENSSL_MSVC_RT_MODE} ssleay32 ssl @@ -362,8 +373,15 @@ if(OPENSSL_FOUND) add_library(OpenSSL::Crypto UNKNOWN IMPORTED) set_target_properties(OpenSSL::Crypto PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}") + find_package(Threads REQUIRED) + if(WIN32) + # https://github.com/openssl/openssl/issues/1061 + set(_openssl_win32_crypt "crypt32") + else() + set(_openssl_win32_crypt "") + endif() set_target_properties(OpenSSL::Crypto PROPERTIES - INTERFACE_LINK_LIBRARIES "${CMAKE_DL_LIBS}") + INTERFACE_LINK_LIBRARIES "${CMAKE_DL_LIBS};Threads::Threads;${_openssl_win32_crypt}") if(EXISTS "${OPENSSL_CRYPTO_LIBRARY}") set_target_properties(OpenSSL::Crypto PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" diff --git a/cmake/find/FindSQLite3.cmake b/cmake/find/FindSQLite3.cmake deleted file mode 100644 index 7e0f4a63b..000000000 --- a/cmake/find/FindSQLite3.cmake +++ /dev/null @@ -1,67 +0,0 @@ -# ---------------------------------------------------------------------- -# FindSQLite3.cmake - SQLite3 CMake module -# -# Copyright (C) 2015 Alexandre Pretyman. All rights reserved. -# -# ---------------------------------------------------------------------- - -if(NOT HUNTER_ENABLED) - macro(hunter_status_debug) - message(${ARGV}) - endmacro() -endif() - -hunter_status_debug("SQLITE3_ROOT: ${SQLITE3_ROOT}") - -find_path( - SQLITE3_INCLUDE_DIR - sqlite3.h - PATHS - "${SQLITE3_ROOT}/include" - NO_DEFAULT_PATH -) - -hunter_status_debug("SQLITE3_INCLUDE_DIR: ${SQLITE3_INCLUDE_DIR}") - -find_library( - SQLITE3_LIBRARY - sqlite3 - PATHS - "${SQLITE3_ROOT}/lib" - NO_DEFAULT_PATH -) - -hunter_status_debug("SQLITE3_LIBRARY: ${SQLITE3_LIBRARY}") - -if(NOT TARGET "SQLite3") - if(SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY) - set(SQLITE3_FOUND TRUE) - add_library("SQLite3" UNKNOWN IMPORTED) - set_target_properties("SQLite3" - PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${SQLITE3_INCLUDE_DIR}" - IMPORTED_LOCATION "${SQLITE3_LIBRARY}" - ) - get_filename_component( - SQLITE3_LIB_DIR - "${SQLITE3_LIBRARY}" - DIRECTORY CACHE - ) - - if(UNIX AND NOT APPLE AND NOT ANDROID) # if Linux - string(REGEX MATCH "\\.a$" _ends_in_dot_a "${SQLITE3_LIBRARY}") - string(COMPARE NOTEQUAL "${_ends_in_dot_a}" "" _sqlite_is_static) - if(_sqlite_is_static) - # when static linking we need to add pthread and dl libraries - find_package(Threads REQUIRED) - list(APPEND _sqlite3_static_library_dependencies Threads::Threads ${CMAKE_DL_LIBS}) - set_target_properties("SQLite3" - PROPERTIES - INTERFACE_LINK_LIBRARIES "${_sqlite3_static_library_dependencies}" - ) - endif() - endif() - elseif(SQLite3_FIND_REQUIRED) - message(FATAL_ERROR "Could not find SQLite3") - endif() -endif() diff --git a/cmake/find/Findodb.cmake b/cmake/find/Findodb.cmake index 04aafe4f1..3917e4cdb 100644 --- a/cmake/find/Findodb.cmake +++ b/cmake/find/Findodb.cmake @@ -80,8 +80,8 @@ foreach(_odb_component ${odb_FIND_COMPONENTS}) string(COMPARE EQUAL "${_odb_component}" "mysql" is_mysql) string(COMPARE EQUAL "${_odb_component}" "boost" is_boost) if(is_sqlite) - find_package(SQLite3 REQUIRED) - list(APPEND _component_link_libraries "SQLite3") + find_package(sqlite3 CONFIG REQUIRED) + list(APPEND _component_link_libraries "sqlite3::sqlite3") elseif(is_pgsql) find_package(PostgreSQL REQUIRED) list(APPEND _component_link_libraries "PostgreSQL::libpq") diff --git a/cmake/modules/hunter_add_package.cmake b/cmake/modules/hunter_add_package.cmake index 5b6c03338..f9826ee88 100644 --- a/cmake/modules/hunter_add_package.cmake +++ b/cmake/modules/hunter_add_package.cmake @@ -5,9 +5,9 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_fatal_error) include(hunter_finalize) +include(hunter_get_project_files_to_load) include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) # internal variables: _hunter_ap_* macro(hunter_add_package) @@ -15,7 +15,7 @@ macro(hunter_add_package) if(_project_name_is_empty) hunter_fatal_error( "Please set hunter_add_package *after* project command" - WIKI "error.hunteraddpackage.after.project" + ERROR_PAGE "error.hunteraddpackage.after.project" ) endif() @@ -36,55 +36,31 @@ macro(hunter_add_package) endif() list(GET _hunter_ap_arg_UNPARSED_ARGUMENTS 0 _hunter_ap_project) - hunter_test_string_not_empty("${HUNTER_SELF}") - set( - _hunter_ap_project_dir - "${HUNTER_SELF}/cmake/projects/${_hunter_ap_project}" + hunter_get_project_files_to_load( + PROJECT_NAME "${_hunter_ap_project}" + COMPONENTS "${_hunter_ap_arg_COMPONENTS}" + FILES _hunter_ap_list + NEW_INJECTED_PACKAGE _hunter_ap_new_injected_package ) - if(NOT EXISTS "${_hunter_ap_project_dir}") - hunter_internal_error("Project '${_hunter_ap_project}' not found") - endif() - if(NOT IS_DIRECTORY "${_hunter_ap_project_dir}") - hunter_internal_error("Project '${_hunter_ap_project}' not found") - endif() - - # Check components - foreach(_hunter_ap_component ${_hunter_ap_arg_COMPONENTS}) - set( - _hunter_ap_component_dir - "${_hunter_ap_project_dir}/${_hunter_ap_component}" - ) - if(NOT EXISTS "${_hunter_ap_component_dir}") - hunter_internal_error( - "Component '${_hunter_ap_component}' not found " - "in project '${_hunter_ap_project}'" - ) - endif() - if(NOT IS_DIRECTORY "${_hunter_ap_component_dir}") - hunter_internal_error( - "Component '${_hunter_ap_component}' not found " - "in project '${_hunter_ap_project}'" - ) - endif() - endforeach() - unset(_hunter_ap_list) - list(APPEND _hunter_ap_list "${_hunter_ap_project_dir}/hunter.cmake") - - # Load components - foreach(_hunter_ap_component ${_hunter_ap_arg_COMPONENTS}) - list( - APPEND - _hunter_ap_list - "${_hunter_ap_project_dir}/${_hunter_ap_component}/hunter.cmake" - ) - endforeach() - - # do not use any variables after this 'foreach', because included files - # may call 'hunter_add_package' and rewrite it - foreach(x ${_hunter_ap_list}) - hunter_status_debug("load: ${x}") - include("${x}") - hunter_status_debug("load: ${x} ... end") - endforeach() + if(_hunter_ap_new_injected_package) + hunter_status_debug("Injected package '${_hunter_ap_project}'") + include(hunter_cacheable) + include(hunter_download) + include(hunter_pick_scheme) + hunter_pick_scheme(DEFAULT url_sha1_cmake) + hunter_cacheable("${_hunter_ap_project}") + hunter_download(PACKAGE_NAME "${_hunter_ap_project}") + else() + # do not use any variables after this 'foreach', because included files + # may call 'hunter_add_package' and rewrite it + foreach(x ${_hunter_ap_list}) + hunter_status_debug("load: ${x}") + if(NOT EXISTS "${x}") + hunter_internal_error("File not found: '${x}'") + endif() + include("${x}") + hunter_status_debug("load: ${x} ... end") + endforeach() + endif() endmacro() diff --git a/cmake/modules/hunter_add_version.cmake b/cmake/modules/hunter_add_version.cmake index fe0ae9009..7c750db55 100644 --- a/cmake/modules/hunter_add_version.cmake +++ b/cmake/modules/hunter_add_version.cmake @@ -5,6 +5,7 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_internal_error) include(hunter_status_debug) +include(hunter_user_error) # If 'HUNTER__VERSION' is equal to 'h_VERSION', then # this function will set 'HUNTER__URL' and 'HUNTER__SHA1'. @@ -42,17 +43,24 @@ function(hunter_add_version) hunter_internal_error( "HUNTER__VERSION can't be empty " "(${h_PACKAGE_NAME})" - "(probably `hunter_config(...)` missing in config file)" + "(probably hunter_default_version/hunter_config call is missing)" ) endif() string(COMPARE NOTEQUAL "${${expected_version}}" "${h_VERSION}" version_diff) if(version_diff) - hunter_status_debug( - "Skip '${h_VERSION}' (looking for '${${expected_version}}')" - ) return() endif() + set(user_url "${__HUNTER_FINAL_URL_${h_PACKAGE_NAME}}") + set(user_sha1 "${__HUNTER_FINAL_SHA1_${h_PACKAGE_NAME}}") + + if(NOT user_url STREQUAL "" OR NOT user_sha1 STREQUAL "") + hunter_user_error( + "${h_VERSION} already used in 'hunter.cmake'." + " Please specify another version in hunter_config(${h_PACKAGE_NAME})." + ) + endif() + # HUNTER__VERSION found set(h_url_name "HUNTER_${h_PACKAGE_NAME}_URL") set(h_sha1_name "HUNTER_${h_PACKAGE_NAME}_SHA1") diff --git a/cmake/modules/hunter_apply_copy_rules.cmake b/cmake/modules/hunter_apply_copy_rules.cmake index dfbb7ce87..010c0b06e 100644 --- a/cmake/modules/hunter_apply_copy_rules.cmake +++ b/cmake/modules/hunter_apply_copy_rules.cmake @@ -3,10 +3,10 @@ include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_apply_copy_rules) - hunter_test_string_not_empty("${HUNTER_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_INSTALL_PREFIX}") get_property(copy_list GLOBAL PROPERTY HUNTER_COPY_FILES) diff --git a/cmake/modules/hunter_apply_gate_settings.cmake b/cmake/modules/hunter_apply_gate_settings.cmake index 52fb2c236..04a69b464 100644 --- a/cmake/modules/hunter_apply_gate_settings.cmake +++ b/cmake/modules/hunter_apply_gate_settings.cmake @@ -12,9 +12,11 @@ include(hunter_check_flush_needed) include(hunter_internal_error) include(hunter_set_config_location) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_apply_gate_settings) + hunter_assert_not_empty_string("${HUNTER_CONFIGURATION_TYPES}") + get_property(gate_done GLOBAL PROPERTY HUNTER_GATE_SETTINGS_APPLIED SET) set_property(GLOBAL PROPERTY HUNTER_GATE_SETTINGS_APPLIED YES) @@ -53,6 +55,16 @@ function(hunter_apply_gate_settings) if(gate_done) if(cache_init) + # set *_ID_PATH variables in parent scope + string(SUBSTRING "${HUNTER_SHA1}" 0 7 HUNTER_ID) + string(SUBSTRING "${HUNTER_CONFIG_SHA1}" 0 7 HUNTER_CONFIG_ID) + string(SUBSTRING "${HUNTER_TOOLCHAIN_SHA1}" 0 7 HUNTER_TOOLCHAIN_ID) + set(HUNTER_ID_PATH "${HUNTER_CACHED_ROOT}/_Base/${HUNTER_ID}") + set(HUNTER_TOOLCHAIN_ID_PATH "${HUNTER_ID_PATH}/${HUNTER_TOOLCHAIN_ID}") + set(HUNTER_CONFIG_ID_PATH "${HUNTER_TOOLCHAIN_ID_PATH}/${HUNTER_CONFIG_ID}") + set(HUNTER_ID_PATH "${HUNTER_ID_PATH}" PARENT_SCOPE) + set(HUNTER_TOOLCHAIN_ID_PATH "${HUNTER_TOOLCHAIN_ID_PATH}" PARENT_SCOPE) + set(HUNTER_CONFIG_ID_PATH "${HUNTER_CONFIG_ID_PATH}" PARENT_SCOPE) hunter_status_debug("Reuse cached values") return() endif() @@ -74,16 +86,6 @@ function(hunter_apply_gate_settings) set(hunter_base "${HUNTER_GATE_ROOT}/_Base") - # HUNTER_GATE_CONFIG_SHA1 - hunter_calculate_config_sha1( - "${hunter_self}" "${hunter_base}" "${config_location}" - ) - - string(COMPARE EQUAL "${HUNTER_CONFIGURATION_TYPES}" "" use_default) - if(use_default) - set(HUNTER_CONFIGURATION_TYPES "Release;Debug") - endif() - foreach(configuration ${HUNTER_CONFIGURATION_TYPES}) string(TOUPPER "${configuration}" configuration_upper) string(COMPARE EQUAL "${configuration_upper}" "RELEASE" is_release) @@ -102,14 +104,69 @@ function(hunter_apply_gate_settings) endif() endforeach() - # HUNTER_GATE_TOOLCHAIN_SHA1 - hunter_calculate_toolchain_sha1("${hunter_self}" "${hunter_base}") + hunter_make_directory("${hunter_base}" "${HUNTER_GATE_SHA1}" hunter_id_path) + + if("${HUNTER_TOOLCHAIN_SHA1}" STREQUAL "") + set(skip_toolchain_calculation NO) + elseif(HUNTER_NO_TOOLCHAIN_ID_RECALCULATION) + hunter_make_directory( + "${hunter_id_path}" + "${HUNTER_TOOLCHAIN_SHA1}" + hunter_toolchain_id_path + ) + if(EXISTS "${hunter_toolchain_id_path}/toolchain.info") + set(skip_toolchain_calculation YES) + else() + set(skip_toolchain_calculation NO) + endif() + else() + set(skip_toolchain_calculation NO) + endif() + + if(skip_toolchain_calculation) + hunter_status_debug("Toolchain-ID recalculation will be skipped") + set(HUNTER_GATE_TOOLCHAIN_SHA1 "${HUNTER_TOOLCHAIN_SHA1}") + else() + # * defines: HUNTER_GATE_TOOLCHAIN_SHA1 + # * needs: HUNTER_CONFIGURATION_TYPES + # * needs: HUNTER_BUILD_SHARED_LIBS + # * creates: global_toolchain_info at + # "${hunter_base}/${HUNTER_GATE_SHA1}/${HUNTER_GATE_TOOLCHAIN_SHA1}/toolchain.info" + hunter_calculate_toolchain_sha1("${hunter_self}" "${hunter_base}") + endif() + + # set PATH variables for hunter and toolchain + hunter_make_directory( + "${hunter_id_path}" + "${HUNTER_GATE_TOOLCHAIN_SHA1}" + hunter_toolchain_id_path + ) + set(HUNTER_ID_PATH "${hunter_id_path}" PARENT_SCOPE) + set(HUNTER_TOOLCHAIN_ID_PATH "${hunter_toolchain_id_path}") + set(HUNTER_TOOLCHAIN_ID_PATH "${hunter_toolchain_id_path}" PARENT_SCOPE) + + # * defines: HUNTER_GATE_CONFIG_SHA1 + # * needs: HUNTER_TOOLCHAIN_ID_PATH + # * creates: unified global config file at + # "${hunter_base}/${HUNTER_GATE_SHA1}/${HUNTER_GATE_TOOLCHAIN_SHA1}/${HUNTER_GATE_CONFIG_SHA1/config.cmake" + hunter_calculate_config_sha1( + "${hunter_self}" "${hunter_base}" "${config_location}" + ) + # set PATH variables for config folder + hunter_make_directory( + "${hunter_toolchain_id_path}" + "${HUNTER_GATE_CONFIG_SHA1}" + hunter_config_id_path + ) + set(HUNTER_CONFIG_ID_PATH "${hunter_config_id_path}" PARENT_SCOPE) + - hunter_test_string_not_empty("${HUNTER_GATE_ROOT}") - hunter_test_string_not_empty("${HUNTER_GATE_SHA1}") - hunter_test_string_not_empty("${HUNTER_GATE_CONFIG_SHA1}") - hunter_test_string_not_empty("${HUNTER_GATE_VERSION}") - hunter_test_string_not_empty("${HUNTER_GATE_TOOLCHAIN_SHA1}") + # test if mandatory variables are set + hunter_assert_not_empty_string("${HUNTER_GATE_ROOT}") + hunter_assert_not_empty_string("${HUNTER_GATE_SHA1}") + hunter_assert_not_empty_string("${HUNTER_GATE_CONFIG_SHA1}") + hunter_assert_not_empty_string("${HUNTER_GATE_VERSION}") + hunter_assert_not_empty_string("${HUNTER_GATE_TOOLCHAIN_SHA1}") if(cache_init) hunter_check_flush_needed("${hunter_self}" flush_done) @@ -122,9 +179,9 @@ function(hunter_apply_gate_settings) endif() # See hunter_initialize - hunter_test_string_not_empty("${HUNTER_CACHED_ROOT}") - hunter_test_string_not_empty("${HUNTER_VERSION}") - hunter_test_string_not_empty("${HUNTER_SHA1}") + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_VERSION}") + hunter_assert_not_empty_string("${HUNTER_SHA1}") # This variables will be saved in HUNTER_CACHE_FILE (hunter_create_cache_file) set(HUNTER_CONFIG_SHA1 "${HUNTER_GATE_CONFIG_SHA1}" CACHE INTERNAL "") @@ -146,4 +203,11 @@ function(hunter_apply_gate_settings) "" ) endforeach() + set( + HUNTER_CACHED_BUILD_SHARED_LIBS + "${HUNTER_BUILD_SHARED_LIBS}" + CACHE + INTERNAL + "" + ) endfunction() diff --git a/cmake/modules/hunter_autotools_project.cmake b/cmake/modules/hunter_autotools_project.cmake index 4308243ac..fab01d7cb 100644 --- a/cmake/modules/hunter_autotools_project.cmake +++ b/cmake/modules/hunter_autotools_project.cmake @@ -8,7 +8,7 @@ # # Adds to the environment variables: # PATH=/bin -# PKG_CONFIG_PATH=/{lib,share}/pkgconfig +# PKG_CONFIG_LIBDIR=/{lib,share}/pkgconfig # # Adds to autotools flags: # CPPFLAGS=-I/include @@ -48,6 +48,9 @@ # --enable-feature # --disable-other # --with-library +# PATCH_COMMAND # add a patch command +# ${CMAKE_COMMAND} -E copy "@HUNTER_PACKAGE_SCRIPT_DIR@/patch.sh" "@HUNTER_PACKAGE_SOURCE_DIR@" +# COMMAND "./patch.sh" # BOOTSTRAP # add a bootstrap command to be run # "./autogen.sh" # before ./configure such as # # ./autogen.sh or ./bootstrap @@ -56,12 +59,17 @@ include(ExternalProject) # ExternalProject_Add include(CMakeParseArguments) # cmake_parse_arguments -include(hunter_fatal_error) +include(hunter_autotools_configure_command) +include(hunter_user_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) +# Packages to test this function: +# * xau +# * gstreamer +# * libxml2 +# * ncursesw function(hunter_autotools_project target_name) - set(optional_params) set(one_value_params HUNTER_SELF @@ -82,6 +90,7 @@ function(hunter_autotools_project target_name) set(multi_value_params PACKAGE_CONFIGURATION_TYPES EXTRA_FLAGS + PATCH_COMMAND ) cmake_parse_arguments( PARAM @@ -96,255 +105,77 @@ function(hunter_autotools_project target_name) if(PARAM_UNPARSED_ARGUMENTS) hunter_internal_error( - "Invalid arguments passed to hunter_autotools_configure:" + "Invalid arguments passed to hunter_autotools_project:" " ${PARAM_UNPARSED_ARGUMENTS}" ) endif() - hunter_test_string_not_empty("${PARAM_BUILD_DIR}") - hunter_test_string_not_empty("${PARAM_GLOBAL_INSTALL_DIR}") - hunter_test_string_not_empty("${PARAM_INSTALL_DIR}") - hunter_test_string_not_empty("${PARAM_PACKAGE_CONFIGURATION_TYPES}") + hunter_assert_not_empty_string("${PARAM_BUILD_DIR}") + hunter_assert_not_empty_string("${PARAM_GLOBAL_INSTALL_DIR}") + hunter_assert_not_empty_string("${PARAM_INSTALL_DIR}") + hunter_assert_not_empty_string("${PARAM_PACKAGE_CONFIGURATION_TYPES}") - list(LENGTH PARAM_PACKAGE_CONFIGURATION_TYPES len) - if(NOT "${len}" EQUAL "1") - hunter_fatal_error( - "Autotools PACKAGE_CONFIGURATION_TYPES has ${len} elements: ${PARAM_PACKAGE_CONFIGURATION_TYPES}. Only 1 is allowed" - WIKI "autools.package.configuration.types" - ) - endif() - - string(TOUPPER ${PARAM_PACKAGE_CONFIGURATION_TYPES} config_type) - # Sets the toolchain binaries - # AR=${CMAKE_AR} - # AS=${CMAKE_ASM_COMPILER} - # LD=${CMAKE_LINKER} - # NM=${CMAKE_NM} - # OBJCOPY=${CMAKE_OBJCOPY} - # OBJDUMP=${CMAKE_OBJDUMP} - # RANLIB=${CMAKE_RANLIB} - # STRIP=${CMAKE_STRIP} - # CPP=${CMAKE_C_PREPROCESSOR} - # CC=${CMAKE_C_COMPILER} - # CXX=${CMAKE_CXX_COMPILER} - # - set(toolchain_binaries) - if(CMAKE_AR) - list(APPEND toolchain_binaries AR=${CMAKE_AR}) - endif() - if(CMAKE_ASM_COMPILER) - list(APPEND toolchain_binaries AS=${CMAKE_ASM_COMPILER}) - endif() - if(CMAKE_LINKER) - list(APPEND toolchain_binaries LD=${CMAKE_LINKER}) - endif() - if(CMAKE_NM) - list(APPEND toolchain_binaries NM=${CMAKE_NM}) - endif() - if(CMAKE_OBJCOPY) - list(APPEND toolchain_binaries OBJCOPY=${CMAKE_OBJCOPY}) - endif() - if(CMAKE_OBJDUMP) - list(APPEND toolchain_binaries OBJDUMP=${CMAKE_OBJDUMP}) - endif() - if(CMAKE_RANLIB) - list(APPEND toolchain_binaries RANLIB=${CMAKE_RANLIB}) - endif() - if(CMAKE_STRIP) - list(APPEND toolchain_binaries STRIP=${CMAKE_STRIP}) - endif() - if(CMAKE_C_PREPROCESSOR) - list(APPEND toolchain_binaries CPP=${CMAKE_C_PREPROCESSOR}) - endif() - if(CMAKE_C_COMPILER) - list(APPEND toolchain_binaries CC=${CMAKE_C_COMPILER}) - endif() - if(CMAKE_CXX_COMPILER) - list(APPEND toolchain_binaries CXX=${CMAKE_CXX_COMPILER}) - endif() - - string(STRIP "${toolchain_binaries}" toolchain_binaries) - if(HUNTER_STATUS_DEBUG) - string( - REPLACE ";" "\n" toolchain_binaries_new_line "${toolchain_binaries}" - ) - hunter_status_debug("Toolchain Binaries:") - foreach(x ${toolchain_binaries}) - hunter_status_debug(" ${x}") - endforeach() - endif() + set(default_path "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin") + set(shell_env_path "PATH=${PARAM_GLOBAL_INSTALL_DIR}/bin:${default_path}") - # CPPFLAGS=${PARAM_CPPFLAGS} [-D${COMPILE_DEFINITIONS}] - # [-I${INCLUDE_DIRECTORIES}] - # - # C Preprocessor flags - set(cppflags "-I${PARAM_GLOBAL_INSTALL_DIR}/include") - # build config type definitions - get_directory_property(defs - COMPILE_DEFINITIONS_${config_type} - ) - foreach(def ${defs}) - set(cppflags "${cppflags} -D${def}") - endforeach() - # non-build config specific definitions - get_directory_property(defs COMPILE_DEFINITIONS) - foreach(def ${defs}) - set(cppflags "${cppflags} -D${def}") - endforeach() + set(shell_ld_path "LD_LIBRARY_PATH=${PARAM_GLOBAL_INSTALL_DIR}/lib:$ENV{LD_LIBRARY_PATH}") - get_directory_property(include_dirs INCLUDE_DIRECTORIES) - foreach(include_dir ${include_dirs}) - set(cppflags - "${cppflags} ${CMAKE_INCLUDE_SYSTEM_FLAG_CXX} ${include_dir}" - ) - endforeach() + set(d1 "${PARAM_GLOBAL_INSTALL_DIR}/lib/pkgconfig") + set(d2 "${PARAM_GLOBAL_INSTALL_DIR}/share/pkgconfig") + set(shell_pkg_config_libdir "PKG_CONFIG_LIBDIR=${d1}:${d2}") - set(cppflags "${cppflags} ${PARAM_CPPFLAGS}") - string(STRIP "${cppflags}" cppflags) - hunter_status_debug("CPPFLAGS=${cppflags}") + set(clear_vars_shell_script "${PARAM_HUNTER_SELF}/scripts/clear-all.sh") - # CFLAGS=${cflags} ${CMAKE_C_FLAGS} - # - # C Compiler Flags (defines or include directories should not be needed here) - set(cflags "${CMAKE_C_FLAGS_${config_type}} ${CMAKE_C_FLAGS} ${PARAM_CFLAGS}") - string(STRIP "${cflags}" cflags) - hunter_status_debug("CFLAGS=${cflags}") + set(shell_env + . + ${clear_vars_shell_script} + && + ${shell_env_path} + ${shell_pkg_config_libdir} + ${shell_ld_path} + ) - # CXXFLAGS=${cxxflags} ${CMAKE_CXX_FLAGS} - # - # C++ Compiler flags (defines or include directories should not be needed here) - set(cxxflags "${CMAKE_CXX_FLAGS_${config_type}} ${CMAKE_CXX_FLAGS} ${PARAM_CXXFLAGS}") - string(STRIP "${cxxflags}" cxxflags) - hunter_status_debug("CXXFLAGS=${cxxflags}") + # Build command and options + set(autotools_build_command "make") + string(COMPARE NOTEQUAL "${PARAM_PARALLEL_JOBS}" "" have_jobs) + if(have_jobs) + list(APPEND autotools_build_command "-j" "${PARAM_PARALLEL_JOBS}") + endif() - # LDFLAGS=${ldflags} - # - # Linker flags - set(ldflags "-L${PARAM_GLOBAL_INSTALL_DIR}/lib") - set(ldflags "${ldflags} ${CMAKE_EXE_LINKER_FLAGS_${config_type}}") - string(STRIP "${ldflags}" ldflags) - set(ldflags "${ldflags} ${CMAKE_EXE_LINKER_FLAGS}") - string(STRIP "${ldflags}" ldflags) - set(ldflags "${ldflags} ${PARAM_LDFLAGS}") - string(STRIP "${ldflags}" ldflags) - hunter_status_debug("LDFLAGS=${ldflags}") + set(build_command ${shell_env} ${autotools_build_command}) - set(configure_host) - string(COMPARE NOTEQUAL "${ANDROID}" "" is_android) string(COMPARE NOTEQUAL "${IPHONEOS_ARCHS}${IPHONESIMULATOR_ARCHS}" "" is_ios) - string(COMPARE NOTEQUAL "${CROSS_COMPILE_TOOLCHAIN_PREFIX}" "" is_cross_compile) - if(is_android) - # AWP: the checks below should also be done for the Raspberry Pi - # how could we do it without repetition? - hunter_test_string_not_empty("${CMAKE_C_FLAGS}") - hunter_test_string_not_empty("${CMAKE_CXX_FLAGS}") - hunter_test_string_not_empty("${CMAKE_AR}") - hunter_test_string_not_empty("${CMAKE_C_PREPROCESSOR}") - hunter_test_string_not_empty("${CMAKE_C_COMPILER}") - hunter_test_string_not_empty("${CMAKE_CXX_COMPILER}") - hunter_test_string_not_empty("${CMAKE_LINKER}") - hunter_test_string_not_empty("${CMAKE_NM}") - hunter_test_string_not_empty("${CMAKE_OBJCOPY}") - hunter_test_string_not_empty("${CMAKE_OBJDUMP}") - hunter_test_string_not_empty("${CMAKE_RANLIB}") - hunter_test_string_not_empty("${CMAKE_STRIP}") - - hunter_test_string_not_empty("${ANDROID_TOOLCHAIN_MACHINE_NAME}") - set(configure_host --host=${ANDROID_TOOLCHAIN_MACHINE_NAME}) - set(ldflags "${ldflags} ${__libstl}") - elseif(is_ios) + if(is_ios) hunter_status_debug("Autotools iOS IPHONEOS_ARCHS: ${IPHONEOS_ARCHS} IPHONESIMULATOR_ARCHS: ${IPHONESIMULATOR_ARCHS}") if(BUILD_SHARED_LIBS) - hunter_fatal_error("Autotools: building iOS libraries as shared is not supported") + hunter_user_error("Autotools: building iOS libraries as shared is not supported") endif() set(ios_architectures) list(APPEND ios_architectures ${IPHONEOS_ARCHS} ${IPHONESIMULATOR_ARCHS}) - elseif(is_cross_compile) - set(configure_host --host=${CROSS_COMPILE_TOOLCHAIN_PREFIX}) - endif() - - # Hunter builds static libraries by default - if(BUILD_SHARED_LIBS) - list(APPEND PARAM_EXTRA_FLAGS --enable-shared --disable-static) - else() - list(APPEND PARAM_EXTRA_FLAGS --disable-shared --enable-static) - endif() - - if(HUNTER_STATUS_DEBUG) - string(REPLACE ";" " " extra_flags "${PARAM_EXTRA_FLAGS}") - hunter_status_debug("EXTRA_FLAGS=${extra_flags}") - endif() - - # Build command and options - set(build_command . "${PARAM_HUNTER_SELF}/scripts/clear-all.sh" && make) - set(build_opts) - string(COMPARE NOTEQUAL "${PARAM_PARALLEL_JOBS}" "" have_jobs) - if(have_jobs) - list(APPEND build_opts "-j" "${PARAM_PARALLEL_JOBS}") - endif() - - set(configure_command . "${PARAM_HUNTER_SELF}/scripts/clear-all.sh" &&) - list(APPEND configure_command AR=${CMAKE_AR}) - - # see clear-all.sh - # PATH environment variable - set(default_path "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin") - list( - APPEND - configure_command - "PATH=${PARAM_GLOBAL_INSTALL_DIR}/bin:${default_path}" - ) - - # PKG_CONFIG_PATH environment variable - set(d1 "${PARAM_GLOBAL_INSTALL_DIR}/lib/pkgconfig") - set(d2 "${PARAM_GLOBAL_INSTALL_DIR}/share/pkgconfig") - list(APPEND configure_command "PKG_CONFIG_PATH=${d1}:${d2}") - - string(COMPARE NOTEQUAL "${PARAM_BOOTSTRAP}" "" have_bootstrap) - if(have_bootstrap) - list(APPEND configure_command "${PARAM_BOOTSTRAP}" &&) - endif() - - list(APPEND configure_command "./configure") - - # Build the configure command line options - set(configure_opts) - string(COMPARE NOTEQUAL "${configure_host}" "" has_configure_host) - if(has_configure_host) - list(APPEND configure_opts ${configure_host}) - endif() - - string(COMPARE NOTEQUAL "${toolchain_binaries}" "" has_changes) - if(has_changes) - list(APPEND configure_opts ${toolchain_binaries}) - endif() - - string(COMPARE NOTEQUAL "${cppflags}" "" has_cppflags) - if(has_cppflags) - list(APPEND configure_opts CPPFLAGS=${cppflags}) endif() - string(COMPARE NOTEQUAL "${cflags}" "" has_cflags) - if(has_cflags) - list(APPEND configure_opts CFLAGS=${cflags}) - endif() - - string(COMPARE NOTEQUAL "${cxxflags}" "" has_cxxflags) - if(has_cxxflags) - list(APPEND configure_opts CXXFLAGS=${cxxflags}) - endif() - - string(COMPARE NOTEQUAL "${ldflags}" "" hasldflags) - if(hasldflags) - list(APPEND configure_opts LDFLAGS=${ldflags}) - endif() + if(NOT is_ios) + hunter_autotools_configure_command(autotools_configure_command + PACKAGE_INSTALL_DIR + ${PARAM_INSTALL_DIR} + EXTRA_FLAGS + ${PARAM_EXTRA_FLAGS} + INSTALL_DIR + ${PARAM_GLOBAL_INSTALL_DIR} + PACKAGE_CONFIGURATION_TYPES + ${PARAM_PACKAGE_CONFIGURATION_TYPES} + CPPFLAGS + ${PARAM_CPPFLAGS} + CFLAGS + ${PARAM_CFLAGS} + CXXFLAGS + ${PARAM_CXXFLAGS} + LDFLAGS + ${PARAM_LDFLAGS} + ) - if(PARAM_EXTRA_FLAGS) - list(APPEND configure_opts ${PARAM_EXTRA_FLAGS}) - endif() + set(configure_command ${shell_env} ${autotools_configure_command}) - if(NOT is_ios) - hunter_status_debug("Autotools configure_opts: ${configure_opts} ") ExternalProject_Add(${target_name} URL ${PARAM_URL} @@ -352,18 +183,21 @@ function(hunter_autotools_project target_name) ${PARAM_URL_HASH} DOWNLOAD_DIR ${PARAM_DOWNLOAD_DIR} + TLS_VERIFY + "${HUNTER_TLS_VERIFY}" SOURCE_DIR ${PARAM_SOURCE_DIR} INSTALL_DIR ${PARAM_INSTALL_DIR} # not used, just avoid creating Install/ empty directory + PATCH_COMMAND + ${PARAM_PATCH_COMMAND} CONFIGURE_COMMAND + "${PARAM_BOOTSTRAP}" + COMMAND ${configure_command} - ${configure_opts} - "--prefix=${PARAM_INSTALL_DIR}" BUILD_COMMAND ${build_command} - ${build_opts} BUILD_IN_SOURCE 1 INSTALL_COMMAND @@ -375,6 +209,8 @@ function(hunter_autotools_project target_name) ExternalProject_Add(${ios_universal_target} DOWNLOAD_COMMAND "" + TLS_VERIFY + "${HUNTER_TLS_VERIFY}" SOURCE_DIR ${PARAM_SOURCE_DIR}/universal INSTALL_DIR @@ -410,25 +246,41 @@ function(hunter_autotools_project target_name) set(configure_host "x86_64-apple-darwin") set(is_simulator TRUE) else() - hunter_fatal_error("iOS architecture: ${ios_architecture} not supported") + hunter_user_error("iOS architecture: ${ios_architecture} not supported") endif() set(arch_flags) - set(configure_opts) # Extra space at the end of the arch_flags is needed below when appending # to configure_opts, please do not remove! if(is_simulator) - set(arch_flags "-arch ${ios_architecture} -isysroot ${IPHONESIMULATOR_SDK_ROOT} -miphoneos-version-min=${IOS_SDK_VERSION} ") + set(arch_flags "-arch ${ios_architecture} -isysroot ${IPHONESIMULATOR_SDK_ROOT} ") else() - set(arch_flags "-arch ${ios_architecture} -isysroot ${IPHONEOS_SDK_ROOT} -miphoneos-version-min=${IOS_SDK_VERSION} ") + set(arch_flags "-arch ${ios_architecture} -isysroot ${IPHONEOS_SDK_ROOT} ") endif() - list(APPEND configure_opts --host=${configure_host}) - list(APPEND configure_opts ${toolchain_binaries}) - list(APPEND configure_opts CPPFLAGS=${arch_flags}${cppflags}) - list(APPEND configure_opts CFLAGS=${arch_flags}${cflags}) - list(APPEND configure_opts CXXFLAGS=${arch_flags}${cxxflags}) - list(APPEND configure_opts LDFLAGS=${arch_flags}${ldflags}) - list(APPEND configure_opts ${PARAM_EXTRA_FLAGS}) + set(arch_install_dir + ${multi_arch_install_root}/${ios_architecture} + ) + hunter_autotools_configure_command(autotools_configure_command + PACKAGE_INSTALL_DIR + ${arch_install_dir} + EXTRA_FLAGS + ${PARAM_EXTRA_FLAGS} + CONFIGURE_HOST + ${configure_host} + INSTALL_DIR + ${PARAM_GLOBAL_INSTALL_DIR} + PACKAGE_CONFIGURATION_TYPES + ${PARAM_PACKAGE_CONFIGURATION_TYPES} + CPPFLAGS + ${arch_flags}${PARAM_CPPFLAGS} + CFLAGS + ${arch_flags}${PARAM_CFLAGS} + CXXFLAGS + ${arch_flags}${PARAM_CXXFLAGS} + LDFLAGS + ${arch_flags}${PARAM_LDFLAGS} + ) + set(configure_command ${shell_env} ${autotools_configure_command}) # architecture specific source dir set(arch_source_dir @@ -437,9 +289,6 @@ function(hunter_autotools_project target_name) set(arch_target ${target_name}-${ios_architecture} ) - set(arch_install_dir - ${multi_arch_install_root}/${ios_architecture} - ) ExternalProject_Add(${arch_target} URL ${PARAM_URL} @@ -447,18 +296,21 @@ function(hunter_autotools_project target_name) ${PARAM_URL_HASH} DOWNLOAD_DIR ${PARAM_DOWNLOAD_DIR} + TLS_VERIFY + "${HUNTER_TLS_VERIFY}" SOURCE_DIR ${arch_source_dir} INSTALL_DIR ${arch_install_dir} # not used, just avoid creating Install/ empty directory + PATCH_COMMAND + ${PARAM_PATCH_COMMAND} CONFIGURE_COMMAND + "${PARAM_BOOTSTRAP}" + COMMAND ${configure_command} - ${configure_opts} - "--prefix=${arch_install_dir}" BUILD_COMMAND ${build_command} - ${build_opts} BUILD_IN_SOURCE 1 INSTALL_COMMAND diff --git a/cmake/modules/hunter_boost_component_b2_args.cmake b/cmake/modules/hunter_boost_component_b2_args.cmake index fe80475ca..bb5c58d11 100644 --- a/cmake/modules/hunter_boost_component_b2_args.cmake +++ b/cmake/modules/hunter_boost_component_b2_args.cmake @@ -9,6 +9,8 @@ include(hunter_add_package) include("${CMAKE_CURRENT_LIST_DIR}/../Hunter") function(hunter_boost_component_b2_args compName boostCmakeArgs outList) + hunter_assert_not_empty_string("${BOOST_VERSION}") + string(TOUPPER ${compName} upperCompName) set(myList "")#empty @@ -96,8 +98,8 @@ function(hunter_boost_component_b2_args compName boostCmakeArgs outList) endif() get_filename_component(zlib_dir ${zlib_path} DIRECTORY) get_filename_component(zlib_name ${zlib_path} NAME_WE) - if(NOT WIN32) - string(REPLACE "lib" "" zlib_name ${zlib_name}) + if(NOT WIN32 OR MINGW) + string(REGEX REPLACE "^lib" "" zlib_name ${zlib_name}) endif() list(APPEND myList "-s" "ZLIB_INCLUDE=${zlib_include}" "-s" "ZLIB_LIBPATH=${zlib_dir}" "-s" "ZLIB_BINARY=${zlib_name}") set(BOOST_CONFIG_LINK_ZLIB 1 PARENT_SCOPE) @@ -123,8 +125,8 @@ function(hunter_boost_component_b2_args compName boostCmakeArgs outList) endif() get_filename_component(bzip2_dir ${bzip2_path} DIRECTORY) get_filename_component(bzip2_name ${bzip2_path} NAME_WE) - if(NOT WIN32) - string(REPLACE "lib" "" bzip2_name ${bzip2_name}) + if(NOT WIN32 OR MINGW) + string(REGEX REPLACE "^lib" "" bzip2_name ${bzip2_name}) endif() list(APPEND myList "-s" "BZIP2_INCLUDE=${bzip2_include}" "-s" "BZIP2_LIBPATH=${bzip2_dir}" "-s" "BZIP2_BINARY=${bzip2_name}") set(BOOST_CONFIG_LINK_BZIP2 1 PARENT_SCOPE) diff --git a/cmake/modules/hunter_cache_run.cmake b/cmake/modules/hunter_cache_run.cmake index 93c4c88c7..c824dedc6 100644 --- a/cmake/modules/hunter_cache_run.cmake +++ b/cmake/modules/hunter_cache_run.cmake @@ -5,7 +5,7 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_add_package) include(hunter_internal_error) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) # Do not install any packages. # Check cache and load cache.sha1 to home directory on hit. @@ -15,7 +15,7 @@ function(hunter_cache_run) # -> x_PACKAGE # -> x_COMPONENT - hunter_test_string_not_empty("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_PACKAGE}") string(COMPARE NOTEQUAL "${x_COMPONENT}" "" has_component) string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) diff --git a/cmake/modules/hunter_cacheable.cmake b/cmake/modules/hunter_cacheable.cmake index 4120c2779..819afbc8e 100644 --- a/cmake/modules/hunter_cacheable.cmake +++ b/cmake/modules/hunter_cacheable.cmake @@ -1,9 +1,11 @@ # Copyright (c) 2015, Ruslan Baratov # All rights reserved. -include(hunter_test_string_not_empty) +include(hunter_assert_empty_string) -macro(hunter_cacheable package) - hunter_test_string_not_empty("${package}") - set(HUNTER_${package}_CACHEABLE TRUE) -endmacro() +function(hunter_cacheable package) + hunter_assert_empty_string("${ARGN}") + hunter_assert_not_empty_string("${package}") + + set("__HUNTER_CACHEABLE_${package}" TRUE PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_calculate_config_sha1.cmake b/cmake/modules/hunter_calculate_config_sha1.cmake index 5e2724538..6d9b37b03 100644 --- a/cmake/modules/hunter_calculate_config_sha1.cmake +++ b/cmake/modules/hunter_calculate_config_sha1.cmake @@ -3,20 +3,21 @@ cmake_minimum_required(VERSION 3.0) +include(hunter_assert_not_empty_string) +include(hunter_config) include(hunter_internal_error) include(hunter_lock_directory) include(hunter_make_directory) include(hunter_print_cmd) include(hunter_status_debug) -include(hunter_test_string_not_empty) include(hunter_user_error) function(hunter_calculate_config_sha1 hunter_self hunter_base user_config) - hunter_test_string_not_empty("${HUNTER_GATE_SHA1}") - hunter_test_string_not_empty("${hunter_self}") - hunter_test_string_not_empty("${hunter_base}") - hunter_test_string_not_empty("${user_config}") - hunter_test_string_not_empty("${CMAKE_BINARY_DIR}") + hunter_assert_not_empty_string("${HUNTER_GATE_SHA1}") + hunter_assert_not_empty_string("${hunter_self}") + hunter_assert_not_empty_string("${hunter_base}") + hunter_assert_not_empty_string("${user_config}") + hunter_assert_not_empty_string("${CMAKE_BINARY_DIR}") hunter_status_print("Calculating Config-SHA1") @@ -25,17 +26,20 @@ function(hunter_calculate_config_sha1 hunter_self hunter_base user_config) if(NOT EXISTS "${default_config}") hunter_internal_error("File `${default_config}` not exists") endif() - set(HUNTER_ALLOW_CONFIG_LOADING YES) + + set(__HUNTER_ALLOW_DEFAULT_VERSION_LOADING YES) include("${default_config}") - set(HUNTER_ALLOW_CONFIG_LOADING NO) + set(__HUNTER_ALLOW_DEFAULT_VERSION_LOADING NO) - # Include user_config - if(NOT EXISTS "${user_config}") - hunter_internal_error("Hunter config not exists") + if(NOT user_config STREQUAL default_config) + # Include user_config + if(NOT EXISTS "${user_config}") + hunter_internal_error("Hunter config not exists") + endif() + set(__HUNTER_ALLOW_CONFIG_LOADING YES) + include("${user_config}") # Use 'hunter_config' + set(__HUNTER_ALLOW_CONFIG_LOADING NO) endif() - set(HUNTER_ALLOW_CONFIG_LOADING YES) - include("${user_config}") - set(HUNTER_ALLOW_CONFIG_LOADING NO) # Create list of the projects set(directory_with_projects "${hunter_self}/cmake/projects") @@ -70,6 +74,8 @@ function(hunter_calculate_config_sha1 hunter_self hunter_base user_config) endif() set(projects "${real_projects}") + list(APPEND projects ${__HUNTER_USER_PACKAGES}) + list(REMOVE_DUPLICATES projects) list(SORT projects) # Create unified version @@ -77,54 +83,107 @@ function(hunter_calculate_config_sha1 hunter_self hunter_base user_config) file(REMOVE_RECURSE "${work_dir}") file(MAKE_DIRECTORY "${work_dir}") - set(input_file "${work_dir}/config.cmake") - file(WRITE "${input_file}" "include(hunter_config)\n") + set(config_cmake_nolf "${work_dir}/config.cmake.NOLF") + set(config_cmake_local "${work_dir}/config.cmake") + + file(WRITE "${config_cmake_nolf}" "include(hunter_final_config)\n") foreach(x ${projects}) set(version "${HUNTER_${x}_VERSION}") - if(version) + if("${version}" STREQUAL "") + # Not a real project or not a project directory + continue() + endif() + + file( + APPEND + "${config_cmake_nolf}" + "hunter_final_config(\n" + " PACKAGE \"${x}\"\n" + " VERSION \"${version}\"\n" + ) + + set(sha1 "${__HUNTER_USER_SHA1_${x}}") + set(cmake_args "${__HUNTER_USER_CMAKE_ARGS_${x}}") + set(configuration_types "${__HUNTER_USER_CONFIGURATION_TYPES_${x}}") + set(url "${__HUNTER_USER_URL_${x}}") + set(keep_package_sources "${__HUNTER_USER_KEEP_PACKAGE_SOURCES_${x}}") + + if(NOT sha1 STREQUAL "") + file(APPEND "${config_cmake_nolf}" " SHA1 \"${sha1}\"\n") + endif() + + if(NOT cmake_args STREQUAL "") + # " (double quotes) symbol should be escaped, + # if cmake_args equals to 'FOO=""' then it should be written as 'FOO=\"\"' + string(REPLACE "\"" "\\\"" cmake_args "${cmake_args}") + + file(APPEND "${config_cmake_nolf}" " CMAKE_ARGS \"${cmake_args}\"\n") + endif() + + if(NOT configuration_types STREQUAL "") file( APPEND - "${input_file}" - "hunter_config(${x} " - "VERSION ${version}" + "${config_cmake_nolf}" + " CONFIGURATION_TYPES \"${configuration_types}\"\n" ) - string(COMPARE NOTEQUAL "${HUNTER_${x}_CMAKE_ARGS}" "" have_args) - if(have_args) - file(APPEND "${input_file}" " CMAKE_ARGS") - foreach(y ${HUNTER_${x}_CMAKE_ARGS}) - file(APPEND "${input_file}" " \"${y}\"") - endforeach() - endif() - string(COMPARE NOTEQUAL "${HUNTER_${x}_CONFIGURATION_TYPES}" "" have_types) - if(have_types) - file(APPEND "${input_file}" " CONFIGURATION_TYPES") - foreach(y ${HUNTER_${x}_CONFIGURATION_TYPES}) - file(APPEND "${input_file}" " ${y}") - endforeach() + endif() + + if(NOT url STREQUAL "") + file(APPEND "${config_cmake_nolf}" " URL \"${url}\"\n") + endif() + + if(NOT keep_package_sources STREQUAL "") + if(keep_package_sources STREQUAL "TRUE") + file(APPEND "${config_cmake_nolf}" " KEEP_PACKAGE_SOURCES\n") + else() + hunter_internal_error("Unexpected value: '${keep_package_sources}'") endif() - file(APPEND "${input_file}" ")\n") endif() + + file(APPEND "${config_cmake_nolf}" ")\n") endforeach() - file(SHA1 "${work_dir}/config.cmake" HUNTER_GATE_CONFIG_SHA1) + # About '@ONLY': no substitutions expected but COPYONLY can't be + # used with NEWLINE_STYLE + configure_file( + "${config_cmake_nolf}" + "${config_cmake_local}" + @ONLY + NEWLINE_STYLE LF + ) + + file(SHA1 "${config_cmake_local}" HUNTER_GATE_CONFIG_SHA1) + set(HUNTER_GATE_CONFIG_SHA1 "${HUNTER_GATE_CONFIG_SHA1}" PARENT_SCOPE) hunter_make_directory("${hunter_base}" "${HUNTER_GATE_SHA1}" hunter_id_path) + + hunter_make_directory( + "${hunter_id_path}" + "${HUNTER_GATE_TOOLCHAIN_SHA1}" + hunter_toolchain_id_path + ) + hunter_make_directory( - "${hunter_id_path}" "${HUNTER_GATE_CONFIG_SHA1}" hunter_config_id_path + "${hunter_toolchain_id_path}" + "${HUNTER_GATE_CONFIG_SHA1}" + hunter_config_id_path ) - set(dst "${hunter_config_id_path}/config.cmake") + set(config_cmake_global "${hunter_config_id_path}/config.cmake") - if(EXISTS "${dst}") + if(EXISTS "${config_cmake_global}") return() endif() hunter_lock_directory("${hunter_config_id_path}" "") - if(EXISTS "${dst}") + if(EXISTS "${config_cmake_global}") return() endif() - configure_file("${work_dir}/config.cmake" "${dst}" COPYONLY) - hunter_status_debug("Config: ${dst}") + set(config_cmake_torename "${hunter_config_id_path}/config.cmake.TORENAME") + configure_file("${config_cmake_local}" "${config_cmake_torename}" COPYONLY) + + file(RENAME "${config_cmake_torename}" "${config_cmake_global}") + hunter_status_debug("Config: ${config_cmake_global}") hunter_status_debug("Config sha1: ${HUNTER_GATE_CONFIG_SHA1}") endfunction() diff --git a/cmake/modules/hunter_calculate_self.cmake b/cmake/modules/hunter_calculate_self.cmake index 92469177a..b847ba904 100644 --- a/cmake/modules/hunter_calculate_self.cmake +++ b/cmake/modules/hunter_calculate_self.cmake @@ -4,13 +4,13 @@ cmake_minimum_required(VERSION 3.0) include(hunter_internal_error) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_calculate_self root version sha1 result) - hunter_test_string_not_empty("${root}") - hunter_test_string_not_empty("${version}") - hunter_test_string_not_empty("${sha1}") - hunter_test_string_not_empty("${result}") + hunter_assert_not_empty_string("${root}") + hunter_assert_not_empty_string("${version}") + hunter_assert_not_empty_string("${sha1}") + hunter_assert_not_empty_string("${result}") string(SUBSTRING "${sha1}" 0 7 archive_id) diff --git a/cmake/modules/hunter_calculate_toolchain_sha1.cmake b/cmake/modules/hunter_calculate_toolchain_sha1.cmake index 30460db64..b88b33b8b 100644 --- a/cmake/modules/hunter_calculate_toolchain_sha1.cmake +++ b/cmake/modules/hunter_calculate_toolchain_sha1.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. include(hunter_internal_error) @@ -7,13 +7,13 @@ include(hunter_make_directory) include(hunter_print_cmd) include(hunter_status_debug) include(hunter_status_print) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_calculate_toolchain_sha1 hunter_self hunter_base) - hunter_test_string_not_empty("${hunter_self}") - hunter_test_string_not_empty("${hunter_base}") - hunter_test_string_not_empty("${CMAKE_BINARY_DIR}") - hunter_test_string_not_empty("${CMAKE_GENERATOR}") + hunter_assert_not_empty_string("${hunter_self}") + hunter_assert_not_empty_string("${hunter_base}") + hunter_assert_not_empty_string("${CMAKE_BINARY_DIR}") + hunter_assert_not_empty_string("${CMAKE_GENERATOR}") if(CMAKE_TOOLCHAIN_FILE) set(use_toolchain "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}") @@ -25,9 +25,11 @@ function(hunter_calculate_toolchain_sha1 hunter_self hunter_base) set(temp_project_dir "${CMAKE_BINARY_DIR}/_3rdParty/Hunter/toolchain") set(create_script "${hunter_self}/scripts/create-toolchain-info.cmake") - set(local_toolchain_info "${temp_project_dir}/toolchain.info") - file(REMOVE_RECURSE "${local_toolchain_info}") + set(toolchain_info_nolf "${temp_project_dir}/toolchain.info.NOLF") + set(toolchain_info_local "${temp_project_dir}/toolchain.info") + + file(REMOVE_RECURSE "${toolchain_info_nolf}") if(HUNTER_BINARY_DIR) hunter_lock_directory("${HUNTER_BINARY_DIR}" "") @@ -56,7 +58,7 @@ function(hunter_calculate_toolchain_sha1 hunter_self hunter_base) set( cmd "${CMAKE_COMMAND}" - "-DTOOLCHAIN_INFO_FILE=${local_toolchain_info}" + "-DTOOLCHAIN_INFO_FILE=${toolchain_info_nolf}" "${use_toolchain}" "-DHUNTER_SELF=${hunter_self}" "-G${CMAKE_GENERATOR}" @@ -64,6 +66,11 @@ function(hunter_calculate_toolchain_sha1 hunter_self hunter_base) "-B${temp_build_dir}" ) + string(COMPARE NOTEQUAL "${CMAKE_MAKE_PROGRAM}" "" has_make) + if(has_make) + list(APPEND cmd "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") + endif() + string(COMPARE NOTEQUAL "${CMAKE_GENERATOR_TOOLSET}" "" has_toolset) if(has_toolset) list(APPEND cmd "-T" "${CMAKE_GENERATOR_TOOLSET}") @@ -83,6 +90,11 @@ function(hunter_calculate_toolchain_sha1 hunter_self hunter_base) ) endforeach() + string(COMPARE EQUAL "${HUNTER_BUILD_SHARED_LIBS}" "" is_empty) + if(NOT is_empty) + list(APPEND cmd "-DHUNTER_BUILD_SHARED_LIBS=${HUNTER_BUILD_SHARED_LIBS}") + endif() + hunter_print_cmd("${temp_project_dir}" "${cmd}") # HUNTER_CONFIGURATION_TYPES notes: list is tricky... @@ -100,37 +112,51 @@ function(hunter_calculate_toolchain_sha1 hunter_self hunter_base) ) endif() - file(SHA1 "${local_toolchain_info}" HUNTER_GATE_TOOLCHAIN_SHA1) + # About '@ONLY': no substitutions expected but COPYONLY can't be + # used with NEWLINE_STYLE + configure_file( + "${toolchain_info_nolf}" + "${toolchain_info_local}" + @ONLY + NEWLINE_STYLE LF + ) + + file(SHA1 "${toolchain_info_local}" HUNTER_GATE_TOOLCHAIN_SHA1) set(HUNTER_GATE_TOOLCHAIN_SHA1 "${HUNTER_GATE_TOOLCHAIN_SHA1}" PARENT_SCOPE) hunter_make_directory("${hunter_base}" "${HUNTER_GATE_SHA1}" hunter_id_path) hunter_make_directory( "${hunter_id_path}" - "${HUNTER_GATE_CONFIG_SHA1}" - hunter_config_id_path - ) - - hunter_make_directory( - "${hunter_config_id_path}" "${HUNTER_GATE_TOOLCHAIN_SHA1}" hunter_toolchain_id_path ) - set(global_toolchain_info "${hunter_toolchain_id_path}/toolchain.info") - if(EXISTS "${global_toolchain_info}") - hunter_status_debug("Already exists: ${global_toolchain_info}") + set(toolchain_info_global "${hunter_toolchain_id_path}/toolchain.info") + if(EXISTS "${toolchain_info_global}") + hunter_status_debug("Already exists: ${toolchain_info_global}") return() endif() hunter_lock_directory("${hunter_toolchain_id_path}" "") - if(EXISTS "${global_toolchain_info}") - hunter_status_debug("Already exists: ${global_toolchain_info}") + if(EXISTS "${toolchain_info_global}") + hunter_status_debug("Already exists: ${toolchain_info_global}") return() endif() - configure_file("${local_toolchain_info}" "${global_toolchain_info}" COPYONLY) - hunter_status_debug("Toolchain info: ${global_toolchain_info}") + set( + toolchain_info_torename + "${hunter_toolchain_id_path}/toolchain.info.TORENAME" + ) + configure_file( + "${toolchain_info_local}" + "${toolchain_info_torename}" + COPYONLY + ) + + file(RENAME "${toolchain_info_torename}" "${toolchain_info_global}") + + hunter_status_debug("Toolchain info: ${toolchain_info_global}") hunter_status_debug("Toolchain SHA1: ${HUNTER_GATE_TOOLCHAIN_SHA1}") file(REMOVE_RECURSE "${temp_build_dir}") diff --git a/cmake/modules/hunter_check_download_error_message.cmake b/cmake/modules/hunter_check_download_error_message.cmake index 126673c39..623ebb4e6 100644 --- a/cmake/modules/hunter_check_download_error_message.cmake +++ b/cmake/modules/hunter_check_download_error_message.cmake @@ -15,10 +15,10 @@ function(hunter_check_download_error_message) # x_NOT_FOUND_COUNTER # x_UNPARSED_ARGUMENTS - hunter_test_string_not_empty("${x_ERROR_CODE}") - hunter_test_string_not_empty("${x_ERROR_MESSAGE}") - hunter_test_string_not_empty("${x_REMOVE_ON_ERROR}") - hunter_test_string_not_empty("${x_NOT_FOUND_COUNTER}") + hunter_assert_not_empty_string("${x_ERROR_CODE}") + hunter_assert_not_empty_string("${x_ERROR_MESSAGE}") + hunter_assert_not_empty_string("${x_REMOVE_ON_ERROR}") + hunter_assert_not_empty_string("${x_NOT_FOUND_COUNTER}") string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) if(has_unparsed) @@ -52,6 +52,8 @@ function(hunter_check_download_error_message) set(expected_message "\"Timeout was reached\"") elseif(x_ERROR_CODE EQUAL 1) set(expected_message "\"Unsupported protocol\"") + elseif(x_ERROR_CODE EQUAL 52) + set(expected_message "\"Server returned nothing (no headers, no data)\"") else() file(REMOVE "${x_REMOVE_ON_ERROR}") hunter_internal_error( diff --git a/cmake/modules/hunter_check_flush_needed.cmake b/cmake/modules/hunter_check_flush_needed.cmake index c6ad21dfd..bf4f08958 100644 --- a/cmake/modules/hunter_check_flush_needed.cmake +++ b/cmake/modules/hunter_check_flush_needed.cmake @@ -4,11 +4,11 @@ include(hunter_flush_cache_variables) include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_check_flush_needed hunter_self flush_done) - hunter_test_string_not_empty("${flush_done}") - hunter_test_string_not_empty("${hunter_self}") + hunter_assert_not_empty_string("${flush_done}") + hunter_assert_not_empty_string("${hunter_self}") # Variables must be checked in 'hunter_initialize' string(COMPARE EQUAL "${HUNTER_CACHED_ROOT}" "${HUNTER_GATE_ROOT}" is_ok) @@ -66,6 +66,20 @@ function(hunter_check_flush_needed hunter_self flush_done) set(flush TRUE) endif() + string( + COMPARE + EQUAL + "${HUNTER_BUILD_SHARED_LIBS}" + "${HUNTER_CACHED_BUILD_SHARED_LIBS}" + is_ok + ) + if(NOT is_ok) + hunter_status_debug("HUNTER_BUILD_SHARED_LIBS changed:") + hunter_status_debug(" ${HUNTER_BUILD_SHARED_LIBS}") + hunter_status_debug(" ${HUNTER_CACHED_BUILD_SHARED_LIBS}") + set(flush TRUE) + endif() + if(NOT flush) set("${flush_done}" FALSE PARENT_SCOPE) return() diff --git a/cmake/modules/hunter_cmake_args.cmake b/cmake/modules/hunter_cmake_args.cmake index adefe1b5d..66089ce87 100644 --- a/cmake/modules/hunter_cmake_args.cmake +++ b/cmake/modules/hunter_cmake_args.cmake @@ -4,31 +4,23 @@ include(CMakeParseArguments) # cmake_parse_arguments -include(hunter_user_error) - -# internal variables: _hunter_c_* -macro(hunter_cmake_args) - set(_hunter_c_multiple_values CMAKE_ARGS) - cmake_parse_arguments( - _hunter_c - "" - "" - "${_hunter_c_multiple_values}" - ${ARGV} - ) - list(LENGTH _hunter_c_UNPARSED_ARGUMENTS _hunter_c_len) - if(NOT ${_hunter_c_len} EQUAL 1) - hunter_user_error("unparsed: ${_hunter_c_UNPARSED_ARGUMENTS}") - endif() - - list(GET _hunter_c_UNPARSED_ARGUMENTS 0 _hunter_c_current_project) - - if(NOT _hunter_c_CMAKE_ARGS) - hunter_user_error("Expected CMAKE_ARGS") - endif() - - set( - "HUNTER_${_hunter_c_current_project}_DEFAULT_CMAKE_ARGS" - ${_hunter_c_CMAKE_ARGS} - ) -endmacro() +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) + +function(hunter_cmake_args package) + hunter_assert_not_empty_string("${package}") + + set(optional "") + set(one "") + set(multiple CMAKE_ARGS) + + # Introduce: + # * x_CMAKE_ARGS + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGN}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_CMAKE_ARGS}") + + set("__HUNTER_DEFAULT_CMAKE_ARGS_${package}" "${x_CMAKE_ARGS}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_config.cmake b/cmake/modules/hunter_config.cmake index 5b13f5619..de2e3610f 100644 --- a/cmake/modules/hunter_config.cmake +++ b/cmake/modules/hunter_config.cmake @@ -1,54 +1,147 @@ -# Copyright (c) 2013-2015, Ruslan Baratov +# Copyright (c) 2013-2018, Ruslan Baratov # All rights reserved. include(CMakeParseArguments) # cmake_parse_arguments +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) include(hunter_fatal_error) -include(hunter_unsetvar) +include(hunter_pack_git_self) +include(hunter_pack_git_submodule) +include(hunter_parse_cmake_args_for_keyword) include(hunter_user_error) -macro(hunter_config) - if(NOT HUNTER_ALLOW_CONFIG_LOADING) +# Usage: +# * hunter_config(${package} GIT_SELF) +# * hunter_config(${package} GIT_SUBMODULE "...") +# * hunter_config(${package} VERSION "...") +# * hunter_config(${package} URL "..." SHA1 "...") + +# All variants accepts extra: +# * KEEP_PACKAGE_SOURCES +# * VERSION +# * CMAKE_ARGS +# * CONFIGURATION_TYPES + +function(hunter_config package) + hunter_assert_not_empty_string("${package}") + + if(NOT __HUNTER_ALLOW_CONFIG_LOADING) hunter_fatal_error( "Unexpected 'hunter_config' usage from:" " ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}" - WIKI + ERROR_PAGE "error.unexpected.hunter_config" ) endif() - set(_hunter_one_value VERSION) - set(_hunter_multiple_values CMAKE_ARGS CONFIGURATION_TYPES) - cmake_parse_arguments( - _hunter - "" - "${_hunter_one_value}" - "${_hunter_multiple_values}" - ${ARGV} - ) - list(LENGTH _hunter_UNPARSED_ARGUMENTS _hunter_len) - if(NOT ${_hunter_len} EQUAL 1) + + set(optional KEEP_PACKAGE_SOURCES GIT_SELF) + set(one VERSION GIT_SUBMODULE URL SHA1) + set(multiple CMAKE_ARGS CONFIGURATION_TYPES) + + # Introduce: + # * x_KEEP_PACKAGE_SOURCES + # * x_GIT_SELF + # * x_VERSION + # * x_GIT_SUBMODULE + # * x_URL + # * x_SHA1 + # * x_CMAKE_ARGS + # * x_CONFIGURATION_TYPES + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGN}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + if(x_GIT_SELF) + if(NOT "${x_GIT_SUBMODULE}" STREQUAL "") + hunter_user_error("GIT_SUBMODULE can't be used with GIT_SELF") + endif() + if(NOT "${x_URL}" STREQUAL "") + hunter_user_error("URL can't be used with GIT_SELF") + endif() + if(NOT "${x_SHA1}" STREQUAL "") + hunter_user_error("SHA1 can't be used with GIT_SELF") + endif() + elseif(NOT "${x_GIT_SUBMODULE}" STREQUAL "") + if(NOT "${x_URL}" STREQUAL "") + hunter_user_error("URL can't be used with GIT_SUBMODULE") + endif() + if(NOT "${x_SHA1}" STREQUAL "") + hunter_user_error("SHA1 can't be used with GIT_SUBMODULE") + endif() + elseif(NOT "${x_URL}" STREQUAL "") + if("${x_SHA1}" STREQUAL "") + hunter_user_error("Expected SHA1") + endif() + elseif(NOT "${x_SHA1}" STREQUAL "") + if("${x_URL}" STREQUAL "") + hunter_user_error("Expected URL") + endif() + elseif("${x_VERSION}" STREQUAL "") hunter_user_error( - "Unparsed arguments for 'hunter_config' command: " - "${_hunter_UNPARSED_ARGUMENTS}" + "No VERSION, GIT_SELF, GIT_SUBMODULE or URL/SHA1 specified" ) endif() - # calc _ROOT - list(GET _hunter_UNPARSED_ARGUMENTS 0 _hunter_current_project) - string(TOUPPER "${_hunter_current_project}" _hunter_root) - set(_hunter_root "${_hunter_root}_ROOT") + if(NOT "${x_GIT_SUBMODULE}" STREQUAL "") + # get HUNTER_SUBMODULE_SOURCE_SUBDIR from CMAKE_ARGS + hunter_parse_cmake_args_for_keyword( + CMAKE_ARGS ${x_CMAKE_ARGS} + KEYWORD HUNTER_SUBMODULE_SOURCE_SUBDIR + OUTPUT subdir + ) - # clear all - hunter_unsetvar(${_hunter_root}) + hunter_pack_git_submodule( + PACKAGE "${package}" + GIT_SUBMODULE "${x_GIT_SUBMODULE}" + SUBMODULE_SOURCE_SUBDIR "${subdir}" + URL_OUT x_URL + SHA1_OUT x_SHA1 + ) + elseif(x_GIT_SELF) + hunter_pack_git_self( + PACKAGE "${package}" + URL_OUT x_URL + SHA1_OUT x_SHA1 + ) + endif() - if(_hunter_VERSION) - set(HUNTER_${_hunter_current_project}_VERSION ${_hunter_VERSION}) - set(HUNTER_${_hunter_current_project}_CMAKE_ARGS ${_hunter_CMAKE_ARGS}) + if("${x_VERSION}" STREQUAL "") + # GIT_SELF, GIT_SUBMODULE or URL/SHA1 variant may not provide version. + # Use SHA1 or packge in this case + set(x_VERSION "${x_SHA1}") + endif() + + hunter_assert_not_empty_string("${x_VERSION}") + set("HUNTER_${package}_VERSION" "${x_VERSION}" PARENT_SCOPE) + + set( + __HUNTER_USER_PACKAGES + "${__HUNTER_USER_PACKAGES};${package}" + PARENT_SCOPE + ) + + if(NOT "${x_SHA1}" STREQUAL "") + set("__HUNTER_USER_SHA1_${package}" "${x_SHA1}" PARENT_SCOPE) + endif() + + if(NOT "${x_CMAKE_ARGS}" STREQUAL "") + set("__HUNTER_USER_CMAKE_ARGS_${package}" "${x_CMAKE_ARGS}" PARENT_SCOPE) + endif() + + if(NOT "${x_CONFIGURATION_TYPES}" STREQUAL "") set( - HUNTER_${_hunter_current_project}_CONFIGURATION_TYPES - ${_hunter_CONFIGURATION_TYPES} + "__HUNTER_USER_CONFIGURATION_TYPES_${package}" + "${x_CONFIGURATION_TYPES}" + PARENT_SCOPE ) - else() - hunter_user_error("Expected VERSION option for 'hunter_config' command") endif() -endmacro() + + if(NOT "${x_URL}" STREQUAL "") + set("__HUNTER_USER_URL_${package}" "${x_URL}" PARENT_SCOPE) + endif() + + if(x_KEEP_PACKAGE_SOURCES) + set("__HUNTER_USER_KEEP_PACKAGE_SOURCES_${package}" "TRUE" PARENT_SCOPE) + endif() +endfunction() diff --git a/cmake/modules/hunter_configuration_types.cmake b/cmake/modules/hunter_configuration_types.cmake index b62772896..6347390c2 100644 --- a/cmake/modules/hunter_configuration_types.cmake +++ b/cmake/modules/hunter_configuration_types.cmake @@ -3,38 +3,26 @@ include(CMakeParseArguments) # cmake_parse_arguments -include(hunter_user_error) +include(hunter_assert_not_empty_string) +include(hunter_assert_empty_string) -macro(hunter_configuration_types) - set(_hunter_multiple_values CONFIGURATION_TYPES) - cmake_parse_arguments( - _hunter - "" - "" - "${_hunter_multiple_values}" - ${ARGV} - ) - list(LENGTH _hunter_UNPARSED_ARGUMENTS _hunter_len) - if(NOT ${_hunter_len} EQUAL 1) - hunter_user_error("unparsed: ${_hunter_UNPARSED_ARGUMENTS}") - endif() +function(hunter_configuration_types package) + hunter_assert_not_empty_string("${package}") - list(GET _hunter_UNPARSED_ARGUMENTS 0 _hunter_current_project) + set(optional "") + set(one "") + set(multiple CONFIGURATION_TYPES) - # Set value only if not defined in 'config.cmake', - # i.e. when *_CONFIGURATIONS_TYPES is empty - string( - COMPARE - EQUAL - "${HUNTER_${_hunter_current_project}_CONFIGURATION_TYPES}" - "" - _hunter_is_empty - ) + # Introduce: + # * x_CONFIGURATION_TYPES + cmake_parse_arguments(x "" "" "${multiple}" "${ARGN}") - if(_hunter_is_empty) - set( - "HUNTER_${_hunter_current_project}_CONFIGURATION_TYPES" - ${_hunter_CONFIGURATION_TYPES} - ) - endif() -endmacro() + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + hunter_assert_not_empty_string("${x_CONFIGURATION_TYPES}") + + set( + "__HUNTER_DEFAULT_CONFIGURATION_TYPES_${package}" + "${x_CONFIGURATION_TYPES}" + PARENT_SCOPE + ) +endfunction() diff --git a/cmake/modules/hunter_create_args_file.cmake b/cmake/modules/hunter_create_args_file.cmake index 07787bfda..1e69105f1 100644 --- a/cmake/modules/hunter_create_args_file.cmake +++ b/cmake/modules/hunter_create_args_file.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, 2018 Ruslan Baratov # All rights reserved. include(hunter_status_debug) @@ -26,13 +26,27 @@ function(hunter_create_args_file args filename) # "A", "B", "C" # 'var_value' will have values: # "value1", "value2", "value3", "value4" - file(REMOVE "${filename}") - file(WRITE "${filename}" "") # create empty file if no option + set(filename_nolf "${filename}.NOLF") + file(REMOVE "${filename_nolf}") + file(WRITE "${filename_nolf}" "") # create empty file if no option set(var_name "") foreach(entry ${args}) - string(FIND "${entry}" "=" update_var) - if(update_var EQUAL -1) + set(appending_mode FALSE) + + string(FIND "${entry}" "=" equal_symbol_index) + if(equal_symbol_index EQUAL -1) # There is no '=' symbol - appending mode + set(appending_mode TRUE) + endif() + + string(REGEX MATCH "^--.*" starts_with_double_dash "${entry}") + if(NOT "${starts_with_double_dash}" STREQUAL "") + # Assumed that variable name doesn't start with '--' and we are appending. + # Needed to pass options like `--foo=a,b,c,d` + set(appending_mode TRUE) + endif() + + if(appending_mode) if(NOT var_name) hunter_user_error( "${bad_message} (expected '=' symbol): ${args}" @@ -53,13 +67,13 @@ function(hunter_create_args_file args filename) ) endif() ### -- end - file(APPEND "${filename}" "set(") + file(APPEND "${filename_nolf}" "set(") file( APPEND - "${filename}" + "${filename_nolf}" "\"${var_name}\" \"\${${var_name}}\" \"${var_value}\"" ) - file(APPEND "${filename}" " CACHE INTERNAL \"\")\n") + file(APPEND "${filename_nolf}" " CACHE INTERNAL \"\")\n") hunter_status_debug( "Add extra CMake args: '${var_name}' += '${var_value}'" ) @@ -97,12 +111,27 @@ function(hunter_create_args_file args filename) endif() ### -- end - file(APPEND "${filename}" "set(") - file(APPEND "${filename}" "\"${var_name}\" \"${var_value}\"") - file(APPEND "${filename}" " CACHE INTERNAL \"\")\n") + file(APPEND "${filename_nolf}" "set(") + + if("${var_value}" STREQUAL "\"\"") + file(APPEND "${filename_nolf}" "\"${var_name}\" \"\"") + else() + file(APPEND "${filename_nolf}" "\"${var_name}\" \"${var_value}\"") + endif() + + file(APPEND "${filename_nolf}" " CACHE INTERNAL \"\")\n") hunter_status_debug( "Add extra CMake args: '${var_name}' = '${var_value}'" ) endif() endforeach() + + # About '@ONLY': no substitutions expected but COPYONLY can't be + # used with NEWLINE_STYLE + configure_file( + "${filename_nolf}" + "${filename}" + @ONLY + NEWLINE_STYLE LF + ) endfunction() diff --git a/cmake/modules/hunter_create_cache_file.cmake b/cmake/modules/hunter_create_cache_file.cmake index 2dd3b0bc3..2bcb94e27 100644 --- a/cmake/modules/hunter_create_cache_file.cmake +++ b/cmake/modules/hunter_create_cache_file.cmake @@ -2,23 +2,23 @@ # All rights reserved. include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_create_cache_file cache_path) - hunter_test_string_not_empty("${cache_path}") + hunter_assert_not_empty_string("${cache_path}") - hunter_test_string_not_empty("${HUNTER_CACHED_ROOT}") - hunter_test_string_not_empty("${HUNTER_SHA1}") - hunter_test_string_not_empty("${HUNTER_CONFIG_SHA1}") - hunter_test_string_not_empty("${HUNTER_VERSION}") - hunter_test_string_not_empty("${HUNTER_TOOLCHAIN_SHA1}") - hunter_test_string_not_empty("${HUNTER_TOOLCHAIN_ID_PATH}") + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_SHA1}") + hunter_assert_not_empty_string("${HUNTER_CONFIG_SHA1}") + hunter_assert_not_empty_string("${HUNTER_CONFIG_ID_PATH}") + hunter_assert_not_empty_string("${HUNTER_VERSION}") + hunter_assert_not_empty_string("${HUNTER_TOOLCHAIN_SHA1}") if(EXISTS "${cache_path}") return() endif() - hunter_lock_directory("${HUNTER_TOOLCHAIN_ID_PATH}" "") + hunter_lock_directory("${HUNTER_CONFIG_ID_PATH}" "") # While waiting for lock other instance can create this file if(EXISTS "${cache_path}") @@ -93,6 +93,12 @@ function(hunter_create_cache_file cache_path) "${temp_path}" "set(CMAKE_${lang}_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES \"${CMAKE_${lang}_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES}\" CACHE INTERNAL \"\")\n" ) + hunter_status_debug("ABI forwarding: CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES = ${CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES}") + file( + APPEND + "${temp_path}" + "set(CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES \"${CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES}\" CACHE INTERNAL \"\")\n" + ) if(DEFINED CMAKE_${lang}_LIBRARY_ARCHITECTURE) hunter_status_debug("ABI forwarding: CMAKE_${lang}_LIBRARY_ARCHITECTURE = ${CMAKE_${lang}_LIBRARY_ARCHITECTURE}") file( @@ -117,13 +123,6 @@ function(hunter_create_cache_file cache_path) ) endif() - # Let all project build with the same number of jobs - file( - APPEND - "${temp_path}" - "set(HUNTER_JOBS_NUMBER \"${HUNTER_JOBS_NUMBER}\" CACHE INTERNAL \"\")\n" - ) - # Let all projects have same postfixes foreach(configuration ${HUNTER_CACHED_CONFIGURATION_TYPES}) string(TOUPPER "${configuration}" configuration_upper) @@ -157,6 +156,11 @@ function(hunter_create_cache_file cache_path) "${temp_path}" "set(HUNTER_SHA1 \"${HUNTER_SHA1}\" CACHE INTERNAL \"\")\n" ) + file( + APPEND + "${temp_path}" + "set(HUNTER_URL \"${HUNTER_URL}\" CACHE INTERNAL \"\")\n" + ) file( APPEND "${temp_path}" @@ -177,6 +181,45 @@ function(hunter_create_cache_file cache_path) "${temp_path}" "set(HUNTER_CACHED_CONFIGURATION_TYPES \"${HUNTER_CACHED_CONFIGURATION_TYPES}\" CACHE INTERNAL \"\")\n" ) + file( + APPEND + "${temp_path}" + "set(HUNTER_CACHED_BUILD_SHARED_LIBS \"${HUNTER_CACHED_BUILD_SHARED_LIBS}\" CACHE INTERNAL \"\")\n" + ) + + # CMP0069 should be set to NEW so we can build old projects with LTO + # without modifying source code + file( + APPEND + "${temp_path}" + "set(CMAKE_POLICY_DEFAULT_CMP0069 NEW CACHE INTERNAL \"\")\n" + ) + + # Disable package registry { + ### http://www.cmake.org/cmake/help/v3.1/manual/cmake-packages.7.html#disabling-the-package-registry + file( + APPEND + "${temp_path}" + "set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON CACHE INTERNAL \"\")\n" + ) + file( + APPEND + "${temp_path}" + "set(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY ON CACHE INTERNAL \"\")\n" + ) + file( + APPEND + "${temp_path}" + "set(CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY ON CACHE INTERNAL \"\")\n" + ) + # } + + # Package can use this variable to check if it's building by Hunter + file( + APPEND + "${temp_path}" + "set(HUNTER_PACKAGE_BUILD ON CACHE INTERNAL \"\")\n" + ) # Atomic operation file(RENAME "${temp_path}" "${cache_path}") diff --git a/cmake/modules/hunter_create_cache_meta_directory.cmake b/cmake/modules/hunter_create_cache_meta_directory.cmake index 44807a1f6..e59c1d16f 100644 --- a/cmake/modules/hunter_create_cache_meta_directory.cmake +++ b/cmake/modules/hunter_create_cache_meta_directory.cmake @@ -3,19 +3,19 @@ include(hunter_internal_error) include(hunter_make_directory) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_create_cache_meta_directory cache_directory result) - hunter_test_string_not_empty("${HUNTER_ARGS_FILE}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_CONFIGURATION_TYPES}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_HOME_DIR}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_NAME}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_SHA1}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_VERSION}") - hunter_test_string_not_empty("${HUNTER_TOOLCHAIN_ID_PATH}") - hunter_test_string_not_empty("${HUNTER_TOOLCHAIN_SHA1}") - hunter_test_string_not_empty("${cache_directory}") - hunter_test_string_not_empty("${result}") + hunter_assert_not_empty_string("${HUNTER_ARGS_FILE}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_CONFIGURATION_TYPES}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_HOME_DIR}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_NAME}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_SHA1}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_VERSION}") + hunter_assert_not_empty_string("${HUNTER_TOOLCHAIN_ID_PATH}") + hunter_assert_not_empty_string("${HUNTER_TOOLCHAIN_SHA1}") + hunter_assert_not_empty_string("${cache_directory}") + hunter_assert_not_empty_string("${result}") string(COMPARE NOTEQUAL "${HUNTER_PACKAGE_COMPONENT}" "" has_component) @@ -49,21 +49,50 @@ function(hunter_create_cache_meta_directory cache_directory result) hunter_make_directory("${cache_meta_dir}" "${args_sha1}" cache_meta_dir) file(COPY "${HUNTER_ARGS_FILE}" DESTINATION "${cache_meta_dir}") - # Save package configuration types + # Save package configuration types { + set(types_info "${HUNTER_PACKAGE_HOME_DIR}/types.info") - file(WRITE "${types_info}" "${HUNTER_PACKAGE_CONFIGURATION_TYPES}") + set(types_info_nolf "${types_info}.NOLF") + + file(WRITE "${types_info_nolf}" "${HUNTER_PACKAGE_CONFIGURATION_TYPES}") + + # About '@ONLY': no substitutions expected but COPYONLY can't be + # used with NEWLINE_STYLE + configure_file( + "${types_info_nolf}" + "${types_info}" + @ONLY + NEWLINE_STYLE LF + ) + file(SHA1 "${types_info}" types_sha1) hunter_make_directory("${cache_meta_dir}" "${types_sha1}" cache_meta_dir) file(COPY "${types_info}" DESTINATION "${cache_meta_dir}") - # Save internal-dependencies information + # } + + # Save internal-dependencies information { + set(internal_deps_id "${HUNTER_PACKAGE_HOME_DIR}/internal_deps.id") - file(WRITE "${internal_deps_id}" "${HUNTER_PACKAGE_INTERNAL_DEPS_ID}") + set(internal_deps_id_nolf "${internal_deps_id}.NOLF") + file(WRITE "${internal_deps_id_nolf}" "${HUNTER_PACKAGE_INTERNAL_DEPS_ID}") + + # About '@ONLY': no substitutions expected but COPYONLY can't be + # used with NEWLINE_STYLE + configure_file( + "${internal_deps_id_nolf}" + "${internal_deps_id}" + @ONLY + NEWLINE_STYLE LF + ) + file(SHA1 "${internal_deps_id}" internal_deps_sha1) hunter_make_directory( "${cache_meta_dir}" "${internal_deps_sha1}" cache_meta_dir ) file(COPY "${internal_deps_id}" DESTINATION "${cache_meta_dir}") + # } + set("${result}" "${cache_meta_dir}" PARENT_SCOPE) endfunction() diff --git a/cmake/modules/hunter_create_dependency_entry.cmake b/cmake/modules/hunter_create_dependency_entry.cmake index f81a9b94c..d451bd374 100644 --- a/cmake/modules/hunter_create_dependency_entry.cmake +++ b/cmake/modules/hunter_create_dependency_entry.cmake @@ -5,7 +5,7 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_create_dependency_entry) set(one PACKAGE COMPONENT RESULT) @@ -14,9 +14,9 @@ function(hunter_create_dependency_entry) # x_COMPONENT optional component # x_RESULT optional component - hunter_test_string_not_empty("${x_PACKAGE}") - hunter_test_string_not_empty("${x_RESULT}") - hunter_test_string_not_empty("${HUNTER_TOOLCHAIN_ID_PATH}") + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_RESULT}") + hunter_assert_not_empty_string("${HUNTER_CONFIG_ID_PATH}") string(COMPARE NOTEQUAL "${x_COMPONENT}" "" has_component) string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) @@ -24,7 +24,7 @@ function(hunter_create_dependency_entry) hunter_internal_error("Unparsed: ${x_UNPARSED_ARGUMENTS}") endif() - set(top_dir "${HUNTER_TOOLCHAIN_ID_PATH}/Build") + set(top_dir "${HUNTER_CONFIG_ID_PATH}/Build") set(dep_dir "${top_dir}/${x_PACKAGE}") if(has_component) diff --git a/cmake/modules/hunter_create_deps_info.cmake b/cmake/modules/hunter_create_deps_info.cmake index 6f01f5b9b..8e3293a79 100644 --- a/cmake/modules/hunter_create_deps_info.cmake +++ b/cmake/modules/hunter_create_deps_info.cmake @@ -4,10 +4,10 @@ include(hunter_create_dependency_entry) include(hunter_get_package_deps_recurse) include(hunter_internal_error) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_create_deps_info temp_deps_info) - hunter_test_string_not_empty("${HUNTER_PACKAGE_NAME}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_NAME}") string(COMPARE NOTEQUAL "${HUNTER_PACKAGE_COMPONENT}" "" has_component) if(has_component) @@ -23,7 +23,8 @@ function(hunter_create_deps_info temp_deps_info) ) endif() - file(WRITE "${temp_deps_info}" "") + set(temp_deps_info_nolf "${temp_deps_info}.NOLF") + file(WRITE "${temp_deps_info_nolf}" "") foreach(dependency ${dependencies_list}) string(REPLACE " " ";" dep_string "${dependency}") @@ -48,6 +49,15 @@ function(hunter_create_deps_info temp_deps_info) "Unexpected length ${dep_string_len} (string: ${dep_string})" ) endif() - file(APPEND "${temp_deps_info}" "${dep_entry}\n") + file(APPEND "${temp_deps_info_nolf}" "${dep_entry}\n") endforeach() + + # About '@ONLY': no substitutions expected but COPYONLY can't be + # used with NEWLINE_STYLE + configure_file( + "${temp_deps_info_nolf}" + "${temp_deps_info}" + @ONLY + NEWLINE_STYLE LF + ) endfunction() diff --git a/cmake/modules/hunter_download.cmake b/cmake/modules/hunter_download.cmake index 8d898d48c..1fb3e27b1 100644 --- a/cmake/modules/hunter_download.cmake +++ b/cmake/modules/hunter_download.cmake @@ -1,52 +1,62 @@ -# Copyright (c) 2013-2015, Ruslan Baratov, Aaditya Kalsi +# Copyright (c) 2013-2018, Ruslan Baratov +# Copyright (c) 2015-2018, Aaditya Kalsi +# Copyright (c) 2018, David Hirvonen # All rights reserved. include(CMakeParseArguments) # cmake_parse_arguments +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) include(hunter_create_args_file) +include(hunter_find_licenses) include(hunter_find_stamps) +include(hunter_get_cacheable) +include(hunter_get_cmake_args) +include(hunter_get_configuration_types) +include(hunter_get_keep_package_sources) +include(hunter_get_package_sha1) +include(hunter_get_package_url) include(hunter_internal_error) include(hunter_jobs_number) include(hunter_load_from_cache) include(hunter_print_cmd) +include(hunter_read_http_credentials) include(hunter_register_dependency) include(hunter_save_to_cache) include(hunter_status_debug) include(hunter_status_print) -include(hunter_test_string_not_empty) +include(hunter_upload_cache) include(hunter_user_error) +# Note: 'hunter_find_licenses' should be called before each return point function(hunter_download) set(one PACKAGE_NAME PACKAGE_COMPONENT PACKAGE_INTERNAL_DEPS_ID) - set(multiple PACKAGE_DEPENDS_ON PACKAGE_UNRELOCATABLE_TEXT_FILES) + set(multiple PACKAGE_UNRELOCATABLE_TEXT_FILES) cmake_parse_arguments(HUNTER "" "${one}" "${multiple}" ${ARGV}) # -> HUNTER_PACKAGE_NAME # -> HUNTER_PACKAGE_COMPONENT - # -> HUNTER_PACKAGE_DEPENDS_ON # -> HUNTER_PACKAGE_INTERNAL_DEPS_ID # -> HUNTER_PACKAGE_UNRELOCATABLE_TEXT_FILES - if(HUNTER_UNPARSED_ARGUMENTS) - hunter_internal_error("Unparsed: ${HUNTER_UNPARSED_ARGUMENTS}") - endif() + hunter_assert_empty_string("${HUNTER_UNPARSED_ARGUMENTS}") set(versions "[${HUNTER_${HUNTER_PACKAGE_NAME}_VERSIONS}]") hunter_status_debug( "${HUNTER_PACKAGE_NAME} versions available: ${versions}" ) - hunter_test_string_not_empty("${HUNTER_DOWNLOAD_SCHEME}") - hunter_test_string_not_empty("${HUNTER_SELF}") + hunter_assert_not_empty_string("${HUNTER_DOWNLOAD_SCHEME}") + hunter_assert_not_empty_string("${HUNTER_SELF}") - hunter_test_string_not_empty("${HUNTER_INSTALL_PREFIX}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_NAME}") - hunter_test_string_not_empty("${HUNTER_TOOLCHAIN_ID_PATH}") - hunter_test_string_not_empty("${HUNTER_CACHE_FILE}") + hunter_assert_not_empty_string("${HUNTER_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_NAME}") + hunter_assert_not_empty_string("${HUNTER_CONFIG_ID_PATH}") + hunter_assert_not_empty_string("${HUNTER_CACHE_FILE}") - string(COMPARE NOTEQUAL "${HUNTER_BINARY_DIR}" "" hunter_has_binary_dir) - string(COMPARE NOTEQUAL "${HUNTER_PACKAGE_COMPONENT}" "" hunter_has_component) - string(COMPARE NOTEQUAL "${CMAKE_TOOLCHAIN_FILE}" "" hunter_has_toolchain) + string(COMPARE NOTEQUAL "${HUNTER_BINARY_DIR}" "" has_binary_dir) + string(COMPARE NOTEQUAL "${HUNTER_PACKAGE_COMPONENT}" "" has_component) + string(COMPARE NOTEQUAL "${CMAKE_TOOLCHAIN_FILE}" "" has_toolchain) string( COMPARE NOTEQUAL @@ -54,58 +64,50 @@ function(hunter_download) "" has_internal_deps_id ) - string( - COMPARE - NOTEQUAL - "${HUNTER_PACKAGE_UNRELOCATABLE_TEXT_FILES}" - "" - has_unrelocatable_text_files - ) - if(hunter_has_component) + if(has_component) set(HUNTER_EP_NAME "${HUNTER_PACKAGE_NAME}-${HUNTER_PACKAGE_COMPONENT}") else() set(HUNTER_EP_NAME "${HUNTER_PACKAGE_NAME}") endif() # Set _ROOT variables - set(h_name "${HUNTER_PACKAGE_NAME}") # Foo + set(package "${HUNTER_PACKAGE_NAME}") # Foo string(TOUPPER "${HUNTER_PACKAGE_NAME}" root_name) # FOO set(root_name "${root_name}_ROOT") # FOO_ROOT - set(HUNTER_PACKAGE_VERSION "${HUNTER_${h_name}_VERSION}") + set(HUNTER_PACKAGE_VERSION "${HUNTER_${package}_VERSION}") set(ver "${HUNTER_PACKAGE_VERSION}") - set(HUNTER_PACKAGE_URL "${HUNTER_${h_name}_URL}") - set(HUNTER_PACKAGE_SHA1 "${HUNTER_${h_name}_SHA1}") - set( - HUNTER_PACKAGE_CONFIGURATION_TYPES - "${HUNTER_${h_name}_CONFIGURATION_TYPES}" - ) - string(COMPARE EQUAL "${HUNTER_PACKAGE_CONFIGURATION_TYPES}" "" no_types) - if(no_types) - set(HUNTER_PACKAGE_CONFIGURATION_TYPES ${HUNTER_CACHED_CONFIGURATION_TYPES}) - endif() - set(HUNTER_PACKAGE_CACHEABLE "${HUNTER_${h_name}_CACHEABLE}") + hunter_get_package_sha1( + PACKAGE "${package}" + VERSION "${ver}" + AVAILABLE_VERSIONS "${HUNTER_${package}_VERSIONS}" + OUT HUNTER_PACKAGE_SHA1 + ) - if(has_unrelocatable_text_files AND NOT HUNTER_PACKAGE_CACHEABLE) - hunter_user_error( - "PACKAGE_UNRELOCATABLE_TEXT_FILES for uncacheable package:" - " please add hunter_cacheable to hunter.cmake" - ) - endif() + hunter_get_package_url( + PACKAGE "${package}" + VERSION "${ver}" + SHA1 "${HUNTER_PACKAGE_SHA1}" + OUT HUNTER_PACKAGE_URL + ) - hunter_test_string_not_empty("${HUNTER_PACKAGE_CONFIGURATION_TYPES}") + hunter_get_configuration_types( + PACKAGE "${package}" + OUT HUNTER_PACKAGE_CONFIGURATION_TYPES + ) - string(COMPARE EQUAL "${HUNTER_PACKAGE_URL}" "" hunter_no_url) + hunter_get_cacheable( + PACKAGE "${package}" + UNRELOCATABLE "${HUNTER_PACKAGE_UNRELOCATABLE_TEXT_FILES}" + OUT HUNTER_PACKAGE_CACHEABLE + ) - string(COMPARE EQUAL "${HUNTER_PACKAGE_SHA1}" "" version_not_found) - if(version_not_found) - hunter_user_error("Version not found: ${ver}. See 'hunter_config' command.") - endif() + set(HUNTER_PACKAGE_PROTECTED_SOURCES "${HUNTER_${package}_PROTECTED_SOURCES}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_URL}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_SHA1}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_URL}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_SHA1}") hunter_make_directory( "${HUNTER_CACHED_ROOT}/_Base/Download/${HUNTER_PACKAGE_NAME}/${ver}" @@ -113,7 +115,6 @@ function(hunter_download) HUNTER_PACKAGE_DOWNLOAD_DIR ) - # Check that only one scheme is set to 1 set(all_schemes "") set(all_schemes "${all_schemes}${HUNTER_PACKAGE_SCHEME_DOWNLOAD}") @@ -143,33 +144,40 @@ function(hunter_download) set(HUNTER_PACKAGE_SETUP_DIR "${HUNTER_SELF}/cmake/projects/${HUNTER_PACKAGE_NAME}") set(HUNTER_GLOBAL_SCRIPT_DIR "${HUNTER_SELF}/scripts") set(HUNTER_PACKAGE_SCRIPT_DIR "${HUNTER_PACKAGE_SETUP_DIR}/scripts/") - set(HUNTER_PACKAGE_HOME_DIR "${HUNTER_TOOLCHAIN_ID_PATH}/Build") + set(HUNTER_PACKAGE_HOME_DIR "${HUNTER_CONFIG_ID_PATH}/Build") set( HUNTER_PACKAGE_HOME_DIR "${HUNTER_PACKAGE_HOME_DIR}/${HUNTER_PACKAGE_NAME}" ) - if(hunter_has_component) + if(has_component) set( HUNTER_PACKAGE_HOME_DIR "${HUNTER_PACKAGE_HOME_DIR}/__${HUNTER_PACKAGE_COMPONENT}" ) endif() - set(HUNTER_PACKAGE_DONE_STAMP "${HUNTER_PACKAGE_HOME_DIR}/DONE") - if(hunter_has_binary_dir) + if(has_binary_dir) + # When cross-compiling we may need two build directories for + # the package - one for host and one for target. To avoid conflicts + # add random string. + string(RANDOM random) + set(helper_dir_to_remove "${HUNTER_BINARY_DIR}/${random}") set( HUNTER_PACKAGE_BUILD_DIR - "${HUNTER_BINARY_DIR}/${HUNTER_PACKAGE_NAME}" + "${helper_dir_to_remove}/${HUNTER_PACKAGE_NAME}" ) - if(hunter_has_component) + if(has_component) set( HUNTER_PACKAGE_BUILD_DIR "${HUNTER_PACKAGE_BUILD_DIR}/__${HUNTER_PACKAGE_COMPONENT}" ) endif() + if(EXISTS ${HUNTER_PACKAGE_BUILD_DIR}) + hunter_internal_error("Not so random...") + endif() else() set(HUNTER_PACKAGE_BUILD_DIR "${HUNTER_PACKAGE_HOME_DIR}/Build") + set(helper_dir_to_remove "${HUNTER_PACKAGE_BUILD_DIR}") endif() - set(HUNTER_PACKAGE_SOURCE_DIR "${HUNTER_PACKAGE_HOME_DIR}/Source") if(HUNTER_PACKAGE_CACHEABLE) if(NOT HUNTER_PACKAGE_SCHEME_INSTALL) @@ -180,11 +188,30 @@ function(hunter_download) set(HUNTER_PACKAGE_INSTALL_PREFIX "${HUNTER_INSTALL_PREFIX}") endif() + if(HUNTER_PACKAGE_SCHEME_UNPACK) + string(SUBSTRING "${HUNTER_PACKAGE_SHA1}" 0 7 x) + set(hunter_lock_sources TRUE) + set( + hunter_lock_sources_dir + "${HUNTER_CACHED_ROOT}/_Base/Cellar/${HUNTER_PACKAGE_SHA1}/${x}" + ) + set(HUNTER_PACKAGE_SOURCE_DIR "${hunter_lock_sources_dir}/raw") + set(HUNTER_PACKAGE_DONE_STAMP "${hunter_lock_sources_dir}/unpack.DONE") + set(HUNTER_PACKAGE_LICENSE_DIR "${hunter_lock_sources_dir}/licenses") + set(HUNTER_PACKAGE_LICENSE_SEARCH_DIR "${HUNTER_PACKAGE_LICENSE_DIR}") + else() + set(hunter_lock_sources FALSE) + set(HUNTER_PACKAGE_SOURCE_DIR "${HUNTER_PACKAGE_HOME_DIR}/Source") + set(HUNTER_PACKAGE_DONE_STAMP "${HUNTER_PACKAGE_HOME_DIR}/DONE") + set(HUNTER_PACKAGE_LICENSE_DIR "${HUNTER_PACKAGE_INSTALL_PREFIX}/licenses/${HUNTER_PACKAGE_NAME}") + set(HUNTER_PACKAGE_LICENSE_SEARCH_DIR "${HUNTER_INSTALL_PREFIX}/licenses/${HUNTER_PACKAGE_NAME}") + endif() + if(HUNTER_PACKAGE_SCHEME_INSTALL) set(${root_name} "${HUNTER_INSTALL_PREFIX}") hunter_status_debug("Install to: ${HUNTER_INSTALL_PREFIX}") else() - if(hunter_has_component) + if(has_component) hunter_internal_error( "Component for non-install package:" " ${HUNTER_PACKAGE_NAME} ${HUNTER_PACKAGE_COMPONENT}" @@ -204,27 +231,15 @@ function(hunter_download) endif() endif() - # license file variable - set(HUNTER_PACKAGE_LICENSE_FILE "${HUNTER_PACKAGE_INSTALL_PREFIX}/licenses/${HUNTER_PACKAGE_NAME}/LICENSE") - set(license_var "${HUNTER_PACKAGE_NAME}_LICENSE") - set(license_val "${HUNTER_INSTALL_PREFIX}/licenses/${HUNTER_PACKAGE_NAME}/LICENSE") - set(${root_name} "${${root_name}}" PARENT_SCOPE) set(ENV{${root_name}} "${${root_name}}") hunter_status_print("${root_name}: ${${root_name}} (ver.: ${ver})") - hunter_status_debug( - "Default arguments: ${HUNTER_${h_name}_DEFAULT_CMAKE_ARGS}" - ) - hunter_status_debug("User arguments: ${HUNTER_${h_name}_CMAKE_ARGS}") - # Same for the "snake case" string(REPLACE "-" "_" snake_case_root_name "${root_name}") set(${snake_case_root_name} "${${root_name}}" PARENT_SCOPE) set(ENV{${snake_case_root_name}} "${${root_name}}") - set(${license_var} ${license_val} PARENT_SCOPE) - # temp toolchain file to set variables and include real toolchain set(HUNTER_DOWNLOAD_TOOLCHAIN "${HUNTER_PACKAGE_HOME_DIR}/toolchain.cmake") @@ -240,80 +255,133 @@ function(hunter_download) DEPENDS_ON_COMPONENT "${HUNTER_PACKAGE_COMPONENT}" ) - foreach(deps ${HUNTER_PACKAGE_DEPENDS_ON}) - if(NOT HUNTER_PACKAGE_SCHEME_INSTALL) - hunter_internal_error("Non-install scheme can't depends on anything") - endif() - # Register explicit dependency - hunter_register_dependency( - PACKAGE "${HUNTER_PACKAGE_NAME};${HUNTER_PACKAGE_COMPONENT}" - DEPENDS_ON_PACKAGE "${deps}" - ) - endforeach() - if(EXISTS "${HUNTER_PACKAGE_DONE_STAMP}") hunter_status_debug("Package already installed: ${HUNTER_PACKAGE_NAME}") - if(hunter_has_component) + if(has_component) hunter_status_debug("Component: ${HUNTER_PACKAGE_COMPONENT}") endif() + + # In: + # * HUNTER_PACKAGE_HOME_DIR + # * HUNTER_PACKAGE_LICENSE_SEARCH_DIR + # * HUNTER_PACKAGE_NAME + # * HUNTER_PACKAGE_SCHEME_UNPACK + # * HUNTER_PACKAGE_SHA1 + # Out: + # * ${HUNTER_PACKAGE_NAME}_LICENSES (parent scope) + hunter_find_licenses() + return() endif() + # Root should be locked first: + # - https://github.com/ruslo/hunter/issues/1806 + # - https://github.com/forexample/deadlock-test hunter_lock_directory( - "${HUNTER_PACKAGE_DOWNLOAD_DIR}" HUNTER_ALREADY_LOCKED_DIRECTORIES + "${HUNTER_CONFIG_ID_PATH}" HUNTER_ALREADY_LOCKED_DIRECTORIES ) hunter_lock_directory( - "${HUNTER_TOOLCHAIN_ID_PATH}" HUNTER_ALREADY_LOCKED_DIRECTORIES + "${HUNTER_PACKAGE_DOWNLOAD_DIR}" HUNTER_ALREADY_LOCKED_DIRECTORIES ) - if(hunter_has_binary_dir) + if(hunter_lock_sources) hunter_lock_directory( - "${HUNTER_BINARY_DIR}" HUNTER_ALREADY_LOCKED_DIRECTORIES + "${hunter_lock_sources_dir}" HUNTER_ALREADY_LOCKED_DIRECTORIES ) endif() # While locking other instance can finish package building if(EXISTS "${HUNTER_PACKAGE_DONE_STAMP}") hunter_status_debug("Package already installed: ${HUNTER_PACKAGE_NAME}") - if(hunter_has_component) + if(has_component) hunter_status_debug("Component: ${HUNTER_PACKAGE_COMPONENT}") endif() + + # In: + # * HUNTER_PACKAGE_HOME_DIR + # * HUNTER_PACKAGE_LICENSE_SEARCH_DIR + # * HUNTER_PACKAGE_NAME + # * HUNTER_PACKAGE_SCHEME_UNPACK + # * HUNTER_PACKAGE_SHA1 + # Out: + # * ${HUNTER_PACKAGE_NAME}_LICENSES (parent scope) + hunter_find_licenses() + return() endif() - # load from cache using SHA1 of args.cmake file + hunter_get_cmake_args(PACKAGE "${package}" OUT package_cmake_args) + file(REMOVE "${HUNTER_ARGS_FILE}") - hunter_create_args_file( - "${HUNTER_${h_name}_DEFAULT_CMAKE_ARGS};${HUNTER_${h_name}_CMAKE_ARGS}" - "${HUNTER_ARGS_FILE}" - ) + hunter_create_args_file("${package_cmake_args}" "${HUNTER_ARGS_FILE}") + + # Pass the raw list of arguments to build scheme: + # * https://github.com/ruslo/hunter/blob/v0.23.18/cmake/projects/Boost/schemes/url_sha1_boost.cmake.in#L95-L100 + # * https://github.com/ruslo/hunter/issues/1525 + set(HUNTER_${HUNTER_PACKAGE_NAME}_CMAKE_ARGS "${package_cmake_args}") # Check if package can be loaded from cache hunter_load_from_cache() if(HUNTER_CACHE_RUN) + # No need for licenses here (no 'hunter_find_licenses' call) + return() + endif() + + if(HUNTER_PACKAGE_SCHEME_UNPACK AND HUNTER_SKIP_SCHEME_UNPACK) + # We don't need sources if parent is available in cache + hunter_status_debug("Skip unpacking of ${HUNTER_PACKAGE_NAME}") return() endif() if(EXISTS "${HUNTER_PACKAGE_DONE_STAMP}") hunter_status_debug("Package installed from cache: ${HUNTER_PACKAGE_NAME}") - if(hunter_has_component) + if(has_component) hunter_status_debug("Component: ${HUNTER_PACKAGE_COMPONENT}") endif() + + # In: + # * HUNTER_PACKAGE_HOME_DIR + # * HUNTER_PACKAGE_LICENSE_SEARCH_DIR + # * HUNTER_PACKAGE_NAME + # * HUNTER_PACKAGE_SCHEME_UNPACK + # * HUNTER_PACKAGE_SHA1 + # Out: + # * ${HUNTER_PACKAGE_NAME}_LICENSES (parent scope) + hunter_find_licenses() + return() endif() + if(HUNTER_PACKAGE_PROTECTED_SOURCES) + # -> HUNTER_PACKAGE_HTTP_USERNAME + # -> HUNTER_PACKAGE_HTTP_PASSWORD + hunter_read_http_credentials() + + string(COMPARE EQUAL "${HUNTER_PACKAGE_HTTP_USERNAME}" "" name_is_empty) + string(COMPARE EQUAL "${HUNTER_PACKAGE_HTTP_PASSWORD}" "" pass_is_empty) + + if(name_is_empty OR pass_is_empty) + hunter_user_error( + "Credentials for '${HUNTER_PACKAGE_NAME}' are not defined" + ) + endif() + endif() + file(REMOVE_RECURSE "${HUNTER_PACKAGE_BUILD_DIR}") file(REMOVE "${HUNTER_PACKAGE_HOME_DIR}/CMakeLists.txt") file(REMOVE "${HUNTER_DOWNLOAD_TOOLCHAIN}") + hunter_get_keep_package_sources(PACKAGE "${package}" OUT keep_sources) + file(WRITE "${HUNTER_DOWNLOAD_TOOLCHAIN}" "") hunter_jobs_number(HUNTER_JOBS_OPTION "${HUNTER_DOWNLOAD_TOOLCHAIN}") hunter_status_debug("HUNTER_JOBS_NUMBER: ${HUNTER_JOBS_NUMBER}") + hunter_status_debug("HUNTER_JOBS_NUMBER (env): $ENV{HUNTER_JOBS_NUMBER}") hunter_status_debug("HUNTER_JOBS_OPTION: ${HUNTER_JOBS_OPTION}") # support for toolchain file forwarding - if(hunter_has_toolchain) + if(has_toolchain) # Fix windows path get_filename_component(x "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE) file(APPEND "${HUNTER_DOWNLOAD_TOOLCHAIN}" "include(\"${x}\")\n") @@ -343,44 +411,89 @@ function(hunter_download) file( APPEND "${HUNTER_DOWNLOAD_TOOLCHAIN}" - "list(APPEND HUNTER_CACHE_SERVERS ${HUNTER_CACHE_SERVERS})\n" + "set(HUNTER_CACHE_SERVERS \"${HUNTER_CACHE_SERVERS}\" CACHE INTERNAL \"\")\n" + ) + string(COMPARE NOTEQUAL "${HUNTER_PASSWORDS_PATH}" "" has_passwords) + if(has_passwords) + # Fix Windows slashes + get_filename_component( + passwords_path "${HUNTER_PASSWORDS_PATH}" ABSOLUTE + ) + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(HUNTER_PASSWORDS_PATH \"${passwords_path}\" CACHE INTERNAL \"\")\n" + ) + endif() + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(HUNTER_KEEP_PACKAGE_SOURCES \"${HUNTER_KEEP_PACKAGE_SOURCES}\" CACHE INTERNAL \"\")\n" + ) + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(HUNTER_SUPPRESS_LIST_OF_FILES \"${HUNTER_SUPPRESS_LIST_OF_FILES}\" CACHE INTERNAL \"\")\n" + ) + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(HUNTER_DOWNLOAD_SERVER \"${HUNTER_DOWNLOAD_SERVER}\" CACHE INTERNAL \"\")\n" + ) + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(HUNTER_TLS_VERIFY \"${HUNTER_TLS_VERIFY}\" CACHE INTERNAL \"\")\n" + ) + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(HUNTER_RUN_UPLOAD \"${HUNTER_RUN_UPLOAD}\" CACHE INTERNAL \"\")\n" + ) + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(HUNTER_JOBS_NUMBER \"${HUNTER_JOBS_NUMBER}\" CACHE INTERNAL \"\")\n" + ) + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(HUNTER_NO_TOOLCHAIN_ID_RECALCULATION \"${HUNTER_NO_TOOLCHAIN_ID_RECALCULATION}\" CACHE INTERNAL \"\")\n" ) - if(hunter_no_url) - set(avail ${HUNTER_${h_name}_VERSIONS}) - hunter_internal_error( - "${h_name} version(${ver}) not found. Available: [${avail}]" + string(COMPARE NOTEQUAL "${CMAKE_MAKE_PROGRAM}" "" has_make) + if(has_make) + file( + APPEND + "${HUNTER_DOWNLOAD_TOOLCHAIN}" + "set(CMAKE_MAKE_PROGRAM \"${CMAKE_MAKE_PROGRAM}\" CACHE INTERNAL \"\")\n" ) endif() # print info before start generation/run hunter_status_debug("Add package: ${HUNTER_PACKAGE_NAME}") - if(hunter_has_component) + if(has_component) hunter_status_debug("Component: ${HUNTER_PACKAGE_COMPONENT}") endif() hunter_status_debug("Download scheme: ${HUNTER_DOWNLOAD_SCHEME}") hunter_status_debug("Url: ${HUNTER_PACKAGE_URL}") hunter_status_debug("SHA1: ${HUNTER_PACKAGE_SHA1}") - if(HUNTER_PACKAGE_SCHEME_INSTALL) - hunter_status_debug( - "Configuration types: ${HUNTER_PACKAGE_CONFIGURATION_TYPES}" - ) - endif() + hunter_status_debug("HUNTER_TLS_VERIFY: ${HUNTER_TLS_VERIFY}") if(has_internal_deps_id) hunter_status_debug( "Internal dependencies ID: ${HUNTER_PACKAGE_INTERNAL_DEPS_ID}" ) endif() - + set(_hunter_schemes_search_dirs "") - + set( download_scheme "${HUNTER_PACKAGE_SETUP_DIR}/schemes/${HUNTER_DOWNLOAD_SCHEME}.cmake.in" ) set(_hunter_schemes_search_dirs "${_hunter_schemes_search_dirs}, ${download_scheme}") - + if(NOT EXISTS "${download_scheme}") set( download_scheme @@ -391,7 +504,7 @@ function(hunter_download) hunter_internal_error("Download scheme `${download_scheme}` not found. Search locations: ${_hunter_schemes_search_dirs}") endif() endif() - + hunter_status_debug( "Scheme file used: ${download_scheme}" ) @@ -403,7 +516,7 @@ function(hunter_download) ) set(build_message "Building ${HUNTER_PACKAGE_NAME}") - if(hunter_has_component) + if(has_component) set( build_message "${build_message} (component: ${HUNTER_PACKAGE_COMPONENT})" @@ -423,7 +536,7 @@ function(hunter_download) if(NOT allow_builds AND HUNTER_PACKAGE_SCHEME_INSTALL) hunter_fatal_error( "Building package from source is disabled (dir: ${HUNTER_PACKAGE_HOME_DIR})" - WIKI "error.build.disabled" + ERROR_PAGE "error.build.disabled" ) endif() @@ -447,9 +560,14 @@ function(hunter_download) ) string(COMPARE NOTEQUAL "${CMAKE_GENERATOR_TOOLSET}" "" has_toolset) if(has_toolset) + hunter_status_debug("Add toolset: '${CMAKE_GENERATOR_TOOLSET}'") list(APPEND cmd "-T" "${CMAKE_GENERATOR_TOOLSET}") endif() + if(has_make) + list(APPEND cmd "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") + endif() + string(COMPARE NOTEQUAL "${CMAKE_GENERATOR_PLATFORM}" "" has_gen_platform) if(has_gen_platform) list(APPEND cmd "-A" "${CMAKE_GENERATOR_PLATFORM}") @@ -472,7 +590,7 @@ function(hunter_download) else() hunter_fatal_error( "Configure step failed (dir: ${HUNTER_PACKAGE_HOME_DIR})" - WIKI "error.external.build.failed" + ERROR_PAGE "error.external.build.failed" ) endif() @@ -498,7 +616,7 @@ function(hunter_download) else() hunter_fatal_error( "Build step failed (dir: ${HUNTER_PACKAGE_HOME_DIR}" - WIKI "error.external.build.failed" + ERROR_PAGE "error.external.build.failed" ) endif() @@ -512,10 +630,18 @@ function(hunter_download) hunter_status_debug("Cleaning up build directories...") + file(REMOVE_RECURSE "${helper_dir_to_remove}") + file(REMOVE_RECURSE "${HUNTER_PACKAGE_BUILD_DIR}") if(HUNTER_PACKAGE_SCHEME_INSTALL) - # Unpacked directory not needed (save some disk space) - file(REMOVE_RECURSE "${HUNTER_PACKAGE_SOURCE_DIR}") + if(keep_sources) + hunter_status_debug( + "Keep source directory '${HUNTER_PACKAGE_SOURCE_DIR}'" + ) + else() + # Unpacked directory not needed (save some disk space) + file(REMOVE_RECURSE "${HUNTER_PACKAGE_SOURCE_DIR}") + endif() endif() file(REMOVE "${HUNTER_PACKAGE_HOME_DIR}/CMakeLists.txt") @@ -529,4 +655,17 @@ function(hunter_download) hunter_status_debug("Clean up done") file(WRITE "${HUNTER_PACKAGE_DONE_STAMP}" "") + + # Note: will remove 'HUNTER_PACKAGE_BUILD_DIR' + hunter_upload_cache() + + # In: + # * HUNTER_PACKAGE_HOME_DIR + # * HUNTER_PACKAGE_LICENSE_SEARCH_DIR + # * HUNTER_PACKAGE_NAME + # * HUNTER_PACKAGE_SCHEME_UNPACK + # * HUNTER_PACKAGE_SHA1 + # Out: + # * ${HUNTER_PACKAGE_NAME}_LICENSES (parent scope) + hunter_find_licenses() endfunction() diff --git a/cmake/modules/hunter_download_cache_meta_file.cmake b/cmake/modules/hunter_download_cache_meta_file.cmake index 9f52856b9..77add18be 100644 --- a/cmake/modules/hunter_download_cache_meta_file.cmake +++ b/cmake/modules/hunter_download_cache_meta_file.cmake @@ -3,16 +3,21 @@ include(CMakeParseArguments) # cmake_parse_arguments +include(hunter_cache_server_password) include(hunter_check_download_error_message) +include(hunter_get_passwords_path) +include(hunter_http_password) include(hunter_init_not_found_counter) include(hunter_internal_error) +include(hunter_private_data_password) include(hunter_sleep_before_download) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) +include(hunter_upload_password) include(hunter_user_error) function(hunter_download_cache_meta_file) - hunter_test_string_not_empty("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") cmake_parse_arguments(x "" "LOCAL;DONE" "" ${ARGV}) # -> x_LOCAL @@ -40,6 +45,9 @@ function(hunter_download_cache_meta_file) string(REPLACE "${cache_directory}/meta/" "" local_suffix "${x_LOCAL}") string(REPLACE "${cache_directory}/meta/" "" done_suffix "${x_DONE}") + set(local_temp "${x_LOCAL}.__HUNTER_TEMP__") + set(done_temp "${x_DONE}.__HUNTER_TEMP__") + if(EXISTS "${x_DONE}") return() endif() @@ -52,33 +60,72 @@ function(hunter_download_cache_meta_file) return() endif() - foreach(server ${HUNTER_CACHE_SERVERS}) - string(REGEX MATCH "^https://github.com/" is_github "${server}") - if(NOT is_github) - hunter_user_error("Unknown cache server: ${server}") - endif() - - string( - REPLACE - "https://github.com/" - "https://raw.githubusercontent.com/" - url - "${server}" - ) + list(LENGTH HUNTER_CACHE_SERVERS number_of_servers) + hunter_init_not_found_counter( + NOT_FOUND_NEEDED not_found_counter "${number_of_servers}" + ) + + hunter_get_passwords_path(pass_path) + string(COMPARE NOTEQUAL "${pass_path}" "" has_pass) + + set(total_retry 10) + foreach(x RANGE ${total_retry}) + foreach(server ${HUNTER_CACHE_SERVERS}) + set(HUNTER_CACHE_SERVER_NAME "${server}") + + set(HUNTER_CACHE_SERVER_USERPWD "") + set(HUNTER_CACHE_SERVER_HTTPHEADER "") + set(HUNTER_CACHE_SERVER_SUB_SHA1_SUFFIX FALSE) + + if(has_pass) + # May use: + # * hunter_http_password + # * hunter_private_data_password + # * hunter_upload_password + # * hunter_cache_server_password + include("${pass_path}") + endif() - set(local_url "${url}/master/${local_suffix}") - set(done_url "${url}/master/${done_suffix}") + string(REGEX MATCH "^https://github.com/" is_github "${server}") + if(NOT is_github) + set(local_url "${server}/meta/${local_suffix}") + set(done_url "${server}/meta/${done_suffix}") + else() + string( + REPLACE + "https://github.com/" + "https://raw.githubusercontent.com/" + url + "${server}" + ) + + set(local_url "${url}/master/${local_suffix}") + set(done_url "${url}/master/${done_suffix}") + endif() - hunter_init_not_found_counter(NOT_FOUND_NEEDED not_found_counter) + if(HUNTER_CACHE_SERVER_SUB_SHA1_SUFFIX) + string( + REGEX + REPLACE + "/cache\\.sha1$" + "/cache_sha1" + local_url + "${local_url}" + ) + endif() - set(total_retry 10) - foreach(x RANGE ${total_retry}) - hunter_status_debug("Downloading file (try #${x} of ${total_retry}):") + hunter_status_debug("Downloading DONE metafile (try #${x} of ${total_retry}):") hunter_status_debug(" ${done_url}") hunter_status_debug(" -> ${x_DONE}") hunter_sleep_before_download("${x}") - file(DOWNLOAD "${done_url}" "${x_DONE}" STATUS status) + file( + DOWNLOAD "${done_url}" "${done_temp}" + STATUS status + TLS_VERIFY "${HUNTER_TLS_VERIFY}" + ${HUNTER_CACHE_SERVER_USERPWD} + ${HUNTER_CACHE_SERVER_HTTPHEADER} + ) list(GET status 0 error_code) list(GET status 1 error_message) @@ -86,68 +133,72 @@ function(hunter_download_cache_meta_file) hunter_check_download_error_message( ERROR_CODE "${error_code}" ERROR_MESSAGE "${error_message}" - REMOVE_ON_ERROR "${x_DONE}" + REMOVE_ON_ERROR "${done_temp}" NOT_FOUND_COUNTER not_found_counter ) - if(error_code EQUAL 0) - break() - elseif(error_code EQUAL 22) - hunter_status_debug("File not found") - if(NOT_FOUND_NEEDED EQUAL not_found_counter) - break() + if(NOT error_code EQUAL 0) + if(error_code EQUAL 22) + hunter_status_debug("File not found") + if(NOT_FOUND_NEEDED EQUAL not_found_counter) + return() + endif() + else() + hunter_status_debug("Download error (${error_message})") endif() - else() - hunter_status_debug("Download error (${error_message})") + continue() endif() - endforeach() - - if(NOT EXISTS "${x_DONE}") - # DONE stamp not found on this server, try next - continue() - endif() - - hunter_init_not_found_counter(NOT_FOUND_NEEDED not_found_counter) - - set(total_retry 10) - foreach(x RANGE ${total_retry}) - hunter_status_debug("Downloading file (try #${x} of ${total_retry}):") - hunter_status_debug(" ${local_url}") - hunter_status_debug(" -> ${x_LOCAL}") - - hunter_sleep_before_download("${x}") - file(DOWNLOAD "${local_url}" "${x_LOCAL}" STATUS status) - - list(GET status 0 error_code) - list(GET status 1 error_message) - hunter_check_download_error_message( - ERROR_CODE "${error_code}" - ERROR_MESSAGE "${error_message}" - REMOVE_ON_ERROR "${x_LOCAL}" - NOT_FOUND_COUNTER not_found_counter + # Done stamp exists, now downloading real file + hunter_init_not_found_counter( + NOT_FOUND_NEEDED not_found_counter 1 # polling one server ) - if(error_code EQUAL 0) - return() - elseif(error_code EQUAL 22) - hunter_status_debug("File not found") - if(NOT_FOUND_NEEDED EQUAL not_found_counter) - file(REMOVE "${x_DONE}") - hunter_internal_error( - "Server error. File not exists but DONE stamp found.\n" - " file: ${local_url}" - " done: ${done_url}" - ) + set(total_retry ${NOT_FOUND_NEEDED}) + foreach(x RANGE ${total_retry}) + hunter_status_debug("Downloading metafile (try #${x} of ${total_retry}):") + hunter_status_debug(" ${local_url}") + hunter_status_debug(" -> ${x_LOCAL}") + + hunter_sleep_before_download("${x}") + file( + DOWNLOAD "${local_url}" "${local_temp}" + STATUS status + TLS_VERIFY "${HUNTER_TLS_VERIFY}" + ${HUNTER_CACHE_SERVER_USERPWD} + ${HUNTER_CACHE_SERVER_HTTPHEADER} + ) + + list(GET status 0 error_code) + list(GET status 1 error_message) + + hunter_check_download_error_message( + ERROR_CODE "${error_code}" + ERROR_MESSAGE "${error_message}" + REMOVE_ON_ERROR "${local_temp}" + NOT_FOUND_COUNTER not_found_counter + ) + + if(error_code EQUAL 0) + # Success. Rename temporary files to the final destination. + # RENAME operation is atomic. Note that DONE should be the last to + # signal that everything ended as expected. + file(RENAME "${local_temp}" "${x_LOCAL}") + file(RENAME "${done_temp}" "${x_DONE}") + return() + elseif(error_code EQUAL 22) + hunter_status_debug("File not found") + else() + hunter_status_debug("Download error (${error_message})") endif() - else() - hunter_status_debug("Download error (${error_message})") - endif() - endforeach() + endforeach() - if(NOT EXISTS "${x_LOCAL}") - # some errors, remove DONE stamp and try next server - file(REMOVE "${x_DONE}") - endif() + file(REMOVE "${done_temp}") + hunter_internal_error( + "Server error. File not exists but DONE stamp found.\n" + " file: ${local_url}" + " done: ${done_url}" + ) + endforeach() endforeach() endfunction() diff --git a/cmake/modules/hunter_download_cache_raw_file.cmake b/cmake/modules/hunter_download_cache_raw_file.cmake index f19d05f2d..04bfa3e96 100644 --- a/cmake/modules/hunter_download_cache_raw_file.cmake +++ b/cmake/modules/hunter_download_cache_raw_file.cmake @@ -3,16 +3,22 @@ include(CMakeParseArguments) # cmake_parse_arguments +include(hunter_cache_server_password) include(hunter_check_download_error_message) +include(hunter_get_passwords_path) +include(hunter_http_password) include(hunter_init_not_found_counter) include(hunter_internal_error) +include(hunter_private_data_password) include(hunter_sleep_before_download) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) +include(hunter_upload_password) include(hunter_user_error) function(hunter_download_cache_raw_file) - hunter_test_string_not_empty("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_TLS_VERIFY}") cmake_parse_arguments(x "" "LOCAL;SHA1;FROMSERVER" "" ${ARGV}) # -> x_LOCAL @@ -61,24 +67,60 @@ function(hunter_download_cache_raw_file) return() endif() - hunter_init_not_found_counter(NOT_FOUND_NEEDED not_found_counter) - - foreach(server ${HUNTER_CACHE_SERVERS}) - string(REGEX MATCH "^https://github.com/" is_github "${server}") - if(NOT is_github) - hunter_user_error("Unknown cache server: ${server}") - endif() + list(LENGTH HUNTER_CACHE_SERVERS number_of_servers) + hunter_init_not_found_counter( + NOT_FOUND_NEEDED not_found_counter "${number_of_servers}" + ) + + hunter_get_passwords_path(pass_path) + string(COMPARE NOTEQUAL "${pass_path}" "" has_pass) + + set(total_retry 10) + foreach(x RANGE ${total_retry}) + foreach(server ${HUNTER_CACHE_SERVERS}) + set(HUNTER_CACHE_SERVER_NAME "${server}") + + set(HUNTER_CACHE_SERVER_USERPWD "") + set(HUNTER_CACHE_SERVER_HTTPHEADER "") + + if(has_pass) + # May use: + # * hunter_http_password + # * hunter_private_data_password + # * hunter_upload_password + # * hunter_cache_server_password + include("${pass_path}") + endif() - set(url "${server}/releases/download/cache/${suffix}") + string(REGEX MATCH "^https://github.com/" is_github "${server}") + if(NOT is_github) + set(url "${server}/raw/${suffix}") + else() + string(SUBSTRING "${suffix}" 0 7 cache_tag) + set(url "${server}/releases/download/cache-${cache_tag}/${suffix}") + endif() - set(total_retry 10) - foreach(x RANGE ${total_retry}) - hunter_status_debug("Downloading file (try #${x} of ${total_retry}):") + hunter_status_debug("Downloading raw file (try #${x} of ${total_retry}):") hunter_status_debug(" ${url}") hunter_status_debug(" -> ${x_LOCAL}") hunter_sleep_before_download("${x}") - file(DOWNLOAD "${url}" "${x_LOCAL}" STATUS status) + + if(HUNTER_STATUS_DEBUG) + set(showprogress SHOW_PROGRESS) + else() + set(showprogress "") + endif() + + file( + DOWNLOAD "${url}" "${x_LOCAL}" + STATUS status + ${showprogress} + TLS_VERIFY "${HUNTER_TLS_VERIFY}" + ${HUNTER_CACHE_SERVER_USERPWD} + ${HUNTER_CACHE_SERVER_HTTPHEADER} + ) + file(SHA1 "${x_LOCAL}" local_sha1) string(COMPARE EQUAL "${local_sha1}" "${x_SHA1}" sha1_is_good) @@ -105,7 +147,7 @@ function(hunter_download_cache_raw_file) elseif(error_code EQUAL 22) hunter_status_debug("File not found") if(NOT_FOUND_NEEDED EQUAL not_found_counter) - break() + return() endif() else() hunter_status_debug("Download error (${error_message})") diff --git a/cmake/modules/hunter_experimental_add_host_project.cmake b/cmake/modules/hunter_experimental_add_host_project.cmake index 85ab90f9f..bd399b0d1 100644 --- a/cmake/modules/hunter_experimental_add_host_project.cmake +++ b/cmake/modules/hunter_experimental_add_host_project.cmake @@ -4,7 +4,7 @@ # ************************* !!! WARNING !!! ************************* # # You're using experimental feature. This may not work well -# and can be removed anytime. It's a workaround for existsing +# and can be removed anytime. It's a workaround for existing # feature request: # # https://github.com/ruslo/hunter/issues/495 @@ -20,16 +20,21 @@ include(CMakeParseArguments) # cmake_parse_arguments -include(hunter_user_error) -include(hunter_status_print) include(hunter_status_debug) +include(hunter_status_print) +include(hunter_assert_not_empty_string) +include(hunter_user_error) function(hunter_experimental_add_host_project) + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_SHA1}") + hunter_assert_not_empty_string("${HUNTER_URL}") + hunter_status_print(" ************************* !!! WARNING !!! ************************* You're using experimental feature. This may not work well -and can be removed anytime. It's a workaround for existsing +and can be removed anytime. It's a workaround for existing feature request: https://github.com/ruslo/hunter/issues/495 @@ -62,11 +67,38 @@ https://github.com/ruslo/hunter/issues/495 hunter_status_print("Building host project: ${home_directory}") + string(COMPARE EQUAL "${HUNTER_EXPERIMENTAL_HOST_GENERATOR}" "" no_generator) + if(no_generator) + set(host_generator "") + hunter_status_debug("Using default host generator") + else() + hunter_status_debug("Using host generator: ${HUNTER_EXPERIMENTAL_HOST_GENERATOR}") + set(host_generator -G${HUNTER_EXPERIMENTAL_HOST_GENERATOR}) + endif() + + string(COMPARE EQUAL "${HUNTER_EXPERIMENTAL_HOST_TOOLCHAIN_FILE}" "" no_toolchain) + if(no_toolchain) + set(host_toolchain "") + hunter_status_debug("Not using host toolchain") + else() + hunter_status_debug("Using host toolchain: ${HUNTER_EXPERIMENTAL_HOST_TOOLCHAIN_FILE}") + set(host_toolchain -DCMAKE_TOOLCHAIN_FILE=${HUNTER_EXPERIMENTAL_HOST_TOOLCHAIN_FILE}) + endif() + # invoke cmake for host project include(${HUNTER_SELF}/scripts/clear-all.cmake) execute_process( - COMMAND "${CMAKE_COMMAND}" "-H${home_directory}" "-B${binary_directory}" - "-DHUNTER_HOST_URL=${HUNTER_GATE_URL}" "-DHUNTER_HOST_SHA1=${HUNTER_GATE_SHA1}" "-DHUNTER_ROOT=${HUNTER_ROOT}" + COMMAND + "${CMAKE_COMMAND}" + "-H${home_directory}" + "-B${binary_directory}" + "-DHUNTER_HOST_URL=${HUNTER_URL}" + "-DHUNTER_HOST_SHA1=${HUNTER_SHA1}" + "-DHUNTER_ROOT=${HUNTER_CACHED_ROOT}" + "-DHUNTER_ALREADY_LOCKED_DIRECTORIES=${HUNTER_ALREADY_LOCKED_DIRECTORIES}" + "-DHUNTER_CACHE_SERVERS=${HUNTER_CACHE_SERVERS}" + ${host_generator} + ${host_toolchain} RESULT_VARIABLE exit_code ) string(COMPARE EQUAL "${exit_code}" "0" success) diff --git a/cmake/modules/hunter_fatal_error.cmake b/cmake/modules/hunter_fatal_error.cmake index 4eb5745f9..a16841ca3 100644 --- a/cmake/modules/hunter_fatal_error.cmake +++ b/cmake/modules/hunter_fatal_error.cmake @@ -4,18 +4,18 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_internal_error) -include(hunter_wiki) +include(hunter_error_page) function(hunter_fatal_error) - cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}") - if(NOT hunter_WIKI) - hunter_internal_error("Expected wiki") + cmake_parse_arguments(x "" "ERROR_PAGE" "" "${ARGV}") + if(NOT x_ERROR_PAGE) + hunter_internal_error("Expected argument ERROR_PAGE") endif() message("") - foreach(x ${hunter_UNPARSED_ARGUMENTS}) + foreach(x ${x_UNPARSED_ARGUMENTS}) message("[hunter ** FATAL ERROR **] ${x}") endforeach() message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") message("") - hunter_wiki("${hunter_WIKI}") + hunter_error_page("${x_ERROR_PAGE}") endfunction() diff --git a/cmake/modules/hunter_finalize.cmake b/cmake/modules/hunter_finalize.cmake index b24a7e062..27e2a30d9 100644 --- a/cmake/modules/hunter_finalize.cmake +++ b/cmake/modules/hunter_finalize.cmake @@ -6,10 +6,11 @@ include(hunter_apply_gate_settings) include(hunter_calculate_self) include(hunter_create_cache_file) include(hunter_fatal_error) +include(hunter_internal_error) include(hunter_sanity_checks) include(hunter_status_debug) include(hunter_status_print) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) # Continue initialization of key variables (also see 'hunter_initialize') # * calculate toolchain-id @@ -18,8 +19,12 @@ macro(hunter_finalize) # Check preconditions hunter_sanity_checks() - list(APPEND HUNTER_CACHE_SERVERS "https://github.com/ingenue/hunter-cache") - list(REMOVE_DUPLICATES HUNTER_CACHE_SERVERS) + string(COMPARE EQUAL "${HUNTER_CACHE_SERVERS}" "" _is_empty) + if(_is_empty) + hunter_status_debug("Using default cache server") + set(HUNTER_CACHE_SERVERS "https://github.com/ingenue/hunter-cache") + endif() + hunter_status_debug("List of cache servers:") foreach(_server ${HUNTER_CACHE_SERVERS}) hunter_status_debug(" * ${_server}") @@ -43,13 +48,13 @@ macro(hunter_finalize) if(_c_enabled AND NOT CMAKE_C_ABI_COMPILED) hunter_fatal_error( - "ABI not detected for C compiler" WIKI "error.abi.detection.failure" + "ABI not detected for C compiler" ERROR_PAGE "error.abi.detection.failure" ) endif() if(_cxx_enabled AND NOT CMAKE_CXX_ABI_COMPILED) hunter_fatal_error( - "ABI not detected for CXX compiler" WIKI "error.abi.detection.failure" + "ABI not detected for CXX compiler" ERROR_PAGE "error.abi.detection.failure" ) endif() @@ -62,21 +67,27 @@ macro(hunter_finalize) # * Read HUNTER_GATE_* variables # * Check cache HUNTER_* variables is up-to-date # * Update cache if needed + # * define HUNTER_ID_PATH + # * define HUNTER_TOOLCHAIN_ID_PATH + # * define HUNTER_CONFIG_ID_PATH hunter_apply_gate_settings() string(SUBSTRING "${HUNTER_SHA1}" 0 7 HUNTER_ID) string(SUBSTRING "${HUNTER_CONFIG_SHA1}" 0 7 HUNTER_CONFIG_ID) string(SUBSTRING "${HUNTER_TOOLCHAIN_SHA1}" 0 7 HUNTER_TOOLCHAIN_ID) - set(HUNTER_ID_PATH "${HUNTER_CACHED_ROOT}/_Base/${HUNTER_ID}") - set(HUNTER_CONFIG_ID_PATH "${HUNTER_ID_PATH}/${HUNTER_CONFIG_ID}") - set( - HUNTER_TOOLCHAIN_ID_PATH - "${HUNTER_CONFIG_ID_PATH}/${HUNTER_TOOLCHAIN_ID}" - ) - - set(HUNTER_INSTALL_PREFIX "${HUNTER_TOOLCHAIN_ID_PATH}/Install") + set(HUNTER_INSTALL_PREFIX "${HUNTER_CONFIG_ID_PATH}/Install") list(APPEND CMAKE_PREFIX_PATH "${HUNTER_INSTALL_PREFIX}") + + # Override pkg-config default search path + # https://github.com/ruslo/hunter/issues/762 + if(NOT MSVC) + set(_pkg_config_dir1 "${HUNTER_INSTALL_PREFIX}/lib/pkgconfig") + set(_pkg_config_dir2 "${HUNTER_INSTALL_PREFIX}/share/pkgconfig") + # This info is also in hunter_autotools_project.cmake + set(ENV{PKG_CONFIG_LIBDIR} "${_pkg_config_dir1}:${_pkg_config_dir2}") + endif() + if(ANDROID) # OpenCV support: https://github.com/ruslo/hunter/issues/153 list(APPEND CMAKE_PREFIX_PATH "${HUNTER_INSTALL_PREFIX}/sdk/native/jni") @@ -88,14 +99,17 @@ macro(hunter_finalize) hunter_status_debug( "HUNTER_CONFIGURATION_TYPES: ${HUNTER_CACHED_CONFIGURATION_TYPES}" ) + hunter_status_debug( + "HUNTER_BUILD_SHARED_LIBS: ${HUNTER_BUILD_SHARED_LIBS}" + ) set(_id_info "[ Hunter-ID: ${HUNTER_ID} |") - set(_id_info "${_id_info} Config-ID: ${HUNTER_CONFIG_ID} |") - set(_id_info "${_id_info} Toolchain-ID: ${HUNTER_TOOLCHAIN_ID} ]") + set(_id_info "${_id_info} Toolchain-ID: ${HUNTER_TOOLCHAIN_ID} |") + set(_id_info "${_id_info} Config-ID: ${HUNTER_CONFIG_ID} ]") hunter_status_print("${_id_info}") - set(HUNTER_CACHE_FILE "${HUNTER_TOOLCHAIN_ID_PATH}/cache.cmake") + set(HUNTER_CACHE_FILE "${HUNTER_CONFIG_ID_PATH}/cache.cmake") hunter_create_cache_file("${HUNTER_CACHE_FILE}") if(MSVC) @@ -119,12 +133,12 @@ macro(hunter_finalize) ### 1. Clear all '_ROOT' variables (cache, environment, ...) ### 2. Set '_ROOT' or 'HUNTER__VERSION' variables - set(HUNTER_ALLOW_CONFIG_LOADING YES) + set(__HUNTER_ALLOW_FINAL_CONFIG_LOADING YES) include("${HUNTER_CONFIG_ID_PATH}/config.cmake") - set(HUNTER_ALLOW_CONFIG_LOADING NO) + set(__HUNTER_ALLOW_FINAL_CONFIG_LOADING NO) - hunter_test_string_not_empty("${HUNTER_INSTALL_PREFIX}") - hunter_test_string_not_empty("${CMAKE_BINARY_DIR}") + hunter_assert_not_empty_string("${HUNTER_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${CMAKE_BINARY_DIR}") file( WRITE @@ -133,4 +147,39 @@ macro(hunter_finalize) ) hunter_apply_copy_rules() + + if(ANDROID AND CMAKE_VERSION VERSION_LESS "3.7.1") + hunter_user_error( + "CMake version 3.7.1+ required for Android platforms, see" + " https://docs.hunter.sh/en/latest/quick-start/cmake.html" + ) + endif() + + # Android GDBSERVER moved to + # https://github.com/hunter-packages/android-apk/commit/32531adeb287d3e3b20498ff1a0f76336cbe0551 + + # Fix backslashed provided by user: + # * https://github.com/ruslo/hunter/issues/693 + # Note: we can't use 'get_filename_component(... ABSOLUTE)' because sometimes + # original path expected. E.g. NMake build: + # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1412/job/o8a21ue85ivt5d0p + string(REPLACE "\\" "\\\\" CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM}") + + if(CMAKE_INTERPROCEDURAL_OPTIMIZATION AND NOT POLICY CMP0069) + hunter_user_error("Unsuitable CMake version") + endif() + + if(IOS AND NOT CMAKE_CROSSCOMPILING) + hunter_user_error( + "CMAKE_CROSSCOMPILING should be set on iOS." + " Please update your toolchain." + ) + endif() + + string(COMPARE EQUAL "${HUNTER_TLS_VERIFY}" "" _is_empty) + if(_is_empty) + hunter_user_error( + "HUNTER_TLS_VERIFY is empty, please update HunterGate module" + ) + endif() endmacro() diff --git a/cmake/modules/hunter_flush_cache_variables.cmake b/cmake/modules/hunter_flush_cache_variables.cmake index a79d7879e..110ce748d 100644 --- a/cmake/modules/hunter_flush_cache_variables.cmake +++ b/cmake/modules/hunter_flush_cache_variables.cmake @@ -2,11 +2,11 @@ # All rights reserved. include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_unsetvar) function(hunter_flush_cache_variables hunter_self) - hunter_test_string_not_empty("${hunter_self}") + hunter_assert_not_empty_string("${hunter_self}") hunter_status_debug("Flushing cache") @@ -25,6 +25,36 @@ function(hunter_flush_cache_variables hunter_self) set(cleanup TRUE) endif() + # Issue https://github.com/ruslo/hunter/issues/569 { + if(x MATCHES "^Boost_.*_LIBRARY_.*$") + set(cleanup TRUE) + endif() + + if(x MATCHES "^Boost_LIBRARY_DIR_.*$") + set(cleanup TRUE) + endif() + + if(x MATCHES "^_Boost_LIBRARY_DIR_.*_LAST$") + set(cleanup TRUE) + endif() + # } + + # From OpenCV Android { + if(x MATCHES "^OpenCV_3RDPARTY_LIB_DIR_(OPT|DBG)$") + set(cleanup TRUE) + endif() + + if(x MATCHES "^OpenCV_CONFIG_PATH$") + set(cleanup TRUE) + endif() + # } + + # From FindOpenSSL.cmake { + if(x MATCHES "^OPENSSL_(SSL|CRYPTO)_LIBRARY$") + set(cleanup TRUE) + endif() + # } + # Exclude standard variables { set( std_variables_list diff --git a/cmake/modules/hunter_generate_qt_5_5_info.cmake b/cmake/modules/hunter_generate_qt_5_5_info.cmake index acf88d23c..8064a7c97 100644 --- a/cmake/modules/hunter_generate_qt_5_5_info.cmake +++ b/cmake/modules/hunter_generate_qt_5_5_info.cmake @@ -3,7 +3,7 @@ include(hunter_internal_error) include(hunter_qt_add_module) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) # See cmake/projects/Qt/generate.sh @@ -18,9 +18,9 @@ function( is_android is_win32 ) - hunter_test_string_not_empty("${component_name}") - hunter_test_string_not_empty("${skip_components_varname}") - hunter_test_string_not_empty("${component_depends_on_varname}") + hunter_assert_not_empty_string("${component_name}") + hunter_assert_not_empty_string("${skip_components_varname}") + hunter_assert_not_empty_string("${component_depends_on_varname}") string(COMPARE NOTEQUAL "${ARGN}" "" has_unparsed) if(has_unparsed) diff --git a/cmake/modules/hunter_generate_qt_5_6_info.cmake b/cmake/modules/hunter_generate_qt_5_6_info.cmake index 7087a9a6a..dfef6bd55 100644 --- a/cmake/modules/hunter_generate_qt_5_6_info.cmake +++ b/cmake/modules/hunter_generate_qt_5_6_info.cmake @@ -3,7 +3,7 @@ include(hunter_internal_error) include(hunter_qt_add_module) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) # See cmake/projects/Qt/generate.sh @@ -18,9 +18,9 @@ function( is_android is_win32 ) - hunter_test_string_not_empty("${component_name}") - hunter_test_string_not_empty("${skip_components_varname}") - hunter_test_string_not_empty("${component_depends_on_varname}") + hunter_assert_not_empty_string("${component_name}") + hunter_assert_not_empty_string("${skip_components_varname}") + hunter_assert_not_empty_string("${component_depends_on_varname}") string(COMPARE NOTEQUAL "${ARGN}" "" has_unparsed) if(has_unparsed) diff --git a/cmake/modules/hunter_generate_qt_info.cmake b/cmake/modules/hunter_generate_qt_info.cmake index 92495f20e..6ba6f132b 100644 --- a/cmake/modules/hunter_generate_qt_info.cmake +++ b/cmake/modules/hunter_generate_qt_info.cmake @@ -3,11 +3,19 @@ include(hunter_generate_qt_5_5_info) include(hunter_generate_qt_5_6_info) -include(hunter_test_string_not_empty) +include(hunter_generate_qt_5_9_info) +include(hunter_generate_qt_5_10_info) +include(hunter_generate_qt_5_11_info) +include(hunter_generate_qt_5_12_info) +include(hunter_assert_not_empty_string) include(hunter_user_error) # See cmake/projects/Qt/generate.sh +# Notes: +# * We need full list of dependencies on configuration step (see `qt-configure`) +# hence the `depends_on` should contains implicit dependencies too +# (dependencies of dependencies). function( hunter_generate_qt_info component_name @@ -18,11 +26,11 @@ function( is_android is_win32 ) - hunter_test_string_not_empty("${component_name}") - hunter_test_string_not_empty("${skip_components_varname}") - hunter_test_string_not_empty("${component_depends_on_varname}") - hunter_test_string_not_empty("${nobuild_varname}") - hunter_test_string_not_empty("${qt_version}") + hunter_assert_not_empty_string("${component_name}") + hunter_assert_not_empty_string("${skip_components_varname}") + hunter_assert_not_empty_string("${component_depends_on_varname}") + hunter_assert_not_empty_string("${nobuild_varname}") + hunter_assert_not_empty_string("${qt_version}") if(qt_version MATCHES "^5\\.5\\.") hunter_generate_qt_5_5_info( @@ -40,6 +48,38 @@ function( "${is_android}" "${is_win32}" ) + elseif(qt_version MATCHES "^5\\.9\\.") + hunter_generate_qt_5_9_info( + "${component_name}" + toskip + depends_on + "${is_android}" + "${is_win32}" + ) + elseif(qt_version MATCHES "^5\\.10\\.") + hunter_generate_qt_5_10_info( + "${component_name}" + toskip + depends_on + "${is_android}" + "${is_win32}" + ) + elseif(qt_version MATCHES "^5\\.11\\.") + hunter_generate_qt_5_11_info( + "${component_name}" + toskip + depends_on + "${is_android}" + "${is_win32}" + ) + elseif(qt_version MATCHES "^5\\.12\\.") + hunter_generate_qt_5_12_info( + "${component_name}" + toskip + depends_on + "${is_android}" + "${is_win32}" + ) else() hunter_user_error("Unexpected Qt version") endif() diff --git a/cmake/modules/hunter_get_package_deps.cmake b/cmake/modules/hunter_get_package_deps.cmake index 096b51689..e5da5167d 100644 --- a/cmake/modules/hunter_get_package_deps.cmake +++ b/cmake/modules/hunter_get_package_deps.cmake @@ -4,7 +4,7 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_internal_error) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) # Get list of dependencies sorted alphabetically in format: # @@ -33,14 +33,14 @@ function(hunter_get_package_deps) hunter_internal_error("Unparsed: ${x_UNPARSED_ARGUMENTS}") endif() - hunter_test_string_not_empty("${x_PACKAGE}") - hunter_test_string_not_empty("${x_RESULT}") + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_RESULT}") - hunter_test_string_not_empty("${HUNTER_TOOLCHAIN_ID_PATH}") + hunter_assert_not_empty_string("${HUNTER_CONFIG_ID_PATH}") # Go to directory '/Build//__/Dependencies' # and find all `__dep` files. - set(dep_dir "${HUNTER_TOOLCHAIN_ID_PATH}/Build/${x_PACKAGE}") + set(dep_dir "${HUNTER_CONFIG_ID_PATH}/Build/${x_PACKAGE}") if(has_component) set(dep_dir "${dep_dir}/__${x_COMPONENT}") endif() diff --git a/cmake/modules/hunter_get_package_deps_recurse.cmake b/cmake/modules/hunter_get_package_deps_recurse.cmake index 4c1c57cef..57037c6ca 100644 --- a/cmake/modules/hunter_get_package_deps_recurse.cmake +++ b/cmake/modules/hunter_get_package_deps_recurse.cmake @@ -5,7 +5,7 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_get_package_deps) include(hunter_internal_error) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) # Get list of dependencies sorted alphabetically in format: # @@ -29,8 +29,8 @@ function(hunter_get_package_deps_recurse) hunter_internal_error("Unparsed: ${x_UNPARSED_ARGUMENTS}") endif() - hunter_test_string_not_empty("${x_PACKAGE}") - hunter_test_string_not_empty("${x_RESULT}") + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_RESULT}") set(basic_dependencies "") diff --git a/cmake/modules/hunter_init_not_found_counter.cmake b/cmake/modules/hunter_init_not_found_counter.cmake index 97f75e0e1..ae764e437 100644 --- a/cmake/modules/hunter_init_not_found_counter.cmake +++ b/cmake/modules/hunter_init_not_found_counter.cmake @@ -1,12 +1,14 @@ # Copyright (c) 2016, Ruslan Baratov # All rights reserved. -function(hunter_init_not_found_counter not_found_needed_name not_found_counter_name) +function(hunter_init_not_found_counter not_found_needed_name not_found_counter_name number_of_servers) string(COMPARE EQUAL "${HUNTER_USE_CACHE_SERVERS}" "ONLY" only_servers) if(only_servers) - set("${not_found_needed_name}" 4 PARENT_SCOPE) + set(x 4) else() - set("${not_found_needed_name}" 2 PARENT_SCOPE) + set(x 2) endif() + math(EXPR x "${x} * ${number_of_servers}") + set("${not_found_needed_name}" "${x}" PARENT_SCOPE) set("${not_found_counter_name}" 0 PARENT_SCOPE) endfunction() diff --git a/cmake/modules/hunter_initialize.cmake b/cmake/modules/hunter_initialize.cmake index 6fe5b347b..ef640a2a9 100644 --- a/cmake/modules/hunter_initialize.cmake +++ b/cmake/modules/hunter_initialize.cmake @@ -5,7 +5,7 @@ include(hunter_calculate_self) include(hunter_flush_cache_variables) include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) macro(hunter_initialize) get_property(_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET) @@ -73,10 +73,39 @@ macro(hunter_initialize) set(_flush TRUE) endif() + string( + COMPARE + EQUAL + "${HUNTER_CACHED_CONFIGURATION_TYPES}" + "${HUNTER_CONFIGURATION_TYPES}" + _is_ok + ) + if(NOT _is_ok) + hunter_status_debug("HUNTER_CONFIGURATION_TYPES changed:") + hunter_status_debug(" ${HUNTER_CACHED_CONFIGURATION_TYPES}") + hunter_status_debug(" ${HUNTER_CONFIGURATION_TYPES}") + set(_flush TRUE) + endif() + + string( + COMPARE + EQUAL + "${HUNTER_CACHED_BUILD_SHARED_LIBS}" + "${HUNTER_BUILD_SHARED_LIBS}" + _is_ok + ) + if(NOT _is_ok) + hunter_status_debug("HUNTER_BUILD_SHARED_LIBS changed:") + hunter_status_debug(" ${HUNTER_CACHED_BUILD_SHARED_LIBS}") + hunter_status_debug(" ${HUNTER_BUILD_SHARED_LIBS}") + set(_flush TRUE) + endif() + if(_flush) set(HUNTER_CACHED_ROOT "${HUNTER_GATE_ROOT}" CACHE INTERNAL "") set(HUNTER_VERSION "${HUNTER_GATE_VERSION}" CACHE INTERNAL "") set(HUNTER_SHA1 "${HUNTER_GATE_SHA1}" CACHE INTERNAL "") + set(HUNTER_URL "${HUNTER_GATE_URL}" CACHE INTERNAL "") hunter_calculate_self( "${HUNTER_CACHED_ROOT}" @@ -90,16 +119,20 @@ macro(hunter_initialize) set(HUNTER_CONFIG_SHA1 "" CACHE INTERNAL "") set(HUNTER_TOOLCHAIN_SHA1 "" CACHE INTERNAL "") set(HUNTER_CACHED_CONFIGURATION_TYPES "" CACHE INTERNAL "") + set(HUNTER_CACHED_BUILD_SHARED_LIBS "" CACHE INTERNAL "") endif() else() set(HUNTER_CACHED_ROOT "${HUNTER_GATE_ROOT}" CACHE INTERNAL "") set(HUNTER_VERSION "${HUNTER_GATE_VERSION}" CACHE INTERNAL "") set(HUNTER_SHA1 "${HUNTER_GATE_SHA1}" CACHE INTERNAL "") + set(HUNTER_URL "${HUNTER_GATE_URL}" CACHE INTERNAL "") endif() - hunter_test_string_not_empty("${HUNTER_CACHED_ROOT}") - hunter_test_string_not_empty("${HUNTER_VERSION}") - hunter_test_string_not_empty("${HUNTER_SHA1}") + + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_VERSION}") + hunter_assert_not_empty_string("${HUNTER_SHA1}") + hunter_assert_not_empty_string("${HUNTER_URL}") # All variables are ready so let's set HUNTER_SELF here. Usually it's not # needed before 'hunter_finalize' but it some cases may be useful diff --git a/cmake/modules/hunter_install_boost_config.cmake b/cmake/modules/hunter_install_boost_config.cmake index 12cafd9c1..a3526897b 100644 --- a/cmake/modules/hunter_install_boost_config.cmake +++ b/cmake/modules/hunter_install_boost_config.cmake @@ -1,12 +1,12 @@ # Copyright (c) 2015, Ruslan Baratov # All rights reserved. -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_install_boost_config) - hunter_test_string_not_empty("${HUNTER_SELF}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_INSTALL_PREFIX}") - hunter_test_string_not_empty("${HUNTER_Boost_VERSION}") + hunter_assert_not_empty_string("${HUNTER_SELF}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_Boost_VERSION}") set(templates "${HUNTER_SELF}/cmake/templates") set(configs "${HUNTER_PACKAGE_INSTALL_PREFIX}/lib/cmake/Boost") diff --git a/cmake/modules/hunter_internal_error.cmake b/cmake/modules/hunter_internal_error.cmake index 4fa6386c4..648f03bfc 100644 --- a/cmake/modules/hunter_internal_error.cmake +++ b/cmake/modules/hunter_internal_error.cmake @@ -1,7 +1,7 @@ # Copyright (c) 2014, Ruslan Baratov # All rights reserved. -include(hunter_wiki) +include(hunter_error_page) function(hunter_internal_error) message("") @@ -10,5 +10,5 @@ function(hunter_internal_error) endforeach() message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") message("") - hunter_wiki("error.internal") + hunter_error_page("error.internal") endfunction() diff --git a/cmake/modules/hunter_jobs_number.cmake b/cmake/modules/hunter_jobs_number.cmake index e4511e04a..64ab359ce 100644 --- a/cmake/modules/hunter_jobs_number.cmake +++ b/cmake/modules/hunter_jobs_number.cmake @@ -8,33 +8,56 @@ function(hunter_jobs_number jobs_options_varname toolchain_path) return() endif() - string(COMPARE EQUAL "${HUNTER_JOBS_NUMBER}" "" use_default_jobs) - if(use_default_jobs) + string(COMPARE EQUAL "$ENV{HUNTER_JOBS_NUMBER}" "0" disable_jobs) + if(disable_jobs) + set("${jobs_options_varname}" "" PARENT_SCOPE) + return() + endif() + + string(COMPARE NOTEQUAL "${HUNTER_JOBS_NUMBER}" "" has_cmake_var) + string(COMPARE NOTEQUAL "$ENV{HUNTER_JOBS_NUMBER}" "" has_env_var) + + if(has_cmake_var) + set(jobs_number "${HUNTER_JOBS_NUMBER}") + elseif(has_env_var) + set(jobs_number "$ENV{HUNTER_JOBS_NUMBER}") + else() cmake_host_system_information( - RESULT jobs_number + RESULT l_cores QUERY NUMBER_OF_LOGICAL_CORES ) + cmake_host_system_information( + RESULT p_cores + QUERY NUMBER_OF_PHYSICAL_CORES + ) + hunter_status_debug("Number of physical cores: ${p_cores}") + hunter_status_debug("Number of logical cores: ${l_cores}") + + set(jobs_number ${p_cores}) + if(jobs_number LESS l_cores) + set(jobs_number ${l_cores}) + endif() + string(COMPARE EQUAL "${jobs_number}" "0" is_zero) if(is_zero) - hunter_status_debug("Number of logical cores is 0 - forcing 1") + hunter_status_debug("Force jobs number: 1") set(jobs_number "1") - else() - hunter_status_debug("Number of logical cores: ${jobs_number}") endif() - else() - set(jobs_number "${HUNTER_JOBS_NUMBER}") + + hunter_status_debug("Number of jobs: ${jobs_number}") endif() string(COMPARE NOTEQUAL "${XCODE_VERSION}" "" is_xcode) string(COMPARE EQUAL "${CMAKE_GENERATOR}" "MSYS Makefiles" is_msys) string(COMPARE EQUAL "${CMAKE_GENERATOR}" "Unix Makefiles" is_makefiles) + string(COMPARE EQUAL "${CMAKE_GENERATOR}" "Ninja" is_ninja) if(MSVC_IDE AND (MSVC_VERSION VERSION_LESS 1800)) # No /maxcpucount:N support set(jobs_number "") endif() - if(MINGW OR is_msys OR is_xcode OR is_makefiles OR MSVC_IDE) + if(MINGW OR is_msys OR is_xcode OR is_makefiles OR MSVC_IDE OR is_ninja) set("${jobs_options_varname}" "${jobs_number}" PARENT_SCOPE) return() endif() diff --git a/cmake/modules/hunter_libsodium_install_tools.cmake b/cmake/modules/hunter_libsodium_install_tools.cmake index 44c6b2d11..73c795554 100644 --- a/cmake/modules/hunter_libsodium_install_tools.cmake +++ b/cmake/modules/hunter_libsodium_install_tools.cmake @@ -1,11 +1,11 @@ include(CMakePackageConfigHelpers) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_install_libsodium_config) - hunter_test_string_not_empty("${HUNTER_libsodium_VERSION}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_INSTALL_PREFIX}") - hunter_test_string_not_empty("${HUNTER_SELF}") + hunter_assert_not_empty_string("${HUNTER_libsodium_VERSION}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_SELF}") set(templates "${HUNTER_SELF}/cmake/templates") set(configs "${HUNTER_PACKAGE_INSTALL_PREFIX}/lib/cmake/libsodium") @@ -27,10 +27,10 @@ endfunction() function(hunter_install_libsodium_targets) - hunter_test_string_not_empty("${HUNTER_PACKAGE_INSTALL_PREFIX}") - hunter_test_string_not_empty("${HUNTER_SELF}") - hunter_test_string_not_empty("${TARGET_CONFIGURATION}") - hunter_test_string_not_empty("${TARGET_LIB_FILE}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_SELF}") + hunter_assert_not_empty_string("${TARGET_CONFIGURATION}") + hunter_assert_not_empty_string("${TARGET_LIB_FILE}") set(templates "${HUNTER_SELF}/cmake/templates") set(configs "${HUNTER_PACKAGE_INSTALL_PREFIX}/lib/cmake/libsodium") diff --git a/cmake/modules/hunter_load_from_cache.cmake b/cmake/modules/hunter_load_from_cache.cmake index c35cfca39..70893c4e6 100644 --- a/cmake/modules/hunter_load_from_cache.cmake +++ b/cmake/modules/hunter_load_from_cache.cmake @@ -10,7 +10,7 @@ include(hunter_download_cache_raw_file) include(hunter_internal_error) include(hunter_patch_unrelocatable_text_files) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_unpack_directory) # Try to load package from cache @@ -21,14 +21,14 @@ include(hunter_unpack_directory) # 3. Toolchain-ID directory already locked # 4. Cache directory is not locked function(hunter_load_from_cache) - hunter_test_string_not_empty("${HUNTER_CACHED_ROOT}") - hunter_test_string_not_empty("${HUNTER_INSTALL_PREFIX}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_DONE_STAMP}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_HOME_DIR}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_NAME}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_SHA1}") + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_DONE_STAMP}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_HOME_DIR}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_NAME}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_SHA1}") - hunter_test_string_not_empty("${CMAKE_BINARY_DIR}") + hunter_assert_not_empty_string("${CMAKE_BINARY_DIR}") set(human_readable "${HUNTER_PACKAGE_NAME}") string(COMPARE NOTEQUAL "${HUNTER_PACKAGE_COMPONENT}" "" has_component) @@ -175,6 +175,8 @@ function(hunter_load_from_cache) return() endif() + set(HUNTER_SKIP_SCHEME_UNPACK TRUE) + # Install dependencies file(STRINGS "${basic_deps_info}" basic_deps_list) foreach(dependency_string ${basic_deps_list}) @@ -203,10 +205,7 @@ function(hunter_load_from_cache) FROMSERVER "${from_server_file}" ) - if(NOT EXISTS "${archive_file}") - hunter_internal_error("archive file not found: ${archive_file}") - endif() - hunter_unpack_directory("${archive_file}" "${HUNTER_INSTALL_PREFIX}") + hunter_unpack_directory(${cache_sha1}) hunter_patch_unrelocatable_text_files( FROM "__HUNTER_PACKAGE_INSTALL_PREFIX__" diff --git a/cmake/modules/hunter_lock_directory.cmake b/cmake/modules/hunter_lock_directory.cmake index 1e870ff48..30aad849a 100644 --- a/cmake/modules/hunter_lock_directory.cmake +++ b/cmake/modules/hunter_lock_directory.cmake @@ -5,33 +5,25 @@ cmake_minimum_required(VERSION 3.0) include(hunter_fatal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) macro(hunter_lock_directory dir already_locked_varname) - hunter_test_string_not_empty("${dir}") + hunter_assert_not_empty_string("${dir}") - if(NOT HUNTER_SKIP_LOCK) - if("${CMAKE_VERSION}" VERSION_LESS "3.2") - hunter_fatal_error( - "Can't lock, upgrade to CMake 3.2 or use HUNTER_SKIP_LOCK" - WIKI "error.can.not.lock" - ) - endif() - set(_hunter_already_locked FALSE) - foreach(_hunter_locked_dir ${${already_locked_varname}}) - hunter_status_debug("Already locked: ${_hunter_locked_dir}") - string(COMPARE EQUAL "${_hunter_locked_dir}" "${dir}" _is_locked) - if(_is_locked) - set(_hunter_already_locked TRUE) - endif() - endforeach() - if(_hunter_already_locked) - hunter_status_debug("Skip locking for: ${dir}") - else() - hunter_status_debug("Locking directory: ${dir}") - file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) - hunter_status_debug("Lock done") - list(APPEND ${already_locked_varname} "${dir}") + set(_hunter_already_locked FALSE) + foreach(_hunter_locked_dir ${${already_locked_varname}}) + hunter_status_debug("Already locked: ${_hunter_locked_dir}") + string(COMPARE EQUAL "${_hunter_locked_dir}" "${dir}" _is_locked) + if(_is_locked) + set(_hunter_already_locked TRUE) endif() + endforeach() + if(_hunter_already_locked) + hunter_status_debug("Skip locking for: ${dir}") + else() + hunter_status_debug("Locking directory: ${dir}") + file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) + hunter_status_debug("Lock done") + list(APPEND ${already_locked_varname} "${dir}") endif() endmacro() diff --git a/cmake/modules/hunter_make_directory.cmake b/cmake/modules/hunter_make_directory.cmake index c3e742b85..663f16377 100644 --- a/cmake/modules/hunter_make_directory.cmake +++ b/cmake/modules/hunter_make_directory.cmake @@ -5,12 +5,12 @@ cmake_minimum_required(VERSION 3.0) include(hunter_internal_error) include(hunter_lock_directory) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_make_directory parent sha1 result) - hunter_test_string_not_empty("${parent}") - hunter_test_string_not_empty("${sha1}") - hunter_test_string_not_empty("${result}") + hunter_assert_not_empty_string("${parent}") + hunter_assert_not_empty_string("${sha1}") + hunter_assert_not_empty_string("${result}") string(SUBSTRING "${sha1}" 0 7 dir_id) diff --git a/cmake/modules/hunter_pack_directory.cmake b/cmake/modules/hunter_pack_directory.cmake index 258ffa69e..96da4ad52 100644 --- a/cmake/modules/hunter_pack_directory.cmake +++ b/cmake/modules/hunter_pack_directory.cmake @@ -5,13 +5,14 @@ include(hunter_internal_error) include(hunter_print_cmd) include(hunter_status_debug) include(hunter_status_print) +include(hunter_assert_not_empty_string) function(hunter_pack_directory dir_to_pack dest_dir result_sha1) file(MAKE_DIRECTORY "${dest_dir}") set(temp "${dest_dir}/cache.tar.bz2") set(cmd "${CMAKE_COMMAND}" "-E" "tar") - if(HUNTER_STATUS_DEBUG) + if(HUNTER_STATUS_DEBUG AND NOT HUNTER_SUPPRESS_LIST_OF_FILES) list(APPEND cmd "cvjf") else() list(APPEND cmd "cjf") @@ -36,30 +37,34 @@ function(hunter_pack_directory dir_to_pack dest_dir result_sha1) list(APPEND cmd "${x}") endforeach() - if(HUNTER_STATUS_DEBUG) - set(logging_params "") - elseif(HUNTER_STATUS_PRINT) - set(logging_params "") - else() - set(logging_params "OUTPUT_QUIET") - endif() - hunter_print_cmd("${dir_to_pack}" "${cmd}") execute_process( COMMAND ${cmd} WORKING_DIRECTORY "${dir_to_pack}" RESULT_VARIABLE packing_result - ${logging_params} + OUTPUT_VARIABLE packing_output + ERROR_VARIABLE packing_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE ) if(packing_result EQUAL 0) hunter_status_debug("Packing successful: ${temp}") else() - hunter_internal_error("Packing failed") + hunter_internal_error( + "Packing failed (${packing_result}, ${packing_output}, ${packing_error})" + ) + endif() + + if(NOT EXISTS "${temp}") + hunter_internal_error("File not found: '${temp}'") endif() file(SHA1 "${temp}" archive_sha1) + + hunter_assert_not_empty_string("${archive_sha1}") + set(dest_archive "${dest_dir}/${archive_sha1}.tar.bz2") file(RENAME "${temp}" "${dest_archive}") diff --git a/cmake/modules/hunter_patch_unrelocatable_text_files.cmake b/cmake/modules/hunter_patch_unrelocatable_text_files.cmake index 84e853487..024382664 100644 --- a/cmake/modules/hunter_patch_unrelocatable_text_files.cmake +++ b/cmake/modules/hunter_patch_unrelocatable_text_files.cmake @@ -5,7 +5,7 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_user_error) function(hunter_patch_unrelocatable_text_files) @@ -21,9 +21,9 @@ function(hunter_patch_unrelocatable_text_files) hunter_internal_error("Unparsed: ${hunter_UNPARSED_ARGUMENTS}") endif() - hunter_test_string_not_empty("${x_FROM}") - hunter_test_string_not_empty("${x_TO}") - hunter_test_string_not_empty("${x_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${x_FROM}") + hunter_assert_not_empty_string("${x_TO}") + hunter_assert_not_empty_string("${x_INSTALL_PREFIX}") foreach(text_file ${HUNTER_PACKAGE_UNRELOCATABLE_TEXT_FILES}) set(text_full_path "${x_INSTALL_PREFIX}/${text_file}") @@ -42,6 +42,11 @@ function(hunter_patch_unrelocatable_text_files) string(REPLACE "${x_FROM}" "${x_TO}" line "${line}") set(output_content "${output_content}\n${line}") endforeach() + + # if file is a link we should remove it first, otherwise we will + # update original file too + file(REMOVE "${text_full_path}") + file(WRITE "${text_full_path}" "${output_content}\n") endforeach() endfunction() diff --git a/cmake/modules/hunter_pick_scheme.cmake b/cmake/modules/hunter_pick_scheme.cmake index 84ad65eee..9748c8aec 100644 --- a/cmake/modules/hunter_pick_scheme.cmake +++ b/cmake/modules/hunter_pick_scheme.cmake @@ -4,7 +4,7 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_internal_error) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) # Set variable: # * HUNTER_DOWNLOAD_SCHEME @@ -13,7 +13,7 @@ include(hunter_test_string_not_empty) # * HUNTER_PACKAGE_SCHEME_UNPACK # * HUNTER_PACKAGE_SCHEME_INSTALL function(hunter_pick_scheme) - hunter_test_string_not_empty("${CMAKE_GENERATOR}") + hunter_assert_not_empty_string("${CMAKE_GENERATOR}") # parse args set(one DEFAULT IPHONEOS WINDOWS) @@ -66,11 +66,19 @@ function(hunter_pick_scheme) is_unpack_install ) + string( + COMPARE + EQUAL + "${HUNTER_DOWNLOAD_SCHEME}" + "url_sha1_unpack_bin_install" + is_unpack_bin_install + ) + if(is_unpack) set(HUNTER_PACKAGE_SCHEME_UNPACK "1") elseif(is_download) set(HUNTER_PACKAGE_SCHEME_DOWNLOAD "1") - elseif(is_unpack_install) + elseif(is_unpack_install OR is_unpack_bin_install) set(HUNTER_PACKAGE_SCHEME_UNPACK_INSTALL "1") else() set(HUNTER_PACKAGE_SCHEME_INSTALL "1") diff --git a/cmake/modules/hunter_qt_add_module.cmake b/cmake/modules/hunter_qt_add_module.cmake index 1bcdd1366..50e4c8354 100644 --- a/cmake/modules/hunter_qt_add_module.cmake +++ b/cmake/modules/hunter_qt_add_module.cmake @@ -24,15 +24,19 @@ function(hunter_qt_add_module) return() endif() - set(dep_list "${x_COMPONENTS}") + set(dep_list "") - foreach(dep ${dep_list}) + # "Base" components should be build first so adding dependencies of + # dependencies for the start. + foreach(dep ${x_COMPONENTS}) list(APPEND dep_list ${component_${dep}_depends_on}) endforeach() + # Now we can proceed with explicit dependencies + list(APPEND dep_list "${x_COMPONENTS}") + list(REMOVE_ITEM dep_list "") # remove empty elements list(REMOVE_DUPLICATES dep_list) - list(SORT dep_list) set(component_${x_NAME}_depends_on "${dep_list}" PARENT_SCOPE) endfunction() diff --git a/cmake/modules/hunter_register_dependency.cmake b/cmake/modules/hunter_register_dependency.cmake index d28584e7a..08939192b 100644 --- a/cmake/modules/hunter_register_dependency.cmake +++ b/cmake/modules/hunter_register_dependency.cmake @@ -5,7 +5,7 @@ include(CMakeParseArguments) # cmake_parse_arguments include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_register_dependency) set(one DEPENDS_ON_PACKAGE DEPENDS_ON_COMPONENT) @@ -50,11 +50,11 @@ function(hunter_register_dependency) hunter_internal_error("Incorrect PACKAGE: ${hunter_PACKAGE}") endif() - hunter_test_string_not_empty("${hunter_PACKAGE_NAME}") - hunter_test_string_not_empty("${HUNTER_TOOLCHAIN_ID_PATH}") + hunter_assert_not_empty_string("${hunter_PACKAGE_NAME}") + hunter_assert_not_empty_string("${HUNTER_CONFIG_ID_PATH}") set( dependencies_dir - "${HUNTER_TOOLCHAIN_ID_PATH}/Build/${hunter_PACKAGE_NAME}" + "${HUNTER_CONFIG_ID_PATH}/Build/${hunter_PACKAGE_NAME}" ) if(has_package_component) set( diff --git a/cmake/modules/hunter_report_broken_package.cmake b/cmake/modules/hunter_report_broken_package.cmake index 410e6c234..649e528a9 100644 --- a/cmake/modules/hunter_report_broken_package.cmake +++ b/cmake/modules/hunter_report_broken_package.cmake @@ -11,5 +11,5 @@ function(hunter_report_broken_package) foreach(x ${ARGV}) set(msg "${msg} ${x}") endforeach() - hunter_fatal_error("Broken package: ${msg}" WIKI "error.broken.package") + hunter_fatal_error("Broken package: ${msg}" ERROR_PAGE "error.broken.package") endfunction() diff --git a/cmake/modules/hunter_save_to_cache.cmake b/cmake/modules/hunter_save_to_cache.cmake index 556418d76..7f1ba1bc9 100644 --- a/cmake/modules/hunter_save_to_cache.cmake +++ b/cmake/modules/hunter_save_to_cache.cmake @@ -9,7 +9,7 @@ include(hunter_make_directory) include(hunter_pack_directory) include(hunter_patch_unrelocatable_text_files) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_unpack_directory) # Save results of install @@ -20,11 +20,11 @@ include(hunter_unpack_directory) # 4. Unpack archive from Cache to HUNTER_INSTALL_PREFIX # 5. Save cache.sha1 file function(hunter_save_to_cache) - hunter_test_string_not_empty("${HUNTER_CACHED_ROOT}") - hunter_test_string_not_empty("${HUNTER_INSTALL_PREFIX}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_HOME_DIR}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_INSTALL_PREFIX}") - hunter_test_string_not_empty("${HUNTER_PACKAGE_NAME}") + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_HOME_DIR}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_NAME}") string(COMPARE NOTEQUAL "${HUNTER_PACKAGE_COMPONENT}" "" has_component) string( @@ -97,14 +97,10 @@ function(hunter_save_to_cache) archive_sha1 ) - hunter_test_string_not_empty("${archive_sha1}") - set(archive_file "${cache_directory}/raw/${archive_sha1}.tar.bz2") - if(NOT EXISTS "${archive_file}") - hunter_internal_error("Archive not exists: ${archive_file}") - endif() + hunter_assert_not_empty_string("${archive_sha1}") ### Install to global directory from cache archive - hunter_unpack_directory("${archive_file}" "${HUNTER_INSTALL_PREFIX}") + hunter_unpack_directory(${archive_sha1}) hunter_patch_unrelocatable_text_files( FROM "__HUNTER_PACKAGE_INSTALL_PREFIX__" @@ -114,12 +110,25 @@ function(hunter_save_to_cache) ### Save cache meta-data hunter_create_cache_meta_directory("${cache_directory}" cache_meta_dir) - hunter_test_string_not_empty("${cache_meta_dir}") + hunter_assert_not_empty_string("${cache_meta_dir}") ### create cache.sha1 file in home (before saving dependencies) hunter_status_debug("Saving cache file: ${cache_file}") + hunter_status_debug("With SHA1: ${archive_sha1}") file(WRITE "${cache_file}" "${archive_sha1}") + # Sanity check + file(READ "${cache_file}" archive_sha1_check) + + string(COMPARE EQUAL "${archive_sha1}" "${archive_sha1_check}" is_ok) + if(NOT is_ok) + hunter_internal_error( + "Sanity check failed (${cache_file}):" + " * '${archive_sha1}'" + " * '${archive_sha1_check}'" + ) + endif() + # Get dependencies (non-recursively) if(has_component) hunter_get_package_deps( @@ -135,9 +144,10 @@ function(hunter_save_to_cache) endif() set(basic_deps_info "${cache_meta_dir}/basic-deps.info") set(basic_deps_done "${cache_meta_dir}/basic-deps.DONE") - set(basic_deps_info_temp "${cache_meta_dir}/basic-deps.info-TEMP") + set(basic_deps_info_nolf "${cache_meta_dir}/basic-deps.info.NOLF") + set(basic_deps_info_temp "${cache_meta_dir}/basic-deps.info.TEMP") - file(WRITE "${basic_deps_info_temp}" "") + file(WRITE "${basic_deps_info_nolf}" "") list(LENGTH basic_dependencies len) if(len EQUAL 0) hunter_status_debug("No basic dependencies for package: ${human_readable}") @@ -145,10 +155,19 @@ function(hunter_save_to_cache) hunter_status_debug("Basic dependencies for package: ${human_readable}") foreach(x ${basic_dependencies}) hunter_status_debug(" ${x}") - file(APPEND "${basic_deps_info_temp}" "${x}\n") + file(APPEND "${basic_deps_info_nolf}" "${x}\n") endforeach() endif() + # About '@ONLY': no substitutions expected but COPYONLY can't be + # used with NEWLINE_STYLE + configure_file( + "${basic_deps_info_nolf}" + "${basic_deps_info_temp}" + @ONLY + NEWLINE_STYLE LF + ) + if(EXISTS "${basic_deps_info}") if(NOT EXISTS "${basic_deps_done}") hunter_internal_error("File not found: ${basic_deps_done}") @@ -204,4 +223,16 @@ function(hunter_save_to_cache) file(WRITE "${cache_meta_dir}/cache.sha1" "${archive_sha1}") file(WRITE "${cache_meta_dir}/CACHE.DONE" "") + + # Sanity check + file(READ "${cache_meta_dir}/cache.sha1" archive_sha1_check) + + string(COMPARE EQUAL "${archive_sha1}" "${archive_sha1_check}" is_ok) + if(NOT is_ok) + hunter_internal_error( + "Sanity check failed (${cache_meta_dir}):" + " * '${archive_sha1}'" + " * '${archive_sha1_check}'" + ) + endif() endfunction() diff --git a/cmake/modules/hunter_set_config_location.cmake b/cmake/modules/hunter_set_config_location.cmake index 57c95ecc2..c0555bd72 100644 --- a/cmake/modules/hunter_set_config_location.cmake +++ b/cmake/modules/hunter_set_config_location.cmake @@ -5,12 +5,12 @@ cmake_minimum_required(VERSION 3.0) include(hunter_internal_error) include(hunter_status_print) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_user_error) function(hunter_set_config_location hunter_self result) - hunter_test_string_not_empty("${hunter_self}") - hunter_test_string_not_empty("${result}") + hunter_assert_not_empty_string("${hunter_self}") + hunter_assert_not_empty_string("${result}") if(HUNTER_GATE_GLOBAL) set( diff --git a/cmake/modules/hunter_setup_msvc.cmake b/cmake/modules/hunter_setup_msvc.cmake index 55ee842c7..78b498e7a 100644 --- a/cmake/modules/hunter_setup_msvc.cmake +++ b/cmake/modules/hunter_setup_msvc.cmake @@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.0) +include(hunter_fatal_error) include(hunter_internal_error) include(hunter_status_debug) @@ -41,6 +42,8 @@ macro(hunter_setup_msvc) string(COMPARE EQUAL "${MSVC_VERSION}" "1700" _vs_11_2012) string(COMPARE EQUAL "${MSVC_VERSION}" "1800" _vs_12_2013) string(COMPARE EQUAL "${MSVC_VERSION}" "1900" _vs_14_2015) + string(REGEX MATCH "^191[0-9]$" _vs_15_2017 "${MSVC_VERSION}") + string(REGEX MATCH "^192[0-9]$" _vs_16_2019 "${MSVC_VERSION}") if(_vs_8_2005) set(HUNTER_MSVC_VERSION "8") @@ -60,6 +63,12 @@ macro(hunter_setup_msvc) elseif(_vs_14_2015) set(HUNTER_MSVC_VERSION "14") set(HUNTER_MSVC_YEAR "2015") + elseif(_vs_15_2017) + set(HUNTER_MSVC_VERSION "15") + set(HUNTER_MSVC_YEAR "2017") + elseif(_vs_16_2019) + set(HUNTER_MSVC_VERSION "16") + set(HUNTER_MSVC_YEAR "2019") else() hunter_internal_error("Unexpected MSVC_VERSION: '${MSVC_VERSION}'") endif() @@ -100,18 +109,61 @@ macro(hunter_setup_msvc) set(_hunter_vcvarsall_env "VS${_hunter_vcvarsall_env}COMNTOOLS") set(_hunter_vcvarsall_path "$ENV{${_hunter_vcvarsall_env}}") + hunter_status_debug( + "Environment '${_hunter_vcvarsall_env}': '${_hunter_vcvarsall_path}'" + ) + hunter_status_debug( + "CMAKE_VS_DEVENV_COMMAND: '${CMAKE_VS_DEVENV_COMMAND}'" + ) + hunter_status_debug( + "CMAKE_VS_MSBUILD_COMMAND: '${CMAKE_VS_MSBUILD_COMMAND}'" + ) + string(COMPARE EQUAL "${_hunter_vcvarsall_path}" "" _is_empty) if(_is_empty) if(HUNTER_TESTING) # ignore error, see 'tests/hunter_setup_msvc/CMakeLists.txt' else() - hunter_internal_error( - "Environment variable ${_hunter_vcvarsall_env} is empty" + hunter_status_debug( + "Environment variable '${_hunter_vcvarsall_env}' is empty," + " analyzing CMAKE_VS_DEVENV_COMMAND and CMAKE_VS_MSBUILD_COMMAND" ) + string(COMPARE EQUAL "${CMAKE_VS_DEVENV_COMMAND}" "" is_devenv_empty) + string(COMPARE EQUAL "${CMAKE_VS_MSBUILD_COMMAND}" "" is_msbuild_empty) + if(NOT is_devenv_empty AND IS_ABSOLUTE "${CMAKE_VS_DEVENV_COMMAND}") + get_filename_component(_hunter_vcvarsall_path + "${CMAKE_VS_DEVENV_COMMAND}" DIRECTORY + ) + set(_hunter_vcvarsall_path + "${_hunter_vcvarsall_path}/../../VC/Auxiliary/Build" + ) + elseif(NOT is_msbuild_empty AND IS_ABSOLUTE "${CMAKE_VS_MSBUILD_COMMAND}") + get_filename_component(_hunter_vcvarsall_path + "${CMAKE_VS_MSBUILD_COMMAND}" DIRECTORY + ) + set(_hunter_vcvarsall_path + "${_hunter_vcvarsall_path}/../../../VC/Auxiliary/Build" + ) + else() + hunter_fatal_error( + "Incorrect MSVC setup:" + " At least one of the following should be an absolute path" + " CMAKE_VS_DEVENV_COMMAND:(${CMAKE_VS_DEVENV_COMMAND})" + " CMAKE_VS_MSBUILD_COMMAND:(${CMAKE_VS_MSBUILD_COMMAND})" + ERROR_PAGE + error.vs.devenv + ) + endif() + endif() + else() + set(_hunter_vcvarsall_path "${_hunter_vcvarsall_path}/../../VC") + if(NOT HUNTER_MSVC_VERSION VERSION_LESS "15") + # Visual Studio 15 2017+ + # * https://github.com/ruslo/hunter/issues/836#issue-236352343 + set(_hunter_vcvarsall_path "${_hunter_vcvarsall_path}/Auxiliary/Build") endif() endif() - set(_hunter_vcvarsall_path "${_hunter_vcvarsall_path}/../../VC") get_filename_component( _hunter_vcvarsall_path "${_hunter_vcvarsall_path}" ABSOLUTE ) diff --git a/cmake/modules/hunter_sleep_before_download.cmake b/cmake/modules/hunter_sleep_before_download.cmake index 7449ceaa3..348520fb1 100644 --- a/cmake/modules/hunter_sleep_before_download.cmake +++ b/cmake/modules/hunter_sleep_before_download.cmake @@ -3,10 +3,10 @@ include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) function(hunter_sleep_before_download attempt) - hunter_test_string_not_empty("${attempt}") + hunter_assert_not_empty_string("${attempt}") if(attempt EQUAL 0) return() diff --git a/cmake/modules/hunter_test_string_not_empty.cmake b/cmake/modules/hunter_test_string_not_empty.cmake deleted file mode 100644 index 085564413..000000000 --- a/cmake/modules/hunter_test_string_not_empty.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2013, Ruslan Baratov -# All rights reserved. - -include(hunter_internal_error) - -function(hunter_test_string_not_empty test_string) - string(COMPARE EQUAL "${test_string}" "" is_empty) - if(is_empty) - hunter_internal_error("Unexpected empty string") - endif() -endfunction() diff --git a/cmake/modules/hunter_unpack_directory.cmake b/cmake/modules/hunter_unpack_directory.cmake index c49af2fd8..6ef29d870 100644 --- a/cmake/modules/hunter_unpack_directory.cmake +++ b/cmake/modules/hunter_unpack_directory.cmake @@ -1,45 +1,155 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. include(hunter_internal_error) include(hunter_print_cmd) include(hunter_status_debug) +include(hunter_assert_not_empty_string) -function(hunter_unpack_directory archive dest_dir) - file(MAKE_DIRECTORY "${dest_dir}") +function(hunter_unpack_directory cache_sha1) + hunter_assert_not_empty_string("${HUNTER_SELF}") + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${cache_sha1}") - set(cmd "${CMAKE_COMMAND}" "-E" "tar") - if(HUNTER_STATUS_DEBUG) - list(APPEND cmd "xvf") - else() - list(APPEND cmd "xf") + set(cache_directory "${HUNTER_CACHED_ROOT}/_Base/Cache") + set(cellar_directory "${HUNTER_CACHED_ROOT}/_Base/Cellar") + + hunter_make_directory( + "${cellar_directory}/${cache_sha1}" + "${cache_sha1}" + cellar_directory + ) + + set(unpack_stamp "${cellar_directory}/unpack.DONE") + set(cellar_raw_directory "${cellar_directory}/raw") + file(MAKE_DIRECTORY "${cellar_raw_directory}") + + set(list_of_directories "${cellar_directory}/directories.list") + set(list_of_files "${cellar_directory}/files.list") + set(shell_link_script "${cellar_directory}/link-all.sh") + + set(archive_file "${cache_directory}/raw/${cache_sha1}.tar.bz2") + if(NOT EXISTS "${archive_file}") + hunter_internal_error("archive file not found: ${archive_file}") endif() - list(APPEND cmd "${archive}") - if(HUNTER_STATUS_DEBUG) - set(logging_params "") - elseif(HUNTER_STATUS_PRINT) - set(logging_params "") - else() - set(logging_params "OUTPUT_QUIET") + if(NOT EXISTS "${unpack_stamp}") + hunter_lock_directory("${cellar_directory}" "") + endif() + + # While waiting for lock other instance can do all the job + if(NOT EXISTS "${unpack_stamp}") + set(cmd "${CMAKE_COMMAND}" "-E" "tar") + if(HUNTER_STATUS_DEBUG AND NOT HUNTER_SUPPRESS_LIST_OF_FILES) + list(APPEND cmd "xvf") + else() + list(APPEND cmd "xf") + endif() + list(APPEND cmd "${archive_file}") + + if(HUNTER_STATUS_DEBUG) + set(logging_params "") + elseif(HUNTER_STATUS_PRINT) + set(logging_params "") + else() + set(logging_params "OUTPUT_QUIET") + endif() + + hunter_status_debug("Unpacking to cellar:") + hunter_status_debug(" ${archive_file}") + hunter_status_debug(" -> ${cellar_raw_directory}") + + hunter_print_cmd("${cellar_raw_directory}" "${cmd}") + + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${cellar_raw_directory}" + RESULT_VARIABLE unpacking_result + ${logging_params} + ) + + if(unpacking_result EQUAL 0) + hunter_status_debug("Unpacked successfully") + else() + hunter_internal_error("Unpack failed") + endif() + + hunter_status_debug("Creating list of files and directories") + # Note: LIST_DIRECTORIES available only since CMake 3.3 + file( + GLOB_RECURSE + files + RELATIVE "${cellar_raw_directory}" + "${cellar_raw_directory}/*" + ) + + set(directories "") + foreach(x ${files}) + get_filename_component(file_dir "${x}" DIRECTORY) + list(APPEND directories "${file_dir}") + endforeach() + list(REMOVE_DUPLICATES directories) + + # Create link script { + file( + WRITE + "${shell_link_script}" + "export \"HUNTER_CELLAR_RAW_DIRECTORY=${cellar_raw_directory}\"\n\n" + ) + foreach(x ${files}) + file( + APPEND + "${shell_link_script}" + "ln -f \\\n \"\${HUNTER_CELLAR_RAW_DIRECTORY}/${x}\" \\\n \"\$1/${x}\"\n\n" + ) + endforeach() + # } + + string(REPLACE ";" "\n" files "${files}") + string(REPLACE ";" "\n" directories "${directories}") + + file(WRITE "${list_of_files}" "${files}\n") + file(WRITE "${list_of_directories}" "${directories}\n") + + file(WRITE "${unpack_stamp}" "") endif() - hunter_status_debug("Unpacking:") - hunter_status_debug(" ${archive}") - hunter_status_debug(" -> ${dest_dir}") + hunter_status_debug("Creating directories") + file(STRINGS "${list_of_directories}" directories) + foreach(x ${directories}) + file(MAKE_DIRECTORY "${HUNTER_INSTALL_PREFIX}/${x}") + endforeach() - hunter_print_cmd("${dest_dir}" "${cmd}") + hunter_status_debug("Removing old files") + file(STRINGS "${list_of_files}" files) + foreach(x ${files}) + file(REMOVE "${HUNTER_INSTALL_PREFIX}/${x}") + endforeach() + hunter_status_debug("Linking files") + set( + cmd + "${CMAKE_COMMAND}" + "-DHUNTER_INSTALL_PREFIX=${HUNTER_INSTALL_PREFIX}" + "-DLIST_OF_FILES=${list_of_files}" + "-DSHELL_LINK_SCRIPT=${shell_link_script}" + "-DCELLAR_RAW_DIRECTORY=${cellar_raw_directory}" + "-DPYTHON_LINK_SCRIPT=${HUNTER_SELF}/scripts/link-all.py" + "-P" + "${HUNTER_SELF}/scripts/link-all.cmake" + ) + hunter_print_cmd("${cellar_directory}" "${cmd}") execute_process( COMMAND ${cmd} - WORKING_DIRECTORY "${dest_dir}" - RESULT_VARIABLE unpacking_result - ${logging_params} + WORKING_DIRECTORY "${cellar_directory}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error ) - - if(unpacking_result EQUAL 0) - hunter_status_debug("Unpacked successfully") + if(result EQUAL 0) + hunter_status_debug("Linking done: ${output}, ${error}") else() - hunter_internal_error("Unpack failed") + hunter_internal_error("Link script failed: ${result}, ${output}, ${error}") endif() endfunction() diff --git a/cmake/modules/hunter_user_error.cmake b/cmake/modules/hunter_user_error.cmake index 8f89645b5..77d6a952a 100644 --- a/cmake/modules/hunter_user_error.cmake +++ b/cmake/modules/hunter_user_error.cmake @@ -4,5 +4,5 @@ include(hunter_fatal_error) function(hunter_user_error) - hunter_fatal_error(${ARGV} WIKI "error.incorrect.input.data") + hunter_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data") endfunction() diff --git a/cmake/modules/hunter_wiki.cmake b/cmake/modules/hunter_wiki.cmake deleted file mode 100644 index 24843ab23..000000000 --- a/cmake/modules/hunter_wiki.cmake +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2014-2015, Ruslan Baratov -# All rights reserved. - -# Do not move to master - build schemes use this module but they not use master -set(HUNTER_WIKI "https://github.com/ruslo/hunter/wiki") - -function(hunter_wiki wiki_page) - message("------------------------------ WIKI -------------------------------") - message(" ${HUNTER_WIKI}/${wiki_page}") - message("-------------------------------------------------------------------") - message("") - message(FATAL_ERROR "") -endfunction() diff --git a/cmake/projects/Android-Apk/hunter.cmake b/cmake/projects/Android-Apk/hunter.cmake index 2925afd33..5a5bfb6f7 100644 --- a/cmake/projects/Android-Apk/hunter.cmake +++ b/cmake/projects/Android-Apk/hunter.cmake @@ -7,6 +7,72 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + Android-Apk + VERSION + "1.1.13" + URL + "https://github.com/hunter-packages/android-apk/archive/v1.1.13.tar.gz" + SHA1 + cd1b0b410fdf0b1bb79c718f61b21c2f48b703f8 +) + +hunter_add_version( + PACKAGE_NAME + Android-Apk + VERSION + "1.1.12" + URL + "https://github.com/hunter-packages/android-apk/archive/v1.1.12.tar.gz" + SHA1 + 64b903c567506c530a3443bfdbd92576ccdc7c2a +) + +hunter_add_version( + PACKAGE_NAME + Android-Apk + VERSION + "1.1.11" + URL + "https://github.com/hunter-packages/android-apk/archive/v1.1.11.tar.gz" + SHA1 + d152a1a23b2852b61023538f8d3dc93a745cf654 +) + +hunter_add_version( + PACKAGE_NAME + Android-Apk + VERSION + "1.1.10" + URL + "https://github.com/hunter-packages/android-apk/archive/v1.1.10.tar.gz" + SHA1 + 955b827e19db021e8318d51b47f07fa651fe5974 +) + +hunter_add_version( + PACKAGE_NAME + Android-Apk + VERSION + "1.1.9" + URL + "https://github.com/hunter-packages/android-apk/archive/v1.1.9.tar.gz" + SHA1 + fdc1eedf86fbe1e4a43655f0c98f3a5228b8b9e6 +) + +hunter_add_version( + PACKAGE_NAME + Android-Apk + VERSION + "1.1.8" + URL + "https://github.com/hunter-packages/android-apk/archive/v1.1.8.tar.gz" + SHA1 + f5dc6d05d73d40fd97fc87a4e1ac9505bf08b6e4 +) + hunter_add_version( PACKAGE_NAME Android-Apk @@ -106,5 +172,16 @@ hunter_add_version( f3ef23bdbacdc4881b2aaeadf433c87fee28ff04 ) +hunter_add_version( + PACKAGE_NAME + Android-Apk + VERSION + "1.1.14" + URL + "https://github.com/hunter-packages/android-apk/archive/v1.1.14.tar.gz" + SHA1 + cd7c8b2c38cd4545fd069451bfa318160b22cc99 +) + hunter_pick_scheme(DEFAULT url_sha1_unpack) hunter_download(PACKAGE_NAME Android-Apk) diff --git a/cmake/projects/Android-Build-Tools/hunter.cmake b/cmake/projects/Android-Build-Tools/hunter.cmake index 755a808c2..4eebf0769 100755 --- a/cmake/projects/Android-Build-Tools/hunter.cmake +++ b/cmake/projects/Android-Build-Tools/hunter.cmake @@ -7,7 +7,20 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +# https://dl.google.com/android/repository/repository-11.xml + if(CMAKE_HOST_APPLE) + hunter_add_version( + PACKAGE_NAME + Android-Build-Tools + VERSION + "27.0.3" + URL + "https://dl-ssl.google.com/android/repository/build-tools_r27.0.3-macosx.zip" + SHA1 + 61d9fb18790c68d66ff73bf1e7ad56bc1f1eef2d + ) + hunter_add_version( PACKAGE_NAME Android-Build-Tools @@ -41,6 +54,17 @@ if(CMAKE_HOST_APPLE) d84f5692fb44d60fc53e5b2507cebf9f24626902 ) elseif(CMAKE_HOST_UNIX) + hunter_add_version( + PACKAGE_NAME + Android-Build-Tools + VERSION + "27.0.3" + URL + "https://dl-ssl.google.com/android/repository/build-tools_r27.0.3-linux.zip" + SHA1 + d85e7a6320eddffe7eeace3437605079dac938ca + ) + hunter_add_version( PACKAGE_NAME Android-Build-Tools @@ -74,6 +98,17 @@ elseif(CMAKE_HOST_UNIX) f11618492b0d2270c332325d45d752d3656a9640 ) elseif(CMAKE_HOST_WIN32) + hunter_add_version( + PACKAGE_NAME + Android-Build-Tools + VERSION + "27.0.3" + URL + "https://dl-ssl.google.com/android/repository/build-tools_r27.0.3-windows.zip" + SHA1 + 0df61e11713a2838d2cc9a911219dddf5e6a2749 + ) + hunter_add_version( PACKAGE_NAME Android-Build-Tools diff --git a/cmake/projects/Android-Google-APIs-Intel-x86-Atom-System-Image/hunter.cmake b/cmake/projects/Android-Google-APIs-Intel-x86-Atom-System-Image/hunter.cmake index 1a294e136..42ec815f5 100755 --- a/cmake/projects/Android-Google-APIs-Intel-x86-Atom-System-Image/hunter.cmake +++ b/cmake/projects/Android-Google-APIs-Intel-x86-Atom-System-Image/hunter.cmake @@ -45,5 +45,27 @@ hunter_add_version( b6a979f63c72e88142ea449b906e443f986a12cf ) +hunter_add_version( + PACKAGE_NAME + Android-Google-APIs-Intel-x86-Atom-System-Image + VERSION + "22_r21" + URL + "https://dl.google.com/android/repository/sys-img/google_apis/x86-22_r21.zip" + SHA1 + bef3c76ecb61b7e1a8d483d83a7ca9852f47a7ab +) + +hunter_add_version( + PACKAGE_NAME + Android-Google-APIs-Intel-x86-Atom-System-Image + VERSION + "24_r20" + URL + "https://dl.google.com/android/repository/sys-img/google_apis/x86-24_r20.zip" + SHA1 + c86cadee4e835eef8246bede3269133d06f34571 +) + hunter_pick_scheme(DEFAULT url_sha1_unpack) hunter_download(PACKAGE_NAME Android-Google-APIs-Intel-x86-Atom-System-Image) diff --git a/cmake/projects/Android-Google-APIs/hunter.cmake b/cmake/projects/Android-Google-APIs/hunter.cmake index 9169bcabb..b29d48a78 100755 --- a/cmake/projects/Android-Google-APIs/hunter.cmake +++ b/cmake/projects/Android-Google-APIs/hunter.cmake @@ -56,5 +56,27 @@ hunter_add_version( ee6acf1b01020bfa8a8e24725dbc4478bee5e792 ) +hunter_add_version( + PACKAGE_NAME + Android-Google-APIs + VERSION + "22_r01" + URL + "https://dl.google.com/android/repository/google_apis-22_r01.zip" + SHA1 + 5def0f42160cba8acff51b9c0c7e8be313de84f5 +) + +hunter_add_version( + PACKAGE_NAME + Android-Google-APIs + VERSION + "24_r1" + URL + "https://dl.google.com/android/repository/google_apis-24_r1.zip" + SHA1 + 31361c2868f27343ee917fbd259c1463821b6145 +) + hunter_pick_scheme(DEFAULT url_sha1_unpack) hunter_download(PACKAGE_NAME Android-Google-APIs) diff --git a/cmake/projects/Android-Google-Repository/hunter.cmake b/cmake/projects/Android-Google-Repository/hunter.cmake index 880fc412f..a7c20f0e5 100755 --- a/cmake/projects/Android-Google-Repository/hunter.cmake +++ b/cmake/projects/Android-Google-Repository/hunter.cmake @@ -9,6 +9,28 @@ include(hunter_pick_scheme) # https://dl.google.com/android/repository/addon.xml +hunter_add_version( + PACKAGE_NAME + Android-Google-Repository + VERSION + "58" + URL + "https://dl.google.com/android/repository/google_m2repository_gms_v11_3_rc05_wear_2_0_5.zip" + SHA1 + 05086add9e3a0eb1b67111108d7757a4337c3f10 +) + +hunter_add_version( + PACKAGE_NAME + Android-Google-Repository + VERSION + "47" + URL + "https://dl.google.com/android/repository/android_m2repository_r47.zip" + SHA1 + a0d22beacc106a6977321f2b07d692ce4979e96a +) + hunter_add_version( PACKAGE_NAME Android-Google-Repository diff --git a/cmake/projects/Android-Intel-x86-Atom-System-Image/hunter.cmake b/cmake/projects/Android-Intel-x86-Atom-System-Image/hunter.cmake index 1a0780ab7..8e7902c02 100755 --- a/cmake/projects/Android-Intel-x86-Atom-System-Image/hunter.cmake +++ b/cmake/projects/Android-Intel-x86-Atom-System-Image/hunter.cmake @@ -20,6 +20,17 @@ hunter_add_version( 6c7bb51e41a16099bb1f2a3cc81fdb5aa053fc15 ) +hunter_add_version( + PACKAGE_NAME + Android-Intel-x86-Atom-System-Image + VERSION + "22_r06" + URL + "https://dl.google.com/android/repository/sys-img/android/x86-22_r06.zip" + SHA1 + e33e2a6cc3f1cc56b2019dbef3917d2eeb26f54e +) + hunter_add_version( PACKAGE_NAME Android-Intel-x86-Atom-System-Image @@ -31,6 +42,28 @@ hunter_add_version( a0b510c66769e84fa5e40515531be2d266a4247f ) +hunter_add_version( + PACKAGE_NAME + Android-Intel-x86-Atom-System-Image + VERSION + "21_r04" + URL + "https://dl.google.com/android/repository/sys-img/android/sysimg_x86-21_r04.zip" + SHA1 + 3b78ad294aa1cdefa4be663d4af6c80d920ec49e +) + +hunter_add_version( + PACKAGE_NAME + Android-Intel-x86-Atom-System-Image + VERSION + "21_r05" + URL + "https://dl.google.com/android/repository/sys-img/android/x86-21_r05.zip" + SHA1 + 00f0eb0a1003efe3316347f762e20a85d8749cff +) + hunter_add_version( PACKAGE_NAME Android-Intel-x86-Atom-System-Image @@ -53,5 +86,16 @@ hunter_add_version( 36c2a2e394bcb3290583ce09815eae7711d0b2c2 ) +hunter_add_version( + PACKAGE_NAME + Android-Intel-x86-Atom-System-Image + VERSION + "24_r08" + URL + "https://dl.google.com/android/repository/sys-img/android/x86-24_r08.zip" + SHA1 + c1cae7634b0216c0b5990f2c144eb8ca948e3511 +) + hunter_pick_scheme(DEFAULT url_sha1_unpack) hunter_download(PACKAGE_NAME Android-Intel-x86-Atom-System-Image) diff --git a/cmake/projects/Android-SDK-Platform-tools/hunter.cmake b/cmake/projects/Android-SDK-Platform-tools/hunter.cmake index fa909f552..82774938c 100755 --- a/cmake/projects/Android-SDK-Platform-tools/hunter.cmake +++ b/cmake/projects/Android-SDK-Platform-tools/hunter.cmake @@ -7,7 +7,44 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +# https://dl.google.com/android/repository/repository-10.xml +# https://dl.google.com/android/repository/repository-11.xml +# https://dl.google.com/android/repository/repository-12.xml + if(CMAKE_HOST_APPLE) + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r28.0.0" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r28.0.0-darwin.zip" + SHA1 + 18bd62818aef3ce91dec438121a9a7b836b23c9f + ) + + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r27.0.1" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r27.0.1-darwin.zip" + SHA1 + d7b60f4022ee90e647af0c2ac605f2f99b4164c5 + ) + + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r25.0.5" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r25.0.5-darwin.zip" + SHA1 + 9bbf65f80b05303a3576682d3350b087c4802283 + ) + hunter_add_version( PACKAGE_NAME Android-SDK-Platform-tools @@ -63,6 +100,39 @@ if(CMAKE_HOST_APPLE) 6675f9f583841972c5c5ef8d2c131e1209529fde ) elseif(CMAKE_HOST_UNIX) + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r28.0.0" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r28.0.0-linux.zip" + SHA1 + f944e69bc96ad2984a7e19febb3f3569b216699f + ) + + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r27.0.1" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r27.0.1-linux.zip" + SHA1 + ca04b0a50700ac988a3a5423fcd61904124ce423 + ) + + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r25.0.5" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r25.0.5-linux.zip" + SHA1 + 4c026e2445e8b898cb0fd5dedf710a666a78aaa7 + ) + hunter_add_version( PACKAGE_NAME Android-SDK-Platform-tools @@ -118,6 +188,39 @@ elseif(CMAKE_HOST_UNIX) 2502ade68af9f6288c4dd7726796599e8d9a4337 ) elseif(CMAKE_HOST_WIN32) + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r28.0.0" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r28.0.0-windows.zip" + SHA1 + 64e130b2c3bab7b000db52a39a2e72f648633f47 + ) + + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r27.0.1" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r27.0.1-windows.zip" + SHA1 + 11505582e66ef81730cc5150a7566a3ca5c677b7 + ) + + hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform-tools + VERSION + "r25.0.5" + URL + "http://dl-ssl.google.com/android/repository/platform-tools_r25.0.5-windows.zip" + SHA1 + a59b3747414e3002e826f84470dc1a7ceeb1c6d4 + ) + hunter_add_version( PACKAGE_NAME Android-SDK-Platform-tools diff --git a/cmake/projects/Android-SDK-Platform/hunter.cmake b/cmake/projects/Android-SDK-Platform/hunter.cmake index 63d22cd83..9601c3639 100755 --- a/cmake/projects/Android-SDK-Platform/hunter.cmake +++ b/cmake/projects/Android-SDK-Platform/hunter.cmake @@ -64,5 +64,16 @@ hunter_add_version( 12a5ce6235a76bc30f62c26bda1b680e336abd07 ) +hunter_add_version( + PACKAGE_NAME + Android-SDK-Platform + VERSION + "24_r02" + URL + "http://dl-ssl.google.com/android/repository/platform-24_r02.zip" + SHA1 + 8912da3d4bfe7a9f28f0e5ce92d3a8dc96342aee +) + hunter_pick_scheme(DEFAULT url_sha1_unpack) hunter_download(PACKAGE_NAME Android-SDK-Platform) diff --git a/cmake/projects/Android-SDK-Tools/hunter.cmake b/cmake/projects/Android-SDK-Tools/hunter.cmake index 419d2ed52..213751b39 100755 --- a/cmake/projects/Android-SDK-Tools/hunter.cmake +++ b/cmake/projects/Android-SDK-Tools/hunter.cmake @@ -8,8 +8,20 @@ include(hunter_download) include(hunter_pick_scheme) # http://dl-ssl.google.com/android/repository/repository-10.xml +# http://dl-ssl.google.com/android/repository/repository-11.xml if(CMAKE_HOST_APPLE) + hunter_add_version( + PACKAGE_NAME + Android-SDK-Tools + VERSION + "25.2.5" + URL + "http://dl-ssl.google.com/android/repository/tools_r25.2.5-macosx.zip" + SHA1 + d2168d963ac5b616e3d3ddaf21511d084baf3659 + ) + hunter_add_version( PACKAGE_NAME Android-SDK-Tools @@ -65,6 +77,17 @@ if(CMAKE_HOST_APPLE) a567215d89b3ff80766e54f8f969b3487bce8d71 ) elseif(CMAKE_HOST_UNIX) + hunter_add_version( + PACKAGE_NAME + Android-SDK-Tools + VERSION + "25.2.5" + URL + "http://dl-ssl.google.com/android/repository/tools_r25.2.5-linux.zip" + SHA1 + 72df3aa1988c0a9003ccdfd7a13a7b8bd0f47fc1 + ) + hunter_add_version( PACKAGE_NAME Android-SDK-Tools @@ -120,6 +143,17 @@ elseif(CMAKE_HOST_UNIX) 398c38494d50d98dd9f3ae02899ba32be32c912d ) elseif(CMAKE_HOST_WIN32) + hunter_add_version( + PACKAGE_NAME + Android-SDK-Tools + VERSION + "25.2.5" + URL + "http://dl-ssl.google.com/android/repository/tools_r25.2.5-windows.zip" + SHA1 + a7f7ebeae1c8d8f62d3a8466e9c81baee7cc31ca + ) + hunter_add_version( PACKAGE_NAME Android-SDK-Tools diff --git a/cmake/projects/Android-SDK/hunter.cmake b/cmake/projects/Android-SDK/hunter.cmake index c324061b6..f1e7351f2 100644 --- a/cmake/projects/Android-SDK/hunter.cmake +++ b/cmake/projects/Android-SDK/hunter.cmake @@ -9,6 +9,28 @@ include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + Android-SDK + VERSION + "0.0.5" + URL + "https://github.com/hunter-packages/android-sdk/archive/v0.0.5.tar.gz" + SHA1 + fa27bf38136638b94942ef2219969191a9243356 +) + +hunter_add_version( + PACKAGE_NAME + Android-SDK + VERSION + "0.0.4" + URL + "https://github.com/hunter-packages/android-sdk/archive/v0.0.4.tar.gz" + SHA1 + 7bf6bdc6c6e03692a97d6e1f25f39705e92b4f10 +) + hunter_add_version( PACKAGE_NAME Android-SDK @@ -42,6 +64,17 @@ hunter_add_version( 3b151f3cb559dc2ae1d0df85155e9cae5a33958d ) +hunter_add_version( + PACKAGE_NAME + Android-SDK + VERSION + "0.0.6" + URL + "https://github.com/hunter-packages/android-sdk/archive/v0.0.6.tar.gz" + SHA1 + 8919cea855831de723c7966a2624cd9ac2d256ab +) + # This is unpack-like package. No need to install variants hunter_configuration_types(Android-SDK CONFIGURATION_TYPES Release) diff --git a/cmake/projects/Android-Support-Repository/hunter.cmake b/cmake/projects/Android-Support-Repository/hunter.cmake index c04d3a4bb..d5e651334 100755 --- a/cmake/projects/Android-Support-Repository/hunter.cmake +++ b/cmake/projects/Android-Support-Repository/hunter.cmake @@ -9,6 +9,17 @@ include(hunter_pick_scheme) # https://dl.google.com/android/repository/addon.xml +hunter_add_version( + PACKAGE_NAME + Android-Support-Repository + VERSION + "47" + URL + "http://dl-ssl.google.com/android/repository/android_m2repository_r47.zip" + SHA1 + a0d22beacc106a6977321f2b07d692ce4979e96a +) + hunter_add_version( PACKAGE_NAME Android-Support-Repository diff --git a/cmake/projects/Assimp/hunter.cmake b/cmake/projects/Assimp/hunter.cmake index 3594d2f75..b6e894f9d 100644 --- a/cmake/projects/Assimp/hunter.cmake +++ b/cmake/projects/Assimp/hunter.cmake @@ -31,6 +31,28 @@ hunter_add_version( a3f46eb24bc48cacee9f21b1ea4f4a0e3122b847 ) +hunter_add_version( + PACKAGE_NAME + Assimp + VERSION + 3.2-p2 + URL + "https://github.com/hunter-packages/assimp/archive/v3.2-p2.tar.gz" + SHA1 + 7b745fc73c28073d7bdcaa18f994c39636c27776 +) + +hunter_add_version( + PACKAGE_NAME + Assimp + VERSION + 5.0.0-07779a7a + URL + "https://github.com/assimp/assimp/archive/07779a7ae1c88774a2c10adf5817ea84da81d971.zip" + SHA1 + eb8cf84437f6cd4e8efbda5839655e1e1c347c27 +) + hunter_cmake_args( Assimp CMAKE_ARGS @@ -38,6 +60,8 @@ hunter_cmake_args( ASSIMP_BUILD_SAMPLES=OFF ASSIMP_BUILD_TESTS=OFF ASSIMP_ENABLE_BOOST_WORKAROUND=OFF + ASSIMP_INSTALL_PDB=OFF + IGNORE_GIT_HASH=ON ) hunter_pick_scheme(DEFAULT url_sha1_cmake) diff --git a/cmake/projects/Avahi/schemes/url_sha1_avahi_autotools.cmake.in b/cmake/projects/Avahi/schemes/url_sha1_avahi_autotools.cmake.in index b4b309451..363aa5770 100644 --- a/cmake/projects/Avahi/schemes/url_sha1_avahi_autotools.cmake.in +++ b/cmake/projects/Avahi/schemes/url_sha1_avahi_autotools.cmake.in @@ -11,7 +11,7 @@ include("@HUNTER_SELF@/cmake/Hunter") include(hunter_autotools_project) include(hunter_report_broken_package) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_avahi_autotools") @@ -20,14 +20,14 @@ if("@MSVC@") endif() # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") hunter_add_package(dbus) hunter_add_package(Expat) diff --git a/cmake/projects/BZip2/hunter.cmake b/cmake/projects/BZip2/hunter.cmake index 1b526d792..ca4119f2c 100644 --- a/cmake/projects/BZip2/hunter.cmake +++ b/cmake/projects/BZip2/hunter.cmake @@ -5,15 +5,11 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) include(hunter_report_broken_package) -string(COMPARE EQUAL "${CMAKE_OSX_SYSROOT}" "iphoneos" _hunter_ios) -if(_hunter_ios) - hunter_report_broken_package("BZip2 is broken on iOS") -endif() - hunter_add_version( PACKAGE_NAME BZip2 @@ -25,6 +21,45 @@ hunter_add_version( 5eae50a9a0ded0ee0ea5201001b2f4f726dbf8ed ) +hunter_add_version( + PACKAGE_NAME + BZip2 + VERSION + "1.0.6-p2" + URL + "https://github.com/hunter-packages/bzip2/archive/v1.0.6-p2.tar.gz" + SHA1 + 76d5bdd269160a87948fec676c75c2bcc6888585 +) + +hunter_add_version( + PACKAGE_NAME + BZip2 + VERSION + "1.0.6-p3" + URL + "https://github.com/hunter-packages/bzip2/archive/v1.0.6-p3.tar.gz" + SHA1 + f0ebd4c19c2ff663c2f75406c1a476211bf3d3c1 +) + +hunter_add_version( + PACKAGE_NAME + BZip2 + VERSION + "1.0.6-p4" + URL + "https://github.com/hunter-packages/bzip2/archive/v1.0.6-p4.tar.gz" + SHA1 + 11fb2b502a425ccc07142f869cce8b3bbae5f1ea +) + +hunter_cmake_args( + BZip2 + CMAKE_ARGS + BUILD_TESTING=OFF +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(BZip2) hunter_download(PACKAGE_NAME BZip2) diff --git a/cmake/projects/Boost/atomic/hunter.cmake b/cmake/projects/Boost/atomic/hunter.cmake index 8d027d55a..b8cd0b403 100644 --- a/cmake/projects/Boost/atomic/hunter.cmake +++ b/cmake/projects/Boost/atomic/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT atomic - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/chrono/hunter.cmake b/cmake/projects/Boost/chrono/hunter.cmake index 917ba64e9..41f356186 100644 --- a/cmake/projects/Boost/chrono/hunter.cmake +++ b/cmake/projects/Boost/chrono/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT chrono - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/context/hunter.cmake b/cmake/projects/Boost/context/hunter.cmake index 0f573c779..442f11c73 100644 --- a/cmake/projects/Boost/context/hunter.cmake +++ b/cmake/projects/Boost/context/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT context - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/coroutine/hunter.cmake b/cmake/projects/Boost/coroutine/hunter.cmake index f90be68df..8ae4e47ff 100644 --- a/cmake/projects/Boost/coroutine/hunter.cmake +++ b/cmake/projects/Boost/coroutine/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT coroutine - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/date_time/hunter.cmake b/cmake/projects/Boost/date_time/hunter.cmake index 302675f87..8ccdb5122 100644 --- a/cmake/projects/Boost/date_time/hunter.cmake +++ b/cmake/projects/Boost/date_time/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT date_time - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/exception/hunter.cmake b/cmake/projects/Boost/exception/hunter.cmake index 25b8debcf..cc1fc3235 100644 --- a/cmake/projects/Boost/exception/hunter.cmake +++ b/cmake/projects/Boost/exception/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT exception - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/filesystem/hunter.cmake b/cmake/projects/Boost/filesystem/hunter.cmake index 41bdbed85..882288be9 100644 --- a/cmake/projects/Boost/filesystem/hunter.cmake +++ b/cmake/projects/Boost/filesystem/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT filesystem - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/generate.sh b/cmake/projects/Boost/generate.sh index a724f996a..7ed68e6b3 100755 --- a/cmake/projects/Boost/generate.sh +++ b/cmake/projects/Boost/generate.sh @@ -8,8 +8,10 @@ BOOST_LIBS=" chrono context coroutine + contract date_time exception + fiber filesystem graph graph_parallel @@ -24,6 +26,7 @@ BOOST_LIBS=" regex serialization signals + stacktrace system test thread diff --git a/cmake/projects/Boost/graph/hunter.cmake b/cmake/projects/Boost/graph/hunter.cmake index 0b65237ec..39cf31338 100644 --- a/cmake/projects/Boost/graph/hunter.cmake +++ b/cmake/projects/Boost/graph/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT graph - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/graph_parallel/hunter.cmake b/cmake/projects/Boost/graph_parallel/hunter.cmake index ae996f308..92cd1a074 100644 --- a/cmake/projects/Boost/graph_parallel/hunter.cmake +++ b/cmake/projects/Boost/graph_parallel/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT graph_parallel - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/hunter.cmake b/cmake/projects/Boost/hunter.cmake index 95de122d0..5457379f2 100644 --- a/cmake/projects/Boost/hunter.cmake +++ b/cmake/projects/Boost/hunter.cmake @@ -8,17 +8,177 @@ include(hunter_cacheable) include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +include(hunter_check_toolchain_definition) # Disable searching in locations not specified by these hint variables. set(Boost_NO_SYSTEM_PATHS ON) +# use base url for official boost releases +set(_hunter_boost_base_url "https://dl.bintray.com/boostorg/release") + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.65.1" + URL + "${_hunter_boost_base_url}/1.65.1/source/boost_1_65_1.tar.bz2" + SHA1 + 4a5b0c3c1b1b9a4d6cb6a6cc395e903e76f76720 +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.65.0" + URL + "${_hunter_boost_base_url}/1.65.0/source/boost_1_65_0.tar.bz2" + SHA1 + f9260074ecfb31f3e65322fae9c15cc423c0ad59 +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.66.0" + URL + "${_hunter_boost_base_url}/1.66.0/source/boost_1_66_0.7z" + SHA1 + 075d0b43980614054b1f1bafd189f863bba6600e +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.66.0-p0" + URL + "https://github.com/hunter-packages/boost/releases/download/v1.66.0-p0/hunter-1.66.0.7z" + SHA1 + 8c9829ce5e8f0b2b582f8ee1a6103c037a154aa3 +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.67.0" + URL + "${_hunter_boost_base_url}/1.67.0/source/boost_1_67_0.7z" + SHA1 + 64c278c23defe155e630a307ae2c0615348b14b3 +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.67.0-p0" + URL + "https://github.com/hunter-packages/boost/archive/v1.67.0-p0.tar.gz" + SHA1 + e56a5fbafa31683047f92850e05735dfcde084aa +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.67.0-p1" + URL + "https://github.com/hunter-packages/boost/releases/download/v1.67.0-p1/hunter-1.67.0.7z" + SHA1 + 26fcf19a79d013a318562435cef2829ea6bf29a4 +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.68.0-p0" + URL + "https://github.com/hunter-packages/boost/releases/download/v1.68.0-p0/hunter-1.68.0.7z" + SHA1 + 3af972569d4b685145442445e51b3fcace342b31 +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.68.0-p1" + URL + "https://github.com/hunter-packages/boost/archive/v1.68.0-p1.tar.gz" + SHA1 + 0bb10b0a0fdc196646c87e0143c0290baa32357d +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.69.0-p0" + URL + "https://github.com/hunter-packages/boost/archive/v1.69.0-p0.tar.gz" + SHA1 + 2539b0751f77ff3efdf842775700fe5422c2adfb +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.69.0-p1" + URL + "https://github.com/hunter-packages/boost/archive/v1.69.0-p1.tar.gz" + SHA1 + 7f3a890d698912516f45effb3c88a8b6f93ed2da +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.70.0-p0" + URL + "https://github.com/hunter-packages/boost/archive/v1.70.0-p0.tar.gz" + SHA1 + e6bb97b5109c7c15ea459cf2b1a9d52cbf88a89e +) + +# up until 1.63 sourcefourge was used +set(_hunter_boost_base_url "https://downloads.sourceforge.net/project/boost/boost/") +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.64.0" + URL + "${_hunter_boost_base_url}/1.64.0/boost_1_64_0.tar.bz2" + SHA1 + 51421ef259a4530edea0fbfc448460fcc5c64edb +) + +hunter_add_version( + PACKAGE_NAME + Boost + VERSION + "1.63.0" + URL + "${_hunter_boost_base_url}/1.63.0/boost_1_63_0.tar.bz2" + SHA1 + 9f1dd4fa364a3e3156a77dc17aa562ef06404ff6 +) + hunter_add_version( PACKAGE_NAME Boost VERSION "1.62.0" URL - "https://downloads.sourceforge.net/project/boost/boost/1.62.0/boost_1_62_0.tar.bz2" + "${_hunter_boost_base_url}/1.62.0/boost_1_62_0.tar.bz2" SHA1 5fd97433c3f859d8cbab1eaed4156d3068ae3648 ) @@ -30,7 +190,7 @@ hunter_add_version( VERSION "1.61.0" URL - "https://downloads.sourceforge.net/project/boost/boost/1.61.0/boost_1_61_0.tar.bz2" + "${_hunter_boost_base_url}/1.61.0/boost_1_61_0.tar.bz2" SHA1 f84b1a1ce764108ec3c2b7bd7704cf8dfd3c9d01 ) @@ -229,6 +389,15 @@ hunter_add_version( 26a52840e9d12f829e3008589abf0a925ce88524 ) +if(MSVC) + hunter_check_toolchain_definition(NAME "_DLL" DEFINED _hunter_vs_md) + hunter_cmake_args( + Boost + CMAKE_ARGS + BOOST_BUILD_DYNAMIC_VSRUNTIME=${_hunter_vs_md} + ) +endif() + hunter_pick_scheme(DEFAULT url_sha1_boost) hunter_cacheable(Boost) -hunter_download(PACKAGE_NAME Boost PACKAGE_INTERNAL_DEPS_ID "4") +hunter_download(PACKAGE_NAME Boost PACKAGE_INTERNAL_DEPS_ID "44") diff --git a/cmake/projects/Boost/hunter.cmake.in b/cmake/projects/Boost/hunter.cmake.in index 512cb1731..1126870dd 100644 --- a/cmake/projects/Boost/hunter.cmake.in +++ b/cmake/projects/Boost/hunter.cmake.in @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT boost_component - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/iostreams/hunter.cmake b/cmake/projects/Boost/iostreams/hunter.cmake index 544989256..a9f7066d3 100644 --- a/cmake/projects/Boost/iostreams/hunter.cmake +++ b/cmake/projects/Boost/iostreams/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT iostreams - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/locale/hunter.cmake b/cmake/projects/Boost/locale/hunter.cmake index a0a01715e..c22067604 100644 --- a/cmake/projects/Boost/locale/hunter.cmake +++ b/cmake/projects/Boost/locale/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT locale - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/log/hunter.cmake b/cmake/projects/Boost/log/hunter.cmake index 137038df6..3e8e6c850 100644 --- a/cmake/projects/Boost/log/hunter.cmake +++ b/cmake/projects/Boost/log/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT log - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/math/hunter.cmake b/cmake/projects/Boost/math/hunter.cmake index 312fe2c5b..d92615283 100644 --- a/cmake/projects/Boost/math/hunter.cmake +++ b/cmake/projects/Boost/math/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT math - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/mpi/hunter.cmake b/cmake/projects/Boost/mpi/hunter.cmake index dfbd98b59..b816ce1ec 100644 --- a/cmake/projects/Boost/mpi/hunter.cmake +++ b/cmake/projects/Boost/mpi/hunter.cmake @@ -26,5 +26,5 @@ hunter_download( Boost PACKAGE_COMPONENT mpi - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/program_options/hunter.cmake b/cmake/projects/Boost/program_options/hunter.cmake index 425da91d8..4041470ed 100644 --- a/cmake/projects/Boost/program_options/hunter.cmake +++ b/cmake/projects/Boost/program_options/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT program_options - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/python/hunter.cmake b/cmake/projects/Boost/python/hunter.cmake index f50ced68a..307e93156 100644 --- a/cmake/projects/Boost/python/hunter.cmake +++ b/cmake/projects/Boost/python/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT python - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/random/hunter.cmake b/cmake/projects/Boost/random/hunter.cmake index 9f96c3b90..afd077f07 100644 --- a/cmake/projects/Boost/random/hunter.cmake +++ b/cmake/projects/Boost/random/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT random - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/regex/hunter.cmake b/cmake/projects/Boost/regex/hunter.cmake index 90659cf86..3cb3dba99 100644 --- a/cmake/projects/Boost/regex/hunter.cmake +++ b/cmake/projects/Boost/regex/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT regex - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/schemes/url_sha1_boost.cmake.in b/cmake/projects/Boost/schemes/url_sha1_boost.cmake.in index 3481440a3..e426e89ed 100644 --- a/cmake/projects/Boost/schemes/url_sha1_boost.cmake.in +++ b/cmake/projects/Boost/schemes/url_sha1_boost.cmake.in @@ -10,72 +10,34 @@ include(ExternalProject) # ExternalProject_Add list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") +include(hunter_get_boost_libs) include(hunter_install_boost_config) include(hunter_report_broken_package) include(hunter_status_debug) include(hunter_status_print) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) +include(hunter_user_error) +include(hunter_parse_boost_config_macros) hunter_status_debug("Scheme: url_sha1_boost") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_Boost_VERSION@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") -hunter_test_string_not_empty("@HUNTER_GLOBAL_SCRIPT_DIR@") - -if("@MSVC@") - hunter_test_string_not_empty("@HUNTER_MSVC_ARCH@") - hunter_test_string_not_empty("@HUNTER_MSVC_VCVARSALL@") -endif() - -# Same logic in all url_sha1_boost* schemes (TODO: DRY) -macro(BOOST_COMPONENT name version) - list(APPEND BOOST_COMPONENT_NAMES ${name}) - set(BOOST_COMPONENT_${name}_VERSION ${version}) -endmacro() - -boost_component(atomic 1.53.0) -boost_component(chrono 1.47.0) -boost_component(container 1.56.0) -boost_component(context 1.51.0) -boost_component(coroutine 1.53.0) -boost_component(coroutine2 1.60.0) -boost_component(date_time 1.29.0) -boost_component(exception 1.36.0) -boost_component(filesystem 1.30.0) -boost_component(graph 1.18.0) -boost_component(graph_parallel 1.18.0) -boost_component(iostreams 1.33.0) -boost_component(locale 1.48.0) -boost_component(log 1.54.0) -boost_component(math 1.23.0) -boost_component(metaparse 1.61.0) -boost_component(mpi 1.35.0) -boost_component(program_options 1.32.0) -boost_component(python 1.19.0) -boost_component(random 1.15.0) -boost_component(regex 1.18.0) -boost_component(serialization 1.32.0) -boost_component(signals 1.29.0) -boost_component(system 1.35.0) -boost_component(test 1.21.0) -boost_component(thread 1.25.0) -boost_component(timer 1.9.0) -boost_component(type_erasure 1.60.0) -boost_component(wave 1.33.0) - -foreach(name IN LISTS BOOST_COMPONENT_NAMES) - if(NOT @HUNTER_Boost_VERSION@ VERSION_LESS BOOST_COMPONENT_${name}_VERSION) - list(APPEND boost_libs ${name}) - endif() -endforeach() +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_Boost_VERSION@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +# get list of boost components for given version +hunter_get_boost_libs(VERSION "@HUNTER_Boost_VERSION@" LIBS boost_libs) # MinGW 1.55 is broken string(REGEX MATCH "1.55.0*" version_1_55 "@HUNTER_Boost_VERSION@") @@ -87,40 +49,60 @@ foreach(x ${boost_libs}) list(APPEND boost_list "--without-${x}") endforeach() -if("@MSVC@") - set(env_cmd "@HUNTER_MSVC_VCVARSALL@" "@HUNTER_MSVC_ARCH@") -else() - set(env_cmd "") -endif() - -if("@MSVC@" OR "@MINGW@") +if(CMAKE_HOST_WIN32) set(install_cmd "b2") - set(bootstrap_cmd "bootstrap.bat") -else() - set(install_cmd "./b2") - if(APPLE) - # Clear Xcode environment - set( - bootstrap_cmd - . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && ./bootstrap.sh - ) + if("@MSVC@") + set(HUNTER_MSVC_VCVARSALL "@HUNTER_MSVC_VCVARSALL@") + set(HUNTER_MSVC_ARCH "@HUNTER_MSVC_ARCH@") + set(HUNTER_PACKAGE_SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@") + configure_file("@HUNTER_PACKAGE_SCRIPT_DIR@/patched_boostrap.bat.in" "@HUNTER_PACKAGE_DOWNLOAD_DIR@/patched_boostrap.bat") + set(patch_cmd "@CMAKE_COMMAND@" -E copy "@HUNTER_PACKAGE_DOWNLOAD_DIR@/patched_boostrap.bat" "@HUNTER_PACKAGE_SOURCE_DIR@/patched_boostrap.bat") + set(bootstrap_cmd "patched_boostrap.bat") else() - set(bootstrap_cmd "./bootstrap.sh") + set(patch_cmd "@CMAKE_COMMAND@" -E echo "Dummy patch command") + set(bootstrap_cmd "bootstrap.bat") endif() +else() + set(install_cmd "./b2") + set(bootstrap_cmd "./bootstrap.sh") + set(patch_cmd "@CMAKE_COMMAND@" -E echo "Dummy patch command") endif() -if("@MSVC@") - # Logging as Workaround for VS_UNICODE_OUTPUT issue: - # https://public.kitware.com/Bug/view.php?id=14266 - set(log_opts LOG_CONFIGURE 1 LOG_BUILD 1 LOG_INSTALL 1 LOG_DOWNLOAD 1) - get_filename_component(x "@HUNTER_PACKAGE_SOURCE_DIR@/.." ABSOLUTE) - hunter_status_print( - "For progress check log files in directory: ${x}" +string(COMPARE EQUAL "@CMAKE_CXX_COMPILER_ID@" "Clang" compiler_is_clang) + +if("@MINGW@") + # Test scenario: MinGW installed in system, Visual Studio - not + list(APPEND bootstrap_cmd "gcc") +endif() +if(APPLE) + # Clear Xcode environment + set( + bootstrap_cmd + . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && ${bootstrap_cmd} ) +elseif(compiler_is_clang AND NOT CMAKE_CROSSCOMPILING) + list(APPEND bootstrap_cmd "--with-toolset=clang") +endif() + +if("@HUNTER_PACKAGE_LOG_BUILD@") + set(log_build 1) +else() + set(log_build 0) +endif() + +if("@HUNTER_PACKAGE_LOG_INSTALL@" OR "@HUNTER_SUPPRESS_LIST_OF_FILES@") + set(log_install 1) else() - set(log_opts "") + set(log_install 0) endif() +hunter_parse_boost_config_macros(BOOST_CONFIG_MACROS "@HUNTER_Boost_CMAKE_ARGS@") +configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/append-boost-config-macros.cmake.in" + "@HUNTER_PACKAGE_BUILD_DIR@/append-boost-config-macros.cmake" + @ONLY +) + ExternalProject_Add( "@HUNTER_EP_NAME@" URL @@ -129,13 +111,18 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR "@HUNTER_PACKAGE_INSTALL_PREFIX@" # not used, just avoid creating Install/ empty directory + UPDATE_COMMAND + "@CMAKE_COMMAND@" -P + "@HUNTER_PACKAGE_BUILD_DIR@/append-boost-config-macros.cmake" CONFIGURE_COMMAND - ${env_cmd} + ${patch_cmd} COMMAND ${bootstrap_cmd} BUILD_COMMAND @@ -149,13 +136,22 @@ ExternalProject_Add( install ${boost_list} "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@" + --ignore-site-config # Ignore Gentoo specific optimization "none" in site config that only the patched bjam of Gentoo can understand. COMMAND # Copy license files "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" + COMMAND + "@CMAKE_COMMAND@" + "-Dinstalldir=@HUNTER_PACKAGE_INSTALL_PREFIX@" -P - "@HUNTER_GLOBAL_SCRIPT_DIR@/try-copy-license.cmake" - ${log_opts} + "@HUNTER_SELF@/scripts/clean-boost-configs.cmake" + LOG_CONFIGURE ${log_build} + LOG_BUILD ${log_build} + LOG_INSTALL ${log_install} ) # Forward some variables diff --git a/cmake/projects/Boost/schemes/url_sha1_boost_ios_library.cmake.in b/cmake/projects/Boost/schemes/url_sha1_boost_ios_library.cmake.in index 6d92ef64c..5bb09a582 100644 --- a/cmake/projects/Boost/schemes/url_sha1_boost_ios_library.cmake.in +++ b/cmake/projects/Boost/schemes/url_sha1_boost_ios_library.cmake.in @@ -11,76 +11,47 @@ include(ExternalProject) # ExternalProject_Add list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_boost_component_b2_args) +include(hunter_dump_cmake_flags) include(hunter_install_boost_config) include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_unsetvar) +include(hunter_get_boost_libs) +include(hunter_parse_boost_config_macros) hunter_status_debug("Scheme: url_sha1_boost_ios_library") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_COMPONENT@") -hunter_test_string_not_empty("@HUNTER_GLOBAL_SCRIPT_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_COMPONENT@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") # Note: support for single architecture/native iOS builds (i.e., arm64) -hunter_test_string_not_empty("@IPHONESIMULATOR_ARCHS@@IPHONEOS_ARCHS@") -hunter_test_string_not_empty("@IPHONESIMULATOR_ROOT@") -hunter_test_string_not_empty("@IPHONEOS_ROOT@") -hunter_test_string_not_empty("@IPHONEOS_SDK_ROOT@") -hunter_test_string_not_empty("@IPHONESIMULATOR_SDK_ROOT@") -hunter_test_string_not_empty("@HUNTER_Boost_VERSION@") - -# Same logic in all url_sha1_boost* schemes (TODO: DRY) -macro(BOOST_COMPONENT name version) - list(APPEND BOOST_COMPONENT_NAMES ${name}) - set(BOOST_COMPONENT_${name}_VERSION ${version}) -endmacro() - -boost_component(atomic 1.53.0) -boost_component(chrono 1.47.0) -boost_component(container 1.56.0) -boost_component(context 1.51.0) -boost_component(coroutine 1.53.0) -boost_component(coroutine2 1.60.0) -boost_component(date_time 1.29.0) -boost_component(exception 1.36.0) -boost_component(filesystem 1.30.0) -boost_component(graph 1.18.0) -boost_component(graph_parallel 1.18.0) -boost_component(iostreams 1.33.0) -boost_component(locale 1.48.0) -boost_component(log 1.54.0) -boost_component(math 1.23.0) -boost_component(metaparse 1.61.0) -boost_component(mpi 1.35.0) -boost_component(program_options 1.32.0) -boost_component(python 1.19.0) -boost_component(random 1.15.0) -boost_component(regex 1.18.0) -boost_component(serialization 1.32.0) -boost_component(signals 1.29.0) -boost_component(system 1.35.0) -boost_component(test 1.21.0) -boost_component(thread 1.25.0) -boost_component(timer 1.9.0) -boost_component(type_erasure 1.60.0) -boost_component(wave 1.33.0) - -foreach(name IN LISTS BOOST_COMPONENT_NAMES) - if(NOT @HUNTER_Boost_VERSION@ VERSION_LESS BOOST_COMPONENT_${name}_VERSION) - list(APPEND boost_libs ${name}) - endif() -endforeach() +hunter_assert_not_empty_string("@IPHONESIMULATOR_ARCHS@@IPHONEOS_ARCHS@") +hunter_assert_not_empty_string("@IPHONESIMULATOR_ROOT@") +hunter_assert_not_empty_string("@IPHONEOS_ROOT@") +hunter_assert_not_empty_string("@IPHONEOS_SDK_ROOT@") +hunter_assert_not_empty_string("@IPHONESIMULATOR_SDK_ROOT@") +hunter_assert_not_empty_string("@HUNTER_Boost_VERSION@") + +# get list of boost components for given version +hunter_get_boost_libs(VERSION "@HUNTER_Boost_VERSION@" LIBS boost_libs) + +if("@HUNTER_Boost_VERSION@" VERSION_EQUAL 1.66.0) + set(fatlib_script "@HUNTER_PACKAGE_SCRIPT_DIR@/create-boost-1-66-ios-fatlib.sh") +else() + set(fatlib_script "@HUNTER_PACKAGE_SCRIPT_DIR@/create-boost-ios-fatlib.sh") +endif() set(libfound NO) foreach(x ${boost_libs}) @@ -106,12 +77,15 @@ foreach(x @IPHONEOS_ARCHS@) # First goes to instruction-set option; # arm64 is not supported: # * https://svn.boost.org/trac/boost/ticket/10910 + # NOTE: + # Being in instruction-set is not enough, should be + # mentioned explicitly in C++ flags too (Boost 1.66) set(arm_instruction_set "${x}") set(is_first NO) - else() - # others go to the C++ flags directly - set(iphoneos_archs "${iphoneos_archs} -arch ${x}") endif() + + set(iphoneos_archs "${iphoneos_archs} -arch ${x}") + # Has at least one iPhoneOS architecture to build set(has_iphoneos TRUE) endforeach() @@ -145,6 +119,9 @@ file( ";" ) +file(READ ${boost_user_jam} boost_user_jam_content) +hunter_status_debug("boost.user.jam content:\n${boost_user_jam_content}") + set( build_opts -a @@ -156,6 +133,10 @@ set( --user-config="${boost_user_jam}" ) +set(BOOST_VERSION "@HUNTER_Boost_VERSION@") + +# Use: +# * BOOST_VERSION hunter_boost_component_b2_args( "@HUNTER_PACKAGE_COMPONENT@" "@HUNTER_Boost_CMAKE_ARGS@" @@ -164,13 +145,20 @@ hunter_boost_component_b2_args( list(APPEND build_opts ${b2_component_opts}) +hunter_dump_cmake_flags() +# -> CMAKE_CXX_FLAGS + if(CMAKE_CXX_FLAGS) list(APPEND build_opts "cxxflags=${CMAKE_CXX_FLAGS}") endif() string(COMPARE NOTEQUAL "@HUNTER_JOBS_OPTION@" "" have_jobs) if(have_jobs) - list(APPEND build_opts "-j" "@HUNTER_JOBS_OPTION@") + if("@HUNTER_JOBS_OPTION@" GREATER "256") + list(APPEND build_opts "-j" 256) + else() + list(APPEND build_opts "-j" "@HUNTER_JOBS_OPTION@") + endif() endif() set( @@ -212,6 +200,8 @@ if(has_iphoneos) SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -238,6 +228,8 @@ else() SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -261,6 +253,8 @@ if(has_isim) "" DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -287,6 +281,8 @@ else() SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -320,7 +316,7 @@ if(log_setup_target) set( extra_lib_command COMMAND - "@HUNTER_PACKAGE_SCRIPT_DIR@/create-boost-ios-fatlib.sh" + ${fatlib_script} "@HUNTER_PACKAGE_SOURCE_DIR@" "log_setup" "@HUNTER_PACKAGE_COMPONENT@" @@ -330,6 +326,13 @@ else() set(extra_lib_command "") endif() +hunter_parse_boost_config_macros(BOOST_CONFIG_MACROS "@HUNTER_Boost_CMAKE_ARGS@") +configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/append-boost-config-macros.cmake.in" + "@HUNTER_PACKAGE_BUILD_DIR@/append-boost-config-macros.cmake" + @ONLY +) + ExternalProject_Add( "@HUNTER_EP_NAME@-ios_universal" DEPENDS @@ -337,6 +340,8 @@ ExternalProject_Add( "@HUNTER_EP_NAME@-ios_sim" DOWNLOAD_COMMAND "" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" SOURCE_DIR @@ -344,6 +349,9 @@ ExternalProject_Add( INSTALL_DIR "@HUNTER_PACKAGE_INSTALL_PREFIX@" # not used, just avoid creating Install/ empty directory + UPDATE_COMMAND + "@CMAKE_COMMAND@" -P + "@HUNTER_PACKAGE_BUILD_DIR@/append-boost-config-macros.cmake" CONFIGURE_COMMAND "" BUILD_COMMAND @@ -351,7 +359,7 @@ ExternalProject_Add( INSTALL_COMMAND "${CMAKE_COMMAND}" -E make_directory "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib" COMMAND - "@HUNTER_PACKAGE_SCRIPT_DIR@/create-boost-ios-fatlib.sh" + ${fatlib_script} "@HUNTER_PACKAGE_SOURCE_DIR@" "${LIBNAME}" "@HUNTER_PACKAGE_COMPONENT@" diff --git a/cmake/projects/Boost/schemes/url_sha1_boost_library.cmake.in b/cmake/projects/Boost/schemes/url_sha1_boost_library.cmake.in index 362278ea2..e9da82987 100644 --- a/cmake/projects/Boost/schemes/url_sha1_boost_library.cmake.in +++ b/cmake/projects/Boost/schemes/url_sha1_boost_library.cmake.in @@ -13,74 +13,37 @@ list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(CheckSymbolExists) # check_symbol_exists include(hunter_boost_component_b2_args) +include(hunter_dump_cmake_flags) include(hunter_fatal_error) +include(hunter_get_boost_libs) include(hunter_install_boost_config) include(hunter_internal_error) +include(hunter_pick_archiver) include(hunter_status_debug) include(hunter_status_print) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) +include(hunter_user_error) +include(hunter_parse_boost_config_macros) +include(hunter_parse_cmake_args_for_keyword) hunter_status_debug("Scheme: url_sha1_boost_library") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_COMPONENT@") -hunter_test_string_not_empty("@CMAKE_CXX_COMPILER@") -hunter_test_string_not_empty("@CMAKE_CXX_COMPILER_ID@") -hunter_test_string_not_empty("@HUNTER_Boost_VERSION@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SCRIPT_DIR@") - -if("@MSVC@") - hunter_test_string_not_empty("@HUNTER_MSVC_ARCH@") - hunter_test_string_not_empty("@HUNTER_MSVC_VCVARSALL@") -endif() - -# Same logic in all url_sha1_boost* schemes (TODO: DRY) -macro(BOOST_COMPONENT name version) - list(APPEND BOOST_COMPONENT_NAMES ${name}) - set(BOOST_COMPONENT_${name}_VERSION ${version}) -endmacro() - -boost_component(atomic 1.53.0) -boost_component(chrono 1.47.0) -boost_component(container 1.56.0) -boost_component(context 1.51.0) -boost_component(coroutine 1.53.0) -boost_component(coroutine2 1.60.0) -boost_component(date_time 1.29.0) -boost_component(exception 1.36.0) -boost_component(filesystem 1.30.0) -boost_component(graph 1.18.0) -boost_component(graph_parallel 1.18.0) -boost_component(iostreams 1.33.0) -boost_component(locale 1.48.0) -boost_component(log 1.54.0) -boost_component(math 1.23.0) -boost_component(metaparse 1.61.0) -boost_component(mpi 1.35.0) -boost_component(program_options 1.32.0) -boost_component(python 1.19.0) -boost_component(random 1.15.0) -boost_component(regex 1.18.0) -boost_component(serialization 1.32.0) -boost_component(signals 1.29.0) -boost_component(system 1.35.0) -boost_component(test 1.21.0) -boost_component(thread 1.25.0) -boost_component(timer 1.9.0) -boost_component(type_erasure 1.60.0) -boost_component(wave 1.33.0) - -foreach(name IN LISTS BOOST_COMPONENT_NAMES) - if(NOT @HUNTER_Boost_VERSION@ VERSION_LESS BOOST_COMPONENT_${name}_VERSION) - list(APPEND boost_libs ${name}) - endif() -endforeach() +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_COMPONENT@") +hunter_assert_not_empty_string("@CMAKE_CXX_COMPILER@") +hunter_assert_not_empty_string("@CMAKE_CXX_COMPILER_ID@") +hunter_assert_not_empty_string("@HUNTER_Boost_VERSION@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +# get list of boost components for given version +hunter_get_boost_libs(VERSION "@HUNTER_Boost_VERSION@" LIBS boost_libs) set(libfound NO) foreach(x ${boost_libs}) @@ -96,12 +59,20 @@ endif() string(COMPARE EQUAL "@CMAKE_CXX_COMPILER_ID@" "Clang" compiler_is_clang) +set(use_cmake_archiver TRUE) if("@ANDROID@") set(toolset_name "gcc") set(toolset_version "ndk") elseif("@APPLE@") set(toolset_name "darwin") set(toolset_version "") + + # Using CMAKE_AR on OSX leads to error (b2 use 'libtool'): + # * https://travis-ci.org/ingenue/hunter/jobs/204617507 + set(use_cmake_archiver FALSE) +elseif("@QNX@") + set(toolset_name "qcc") + set(toolset_version "") elseif("@CMAKE_COMPILER_IS_GNUCXX@") set(toolset_name "gcc") set(toolset_version "") @@ -111,10 +82,17 @@ elseif(compiler_is_clang) elseif("@MSVC@") set(toolset_name "msvc") set(toolset_version "") +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") + set(toolset_name "intel") + set(toolset_version "") else() - hunter_fatal_error("TODO: set toolset for boost" WIKI "error.boost.toolset") + hunter_fatal_error("TODO: set toolset for boost" ERROR_PAGE "error.boost.toolset") endif() +hunter_dump_cmake_flags() +# -> CMAKE_C_FLAGS +# -> CMAKE_CXX_FLAGS + if("@ANDROID@") get_directory_property(defs COMPILE_DEFINITIONS) foreach(def ${defs}) @@ -130,16 +108,16 @@ if("@ANDROID@") endforeach() endif() -if("@MSVC@") - set(env_cmd "@HUNTER_MSVC_VCVARSALL@" "@HUNTER_MSVC_ARCH@") -else() - # Workaround for: http://public.kitware.com/Bug/view.php?id=15567 - set(env_cmd "@CMAKE_COMMAND@" -E echo "configure") -endif() - if("@MSVC@") set(boost_compiler "@CMAKE_CXX_COMPILER@") - string(REPLACE "/" "\\" boost_compiler "${boost_compiler}") + + # Note: + # - '/' will not work + # - single '\' lead to bug + # + # See issue: + # - https://github.com/boostorg/build/issues/426#issuecomment-482564740 + string(REPLACE "/" "\\\\" boost_compiler "${boost_compiler}") else() set(boost_compiler "@CMAKE_CXX_COMPILER@") endif() @@ -159,7 +137,7 @@ if(is_mpi) "MPI is required. Please install it. For example MS-MPI: " "http://msdn.microsoft.com/en-us/library/bb524831%28v=vs.85%29.aspx" ) - hunter_fatal_error("MPI is required" WIKI "error.boost.mpi.on.windows") + hunter_fatal_error("MPI is required" ERROR_PAGE "error.boost.mpi.on.windows") endif() get_filename_component(MPI_DIR "${MPI_CXX_INCLUDE_PATH}/.." ABSOLUTE) string(REPLACE "/" "\\\\" MPI_DIR "${MPI_DIR}") @@ -188,6 +166,16 @@ else() set(copy_mpi_command "") endif() +set(BOOST_ALL_DYN_LINK "") +if(BUILD_SHARED_LIBS) #if using shared libs overide boost config + set(BOOST_BUILD_STATIC OFF) + if("@MSVC@") + set(BOOST_ALL_DYN_LINK ON) + endif() +else() + set(BOOST_BUILD_STATIC ON) +endif() + if("@MSVC@") # Disable auto-linking set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DBOOST_ALL_NO_LIB=1") @@ -205,7 +193,16 @@ if(have_osx_sysroot) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isysroot @CMAKE_OSX_SYSROOT@") endif() -set(link_opts link=static) +if(BOOST_BUILD_STATIC) + set(link_opts link=static) + if("@MSVC@" AND NOT BOOST_BUILD_DYNAMIC_VSRUNTIME) + list(APPEND link_opts "runtime-link=static") + endif() +else() + set(link_opts link=shared) +endif() + +# Modify Boost user jam file set(toolset_full_name ${toolset_name}) string(COMPARE NOTEQUAL "${toolset_version}" "" has_toolset_version) @@ -225,7 +222,15 @@ set( "--user-config=${boost_user_jam}" --with-@HUNTER_PACKAGE_COMPONENT@ ) +if("@MINGW@") + # cross compile from "linux" to "windows" using mingw + set(build_opts target-os=windows ${build_opts}) +endif() +set(BOOST_VERSION "@HUNTER_Boost_VERSION@") + +# Use: +# * BOOST_VERSION hunter_boost_component_b2_args( "@HUNTER_PACKAGE_COMPONENT@" "@HUNTER_Boost_CMAKE_ARGS@" @@ -256,19 +261,34 @@ else() ) endif() -file( - APPEND - ${boost_user_jam} - " : \"${CMAKE_AR}\"\n" -) +if(use_cmake_archiver) + # We need custom '' and '' for + # Android LTO ('*-gcc-ar' instead of '*-ar') + # WARNING: no spaces between '' and '${CMAKE_AR}'! + + # -> CMAKE_AR + # -> CMAKE_RANLIB + hunter_pick_archiver() + + file( + APPEND + ${boost_user_jam} + " : \"${CMAKE_AR}\"\n" + " \"${CMAKE_RANLIB}\"\n" + ) +endif() if(MSVC) # See 'boost_compiler' section + + # Note: Flags should be quoted: + # - https://github.com/boostorg/build/issues/426#issuecomment-482564740 + foreach(cxx_flag ${cxx_flags_list}) file( APPEND ${boost_user_jam} - " ${cxx_flag}\n" + " \"${cxx_flag}\"\n" ) endforeach() endif() @@ -280,34 +300,117 @@ file( "${using_mpi}\n" ) +# handle requested python version if such is specified +hunter_parse_cmake_args_for_keyword( + CMAKE_ARGS "@HUNTER_Boost_CMAKE_ARGS@" + KEYWORD PYTHON_VERSION + OUTPUT python_version +) + +# set up paths for python in boost.user.jam +if(NOT python_version STREQUAL "") + find_package(PythonInterp ${python_version} EXACT QUIET) + if(NOT PYTHONINTERP_FOUND) + hunter_user_error("Python Interpreter for Python version ${python_version} not found.") + endif() + set(python_executable ${PYTHON_EXECUTABLE}) + find_package(PythonLibs ${python_version} EXACT QUIET) + if(NOT PYTHONLIBS_FOUND) + hunter_user_error("Python runtime library directory for Python version ${python_version} not found.") + endif() + # get the main Python include directory containing pyconfig.h + list(LENGTH PYTHON_INCLUDE_DIRS python_include_dir_list_length) + if(python_include_dir_list_length EQUAL 1) + set(python_include_directory "${PYTHON_INCLUDE_DIRS}") + else() + list(GET PYTHON_INCLUDE_DIRS 0 python_include_directory) + endif() + # get directory of optimized library + list(LENGTH PYTHON_LIBRARIES python_libraries_list_length) + if(python_libraries_list_length EQUAL 1) + set(python_optimized_library_path "${PYTHON_LIBRARIES}") + else() + list(GET PYTHON_LIBRARIES 1 python_optimized_library_path) + endif() + get_filename_component(python_library_directory "${python_optimized_library_path}" DIRECTORY) + if("@MSVC@") + string(REPLACE "/" "\\\\" python_executable "${python_executable}") + string(REPLACE "/" "\\\\" python_include_directory "${python_include_directory}") + string(REPLACE "/" "\\\\" python_library_directory "${python_library_directory}") + endif() + file( + APPEND ${boost_user_jam} + "using python : ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} : \"${python_executable}\" : \"${python_include_directory}\" : \"${python_library_directory}\" ;\n" + ) +endif() + +# Handle ./b2 build options + list(APPEND build_opts ${b2_component_opts}) if(CMAKE_EXE_LINKER_FLAGS) list(APPEND build_opts "linkflags=${CMAKE_EXE_LINKER_FLAGS}") endif() -string(COMPARE EQUAL "@HUNTER_MSVC_ARCH@" "amd64" is_x64) -if("@MSVC@" AND is_x64) - list(APPEND build_opts "address-model=64") +if("@ANDROID@") + if("@CMAKE_ANDROID_ARCH@" MATCHES "^(arm|mips|x86)$") + list(APPEND build_opts "address-model=32") + else() + list(APPEND build_opts "address-model=64") + endif() +elseif("@MSVC@") + string(COMPARE EQUAL "@HUNTER_MSVC_ARCH@" "x86" is_x86) + string(COMPARE EQUAL "@HUNTER_MSVC_ARCH@" "amd64" is_x64) + if(is_x86) + list(APPEND build_opts "address-model=32") + elseif(is_x64) + list(APPEND build_opts "address-model=64") + endif() endif() string(COMPARE NOTEQUAL "@HUNTER_JOBS_OPTION@" "" have_jobs) if(have_jobs) - list(APPEND build_opts "-j" "@HUNTER_JOBS_OPTION@") + if("@HUNTER_JOBS_OPTION@" GREATER "256") + list(APPEND build_opts "-j" 256) + else() + list(APPEND build_opts "-j" "@HUNTER_JOBS_OPTION@") + endif() endif() if(@HUNTER_STATUS_DEBUG@) set(verbose_output "-d+2 --debug-configuration") endif() -if("@MSVC@" OR "@MINGW@") - set(bootstrap_cmd "bootstrap.bat") +if(CMAKE_HOST_WIN32) set(b2_cmd "b2") + if("@MSVC@") + set(HUNTER_MSVC_VCVARSALL "@HUNTER_MSVC_VCVARSALL@") + set(HUNTER_MSVC_ARCH "@HUNTER_MSVC_ARCH@") + set(HUNTER_PACKAGE_SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@") + configure_file("@HUNTER_PACKAGE_SCRIPT_DIR@/patched_boostrap.bat.in" "@HUNTER_PACKAGE_DOWNLOAD_DIR@/patched_boostrap.bat") + set(patch_cmd "@CMAKE_COMMAND@" -E copy "@HUNTER_PACKAGE_DOWNLOAD_DIR@/patched_boostrap.bat" "@HUNTER_PACKAGE_SOURCE_DIR@/patched_boostrap.bat") + set(bootstrap_cmd "patched_boostrap.bat") + else() + set(patch_cmd "@CMAKE_COMMAND@" -E echo "Dummy patch command") + set(bootstrap_cmd "bootstrap.bat") + endif() else() - set(bootstrap_cmd "./bootstrap.sh") set(b2_cmd "./b2") + set(bootstrap_cmd "./bootstrap.sh") + set(patch_cmd "@CMAKE_COMMAND@" -E echo "Dummy patch command") +endif() + +if(compiler_is_clang AND NOT CMAKE_CROSSCOMPILING) + list(APPEND bootstrap_cmd "--with-toolset=clang") +endif() + +if("@MINGW@") + list(APPEND bootstrap_cmd "gcc") endif() +if("@ANDROID@") + list(APPEND build_opts target-os=android) +endif() if(HUNTER_STATUS_DEBUG) file(READ "${boost_user_jam}" USER_JAM_CONTENT) @@ -322,18 +425,25 @@ if(HUNTER_STATUS_DEBUG) hunter_status_debug("------") endif() -if("@MSVC@") - # Logging as Workaround for VS_UNICODE_OUTPUT issue: - # https://public.kitware.com/Bug/view.php?id=14266 - set(log_opts LOG_CONFIGURE 1 LOG_BUILD 1 LOG_INSTALL 1 LOG_DOWNLOAD 1) - get_filename_component(x "@HUNTER_PACKAGE_SOURCE_DIR@/.." ABSOLUTE) - hunter_status_print( - "For progress check log files in directory: ${x}" - ) +if("@HUNTER_PACKAGE_LOG_BUILD@") + set(log_build 1) else() - set(log_opts "") + set(log_build 0) endif() +if("@HUNTER_PACKAGE_LOG_INSTALL@" OR "@HUNTER_SUPPRESS_LIST_OF_FILES@") + set(log_install 1) +else() + set(log_install 0) +endif() + +hunter_parse_boost_config_macros(BOOST_CONFIG_MACROS "@HUNTER_Boost_CMAKE_ARGS@") +configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/append-boost-config-macros.cmake.in" + "@HUNTER_PACKAGE_BUILD_DIR@/append-boost-config-macros.cmake" + @ONLY +) + ExternalProject_Add( "@HUNTER_EP_NAME@" URL @@ -342,13 +452,18 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR "@HUNTER_PACKAGE_INSTALL_PREFIX@" # not used, just avoid creating Install/ empty directory + UPDATE_COMMAND + "@CMAKE_COMMAND@" -P + "@HUNTER_PACKAGE_BUILD_DIR@/append-boost-config-macros.cmake" CONFIGURE_COMMAND - ${env_cmd} + ${patch_cmd} ${copy_mpi_command} COMMAND ${bootstrap_cmd} @@ -356,6 +471,7 @@ ExternalProject_Add( ${b2_cmd} ${verbose_output} ${build_opts} + --ignore-site-config # Ignore Gentoo specific optimization "none" in site config that only the patched bjam of Gentoo can understand. BUILD_IN_SOURCE 1 INSTALL_COMMAND @@ -364,7 +480,10 @@ ExternalProject_Add( ${build_opts} stage # install only libraries, headers installed in `url_sha1_boost` "--stagedir=@HUNTER_PACKAGE_INSTALL_PREFIX@" - ${log_opts} + --ignore-site-config # Ignore Gentoo specific optimization "none" in site config that only the patched bjam of Gentoo can understand. + LOG_CONFIGURE ${log_build} + LOG_BUILD ${log_build} + LOG_INSTALL ${log_install} ) # Forward some variables diff --git a/cmake/projects/Boost/serialization/hunter.cmake b/cmake/projects/Boost/serialization/hunter.cmake index fb3baf590..d29b8681c 100644 --- a/cmake/projects/Boost/serialization/hunter.cmake +++ b/cmake/projects/Boost/serialization/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT serialization - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/signals/hunter.cmake b/cmake/projects/Boost/signals/hunter.cmake index f2db0667f..c2ab2e4b1 100644 --- a/cmake/projects/Boost/signals/hunter.cmake +++ b/cmake/projects/Boost/signals/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT signals - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/system/hunter.cmake b/cmake/projects/Boost/system/hunter.cmake index 3a7970871..459be338f 100644 --- a/cmake/projects/Boost/system/hunter.cmake +++ b/cmake/projects/Boost/system/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT system - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/test/hunter.cmake b/cmake/projects/Boost/test/hunter.cmake index df786085a..5f8af9b38 100644 --- a/cmake/projects/Boost/test/hunter.cmake +++ b/cmake/projects/Boost/test/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT test - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/thread/hunter.cmake b/cmake/projects/Boost/thread/hunter.cmake index c0d56edaa..600b3e313 100644 --- a/cmake/projects/Boost/thread/hunter.cmake +++ b/cmake/projects/Boost/thread/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT thread - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/timer/hunter.cmake b/cmake/projects/Boost/timer/hunter.cmake index 005b9a25e..a44b11052 100644 --- a/cmake/projects/Boost/timer/hunter.cmake +++ b/cmake/projects/Boost/timer/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT timer - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/Boost/wave/hunter.cmake b/cmake/projects/Boost/wave/hunter.cmake index 6d8c5bca1..1421b6347 100644 --- a/cmake/projects/Boost/wave/hunter.cmake +++ b/cmake/projects/Boost/wave/hunter.cmake @@ -18,5 +18,5 @@ hunter_download( Boost PACKAGE_COMPONENT wave - PACKAGE_INTERNAL_DEPS_ID "4" + PACKAGE_INTERNAL_DEPS_ID "44" ) diff --git a/cmake/projects/CURL/hunter.cmake b/cmake/projects/CURL/hunter.cmake index 37803e06a..0b8aecf88 100644 --- a/cmake/projects/CURL/hunter.cmake +++ b/cmake/projects/CURL/hunter.cmake @@ -1,20 +1,15 @@ # Copyright (c) 2015, Steve Brain +# Copyright (c) 2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! -# Load used modules - - - include(hunter_add_version) include(hunter_cacheable) include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) -# List of versions here... - hunter_add_version( PACKAGE_NAME CURL @@ -26,7 +21,99 @@ hunter_add_version( 1b17954403db625d5422faf8c7fd68b5dde093f9 ) +hunter_add_version( + PACKAGE_NAME + CURL + VERSION + "7.49.1-DEV-v5" + URL + "https://github.com/hunter-packages/curl/archive/hunter-7.49.1-v5.tar.gz" + SHA1 + 159d73e83f6cde54469c838234d32ed917ec9b80 +) + +hunter_add_version( + PACKAGE_NAME + CURL + VERSION + "7.49.1-DEV-v8" + URL + "https://github.com/hunter-packages/curl/archive/hunter-7.49.1-v8.tar.gz" + SHA1 + 3ac2684e3274c17ca209731e121e9a0acc79e4a5 +) + +hunter_add_version( + PACKAGE_NAME + CURL + VERSION + "7.49.1-DEV-v9" + URL + "https://github.com/hunter-packages/curl/archive/hunter-7.49.1-v9.tar.gz" + SHA1 + 4d4cb6e5faebfceaafa152bb3572c4760f1745cf +) + +hunter_add_version( + PACKAGE_NAME + CURL + VERSION + "7.59.0-p0" + URL + "https://github.com/hunter-packages/curl/archive/v7.59.0-p0.tar.gz" + SHA1 + 55c76e06ec28c5641cd5c2f9d1b6666d25362c5b +) + +hunter_add_version( + PACKAGE_NAME + CURL + VERSION + "7.59.0-p1" + URL + "https://github.com/hunter-packages/curl/archive/v7.59.0-p1.tar.gz" + SHA1 + 7d8190ad978591d621db1066b96f90722d68a00d +) +hunter_add_version( + PACKAGE_NAME + CURL + VERSION + "7.60.0-p0" + URL + "https://github.com/hunter-packages/curl/archive/v7.60.0-p0.tar.gz" + SHA1 + 53b5065094322323ed38840012eee42c5d4d1640 +) + +hunter_add_version( + PACKAGE_NAME + CURL + VERSION + "7.60.0-p2" + URL + "https://github.com/hunter-packages/curl/archive/v7.60.0-p2.tar.gz" + SHA1 + c15efe3c6c77c5f5d5b098b73d31cc3fbbc0d2fc +) + +if (ANDROID OR IOS OR RASPBERRY_PI OR OPENWRT) + set(_curl_cmake_args + HAVE_FSETXATTR_5=0 + HAVE_FSETXATTR_5__TRYRUN_OUTPUT="" + HAVE_FSETXATTR_6=0 + HAVE_FSETXATTR_6__TRYRUN_OUTPUT="" + HAVE_GLIBC_STRERROR_R=1 + HAVE_GLIBC_STRERROR_R__TRYRUN_OUTPUT="" + HAVE_POLL_FINE_EXITCODE=0 + HAVE_POLL_FINE_EXITCODE__TRYRUN_OUTPUT="" + HAVE_POSIX_STRERROR_R=0 + HAVE_POSIX_STRERROR_R__TRYRUN_OUTPUT="" + ) +else() + set(_curl_cmake_args "") +endif() hunter_cmake_args( CURL @@ -35,11 +122,10 @@ hunter_cmake_args( BUILD_CURL_EXE=OFF CMAKE_USE_OPENSSL=ON CMAKE_USE_LIBSSH2=OFF - ) - - + BUILD_TESTING=OFF + ${_curl_cmake_args} +) -# Pick a download scheme hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(CURL) hunter_download(PACKAGE_NAME CURL) diff --git a/cmake/projects/Clang/hunter.cmake b/cmake/projects/Clang/hunter.cmake index fd07fd2fe..1d699f86c 100644 --- a/cmake/projects/Clang/hunter.cmake +++ b/cmake/projects/Clang/hunter.cmake @@ -7,6 +7,39 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + Clang + VERSION + "6.0.1-p0" + URL + "https://github.com/hunter-packages/clang/archive/v6.0.1-p0.tar.gz" + SHA1 + b74a5f7b4fe4308d3c67413d2826aa3adf44411a +) + +hunter_add_version( + PACKAGE_NAME + Clang + VERSION + "4.0.1-p0" + URL + "https://github.com/hunter-packages/clang/archive/v4.0.1-p0.tar.gz" + SHA1 + cc2e74c852f57c946a4337812c73ce1bc97d639f +) + +hunter_add_version( + PACKAGE_NAME + Clang + VERSION + "3.6.2-p0" + URL + "https://github.com/hunter-packages/clang/archive/v3.6.2-p0.tar.gz" + SHA1 + a83fb5364829f3836cbf0104cb54500359d4ea8c +) + hunter_add_version( PACKAGE_NAME Clang diff --git a/cmake/projects/ClangToolsExtra/hunter.cmake b/cmake/projects/ClangToolsExtra/hunter.cmake index ff4544e3f..2ff62e291 100644 --- a/cmake/projects/ClangToolsExtra/hunter.cmake +++ b/cmake/projects/ClangToolsExtra/hunter.cmake @@ -7,6 +7,28 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + ClangToolsExtra + VERSION + "6.0.1" + URL + "http://llvm.org/releases/6.0.1/clang-tools-extra-6.0.1.src.tar.xz" + SHA1 + 0e4077e46dba66f9db17eb55b1e913b44cb19fd3 +) + +hunter_add_version( + PACKAGE_NAME + ClangToolsExtra + VERSION + "4.0.1" + URL + "http://llvm.org/releases/4.0.1/clang-tools-extra-4.0.1.src.tar.xz" + SHA1 + 414ccbadc4ba0658b34421a3855784af4e767796 +) + hunter_add_version( PACKAGE_NAME ClangToolsExtra diff --git a/cmake/projects/CppNetlibUri/hunter.cmake b/cmake/projects/CppNetlibUri/hunter.cmake index d5f1d389a..bced551dd 100644 --- a/cmake/projects/CppNetlibUri/hunter.cmake +++ b/cmake/projects/CppNetlibUri/hunter.cmake @@ -7,6 +7,17 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + CppNetlibUri + VERSION + "1.0.5-hunter" + URL + "https://github.com/hunter-packages/uri/archive/v1.0.5-hunter.tar.gz" + SHA1 + b61a81998e7636bc3d80668e6629b3844bb4a28a +) + hunter_add_version( PACKAGE_NAME CppNetlibUri diff --git a/cmake/projects/Eigen/hunter.cmake b/cmake/projects/Eigen/hunter.cmake index 0b3661a84..6260018b6 100644 --- a/cmake/projects/Eigen/hunter.cmake +++ b/cmake/projects/Eigen/hunter.cmake @@ -17,25 +17,147 @@ hunter_add_version( PACKAGE_NAME Eigen VERSION - "3.2.4-p0" + "3.3.7" URL - "https://github.com/hunter-packages/eigen/archive/v3.2.4-p0.tar.gz" + "https://github.com/eigenteam/eigen-git-mirror/archive/3.3.7.tar.gz" SHA1 - 6fd638939dfd3a3be1cf0ea920160591ed60f76d + 3a299537e429a3a11e4038616b867d004014f262 ) hunter_add_version( PACKAGE_NAME Eigen VERSION - "3.2.4" + "3.3.6" URL - "https://bitbucket.org/eigen/eigen/get/3.2.4.tar.gz" + "https://github.com/eigenteam/eigen-git-mirror/archive/3.3.6.tar.gz" SHA1 - b826f665bdfe31784795eef79c75540db71ab702 + 328824ffd5487f989e27326133d2d9106acc4fdd ) -hunter_cmake_args(Eigen CMAKE_ARGS EIGEN_ENABLE_TESTING=OFF) +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "3.3.5" + URL + "https://github.com/eigenteam/eigen-git-mirror/archive/3.3.5.tar.gz" + SHA1 + c1801a3b37c7fd734c756b9dce4d00a3cd685b7a +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "3.3.4-p1" + URL + "https://github.com/hunter-packages/eigen/archive/v3.3.4-p1.tar.gz" + SHA1 + f7f21eed71df17707c7c25eb17e25f844b2d63a2 +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "3.3.4-p0" + URL + "https://github.com/hunter-packages/eigen/archive/v3.3.4-p0.tar.gz" + SHA1 + 49dee30c5fedd8613a144f9bf6551fb46bb69e92 +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "3.3.3-p0" + URL + "https://github.com/hunter-packages/eigen/archive/v3.3.3-p0.tar.gz" + SHA1 + ed46aa311d2f6bc9dae06c3ac39cc53677e61400 +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "3.3.2-p0" + URL + "https://github.com/hunter-packages/eigen/archive/v3.3.2-p0.tar.gz" + SHA1 + b6bc33bb1acb0f853cc2b4e0c26d947bca510e1a +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "3.3.1-p3" + URL + "https://github.com/hunter-packages/eigen/archive/v3.3.1-p3.tar.gz" + SHA1 + 874fc1fb141f9fcd8537b4384c04b4e67ab3821f +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "3.3.1-p2" + URL + "https://github.com/hunter-packages/eigen/archive/v3.3.1-p2.tar.gz" + SHA1 + 0a15d912c3002bfb42e739235cfd650ab74bb5a6 +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "3.3.1-p4" + URL + "https://github.com/hunter-packages/eigen/archive/v3.3.1-p4.tar.gz" + SHA1 + 3ea6a95fb3b1b82c9a9c75fb50f5c87f7e0c9b1a +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "v0.0.0-429aa5254200-p1" + URL + "https://github.com/hunter-packages/eigen/archive/hunter-429aa5254200-p1.tar.gz" + SHA1 + 1229c01ecdf7388329233bd6a3f837307f80f569 +) + +hunter_add_version( + PACKAGE_NAME + Eigen + VERSION + "v0.0.0-429aa5254200-p0" + URL + "https://github.com/hunter-packages/eigen/archive/hunter-429aa5254200-p0.tar.gz" + SHA1 + 89e7e4419142f7a06fc59183f61c1f9333f2633b +) + +set(_android_args) +if(ANDROID) + set(_android_args EIGEN_DISABLE_CXX11_MATH=YES) +endif() + +# disable Eigen tests. Testcreation tries to find package 'Boost' +hunter_cmake_args( + Eigen + CMAKE_ARGS + BUILD_TESTING=OFF + HUNTER_INSTALL_LICENSE_FILES=COPYING.MPL2 + ${_android_args} +) # Pick a download scheme hunter_pick_scheme(DEFAULT url_sha1_cmake) diff --git a/cmake/projects/GPUImage/hunter.cmake b/cmake/projects/GPUImage/hunter.cmake index c7ab681ae..f43a3740a 100644 --- a/cmake/projects/GPUImage/hunter.cmake +++ b/cmake/projects/GPUImage/hunter.cmake @@ -17,10 +17,10 @@ hunter_add_version( URL "https://github.com/hunter-packages/GPUImage/archive/v0.1.6-p5.tar.gz" SHA1 - 463564d96442c214d21faa28a3ca229962ca086c - ) + 69a287016c57ca02012faf973e2eabda4ec87123 +) - hunter_add_version( +hunter_add_version( PACKAGE_NAME GPUImage VERSION @@ -28,8 +28,19 @@ hunter_add_version( URL "https://github.com/headupinclouds/GPUImage/archive/v0.1.6-p6.tar.gz" SHA1 - 230f9f9ba0fe1cce96827ea0cfc944b6df05ec34 - ) + 230f9f9ba0fe1cce96827ea0cfc944b6df05ec34 +) + +hunter_add_version( + PACKAGE_NAME + GPUImage + VERSION + "0.1.6-p9" + URL + "https://github.com/hunter-packages/GPUImage/archive/v0.1.6-p9.tar.gz" + SHA1 + ab3b4785d5767031d545e65ebe12a0910b5ef6b2 +) hunter_cmake_args( GPUImage diff --git a/cmake/projects/GTest/hunter.cmake b/cmake/projects/GTest/hunter.cmake index cc97961d5..b49083b5d 100644 --- a/cmake/projects/GTest/hunter.cmake +++ b/cmake/projects/GTest/hunter.cmake @@ -7,6 +7,7 @@ include(hunter_add_version) include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +include(hunter_cmake_args) hunter_add_version( PACKAGE_NAME @@ -145,12 +146,99 @@ hunter_add_version( GTest VERSION 1.8.0-hunter-p2 - URL + URL "https://github.com/hunter-packages/googletest/archive/1.8.0-hunter-p2.tar.gz" SHA1 93148cb8850abe78b76ed87158fdb6b9c48e38c4 ) +hunter_add_version( + PACKAGE_NAME + GTest + VERSION + 1.8.0-hunter-p5 + URL https://github.com/hunter-packages/googletest/archive/1.8.0-hunter-p5.tar.gz + SHA1 3325aa4fc8b30e665c9f73a60f19387b7db36f85 +) + +hunter_add_version( + PACKAGE_NAME + GTest + VERSION + 1.8.0-hunter-p6 + URL + "https://github.com/hunter-packages/googletest/archive/1.8.0-hunter-p6.tar.gz" + SHA1 + f57096bd01c6f8cbef043b312d4d1e82f29648b6 +) + +hunter_add_version( + PACKAGE_NAME + GTest + VERSION + 1.8.0-hunter-p7 + URL + "https://github.com/hunter-packages/googletest/archive/1.8.0-hunter-p7.tar.gz" + SHA1 + 4fe083a96d7597f7dce6f453dca01e1d94a1e45b +) + +hunter_add_version( + PACKAGE_NAME + GTest + VERSION + 1.8.0-hunter-p8 + URL + "https://github.com/hunter-packages/googletest/archive/1.8.0-hunter-p8.tar.gz" + SHA1 + 1cdd396b20c8d29f7ea08baaa49673b1c261f545 +) + +hunter_add_version( + PACKAGE_NAME + GTest + VERSION + 1.8.0-hunter-p9 + URL + "https://github.com/hunter-packages/googletest/archive/1.8.0-hunter-p9.tar.gz" + SHA1 + a345f16cb610e0b5dfa7778dc2852b784cfede5b +) + +hunter_add_version( + PACKAGE_NAME + GTest + VERSION + 1.8.0-hunter-p10 + URL + "https://github.com/hunter-packages/googletest/archive/1.8.0-hunter-p10.tar.gz" + SHA1 + 1d92c9f51af756410843b13f8c4e4df09e235394 +) + +hunter_add_version( + PACKAGE_NAME + GTest + VERSION + "1.8.0-hunter-p11" + URL + "https://github.com/hunter-packages/googletest/archive/1.8.0-hunter-p11.tar.gz" + SHA1 + 76c6aec038f7d7258bf5c4f45c4817b34039d285 +) + +if(HUNTER_GTest_VERSION VERSION_LESS 1.8.0) + set(_gtest_license "LICENSE") +else() + set(_gtest_license "googletest/LICENSE") +endif() + +hunter_cmake_args( + GTest + CMAKE_ARGS + HUNTER_INSTALL_LICENSE_FILES=${_gtest_license} +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(GTest) hunter_download(PACKAGE_NAME GTest PACKAGE_INTERNAL_DEPS_ID 1) diff --git a/cmake/projects/IntSizeof/hunter.cmake b/cmake/projects/IntSizeof/hunter.cmake deleted file mode 100644 index 82f66348c..000000000 --- a/cmake/projects/IntSizeof/hunter.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2014, Ruslan Baratov -# All rights reserved. - -# !!! DO NOT PLACE HEADER GUARDS HERE !!! - -include(hunter_add_version) -include(hunter_download) -include(hunter_pick_scheme) - -hunter_add_version( - PACKAGE_NAME - IntSizeof - VERSION - "1.0.0" - URL - "https://github.com/ruslo/intsizeof/archive/v1.0.0.tar.gz" - SHA1 - 9959e0e29c88fe414ba082fb28a722e411682bb3 -) - -hunter_pick_scheme(DEFAULT url_sha1_cmake) -hunter_download(PACKAGE_NAME IntSizeof) diff --git a/cmake/projects/Jpeg/hunter.cmake b/cmake/projects/Jpeg/hunter.cmake index d94818fda..abdf1cc8c 100644 --- a/cmake/projects/Jpeg/hunter.cmake +++ b/cmake/projects/Jpeg/hunter.cmake @@ -8,6 +8,17 @@ include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + Jpeg + VERSION + "9b-p3" + URL + "https://github.com/hunter-packages/jpeg/archive/v9b-p3.tar.gz" + SHA1 + 41f208215d59be34868c1f23b1fd0ee3f9934b9b +) + hunter_add_version( PACKAGE_NAME Jpeg @@ -30,6 +41,17 @@ hunter_add_version( 70769f349fdf346851f2e7fc4c5f603cd8960ae4 ) +hunter_add_version( + PACKAGE_NAME + Jpeg + VERSION + "9c-p0" + URL + "https://github.com/hunter-packages/jpeg/archive/v9c-p0.tar.gz" + SHA1 + 42ff243ae28bdda5b4df5c47fb727272a534dc94 +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(Jpeg) hunter_download(PACKAGE_NAME Jpeg) diff --git a/cmake/projects/LLVM/hunter.cmake b/cmake/projects/LLVM/hunter.cmake index a92b0f0eb..a3bde354d 100644 --- a/cmake/projects/LLVM/hunter.cmake +++ b/cmake/projects/LLVM/hunter.cmake @@ -1,18 +1,48 @@ -# Copyright (c) 2014, Ruslan Baratov +# Copyright (c) 2014-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! include(hunter_add_version) +include(hunter_cacheable) include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) include(hunter_report_broken_package) -hunter_add_package(Clang) # CLANG_ROOT -hunter_add_package(ClangToolsExtra) # CLANGTOOLSEXTRA_ROOT -hunter_add_package(LLVMCompilerRT) # LLVMCOMPILERRT_ROOT +hunter_add_version( + PACKAGE_NAME + LLVM + VERSION + "6.0.1-p0" + URL + "https://github.com/hunter-packages/llvm/archive/v6.0.1-p0.tar.gz" + SHA1 + 0942eedb9f349f3de7c483600de026192cc9e3ee +) + +hunter_add_version( + PACKAGE_NAME + LLVM + VERSION + "4.0.1-p0" + URL + "https://github.com/hunter-packages/llvm/archive/v4.0.1-p0.tar.gz" + SHA1 + fd70af82551d3a693c4270d71e994b810f33f593 +) + +hunter_add_version( + PACKAGE_NAME + LLVM + VERSION + "3.6.2-p0" + URL + "https://github.com/hunter-packages/llvm/archive/v3.6.2-p0.tar.gz" + SHA1 + 81eed993cbbc7243597a4b16d2e371618156396b +) hunter_add_version( PACKAGE_NAME @@ -61,9 +91,6 @@ hunter_add_version( hunter_cmake_args( LLVM CMAKE_ARGS - "LLVM_EXTERNAL_CLANG_SOURCE_DIR=${CLANG_ROOT}" - "LLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR=${CLANGTOOLSEXTRA_ROOT}" - "LLVM_EXTERNAL_COMPILER_RT_SOURCE_DIR=${LLVMCOMPILERRT_ROOT}" LLVM_INCLUDE_EXAMPLES=OFF LLVM_INCLUDE_TESTS=OFF LLVM_INCLUDE_DOCS=OFF @@ -72,7 +99,7 @@ hunter_cmake_args( hunter_configuration_types(LLVM CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_cmake) -if(MSVC_IDE) +if(MSVC_IDE AND HUNTER_LLVM_VERSION VERSION_LESS 4.0.1) hunter_report_broken_package( "LLVM build broken on Visual Studio, see:" "http://llvm.1065342.n5.nabble.com/Install-Problem-of-Compiler-rt-with-Visual-Studio-Express-2013-for-Windows-Desktop-td66575.html" @@ -80,8 +107,5 @@ if(MSVC_IDE) ) endif() -hunter_download( - PACKAGE_NAME LLVM - # Explicit dependencies since LLVM is not hunterized - PACKAGE_DEPENDS_ON Clang ClangToolsExtra LLVMCompilerRT -) +hunter_cacheable(LLVM) +hunter_download(PACKAGE_NAME LLVM) diff --git a/cmake/projects/LLVMCompilerRT/hunter.cmake b/cmake/projects/LLVMCompilerRT/hunter.cmake index dd751ccf2..5aba84e4f 100644 --- a/cmake/projects/LLVMCompilerRT/hunter.cmake +++ b/cmake/projects/LLVMCompilerRT/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ruslan Baratov +# Copyright (c) 2014-2018, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -7,6 +7,28 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + LLVMCompilerRT + VERSION + "6.0.1" + URL + "http://releases.llvm.org/6.0.1/compiler-rt-6.0.1.src.tar.xz" + SHA1 + 4a61bd09f31d3079e921205bb93fb7d05a95946b +) + +hunter_add_version( + PACKAGE_NAME + LLVMCompilerRT + VERSION + "4.0.1-patched" + URL + "https://github.com/hunter-packages/LLVMCompilerRT/archive/v4.0.1-p0.tar.gz" + SHA1 + 561c29f1595c29f1d083567a7e669fec30cdfa44 +) + hunter_add_version( PACKAGE_NAME LLVMCompilerRT diff --git a/cmake/projects/Leathers/hunter.cmake b/cmake/projects/Leathers/hunter.cmake index 0f3e6203e..10f51c1d8 100644 --- a/cmake/projects/Leathers/hunter.cmake +++ b/cmake/projects/Leathers/hunter.cmake @@ -3,8 +3,8 @@ # !!! DO NOT PLACE HEADER GUARDS HERE !!! -include(hunter_add_package) include(hunter_add_version) +include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) @@ -74,5 +74,17 @@ hunter_add_version( 390df257a5b22087c96f67a08b52902e7dea1bc2 ) +hunter_add_version( + PACKAGE_NAME + Leathers + VERSION + "0.1.8" + URL + "https://github.com/ruslo/leathers/archive/v0.1.8.tar.gz" + SHA1 + 04800eba37499e5a14532ccaff239911adff3a6c +) + +hunter_cacheable(Leathers) hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_download(PACKAGE_NAME Leathers) diff --git a/cmake/projects/Libssh2/hunter.cmake b/cmake/projects/Libssh2/hunter.cmake index a9fdc0dd7..8bb528877 100644 --- a/cmake/projects/Libssh2/hunter.cmake +++ b/cmake/projects/Libssh2/hunter.cmake @@ -4,6 +4,7 @@ # !!! DO NOT PLACE HEADER GUARDS HERE !!! include(hunter_add_version) +include(hunter_cacheable) include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) @@ -14,9 +15,9 @@ hunter_add_version( VERSION "1.7.0" URL - "https://github.com/hunter-packages/libssh2/archive/libssh2-1.7.0-hunter-2.tar.gz" + "https://github.com/hunter-packages/libssh2/archive/libssh2-1.7.0-hunter-4.tar.gz" SHA1 - 284191652e208daf34018e7938e6ee6db9f99931 + 7e69321f9d09d53ecb367fc571ef303d0986147e ) hunter_add_version( @@ -50,4 +51,5 @@ hunter_cmake_args( ) hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Libssh2) hunter_download(PACKAGE_NAME Libssh2) diff --git a/cmake/projects/Lua/hunter.cmake b/cmake/projects/Lua/hunter.cmake index d8cc6be30..d44fb23ab 100644 --- a/cmake/projects/Lua/hunter.cmake +++ b/cmake/projects/Lua/hunter.cmake @@ -19,7 +19,65 @@ hunter_add_version( 0697a2fa7fc657aac91e0a31f9f7709aebf1e3db ) -hunter_configuration_types(Lua CONFIGURATION_TYPES Release) +hunter_add_version( + PACKAGE_NAME + Lua + VERSION + "5.3.2-p2" + URL + "https://github.com/hunter-packages/lua/archive/v5.3.2-p2.tar.gz" + SHA1 + 6512fca43e01209f6e69803558d346ea767e52fc +) + +# NOTE: Test '5.1.*' version with 'toluapp' package (!) +hunter_add_version( + PACKAGE_NAME + Lua + VERSION + "5.1.5-p0" + URL + "https://github.com/hunter-packages/lua/archive/v5.1.5-p0.tar.gz" + SHA1 + 70005ecaca16c155e684d966fc3e2b6ce8a70d6f +) + +# NOTE: Test '5.1.*' version with 'toluapp' package (!) +hunter_add_version( + PACKAGE_NAME + Lua + VERSION + "5.1.5-p1" + URL + "https://github.com/hunter-packages/lua/archive/v5.1.5-p1.tar.gz" + SHA1 + 5387f5408ce189b2b34741ab4b28c0936b6bcbe3 +) + +# NOTE: Test '5.1.*' version with 'toluapp' package (!) +hunter_add_version( + PACKAGE_NAME + Lua + VERSION + "5.1.5-p2" + URL + "https://github.com/hunter-packages/lua/archive/v5.1.5-p2.tar.gz" + SHA1 + cc804e53073686f31f59629dbc964538c60be521 +) + +# NOTE: Test '5.1.*' version with 'toluapp' package (!) +hunter_add_version( + PACKAGE_NAME + Lua + VERSION + "5.1.5-p3" + URL + "https://github.com/hunter-packages/lua/archive/v5.1.5-p3.tar.gz" + SHA1 + 9732277f78be6be26633f3cd8e3f810d8431ed51 +) + hunter_cacheable(Lua) hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_download(PACKAGE_NAME Lua) diff --git a/cmake/projects/MySQL-client/hunter.cmake b/cmake/projects/MySQL-client/hunter.cmake index 1ae26edf6..a4386be55 100644 --- a/cmake/projects/MySQL-client/hunter.cmake +++ b/cmake/projects/MySQL-client/hunter.cmake @@ -19,10 +19,42 @@ hunter_add_version( SHA1 2444586365c2c58e7ca2397d4617e5fe19f9f246 ) -# CONFIGURATION_TYPES is set to Release, because Debug is bugged at the moment -# see https://github.com/ruslo/hunter/issues/303 -hunter_configuration_types(MySQL-client CONFIGURATION_TYPES Release) -hunter_cacheable(MySQL-client) + +hunter_add_version( + PACKAGE_NAME + MySQL-client + VERSION + "6.1.9" + URL + "https://github.com/hunter-packages/mysql-client/archive/v1.6.9.tar.gz" + SHA1 + 3268345d8e324d11380cd26475e1669bc5ff2fa0 +) + +hunter_add_version( + PACKAGE_NAME + MySQL-client + VERSION + "6.1.9-p0" + URL + "https://github.com/hunter-packages/mysql-client/archive/v1.6.9-p0.tar.gz" + SHA1 + 64c3fb0500e03fc0ee188dca1ec33e52c2f54e32 +) + +hunter_add_version( + PACKAGE_NAME + MySQL-client + VERSION + "6.1.9-p1" + URL + "https://github.com/hunter-packages/mysql-client/archive/v1.6.9-p1.tar.gz" + SHA1 + 8c9d00495194955529e4b1074d5bafba9e0882a1 +) + +# https://github.com/ruslo/hunter/issues/705 +# hunter_cacheable(MySQL-client) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_download(PACKAGE_NAME MySQL-client) - diff --git a/cmake/projects/OpenBLAS/hunter.cmake b/cmake/projects/OpenBLAS/hunter.cmake index 02804e7e7..eb7b87021 100644 --- a/cmake/projects/OpenBLAS/hunter.cmake +++ b/cmake/projects/OpenBLAS/hunter.cmake @@ -7,8 +7,54 @@ include(hunter_add_version) include(hunter_cacheable) include(hunter_configuration_types) include(hunter_pick_scheme) +include(hunter_cmake_args) include(hunter_download) + +hunter_add_version( + PACKAGE_NAME + OpenBLAS + VERSION + 0.3.3 + URL + "https://github.com/xianyi/OpenBLAS/archive/v0.3.3.tar.gz" + SHA1 + bff159c528c1a860cee4976114d224da32d302a2 +) + +hunter_add_version( + PACKAGE_NAME + OpenBLAS + VERSION + 0.3.1-p0 + URL + "https://github.com/hunter-packages/OpenBLAS/archive/v0.3.1-p0.tar.gz" + SHA1 + b525caa851e9cfb9e1756e42c8b4ee4877e98b9f +) + +hunter_add_version( + PACKAGE_NAME + OpenBLAS + VERSION + 0.3.0-p2 + URL + "https://github.com/hunter-packages/OpenBLAS/archive/v0.3.0-p2.tar.gz" + SHA1 + 15875c6968eef0af7871d3cf91224570fece40cf +) + +hunter_add_version( + PACKAGE_NAME + OpenBLAS + VERSION + 0.2.20-p0 + URL + "https://github.com/hunter-packages/OpenBLAS/archive/v0.2.20-p0.tar.gz" + SHA1 + 8f56263dda492f18972e55d51911a419d37eaba4 +) + hunter_add_version( PACKAGE_NAME OpenBLAS @@ -21,10 +67,25 @@ hunter_add_version( ) hunter_configuration_types(OpenBLAS CONFIGURATION_TYPES Release) -hunter_pick_scheme(DEFAULT OpenBLAS) +if(HUNTER_OpenBLAS_VERSION VERSION_LESS 0.3.1) + hunter_pick_scheme(DEFAULT OpenBLAS) + set( + _openblas_unrelocatable_text_files + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/cmake/openblas/OpenBLASConfig.cmake" + ) +else() + hunter_cmake_args( + OpenBLAS + CMAKE_ARGS + NOFORTRAN=1 + ) + hunter_pick_scheme(DEFAULT url_sha1_cmake) + set(_openblas_unrelocatable_text_files "") +endif() hunter_cacheable(OpenBLAS) hunter_download( PACKAGE_NAME OpenBLAS - PACKAGE_UNRELOCATABLE_TEXT_FILES - "lib/cmake/openblas/OpenBLASConfig.cmake" + PACKAGE_INTERNAL_DEPS_ID "2" + ${_openblas_unrelocatable_text_files} ) diff --git a/cmake/projects/OpenBLAS/schemes/OpenBLAS.cmake.in b/cmake/projects/OpenBLAS/schemes/OpenBLAS.cmake.in index 8218ddc2c..a1cb41af5 100644 --- a/cmake/projects/OpenBLAS/schemes/OpenBLAS.cmake.in +++ b/cmake/projects/OpenBLAS/schemes/OpenBLAS.cmake.in @@ -8,26 +8,28 @@ include(ExternalProject) # ExternalProject_Add include("@HUNTER_SELF@/cmake/Hunter") -include(hunter_fatal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_user_error) +include(hunter_dump_cmake_flags) hunter_status_debug("Scheme: OpenBLAS") if("@MSVC@") - hunter_fatal_error("Not supported with Visual Studio") + hunter_user_error("Not supported with Visual Studio") endif() # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") set(cfg_types "@HUNTER_PACKAGE_CONFIGURATION_TYPES@") @@ -41,6 +43,7 @@ endif() string(TOUPPER "${cfg_types}" config_type) +hunter_dump_cmake_flags() set(cflags "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${config_type}}") if(NOT BUILD_SHARED_LIBS) @@ -49,6 +52,44 @@ else() set(lib_type "") endif() +set(compiler_arg "@CMAKE_C_COMPILER@") + + +if(CMAKE_CROSSCOMPILING OR ANDROID) + # Tells OpenBLAS where to find host CC (HOSTCC=) + # and not to run tests (CROSS=1) + # and not to use fortran (NOFORTRAN=1) + # Feel free to implement cross fortran + + # What is HOSTCC? + set(HOSTCC gcc) + if($ENV{CC}) + set(HOSTCC $ENV{CC}) + elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") + set(HOSTCC "clang") + endif() + + set(cross_arg HOSTCC=${HOSTCC} CROSS=1 NOFORTRAN=1 ONLY_CBLAS=1) + + # We also need to manually set target when cross compiling + if(ANDROID) + if(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a") + set(target_arg TARGET=ARMV7 BINARY=32 ARM_SOFTFP_ABI=1) + elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a") + set(target_arg TARGET=CORTEXA57 BINARY=64) + elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "x86") + set(target_arg TARGET=CORE2 BINARY=32) + elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "x86_64") + set(target_arg TARGET=PENRYN BINARY=64) + endif() + elseif(IOS) + set(target_arg TARGET=generic) + endif() +else() + set(target_arg "") + set(cross_arg "") +endif() + ExternalProject_Add( "@HUNTER_EP_NAME@" URL @@ -57,6 +98,8 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -65,15 +108,16 @@ ExternalProject_Add( CONFIGURE_COMMAND "" BUILD_COMMAND - make ${lib_type} "CC=@CMAKE_C_COMPILER@" "CFLAGS=${cflags}" + make ${lib_type} ${target_arg} ${cross_arg} "CC=${compiler_arg} ${cflags}" "AR=@CMAKE_AR@" BUILD_IN_SOURCE 1 INSTALL_COMMAND - make ${lib_type} "PREFIX=@HUNTER_PACKAGE_INSTALL_PREFIX@" install + make ${lib_type} ${target_arg} ${cross_arg} "CC=${compiler_arg} ${cflags}" "AR=@CMAKE_AR@" "PREFIX=@HUNTER_PACKAGE_INSTALL_PREFIX@" install COMMAND # Copy license files "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" -P - "@HUNTER_GLOBAL_SCRIPT_DIR@/try-copy-license.cmake" + "@HUNTER_SELF@/scripts/try-copy-license.cmake" ) diff --git a/cmake/projects/OpenCV-Extra/hunter.cmake b/cmake/projects/OpenCV-Extra/hunter.cmake index d7b2a73ba..93161a4e8 100644 --- a/cmake/projects/OpenCV-Extra/hunter.cmake +++ b/cmake/projects/OpenCV-Extra/hunter.cmake @@ -7,6 +7,105 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "4.0.0" + URL + "https://github.com/opencv/opencv_contrib/archive/4.0.0.tar.gz" + SHA1 + 4c10c8cb288a320b47ec7e87a0fdcf5a8df0f49d +) + +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "3.4.6" + URL + "https://github.com/opencv/opencv_contrib/archive/3.4.6.tar.gz" + SHA1 + f87e11ac00550529853f19871429d062ef446c35 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "3.4.3" + URL + "https://github.com/opencv/opencv_contrib/archive/3.4.3.tar.gz" + SHA1 + 2c70868a9c2accae23e8f382885d3e4f97030978 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "3.4.2" + URL + "https://github.com/opencv/opencv_contrib/archive/3.4.2.tar.gz" + SHA1 + 34dcdd3a77f24271d5615837a2e253af1922c1ea +) + +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "3.4.1" + URL + "https://github.com/opencv/opencv_contrib/archive/3.4.1.tar.gz" + SHA1 + 638d6f0e0afe0fef511c0889c766f3350457ca94 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "3.4.0" + URL + "https://github.com/opencv/opencv_contrib/archive/3.4.0.tar.gz" + SHA1 + e7ba971a30fe85e87de606d8cdf3b3bf4cc3da14 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "3.3.1" + URL + "https://github.com/opencv/opencv_contrib/archive/3.3.1.tar.gz" + SHA1 + 3c9167e14af097762f1d689355929c964260ada1 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "3.3.0" + URL + "https://github.com/opencv/opencv_contrib/archive/3.3.0.tar.gz" + SHA1 + d97d80f8887416f4d8353f10fc4812a21909f84a +) + +hunter_add_version( + PACKAGE_NAME + OpenCV-Extra + VERSION + "3.2.0" + URL + "https://github.com/Itseez/opencv_contrib/archive/3.2.0.tar.gz" + SHA1 + fa8ac06b8f6ad0a290106077f64b2a886055fd53 +) + hunter_add_version( PACKAGE_NAME OpenCV-Extra diff --git a/cmake/projects/OpenCV/hunter.cmake b/cmake/projects/OpenCV/hunter.cmake index d2870d8af..ad0c05051 100644 --- a/cmake/projects/OpenCV/hunter.cmake +++ b/cmake/projects/OpenCV/hunter.cmake @@ -12,6 +12,203 @@ include(hunter_download) include(hunter_pick_scheme) # List of versions here... +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "4.0.0-p3" + URL + "https://github.com/hunter-packages/opencv/archive/v4.0.0-p3.tar.gz" + SHA1 + f28f59b2fcd96f2b95fb8501be043662b20d3d55 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "4.0.0-p2" + URL + "https://github.com/hunter-packages/opencv/archive/v4.0.0-p2.tar.gz" + SHA1 + 936414fd01ead11f6dd9b360cd477ab278eeaac6 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "4.0.0-p0" + URL + "https://github.com/hunter-packages/opencv/archive/v4.0.0-p0.tar.gz" + SHA1 + 90680ea3b971c2323e0049c48fa7867a1fd9f3fe +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.4.6-p0" + URL + "https://github.com/hunter-packages/opencv/archive/v3.4.6-p0.tar.gz" + SHA1 + 70f4da99e5d824c463848d4df8667d5d705af141 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.4.3-p4" + URL + "https://github.com/hunter-packages/opencv/archive/v3.4.3-p4.tar.gz" + SHA1 + f1af13fd24cdb433240b1046b5e1391bb19ee748 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.4.3-p2" + URL + "https://github.com/hunter-packages/opencv/archive/v3.4.3-p2.tar.gz" + SHA1 + 9006574a1a777329fbbdd95c3835f0b3e64c59b6 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.4.3-p1" + URL + "https://github.com/hunter-packages/opencv/archive/v3.4.3-p1.tar.gz" + SHA1 + 3589a7f19fdaef200091231c4255c5e5bb70b217 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.4.1-p1" + URL + "https://github.com/hunter-packages/opencv/archive/v3.4.1-p1.tar.gz" + SHA1 + a3f4f0a29e14eb3ff4ebf834f5505ff63b384332 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.4.1-p0" + URL + "https://github.com/hunter-packages/opencv/archive/v3.4.1-p0.tar.gz" + SHA1 + cae0b9c141ca372629f65d09a780e820ea87ae49 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.4.0-p0" + URL + "https://github.com/hunter-packages/opencv/archive/v3.4.0-p0.tar.gz" + SHA1 + f4c4e8711cfe6b1aec5178dfeb3cd503fd24c9a8 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.3.1-p1" + URL + "https://github.com/hunter-packages/opencv/archive/v3.3.1-p1.tar.gz" + SHA1 + 2efff02ce7f3be1454dc2c41d536124a4a6ee048 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.3.1-p0" + URL + "https://github.com/hunter-packages/opencv/archive/v3.3.1-p0.tar.gz" + SHA1 + cca79df3db45c1a1d8da3a4952d04d69c1710508 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.3.0-p2" + URL + "https://github.com/hunter-packages/opencv/archive/v3.3.0-p2.tar.gz" + SHA1 + 27be59f7978a4625401a1041af8d108a47ae745b +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.3.0-p0" + URL + "https://github.com/hunter-packages/opencv/archive/v3.3.0-p0.tar.gz" + SHA1 + fc351142139be71b366458fa1572ab004c871774 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.2.0-p2" + URL + "https://github.com/hunter-packages/opencv/archive/v3.2.0-p2.tar.gz" + SHA1 + ea8f612eea55dfa6d2f3669d5e9eb4240417444b +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.2.0-p1" + URL + "https://github.com/hunter-packages/opencv/archive/v3.2.0-p1.tar.gz" + SHA1 + be088ced81f1b725e1bb76a45806ab044107fba3 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.2.0-p0" + URL + "https://github.com/hunter-packages/opencv/releases/download/v3.2.0-p0/v3.2.0-p0.tar.gz" + SHA1 + 901f98202eb12dc2e1cc7f008204a9fb98ea0b13 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.1.0-p3" + URL + "https://github.com/hunter-packages/opencv/archive/v3.1.0-p3.tar.gz" + SHA1 + d1f235600e454bcc3ce7d746b6b706e89ed81acc +) hunter_add_version( PACKAGE_NAME @@ -44,8 +241,63 @@ hunter_add_version( "https://github.com/hunter-packages/opencv/archive/3.1.0-p0.tar.gz" SHA1 ab503105ce7e5415fc77cf44de0b276008be624f + ) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.0.0-p11" + URL + "https://github.com/hunter-packages/opencv/releases/download/v3.0.0-p11/v3.0.0-p11.tar.gz" + SHA1 + 3fa05fadc5c2b5e02ada00ccb7752ede660699ab ) +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.0.0-p10" + URL + "https://github.com/hunter-packages/opencv/archive/v3.0.0-p10.tar.gz" + SHA1 + 90bb9721231693b5999619aece8453b0710181d3 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.0.0-p9" + URL + "https://github.com/hunter-packages/opencv/archive/v3.0.0-p9.tar.gz" + SHA1 + b41a71206d0963dcdf934ecf8f0d7ff299c4b57c +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.0.0-p8" + URL + "https://github.com/hunter-packages/opencv/archive/v3.0.0-p8.tar.gz" + SHA1 + 8cff7617f0b2a4e59c8a6b0016207476c30ba7e8 +) + +hunter_add_version( + PACKAGE_NAME + OpenCV + VERSION + "3.0.0-p7" + URL + "https://github.com/hunter-packages/opencv/archive/v3.0.0-p7.tar.gz" + SHA1 + c1e6e32b146a4a19642bcd3ad7e36b4ddcd13ec3 + ) + hunter_add_version( PACKAGE_NAME OpenCV @@ -189,18 +441,18 @@ hunter_add_version( a0c2d5944364fc4f26b6160b33c03082b1fa08c1 ) -string(COMPARE EQUAL "${CMAKE_OSX_SYSROOT}" "iphoneos" _is_ios) - -if(_is_ios) - set(_ios_args ENABLE_NEON=ON) +if(ANDROID) + # This feature doesn't work with new CMake 3.7+ toolchains + set(_android_args ENABLE_PRECOMPILED_HEADERS=OFF) else() - set(_ios_args "") + set(_android_args "") endif() hunter_cmake_args( OpenCV CMAKE_ARGS BUILD_ANDROID_EXAMPLES=OFF + BUILD_JAVA=OFF BUILD_DOCS=OFF BUILD_EXAMPLES=OFF BUILD_PERF_TESTS=OFF @@ -208,16 +460,27 @@ hunter_cmake_args( BUILD_opencv_apps=OFF INSTALL_PYTHON_EXAMPLES=OFF BUILD_WITH_STATIC_CRT=OFF # Fix https://github.com/ruslo/hunter/issues/177 - ${_ios_args} + ${_android_args} # Find packages in Hunter (instead of building from OpenCV sources) BUILD_ZLIB=OFF BUILD_TIFF=OFF BUILD_PNG=OFF BUILD_JPEG=OFF + BUILD_JASPER=OFF + BUILD_WEBP=OFF # This stuff will build shared libraries. Build with PIC required for dependencies. BUILD_opencv_java=OFF BUILD_opencv_python2=OFF BUILD_opencv_python3=OFF + # There is not a CUDA package so need to stop OpenCV from searching for it, otherwise + # it might pick up the host version + WITH_CUDA=OFF + WITH_CUFFT=OFF + # Fix for https://travis-ci.org/xsacha/hunter/jobs/347083573 + BUILD_opencv_dnn=OFF + # Fix for https://travis-ci.org/ingenue/hunter/builds/452039597 + WITH_OPENEXR=OFF + WITH_FFMPEG=OFF ) # Pick a download scheme @@ -230,4 +493,7 @@ hunter_pick_scheme(DEFAULT url_sha1_cmake) # * libexample_Ad.a hunter_cacheable(OpenCV) -hunter_download(PACKAGE_NAME OpenCV) +hunter_download( + PACKAGE_NAME OpenCV + PACKAGE_INTERNAL_DEPS_ID "1" +) diff --git a/cmake/projects/OpenSSL/hunter.cmake b/cmake/projects/OpenSSL/hunter.cmake index f9c4aad53..b889b42ec 100755 --- a/cmake/projects/OpenSSL/hunter.cmake +++ b/cmake/projects/OpenSSL/hunter.cmake @@ -5,9 +5,55 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_check_toolchain_definition) +include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.1" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_1.tar.gz" + SHA1 + ac1f780b1932d9eed79787b388095ebeebddd148 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.1a" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_1a.tar.gz" + SHA1 + 0a7d7382e3e608fc037d4955a0ddad224acc1fc8 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.1b" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_1b.tar.gz" + SHA1 + 1b09930a6099c6c8fa15dd6c6842e134e65e0a31 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.1c" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_1c.tar.gz" + SHA1 + eb59b090bd757e30b676fb5e80c25ddb5a2f9511 +) + hunter_add_version( PACKAGE_NAME OpenSSL @@ -41,6 +87,171 @@ hunter_add_version( 783666315e96b8f55b28b5e1edcb7ed83e8bc79b ) +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.0e" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0e.tar.gz" + SHA1 + 14eaed8edc7e48fe1f01924fa4561c1865c9c8ac +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.0f" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0f.tar.gz" + SHA1 + 8fd0ba4c9bb98a1d380689704b132fe20c000a19 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.0g" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0g.tar.gz" + SHA1 + 07a8861dfb51d3ba983668f0f8daeac49bf3dbc3 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.0h" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0h.tar.gz" + SHA1 + 2168c88516556332ebaf7c31791132025a093c2b +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.0i" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0i.tar.gz" + SHA1 + f1748778e06f41e41e9585fd8815339867f22d30 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.0j" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0j.tar.gz" + SHA1 + 489c7a35a4ee2ab06006b2ee26791445b67293a4 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.1.0k" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0k.tar.gz" + SHA1 + 0a753deaa01df3a231759f3ed01fb0b8e14b5d59 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2s" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2s.tar.gz" + SHA1 + d3439055ac91862f69089e394f2d29832653de4d +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2r" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2r.tar.gz" + SHA1 + d4933f2974572edffa395cf9f90e6485652dc3a5 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2q" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2q.tar.gz" + SHA1 + d9d0876c1d3a06896308b0e0bf67a85c3dd87258 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2p" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2p.tar.gz" + SHA1 + 0c86f89bc272f204919230e7220c070ac486b9e6 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2o" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2o.tar.gz" + SHA1 + ec7ad3650206f1045d48f2fe9ed4ad93a1228ec5 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2n" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2n.tar.gz" + SHA1 + 6d507bb849c8156f14c2b6f3e269a5e782ff6b82 +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2l" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2l.tar.gz" + SHA1 + 5bea0957b371627e8ebbee5bef221519e94d547c +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2k" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2k.tar.gz" + SHA1 + 462944eff7b045d950deaaa86798190cbdc5278a +) + hunter_add_version( PACKAGE_NAME OpenSSL @@ -118,6 +329,28 @@ hunter_add_version( a233de65e91dc176f4e34be03899ae00eb1dd029 ) +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2m" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2m.tar.gz" + SHA1 + f0af7e246a677fd52945e5438eb11ce0de391a4c +) + +hunter_add_version( + PACKAGE_NAME + OpenSSL + VERSION + "1.0.2o" + URL + "https://github.com/openssl/openssl/archive/OpenSSL_1_0_2o.tar.gz" + SHA1 + ec7ad3650206f1045d48f2fe9ed4ad93a1228ec5 +) + hunter_add_version( PACKAGE_NAME OpenSSL @@ -250,17 +483,30 @@ hunter_add_version( 072cf2bc8e19c7c59a42e7e20977fe3037c9c9f3 ) -if(WIN32) +if(MINGW) + hunter_pick_scheme(DEFAULT url_sha1_openssl) +elseif(WIN32) if("${HUNTER_OpenSSL_VERSION}" VERSION_LESS "1.1") hunter_pick_scheme(DEFAULT url_sha1_openssl_windows) else() hunter_pick_scheme(DEFAULT url_sha1_openssl_windows_1_1_plus) endif() -elseif(IOS) - hunter_pick_scheme(DEFAULT url_sha1_openssl_ios) +elseif(APPLE) + if(IOS) + hunter_pick_scheme(DEFAULT url_sha1_openssl_ios) + else() + hunter_pick_scheme(DEFAULT url_sha1_openssl_macos) + endif() else() hunter_pick_scheme(DEFAULT url_sha1_openssl) endif() +if(MINGW) + hunter_check_toolchain_definition(NAME "__MINGW64__" DEFINED _hunter_mingw64) + if(_hunter_mingw64) + hunter_cmake_args(OpenSSL CMAKE_ARGS HUNTER_OPENSSL_MINGW64=TRUE) + endif() +endif() + hunter_cacheable(OpenSSL) -hunter_download(PACKAGE_NAME OpenSSL PACKAGE_INTERNAL_DEPS_ID 2) +hunter_download(PACKAGE_NAME OpenSSL PACKAGE_INTERNAL_DEPS_ID "29") diff --git a/cmake/projects/OpenSSL/schemes/url_sha1_openssl.cmake.in b/cmake/projects/OpenSSL/schemes/url_sha1_openssl.cmake.in index 910521a94..09cc4c5c3 100644 --- a/cmake/projects/OpenSSL/schemes/url_sha1_openssl.cmake.in +++ b/cmake/projects/OpenSSL/schemes/url_sha1_openssl.cmake.in @@ -10,31 +10,111 @@ include(ExternalProject) # ExternalProject_Add list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") +include(hunter_dump_cmake_flags) +include(hunter_pick_archiver) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) +include(hunter_user_error) hunter_status_debug("Scheme: url_sha1_openssl") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") -hunter_test_string_not_empty("@HUNTER_GLOBAL_SCRIPT_DIR@") - -if(APPLE) - set(configure_command "./Configure") - set(configure_opts "darwin64-x86_64-cc") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +if(ANDROID OR RASPBERRY_PI OR OPENWRT) + # -> CMAKE_AR + # -> CMAKE_RANLIB + hunter_pick_archiver() + + # Using the ./config script is currently broken with -no* CFLAGS on ALL versions + # * https://github.com/openssl/openssl/issues/3493 + # * https://github.com/openssl/openssl/blob/OpenSSL_1_1_0-stable/Configure#L560 + # * https://wiki.openssl.org/index.php/Compilation_and_Installation#Configure_.26_Config + set(configure_command AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} "./Configure") +elseif(MINGW) + if(HUNTER_OPENSSL_MINGW64) + set(configure_command "./Configure" mingw64) + else() + set(configure_command "./Configure" mingw) + endif() else() set(configure_command "./config") endif() +set(skip_includes SKIP_INCLUDES) +if(ANDROID) + set(skip_includes "") +endif() + +hunter_dump_cmake_flags(${skip_includes}) +# -> CMAKE_CXX_FLAGS +# -> CMAKE_C_FLAGS + +if(ANDROID) + string(COMPARE EQUAL "${CMAKE_ANDROID_ARCH}" "" _has_old_cmake) + string(COMPARE EQUAL "${ANDROID_ARCH_NAME}" "" _has_unexpected_toolchain) + if (NOT _has_old_cmake) + set(ANDROID_SSL_ARCH "${CMAKE_ANDROID_ARCH}") + elseif(NOT _has_unexpected_toolchain) + set(ANDROID_SSL_ARCH "${ANDROID_ARCH_NAME}") + else() + hunter_user_error("Could not find android architecture. Please set ANDROID_ARCH_NAME in your toolchain or use CMake 3.7+") + endif() + + # Building OpenSSL with Android: + # * https://wiki.openssl.org/index.php/Android#Build_the_OpenSSL_Library + # Set environment variables similar to 'setenv-android.sh' script: + # * https://wiki.openssl.org/index.php/Android#Adjust_the_Cross-Compile_Script + + # Using documented method (./config script): + #set(configure_command + # Ignored. Prevents ./config from checking host uname + # RELEASE=2.6.37 + # SYSTEM=android + # ARCH=${CMAKE_ANDROID_ARCH} + # ${configure_command}) + + # Using android-* targets is currently broken for Clang on ALL versions + # * https://github.com/openssl/openssl/pull/2229 + # The ./config script only detects Android x86 and armv7 targets anyway. + # * https://github.com/openssl/openssl/issues/2490 + if (ANDROID_SSL_ARCH MATCHES "mips64|arm64|x86_64") + set(configure_opts "linux-generic64") + else() + set(configure_opts "linux-generic32") + endif() + + # On Android '--sysroot' differs for compile and linker. + # With the '-l*' trick we can pass needed '--sysroot' to linker but not to + # compiler. + # + # Tested: + # * android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx + # * android-ndk-r17-api-24-arm64-v8a-clang-libcxx14 + # * android-ndk-r18-api-24-arm64-v8a-clang-libcxx14 + list(APPEND configure_opts "-latomic ${CMAKE_EXE_LINKER_FLAGS}") +elseif(RASPBERRY_PI) + set(configure_opts "linux-generic32") +elseif(OPENWRT) + set(configure_opts "linux-generic32" "no-async") +endif() + +string(REGEX REPLACE "^ " "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") + # Pass C compiler through -set(configure_command CC=${CMAKE_C_COMPILER} ${configure_command}) +set(configure_command + MACHINE=${CMAKE_SYSTEM_PROCESSOR} + CC=${CMAKE_C_COMPILER} + ${configure_command}) # Pass C flags through set(configure_opts ${configure_opts} ${CMAKE_C_FLAGS}) @@ -45,7 +125,16 @@ set( ) set(build_command . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && make) -set(configure_opts ${configure_opts} threads no-shared) +if (BUILD_SHARED_LIBS) + set(shared_flag shared) +else() + set(shared_flag no-shared) +endif() + +set(configure_opts ${configure_opts} threads ${shared_flag}) + +hunter_status_debug("Configure command: ${configure_command}") +hunter_status_debug("Configure options: ${configure_opts}") ExternalProject_Add( "@HUNTER_EP_NAME@" @@ -55,6 +144,8 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -74,8 +165,9 @@ ExternalProject_Add( # * https://github.com/openssl/openssl/issues/57 COMMAND # Copy license files "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" -P - "@HUNTER_GLOBAL_SCRIPT_DIR@/try-copy-license.cmake" + "@HUNTER_SELF@/scripts/try-copy-license.cmake" ) diff --git a/cmake/projects/OpenSSL/schemes/url_sha1_openssl_ios.cmake.in b/cmake/projects/OpenSSL/schemes/url_sha1_openssl_ios.cmake.in index 60e381c8c..9e6fc1a02 100644 --- a/cmake/projects/OpenSSL/schemes/url_sha1_openssl_ios.cmake.in +++ b/cmake/projects/OpenSSL/schemes/url_sha1_openssl_ios.cmake.in @@ -10,32 +10,44 @@ include(ExternalProject) # ExternalProject_Add list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") +include(hunter_dump_cmake_flags) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_unsetvar) hunter_status_debug("Scheme: url_sha1_openssl_ios") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") -hunter_test_string_not_empty("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") # Note: support for single architecture/native iOS builds (i.e., arm64) -hunter_test_string_not_empty("@IPHONEOS_ARCHS@@IPHONESIMULATOR_ARCHS@") -hunter_test_string_not_empty("@IOS_SDK_VERSION@") -hunter_test_string_not_empty("@IPHONESIMULATOR_ROOT@") -hunter_test_string_not_empty("@IPHONEOS_ROOT@") +hunter_assert_not_empty_string("@IPHONEOS_ARCHS@@IPHONESIMULATOR_ARCHS@") +hunter_assert_not_empty_string("@IOS_SDK_VERSION@") +hunter_assert_not_empty_string("@IPHONESIMULATOR_ROOT@") +hunter_assert_not_empty_string("@IPHONEOS_ROOT@") + +hunter_dump_cmake_flags(SKIP_INCLUDES) +# -> CMAKE_CXX_FLAGS +# -> CMAKE_C_FLAGS + +string(REGEX REPLACE "^ " "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") hunter_unsetvar(ssl_input_libraries) hunter_unsetvar(crypto_input_libraries) +set(configure_opts iphoneos-cross threads no-shared) +# Pass C flags through +set(configure_opts ${configure_opts} ${CMAKE_C_FLAGS}) + foreach(arch @IPHONEOS_ARCHS@ @IPHONESIMULATOR_ARCHS@) list( APPEND @@ -56,6 +68,8 @@ ExternalProject_Add( "" DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@/ios_universal" INSTALL_DIR @@ -77,23 +91,15 @@ ExternalProject_Add( ${crypto_input_libraries} -o "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/libcrypto.a" - COMMAND # Copy license files - "@CMAKE_COMMAND@" - "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" - -P - "@HUNTER_GLOBAL_SCRIPT_DIR@/try-copy-license.cmake" ) foreach(variant @IPHONEOS_ARCHS@ @IPHONESIMULATOR_ARCHS@) set(iphoneos_archs @IPHONEOS_ARCHS@) list(FIND iphoneos_archs ${variant} find_index) if(find_index EQUAL -1) - set(iphone_minversion "-miphoneos-version-min=@IOS_SDK_VERSION@") set(CROSS_TOP "@IPHONESIMULATOR_ROOT@") set(CROSS_SDK "iPhoneSimulator@IOS_SDK_VERSION@.sdk") else() - set(iphone_minversion "") set(CROSS_TOP "@IPHONEOS_ROOT@") set(CROSS_SDK "iPhoneOS@IOS_SDK_VERSION@.sdk") endif() @@ -115,6 +121,8 @@ foreach(variant @IPHONEOS_ARCHS@ @IPHONESIMULATOR_ARCHS@) SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@/${variant}" INSTALL_DIR @@ -122,12 +130,10 @@ foreach(variant @IPHONEOS_ARCHS@ @IPHONESIMULATOR_ARCHS@) # not used, just avoid creating Install/ empty directory CONFIGURE_COMMAND ./Configure - iphoneos-cross - threads - no-shared + "${configure_opts}" "${noasm}" + "no-async" "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@" - "${iphone_minversion}" "-arch ${variant}" BUILD_COMMAND . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && @@ -140,6 +146,13 @@ foreach(variant @IPHONEOS_ARCHS@ @IPHONESIMULATOR_ARCHS@) make install_sw # installed libraries will be rewrited, # other files are equal + COMMAND # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@/${variant}" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" ) add_dependencies( diff --git a/cmake/projects/OpenSSL/schemes/url_sha1_openssl_windows.cmake.in b/cmake/projects/OpenSSL/schemes/url_sha1_openssl_windows.cmake.in index f1f0de02e..81624eecb 100644 --- a/cmake/projects/OpenSSL/schemes/url_sha1_openssl_windows.cmake.in +++ b/cmake/projects/OpenSSL/schemes/url_sha1_openssl_windows.cmake.in @@ -6,6 +6,8 @@ project(Hunter) include(ExternalProject) # ExternalProject_Add +include("@HUNTER_SELF@/cmake/Hunter") + # Scheme for download and install OpenSSL library for Windows list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") @@ -13,22 +15,23 @@ list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_fatal_error) include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_openssl_windows") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_MSVC_ARCH@") -hunter_test_string_not_empty("@HUNTER_MSVC_VCVARSALL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") -hunter_test_string_not_empty("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_MSVC_ARCH@") +hunter_assert_not_empty_string("@HUNTER_MSVC_VCVARSALL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") # `find_package(Perl)` is not suitable because `perl` from # cygwin directory can be found @@ -52,19 +55,27 @@ if(NOT "${PERL_VERSION}" EQUAL 0) hunter_fatal_error( "OpenSSL: perl not found" - WIKI "error.openssl.perl.not.found" + ERROR_PAGE "error.openssl.perl.not.found" ) endif() string(COMPARE EQUAL "@HUNTER_MSVC_ARCH@" "amd64" is_amd64) if(is_amd64) - set(opt "VC-WIN64A") + set(arch "VC-WIN64A") set(do_ms do_win64a.bat) else() - set(opt "VC-WIN32") + set(arch "VC-WIN32") set(do_ms do_ms.bat) endif() +if(ASM_SUPPORT) + hunter_add_package(NASM) # set NASM_ROOT + set(opt "") +else() + set(NASM_ROOT "") + set(opt "no-asm") +endif() + if("@MSVC@") # Logging as Workaround for VS_UNICODE_OUTPUT issue: # https://public.kitware.com/Bug/view.php?id=14266 @@ -73,6 +84,25 @@ else() set(log_opts "") endif() +if(BUILD_SHARED_LIBS) + set(nt_makefile "ms\\ntdll.mak") +else() + set(nt_makefile "ms\\nt.mak") +endif() + +set(openssl_install_dir "@HUNTER_PACKAGE_INSTALL_PREFIX@") + +# Used variables: +# * openssl_install_dir +# * arch +# * opt +# * NASM_ROOT +# * do_ms +configure_file( + "@HUNTER_PACKAGE_SETUP_DIR@/ep-stages/configure.cmake.in" + "@HUNTER_PACKAGE_BUILD_DIR@/configure.cmake" + @ONLY) + ExternalProject_Add( "@HUNTER_EP_NAME@" URL @@ -81,6 +111,8 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -89,21 +121,20 @@ ExternalProject_Add( CONFIGURE_COMMAND "@HUNTER_MSVC_VCVARSALL@" "@HUNTER_MSVC_ARCH@" COMMAND - perl Configure "${opt}" no-asm "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@" - COMMAND - "ms\\${do_ms}" + "@CMAKE_COMMAND@" -P "@HUNTER_PACKAGE_BUILD_DIR@/configure.cmake" BUILD_COMMAND - nmake -f "ms\\nt.mak" + nmake -f "${nt_makefile}" BUILD_IN_SOURCE 1 INSTALL_COMMAND COMMAND - nmake -f "ms\\nt.mak" install + nmake -f "${nt_makefile}" install COMMAND # Copy license files "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" -P - "@HUNTER_GLOBAL_SCRIPT_DIR@/try-copy-license.cmake" + "@HUNTER_SELF@/scripts/try-copy-license.cmake" ${log_opts} ) diff --git a/cmake/projects/OpenSSL/schemes/url_sha1_openssl_windows_1_1_plus.cmake.in b/cmake/projects/OpenSSL/schemes/url_sha1_openssl_windows_1_1_plus.cmake.in index 05432a880..88e58cc8a 100644 --- a/cmake/projects/OpenSSL/schemes/url_sha1_openssl_windows_1_1_plus.cmake.in +++ b/cmake/projects/OpenSSL/schemes/url_sha1_openssl_windows_1_1_plus.cmake.in @@ -6,6 +6,8 @@ project(Hunter) include(ExternalProject) # ExternalProject_Add +include("@HUNTER_SELF@/cmake/Hunter") + # Scheme for download and install OpenSSL library for Windows list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") @@ -13,22 +15,23 @@ list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_fatal_error) include(hunter_internal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_openssl_windows_1_1_plus") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_MSVC_ARCH@") -hunter_test_string_not_empty("@HUNTER_MSVC_VCVARSALL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") -hunter_test_string_not_empty("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_MSVC_ARCH@") +hunter_assert_not_empty_string("@HUNTER_MSVC_VCVARSALL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") # `find_package(Perl)` is not suitable because `perl` from # cygwin directory can be found @@ -52,15 +55,23 @@ if(NOT "${PERL_VERSION}" EQUAL 0) hunter_fatal_error( "OpenSSL: perl not found" - WIKI "error.openssl.perl.not.found" + ERROR_PAGE "error.openssl.perl.not.found" ) endif() string(COMPARE EQUAL "@HUNTER_MSVC_ARCH@" "amd64" is_amd64) if(is_amd64) - set(opt "VC-WIN64A") + set(arch "VC-WIN64A") +else() + set(arch "VC-WIN32") +endif() + +if(ASM_SUPPORT) + hunter_add_package(NASM) # set NASM_ROOT + set(opt "") else() - set(opt "VC-WIN32") + set(NASM_ROOT "") + set(opt "no-asm") endif() if("@MSVC@") @@ -71,6 +82,29 @@ else() set(log_opts "") endif() +if (BUILD_SHARED_LIBS) + set(shared "shared") +else() + set(shared "no-shared") +endif() + +set(openssl_dir "@HUNTER_PACKAGE_INSTALL_PREFIX@/ssl") +set(openssl_install_dir "@HUNTER_PACKAGE_INSTALL_PREFIX@") + +# Used variables: +# * openssl_dir +# * openssl_install_dir +# * arch +# * opt +# * shared +# * NASM_ROOT +configure_file( + "@HUNTER_PACKAGE_SETUP_DIR@/ep-stages/configure_1_1_plus.cmake.in" + "@HUNTER_PACKAGE_BUILD_DIR@/configure_1_1_plus.cmake" + @ONLY) + +file(MAKE_DIRECTORY "${openssl_dir}") + ExternalProject_Add( "@HUNTER_EP_NAME@" URL @@ -79,6 +113,8 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -87,19 +123,19 @@ ExternalProject_Add( CONFIGURE_COMMAND "@HUNTER_MSVC_VCVARSALL@" "@HUNTER_MSVC_ARCH@" COMMAND - perl Configure "${opt}" "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@" + "@CMAKE_COMMAND@" -P "@HUNTER_PACKAGE_BUILD_DIR@/configure_1_1_plus.cmake" COMMAND - nmake + nmake install + BUILD_COMMAND + "@CMAKE_COMMAND@" -E echo "Dummy build step" BUILD_IN_SOURCE 1 INSTALL_COMMAND - COMMAND - nmake install - COMMAND # Copy license files "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" -P - "@HUNTER_GLOBAL_SCRIPT_DIR@/try-copy-license.cmake" + "@HUNTER_SELF@/scripts/try-copy-license.cmake" ${log_opts} ) diff --git a/cmake/projects/PNG/hunter.cmake b/cmake/projects/PNG/hunter.cmake index 509ed62f2..fe245065c 100644 --- a/cmake/projects/PNG/hunter.cmake +++ b/cmake/projects/PNG/hunter.cmake @@ -10,6 +10,17 @@ include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + PNG + VERSION + "1.6.26-p1" + URL + "https://github.com/hunter-packages/libpng/archive/v1.6.26-p1.tar.gz" + SHA1 + 10557d64fc577e4013c80c6305d6af2872c60bdb +) + hunter_add_version( PACKAGE_NAME PNG @@ -32,6 +43,61 @@ hunter_add_version( 3e083ca37efc461704d9af256cdf2231cae6ee9d ) +hunter_add_version( + PACKAGE_NAME + PNG + VERSION + "1.6.26-p2" + URL + "https://github.com/hunter-packages/libpng/archive/v1.6.26-p2.tar.gz" + SHA1 + 92cdda7e88239633257c5534b42445bc24a176e7 +) + +hunter_add_version( + PACKAGE_NAME + PNG + VERSION + "1.6.26-p3" + URL + "https://github.com/hunter-packages/libpng/archive/v1.6.26-p3.tar.gz" + SHA1 + fcaaae43f0950ca362b487a793159c786b264346 +) + +hunter_add_version( + PACKAGE_NAME + PNG + VERSION + "1.6.26-p4" + URL + "https://github.com/hunter-packages/libpng/archive/v1.6.26-p4.tar.gz" + SHA1 + a6ac9a2e7c5f23b062c252466ae448cae9e771b3 +) + +hunter_add_version( + PACKAGE_NAME + PNG + VERSION + "1.6.26-p5" + URL + "https://github.com/hunter-packages/libpng/archive/v1.6.26-p5.tar.gz" + SHA1 + fbf7c49f144a32567a1b63cb658a2a4584a091fa +) + +hunter_add_version( + PACKAGE_NAME + PNG + VERSION + "1.6.26-p6" + URL + "https://github.com/hunter-packages/libpng/archive/v1.6.26-p6.tar.gz" + SHA1 + dee61a3f48ed2d436a4e7fb8cdaf3cabaa3e604e +) + hunter_cmake_args(PNG CMAKE_ARGS PNG_TESTS=OFF) hunter_pick_scheme(DEFAULT url_sha1_cmake) diff --git a/cmake/projects/PocoCpp/hunter.cmake b/cmake/projects/PocoCpp/hunter.cmake index 26f75b205..302a60717 100644 --- a/cmake/projects/PocoCpp/hunter.cmake +++ b/cmake/projects/PocoCpp/hunter.cmake @@ -4,6 +4,50 @@ include(hunter_pick_scheme) include(hunter_cacheable) include(hunter_download) +hunter_add_version( + PACKAGE_NAME + PocoCpp + VERSION + 1.7.9-p1 + URL + "https://github.com/hunter-packages/poco/archive/v1.7.9-p1.zip" + SHA1 + 28adb9a84af3000dde5525c14e906f5f5ea095f3 +) + +hunter_add_version( + PACKAGE_NAME + PocoCpp + VERSION + 1.7.9-p0 + URL + "https://github.com/hunter-packages/poco/archive/v1.7.9-p0.zip" + SHA1 + 1ad6193edd0dbd67c351af7458b464252baf5bb3 +) + +hunter_add_version( + PACKAGE_NAME + PocoCpp + VERSION + 1.7.8-p0 + URL + "https://github.com/hunter-packages/poco/archive/v1.7.8-p0.zip" + SHA1 + 229dd0f6c3696c2ab0c7b4449b664a75c2211188 +) + +hunter_add_version( + PACKAGE_NAME + PocoCpp + VERSION + 1.7.6-p0 + URL + "https://github.com/hunter-packages/poco/archive/v1.7.6-p0.zip" + SHA1 + a4b577d4fd6907c87d20dff31fa5caf4bd94bc89 +) + hunter_add_version( PACKAGE_NAME PocoCpp diff --git a/cmake/projects/PostgreSQL/hunter.cmake b/cmake/projects/PostgreSQL/hunter.cmake index 772416395..d9d911cfa 100644 --- a/cmake/projects/PostgreSQL/hunter.cmake +++ b/cmake/projects/PostgreSQL/hunter.cmake @@ -8,6 +8,29 @@ include(hunter_cacheable) include(hunter_configuration_types) include(hunter_pick_scheme) include(hunter_download) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + PostgreSQL + VERSION + "10.0.0" + URL + "https://github.com/hunter-packages/PostgreSQL/archive/PostgreSQL-10.0.0.tar.gz" + SHA1 + d35d4e958509460347f39f0ba542a17eb2228f3c +) + +hunter_add_version( + PACKAGE_NAME + PostgreSQL + VERSION + "9.6.3" + URL + "https://github.com/hunter-packages/PostgreSQL/archive/PostgreSQL-9.6.3.tar.gz" + SHA1 + 103d31238ef688295960082619968bda4aa01163 +) hunter_add_version( PACKAGE_NAME @@ -20,10 +43,20 @@ hunter_add_version( b82ddcee4644ef42f3a69ee93916afa448d178c4 ) +if (ANDROID OR IOS) + hunter_cmake_args( + PostgreSQL + CMAKE_ARGS + EXTRA_FLAGS=--without-readline + ) +endif() + hunter_configuration_types(PostgreSQL CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(PostgreSQL) -hunter_download(PACKAGE_NAME PostgreSQL +hunter_download( + PACKAGE_NAME PostgreSQL + PACKAGE_INTERNAL_DEPS_ID "2" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/libecpg.pc" "lib/pkgconfig/libecpg_compat.pc" @@ -31,4 +64,3 @@ hunter_download(PACKAGE_NAME PostgreSQL "lib/pkgconfig/libpq.pc" "lib/postgresql/pgxs/src/Makefile.global" ) - diff --git a/cmake/projects/Protobuf/hunter.cmake b/cmake/projects/Protobuf/hunter.cmake index 6ac16b4ca..27cd46675 100644 --- a/cmake/projects/Protobuf/hunter.cmake +++ b/cmake/projects/Protobuf/hunter.cmake @@ -6,6 +6,17 @@ include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + Protobuf + VERSION + "2.4.1-p0" + URL + "https://github.com/hunter-packages/protobuf/archive/v2.4.1-p0.tar.gz" + SHA1 + c57c846131f804622057d83bf44144c179613e44 +) + hunter_add_version( PACKAGE_NAME Protobuf @@ -14,7 +25,7 @@ hunter_add_version( URL "https://github.com/hunter-packages/protobuf/archive/v3.0.0-hunter-3.tar.gz" SHA1 - e3d5ab642e0295d16b86a4a55e06c3ee026ff249 + 242443553ca20ab279427330e175a3c33ecbf265 ) hunter_add_version( @@ -25,7 +36,7 @@ hunter_add_version( URL "https://github.com/hunter-packages/protobuf/archive/v3.0.0-hunter-2.tar.gz" SHA1 - 6fb368b171aa10f612d777f079d6896f37b85c55 + d1fa1592e05ab6ff3e4dbbcd9dfd9768a26ba94a ) hunter_add_version( @@ -36,7 +47,7 @@ hunter_add_version( URL "https://github.com/hunter-packages/protobuf/archive/v3.0.0-beta-2-hunter-1.tar.gz" SHA1 - 15752454ef0cf119b58136e2f4ffe97baeaf07cd + d43d0d6bbfd3b65539ca467e2bcb0f7eeeb6a9d9 ) hunter_add_version( @@ -47,7 +58,77 @@ hunter_add_version( URL "https://github.com/hunter-packages/protobuf/archive/v3.0.0-beta-2-hunter-2.tar.gz" SHA1 - dbae4995254f351918d0462b308b561dbab71b3f + f91766a391284b7ccd192fa36bc3f09449b3c202 +) + +hunter_add_version( + PACKAGE_NAME + Protobuf + VERSION + "3.1.0" + URL + "https://github.com/hunter-packages/protobuf/archive/v3.1.0-hunter-4.tar.gz" + SHA1 + 8f58f2cbe6d3fae61451a5e29b703686fe4bc9d6 +) + +hunter_add_version( + PACKAGE_NAME + Protobuf + VERSION + "3.3.0" + URL + "https://github.com/hunter-packages/protobuf/archive/v3.3.0-hunter-1.tar.gz" + SHA1 + 8815a6be8188b2d6c8002924e752018b64658748 +) + +hunter_add_version( + PACKAGE_NAME + Protobuf + VERSION + "3.5.2-p0" + URL + "https://github.com/hunter-packages/protobuf/archive/v3.5.2-p0.tar.gz" + SHA1 + 0c1eacb460266dea7cd18c2009642fa192c15b70 +) + +hunter_add_version( + PACKAGE_NAME + Protobuf + VERSION + "3.6.1.3-p0" + URL + "https://github.com/hunter-packages/protobuf/archive/v3.6.1.3-p0.tar.gz" + SHA1 + 5f32dcd70bed20e42cecc53058b8502298c6680a +) + +hunter_add_version( + PACKAGE_NAME + Protobuf + VERSION + "3.6.1.3-p1" + URL + "https://github.com/hunter-packages/protobuf/archive/v3.6.1.3-p1.tar.gz" + SHA1 + 120e15e1cc49b3fcc4fc89503ccc1346c9978362 +) + +hunter_add_version( + PACKAGE_NAME + Protobuf + VERSION + "3.7.1-p0" + URL + "https://github.com/hunter-packages/protobuf/archive/v3.7.1-p0.tar.gz" + SHA1 + 6bfa8d5525039efdf63f40277b20d8d5852c89bf +) + +string( + COMPARE EQUAL "${CMAKE_SYSTEM_NAME}" "WindowsStore" _hunter_windows_store ) if(ANDROID OR IOS) @@ -56,13 +137,22 @@ if(ANDROID OR IOS) CMAKE_ARGS protobuf_BUILD_TESTS=OFF protobuf_BUILD_PROTOC=OFF + protobuf_BUILD_PROTOC_BINARIES=OFF + ) +elseif(_hunter_windows_store) + hunter_cmake_args( + Protobuf + CMAKE_ARGS + protobuf_BUILD_TESTS=OFF + protobuf_BUILD_PROTOC=OFF + protobuf_MSVC_STATIC_RUNTIME=OFF # Do not force static runtime ) elseif(MSVC) hunter_cmake_args( Protobuf CMAKE_ARGS protobuf_BUILD_TESTS=OFF - protobuf_MSVC_STATIC_RUNTIME=OFF # Do not forece static runtime + protobuf_MSVC_STATIC_RUNTIME=OFF # Do not force static runtime ) else() hunter_cmake_args( @@ -71,6 +161,7 @@ else() protobuf_BUILD_TESTS=OFF ) endif() + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(Protobuf) hunter_download(PACKAGE_NAME Protobuf) diff --git a/cmake/projects/Qt/ep-stages/qt-build.cmake.in b/cmake/projects/Qt/ep-stages/qt-build.cmake.in index d4bf430cb..404373afe 100644 --- a/cmake/projects/Qt/ep-stages/qt-build.cmake.in +++ b/cmake/projects/Qt/ep-stages/qt-build.cmake.in @@ -7,6 +7,11 @@ if(is_empty) message(FATAL_ERROR "hunter_self is empty") endif() +string(COMPARE EQUAL "@global_install_dir@" "" is_empty) +if(is_empty) + message(FATAL_ERROR "global_install_dir is empty") +endif() + if("@MSVC@") set(build_command nmake) elseif("@MINGW@") @@ -21,6 +26,15 @@ if("@ANDROID@") set(ENV{ANDROID_API_VERSION} "@ANDROID_API_VERSION@") endif() +# QtMultimedia can run more checks +if("@HUNTER_QT_OS_IS_LINUX@") + set(x "@global_install_dir@/share/pkgconfig") + set(y "@global_install_dir@/lib/pkgconfig") + set(ENV{PKG_CONFIG_PATH} "${x}:${y}") + + set(ENV{LD_LIBRARY_PATH} "@global_install_dir@/lib") +endif() + execute_process(COMMAND ${build_command} @build_opts@ RESULT_VARIABLE result) if(NOT result EQUAL 0) diff --git a/cmake/projects/Qt/ep-stages/qt-configure.cmake.in b/cmake/projects/Qt/ep-stages/qt-configure.cmake.in index 87dab9928..d0cee4cab 100644 --- a/cmake/projects/Qt/ep-stages/qt-configure.cmake.in +++ b/cmake/projects/Qt/ep-stages/qt-configure.cmake.in @@ -49,6 +49,8 @@ if("@HUNTER_QT_OS_IS_LINUX@") set(x "@global_install_dir@/share/pkgconfig") set(y "@global_install_dir@/lib/pkgconfig") set(ENV{PKG_CONFIG_PATH} "${x}:${y}") + + set(ENV{LD_LIBRARY_PATH} "@global_install_dir@/lib") endif() list(APPEND CMAKE_MODULE_PATH "@hunter_self@/cmake/modules") @@ -137,6 +139,16 @@ if("@IOS@") set(output_content "${output_content}\n${output}") endforeach() + string(COMPARE EQUAL "@CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM@" "" is_empty) + if(NOT is_empty) + # https://bugreports.qt.io/browse/QTCREATORBUG-16968?focusedCommentId=333849&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-333849 + set(team "HUNTER_DEVELOPMENT_TEAM.value = @CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM@") + set(team "${team}\nHUNTER_DEVELOPMENT_TEAM.name = DEVELOPMENT_TEAM") + set(team "${team}\nQMAKE_MAC_XCODE_SETTINGS += HUNTER_DEVELOPMENT_TEAM") + + set(output_content "${output_content}\n${team}") + endif() + file(WRITE "${conf_path}" "${output_content}\n") endif() @@ -292,7 +304,13 @@ if("@HUNTER_QT_OS_IS_LINUX@") set(output_content "${output_content}\n${output}") endforeach() - file(WRITE "${conf_path}" "${output_content}\n") + if("@HUNTER_Qt_VERSION@" VERSION_LESS "5.12") + file(WRITE "${conf_path}" "${output_content}\n") + message("Set g++-base.conf content to:\n") + message("${output_content}") + else() + # FIXME + endif() endif() function(calculate_list listname) diff --git a/cmake/projects/Qt/ep-stages/qt-install.cmake.in b/cmake/projects/Qt/ep-stages/qt-install.cmake.in index 290466c10..e57bd5544 100644 --- a/cmake/projects/Qt/ep-stages/qt-install.cmake.in +++ b/cmake/projects/Qt/ep-stages/qt-install.cmake.in @@ -64,6 +64,7 @@ foreach(deps ${depends_on}) endforeach() string(COMPARE EQUAL "@qt_component@" "qttools" is_qttools) +string(COMPARE EQUAL "@qt_component@" "qtbase" is_qtbase) list(FIND depends_on "qttools" depends_on_qttools_index) include("@hunter_self@/scripts/clear-all.cmake") @@ -181,6 +182,31 @@ if("@IOS@") endforeach() endif() +# Fix RPATH issue: +# * https://github.com/hunter-packages/Qt/issues/3 +if("@HUNTER_QT_OS_IS_LINUX@" AND "@BUILD_SHARED_LIBS@" AND is_qtbase) + set( + rpath_fix_list + qdbuscpp2xml + qdbusxml2cpp + qdoc + qlalr + uic + ) + + foreach(x ${rpath_fix_list}) + set(file_path "@local_install_dir@/bin/${x}") + if(EXISTS "${file_path}") + file( + RPATH_CHANGE + FILE "${file_path}" + OLD_RPATH "@local_install_dir@/lib" + NEW_RPATH "$ORIGIN/../lib" + ) + endif() + endforeach() +endif() + set( qml_plugin_from "@local_install_dir@/lib/cmake/Qt5Qml/Qt5Qml_QTcpServerConnection.cmake" @@ -196,12 +222,20 @@ endif() # Remove files installed by other components foreach(installed_file ${QT_INSTALLED_FILES}) set(filepath "@local_install_dir@/${installed_file}") - if(NOT EXISTS "${filepath}") - message(FATAL_ERROR "File not found: ${filepath}") - endif() - file(REMOVE "${filepath}") if(EXISTS "${filepath}") - message(FATAL_ERROR "File not removed: ${filepath}") + file(REMOVE "${filepath}") + if(EXISTS "${filepath}") + message(FATAL_ERROR "File not removed: ${filepath}") + endif() + else() + # Before Qt 5.10 it was assumed that while doing + # component install all files from dependent + # components installed too. + + # It's not true for Qt 5.10: + # on OSX component 'qtgraphicaleffects' + # will not install header 'qvulkanfunctions_p.h' + # which is installed by 'qtxmlpatterns'. endif() endforeach() diff --git a/cmake/projects/Qt/generate.sh b/cmake/projects/Qt/generate.sh index 78e123257..aca126c7a 100755 --- a/cmake/projects/Qt/generate.sh +++ b/cmake/projects/Qt/generate.sh @@ -15,24 +15,40 @@ QT_LIBS=" qtandroidextras qtbase qtcanvas3d + qtcharts qtconnectivity + qtdatavis3d qtdeclarative qtdoc + qtdocgallery qtenginio + qtfeedback + qtgamepad qtgraphicaleffects qtimageformats qtlocation qtmacextras qtmultimedia + qtnetworkauth + qtpim + qtpurchasing + qtqa qtquick1 qtquickcontrols qtquickcontrols2 + qtremoteobjects + qtrepotools qtscript + qtscxml qtsensors + qtserialbus qtserialport + qtspeech qtsvg + qtsystems qttools qttranslations + qtvirtualkeyboard qtwayland qtwebchannel qtwebengine diff --git a/cmake/projects/Qt/hunter.cmake b/cmake/projects/Qt/hunter.cmake index f0b3ef9ed..b81ed2fba 100644 --- a/cmake/projects/Qt/hunter.cmake +++ b/cmake/projects/Qt/hunter.cmake @@ -9,6 +9,7 @@ include(hunter_cacheable) include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_report_broken_package) +include(hunter_check_toolchain_definition) # Use *.7z version. # Qt 5.5 overview: @@ -182,6 +183,28 @@ hunter_add_version( 4219da1cc7d14bfdd59bcbecf9180c2133181e52 ) +hunter_add_version( + PACKAGE_NAME + Qt + VERSION + "5.5.1-cvpixelbuffer-2-p8" + URL + "https://github.com/hunter-packages/Qt/releases/download/v5.5.1-cvpixelbuffer-2-p8/hunter-5.5.1-cvpixelbuffer-2.7z" + SHA1 + 130b210eff2a29b2aa65421e23ec618b65aa5d0f +) + +hunter_add_version( + PACKAGE_NAME + Qt + VERSION + "5.5.1-cvpixelbuffer-2-p9" + URL + "https://github.com/hunter-packages/Qt/releases/download/v5.5.1-cvpixelbuffer-2-p9/hunter-5.5.1-cvpixelbuffer-2.7z" + SHA1 + da8682218c7ed731d1affbdd1abee3c7393fb3e7 +) + hunter_add_version( PACKAGE_NAME Qt @@ -193,6 +216,61 @@ hunter_add_version( d902b7df94219d2ed2f5c868839c85ce9daa056a ) +hunter_add_version( + PACKAGE_NAME + Qt + VERSION + "5.9.1-p0" + URL + "https://github.com/hunter-packages/Qt/releases/download/v5.9.1-p0/hunter-5.9.1.7z" + SHA1 + b1bc254e688426316b55115adddd13e4a10115b2 +) + +hunter_add_version( + PACKAGE_NAME + Qt + VERSION + "5.10.1" + URL + "http://download.qt.io/official_releases/qt/5.10/5.10.1/single/qt-everywhere-src-5.10.1.tar.xz" + SHA1 + 3d71e887287bdea664ac6f8db4aaa4a7d913be59 +) + +hunter_add_version( + PACKAGE_NAME + Qt + VERSION + "5.11.1" + URL + "http://download.qt.io/official_releases/qt/5.11/5.11.1/single/qt-everywhere-src-5.11.1.tar.xz" + SHA1 + 0ac866442a960d4038a51ba3096b2cc5d796b5ee +) + +hunter_add_version( + PACKAGE_NAME + Qt + VERSION + "5.11.3" + URL + "https://download.qt.io/official_releases/qt/5.11/5.11.3/single/qt-everywhere-src-5.11.3.tar.xz" + SHA1 + 3f6c0df4fa7524ed11557ed55db35ef551cd2782 +) + +hunter_add_version( + PACKAGE_NAME + Qt + VERSION + "5.12.3" + URL + "https://download.qt.io/official_releases/qt/5.12/5.12.3/single/qt-everywhere-src-5.12.3.tar.xz" + SHA1 + cf1bbdf0e69a651a67738e9b3e616e0dd9cf3087 +) + hunter_cacheable(Qt) if(NOT APPLE AND NOT WIN32) @@ -214,6 +292,30 @@ if(IOS) endif() endif() +if(CMAKE_VERSION VERSION_LESS 3.6) + # QtCMakeExtra modules (https://github.com/hunter-packages/QtCMakeExtra) installed + # near the Qt CMake modules and loaded by `file(GLOB)`: + # * https://github.com/qt/qtbase/blob/441ad9b938d453ccf5bff8867e7d3e6e432f9eba/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in#L352 + # + # Before CMake 3.6 file(GLOB) order is not predictable and QtCMakeExtra will not work + # because they are expected to load last. + # + # file(GLOB) sorted since CMake 3.6: + # * https://gitlab.kitware.com/cmake/cmake/commit/edcccde7d65944b3744c4567bd1d452211829702 + hunter_report_broken_package( + "CMake 3.6+ expected for Qt package (current version is ${CMAKE_VERSION}." + ) +endif() + +if(MSVC) + hunter_check_toolchain_definition(NAME "_DLL" DEFINED _hunter_vs_md) + hunter_cmake_args( + Qt + CMAKE_ARGS + QT_BUILD_DYNAMIC_VSRUNTIME=${_hunter_vs_md} + ) +endif() + include("${CMAKE_CURRENT_LIST_DIR}/qtbase/hunter.cmake") hunter_add_package(QtCMakeExtra) diff --git a/cmake/projects/Qt/hunter.cmake.in b/cmake/projects/Qt/hunter.cmake.in index d40af1af5..a1117ea3b 100644 --- a/cmake/projects/Qt/hunter.cmake.in +++ b/cmake/projects/Qt/hunter.cmake.in @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "@qt_component@" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "@qt_component@" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "@qt_component@" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "@qt_component@" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "@qt_component@" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "@qt_component@" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "@qt_component@" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "@qt_component@" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "@qt_component@" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "@qt_component@" "qtpim" _is_qtpim) +string(COMPARE EQUAL "@qt_component@" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "@qt_component@" "qtqa" _is_qtqa) +string(COMPARE EQUAL "@qt_component@" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "@qt_component@" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "@qt_component@" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "@qt_component@" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "@qt_component@" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "@qt_component@" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "@qt_component@" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "@qt_component@" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "@qt_component@" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qt3d/hunter.cmake b/cmake/projects/Qt/qt3d/hunter.cmake index 806a0a5db..5268198e0 100644 --- a/cmake/projects/Qt/qt3d/hunter.cmake +++ b/cmake/projects/Qt/qt3d/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qt3d" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qt3d" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qt3d" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qt3d" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qt3d" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qt3d" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qt3d" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qt3d" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qt3d" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qt3d" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qt3d" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qt3d" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qt3d" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qt3d" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qt3d" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qt3d" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qt3d" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qt3d" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qt3d" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qt3d" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qt3d" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtactiveqt/hunter.cmake b/cmake/projects/Qt/qtactiveqt/hunter.cmake index 93f294c6b..b64b93cc8 100644 --- a/cmake/projects/Qt/qtactiveqt/hunter.cmake +++ b/cmake/projects/Qt/qtactiveqt/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtactiveqt" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtactiveqt" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtactiveqt" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtactiveqt" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtactiveqt" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtactiveqt" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtactiveqt" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtactiveqt" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtactiveqt" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtactiveqt" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtactiveqt" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtactiveqt" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtactiveqt" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtactiveqt" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtactiveqt" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtactiveqt" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtactiveqt" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtactiveqt" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtactiveqt" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtactiveqt" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtactiveqt" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtandroidextras/hunter.cmake b/cmake/projects/Qt/qtandroidextras/hunter.cmake index 130c100d7..9c669ccd3 100644 --- a/cmake/projects/Qt/qtandroidextras/hunter.cmake +++ b/cmake/projects/Qt/qtandroidextras/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtandroidextras" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtandroidextras" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtandroidextras" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtandroidextras" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtandroidextras" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtandroidextras" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtandroidextras" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtandroidextras" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtandroidextras" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtandroidextras" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtandroidextras" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtandroidextras" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtandroidextras" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtandroidextras" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtandroidextras" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtandroidextras" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtandroidextras" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtandroidextras" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtandroidextras" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtandroidextras" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtandroidextras" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtbase/hunter.cmake b/cmake/projects/Qt/qtbase/hunter.cmake index 24ca54018..55e5e1718 100644 --- a/cmake/projects/Qt/qtbase/hunter.cmake +++ b/cmake/projects/Qt/qtbase/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtbase" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtbase" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtbase" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtbase" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtbase" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtbase" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtbase" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtbase" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtbase" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtbase" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtbase" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtbase" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtbase" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtbase" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtbase" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtbase" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtbase" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtbase" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtbase" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtbase" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtbase" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtcanvas3d/hunter.cmake b/cmake/projects/Qt/qtcanvas3d/hunter.cmake index c946ca726..53d85ae65 100644 --- a/cmake/projects/Qt/qtcanvas3d/hunter.cmake +++ b/cmake/projects/Qt/qtcanvas3d/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtcanvas3d" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtcanvas3d" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtcanvas3d" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtcanvas3d" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtcanvas3d" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtcanvas3d" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtcanvas3d" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtcanvas3d" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtcanvas3d" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtcanvas3d" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtcanvas3d" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtcanvas3d" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtcanvas3d" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtcanvas3d" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtcanvas3d" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtcanvas3d" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtcanvas3d" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtcanvas3d" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtcanvas3d" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtcanvas3d" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtcanvas3d" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtconnectivity/hunter.cmake b/cmake/projects/Qt/qtconnectivity/hunter.cmake index dfad70c96..043f1b115 100644 --- a/cmake/projects/Qt/qtconnectivity/hunter.cmake +++ b/cmake/projects/Qt/qtconnectivity/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtconnectivity" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtconnectivity" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtconnectivity" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtconnectivity" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtconnectivity" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtconnectivity" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtconnectivity" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtconnectivity" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtconnectivity" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtconnectivity" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtconnectivity" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtconnectivity" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtconnectivity" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtconnectivity" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtconnectivity" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtconnectivity" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtconnectivity" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtconnectivity" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtconnectivity" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtconnectivity" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtconnectivity" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtdeclarative/hunter.cmake b/cmake/projects/Qt/qtdeclarative/hunter.cmake index 7183ca57c..3aa978319 100644 --- a/cmake/projects/Qt/qtdeclarative/hunter.cmake +++ b/cmake/projects/Qt/qtdeclarative/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtdeclarative" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtdeclarative" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtdeclarative" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtdeclarative" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtdeclarative" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtdeclarative" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtdeclarative" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtdeclarative" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtdeclarative" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtdeclarative" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtdeclarative" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtdeclarative" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtdeclarative" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtdeclarative" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtdeclarative" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtdeclarative" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtdeclarative" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtdeclarative" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtdeclarative" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtdeclarative" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtdeclarative" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtdoc/hunter.cmake b/cmake/projects/Qt/qtdoc/hunter.cmake index 39f2f86bf..4e2d5d218 100644 --- a/cmake/projects/Qt/qtdoc/hunter.cmake +++ b/cmake/projects/Qt/qtdoc/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtdoc" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtdoc" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtdoc" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtdoc" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtdoc" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtdoc" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtdoc" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtdoc" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtdoc" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtdoc" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtdoc" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtdoc" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtdoc" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtdoc" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtdoc" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtdoc" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtdoc" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtdoc" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtdoc" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtdoc" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtdoc" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtenginio/hunter.cmake b/cmake/projects/Qt/qtenginio/hunter.cmake index 3250ce452..1d071df0c 100644 --- a/cmake/projects/Qt/qtenginio/hunter.cmake +++ b/cmake/projects/Qt/qtenginio/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtenginio" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtenginio" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtenginio" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtenginio" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtenginio" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtenginio" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtenginio" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtenginio" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtenginio" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtenginio" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtenginio" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtenginio" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtenginio" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtenginio" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtenginio" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtenginio" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtenginio" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtenginio" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtenginio" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtenginio" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtenginio" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtgraphicaleffects/hunter.cmake b/cmake/projects/Qt/qtgraphicaleffects/hunter.cmake index 00db8d5c0..f628a184a 100644 --- a/cmake/projects/Qt/qtgraphicaleffects/hunter.cmake +++ b/cmake/projects/Qt/qtgraphicaleffects/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtgraphicaleffects" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtgraphicaleffects" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtgraphicaleffects" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtgraphicaleffects" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtgraphicaleffects" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtgraphicaleffects" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtgraphicaleffects" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtgraphicaleffects" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtgraphicaleffects" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtgraphicaleffects" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtgraphicaleffects" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtgraphicaleffects" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtgraphicaleffects" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtgraphicaleffects" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtgraphicaleffects" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtgraphicaleffects" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtgraphicaleffects" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtgraphicaleffects" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtgraphicaleffects" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtgraphicaleffects" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtgraphicaleffects" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtimageformats/hunter.cmake b/cmake/projects/Qt/qtimageformats/hunter.cmake index 6ed816616..587bb6815 100644 --- a/cmake/projects/Qt/qtimageformats/hunter.cmake +++ b/cmake/projects/Qt/qtimageformats/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtimageformats" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtimageformats" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtimageformats" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtimageformats" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtimageformats" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtimageformats" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtimageformats" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtimageformats" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtimageformats" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtimageformats" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtimageformats" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtimageformats" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtimageformats" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtimageformats" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtimageformats" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtimageformats" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtimageformats" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtimageformats" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtimageformats" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtimageformats" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtimageformats" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtlocation/hunter.cmake b/cmake/projects/Qt/qtlocation/hunter.cmake index af0fd3f82..3cec767f1 100644 --- a/cmake/projects/Qt/qtlocation/hunter.cmake +++ b/cmake/projects/Qt/qtlocation/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtlocation" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtlocation" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtlocation" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtlocation" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtlocation" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtlocation" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtlocation" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtlocation" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtlocation" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtlocation" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtlocation" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtlocation" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtlocation" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtlocation" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtlocation" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtlocation" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtlocation" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtlocation" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtlocation" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtlocation" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtlocation" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtmacextras/hunter.cmake b/cmake/projects/Qt/qtmacextras/hunter.cmake index e5e94d5cd..ae4348e73 100644 --- a/cmake/projects/Qt/qtmacextras/hunter.cmake +++ b/cmake/projects/Qt/qtmacextras/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtmacextras" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtmacextras" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtmacextras" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtmacextras" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtmacextras" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtmacextras" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtmacextras" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtmacextras" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtmacextras" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtmacextras" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtmacextras" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtmacextras" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtmacextras" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtmacextras" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtmacextras" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtmacextras" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtmacextras" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtmacextras" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtmacextras" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtmacextras" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtmacextras" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtmultimedia/hunter.cmake b/cmake/projects/Qt/qtmultimedia/hunter.cmake index a26d79326..572b6f311 100644 --- a/cmake/projects/Qt/qtmultimedia/hunter.cmake +++ b/cmake/projects/Qt/qtmultimedia/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtmultimedia" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtmultimedia" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtmultimedia" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtmultimedia" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtmultimedia" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtmultimedia" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtmultimedia" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtmultimedia" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtmultimedia" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtmultimedia" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtmultimedia" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtmultimedia" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtmultimedia" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtmultimedia" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtmultimedia" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtmultimedia" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtmultimedia" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtmultimedia" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtmultimedia" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtmultimedia" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtmultimedia" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtquick1/hunter.cmake b/cmake/projects/Qt/qtquick1/hunter.cmake index b9a454648..dc13ead4e 100644 --- a/cmake/projects/Qt/qtquick1/hunter.cmake +++ b/cmake/projects/Qt/qtquick1/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtquick1" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtquick1" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtquick1" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtquick1" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtquick1" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtquick1" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtquick1" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtquick1" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtquick1" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtquick1" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtquick1" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtquick1" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtquick1" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtquick1" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtquick1" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtquick1" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtquick1" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtquick1" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtquick1" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtquick1" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtquick1" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtquickcontrols/hunter.cmake b/cmake/projects/Qt/qtquickcontrols/hunter.cmake index b08f0e4a4..870eaf500 100644 --- a/cmake/projects/Qt/qtquickcontrols/hunter.cmake +++ b/cmake/projects/Qt/qtquickcontrols/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtquickcontrols" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtquickcontrols" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtquickcontrols" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtquickcontrols" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtquickcontrols" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtquickcontrols" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtquickcontrols" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtquickcontrols" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtquickcontrols" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtquickcontrols" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtquickcontrols" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtquickcontrols" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtquickcontrols" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtquickcontrols" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtquickcontrols" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtquickcontrols" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtquickcontrols" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtquickcontrols" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtquickcontrols" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtquickcontrols" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtquickcontrols" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtquickcontrols2/hunter.cmake b/cmake/projects/Qt/qtquickcontrols2/hunter.cmake index 30cc8dd65..0c5de4538 100644 --- a/cmake/projects/Qt/qtquickcontrols2/hunter.cmake +++ b/cmake/projects/Qt/qtquickcontrols2/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtquickcontrols2" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtquickcontrols2" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtquickcontrols2" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtquickcontrols2" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtquickcontrols2" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtquickcontrols2" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtquickcontrols2" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtquickcontrols2" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtquickcontrols2" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtquickcontrols2" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtquickcontrols2" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtquickcontrols2" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtquickcontrols2" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtquickcontrols2" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtquickcontrols2" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtquickcontrols2" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtquickcontrols2" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtquickcontrols2" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtquickcontrols2" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtquickcontrols2" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtquickcontrols2" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtscript/hunter.cmake b/cmake/projects/Qt/qtscript/hunter.cmake index d6be1202d..922bebc2f 100644 --- a/cmake/projects/Qt/qtscript/hunter.cmake +++ b/cmake/projects/Qt/qtscript/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtscript" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtscript" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtscript" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtscript" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtscript" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtscript" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtscript" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtscript" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtscript" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtscript" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtscript" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtscript" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtscript" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtscript" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtscript" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtscript" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtscript" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtscript" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtscript" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtscript" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtscript" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtsensors/hunter.cmake b/cmake/projects/Qt/qtsensors/hunter.cmake index c86dc902c..41e606a1f 100644 --- a/cmake/projects/Qt/qtsensors/hunter.cmake +++ b/cmake/projects/Qt/qtsensors/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtsensors" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtsensors" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtsensors" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtsensors" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtsensors" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtsensors" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtsensors" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtsensors" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtsensors" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtsensors" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtsensors" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtsensors" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtsensors" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtsensors" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtsensors" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtsensors" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtsensors" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtsensors" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtsensors" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtsensors" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtsensors" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtserialport/hunter.cmake b/cmake/projects/Qt/qtserialport/hunter.cmake index 7cefa28bc..32a5a13e2 100644 --- a/cmake/projects/Qt/qtserialport/hunter.cmake +++ b/cmake/projects/Qt/qtserialport/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtserialport" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtserialport" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtserialport" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtserialport" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtserialport" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtserialport" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtserialport" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtserialport" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtserialport" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtserialport" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtserialport" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtserialport" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtserialport" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtserialport" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtserialport" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtserialport" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtserialport" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtserialport" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtserialport" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtserialport" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtserialport" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtsvg/hunter.cmake b/cmake/projects/Qt/qtsvg/hunter.cmake index f3fa1312b..129130800 100644 --- a/cmake/projects/Qt/qtsvg/hunter.cmake +++ b/cmake/projects/Qt/qtsvg/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtsvg" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtsvg" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtsvg" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtsvg" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtsvg" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtsvg" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtsvg" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtsvg" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtsvg" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtsvg" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtsvg" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtsvg" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtsvg" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtsvg" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtsvg" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtsvg" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtsvg" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtsvg" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtsvg" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtsvg" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtsvg" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qttools/hunter.cmake b/cmake/projects/Qt/qttools/hunter.cmake index fc7ad8392..a0de3d3c3 100644 --- a/cmake/projects/Qt/qttools/hunter.cmake +++ b/cmake/projects/Qt/qttools/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qttools" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qttools" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qttools" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qttools" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qttools" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qttools" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qttools" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qttools" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qttools" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qttools" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qttools" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qttools" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qttools" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qttools" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qttools" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qttools" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qttools" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qttools" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qttools" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qttools" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qttools" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qttranslations/hunter.cmake b/cmake/projects/Qt/qttranslations/hunter.cmake index 3fe309cca..cca15723d 100644 --- a/cmake/projects/Qt/qttranslations/hunter.cmake +++ b/cmake/projects/Qt/qttranslations/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qttranslations" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qttranslations" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qttranslations" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qttranslations" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qttranslations" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qttranslations" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qttranslations" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qttranslations" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qttranslations" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qttranslations" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qttranslations" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qttranslations" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qttranslations" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qttranslations" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qttranslations" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qttranslations" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qttranslations" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qttranslations" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qttranslations" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qttranslations" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qttranslations" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtwayland/hunter.cmake b/cmake/projects/Qt/qtwayland/hunter.cmake index a024816f9..4838491c4 100644 --- a/cmake/projects/Qt/qtwayland/hunter.cmake +++ b/cmake/projects/Qt/qtwayland/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtwayland" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtwayland" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtwayland" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtwayland" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtwayland" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtwayland" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtwayland" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtwayland" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtwayland" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtwayland" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtwayland" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtwayland" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtwayland" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtwayland" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtwayland" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtwayland" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtwayland" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtwayland" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtwayland" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtwayland" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtwayland" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtwebchannel/hunter.cmake b/cmake/projects/Qt/qtwebchannel/hunter.cmake index b47beff1a..dffd101f0 100644 --- a/cmake/projects/Qt/qtwebchannel/hunter.cmake +++ b/cmake/projects/Qt/qtwebchannel/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtwebchannel" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtwebchannel" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtwebchannel" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtwebchannel" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtwebchannel" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtwebchannel" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtwebchannel" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtwebchannel" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtwebchannel" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtwebchannel" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtwebchannel" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtwebchannel" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtwebchannel" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtwebchannel" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtwebchannel" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtwebchannel" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtwebchannel" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtwebchannel" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtwebchannel" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtwebchannel" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtwebchannel" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtwebengine/hunter.cmake b/cmake/projects/Qt/qtwebengine/hunter.cmake index 241fdfe82..c16abf006 100644 --- a/cmake/projects/Qt/qtwebengine/hunter.cmake +++ b/cmake/projects/Qt/qtwebengine/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtwebengine" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtwebengine" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtwebengine" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtwebengine" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtwebengine" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtwebengine" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtwebengine" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtwebengine" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtwebengine" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtwebengine" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtwebengine" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtwebengine" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtwebengine" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtwebengine" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtwebengine" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtwebengine" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtwebengine" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtwebengine" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtwebengine" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtwebengine" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtwebengine" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtwebkit-examples/hunter.cmake b/cmake/projects/Qt/qtwebkit-examples/hunter.cmake index 1e9fdb7be..8d41721fb 100644 --- a/cmake/projects/Qt/qtwebkit-examples/hunter.cmake +++ b/cmake/projects/Qt/qtwebkit-examples/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtwebkit-examples" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtwebkit-examples" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtwebkit-examples" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtwebkit-examples" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtwebkit-examples" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtwebkit-examples" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtwebkit-examples" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtwebkit-examples" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtwebkit-examples" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtwebkit-examples" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtwebkit-examples" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtwebkit-examples" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtwebkit-examples" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtwebkit-examples" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtwebkit-examples" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtwebkit-examples" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtwebkit-examples" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtwebkit-examples" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtwebkit-examples" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtwebkit-examples" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtwebkit-examples" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtwebkit/hunter.cmake b/cmake/projects/Qt/qtwebkit/hunter.cmake index 8dec00bef..0cae84e75 100644 --- a/cmake/projects/Qt/qtwebkit/hunter.cmake +++ b/cmake/projects/Qt/qtwebkit/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtwebkit" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtwebkit" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtwebkit" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtwebkit" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtwebkit" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtwebkit" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtwebkit" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtwebkit" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtwebkit" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtwebkit" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtwebkit" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtwebkit" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtwebkit" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtwebkit" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtwebkit" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtwebkit" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtwebkit" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtwebkit" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtwebkit" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtwebkit" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtwebkit" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtwebsockets/hunter.cmake b/cmake/projects/Qt/qtwebsockets/hunter.cmake index 1ea4a7b1f..c07c155a3 100644 --- a/cmake/projects/Qt/qtwebsockets/hunter.cmake +++ b/cmake/projects/Qt/qtwebsockets/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtwebsockets" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtwebsockets" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtwebsockets" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtwebsockets" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtwebsockets" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtwebsockets" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtwebsockets" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtwebsockets" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtwebsockets" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtwebsockets" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtwebsockets" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtwebsockets" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtwebsockets" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtwebsockets" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtwebsockets" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtwebsockets" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtwebsockets" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtwebsockets" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtwebsockets" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtwebsockets" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtwebsockets" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtwebview/hunter.cmake b/cmake/projects/Qt/qtwebview/hunter.cmake index 2314ff182..ef049eb10 100644 --- a/cmake/projects/Qt/qtwebview/hunter.cmake +++ b/cmake/projects/Qt/qtwebview/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtwebview" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtwebview" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtwebview" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtwebview" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtwebview" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtwebview" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtwebview" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtwebview" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtwebview" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtwebview" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtwebview" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtwebview" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtwebview" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtwebview" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtwebview" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtwebview" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtwebview" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtwebview" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtwebview" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtwebview" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtwebview" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtwinextras/hunter.cmake b/cmake/projects/Qt/qtwinextras/hunter.cmake index fc58de361..e4c9d847f 100644 --- a/cmake/projects/Qt/qtwinextras/hunter.cmake +++ b/cmake/projects/Qt/qtwinextras/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtwinextras" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtwinextras" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtwinextras" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtwinextras" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtwinextras" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtwinextras" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtwinextras" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtwinextras" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtwinextras" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtwinextras" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtwinextras" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtwinextras" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtwinextras" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtwinextras" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtwinextras" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtwinextras" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtwinextras" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtwinextras" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtwinextras" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtwinextras" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtwinextras" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtx11extras/hunter.cmake b/cmake/projects/Qt/qtx11extras/hunter.cmake index 8594d126d..fd8e31303 100644 --- a/cmake/projects/Qt/qtx11extras/hunter.cmake +++ b/cmake/projects/Qt/qtx11extras/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtx11extras" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtx11extras" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtx11extras" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtx11extras" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtx11extras" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtx11extras" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtx11extras" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtx11extras" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtx11extras" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtx11extras" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtx11extras" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtx11extras" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtx11extras" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtx11extras" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtx11extras" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtx11extras" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtx11extras" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtx11extras" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtx11extras" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtx11extras" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtx11extras" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/qtxmlpatterns/hunter.cmake b/cmake/projects/Qt/qtxmlpatterns/hunter.cmake index ec64e338e..db3e48155 100644 --- a/cmake/projects/Qt/qtxmlpatterns/hunter.cmake +++ b/cmake/projects/Qt/qtxmlpatterns/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015-2017, Ruslan Baratov # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,30 +21,90 @@ if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) endif() ## -- end -## 5.6 only -- +## 5.6+ only -- string(COMPARE EQUAL "qtxmlpatterns" "qtquickcontrol2" _is_qtquickcontrols2) string(COMPARE EQUAL "qtxmlpatterns" "qtwebview" _is_qtwebview) if(_is_qtquickcontrols2 OR _is_qtwebview) - if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() return() endif() endif() ## -- end -hunter_generate_qt_info( - "qtxmlpatterns" - _unused_toskip - _depends_on - _unused_nobuild - "${HUNTER_Qt_VERSION}" - "${ANDROID}" - "${WIN32}" +## 5.9+ only -- +string(COMPARE EQUAL "qtxmlpatterns" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtxmlpatterns" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtxmlpatterns" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtxmlpatterns" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtxmlpatterns" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtxmlpatterns" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtxmlpatterns" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtxmlpatterns" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtxmlpatterns" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtxmlpatterns" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtxmlpatterns" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtxmlpatterns" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtxmlpatterns" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtxmlpatterns" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtxmlpatterns" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtxmlpatterns" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard ) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end -foreach(_x ${_depends_on}) - hunter_add_package(Qt COMPONENTS ${_x}) -endforeach() +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtxmlpatterns" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() # We should call this function again since hunter_add_package is include-like # instruction, i.e. will overwrite variable values (foreach's _x will survive) @@ -82,5 +142,5 @@ hunter_pick_scheme(DEFAULT url_sha1_qt) hunter_download( PACKAGE_NAME Qt PACKAGE_COMPONENT "qtxmlpatterns" - PACKAGE_INTERNAL_DEPS_ID "10" + PACKAGE_INTERNAL_DEPS_ID "14" ) diff --git a/cmake/projects/Qt/schemes/url_sha1_qt.cmake.in b/cmake/projects/Qt/schemes/url_sha1_qt.cmake.in index 778a0e4e5..ad78fd969 100644 --- a/cmake/projects/Qt/schemes/url_sha1_qt.cmake.in +++ b/cmake/projects/Qt/schemes/url_sha1_qt.cmake.in @@ -1,4 +1,4 @@ -# Copyright (c) 2013, 2015 Ruslan Baratov, Alexandre Pretyman +# Copyright (c) 2013, 2015-2016 Ruslan Baratov, Alexandre Pretyman # All rights reserved. cmake_minimum_required(VERSION 3.0) @@ -11,33 +11,34 @@ include("@HUNTER_SELF@/cmake/Hunter") include(hunter_internal_error) include(hunter_report_broken_package) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_qt") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_COMPONENT@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") -hunter_test_string_not_empty("@HUNTER_TOOLCHAIN_ID_PATH@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") -hunter_test_string_not_empty("@HUNTER_Qt_VERSION@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SETUP_DIR@") -hunter_test_string_not_empty("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_COMPONENT@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") +hunter_assert_not_empty_string("@HUNTER_CONFIG_ID_PATH@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_Qt_VERSION@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SETUP_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") set(HUNTER_Qt_VERSION "@HUNTER_Qt_VERSION@") if("@MSVC@") - hunter_test_string_not_empty("@HUNTER_MSVC_ARCH@") - hunter_test_string_not_empty("@HUNTER_MSVC_VCVARSALL@") - hunter_test_string_not_empty("@HUNTER_MSVC_YEAR@") + hunter_assert_not_empty_string("@HUNTER_MSVC_ARCH@") + hunter_assert_not_empty_string("@HUNTER_MSVC_VCVARSALL@") + hunter_assert_not_empty_string("@HUNTER_MSVC_YEAR@") endif() if("@MSVC@") @@ -104,20 +105,25 @@ elseif(_is_android) if(NOT BUILD_SHARED_LIBS) hunter_user_error("Static variant of Qt is not supported") endif() + + hunter_assert_not_empty_string("${CMAKE_ANDROID_NDK}") + hunter_assert_not_empty_string("${CMAKE_ANDROID_ARCH_ABI}") + hunter_assert_not_empty_string("${CMAKE_SYSTEM_VERSION}") + #setup the android ndk options hunter_add_package(Android-SDK) list(APPEND configure_opts -xplatform android-g++ -android-sdk "${ANDROID-SDK_ROOT}/android-sdk" - -android-ndk "${ANDROID_NDK}" - -android-ndk-platform "android-${ANDROID_NATIVE_API_LEVEL}" - -android-arch "${ANDROID_NDK_ABI_NAME}" + -android-ndk "${CMAKE_ANDROID_NDK}" + -android-ndk-platform "android-${CMAKE_SYSTEM_VERSION}" + -android-arch "${CMAKE_ANDROID_ARCH_ABI}" # -android-toolchain-version # ??? -no-warnings-are-errors ) - # Hint: directory ${ANDROID_NDK}/prebuilt + # Hint: directory ${CMAKE_ANDROID_NDK}/prebuilt if(CMAKE_HOST_APPLE) list(APPEND configure_opts -android-ndk-host "darwin-x86_64") elseif(CMAKE_HOST_UNIX) @@ -139,12 +145,18 @@ elseif(_is_darwin) set(HUNTER_PATCH_QT_MACX_CLANG TRUE) elseif(_is_linux) set(HUNTER_QT_OS_IS_LINUX TRUE) - hunter_add_package(xcb) + hunter_add_package(drm) + hunter_add_package(ice) + hunter_add_package(sm) hunter_add_package(x11) + hunter_add_package(xcb) + hunter_add_package(xcursor) + hunter_add_package(xdamage) hunter_add_package(xext) + hunter_add_package(xfixes) hunter_add_package(xrender) - hunter_add_package(sm) - hunter_add_package(ice) + hunter_add_package(xshmfence) + hunter_add_package(xxf86vm) string(COMPARE EQUAL "${X11_ROOT}" "${XCB_ROOT}" is_good) if(NOT is_good) @@ -180,11 +192,22 @@ elseif(_is_linux) ) elseif("@MSVC@") list(APPEND configure_opts -platform "win32-msvc@HUNTER_MSVC_YEAR@") + if(QT_OPENGL_DESKTOP) + list(APPEND configure_opts -opengl "desktop") + endif() elseif("@MINGW@") list(APPEND configure_opts -platform "win32-g++") list(APPEND configure_opts -opengl "desktop") endif() +if(QT_WITH_GSTREAMER) + hunter_add_package(gst_plugins_bad) + hunter_add_package(gst_plugins_good) + hunter_add_package(gst_plugins_ugly) + + list(APPEND configure_opts -gstreamer 1.0) +endif() + if(HUNTER_STATUS_DEBUG AND NOT WIN32) list(APPEND configure_opts "-verbose") endif() @@ -193,6 +216,9 @@ if(BUILD_SHARED_LIBS) list(APPEND configure_opts "-shared") else() list(APPEND configure_opts "-static") + if("@MSVC@" AND NOT QT_BUILD_DYNAMIC_VSRUNTIME) + list(APPEND configure_opts "-static-runtime") + endif() endif() list(APPEND configure_opts "-prefix" "@HUNTER_PACKAGE_INSTALL_PREFIX@") @@ -231,8 +257,12 @@ list(APPEND configure_opts "-no-fontconfig") list(APPEND configure_opts "-no-gif") if(NOT WIN32) list(APPEND configure_opts "-no-glib") - list(APPEND configure_opts "-no-gtkstyle") - list(APPEND configure_opts "-no-xinput2") + if(HUNTER_Qt_VERSION VERSION_LESS 5.9) + list(APPEND configure_opts "-no-gtkstyle") + endif() + if(HUNTER_Qt_VERSION VERSION_LESS 5.12) + list(APPEND configure_opts "-no-xinput2") + endif() endif() list(APPEND configure_opts "-no-icu") list(APPEND configure_opts "-no-openssl") @@ -246,7 +276,11 @@ list(APPEND configure_opts "-qt-libjpeg") list(APPEND configure_opts "-qt-libpng") list(APPEND configure_opts "-qt-pcre") if(NOT WIN32) - list(APPEND configure_opts "-qt-xkbcommon") + if(HUNTER_Qt_VERSION VERSION_LESS 5.12) + list(APPEND configure_opts "-qt-xkbcommon") + else() + list(APPEND configure_opts "-xkbcommon") + endif() endif() list(APPEND configure_opts "-qt-zlib") ### } @@ -287,7 +321,11 @@ hunter_status_debug("Qt configure options (without -skip): ${configure_opts}") list(APPEND configure_command ${configure_opts}) -set(ANDROID_API_VERSION "${HUNTER_Android-SDK-Platform_VERSION}") +if(ANDROID) + set(ANDROID_API_VERSION "android-${CMAKE_SYSTEM_VERSION}") +else() + set(ANDROID_API_VERSION "") +endif() set(qt_component "@HUNTER_PACKAGE_COMPONENT@") set(hunter_self "@HUNTER_SELF@") @@ -307,7 +345,7 @@ endif() # lose some extra HDD space. Example: Qt base + 2 components + sources ~ 4.4G set( qt_source_dir - "@HUNTER_TOOLCHAIN_ID_PATH@/QtBuild/@HUNTER_PACKAGE_INTERNAL_DEPS_ID@" + "@HUNTER_CONFIG_ID_PATH@/QtBuild/@HUNTER_PACKAGE_INTERNAL_DEPS_ID@" ) # We are building only one component "qt_component". To skip all other @@ -353,6 +391,8 @@ configure_file( # * ANDROID # * IOS # * HUNTER_Qt_VERSION +# * HUNTER_QT_OS_IS_LINUX +# * BUILD_SHARED_LIBS configure_file( "@HUNTER_PACKAGE_SETUP_DIR@/ep-stages/qt-install.cmake.in" "@HUNTER_PACKAGE_BUILD_DIR@/qt-install.cmake" @@ -367,6 +407,8 @@ configure_file( # * is_release_debug # * is_release # * is_debug +# * global_install_dir +# * HUNTER_QT_OS_IS_LINUX configure_file( "@HUNTER_PACKAGE_SETUP_DIR@/ep-stages/qt-build.cmake.in" "@HUNTER_PACKAGE_BUILD_DIR@/qt-build.cmake" @@ -401,6 +443,8 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "${qt_source_dir}" INSTALL_DIR @@ -437,11 +481,12 @@ ExternalProject_Add( COMMAND "@CMAKE_COMMAND@" -P "${qt_source_dir}/qt-install.cmake" COMMAND # Copy license files - "@CMAKE_COMMAND@" - "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" - -P - "@HUNTER_GLOBAL_SCRIPT_DIR@/try-copy-license.cmake" + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" LOG_BUILD ${log_build} LOG_INSTALL ${log_install} ) diff --git a/cmake/projects/QtAndroidCMake/hunter.cmake b/cmake/projects/QtAndroidCMake/hunter.cmake index 249579aee..14fb7aec0 100644 --- a/cmake/projects/QtAndroidCMake/hunter.cmake +++ b/cmake/projects/QtAndroidCMake/hunter.cmake @@ -7,6 +7,39 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + QtAndroidCMake + VERSION + "1.0.9" + URL + "https://github.com/hunter-packages/qt-android-cmake/archive/v1.0.9.tar.gz" + SHA1 + 673f529d84f13e72b54beaf284f742fcb6a33b9d +) + +hunter_add_version( + PACKAGE_NAME + QtAndroidCMake + VERSION + "1.0.8" + URL + "https://github.com/hunter-packages/qt-android-cmake/archive/v1.0.8.tar.gz" + SHA1 + 7d9773fd3df22b39b30f8ff96db93f2f9720d89d +) + +hunter_add_version( + PACKAGE_NAME + QtAndroidCMake + VERSION + "1.0.7" + URL + "https://github.com/hunter-packages/qt-android-cmake/archive/v1.0.7.tar.gz" + SHA1 + e9505011129d769925ec1ecc0ef1af41134f1b5d +) + hunter_add_version( PACKAGE_NAME QtAndroidCMake diff --git a/cmake/projects/QtCMakeExtra/hunter.cmake b/cmake/projects/QtCMakeExtra/hunter.cmake index 037b99358..515022cde 100644 --- a/cmake/projects/QtCMakeExtra/hunter.cmake +++ b/cmake/projects/QtCMakeExtra/hunter.cmake @@ -228,6 +228,149 @@ hunter_add_version( d8fde85d4df5a511c14d175b02a7ee10b46b8615 ) +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.20" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.20.tar.gz" + SHA1 + e2fbc120c0000a9f8e4adb722c95cc514183a17f +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.21" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.21.tar.gz" + SHA1 + 34458c9b59b94be9f4ad96f3b0486f3362cafbbd +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.22" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.22.tar.gz" + SHA1 + a5dadedaa53f2c44e3207fd5c7edc8211cae3f83 +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.23" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.23.tar.gz" + SHA1 + a05102ed3f68cb79da70751c9e89e54daa64c0be +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.24" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.24.tar.gz" + SHA1 + d2aced482704a11ff5c5029750b2fb6f9671f622 +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.25" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.25.tar.gz" + SHA1 + 23182e08840d09cb521c362aaa7e695b7c7e3d5b +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.27" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.27.tar.gz" + SHA1 + 57f9015d9bba46c7720ac103efcd86b17ad12952 +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.28" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.28.tar.gz" + SHA1 + 940db41b3200ae6be0a559a2f3c0ba10ebb74e41 +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.29" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.29.tar.gz" + SHA1 + e18fc889ffcff5ee14d6d201acc4b7126222f915 +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.30" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.30.tar.gz" + SHA1 + 5b3df0153d8b64a008ffd1dca192c087b5c6b1a3 +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.31" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.31.tar.gz" + SHA1 + 34bcbb076116de994fdd563c2fe071d3c0d24aa5 +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.32" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.32.tar.gz" + SHA1 + 98fbb41190b629d65bee86b4cfadbd0556503b1a +) + +hunter_add_version( + PACKAGE_NAME + QtCMakeExtra + VERSION + "1.0.34" + URL + "https://github.com/hunter-packages/QtCMakeExtra/archive/v1.0.34.tar.gz" + SHA1 + f137ca99fb596ad33310db011c3a713b0c738fad +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(QtCMakeExtra) hunter_download(PACKAGE_NAME QtCMakeExtra) diff --git a/cmake/projects/RapidJSON/hunter.cmake b/cmake/projects/RapidJSON/hunter.cmake index 364caf63b..0913ab862 100644 --- a/cmake/projects/RapidJSON/hunter.cmake +++ b/cmake/projects/RapidJSON/hunter.cmake @@ -9,6 +9,28 @@ include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + RapidJSON + VERSION + "1.1.0-66eb606-p0" + URL + "https://github.com/hunter-packages/rapidjson/archive/v1.1.0-66eb606-p0.tar.gz" + SHA1 + 6889242b198cbff7cd8610f214b4218436a4a7a9 +) + +hunter_add_version( + PACKAGE_NAME + RapidJSON + VERSION + "1.1.0" + URL + "https://github.com/hunter-packages/rapidjson/archive/v1.1.0-p0.tar.gz" + SHA1 + 0d97a2d171d5a483338c21b6878f42ea5fe76503 +) + hunter_add_version( PACKAGE_NAME RapidJSON @@ -42,6 +64,17 @@ hunter_add_version( 587ef53d1b82b246f27967fa67eefc1f4c3d1719 ) +hunter_add_version( + PACKAGE_NAME + RapidJSON + VERSION + "0.11-p2" + URL + "https://github.com/hunter-packages/rapidjson/archive/v0.11-p2.tar.gz" + SHA1 + bb0bfb8ad5cf2b575b57efbf2957619735a1696e +) + hunter_add_version( PACKAGE_NAME RapidJSON diff --git a/cmake/projects/SDL2/hunter.cmake b/cmake/projects/SDL2/hunter.cmake index 3ff235155..f21a8a2a7 100644 --- a/cmake/projects/SDL2/hunter.cmake +++ b/cmake/projects/SDL2/hunter.cmake @@ -6,6 +6,72 @@ include(hunter_download) include(hunter_pick_scheme) include(hunter_cacheable) +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-p8" + URL + "https://github.com/hunter-packages/SDL2/archive/2.0.4-p8.tar.gz" + SHA1 + 568db770b6a137ce576f738638c42df4aa215c31 +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-p7" + URL + "https://github.com/hunter-packages/SDL2/archive/2.0.4-p7.tar.gz" + SHA1 + 3dddf9fc88868ba4aecc5c1e762f79eac0c06b70 +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-p6" + URL + "https://github.com/hunter-packages/SDL2/archive/2.0.4-p6.tar.gz" + SHA1 + c3b1e17ec55112f0a60d32707f70dcda5ac1d2ef +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-p5" + URL + "https://github.com/hunter-packages/SDL2/archive/2.0.4-p5.tar.gz" + SHA1 + 14dcb4c439f0dbd71ad0b92184b35e3a7f29e3ca +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-p4" + URL + "https://github.com/hunter-packages/SDL2/archive/2.0.4-p4.tar.gz" + SHA1 + 589fcb46963b28e9d968646af54add6f4b19890c +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-p3" + URL + "https://github.com/hunter-packages/SDL2/archive/2.0.4-p3.tar.gz" + SHA1 + 811f7577fb71fd84a391ef8c4878325effb56a8c +) + hunter_add_version( PACKAGE_NAME SDL2 @@ -28,6 +94,72 @@ hunter_add_version( daebe20807e166f62f3671f742e81e8d2959388b ) +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.7-p1" + URL + "https://github.com/hunter-packages/SDL2/archive/v2.0.7-p1.tar.gz" + SHA1 + a3550bae876c3b6ca7c160a2ee583f04cb38207a +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.7-p2" + URL + "https://github.com/hunter-packages/SDL2/archive/v2.0.7-p2.tar.gz" + SHA1 + 276390a8b41667f0f5c9e298825256cf7ac6a24b +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.7-p3" + URL + "https://github.com/hunter-packages/SDL2/archive/v2.0.7-p3.tar.gz" + SHA1 + ee6639485622d0f81163cd2c7ee5c54c89e85482 +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-urho-p2" + URL + "https://github.com/hunter-packages/SDL2/archive/v2.0.4-urho-p2.tar.gz" + SHA1 + 0d78d5fa59fb009e3ce9125cc518891889d09451 +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-urho-p3" + URL + "https://github.com/hunter-packages/SDL2/archive/v2.0.4-urho-p3.tar.gz" + SHA1 + 4890004c9ba78d5aefe86e75b6197272d535c441 +) + +hunter_add_version( + PACKAGE_NAME + SDL2 + VERSION + "2.0.4-urho-p4" + URL + "https://github.com/hunter-packages/SDL2/archive/v2.0.4-urho-p4.tar.gz" + SHA1 + 580a574f6da1634500448dddf4a73b80c54d168c +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(SDL2) hunter_download(PACKAGE_NAME SDL2) diff --git a/cmake/projects/SQLite3/hunter.cmake b/cmake/projects/SQLite3/hunter.cmake deleted file mode 100644 index 73538060b..000000000 --- a/cmake/projects/SQLite3/hunter.cmake +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (c) 2015, Ruslan Baratov, Alexandre Pretyman -# All rights reserved. - -# !!! DO NOT PLACE HEADER GUARDS HERE !!! - -include(hunter_add_version) -include(hunter_cacheable) -include(hunter_configuration_types) -include(hunter_download) -include(hunter_pick_scheme) - -hunter_add_version( - PACKAGE_NAME - SQLite3 - VERSION - "autoconf-3080803" - URL - "https://www.sqlite.org/2015/sqlite-autoconf-3080803.tar.gz" - SHA1 - 2fe3f6226a2a08a2e814b97cd53e36bb3c597112 -) - -hunter_configuration_types(SQLite3 CONFIGURATION_TYPES Release) -hunter_pick_scheme(DEFAULT url_sha1_sqlite3_autotools) -hunter_cacheable(SQLite3) -hunter_download( - PACKAGE_NAME SQLite3 - PACKAGE_INTERNAL_DEPS_ID "2" - PACKAGE_UNRELOCATABLE_TEXT_FILES - "lib/libsqlite3.la" - "lib/pkgconfig/sqlite3.pc" -) diff --git a/cmake/projects/SQLite3/schemes/url_sha1_sqlite3_autotools.cmake.in b/cmake/projects/SQLite3/schemes/url_sha1_sqlite3_autotools.cmake.in deleted file mode 100644 index 13c70c5d7..000000000 --- a/cmake/projects/SQLite3/schemes/url_sha1_sqlite3_autotools.cmake.in +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (c) 2013, 2015 Ruslan Baratov, Alexandre Pretyman -# All rights reserved. - -cmake_minimum_required(VERSION 3.0) -project(Hunter) - -list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") - -include(hunter_autotools_project) -include(hunter_status_debug) -include(hunter_test_string_not_empty) -include(hunter_user_error) - -hunter_status_debug("Scheme: url_sha1_sqlite3_autotools") - -if("@MSVC@") - hunter_user_error("Autotools scheme not supported with Visual Studio") -endif() - -# Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") - -hunter_autotools_project("@HUNTER_EP_NAME@" - HUNTER_SELF - "@HUNTER_SELF@" - URL - @HUNTER_PACKAGE_URL@ - URL_HASH - SHA1=@HUNTER_PACKAGE_SHA1@ - DOWNLOAD_DIR - "@HUNTER_PACKAGE_DOWNLOAD_DIR@" - SOURCE_DIR - "@HUNTER_PACKAGE_SOURCE_DIR@" - BUILD_DIR - "@HUNTER_PACKAGE_BUILD_DIR@" - INSTALL_DIR - "@HUNTER_PACKAGE_INSTALL_PREFIX@" - GLOBAL_INSTALL_DIR - "@HUNTER_INSTALL_PREFIX@" - PARALLEL_JOBS - "@HUNTER_JOBS_OPTION@" - PACKAGE_CONFIGURATION_TYPES - "@HUNTER_PACKAGE_CONFIGURATION_TYPES@" - CPPFLAGS - "-DSQLITE_ENABLE_UNLOCK_NOTIFY=1 -DSQLITE_ENABLE_RTREE=1" -) - diff --git a/cmake/projects/Sources-for-Android-SDK/hunter.cmake b/cmake/projects/Sources-for-Android-SDK/hunter.cmake index 03ead9778..8e46dc5ea 100755 --- a/cmake/projects/Sources-for-Android-SDK/hunter.cmake +++ b/cmake/projects/Sources-for-Android-SDK/hunter.cmake @@ -53,5 +53,16 @@ hunter_add_version( 0f83c14ed333c45d962279ab5d6bc98a0269ef84 ) +hunter_add_version( + PACKAGE_NAME + Sources-for-Android-SDK + VERSION + "24" # version affects layout: /sources/android-24 + URL + "http://dl-ssl.google.com/android/repository/sources-24_r01.zip" + SHA1 + 6b96115830a83d654479f32ce4b724ca9011148b +) + hunter_pick_scheme(DEFAULT url_sha1_unpack) hunter_download(PACKAGE_NAME Sources-for-Android-SDK) diff --git a/cmake/projects/Sugar/hunter.cmake b/cmake/projects/Sugar/hunter.cmake deleted file mode 100644 index 1fd4c0fa2..000000000 --- a/cmake/projects/Sugar/hunter.cmake +++ /dev/null @@ -1,187 +0,0 @@ -# Copyright (c) 2013, Ruslan Baratov -# All rights reserved. - -# !!! DO NOT PLACE HEADER GUARDS HERE !!! - -include(hunter_add_version) -include(hunter_download) -include(hunter_pick_scheme) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.0" - URL - "https://github.com/ruslo/sugar/archive/v1.0.0.tar.gz" - SHA1 - 3f1360e447dd23d3db9ce010e217053deb6aebde -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.1" - URL - "https://github.com/ruslo/sugar/archive/v1.0.1.tar.gz" - SHA1 - 1a8e29badc0e97913996e5228dc9b1788284e416 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.2" - URL - "https://github.com/ruslo/sugar/archive/v1.0.2.tar.gz" - SHA1 - 393a2c190f76f52b253089d0a03c08de562a8622 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.3" - URL - "https://github.com/ruslo/sugar/archive/v1.0.3.tar.gz" - SHA1 - d0929748df6c4cc7126863d5799018e513c73f27 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.4" - URL - "https://github.com/ruslo/sugar/archive/v1.0.4.tar.gz" - SHA1 - f5547294647ed386e7bed7fc489f1ba53ab30b57 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.5" - URL - "https://github.com/ruslo/sugar/archive/v1.0.5.tar.gz" - SHA1 - 0b410ec9576be60ac86bf81cf74def4b79efd342 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.6" - URL - "https://github.com/ruslo/sugar/archive/v1.0.6.tar.gz" - SHA1 - 6979695f6802b2c980e453dc2eb3ca1ab6bb9fe0 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.7" - URL - "https://github.com/ruslo/sugar/archive/v1.0.7.tar.gz" - SHA1 - a364edec71e6d52b809efba833e3041402d2a267 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.8" - URL - "https://github.com/ruslo/sugar/archive/v1.0.8.tar.gz" - SHA1 - eca1cd13c0399c50c257dcb679c04ca8177307b8 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.9" - URL - "https://github.com/ruslo/sugar/archive/v1.0.9.tar.gz" - SHA1 - fca4165caa3faa2ec88e207ea009927020e443cb -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.10" - URL - "https://github.com/ruslo/sugar/archive/v1.0.10.tar.gz" - SHA1 - ca73f6599986089968b112394e9bc7cbb253c574 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.0.11" - URL - "https://github.com/ruslo/sugar/archive/v1.0.11.tar.gz" - SHA1 - ce98a7090a7fbc0197310c7299746568fddf6a43 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.1.0" - URL - "https://github.com/ruslo/sugar/archive/v1.1.0.tar.gz" - SHA1 - 29bf1bb1f9920781ab17e8a5c9e329f308be03a8 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.2.0" - URL - "https://github.com/ruslo/sugar/archive/v1.2.0.tar.gz" - SHA1 - cf9e625d6cadcae3c391cdb799171fd4889bc086 -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.2.1" - URL - "https://github.com/ruslo/sugar/archive/v1.2.1.tar.gz" - SHA1 - 7943038d1c3a418ae1a91ca95ec839cf06f166da -) - -hunter_add_version( - PACKAGE_NAME - Sugar - VERSION - "1.2.2" - URL - "https://github.com/ruslo/sugar/archive/v1.2.2.tar.gz" - SHA1 - f33ac0045d6ee4582d41f5290010802ad72fe2fa -) - -hunter_pick_scheme(DEFAULT url_sha1_unpack) -hunter_download(PACKAGE_NAME Sugar) diff --git a/cmake/projects/TIFF/hunter.cmake b/cmake/projects/TIFF/hunter.cmake index 902160a30..4d85dfc4f 100644 --- a/cmake/projects/TIFF/hunter.cmake +++ b/cmake/projects/TIFF/hunter.cmake @@ -52,6 +52,28 @@ hunter_add_version( 37c71656488797c4e5fde620570f1a1b9be36037 ) +hunter_add_version( + PACKAGE_NAME + TIFF + VERSION + "4.0.2-p4" + URL + "https://github.com/hunter-packages/tiff/archive/v4.0.2-p4.tar.gz" + SHA1 + 9ab44e0136d3da04b0a559d7ba57bd075afc48f9 +) + +hunter_add_version( + PACKAGE_NAME + TIFF + VERSION + "4.0.2-p5" + URL + "https://github.com/hunter-packages/tiff/archive/v4.0.2-p5.tar.gz" + SHA1 + 7bee2843b47c5f9865973b7235e58aa3fb26e1b0 +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(TIFF) hunter_download(PACKAGE_NAME TIFF) diff --git a/cmake/projects/ZLIB/hunter.cmake b/cmake/projects/ZLIB/hunter.cmake index 49d54e690..fd279f097 100755 --- a/cmake/projects/ZLIB/hunter.cmake +++ b/cmake/projects/ZLIB/hunter.cmake @@ -12,11 +12,22 @@ hunter_add_version( PACKAGE_NAME ZLIB VERSION - "1.2.8-p3" + "1.2.8-hunter" URL - "https://github.com/hunter-packages/zlib/archive/v1.2.8-p3.tar.gz" + "https://github.com/hunter-packages/zlib/archive/v1.2.8-hunter.tar.gz" SHA1 - 573dc28474be47d0c7abc1475a14aa12f0dfcadc + 75a05fcc928ed52e1eeb93f07a1c78a7890860c0 +) + +hunter_add_version( + PACKAGE_NAME + ZLIB + VERSION + "1.2.8-hunter-1" + URL + "https://github.com/hunter-packages/zlib/archive/v1.2.8-hunter-1.tar.gz" + SHA1 + 24c89e4b193a56bb411fa9878968002ebe2c6209 ) hunter_add_version( @@ -34,24 +45,39 @@ hunter_add_version( PACKAGE_NAME ZLIB VERSION - "1.2.8-hunter-1" + "1.2.8-p3" URL - "https://github.com/hunter-packages/zlib/archive/v1.2.8-hunter-1.tar.gz" + "https://github.com/hunter-packages/zlib/archive/v1.2.8-p3.tar.gz" SHA1 - 24c89e4b193a56bb411fa9878968002ebe2c6209 + 573dc28474be47d0c7abc1475a14aa12f0dfcadc ) hunter_add_version( PACKAGE_NAME ZLIB VERSION - "1.2.8-hunter" + "1.2.11-p0" URL - "https://github.com/hunter-packages/zlib/archive/v1.2.8-hunter.tar.gz" + "https://github.com/hunter-packages/zlib/archive/v1.2.11-p0.tar.gz" SHA1 - 75a05fcc928ed52e1eeb93f07a1c78a7890860c0 + 9ced8b310aa341af7f3584bac0b2d2a669d2178b +) + +hunter_add_version( + PACKAGE_NAME + ZLIB + VERSION + "1.2.11-p1" + URL + "https://github.com/hunter-packages/zlib/archive/v1.2.11-p1.tar.gz" + SHA1 + fbb8be77db5cb3f4d1b269f273a357d22ccc4b32 ) hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(ZLIB) -hunter_download(PACKAGE_NAME ZLIB) +hunter_download(PACKAGE_NAME ZLIB + PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "share/pkgconfig/zlib.pc" +) diff --git a/cmake/projects/ZMQPP/hunter.cmake b/cmake/projects/ZMQPP/hunter.cmake index 3861e0f42..84ca31127 100644 --- a/cmake/projects/ZMQPP/hunter.cmake +++ b/cmake/projects/ZMQPP/hunter.cmake @@ -16,6 +16,28 @@ hunter_add_version( 549d2d0078ed636d90ed0febe687a058bdd0d64d ) +hunter_add_version( + PACKAGE_NAME + ZMQPP + VERSION + "4.1.2-p3" + URL + "https://github.com/hunter-packages/zmqpp/archive/v4.1.2-p3.tar.gz" + SHA1 + fdc3a0d5a4e907c79709ec2fc3fcf4105ff1b91a + ) + +hunter_add_version( + PACKAGE_NAME + ZMQPP + VERSION + "4.2.0-p0" + URL + "https://github.com/hunter-packages/zmqpp/archive/v4.2.0-p0.tar.gz" + SHA1 + 0cf43d00fa22d26c5bf7a3c5d9f5f5c72cc92982 + ) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(ZMQPP) hunter_download(PACKAGE_NAME ZMQPP) diff --git a/cmake/projects/ZeroMQ/hunter.cmake b/cmake/projects/ZeroMQ/hunter.cmake index 39001d56c..fa0ac4bd3 100644 --- a/cmake/projects/ZeroMQ/hunter.cmake +++ b/cmake/projects/ZeroMQ/hunter.cmake @@ -28,6 +28,17 @@ hunter_add_version( be57db45f4f998c04d1804132b1302f923405fa4 ) +hunter_add_version( + PACKAGE_NAME + ZeroMQ + VERSION + "4.2.3-p1" + URL + "https://github.com/hunter-packages/libzmq/releases/download/v4.2.3-hunter-1/libzmq-4.2.3-hunter-1.tar.gz" + SHA1 + 14ce51a8940f9f23d821a3363c128a51bfafa257 +) + hunter_cmake_args(ZeroMQ CMAKE_ARGS ZMQ_BUILD_TESTS=OFF) hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(ZeroMQ) diff --git a/cmake/projects/cereal/hunter.cmake b/cmake/projects/cereal/hunter.cmake index 5da735ab9..85c5670ed 100644 --- a/cmake/projects/cereal/hunter.cmake +++ b/cmake/projects/cereal/hunter.cmake @@ -12,6 +12,28 @@ include(hunter_cacheable) hunter_cacheable(cereal) +hunter_add_version( + PACKAGE_NAME + cereal + VERSION + "1.2.2-p0" + URL + "https://github.com/hunter-packages/cereal/archive/v1.2.2-p0.tar.gz" + SHA1 + 7325d29644654c16f066a8c887665c2cf78226c2 + ) + +hunter_add_version( + PACKAGE_NAME + cereal + VERSION + "1.2.1-p1" + URL + "https://github.com/headupinclouds/cereal/archive/v1.2.1-p1.tar.gz" + SHA1 + 8d8179d71a12bafae3d90b6a5a7fc09cb2e69474 + ) + # List of versions here... hunter_add_version( PACKAGE_NAME @@ -22,7 +44,13 @@ hunter_add_version( "https://github.com/headupinclouds/cereal/archive/v1.1.2-p5.tar.gz" SHA1 4b761dacf480b2dafab02f7f50060bc6c9e78dc7 -) + ) + + hunter_cmake_args( + cereal + CMAKE_ARGS + JUST_INSTALL_CEREAL=ON + ) # Pick a download scheme hunter_pick_scheme(DEFAULT url_sha1_cmake) diff --git a/cmake/projects/cvmatio/hunter.cmake b/cmake/projects/cvmatio/hunter.cmake index 49e48e7f5..1d6fc7cee 100644 --- a/cmake/projects/cvmatio/hunter.cmake +++ b/cmake/projects/cvmatio/hunter.cmake @@ -10,6 +10,17 @@ include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + cvmatio + VERSION + "1.0.28" + URL + https://github.com/hunter-packages/cvmatio/archive/v1.0.28.tar.gz + SHA1 + 42005086c8c4f85ffcf7f42652c24c8fec3fbe76 +) + hunter_add_version( PACKAGE_NAME cvmatio diff --git a/cmake/projects/damageproto/hunter.cmake b/cmake/projects/damageproto/hunter.cmake index 9d37cb17d..00410693f 100644 --- a/cmake/projects/damageproto/hunter.cmake +++ b/cmake/projects/damageproto/hunter.cmake @@ -26,6 +26,6 @@ hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(damageproto) hunter_download( PACKAGE_NAME damageproto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/damageproto.pc" ) diff --git a/cmake/projects/dest/hunter.cmake b/cmake/projects/dest/hunter.cmake index 96f5f2d3b..81ba347d6 100644 --- a/cmake/projects/dest/hunter.cmake +++ b/cmake/projects/dest/hunter.cmake @@ -19,6 +19,17 @@ hunter_add_version( 8ba961af7c59548cee4dad8ebef042d9eb5bf581 ) +hunter_add_version( + PACKAGE_NAME + dest + VERSION + "0.8.0-p4" + URL + "https://github.com/hunter-packages/dest/archive/v0.8.0-p4.tar.gz" + SHA1 + 36e9e2fef97b91811e346d0eec46e54bcd87e35a + ) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(dest) hunter_download(PACKAGE_NAME dest) diff --git a/cmake/projects/dlib/hunter.cmake b/cmake/projects/dlib/hunter.cmake index be69319ac..f25fc6d2c 100644 --- a/cmake/projects/dlib/hunter.cmake +++ b/cmake/projects/dlib/hunter.cmake @@ -5,9 +5,230 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.17-p0" + URL + "https://github.com/hunter-packages/dlib/archive/v19.17-p0.tar.gz" + SHA1 + d7fd9d4cec0909be0bbd9c803fd3ed42a5f9f601 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.16-p0" + URL + "https://github.com/hunter-packages/dlib/archive/v19.16-p0.tar.gz" + SHA1 + 4e0bc81270ed8fc30e0288276e28ccb425e974f1 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.14-p0" + URL + "https://github.com/hunter-packages/dlib/archive/v19.14-p0.tar.gz" + SHA1 + 22c52e64ff0e5f8bdd163333153f7c6ac98ef5ee +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.12-p2" + URL + "https://github.com/hunter-packages/dlib/archive/v19.12-p2.tar.gz" + SHA1 + 016b26e1378044d1fe7f1df42738505e1315d310 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.12-p1" + URL + "https://github.com/hunter-packages/dlib/archive/v19.12-p1.tar.gz" + SHA1 + 2f4d339f92b5ba0462eddafb21af9625e734d590 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.12-p0" + URL + "https://github.com/hunter-packages/dlib/archive/v19.12-p0.tar.gz" + SHA1 + c3f7b6a8eb0e4256dc0130d319555a5e6040b4c1 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.10-p4" + URL + "https://github.com/hunter-packages/dlib/archive/v19.10-p4.tar.gz" + SHA1 + 3b0d66d73351a2d42a2e28044f568a5224f458ce +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.10-p3" + URL + "https://github.com/hunter-packages/dlib/archive/v19.10-p3.tar.gz" + SHA1 + 42817cf82b7f300c9b2d647d270ada5b02b3709c +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.10-p2" + URL + "https://github.com/hunter-packages/dlib/archive/v19.10-p2.tar.gz" + SHA1 + 8962447a89512ac93904aec2c94d1138d07006b0 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.8-p0" + URL + "https://github.com/hunter-packages/dlib/archive/v19.8-p0.tar.gz" + SHA1 + 42a19443f08d3015b105550db85b3161f1020325 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.6-p2" + URL + "https://github.com/hunter-packages/dlib/archive/v19.6-p2.tar.gz" + SHA1 + 2f763c72f9d7fc5f2d7120d775a37606a4b3b899 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.6-p1" + URL + "https://github.com/hunter-packages/dlib/archive/v19.6-p1.tar.gz" + SHA1 + 1f514ffabb5aced4248f40e22db701f0356dcb0f +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.6-p0" + URL + "https://github.com/hunter-packages/dlib/archive/v19.6-p0.tar.gz" + SHA1 + e48b67dc6cf02ec8fdf936f2fddf78b8146f5469 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.4-p3" + URL + "https://github.com/hunter-packages/dlib/archive/v19.4-p3.tar.gz" + SHA1 + 8c56def3b12b1d70935947c1f0611290d221f496 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.4-p2" + URL + "https://github.com/hunter-packages/dlib/archive/v19.4-p2.tar.gz" + SHA1 + 119231fe068799efd0922594dc580a18ebdb3a15 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.4-p1" + URL + "https://github.com/hunter-packages/dlib/archive/v19.4-p1.tar.gz" + SHA1 + 4e6c8adfa97092bf45bfd83c3036d1e4a6052c84 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.2-p1" + URL + "https://github.com/hunter-packages/dlib/archive/v19.2-p1.tar.gz" + SHA1 + fec7fdc72c42c5bc1ca466f9be325594921a80c8 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.2-p2" + URL + "https://github.com/hunter-packages/dlib/archive/v19.2-p2.tar.gz" + SHA1 + 5ce3d09490536dc0dc9bcb0d14ee25f1bebdbfa3 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.0-p3" + URL + "https://github.com/hunter-packages/dlib/archive/v19.0-p3.tar.gz" + SHA1 + 9671c304c770b580921a6aba7287a92cf5db5417 +) + +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.0-p2" + URL + "https://github.com/hunter-packages/dlib/archive/v19.0-p2.tar.gz" + SHA1 + 549550ab2da038b32eca3e0247c0da4f0df253df +) + hunter_add_version( PACKAGE_NAME dlib @@ -41,6 +262,28 @@ hunter_add_version( bf73cd97ab81162e085d06f1b4595902abe5a436 ) +hunter_add_version( + PACKAGE_NAME + dlib + VERSION + "19.8-p1" + URL + "https://github.com/hunter-packages/dlib/archive/v19.8-p1.tar.gz" + SHA1 + 83426cea82aad42a0f7b1d6bac42996c4f2b69ea +) + +hunter_cmake_args( + dlib + CMAKE_ARGS + DLIB_PNG_SUPPORT=ON + DLIB_GIF_SUPPORT=ON + DLIB_JPEG_SUPPORT=ON + DLIB_NO_GUI_SUPPORT=ON + DLIB_LINK_WITH_SQLITE3=ON + HUNTER_INSTALL_LICENSE_FILES=dlib/LICENSE.txt +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(dlib) hunter_download(PACKAGE_NAME dlib) diff --git a/cmake/projects/dri2proto/hunter.cmake b/cmake/projects/dri2proto/hunter.cmake index b28f7dec1..1fbd9f0c5 100644 --- a/cmake/projects/dri2proto/hunter.cmake +++ b/cmake/projects/dri2proto/hunter.cmake @@ -26,6 +26,6 @@ hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(dri2proto) hunter_download( PACKAGE_NAME dri2proto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/dri2proto.pc" ) diff --git a/cmake/projects/dri3proto/hunter.cmake b/cmake/projects/dri3proto/hunter.cmake index ce9cc8158..30baf18fc 100644 --- a/cmake/projects/dri3proto/hunter.cmake +++ b/cmake/projects/dri3proto/hunter.cmake @@ -26,6 +26,6 @@ hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(dri3proto) hunter_download( PACKAGE_NAME dri3proto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/dri3proto.pc" ) diff --git a/cmake/projects/drm/hunter.cmake b/cmake/projects/drm/hunter.cmake index f5b00ac0c..723421d5d 100644 --- a/cmake/projects/drm/hunter.cmake +++ b/cmake/projects/drm/hunter.cmake @@ -22,6 +22,17 @@ hunter_add_version( 21d43437219ddd1e409fb4b7d77254cd129e8075 ) +hunter_add_version( + PACKAGE_NAME + drm + VERSION + "2.4.94" + URL + "https://dri.freedesktop.org/libdrm/libdrm-2.4.94.tar.bz2" + SHA1 + f8daee6cc2e7d2c9eb2dd062a2712172fb9f4e18 +) + hunter_configuration_types(drm CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) set(drm_dependencies @@ -37,7 +48,7 @@ hunter_cmake_args( hunter_cacheable(drm) hunter_download( PACKAGE_NAME drm - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libdrm.la" "lib/libdrm_amdgpu.la" diff --git a/cmake/projects/eos/hunter.cmake b/cmake/projects/eos/hunter.cmake index 7c7a1fd3c..2a64b058a 100644 --- a/cmake/projects/eos/hunter.cmake +++ b/cmake/projects/eos/hunter.cmake @@ -1,4 +1,5 @@ -# Copyright (c) 2016, Ruslan Baratov +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -9,6 +10,28 @@ include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + eos + VERSION + 0.12.1 + URL + "https://github.com/hunter-packages/eos/archive/v0.12.1.tar.gz" + SHA1 + cbc8143c270fe4ade45be47adae83f34db280659 +) + +hunter_add_version( + PACKAGE_NAME + eos + VERSION + 0.6.1-p1 + URL + "https://github.com/hunter-packages/eos/archive/v0.6.1-p1.tar.gz" + SHA1 + 663e02aa35275f9dc447e8d4004e091f107eb686 +) + hunter_add_version( PACKAGE_NAME eos diff --git a/cmake/projects/fixesproto/hunter.cmake b/cmake/projects/fixesproto/hunter.cmake index 48481d8a1..7187a214d 100644 --- a/cmake/projects/fixesproto/hunter.cmake +++ b/cmake/projects/fixesproto/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) @@ -23,9 +24,14 @@ hunter_add_version( hunter_configuration_types(fixesproto CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cmake_args( + fixesproto + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=fixesproto +) hunter_cacheable(fixesproto) hunter_download( PACKAGE_NAME fixesproto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/fixesproto.pc" ) diff --git a/cmake/projects/flatbuffers/hunter.cmake b/cmake/projects/flatbuffers/hunter.cmake index 6f5a834be..069dde41a 100644 --- a/cmake/projects/flatbuffers/hunter.cmake +++ b/cmake/projects/flatbuffers/hunter.cmake @@ -20,12 +20,22 @@ hunter_add_version( b031689b876c2abac28c8e22fea68ca6d572d1f5 ) +hunter_add_version( + PACKAGE_NAME + flatbuffers + VERSION + 1.8.0-p1 + URL + "https://github.com/google/flatbuffers/archive/dfe68566e4b90d90635f19f466dc3f4b50a58a4f.zip" + SHA1 + 7f596e79368bc0d3080d22708bcc7625cc03a1d1 +) + hunter_cmake_args( flatbuffers CMAKE_ARGS FLATBUFFERS_BUILD_FLATC=OFF FLATBUFFERS_BUILD_FLATHASH=OFF - FLATBUFFERS_BUILD_FLATLIB=OFF FLATBUFFERS_BUILD_TESTS=OFF ) diff --git a/cmake/projects/fmt/hunter.cmake b/cmake/projects/fmt/hunter.cmake index 322f008ef..34154d81d 100644 --- a/cmake/projects/fmt/hunter.cmake +++ b/cmake/projects/fmt/hunter.cmake @@ -19,11 +19,45 @@ hunter_add_version( 82ca4625f977ee1e0627ce8421bc52fbbf6e5cc5 ) +hunter_add_version( + PACKAGE_NAME + fmt + VERSION + "4.0.0" + URL + "https://github.com/fmtlib/fmt/archive/4.0.0.tar.gz" + SHA1 + d52942b4a31fb94dbb2cca36c90e34209033408f +) + +hunter_add_version( + PACKAGE_NAME + fmt + VERSION + "4.1.0" + URL + "https://github.com/fmtlib/fmt/archive/4.1.0.tar.gz" + SHA1 + 9df8f7a70c1b45ffe308e8e3f4f92b31cb927a7a +) + +hunter_add_version( + PACKAGE_NAME + fmt + VERSION + "5.2.1" + URL + "https://github.com/fmtlib/fmt/archive/5.2.1.tar.gz" + SHA1 + 8b38f1ecdf137e8ca24e9b66145c1b94fa5f921d +) + hunter_cmake_args( fmt CMAKE_ARGS FMT_DOC=OFF FMT_TEST=OFF + FMT_USE_CPP14=OFF # don't force c++14 ) # Pick a download scheme diff --git a/cmake/projects/freetype/hunter.cmake b/cmake/projects/freetype/hunter.cmake index 49d542f86..35f680d17 100644 --- a/cmake/projects/freetype/hunter.cmake +++ b/cmake/projects/freetype/hunter.cmake @@ -4,9 +4,32 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + freetype + VERSION + "2.9.1-p1" + URL + "https://github.com/hunter-packages/freetype/archive/v2.9.1-p1.tar.gz" + SHA1 + d4000efdea07253ff2dc9132403e09c321ec88ea +) + +hunter_add_version( + PACKAGE_NAME + freetype + VERSION + "2.9.1-p0" + URL + "https://github.com/hunter-packages/freetype/archive/v2.9.1-p0.tar.gz" + SHA1 + e3b929a3af402059e88c847dd9b92e92c10401fe +) + hunter_add_version( PACKAGE_NAME freetype @@ -18,6 +41,37 @@ hunter_add_version( d797e30cfa79eb95dc3b67e75fa6d6a3da80d1ae ) +hunter_add_version( + PACKAGE_NAME + freetype + VERSION + "2.4.12-p0" + URL + "https://github.com/hunter-packages/freetype/archive/v2.4.12-p0.tar.gz" + SHA1 + 6623f3b91b921c71c4b4485f67b252a7025eb18e +) + +hunter_add_version( + PACKAGE_NAME + freetype + VERSION + "2.4.12-p1" + URL + "https://github.com/hunter-packages/freetype/archive/v2.4.12-p1.tar.gz" + SHA1 + 7f172287e594c916150f1b2a2882a188f945e969 +) + +hunter_cmake_args( + freetype + CMAKE_ARGS + FT_WITH_PNG=ON + FT_WITH_ZLIB=ON + FT_WITH_BZIP2=ON + FT_WITH_HARFBUZZ=OFF # harfbuzz already depends on freetype! +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(freetype) hunter_download(PACKAGE_NAME freetype) diff --git a/cmake/projects/geos/hunter.cmake b/cmake/projects/geos/hunter.cmake index 5401a5b8e..d6018cef7 100644 --- a/cmake/projects/geos/hunter.cmake +++ b/cmake/projects/geos/hunter.cmake @@ -21,4 +21,7 @@ hunter_add_version( hunter_configuration_types(geos CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) -hunter_download(PACKAGE_NAME geos) +hunter_download( + PACKAGE_NAME geos + PACKAGE_INTERNAL_DEPS_ID "2" +) diff --git a/cmake/projects/gflags/hunter.cmake b/cmake/projects/gflags/hunter.cmake index 8fbd44923..c98669937 100644 --- a/cmake/projects/gflags/hunter.cmake +++ b/cmake/projects/gflags/hunter.cmake @@ -5,9 +5,21 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + gflags + VERSION + 2.1.2-p1 + URL + "https://github.com/hunter-packages/gflags/archive/v2.1.2-p1.tar.gz" + SHA1 + 24cfd7c456193fda187db993075b3c2b15b4f2c9 +) + hunter_add_version( PACKAGE_NAME gflags @@ -19,6 +31,23 @@ hunter_add_version( 113255cba87b6af61663014f446e2d69d0d2bc3a ) +hunter_add_version( + PACKAGE_NAME + gflags + VERSION + 2.2.1 + URL + "https://github.com/gflags/gflags/archive/v2.2.1.tar.gz" + SHA1 + b1c82261c8b9c87fb2fb5de6bdf70121ad1cca58 +) + +hunter_cmake_args( + gflags + CMAKE_ARGS + REGISTER_INSTALL_PREFIX=OFF +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(gflags) hunter_download(PACKAGE_NAME gflags) diff --git a/cmake/projects/glew/hunter.cmake b/cmake/projects/glew/hunter.cmake index 4fae75b7d..c678d3244 100644 --- a/cmake/projects/glew/hunter.cmake +++ b/cmake/projects/glew/hunter.cmake @@ -21,6 +21,17 @@ hunter_add_version( 4355b4a89e11a4ce575b7b4858bfe7511be53b36 ) +hunter_add_version( + PACKAGE_NAME + glew + VERSION + "2.0.0-p1" + URL + "https://github.com/hunter-packages/glew/archive/v2.0.0-p1.tar.gz" + SHA1 + 6a305e0cd0b2b4f02cc82809ba7e258c427ff36b +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(glew) hunter_download( @@ -30,4 +41,3 @@ hunter_download( # https://github.com/ruslo/hunter/issues/486 is implemented PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/cmake/glew/glewTargets.cmake" ) - diff --git a/cmake/projects/glfw/hunter.cmake b/cmake/projects/glfw/hunter.cmake index 992a5455c..4f7f5cec6 100644 --- a/cmake/projects/glfw/hunter.cmake +++ b/cmake/projects/glfw/hunter.cmake @@ -1,4 +1,5 @@ -# Copyright (c) 2016, Alexandre Pretyman +# Copyright (c) 2016-2017, Alexandre Pretyman +# Copyright (c) 2017, David Hirvonen # All rights reserved. if(EMSCRIPTEN) @@ -6,9 +7,11 @@ if(EMSCRIPTEN) endif() include(hunter_add_version) -include(hunter_pick_scheme) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_download) +include(hunter_pick_scheme) +include(GNUInstallDirs) hunter_add_version( PACKAGE_NAME @@ -19,8 +22,83 @@ hunter_add_version( "https://github.com/hunter-packages/glfw/archive/3.2-p0.tar.gz" SHA1 90f91bab3020db15a0fc07c27c53095fa2dbf1b3 + ) + +hunter_add_version( + PACKAGE_NAME + glfw + VERSION + "3.3.0-p0" + URL + "https://github.com/hunter-packages/glfw/archive/3.3.0-p0.tar.gz" + SHA1 + 3621fc665397f07c57d1c77ac4d85d4634f18d3a + ) + +hunter_add_version( + PACKAGE_NAME + glfw + VERSION + "3.3.0-p1" + URL + "https://github.com/hunter-packages/glfw/archive/3.3.0-p1.tar.gz" + SHA1 + 3b42c415f6f6f197768857d12ba44f77e9f1fc50 ) +hunter_add_version( + PACKAGE_NAME + glfw + VERSION + "3.3.0-p2" + URL + "https://github.com/hunter-packages/glfw/archive/3.3.0-p2.tar.gz" + SHA1 + 980c5b788849da9e8429e8f57a10569620b2fa07 +) + +hunter_add_version( + PACKAGE_NAME + glfw + VERSION + "3.3.0-p3" + URL + "https://github.com/hunter-packages/glfw/archive/3.3.0-p3.tar.gz" + SHA1 + 76b9d007591ac1464c443066f4e9db1a0b973efc +) + +hunter_add_version( + PACKAGE_NAME + glfw + VERSION + "3.3.0-p4" + URL + "https://github.com/hunter-packages/glfw/archive/3.3.0-p4.tar.gz" + SHA1 + 455c97ea01a1b78ae39a72d00d86eb1c455e0dca +) + +hunter_add_version( + PACKAGE_NAME + glfw + VERSION + "3.3.0-f9923e9-p0" + URL + "https://github.com/hunter-packages/glfw/archive/v3.3.0-f9923e9-p0.tar.gz" + SHA1 + 533debc50f12ce147d54d210408c7e33654f10a4 +) + +hunter_cmake_args( + glfw + CMAKE_ARGS + GLFW_BUILD_EXAMPLES=OFF + GLFW_BUILD_TESTS=OFF + GLFW_BUILD_DOCS=OFF + GLFW_INSTALL=ON + ) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(glfw) hunter_download( @@ -30,8 +108,7 @@ hunter_download( # Patching of glfw3Targets.cmake required as it has full paths due to the lack # of imported targets for x11 packages. This should be removed when # https://github.com/ruslo/hunter/issues/486 is implemented - "lib/cmake/glfw3/glfw3Targets.cmake" - "lib/pkgconfig/glfw3.pc" + "${CMAKE_INSTALL_LIBDIR}/cmake/glfw3/glfw3Targets.cmake" + "${CMAKE_INSTALL_LIBDIR}/pkgconfig/glfw3.pc" ) - diff --git a/cmake/projects/glm/hunter.cmake b/cmake/projects/glm/hunter.cmake index bd0f7ecac..91801eb21 100644 --- a/cmake/projects/glm/hunter.cmake +++ b/cmake/projects/glm/hunter.cmake @@ -2,9 +2,10 @@ # All rights reserved. include(hunter_add_version) -include(hunter_pick_scheme) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_download) +include(hunter_pick_scheme) hunter_add_version( PACKAGE_NAME @@ -17,10 +18,58 @@ hunter_add_version( 6169cec7b94172141431ef4661e70a5e515c1fa6 ) +hunter_add_version( + PACKAGE_NAME + glm + VERSION + "0.9.8.5" + URL + "https://github.com/hunter-packages/glm/archive/0.9.8.5.tar.gz" + SHA1 + 04ff6d037916f85219e53731e08eb8660d14a38d +) + +hunter_add_version( + PACKAGE_NAME + glm + VERSION + "0.9.9.0" + URL + "https://github.com/g-truc/glm/releases/download/0.9.9.0/glm-0.9.9.0.7z" + SHA1 + 0c0bafb9af65d565a7b026efccddfb965505b019 +) + +hunter_add_version( + PACKAGE_NAME + glm + VERSION + "0.9.9.1" + URL + "https://github.com/g-truc/glm/releases/download/0.9.9.1/glm-0.9.9.1.7z" + SHA1 + 574ee609d1848cd5425d85b09f5c4c4a1b579099 +) + +hunter_add_version( + PACKAGE_NAME + glm + VERSION + "0.9.9.2" + URL + "https://github.com/g-truc/glm/releases/download/0.9.9.2/glm-0.9.9.2.7z" + SHA1 + e25b219ead246b255b369e35c37c2e31430021f2 +) +include(GNUInstallDirs) + +# glm use custom bundled GNUInstallDirs module so we have to +# set correct value explicitly +hunter_cmake_args(glm CMAKE_ARGS CMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(glm) hunter_download( PACKAGE_NAME glm - PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/glm.pc" + PACKAGE_UNRELOCATABLE_TEXT_FILES "${CMAKE_INSTALL_LIBDIR}/pkgconfig/glm.pc" ) - diff --git a/cmake/projects/glog/hunter.cmake b/cmake/projects/glog/hunter.cmake index b6144374b..2df999ff1 100644 --- a/cmake/projects/glog/hunter.cmake +++ b/cmake/projects/glog/hunter.cmake @@ -4,6 +4,7 @@ # !!! DO NOT PLACE HEADER GUARDS HERE !!! include(hunter_add_version) +include(hunter_cmake_args) include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) @@ -12,11 +13,44 @@ hunter_add_version( PACKAGE_NAME glog VERSION - "0.3.4-p0" + "0.3.5-p2" URL - "https://github.com/ruslo/glog/archive/v0.3.4-p0.tar.gz" + "https://github.com/hunter-packages/glog/archive/v0.3.5-p2.tar.gz" SHA1 - de92243289267cb0f0f971a9aedf21bba74b71b3 + 3e95e5bcfb5c9d20c3391b72f831a285a3fc238f +) + +hunter_add_version( + PACKAGE_NAME + glog + VERSION + "0.3.5-p1" + URL + "https://github.com/hunter-packages/glog/archive/v0.3.5-p1.tar.gz" + SHA1 + 64a9da4feec196071fa7f9cd2963e9f193213a67 +) + +hunter_add_version( + PACKAGE_NAME + glog + VERSION + "0.3.5-p0" + URL + "https://github.com/hunter-packages/glog/archive/v0.3.5-p0.tar.gz" + SHA1 + 7b1137b2fb26115f1325534a7c3ffdd6014ccbf8 +) + +hunter_add_version( + PACKAGE_NAME + glog + VERSION + "0.3.4-p2" + URL + "https://github.com/hunter-packages/glog/archive/v0.3.4-p2.tar.gz" + SHA1 + 61e308854b397e68435994818fefb0ff6e1bbccb ) hunter_add_version( @@ -30,6 +64,20 @@ hunter_add_version( 512b8ad6d9aae9499cca2e4c4530b9386cb05440 ) +hunter_add_version( + PACKAGE_NAME + glog + VERSION + "0.4.0" + URL + "https://github.com/google/glog/archive/v0.4.0.tar.gz" + SHA1 + 0d79fb524591dee0f46213e9a23f609f74e0cbb2 +) + +# explicitly remove dependency on gflags (only needed for tests) +hunter_cmake_args(glog CMAKE_ARGS WITH_GFLAGS=OFF BUILD_TESTING=OFF) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(glog) hunter_download(PACKAGE_NAME glog) diff --git a/cmake/projects/glproto/hunter.cmake b/cmake/projects/glproto/hunter.cmake index 219de93b0..051ceb06d 100644 --- a/cmake/projects/glproto/hunter.cmake +++ b/cmake/projects/glproto/hunter.cmake @@ -26,6 +26,6 @@ hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(glproto) hunter_download( PACKAGE_NAME glproto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/glproto.pc" ) diff --git a/cmake/projects/hdf5/hunter.cmake b/cmake/projects/hdf5/hunter.cmake index 22ee93e5d..b923f5800 100644 --- a/cmake/projects/hdf5/hunter.cmake +++ b/cmake/projects/hdf5/hunter.cmake @@ -20,6 +20,18 @@ hunter_add_version( "aa7524bae51f286a4f2b2c22434c1cbab71ff530" ) +hunter_add_version( + PACKAGE_NAME + hdf5 + VERSION + "1.10.5-hp1" + URL + "https://github.com/cpp-pm/hdf5/archive/1.10.5-hp1.tar.gz" + SHA1 + "eaa00311ee9e61e34a71d0258bc9a76c8f24001a" +) + + hunter_cmake_args( hdf5 CMAKE_ARGS diff --git a/cmake/projects/ice/hunter.cmake b/cmake/projects/ice/hunter.cmake index 455b59a1f..837705878 100644 --- a/cmake/projects/ice/hunter.cmake +++ b/cmake/projects/ice/hunter.cmake @@ -22,21 +22,29 @@ hunter_add_version( ddb14df8bbc43df7322978f5f9f802936e2a7324 ) +# https://www.x.org/releases/individual/lib/ +hunter_add_version( + PACKAGE_NAME + ice + VERSION + "1.0.9" + URL + "https://www.x.org/releases/individual/lib/libICE-1.0.9.tar.bz2" + SHA1 + 3c3a857a117ce48a1947a16860056e77cd494fdf +) + hunter_configuration_types(ice CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) -set(x11_dependencies - xproto - xtrans -) hunter_cmake_args( - x11 - CMAKE_ARGS # do not use double quotes on CMAKE_ARGS - DEPENDS_ON_PACKAGES=${x11_dependencies} + ice + CMAKE_ARGS + DEPENDS_ON_PACKAGES=xproto;xtrans ) hunter_cacheable(ice) hunter_download( PACKAGE_NAME ice - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libICE.la" "lib/pkgconfig/ice.pc" diff --git a/cmake/projects/inputproto/hunter.cmake b/cmake/projects/inputproto/hunter.cmake index e650fde24..18f7b585b 100644 --- a/cmake/projects/inputproto/hunter.cmake +++ b/cmake/projects/inputproto/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) @@ -21,11 +22,27 @@ hunter_add_version( 500e0a6dac3523887c0b82753fe5e9d4bb982137 ) +hunter_add_version( + PACKAGE_NAME + inputproto + VERSION + "2.3" + URL + "https://www.x.org/releases/individual/proto/inputproto-2.3.tar.bz2" + SHA1 + 4eacc1883593d3f0040e410be3afc8483c7d2409 +) + hunter_configuration_types(inputproto CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(inputproto) +hunter_cmake_args( + inputproto + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=inputproto +) hunter_download( PACKAGE_NAME inputproto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/inputproto.pc" ) diff --git a/cmake/projects/intltool/hunter.cmake b/cmake/projects/intltool/hunter.cmake index ddc47b464..6489bf943 100644 --- a/cmake/projects/intltool/hunter.cmake +++ b/cmake/projects/intltool/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Damien Buhl +# Copyright (c) 2015, Damien Buhl # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,4 +21,7 @@ hunter_add_version( hunter_configuration_types(intltool CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) -hunter_download(PACKAGE_NAME intltool) +hunter_download( + PACKAGE_NAME intltool + PACKAGE_INTERNAL_DEPS_ID "2" +) diff --git a/cmake/projects/irrXML/hunter.cmake b/cmake/projects/irrXML/hunter.cmake index c0baccaae..2e1ffb786 100644 --- a/cmake/projects/irrXML/hunter.cmake +++ b/cmake/projects/irrXML/hunter.cmake @@ -8,6 +8,17 @@ include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + irrXML + VERSION + "1.2-p0" + URL + "https://github.com/hunter-packages/irrXML/archive/v1.2-p0.tar.gz" + SHA1 + c766ac44744f8387b7d745b00233b80713c5b689 +) + hunter_add_version( PACKAGE_NAME irrXML diff --git a/cmake/projects/kbproto/hunter.cmake b/cmake/projects/kbproto/hunter.cmake index 1fbc9b15d..b65d667fe 100644 --- a/cmake/projects/kbproto/hunter.cmake +++ b/cmake/projects/kbproto/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) @@ -21,11 +22,28 @@ hunter_add_version( a2cc82357c22a1f4d6243017982c32703c95575c ) +# https://www.x.org/releases/individual/proto/ +hunter_add_version( + PACKAGE_NAME + kbproto + VERSION + "1.0.7" + URL + "https://www.x.org/releases/individual/proto/kbproto-1.0.7.tar.bz2" + SHA1 + bc9c0fa7d39edf4ac043e6eeaa771d3e245ac5b2 +) + hunter_configuration_types(kbproto CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cmake_args( + kbproto + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=kbproto +) hunter_cacheable(kbproto) hunter_download( PACKAGE_NAME kbproto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/kbproto.pc" ) diff --git a/cmake/projects/libdaemon/hunter.cmake b/cmake/projects/libdaemon/hunter.cmake index 699b81a7d..7eb04b025 100644 --- a/cmake/projects/libdaemon/hunter.cmake +++ b/cmake/projects/libdaemon/hunter.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Damien Buhl +# Copyright (c) 2015, Damien Buhl # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -21,4 +21,7 @@ hunter_add_version( hunter_configuration_types(libdaemon CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) -hunter_download(PACKAGE_NAME libdaemon) +hunter_download( + PACKAGE_NAME libdaemon + PACKAGE_INTERNAL_DEPS_ID "2" +) diff --git a/cmake/projects/libogg/hunter.cmake b/cmake/projects/libogg/hunter.cmake index 714568c5f..3ec2e9635 100644 --- a/cmake/projects/libogg/hunter.cmake +++ b/cmake/projects/libogg/hunter.cmake @@ -1,6 +1,19 @@ include(hunter_add_version) +include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +include(GNUInstallDirs) + +hunter_add_version( + PACKAGE_NAME + libogg + VERSION + "1.3.3-p0" + URL + "https://github.com/hunter-packages/ogg/archive/v1.3.3-p0.tar.gz" + SHA1 + 1c83a80374670c6c3cd2ffba59397a0329b69544 +) hunter_add_version( PACKAGE_NAME @@ -10,10 +23,15 @@ hunter_add_version( URL "https://github.com/Meralis40/ogg/archive/v1.3.2-cmake3.tar.gz" SHA1 - 2640E75997765339BA06BE0E4BFA66D85B70636A + 646672cabc9eec253c9199a872541e3a182f6062 ) hunter_pick_scheme(DEFAULT url_sha1_cmake) - -hunter_download(PACKAGE_NAME libogg) - +hunter_cacheable(libogg) +hunter_download( + PACKAGE_NAME + libogg + PACKAGE_UNRELOCATABLE_TEXT_FILES + "${CMAKE_INSTALL_LIBDIR}/pkgconfig/ogg.pc" + PACKAGE_INTERNAL_DEPS_ID "1" +) diff --git a/cmake/projects/libsodium/hunter.cmake b/cmake/projects/libsodium/hunter.cmake index c331b75e8..e338f9c04 100644 --- a/cmake/projects/libsodium/hunter.cmake +++ b/cmake/projects/libsodium/hunter.cmake @@ -18,12 +18,43 @@ hunter_add_version( 00a999629f1f8f500cef29818135f8f889f44e41 ) -hunter_configuration_types(libsodium CONFIGURATION_TYPES Release) -if(MSVC) + +hunter_add_version( + PACKAGE_NAME + libsodium + VERSION + "1.0.16" + URL + "https://github.com/jedisct1/libsodium/archive/1.0.16.tar.gz" + SHA1 + 18a2c5758aaf60c0abbc0e6a21f63df80faccfc6 +) + +hunter_add_version( + PACKAGE_NAME + libsodium + VERSION + "1.0.16-p0" + URL + "https://github.com/hunter-packages/libsodium/archive/v1.0.16-p0.tar.gz" + SHA1 + d986ca5b9759d6518df26248f03db44d4dc9f590 +) + +string(COMPARE EQUAL "${HUNTER_libsodium_VERSION}" "1.0.10" __is_1_0_10) +string(COMPARE EQUAL "${HUNTER_libsodium_VERSION}" "1.0.16" __is_1_0_16) + +if(__is_1_0_10 OR __is_1_0_16) + hunter_configuration_types(libsodium CONFIGURATION_TYPES Release) + if(MSVC) hunter_pick_scheme(DEFAULT url_sha1_libsodium_msbuild) -else() + else() hunter_pick_scheme(DEFAULT url_sha1_libsodium_autogen_autotools) + endif() +else() + hunter_pick_scheme(DEFAULT url_sha1_cmake) endif() + hunter_cacheable(libsodium) hunter_download( PACKAGE_NAME libsodium diff --git a/cmake/projects/libsodium/schemes/url_sha1_libsodium_autogen_autotools.cmake.in b/cmake/projects/libsodium/schemes/url_sha1_libsodium_autogen_autotools.cmake.in index 1f851e47a..bff176b17 100644 --- a/cmake/projects/libsodium/schemes/url_sha1_libsodium_autogen_autotools.cmake.in +++ b/cmake/projects/libsodium/schemes/url_sha1_libsodium_autogen_autotools.cmake.in @@ -9,7 +9,7 @@ list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_libsodium_install_tools) include(hunter_user_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_autotools_project) hunter_status_debug("Scheme: url_sha1_libsodium_autogen_autotools") @@ -19,16 +19,16 @@ if("@MSVC@") endif() # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") set(previous_project "") diff --git a/cmake/projects/libsodium/schemes/url_sha1_libsodium_msbuild.cmake.in b/cmake/projects/libsodium/schemes/url_sha1_libsodium_msbuild.cmake.in index 1dcf05af6..cbc030158 100644 --- a/cmake/projects/libsodium/schemes/url_sha1_libsodium_msbuild.cmake.in +++ b/cmake/projects/libsodium/schemes/url_sha1_libsodium_msbuild.cmake.in @@ -8,22 +8,23 @@ include(ExternalProject) include(hunter_libsodium_install_tools) include(hunter_user_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) # Check preconditions -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_libsodium_VERSION@") -hunter_test_string_not_empty("@HUNTER_MSVC_ARCH@") -hunter_test_string_not_empty("@HUNTER_MSVC_VCVARSALL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") -hunter_test_string_not_empty("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_libsodium_VERSION@") +hunter_assert_not_empty_string("@HUNTER_MSVC_ARCH@") +hunter_assert_not_empty_string("@HUNTER_MSVC_VCVARSALL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") if(NOT "@MSVC@") @@ -35,6 +36,7 @@ string(COMPARE EQUAL "@HUNTER_MSVC_VERSION@" "10" _is_platform_toolset_v100) # V string(COMPARE EQUAL "@HUNTER_MSVC_VERSION@" "11" _is_platform_toolset_v110) # VC2012 string(COMPARE EQUAL "@HUNTER_MSVC_VERSION@" "12" _is_platform_toolset_v120) # VC2013 string(COMPARE EQUAL "@HUNTER_MSVC_VERSION@" "14" _is_platform_toolset_v140) # VC2015 +string(COMPARE EQUAL "@HUNTER_MSVC_VERSION@" "15" _is_platform_toolset_v141) # VC2017 if(_is_platform_toolset_v100) set(msvc_platform_toolset "v100") @@ -44,9 +46,11 @@ elseif(_is_platform_toolset_v120) set(msvc_platform_toolset "v120") elseif(_is_platform_toolset_v140) set(msvc_platform_toolset "v140") +elseif(_is_platform_toolset_v141) + set(msvc_platform_toolset "v141") else() hunter_user_error( - "Visual studio version not supported. Supported versions are: Visual studio 2010, 2012, 2013 and 2015." + "Visual studio version not supported. Supported versions are: Visual studio 2010, 2012, 2013, 2015 and 2017." "If there is a new version please open an issue at https://github.com/ruslo/hunter and mention @Cyberunner23") endif() @@ -113,6 +117,8 @@ foreach(build_config_type @HUNTER_PACKAGE_CONFIGURATION_TYPES@) SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR diff --git a/cmake/projects/minizip/hunter.cmake b/cmake/projects/minizip/hunter.cmake index e1ebdd865..dea1c5856 100644 --- a/cmake/projects/minizip/hunter.cmake +++ b/cmake/projects/minizip/hunter.cmake @@ -7,6 +7,18 @@ include(hunter_add_version) include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + minizip + VERSION + "1.0.1-p3" + URL + "https://github.com/hunter-packages/minizip/archive/v1.0.1-p3.tar.gz" + SHA1 + 9ad9dab6758d7fdbeae492515b7027ecd4903b16 +) hunter_add_version( PACKAGE_NAME @@ -30,6 +42,8 @@ hunter_add_version( 65728dbf7573d3f1826d04a3b686d80eb099d7b8 ) +hunter_cmake_args(minizip CMAKE_ARGS USE_AES=FALSE) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(minizip) hunter_download(PACKAGE_NAME minizip) diff --git a/cmake/projects/msgpack/hunter.cmake b/cmake/projects/msgpack/hunter.cmake index 4b3fc9c9b..7493b10ab 100644 --- a/cmake/projects/msgpack/hunter.cmake +++ b/cmake/projects/msgpack/hunter.cmake @@ -16,6 +16,17 @@ hunter_add_version( 5074d28857661693b71c4bda3f8fc662e4c73990 ) +hunter_add_version( + PACKAGE_NAME + msgpack + VERSION + "1.4.1-p2" + URL + "https://github.com/hunter-packages/msgpack-c/archive/cpp-1.4.1-hunter-p2.tar.gz" + SHA1 + eafdcb4c0a29d7416248740bd8132316a4b03910 + ) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(msgpack) hunter_download(PACKAGE_NAME msgpack) diff --git a/cmake/projects/nlohmann-json/hunter.cmake b/cmake/projects/nlohmann-json/hunter.cmake deleted file mode 100644 index a5c9e2df7..000000000 --- a/cmake/projects/nlohmann-json/hunter.cmake +++ /dev/null @@ -1,25 +0,0 @@ -# !!! DO NOT PLACE HEADER GUARDS HERE !!! - -include(hunter_add_version) -include(hunter_cmake_args) -include(hunter_download) -include(hunter_pick_scheme) - -hunter_add_version( - PACKAGE_NAME nlohmann-json - VERSION "1.0.0-rc1-hunter-2" - URL "https://github.com/hunter-packages/json/archive/v1.0.0-rc1-hunter-2.tar.gz" - SHA1 2db824ca17678c8918575bbab982e6ae93283433 -) - -hunter_add_version( - PACKAGE_NAME nlohmann-json - VERSION "1.0.0-rc1-hunter-3" - URL "https://github.com/hunter-packages/json/archive/v1.0.0-rc1-hunter-3.tar.gz" - SHA1 4f0300ebb08b28ac6bca0f947ffd6afde64386ef -) - -hunter_cmake_args(nlohmann-json CMAKE_ARGS JSON_BUILD_TESTS=OFF) - -hunter_pick_scheme(DEFAULT url_sha1_cmake) -hunter_download(PACKAGE_NAME nlohmann-json) diff --git a/cmake/projects/odb-boost/hunter.cmake b/cmake/projects/odb-boost/hunter.cmake index bfe2ecb59..f96fb58e6 100644 --- a/cmake/projects/odb-boost/hunter.cmake +++ b/cmake/projects/odb-boost/hunter.cmake @@ -27,5 +27,5 @@ hunter_download(PACKAGE_NAME odb-boost PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libodb-boost.la" "lib/pkgconfig/libodb-boost.pc" + PACKAGE_INTERNAL_DEPS_ID "12" ) - diff --git a/cmake/projects/odb-boost/schemes/url_sha1_odb-boost_autotools.cmake.in b/cmake/projects/odb-boost/schemes/url_sha1_odb-boost_autotools.cmake.in index 1df098485..187378809 100644 --- a/cmake/projects/odb-boost/schemes/url_sha1_odb-boost_autotools.cmake.in +++ b/cmake/projects/odb-boost/schemes/url_sha1_odb-boost_autotools.cmake.in @@ -9,7 +9,7 @@ include("@HUNTER_SELF@/cmake/Hunter") include(hunter_autotools_project) include(hunter_fatal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_odb-boost_autotools") @@ -24,15 +24,15 @@ hunter_add_package(Boost COMPONENTS date_time) find_package(Boost CONFIG REQUIRED COMPONENTS date_time) # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") hunter_autotools_project("@HUNTER_EP_NAME@" HUNTER_SELF diff --git a/cmake/projects/odb-mysql/schemes/url_sha1_odb-mysql_autotools.cmake.in b/cmake/projects/odb-mysql/schemes/url_sha1_odb-mysql_autotools.cmake.in index 0006f0287..e3cb13936 100644 --- a/cmake/projects/odb-mysql/schemes/url_sha1_odb-mysql_autotools.cmake.in +++ b/cmake/projects/odb-mysql/schemes/url_sha1_odb-mysql_autotools.cmake.in @@ -9,7 +9,7 @@ include("@HUNTER_SELF@/cmake/Hunter") include(hunter_autotools_project) include(hunter_fatal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_odb-mysql_autotools") @@ -24,15 +24,15 @@ hunter_add_package(MySQL-client) find_package(MySQL-client REQUIRED) # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") hunter_autotools_project("@HUNTER_EP_NAME@" HUNTER_SELF diff --git a/cmake/projects/odb-pgsql/schemes/url_sha1_odb-pgsql_autotools.cmake.in b/cmake/projects/odb-pgsql/schemes/url_sha1_odb-pgsql_autotools.cmake.in index 9e67af293..e4dfbdcf0 100644 --- a/cmake/projects/odb-pgsql/schemes/url_sha1_odb-pgsql_autotools.cmake.in +++ b/cmake/projects/odb-pgsql/schemes/url_sha1_odb-pgsql_autotools.cmake.in @@ -9,7 +9,7 @@ include("@HUNTER_SELF@/cmake/Hunter") include(hunter_autotools_project) include(hunter_fatal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_odb-pgsql_autotools") @@ -24,15 +24,15 @@ hunter_add_package(PostgreSQL) find_package(PostgreSQL REQUIRED) # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") set(pgsql_include_flags "") foreach(_pgsql_include_dir PostgreSQL_INCLUDE_DIRS) diff --git a/cmake/projects/odb-sqlite/hunter.cmake b/cmake/projects/odb-sqlite/hunter.cmake index 1b063b239..442bb384c 100644 --- a/cmake/projects/odb-sqlite/hunter.cmake +++ b/cmake/projects/odb-sqlite/hunter.cmake @@ -9,9 +9,6 @@ include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) -hunter_add_package(odb) -hunter_add_package(SQLite3) - hunter_add_version( PACKAGE_NAME odb-sqlite @@ -31,4 +28,5 @@ hunter_download( PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libodb-sqlite.la" "lib/pkgconfig/libodb-sqlite.pc" + PACKAGE_INTERNAL_DEPS_ID "1" ) diff --git a/cmake/projects/odb-sqlite/schemes/url_sha1_odb-sqlite_autotools.cmake.in b/cmake/projects/odb-sqlite/schemes/url_sha1_odb-sqlite_autotools.cmake.in index eb8b45258..e0c82f6f1 100644 --- a/cmake/projects/odb-sqlite/schemes/url_sha1_odb-sqlite_autotools.cmake.in +++ b/cmake/projects/odb-sqlite/schemes/url_sha1_odb-sqlite_autotools.cmake.in @@ -9,7 +9,7 @@ include("@HUNTER_SELF@/cmake/Hunter") include(hunter_autotools_project) include(hunter_fatal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_odb-sqlite_autotools") @@ -20,19 +20,19 @@ endif() hunter_add_package(odb) find_package(odb REQUIRED) -hunter_add_package(SQLite3) -find_package(SQLite3 REQUIRED) +hunter_add_package(sqlite3) +find_package(sqlite3 CONFIG REQUIRED) # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") hunter_autotools_project("@HUNTER_EP_NAME@" HUNTER_SELF @@ -56,7 +56,7 @@ hunter_autotools_project("@HUNTER_EP_NAME@" PACKAGE_CONFIGURATION_TYPES "@HUNTER_PACKAGE_CONFIGURATION_TYPES@" CPPFLAGS - "-I${ODB_INCLUDE_DIR} -I${SQLITE3_INCLUDE_DIR}" + "-I${ODB_INCLUDE_DIR} -I${SQLITE3_ROOT}/include" LDFLAGS - "-L${ODB_LIB_DIR} -lodb -L${SQLITE3_LIB_DIR} -lsqlite3" + "-L${ODB_LIB_DIR} -lodb -L${SQLITE3_ROOT}/lib -lsqlite3" ) diff --git a/cmake/projects/odb/hunter.cmake b/cmake/projects/odb/hunter.cmake index e9985490c..c453ffe35 100644 --- a/cmake/projects/odb/hunter.cmake +++ b/cmake/projects/odb/hunter.cmake @@ -23,7 +23,9 @@ hunter_add_version( hunter_configuration_types(odb CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(odb) -hunter_download(PACKAGE_NAME odb +hunter_download( + PACKAGE_NAME odb + PACKAGE_INTERNAL_DEPS_ID "2" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libodb.la" "lib/pkgconfig/libodb.pc" diff --git a/cmake/projects/ogles_gpgpu/hunter.cmake b/cmake/projects/ogles_gpgpu/hunter.cmake index 7db24beee..b76f7b553 100644 --- a/cmake/projects/ogles_gpgpu/hunter.cmake +++ b/cmake/projects/ogles_gpgpu/hunter.cmake @@ -9,6 +9,171 @@ include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.3.6 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.3.6.tar.gz" + SHA1 + 7ce1b25580c0c9de554056920eb2e449635ef9d8 + ) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.2.10 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.2.10.tar.gz" + SHA1 + 3f89e354752e74b6574638918d9d27d83fedab69 + ) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.2.9 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.2.9.tar.gz" + SHA1 + 0dd7e0834a4bef34cde33faeb3279d3e5706ab79 + ) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.2.8 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.2.8.tar.gz" + SHA1 + 49868c9f19798c2170ba276f01aa1d0dc5174841 + ) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.2.7 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.2.7.tar.gz" + SHA1 + 3a2f944abf86007b563f3f4fd16bb3dd1e53c5b6 + ) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.2.6 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.2.6.tar.gz" + SHA1 + 9cbb696e74df2ef358bd11bd8503a9783ec8f188 + ) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.2.5 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.2.5.tar.gz" + SHA1 + d6b3f57470effbfe6b89678144272f22923597db + ) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.2.4 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.2.4.tar.gz" + SHA1 + ce38c35533fbb8f8efc30eb74d300598ee2132aa + ) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.1.6-p3 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.1.6-p3.tar.gz" + SHA1 + 3ddef5cd88ae26776e86e5d0d0cf637d06a88d1f +) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.1.6-p2 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.1.6-p2.tar.gz" + SHA1 + 23b5729b77def9a633b01689ac97821bf11b413b +) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.1.6-p1 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.1.6-p1.tar.gz" + SHA1 + b6b2cc03f49dabf0dd72a09b6c760164f6fb6e10 +) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.1.6 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.1.6.tar.gz" + SHA1 + dd6a039cbfb0f240ed29211f9e606703ee79a355 +) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.1.4 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.1.4.tar.gz" + SHA1 + 636f2fb45c45e4ab22a7d60dabe1816df561a5b0 +) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.1.3 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.1.3.tar.gz" + SHA1 + 1025b418b9a949ed8885d4ab1872d7a7b77c3b03 +) + +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.1.2 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.1.2.tar.gz" + SHA1 + a007c80de2d92147d6172ed52820e0c1268ed429 +) + hunter_add_version( PACKAGE_NAME ogles_gpgpu @@ -20,6 +185,17 @@ hunter_add_version( 3b9b76a5af9e8eb206cfaa4503b954ec87cb5c7c ) +hunter_add_version( + PACKAGE_NAME + ogles_gpgpu + VERSION + 0.2.1 + URL + "https://github.com/hunter-packages/ogles_gpgpu/archive/v0.2.1.tar.gz" + SHA1 + 373a66b1149b1b563f65195c6767ba4ee7a0b9ed +) + hunter_cmake_args(ogles_gpgpu CMAKE_ARGS OGLES_GPGPU_INSTALL=ON) hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(ogles_gpgpu) diff --git a/cmake/projects/pciaccess/hunter.cmake b/cmake/projects/pciaccess/hunter.cmake index e821a62f7..e87a2d915 100644 --- a/cmake/projects/pciaccess/hunter.cmake +++ b/cmake/projects/pciaccess/hunter.cmake @@ -26,7 +26,7 @@ hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(pciaccess) hunter_download( PACKAGE_NAME pciaccess - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libpciaccess.la" "lib/pkgconfig/pciaccess.pc" diff --git a/cmake/projects/presentproto/hunter.cmake b/cmake/projects/presentproto/hunter.cmake index 133f76aa1..20afebfd0 100644 --- a/cmake/projects/presentproto/hunter.cmake +++ b/cmake/projects/presentproto/hunter.cmake @@ -26,6 +26,6 @@ hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(presentproto) hunter_download( PACKAGE_NAME presentproto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/presentproto.pc" ) diff --git a/cmake/projects/pthread-stubs/hunter.cmake b/cmake/projects/pthread-stubs/hunter.cmake index a7a714f13..cc1e78905 100644 --- a/cmake/projects/pthread-stubs/hunter.cmake +++ b/cmake/projects/pthread-stubs/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) @@ -21,11 +22,28 @@ hunter_add_version( 7fc486ad0ec54938f8b781cc374218f50eac8b99 ) +# https://www.x.org/releases/individual/xcb/ +hunter_add_version( + PACKAGE_NAME + pthread-stubs + VERSION + "0.4" + URL + "https://www.x.org/releases/individual/xcb/libpthread-stubs-0.4.tar.bz2" + SHA1 + c42503a2ae0067b2238b2f3fefc86656baa4dd8e +) + hunter_configuration_types(pthread-stubs CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(pthread-stubs) +hunter_cmake_args( + pthread-stubs + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=pthread-stubs +) hunter_download( PACKAGE_NAME pthread-stubs - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/pthread-stubs.pc" ) diff --git a/cmake/projects/randrproto/hunter.cmake b/cmake/projects/randrproto/hunter.cmake index 2bde8c87e..bc24bd530 100644 --- a/cmake/projects/randrproto/hunter.cmake +++ b/cmake/projects/randrproto/hunter.cmake @@ -31,10 +31,12 @@ hunter_cmake_args( randrproto CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${randrproto_dependencies} + PKGCONFIG_EXPORT_TARGETS=randrproto ) hunter_cacheable(randrproto) hunter_download( PACKAGE_NAME randrproto + PACKAGE_INTERNAL_DEPS_ID "2" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/randrproto.pc" ) diff --git a/cmake/projects/renderproto/hunter.cmake b/cmake/projects/renderproto/hunter.cmake index 72391c029..afda17ed3 100644 --- a/cmake/projects/renderproto/hunter.cmake +++ b/cmake/projects/renderproto/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) @@ -23,9 +24,14 @@ hunter_add_version( hunter_configuration_types(renderproto CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cmake_args( + renderproto + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=renderproto +) hunter_cacheable(renderproto) hunter_download( PACKAGE_NAME renderproto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/renderproto.pc" ) diff --git a/cmake/projects/sm/hunter.cmake b/cmake/projects/sm/hunter.cmake index 3f051b063..b13598a84 100644 --- a/cmake/projects/sm/hunter.cmake +++ b/cmake/projects/sm/hunter.cmake @@ -22,6 +22,17 @@ hunter_add_version( 8d354a165e330022ffd3606aba562b8c8154213d ) +hunter_add_version( + PACKAGE_NAME + sm + VERSION + "1.2.3" + URL + "https://www.x.org/releases/individual/lib/libSM-1.2.3.tar.bz2" + SHA1 + 437d7b13fa2eba325df3a106f177df46ccec6546 +) + hunter_configuration_types(sm CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) set(sm_dependencies @@ -37,7 +48,7 @@ hunter_cmake_args( hunter_cacheable(sm) hunter_download( PACKAGE_NAME sm - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libSM.la" "lib/pkgconfig/sm.pc" diff --git a/cmake/projects/sparsehash/hunter.cmake b/cmake/projects/sparsehash/hunter.cmake index bd7a4fce6..729f55a48 100644 --- a/cmake/projects/sparsehash/hunter.cmake +++ b/cmake/projects/sparsehash/hunter.cmake @@ -10,6 +10,7 @@ include(hunter_add_version) include(hunter_download) include(hunter_pick_scheme) +include(hunter_report_broken_package) # Version list hunter_add_version( @@ -26,5 +27,9 @@ hunter_add_version( # Default CMake scheme hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_report_broken_package( + "'sparsehash' package is destructive (https://github.com/ruslo/hunter/issues/695)" +) + # This is header-only, so only headers are needed hunter_download(PACKAGE_NAME sparsehash) diff --git a/cmake/projects/spdlog/hunter.cmake b/cmake/projects/spdlog/hunter.cmake index 7b99f6419..3d4d07a13 100644 --- a/cmake/projects/spdlog/hunter.cmake +++ b/cmake/projects/spdlog/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_download) include(hunter_pick_scheme) @@ -30,6 +31,82 @@ hunter_add_version( 199c1a19bcdd6fc75faa61263a267805c05e4060 ) +hunter_add_version( + PACKAGE_NAME + spdlog + VERSION + "0.12.0-p0" + URL + "https://github.com/hunter-packages/spdlog/archive/v0.12.0-p0.tar.gz" + SHA1 + b10bf7b537198a5f2224c3e022db38da9b2f3d53 +) + +hunter_add_version( + PACKAGE_NAME + spdlog + VERSION + "0.13.0-p0" + URL + "https://github.com/hunter-packages/spdlog/archive/v0.13.0-p0.tar.gz" + SHA1 + b34b92075423d9da196daefe796316393a0fd593 +) + +hunter_add_version( + PACKAGE_NAME + spdlog + VERSION + "0.13.0-p1" + URL + "https://github.com/hunter-packages/spdlog/archive/v0.13.0-p1.tar.gz" + SHA1 + edf9ba15852b181e16e1fe323878d8281941b376 +) + +hunter_add_version( + PACKAGE_NAME + spdlog + VERSION + "0.16.3-p1" + URL + "https://github.com/hunter-packages/spdlog/archive/v0.16.3-p1.tar.gz" + SHA1 + 1400ca456ad7c5ba89491f0dd3cd8935a16fe65c +) + +hunter_add_version( + PACKAGE_NAME + spdlog + VERSION + "1.2.1-p0" + URL + "https://github.com/hunter-packages/spdlog/archive/v1.2.1-p0.tar.gz" + SHA1 + 8bebf25ee48fba4f0c341954b50d26e8292e9f8f +) + +hunter_add_version( + PACKAGE_NAME + spdlog + VERSION + "1.3.1-p0" + URL + "https://github.com/hunter-packages/spdlog/archive/v1.3.1-p0.tar.gz" + SHA1 + 3d0538af5ea93995ff417faa979f309f834fa352 +) + +hunter_cmake_args( + spdlog + CMAKE_ARGS + SPDLOG_EXTERNAL_TOOLCHAIN=ON # tell spdlog not to modify cxxflags + SPDLOG_BUILD_EXAMPLES=OFF + SPDLOG_BUILD_TESTING=OFF + SPDLOG_BUILD_TESTS=OFF + SPDLOG_BUILD_BENCH=OFF +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(spdlog) hunter_download(PACKAGE_NAME spdlog) diff --git a/cmake/projects/thread-pool-cpp/hunter.cmake b/cmake/projects/thread-pool-cpp/hunter.cmake index cd9e63a0e..b80d0d66c 100644 --- a/cmake/projects/thread-pool-cpp/hunter.cmake +++ b/cmake/projects/thread-pool-cpp/hunter.cmake @@ -8,6 +8,28 @@ include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + thread-pool-cpp + VERSION + 1.1.0 + URL + "https://github.com/hunter-packages/thread-pool-cpp/archive/v1.1.0.tar.gz" + SHA1 + 52c345cb9f0f3e43d0c4760462784b0180f5efe8 +) + +hunter_add_version( + PACKAGE_NAME + thread-pool-cpp + VERSION + 1.0.0-p3 + URL + "https://github.com/hunter-packages/thread-pool-cpp/archive/v1.0.0-p3.tar.gz" + SHA1 + 475c0492013a46dc2a98ee6cb854dcfb2cda3807 +) + hunter_add_version( PACKAGE_NAME thread-pool-cpp diff --git a/cmake/projects/websocketpp/hunter.cmake b/cmake/projects/websocketpp/hunter.cmake index af1f958a5..934e62c04 100644 --- a/cmake/projects/websocketpp/hunter.cmake +++ b/cmake/projects/websocketpp/hunter.cmake @@ -5,6 +5,17 @@ include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + websocketpp + VERSION + "0.7.0" + URL + "https://github.com/hunter-packages/websocketpp/archive/0.7.0-hunter-p1.tar.gz" + SHA1 + 266c5a3c1b37eed2e49b8bc2ab42e77f97e95c3d + ) + hunter_add_version( PACKAGE_NAME websocketpp @@ -16,16 +27,26 @@ hunter_add_version( 5c3abdee5d735a0beab65980cd432c33d935d792 ) +hunter_add_version( + PACKAGE_NAME + websocketpp + VERSION + "0.7.0-p3" + URL + "https://github.com/hunter-packages/websocketpp/archive/v0.7.0-p3.tar.gz" + SHA1 + 8ca868bd8c5290643574632aa72931280e497ce6 + ) hunter_add_version( PACKAGE_NAME websocketpp VERSION - "0.7.0" + "0.8.1-p0" URL - "https://github.com/hunter-packages/websocketpp/archive/0.7.0-hunter-p1.tar.gz" + "https://github.com/hunter-packages/websocketpp/archive/v0.8.1-p0.tar.gz" SHA1 - 266c5a3c1b37eed2e49b8bc2ab42e77f97e95c3d + def22a3337b9f4022b7ad3004782be4be38f17e3 ) hunter_pick_scheme(DEFAULT url_sha1_cmake) diff --git a/cmake/projects/x11/hunter.cmake b/cmake/projects/x11/hunter.cmake index 446c2c605..0bb5735f9 100644 --- a/cmake/projects/x11/hunter.cmake +++ b/cmake/projects/x11/hunter.cmake @@ -22,6 +22,18 @@ hunter_add_version( 8177535c9c59d8c3ab98d55ce53520b5737ccd1a ) +# https://www.x.org/releases/individual/lib/ +hunter_add_version( + PACKAGE_NAME + x11 + VERSION + "1.6.7" + URL + "https://www.x.org/releases/individual/lib/libX11-1.6.7.tar.bz2" + SHA1 + 5076f7853713d7db958a05f6fd1c18f7e111a0ad +) + hunter_configuration_types(x11 CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) set(x11_dependencies @@ -36,11 +48,12 @@ hunter_cmake_args( x11 CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${x11_dependencies} + PKGCONFIG_EXPORT_TARGETS=x11-xcb;x11 ) hunter_cacheable(x11) hunter_download( PACKAGE_NAME x11 - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "7" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libX11-xcb.la" "lib/libX11.la" diff --git a/cmake/projects/xau/hunter.cmake b/cmake/projects/xau/hunter.cmake index 98e18f570..b2155e9ed 100644 --- a/cmake/projects/xau/hunter.cmake +++ b/cmake/projects/xau/hunter.cmake @@ -22,6 +22,18 @@ hunter_add_version( 29c47207fd246425b906f525b2220235ce4cd0f6 ) +# https://www.x.org/releases/individual/lib/ +hunter_add_version( + PACKAGE_NAME + xau + VERSION + "1.0.9" + URL + "https://www.x.org/releases/individual/lib/libXau-1.0.9.tar.bz2" + SHA1 + ef9b1ad00f958c8b6e30a1bbc11fdfac311c9733 +) + hunter_configuration_types(xau CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) set(xau_dependencies @@ -32,10 +44,11 @@ hunter_cmake_args( xau CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${xau_dependencies} + PKGCONFIG_EXPORT_TARGETS=xau ) hunter_cacheable(xau) hunter_download( PACKAGE_NAME xau - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "8" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libXau.la;lib/pkgconfig/xau.pc" ) diff --git a/cmake/projects/xcb-proto/hunter.cmake b/cmake/projects/xcb-proto/hunter.cmake index 0c0ee8cab..fb51a1483 100644 --- a/cmake/projects/xcb-proto/hunter.cmake +++ b/cmake/projects/xcb-proto/hunter.cmake @@ -5,11 +5,23 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) # https://xcb.freedesktop.org/dist/ +hunter_add_version( + PACKAGE_NAME + xcb-proto + VERSION + "1.13" + URL + "https://xcb.freedesktop.org/dist/xcb-proto-1.13.tar.bz2" + SHA1 + f7fa35ab59af18cecadbe83fe705281dcfd82ffd +) + hunter_add_version( PACKAGE_NAME xcb-proto @@ -35,9 +47,14 @@ hunter_add_version( hunter_configuration_types(xcb-proto CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cmake_args( + xcb-proto + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=xcb-proto +) hunter_cacheable(xcb-proto) hunter_download( PACKAGE_NAME xcb-proto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/xcb-proto.pc" ) diff --git a/cmake/projects/xcb/hunter.cmake b/cmake/projects/xcb/hunter.cmake index f139840b5..7b1a194f3 100644 --- a/cmake/projects/xcb/hunter.cmake +++ b/cmake/projects/xcb/hunter.cmake @@ -10,6 +10,17 @@ include(hunter_download) include(hunter_pick_scheme) # https://xcb.freedesktop.org/dist/ +hunter_add_version( + PACKAGE_NAME + xcb + VERSION + "1.13" + URL + "https://xcb.freedesktop.org/dist/libxcb-1.13.tar.bz2" + SHA1 + 212ad5f1f80def80536d78e3d20354a0370e7fe9 +) + hunter_add_version( PACKAGE_NAME xcb @@ -34,8 +45,14 @@ hunter_add_version( 98199b6054750a06cddd4e77baa4354af547ce6f ) +set(_xcb_text_file_tpl composite damage dpms dri2 dri3 glx present randr record render res screensaver shape shm sync xf86dri xfixes xinerama xkb xtest xv xvmc) + +if(HUNTER_xcb_VERSION VERSION_LESS "1.13") + list(APPEND _xcb_text_file_tpl xevie xprint) +endif() + set(_xcb_text_files "") -foreach(_x composite damage dpms dri2 dri3 glx present randr record render res screensaver shape shm sync xevie xf86dri xfixes xinerama xkb xprint xtest xv xvmc) +foreach(_x ${_xcb_text_file_tpl}) list(APPEND _xcb_text_files "lib/libxcb-${_x}.la" "lib/pkgconfig/xcb-${_x}.pc") endforeach() @@ -46,6 +63,6 @@ hunter_pick_scheme(DEFAULT xcb) hunter_cacheable(xcb) hunter_download( PACKAGE_NAME xcb - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "6" PACKAGE_UNRELOCATABLE_TEXT_FILES "${_xcb_text_files}" ) diff --git a/cmake/projects/xcb/schemes/xcb.cmake.in b/cmake/projects/xcb/schemes/xcb.cmake.in index 654dc62e0..2691e18da 100644 --- a/cmake/projects/xcb/schemes/xcb.cmake.in +++ b/cmake/projects/xcb/schemes/xcb.cmake.in @@ -9,7 +9,7 @@ include("@HUNTER_SELF@/cmake/Hunter") include(hunter_autotools_project) include(hunter_fatal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: xcb") @@ -17,20 +17,28 @@ if("@MSVC@") hunter_fatal_error("Autotools scheme not supported with Visual Studio") endif() -hunter_add_package(xcb-proto) -hunter_add_package(pthread-stubs) -hunter_add_package(xau) +set( + DEPENDS_ON_PACKAGES + xcb-proto + pthread-stubs + xau +) + +foreach(x ${DEPENDS_ON_PACKAGES}) + hunter_add_package("${x}") +endforeach() # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") hunter_autotools_project( "@HUNTER_EP_NAME@" @@ -58,3 +66,17 @@ hunter_autotools_project( --without-doxygen --disable-devel-docs ) + +set(PKG_CONFIG_MODULE xcb) + +set(PKG_GENERATE_SHARED "${BUILD_SHARED_LIBS}") + +# Use: +# * PKG_CONFIG_MODULE +# * DEPENDS_ON_PACKAGES +# * PKG_GENERATE_SHARED +configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/pkgconfig-export-targets.cmake.in" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/cmake/${PKG_CONFIG_MODULE}/${PKG_CONFIG_MODULE}Config.cmake" + @ONLY +) diff --git a/cmake/projects/xcursor/hunter.cmake b/cmake/projects/xcursor/hunter.cmake index fa732e76b..aa5e6d1b8 100644 --- a/cmake/projects/xcursor/hunter.cmake +++ b/cmake/projects/xcursor/hunter.cmake @@ -35,10 +35,12 @@ hunter_cmake_args( xcursor CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${xcursor_dependencies} + PKGCONFIG_EXPORT_TARGETS=xcursor ) hunter_cacheable(xcursor) hunter_download( PACKAGE_NAME xcursor + PACKAGE_INTERNAL_DEPS_ID "2" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libXcursor.la" "lib/pkgconfig/xcursor.pc" diff --git a/cmake/projects/xdamage/hunter.cmake b/cmake/projects/xdamage/hunter.cmake index 1d9c5c381..f651fa3d8 100644 --- a/cmake/projects/xdamage/hunter.cmake +++ b/cmake/projects/xdamage/hunter.cmake @@ -39,7 +39,7 @@ hunter_cmake_args( ) hunter_download( PACKAGE_NAME xdamage - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/xdamage.pc" "lib/libXdamage.la" diff --git a/cmake/projects/xext/hunter.cmake b/cmake/projects/xext/hunter.cmake index be14f8bd2..2a31b8644 100644 --- a/cmake/projects/xext/hunter.cmake +++ b/cmake/projects/xext/hunter.cmake @@ -33,11 +33,12 @@ hunter_cmake_args( xext CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${xext_dependencies} + PKGCONFIG_EXPORT_TARGETS=xext ) hunter_cacheable(xext) hunter_download( PACKAGE_NAME xext - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libXext.la" "lib/pkgconfig/xext.pc" diff --git a/cmake/projects/xextproto/hunter.cmake b/cmake/projects/xextproto/hunter.cmake index a08e50e05..393298b51 100644 --- a/cmake/projects/xextproto/hunter.cmake +++ b/cmake/projects/xextproto/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) @@ -21,11 +22,28 @@ hunter_add_version( f969e02009adf2d51fd1ba4583a859984728a461 ) +# https://www.x.org/releases/individual/proto/ +hunter_add_version( + PACKAGE_NAME + xextproto + VERSION + "7.3.0" + URL + "https://www.x.org/releases/individual/proto/xextproto-7.3.0.tar.bz2" + SHA1 + b8d736342dcb73b71584d99a1cb9806d93c25ff8 +) + hunter_configuration_types(xextproto CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cmake_args( + xextproto + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=xextproto +) hunter_cacheable(xextproto) hunter_download( PACKAGE_NAME xextproto - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/xextproto.pc" ) diff --git a/cmake/projects/xf86vidmodeproto/hunter.cmake b/cmake/projects/xf86vidmodeproto/hunter.cmake index a854a1f5a..6ca659a0c 100644 --- a/cmake/projects/xf86vidmodeproto/hunter.cmake +++ b/cmake/projects/xf86vidmodeproto/hunter.cmake @@ -29,12 +29,14 @@ set(xf86vidmodeproto_dependencies ) hunter_cmake_args( xf86vidmodeproto - CMAKE_ARGS # do not use double quotes on CMAKE_ARGS - DEPENDS_ON_PACKAGES=${xf86vidmodeproto_dependencies} + CMAKE_ARGS + DEPENDS_ON_PACKAGES=${xf86vidmodeproto_dependencies} + PKGCONFIG_EXPORT_TARGETS=xf86vidmodeproto ) hunter_cacheable(xf86vidmodeproto) hunter_download( PACKAGE_NAME xf86vidmodeproto + PACKAGE_INTERNAL_DEPS_ID "2" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/xf86vidmodeproto.pc" ) diff --git a/cmake/projects/xfixes/hunter.cmake b/cmake/projects/xfixes/hunter.cmake index c3aafb162..25f383b75 100644 --- a/cmake/projects/xfixes/hunter.cmake +++ b/cmake/projects/xfixes/hunter.cmake @@ -10,7 +10,7 @@ include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) -# http://www.x.org/releases/individual/proto/ +# https://www.x.org/releases/individual/lib/ hunter_add_version( PACKAGE_NAME xfixes @@ -22,6 +22,17 @@ hunter_add_version( e14fa072bd70b30eef47391cac637bdb4de9e8a3 ) +hunter_add_version( + PACKAGE_NAME + xfixes + VERSION + "5.0.3" + URL + "https://www.x.org/releases/individual/lib/libXfixes-5.0.3.tar.bz2" + SHA1 + ca86342d129c02435a9ee46e38fdf1a04d6b4b91 +) + hunter_configuration_types(xfixes CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) set(xfixes_dependencies @@ -34,12 +45,13 @@ hunter_cmake_args( xfixes CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${xfixes_dependencies} + PKGCONFIG_EXPORT_TARGETS=xfixes ) hunter_cacheable(xfixes) hunter_download( PACKAGE_NAME xfixes - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libXfixes.la" "lib/pkgconfig/xfixes.pc" diff --git a/cmake/projects/xgboost/hunter.cmake b/cmake/projects/xgboost/hunter.cmake index 61289ff79..1efe7c86e 100644 --- a/cmake/projects/xgboost/hunter.cmake +++ b/cmake/projects/xgboost/hunter.cmake @@ -1,4 +1,5 @@ # Copyright (c) 2016, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen # All rights reserved. # !!! DO NOT PLACE HEADER GUARDS HERE !!! @@ -8,6 +9,83 @@ include(hunter_cacheable) include(hunter_download) include(hunter_pick_scheme) +hunter_add_version( + PACKAGE_NAME + xgboost + VERSION + 0.7.0-p4 + URL + "https://github.com/hunter-packages/xgboost/archive/v0.7.0-p4.tar.gz" + SHA1 + 40b8b7d4ee7e3a8e96a52283e6a5b6a9a91865a4 +) + +hunter_add_version( + PACKAGE_NAME + xgboost + VERSION + 0.7.0-p3 + URL + "https://github.com/hunter-packages/xgboost/archive/v0.7.0-p3.tar.gz" + SHA1 + 7ebadc3214efedced7efa9eb1d79428595bf6b36 +) + +hunter_add_version( + PACKAGE_NAME + xgboost + VERSION + 0.7.0-p2 + URL + "https://github.com/hunter-packages/xgboost/archive/v0.7.0-p2.tar.gz" + SHA1 + 3dd1b94b940548e69ff9be5453af80e011a5a080 +) + +hunter_add_version( + PACKAGE_NAME + xgboost + VERSION + 0.7.0-p1 + URL + "https://github.com/hunter-packages/xgboost/archive/v0.7.0-p1.tar.gz" + SHA1 + 8d8f8597aa5464be7af52e36a20321e5ece1e84a +) + +hunter_add_version( + PACKAGE_NAME + xgboost + VERSION + 0.7.0-p0 + URL + "https://github.com/hunter-packages/xgboost/archive/v0.7.0-p0.tar.gz" + SHA1 + fc3f861acd16599b38d0c84a071f3098f9b1f629 +) + +hunter_add_version( + PACKAGE_NAME + xgboost + VERSION + 0.40-p9 + URL + "https://github.com/hunter-packages/xgboost/archive/v0.40-p9.tar.gz" + SHA1 + 040000efe20018fcfcd2acc318cf36eb5dcb1b1d +) + +hunter_add_version( + PACKAGE_NAME + xgboost + VERSION + 0.40-p5 + URL + "https://github.com/hunter-packages/xgboost/archive/v0.40-p5.tar.gz" + SHA1 + 14586ddbc9c4cd6b90d0e0afba2e443446c39f4c +) + hunter_add_version( PACKAGE_NAME xgboost @@ -41,6 +119,17 @@ hunter_add_version( dc1e21d0b023df87915c0140999286afed064c50 ) +hunter_add_version( + PACKAGE_NAME + xgboost + VERSION + 0.40-p10 + URL + "https://github.com/hunter-packages/xgboost/archive/v0.40-p10.tar.gz" + SHA1 + d51da15945bd10e964384278862473ad8e5dcbc7 +) + hunter_pick_scheme(DEFAULT url_sha1_cmake) hunter_cacheable(xgboost) hunter_download(PACKAGE_NAME xgboost) diff --git a/cmake/projects/xinerama/hunter.cmake b/cmake/projects/xinerama/hunter.cmake index 5b37a675c..8f141cc3f 100644 --- a/cmake/projects/xinerama/hunter.cmake +++ b/cmake/projects/xinerama/hunter.cmake @@ -34,10 +34,12 @@ hunter_cmake_args( xinerama CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${xinerama_dependencies} + PKGCONFIG_EXPORT_TARGETS=xinerama ) hunter_cacheable(xinerama) hunter_download( PACKAGE_NAME xinerama + PACKAGE_INTERNAL_DEPS_ID "2" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libXinerama.la" "lib/pkgconfig/xinerama.pc" diff --git a/cmake/projects/xineramaproto/hunter.cmake b/cmake/projects/xineramaproto/hunter.cmake index 8e7e5a7b0..c99a36b8c 100644 --- a/cmake/projects/xineramaproto/hunter.cmake +++ b/cmake/projects/xineramaproto/hunter.cmake @@ -31,10 +31,12 @@ hunter_cmake_args( xineramaproto CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${xineramaproto_dependencies} + PKGCONFIG_EXPORT_TARGETS=xineramaproto ) hunter_cacheable(xineramaproto) hunter_download( PACKAGE_NAME xineramaproto + PACKAGE_INTERNAL_DEPS_ID "2" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/xineramaproto.pc" ) diff --git a/cmake/projects/xorg-macros/hunter.cmake b/cmake/projects/xorg-macros/hunter.cmake index 03aa2732d..847f61d6b 100644 --- a/cmake/projects/xorg-macros/hunter.cmake +++ b/cmake/projects/xorg-macros/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) @@ -21,11 +22,28 @@ hunter_add_version( c424a09fa6f628e24eff74496acebef13e8093b9 ) +# https://www.x.org/releases/individual/util/ +hunter_add_version( + PACKAGE_NAME + xorg-macros + VERSION + "1.19.2" + URL + "https://www.x.org/releases/individual/util/util-macros-1.19.2.tar.bz2" + SHA1 + e8b3a6f2bfde22440fca0974da53da18821a4ee6 +) + hunter_configuration_types(xorg-macros CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(xorg-macros) +hunter_cmake_args( + xorg-macros + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=xorg-macros +) hunter_download( PACKAGE_NAME xorg-macros - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "share/pkgconfig/xorg-macros.pc" ) diff --git a/cmake/projects/xproto/hunter.cmake b/cmake/projects/xproto/hunter.cmake index 4410f19a5..29a4a8504 100644 --- a/cmake/projects/xproto/hunter.cmake +++ b/cmake/projects/xproto/hunter.cmake @@ -22,16 +22,29 @@ hunter_add_version( 5d7f00d1dbe6cf8e725841ef663f0ee2491ba5b2 ) +# https://www.x.org/releases/individual/proto/ +hunter_add_version( + PACKAGE_NAME + xproto + VERSION + "7.0.31" + URL + "https://www.x.org/releases/individual/proto/xproto-7.0.31.tar.bz2" + SHA1 + 779fa333c5522cca40ca810c25a8fa60b6ccedfb +) + hunter_configuration_types(xproto CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cmake_args( xproto CMAKE_ARGS DEPENDS_ON_PACKAGES=xorg-macros + PKGCONFIG_EXPORT_TARGETS=xproto ) hunter_cacheable(xproto) hunter_download( PACKAGE_NAME xproto - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/xproto.pc" ) diff --git a/cmake/projects/xrandr/hunter.cmake b/cmake/projects/xrandr/hunter.cmake index 0721bc567..ab94a08f2 100644 --- a/cmake/projects/xrandr/hunter.cmake +++ b/cmake/projects/xrandr/hunter.cmake @@ -36,11 +36,12 @@ hunter_cmake_args( xrandr CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${xrandr_dependencies} + PKGCONFIG_EXPORT_TARGETS=xrandr ) hunter_cacheable(xrandr) hunter_download( PACKAGE_NAME xrandr - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/xrandr.pc" "lib/libXrandr.la" diff --git a/cmake/projects/xrender/hunter.cmake b/cmake/projects/xrender/hunter.cmake index e483f14ad..83d0bdb1e 100644 --- a/cmake/projects/xrender/hunter.cmake +++ b/cmake/projects/xrender/hunter.cmake @@ -32,11 +32,12 @@ hunter_cmake_args( xrender CMAKE_ARGS # do not use double quotes on CMAKE_ARGS DEPENDS_ON_PACKAGES=${xrender_dependencies} + PKGCONFIG_EXPORT_TARGETS=xrender ) hunter_cacheable(xrender) hunter_download( PACKAGE_NAME xrender - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libXrender.la" "lib/pkgconfig/xrender.pc" diff --git a/cmake/projects/xshmfence/hunter.cmake b/cmake/projects/xshmfence/hunter.cmake index b2e270449..50c41a374 100644 --- a/cmake/projects/xshmfence/hunter.cmake +++ b/cmake/projects/xshmfence/hunter.cmake @@ -22,6 +22,17 @@ hunter_add_version( a2ebe90e5595afca4db93a4359732af43b2b8c69 ) +hunter_add_version( + PACKAGE_NAME + xshmfence + VERSION + "1.3" + URL + "http://www.x.org/releases/individual/lib/libxshmfence-1.3.tar.bz2" + SHA1 + 3472218fc0e8ee8183533d22dbcd4bbe90bf3ab8 +) + hunter_configuration_types(xshmfence CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) set(xshmfence_dependencies @@ -35,7 +46,7 @@ hunter_cmake_args( hunter_cacheable(xshmfence) hunter_download( PACKAGE_NAME xshmfence - PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_INTERNAL_DEPS_ID "4" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libxshmfence.la" "lib/pkgconfig/xshmfence.pc" diff --git a/cmake/projects/xtrans/hunter.cmake b/cmake/projects/xtrans/hunter.cmake index 5020103ac..f8bcf4e54 100644 --- a/cmake/projects/xtrans/hunter.cmake +++ b/cmake/projects/xtrans/hunter.cmake @@ -5,6 +5,7 @@ include(hunter_add_version) include(hunter_cacheable) +include(hunter_cmake_args) include(hunter_configuration_types) include(hunter_download) include(hunter_pick_scheme) @@ -21,11 +22,28 @@ hunter_add_version( b6ed421edf577816f6e641e1846dc0bff337676c ) +# https://www.x.org/releases/individual/lib/ +hunter_add_version( + PACKAGE_NAME + xtrans + VERSION + "1.4.0" + URL + "https://www.x.org/releases/individual/lib/xtrans-1.4.0.tar.bz2" + SHA1 + 7c490026efb450798e02b040c05eba5212291c08 +) + hunter_configuration_types(xtrans CONFIGURATION_TYPES Release) hunter_pick_scheme(DEFAULT url_sha1_autotools) hunter_cacheable(xtrans) +hunter_cmake_args( + xtrans + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=xtrans +) hunter_download( PACKAGE_NAME xtrans - PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_INTERNAL_DEPS_ID "3" PACKAGE_UNRELOCATABLE_TEXT_FILES "share/pkgconfig/xtrans.pc" ) diff --git a/cmake/projects/xxf86vm/hunter.cmake b/cmake/projects/xxf86vm/hunter.cmake index 2e8b8b06d..7f2d33270 100644 --- a/cmake/projects/xxf86vm/hunter.cmake +++ b/cmake/projects/xxf86vm/hunter.cmake @@ -34,12 +34,14 @@ set(xxf86vm_dependencies ) hunter_cmake_args( xxf86vm - CMAKE_ARGS # do not use double quotes on CMAKE_ARGS - DEPENDS_ON_PACKAGES=${xxf86vm_dependencies} + CMAKE_ARGS + DEPENDS_ON_PACKAGES=${xxf86vm_dependencies} + PKGCONFIG_EXPORT_TARGETS=xxf86vm ) hunter_cacheable(xxf86vm) hunter_download( PACKAGE_NAME xxf86vm + PACKAGE_INTERNAL_DEPS_ID "2" PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/libXxf86vm.la" "lib/pkgconfig/xxf86vm.pc" diff --git a/cmake/schemes/url_sha1_autogen_autotools.cmake.in b/cmake/schemes/url_sha1_autogen_autotools.cmake.in index 5f5164d9b..3cf7afbd5 100644 --- a/cmake/schemes/url_sha1_autogen_autotools.cmake.in +++ b/cmake/schemes/url_sha1_autogen_autotools.cmake.in @@ -8,7 +8,7 @@ list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_user_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_autotools_project) hunter_status_debug("Scheme: url_sha1_autogen_autotools") @@ -18,15 +18,19 @@ if("@MSVC@") endif() # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") + +foreach(dependency ${DEPENDS_ON_PACKAGES}) + hunter_add_package(${dependency}) +endforeach() hunter_autotools_project("@HUNTER_EP_NAME@" HUNTER_SELF @@ -52,3 +56,21 @@ hunter_autotools_project("@HUNTER_EP_NAME@" BOOTSTRAP "./autogen.sh" ) + +string(COMPARE EQUAL "${DEPENDS_ON_PKGCONFIGS}" "" default_pkgconfig) +if(NOT default_pkgconfig) + set(DEPENDS_ON_PACKAGES ${DEPENDS_ON_PKGCONFIGS}) +endif() + +set(PKG_GENERATE_SHARED "${BUILD_SHARED_LIBS}") + +foreach(PKG_CONFIG_MODULE ${PKGCONFIG_EXPORT_TARGETS}) + # Use: + # * DEPENDS_ON_PACKAGES + # * PKG_GENERATE_SHARED + configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/pkgconfig-export-targets.cmake.in" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/cmake/${PKG_CONFIG_MODULE}/${PKG_CONFIG_MODULE}Config.cmake" + @ONLY + ) +endforeach() diff --git a/cmake/schemes/url_sha1_autotools.cmake.in b/cmake/schemes/url_sha1_autotools.cmake.in index 0792715b0..daacd8fff 100644 --- a/cmake/schemes/url_sha1_autotools.cmake.in +++ b/cmake/schemes/url_sha1_autotools.cmake.in @@ -8,7 +8,7 @@ include("@HUNTER_SELF@/cmake/Hunter") include(hunter_user_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_autotools_project) hunter_status_debug("Scheme: url_sha1_autotools") @@ -22,15 +22,20 @@ foreach(dependency ${DEPENDS_ON_PACKAGES}) endforeach() # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_BUILD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") + +set( + HUNTER_PACKAGE_UNRELOCATABLE_TEXT_FILES + "@HUNTER_PACKAGE_UNRELOCATABLE_TEXT_FILES@" +) hunter_autotools_project("@HUNTER_EP_NAME@" HUNTER_SELF @@ -58,3 +63,21 @@ hunter_autotools_project("@HUNTER_EP_NAME@" BOOTSTRAP "${BOOTSTRAP}" ) + +string(COMPARE EQUAL "${DEPENDS_ON_PKGCONFIGS}" "" default_pkgconfig) +if(NOT default_pkgconfig) + set(DEPENDS_ON_PACKAGES ${DEPENDS_ON_PKGCONFIGS}) +endif() + +set(PKG_GENERATE_SHARED "${BUILD_SHARED_LIBS}") + +foreach(PKG_CONFIG_MODULE ${PKGCONFIG_EXPORT_TARGETS}) + # Use: + # * DEPENDS_ON_PACKAGES + # * PKG_GENERATE_SHARED + configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/pkgconfig-export-targets.cmake.in" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/cmake/${PKG_CONFIG_MODULE}/${PKG_CONFIG_MODULE}Config.cmake" + @ONLY + ) +endforeach() diff --git a/cmake/schemes/url_sha1_cmake.cmake.in b/cmake/schemes/url_sha1_cmake.cmake.in index 49465d16b..4f489ec68 100644 --- a/cmake/schemes/url_sha1_cmake.cmake.in +++ b/cmake/schemes/url_sha1_cmake.cmake.in @@ -18,25 +18,26 @@ include(ExternalProject) # ExternalProject_Add list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) include(hunter_user_error) hunter_status_debug("Scheme: url_sha1_cmake") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") -hunter_test_string_not_empty("@HUNTER_CACHE_FILE@") -hunter_test_string_not_empty("@HUNTER_ARGS_FILE@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") -hunter_test_string_not_empty("@CMAKE_GENERATOR@") -hunter_test_string_not_empty("${CMAKE_TOOLCHAIN_FILE}") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") +hunter_assert_not_empty_string("@HUNTER_CACHE_FILE@") +hunter_assert_not_empty_string("@HUNTER_ARGS_FILE@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@CMAKE_GENERATOR@") +hunter_assert_not_empty_string("${CMAKE_TOOLCHAIN_FILE}") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") if(IOS) if(CMAKE_VERSION VERSION_LESS 3.5) @@ -51,6 +52,22 @@ else() set(ios_opts "") endif() +# https://cmake.org/cmake/help/v3.4/release/3.4.html#modules +# https://cmake.org/cmake/help/v3.4/module/ExternalProject.html +if(CMAKE_VERSION VERSION_LESS 3.4) + set(uses_terminal "") +else() + set( + uses_terminal + USES_TERMINAL_DOWNLOAD 1 + USES_TERMINAL_UPDATE 1 + USES_TERMINAL_CONFIGURE 1 + USES_TERMINAL_BUILD 1 + USES_TERMINAL_TEST 1 + USES_TERMINAL_INSTALL 1 + ) +endif() + string(COMPARE NOTEQUAL "@HUNTER_JOBS_OPTION@" "" have_jobs) if(have_jobs) string(COMPARE NOTEQUAL "@XCODE_VERSION@" "" is_xcode) @@ -73,12 +90,32 @@ else() set(log_build 0) endif() -if("@HUNTER_PACKAGE_LOG_INSTALL@") +if("@HUNTER_PACKAGE_LOG_INSTALL@" OR "@HUNTER_SUPPRESS_LIST_OF_FILES@") set(log_install 1) else() set(log_install 0) endif() +string(COMPARE EQUAL "@HUNTER_PACKAGE_PROTECTED_SOURCES@" "" is_empty) +if(is_empty) + set(http_credentials "") +else() + set( + http_credentials + HTTP_USERNAME "@HUNTER_PACKAGE_HTTP_USERNAME@" + HTTP_PASSWORD "@HUNTER_PACKAGE_HTTP_PASSWORD@" + ) +endif() + +string(COMPARE NOTEQUAL "${CMAKE_MAKE_PROGRAM}" "" has_make) +if(has_make) + set(make_args "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") +else() + set(make_args "") +endif() + +string(COMPARE EQUAL "${CMAKE_CFG_INTDIR}" "." is_single) + foreach(configuration @HUNTER_PACKAGE_CONFIGURATION_TYPES@) # All configurations use the same URL which will be downloaded only once # i.e. overhead only for unpacking archive + no files from the previous @@ -94,47 +131,61 @@ foreach(configuration @HUNTER_PACKAGE_CONFIGURATION_TYPES@) set(current_project "@HUNTER_EP_NAME@-${configuration}") + if(is_single) + set(build_type_opts "-DCMAKE_BUILD_TYPE=${configuration}") + else() + set(build_type_opts "-DCMAKE_CONFIGURATION_TYPES=${configuration}") + endif() + ExternalProject_Add( "${current_project}" URL @HUNTER_PACKAGE_URL@ URL_HASH SHA1=@HUNTER_PACKAGE_SHA1@ + ${http_credentials} DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR "@HUNTER_PACKAGE_INSTALL_PREFIX@" # not used, just avoid creating Install/ empty directory - BUILD_COMMAND "" - # this command is empty because all necessary targets will - # be built on install stage + BUILD_COMMAND + # Separate build and install stage so we can suppress install log + # which may consist of a long list of files + "@CMAKE_COMMAND@" + --build . + --config ${configuration} + -- + ${jobs_option} CMAKE_ARGS "-G@CMAKE_GENERATOR@" "-C@HUNTER_CACHE_FILE@" "-C@HUNTER_ARGS_FILE@" "-D${postfix_name}=${${postfix_name}}" - "-DCMAKE_BUILD_TYPE=${configuration}" - "-DCMAKE_CONFIGURATION_TYPES=${configuration}" + "${build_type_opts}" "-DCMAKE_INSTALL_PREFIX=@HUNTER_PACKAGE_INSTALL_PREFIX@" "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" + "${make_args}" ${ios_opts} INSTALL_COMMAND "@CMAKE_COMMAND@" --build . --target install --config ${configuration} - -- - ${jobs_option} COMMAND # Copy license files "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" -P "@HUNTER_SELF@/scripts/try-copy-license.cmake" LOG_BUILD ${log_build} LOG_INSTALL ${log_install} + ${uses_terminal} ) # Each external project must depends on previous one since they all use diff --git a/cmake/schemes/url_sha1_download.cmake.in b/cmake/schemes/url_sha1_download.cmake.in index f38a00e2e..49e7d446f 100644 --- a/cmake/schemes/url_sha1_download.cmake.in +++ b/cmake/schemes/url_sha1_download.cmake.in @@ -7,19 +7,21 @@ project(Hunter) list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_fatal_error) +include(hunter_user_error) include(hunter_status_debug) include(hunter_status_print) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_download") # Check preconditions -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") get_filename_component(filename "@HUNTER_PACKAGE_URL@" NAME) set(dest "@HUNTER_PACKAGE_DOWNLOAD_DIR@/${filename}") @@ -35,7 +37,7 @@ set(counter "") while(TRUE) string(COMPARE EQUAL "${counter}" "xxx" stop) if(stop) - hunter_fatal_error("Download failed") + hunter_user_error("Download failed") endif() if(EXISTS "${dest}") @@ -52,6 +54,7 @@ while(TRUE) SHOW_PROGRESS STATUS status LOG log + TLS_VERIFY "@HUNTER_TLS_VERIFY@" ) list(GET status 0 status_code) list(GET status 1 status_string) diff --git a/cmake/schemes/url_sha1_ios_sim.cmake.in b/cmake/schemes/url_sha1_ios_sim.cmake.in index 0261c906c..18d22fb43 100644 --- a/cmake/schemes/url_sha1_ios_sim.cmake.in +++ b/cmake/schemes/url_sha1_ios_sim.cmake.in @@ -10,19 +10,20 @@ list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_fatal_error) include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_ios_sim") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") string(COMPARE NOTEQUAL "@HUNTER_JOBS_OPTION@" "" have_jobs) if(have_jobs) @@ -41,7 +42,7 @@ execute_process( if(NOT result EQUAL 0) hunter_fatal_error( "'xcrun -f clang++' failed" - WIKI "error.xcrun.clang" + ERROR_PAGE "error.xcrun.clang" ) endif() @@ -53,6 +54,8 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -69,8 +72,9 @@ ExternalProject_Add( "@CMAKE_COMMAND@" -E copy build/Release/ios-sim "@HUNTER_PACKAGE_INSTALL_PREFIX@" COMMAND # Copy license files "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" -P "@HUNTER_SELF@/scripts/try-copy-license.cmake" ) diff --git a/cmake/schemes/url_sha1_unpack.cmake.in b/cmake/schemes/url_sha1_unpack.cmake.in index 543aa3caa..b280c8c4d 100644 --- a/cmake/schemes/url_sha1_unpack.cmake.in +++ b/cmake/schemes/url_sha1_unpack.cmake.in @@ -21,17 +21,30 @@ include(ExternalProject) # ExternalProject_Add list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_unpack") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +string(COMPARE EQUAL "@HUNTER_PACKAGE_PROTECTED_SOURCES@" "" is_empty) +if(is_empty) + set(http_credentials "") +else() + set( + http_credentials + HTTP_USERNAME "@HUNTER_PACKAGE_HTTP_USERNAME@" + HTTP_PASSWORD "@HUNTER_PACKAGE_HTTP_PASSWORD@" + ) +endif() ExternalProject_Add( "@HUNTER_EP_NAME@" @@ -39,8 +52,11 @@ ExternalProject_Add( @HUNTER_PACKAGE_URL@ URL_HASH SHA1=@HUNTER_PACKAGE_SHA1@ + ${http_credentials} DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -50,5 +66,11 @@ ExternalProject_Add( BUILD_COMMAND "" INSTALL_COMMAND - "" + # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" ) diff --git a/cmake/schemes/url_sha1_unpack_install.cmake.in b/cmake/schemes/url_sha1_unpack_install.cmake.in index 360a169a1..8837966ae 100644 --- a/cmake/schemes/url_sha1_unpack_install.cmake.in +++ b/cmake/schemes/url_sha1_unpack_install.cmake.in @@ -8,19 +8,20 @@ cmake_minimum_required(VERSION 3.0) list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") include(hunter_status_debug) -include(hunter_test_string_not_empty) +include(hunter_assert_not_empty_string) hunter_status_debug("Scheme: url_sha1_unpack_install") # Check preconditions -hunter_test_string_not_empty("@HUNTER_SELF@") -hunter_test_string_not_empty("@HUNTER_EP_NAME@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_INSTALL_PREFIX@") -hunter_test_string_not_empty("@HUNTER_PACKAGE_LICENSE_FILE@") +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") include(ExternalProject) # ExternalProject_Add @@ -32,6 +33,8 @@ ExternalProject_Add( SHA1=@HUNTER_PACKAGE_SHA1@ DOWNLOAD_DIR "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@" INSTALL_DIR @@ -47,8 +50,9 @@ ExternalProject_Add( -P "@HUNTER_SELF@/scripts/copy-files.cmake" COMMAND # Copy license files "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" - "-Ddstfile=@HUNTER_PACKAGE_LICENSE_FILE@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" -P "@HUNTER_SELF@/scripts/try-copy-license.cmake" ) diff --git a/cmake/templates/BoostConfig.cmake.in b/cmake/templates/BoostConfig.cmake.in index 9c3b8c6c9..039647b0f 100644 --- a/cmake/templates/BoostConfig.cmake.in +++ b/cmake/templates/BoostConfig.cmake.in @@ -1,6 +1,8 @@ # Copyright (c) 2015, Ruslan Baratov # All rights reserved. +include(hunter_check_toolchain_definition) + if(HUNTER_ENABLED) include(hunter_internal_error) include(hunter_status_debug) @@ -34,9 +36,18 @@ endfunction(hunter_add_rt_library) hunter_status_debug("Boost find config") -set(Boost_USE_STATIC_LIBS ON) +set(Boost_USE_STATIC_LIBS @BOOST_BUILD_STATIC@) set(Boost_NO_BOOST_CMAKE YES) +if(MSVC) + hunter_check_toolchain_definition(NAME "_DLL" DEFINED _hunter_vs_md) + if(_hunter_vs_md) + set(Boost_USE_STATIC_RUNTIME NO) + else() + set(Boost_USE_STATIC_RUNTIME YES) + endif() +endif() + find_package(Boost MODULE REQUIRED ${Boost_FIND_COMPONENTS}) get_filename_component( @@ -51,11 +62,18 @@ if(NOT TARGET "Boost::boost") INTERFACE_INCLUDE_DIRECTORIES "${_root_path}/include" ) if(MSVC) + #stop MSVC from trying to auto-link libs + set(compile_definitions "BOOST_ALL_NO_LIB=1") + if(@BOOST_ALL_DYN_LINK@) #required for MSVC when using shared libs + list(APPEND compile_definitions "BOOST_ALL_DYN_LINK") + endif() + set_target_properties( - "Boost::boost" - PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_NO_LIB=1" + "Boost::boost" + PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "${compile_definitions}" ) + endif() endif() @@ -113,6 +131,15 @@ foreach(_boost_component ${Boost_FIND_COMPONENTS}) IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX" IMPORTED_LOCATION_RELEASE "${_lib_release}" ) + + # Use Release version of library for MinSizeRel/RelWithDebInfo. + # TODO: how to deal with other (custom) build types? + set_target_properties( + "${_boost_lib}" + PROPERTIES + MAP_IMPORTED_CONFIG_MINSIZEREL Release + MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release + ) endif() endforeach() @@ -134,3 +161,10 @@ endif() if(TARGET Boost::chrono) hunter_add_rt_library(Boost::chrono) endif() + +if(TARGET Boost::log AND "@BUILD_SHARED_LIBS@") + set_property( + TARGET "Boost::log" + APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS BOOST_LOG_DYN_LINK + ) +endif() diff --git a/docs/conf.py b/docs/conf.py index 279995dee..0fad198a8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -55,7 +55,7 @@ # General information about the project. project = 'Hunter' -copyright = '2013-2016, Ruslan Baratov' +copyright = '2013-2019, Ruslan Baratov' author = 'Ruslan Baratov' # The version info for the project you're documenting, acts as replacement for @@ -63,9 +63,9 @@ # built documents. # # The short X.Y version. -version = '0.14' +version = '0.19' # The full version, including alpha/beta/rc tags. -release = '0.14' +release = '0.19' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -82,7 +82,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build', '_venv', 'rtfd-css'] +exclude_patterns = ['_build', '_venv', 'rtfd-css', 'packages/pkg/foo.rst'] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -100,7 +100,7 @@ #show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = 'default' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] diff --git a/docs/contacts.rst b/docs/contacts.rst index c4906a542..7efb1baf9 100644 --- a/docs/contacts.rst +++ b/docs/contacts.rst @@ -1,26 +1,30 @@ -.. Copyright (c) 2016, Ruslan Baratov +.. Copyright (c) 2016-2019, Ruslan Baratov .. All rights reserved. +.. spelling:: + + Gitter + refactor + spam + Contacts -------- Public ====== -Feel free to open new `issue`_ if you want to ask any questions. - -Public chat room: |gitter| +* Project is **closed** for public contributions Private ======= -You can write me to ``ruslan_baratov@yahoo.com`` or contact me using `Tox`_: - -* ``7EBD836B7690C3742E6F3632742BEB00283529E06D76E06F7065544A5F9C6F37D948FB0F754B`` -* ``4EED21EA40B0351D8BFC85A69499A3F7CFEDA6844DA39FF1783A4D9827423F075D7194707C43`` +* Write me at ruslan_baratov@yahoo.com +* Private chat room on Gitter: https://gitter.im/ruslo -.. _issue: https://github.com/ruslo/hunter/issues/new -.. _Tox: https://tox.chat +Hire +==== -.. |gitter| image:: https://badges.gitter.im/ruslo/hunter.svg - :target: https://gitter.im/ruslo/hunter?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge +I’m available for hire as a freelance developer for all types of Hunter +development (add/maintain/update package, fix bugs, design/implement +new features, etc.) or CMake development (introduce configuration from +scratch, refactor existing code, hunterize, etc.). diff --git a/docs/contributing.rst b/docs/contributing.rst index f9e3e1011..360818a0e 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -1,7 +1,116 @@ .. Copyright (c) 2016, Ruslan Baratov .. All rights reserved. +.. _contributing: + Contributing ------------ -* `Contribution `_ +There are many ways to contribute to Hunter: + +- Documentation +- There is a newer version of an existing package? `Notify us `__ or send a pull request with an updated version. +- Missing a package in Hunter? :ref:`Add a new package ` +- `Resolve Issues `__ + + - Can you provide an answer to an open question? + - Can you reproduce the error? + - Is the issue still relevant? Maybe the issue can be closed. + +When contributing please follow the style guides: + +- `Git `__ +- `CMake `__ + +.. note:: + + The minimum version of CMake for using Hunter is ``3.0``. + Please check that you're not using commands from newer versions + (`see documentation for 3.0 `__). + +.. note:: + + Before adding or updating a package in Hunter, the package is tested. + Tests are done to check if the source can be downloaded, built and linked. + Head over to our + `repository for per package CI testing contribution `__ + to see more. + +.. note:: + + If you're planning to introduce nontrivial feature it's better to + discuss design first, it will save a lot of time for both you and developers. + +Reporting bugs +~~~~~~~~~~~~~~ + +Hunter is CMake-based package manager so it's assumed that CMake is installed +and working correctly. Before reporting bugs please check: + +* Appropriate version of CMake is installed. + See :doc:`CMake version for Hunter `. + +* Verify CMake, build tools and C/C++ compilers you're planning to use. + E.g. try to build simple CMake project (check + `this document `__ + in case you have troubles): + + .. code-block:: cmake + + # CMakeLists.txt + + cmake_minimum_required(VERSION 3.0) + project(foo) + + add_executable(foo foo.cpp) + + .. code-block:: cpp + + // foo.cpp + + #include + + int main() { + std::cout << "Hello world!" << std::endl; + } + +* If you are experiencing some download error please check F.A.Q.: + :doc:`How to fix download error? ` + +If everything seems OK: + +* Run build again with :ref:`HUNTER_STATUS_DEBUG=ON ` +* Make sure you're not using :ref:`HUNTER_NO_TOOLCHAIN_ID_RECALCULATION ` +* Take a look at **first** error reported by Hunter. If Hunter reports chain + of errors the last error you see is **not relevant**! +* Update to `latest Hunter URL/SHA1 `__ + and check that issue you have hit is not already fixed/reported +* Check this document if the first error you see is ``external.build.failed``: + + * https://docs.hunter.sh/en/latest/reference/errors/error.external.build.failed.html +* Remove irrelevant code from your example and report one problem at a time. + Try to construct `SSCCE `__. If you need more files + than just ``CMakeLists.txt`` it's better to create separate GitHub repository + for easy copying of your example. It will be nice if you can reproduce the + issue with the CI system like AppVeyor/Travis. + +* **Do not remove** ``~/.hunter`` repository to try to fix the issue! Hunter + designed to be correct and reproducible, there should be no stale/rotten + artifacts inside that can affect his work. If the ``rm -rf ~/.hunter`` step + fix the issue for you it means that either you are using Hunter wrongly or + there is a bug somewhere. If you want to figure out what is the origin + of the problem please do keep ``~/.hunter`` directory. + +* Open an `issue `__ and provide + next info: + + * CMake version you're using ``cmake --version``. CMake build from source? + * OS (Linux, OSX, Windows) + * Command line you're using on generate step, e.g. + + .. code-block:: none + + cmake -H. -B_builds "-GVisual Studio 14 2015" + + * Are you using toolchain? + * Add log until **first error** reported by Hunter diff --git a/docs/creating-new.rst b/docs/creating-new.rst index 2f3e58bd7..ad3aa6828 100644 --- a/docs/creating-new.rst +++ b/docs/creating-new.rst @@ -6,14 +6,9 @@ Creating new package .. _creating new: -This is a guide for adding new package to Hunter. We start with the simple -one (CMake based, no dependencies), then cover "hunterization" (CMake based, -depends on other packages). Final is a most complex one (non-CMake packages, -creating custom build scheme). - .. toctree:: :maxdepth: 1 - /creating-new/cmake - /creating-new/cmake-dependencies - /creating-new/custom + /creating-new/create + /creating-new/update + /creating-new/patch diff --git a/docs/creating-new/cmake-dependencies.rst b/docs/creating-new/cmake-dependencies.rst deleted file mode 100644 index 008ac4115..000000000 --- a/docs/creating-new/cmake-dependencies.rst +++ /dev/null @@ -1,109 +0,0 @@ -.. Copyright (c) 2016, Ruslan Baratov -.. All rights reserved. - -CMake (with dependencies) -------------------------- - -If your project use external packages (i.e. has command ``find_package(Foo)``) -you need to patch it first so this packages can be found in Hunter root -directory instead of standard one: - -.. code-block:: cmake - :emphasize-lines: 1 - - hunter_add_package(Foo) - find_package(Foo) - -.. _dependencies conflict: - -Conflict -======== - -The reason is that if one package will be found in standard location and other -in Hunter they may conflict with each other. - -Consider next example. Project ``Roo`` is not aware about Hunter custom -locations. It just using regular ``find_package``: - -.. code-block:: cmake - - # Roo/CMakeLists.txt - - find_package(ZLIB) - -Project ``Bar`` depends on ``ZLIB`` and ``Roo``. Both packages downloaded by -``hunter_add_package`` commands: - -.. code-block:: cmake - :emphasize-lines: 3, 6 - - # Bar/CMakeLists.txt - - hunter_add_package(Roo) - find_package(Roo) - - hunter_add_package(ZLIB) - find_package(ZLIB) - -.. image:: /images/package-conflict.png - :align: center - -Fix -=== - -To fix this issue you need to patch ``Roo`` so it will use ``ZLIB`` from Hunter. -In terms of CMake code it means adding ``HunterGate`` and ``hunter_add_package`` -(see :doc:`First Step `): - -.. code-block:: cmake - :emphasize-lines: 4-5 - - # Roo/CMakeLists.txt - - include("cmake/HunterGate.cmake") - HunterGate(...) - hunter_add_package(ZLIB) - find_package(ZLIB) - -.. image:: /images/package-conflict-resolved.png - :align: center - -Note that SHA1 of Hunter archive in ``HunterGate`` commands of ``Bar`` and -``Roo`` can be different. Same location will be set automatically internally -you don't have to manage it manually. - -Maintenance -=========== - -On practice patching require to have a fork of a project. In general it -doesn't matter where fork is located but there is a central place for the -patched packages: - -* https://github.com/hunter-packages - -If you want to create new fork let me know about it in corresponding issue -with `"new package" label`_, I will create a new team and add you so you can -push changed. New branch ``hunter`` will be created for patching, please -keep other branches in a **clean state** so we can always do -``git merge --ff-only`` from upstream. -Please do push commits **only related to hunterization**. Do not push general -fixes and improvements, do push them **upstream** instead. Perfect hunterization -should contains only: - -* Adding ``HunterGate`` module (`example `__) -* Including it with some URL/SHA1 (`example `__) -* Adding ``hunter_add_package`` commands (`example `__) - -Note that I'm not willing and can't do maintain all packages on practice so -I do add all developers to the team if they ask to. If you want to be -a maintainer, keep eye on changes, pull requests, be responsible for review and -releases - let me know. - -Also note that Hunter designed to have **zero maintenance** for such task since -you can add ``HUNTER_ENABLED=OFF`` option at the top of the project to skip all -package management stuff (see :doc:`/overview/compatibility`). It means you -can push branch ``hunter`` to upstream without affecting functionality of -the project. As a summary it may sounds strange but the final goal of this -organization is to have no packages at all. - -.. _"new package" label: https://github.com/ruslo/hunter/issues?q=is%3Aopen+is%3Aissue+label%3A%22new+package%22 diff --git a/docs/creating-new/cmake.rst b/docs/creating-new/cmake.rst deleted file mode 100644 index 774a1b246..000000000 --- a/docs/creating-new/cmake.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. Copyright (c) 2016, Ruslan Baratov -.. All rights reserved. - -CMake (no dependencies) ------------------------ - -* How to add a new `CMake project`_ - -.. _CMake project: https://github.com/ruslo/hunter/wiki/usr.adding.new.package diff --git a/docs/creating-new/custom.rst b/docs/creating-new/custom.rst deleted file mode 100644 index 323a697b1..000000000 --- a/docs/creating-new/custom.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. Copyright (c) 2016, Ruslan Baratov -.. All rights reserved. - -Non-CMake: custom scheme ------------------------- - -* How to add a new `custom-build project`_ - -.. _custom-build project: https://github.com/ruslo/hunter/wiki/usr.adding.new.package.custom.scheme diff --git a/docs/donations.rst b/docs/donations.rst deleted file mode 100644 index ea7bafc06..000000000 --- a/docs/donations.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. Copyright (c) 2016, Ruslan Baratov -.. All rights reserved. - -Donations ---------- - -* `Donations `_ diff --git a/docs/faq/interaction-with-other-package-managers.rst b/docs/faq/interaction-with-other-package-managers.rst index 0a673e655..a89e7f26d 100644 --- a/docs/faq/interaction-with-other-package-managers.rst +++ b/docs/faq/interaction-with-other-package-managers.rst @@ -23,7 +23,3 @@ and upload binaries to public. So the question ``How to make Hunter interact with system libraries?`` should really be ``How to improve Hunter so it behaves like system package manager?``, e.g. add new packages that are currently missing. - -.. seealso:: - - * `Feature requests: use system packages `__ diff --git a/docs/faq/why-binaries-from-server-not-used.rst b/docs/faq/why-binaries-from-server-not-used.rst index 55755676e..d1b4d6e92 100644 --- a/docs/faq/why-binaries-from-server-not-used.rst +++ b/docs/faq/why-binaries-from-server-not-used.rst @@ -4,7 +4,11 @@ Why binaries from server not used? ================================== -If settings and environment of your local project doesn't match environment +.. seealso:: + + * :ref:`Using GitHub cache server ` + +If settings and environment of your local project does not match environment of Travis/AppVeyor services (this is where binaries usually uploaded from) you will see ``Cache miss`` message and package will be build locally: @@ -45,18 +49,18 @@ Next information will help you to set your environment. .. code-block:: shell - > docker pull quay.io/ruslo/hunter-travis # pull/update image - > docker run -it quay.io/ruslo/hunter-travis bash - travis@...:~$ (cd polly && git pull) # fetch last changes, note that branch "develop" is used! + > docker pull quay.io/ruslo/hunter-travis-trusty # pull/update image + > docker run -it quay.io/ruslo/hunter-travis-trusty bash + travis@...:~$ (cd polly && git pull) # fetch last changes travis@...:~$ (cd hunter && git pull) # - // - - travis@...:~$ cd hunter && TOOLCHAIN=gcc-4-8 PROJECT_DIR=examples/GTest ./jenkins.py --verbose --clear-except + travis@...:~$ cd hunter && TOOLCHAIN=gcc PROJECT_DIR=examples/GTest ./jenkins.py --verbose --clear-except Starting GUI: .. code-block:: shell > xhost + - > docker run -it -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix quay.io/ruslo/hunter-travis bash + > docker run -it -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix quay.io/ruslo/hunter-travis-trusty bash travis@...:~$ firefox Information from logs @@ -133,11 +137,11 @@ in logs: .. code-block:: none - -- [hunter *** DEBUG *** ...] HUNTER_TOOLCHAIN_ID_PATH: /.../_Base/86b1bc9/cef4daf/aa85dd8 + -- [hunter *** DEBUG *** ...] HUNTER_TOOLCHAIN_ID_PATH: /.../_Base/86b1bc9/aa85dd8 .. code-block:: shell - > openssl sha1 /.../_Base/86b1bc9/cef4daf/aa85dd8/toolchain.info + > openssl sha1 /.../_Base/86b1bc9/aa85dd8/toolchain.info SHA1(toolchain.info)= aa85dd86f2feefe76397d7b624ccb6c09d971fe5 You can see that there is no ``aa85dd8`` entry in cache: @@ -159,7 +163,7 @@ Compare both files to figure out what's wrong: .. code-block:: shell - > diff hunter-cache/8928885/toolchain.info /.../_Base/86b1bc9/cef4daf/aa85dd8/toolchain.info + > diff hunter-cache/8928885/toolchain.info /.../_Base/86b1bc9/aa85dd8/toolchain.info ... < #define __GNUC_MINOR__ 8 < #define __GNUC_PATCHLEVEL__ 1 @@ -174,114 +178,3 @@ Compare both files to figure out what's wrong: > #define __GNUG__ 5 It means that local GCC version is ``5.4.0`` and server version is ``4.8.1``. - -.. _uploading to server: - -Uploading to server -------------------- - -It is possible to upload Hunter binary cache to the server. -For now only GitHub hosting supported. All big raw ``*.tar.bz2`` archives -uploaded as assets to release with name ``cache`` (directory layout doesn't -matter) and all small text files with meta information uploaded directly to -branch ``master`` (directory layout matters) (see -`hunter-cache `__ as example). - -.. note:: - - If you have shared folder in your network there is no need to use - any scripts, you can just set ``HUNTER_ROOT`` variable to location of this - directory. - -This job can be -done using Python script ``maintenance/upload-cache-to-github.py`` (which may be -called by ``jenkins.py --upload``). Note that downloading from server done by -``file(DOWNLOAD ...)`` CMake commands, so client is still CMake-only based. - -Extra servers can be added by modifying variable -`HUNTER_CACHE_SERVERS `__ -before ``HunterGate`` command: - -.. code-block:: cmake - - list(APPEND HUNTER_CACHE_SERVERS "https://github.com/ingenue/hunter-cache") - HunterGate(URL ... SHA1 ...) - -If you want to check that there is no 3rd party builds triggered by CMake and -all packages downloaded from server you can use -`HUNTER_DISABLE_BUILDS `__ -variable. Also variable -`HUNTER_USE_CACHE_SERVERS `__ -can be used to specify downloading policy. - -Uploading from CI servers like Travis or AppVeyor require to store password as -an environment variable ``GITHUB_USER_PASSWORD`` (note that you can create -separate "bot" account to manage all this stuff). - -Travis CI -~~~~~~~~~ - -Excerpts from documentation (`1 `__ -and `2 `__) -for OS X (see also `this repo `__): - -.. code-block:: shell - - > git clone https://github.com/ingenue/hunter # your repository here - # note that this is repository where password **will be used** in .travis.yml - # this repository is a fork of https://github.com/ruslo/hunter - > cd hunter - > gem install travis - > travis encrypt GITHUB_USER_PASSWORD=very-secured-password - ... - Please add the following to your .travis file: - - secure: "..." - -If you have problems with installing ``travis`` try to install -`ruby from brew `__: - -.. code-block:: shell - - > brew install ruby - -Now you can add secure variable to ``.travis.yml`` matrix: - -.. code-block:: yaml - - env: - global: - - secure: "uTvW...TAE=" - matrix: - - PROJECT_DIR=... TOOLCHAIN=... - - PROJECT_DIR=... TOOLCHAIN=... - -.. seealso:: - - * `.travis.yml example `__ - -AppVeyor -~~~~~~~~ - -Use `this form `__ to encrypt your -password. I.e. put ``very-secured-password`` to this form, run ``Encrypt`` and -copy/paste results into your ``appveyor.yml`` (note that you should be logged in -as an **owner** of repository): - -.. code-block:: yaml - - environment: - global: - GITHUB_USER_PASSWORD: - secure: 2Sd...g== - matrix: - - TOOLCHAIN=... - PROJECT_DIR=... - - - TOOLCHAIN=... - PROJECT_DIR=... - -.. seealso:: - - * `appveyor.yml example `__ - diff --git a/docs/index.rst b/docs/index.rst index 7f983088b..2abe3e43c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,40 +4,39 @@ Hunter: organize freedom ======================== -.. warning:: +Welcome to the Hunter package manager documentation! - Documentation is in process of migrating from - `GitHub wiki `_. - Some information may be missing: blank pages, broken links, etc. - Will be fixed soon... +Hunter is a CMake driven cross-platform package manager for C/C++ [1]_ projects. +With the help of Hunter you can organize builds for **Linux**, **Windows**, +**macOS**, **iOS**, **Android**, **Raspberry Pi** and other platforms. +Third-party external projects are highly customizable, effectively allowing you +to have myriad variants of directories with them based on combinations of +version to build, static/shared, CMake ``-D`` options, Release/Debug, etc. -Welcome to the Hunter package manager documentation! +Separate root directories will be created for each variant, so they all +can be used simultaneously on one machine without conflicts +(just like `virtualenv`_ but automatically). +Going further: each such root directory can be shared between several +local projects if configuration of externals matches. +So when you are starting another project from scratch and use the same external +packages, there will be no additional copy or build triggered; the only +overhead is checking the existence of a ``DONE`` stamp file for each package. +In case your local environment is similar enough to the continuous integration +environment of Travis/AppVeyor service, then build will not be triggered at all +- cached binaries will be downloaded from GitHub server instead. + +Mainly Hunter is designed to manage packages with CMake build system under the +hood and existing CMake packages can be quite easily integrated into system, +but non-CMake packages are also supported too using custom templates +(build schemes) with ``ExternalProject_Add`` command(s). -Hunter is CMake-driven cross-platform package manager for C++ [1]_ projects. -With the help of Hunter you can organize builds for **Linux**, **OS X**, -**Windows**, **iOS**, **Android**, **Raspberry Pi**. Third party external -projects are highly customizable effectively allowing you to have myriad -variants of directories with them based on combinations of version to build, -static/shared, CMake ``-D`` options, Release/Debug etc. Separate root -directory will be created for each variant so they all can be used -simultaneously on one machine without conflicts (just like `virtualenv`_ but -automatically). Going further: each such root directory can be shared between -several local projects if configuration of externals matches. So when you are -starting project from scratch and use same external packages there will be no -additional copy or build triggered, the only overhead is checking existence of -one ``DONE`` stamp file for each package. In case your local environment is -similar enough to continuous integration environment of Travis/AppVeyor -services then build will not be triggered at all - cached binaries will be -downloaded from GitHub server instead. Mainly Hunter designed to manage -packages with CMake build system under the hood and existing CMake package can -be quite easily integrated into system but non-CMake packages supported too -using custom templates (build schemes) with ``ExternalProject_Add`` command(s). -Client is a collection of CMake only modules (i.e. it's **not a binary** like -``apt-get`` or script like ``brew``) so it supports from the box all -platforms/generators/IDEs which CMake can handle like Visual Studio, Xcode, -QtCreator, NMake, Ninja, Cygwin or MinGW. Works fine with CMake-GUI too. +The Hunter client is a collection of CMake-only modules +(i.e. it's **not a binary** like ``apt-get`` or script like ``brew``) +so it supports out-of-the-box all platforms/generators/IDEs which CMake can +handle, like Visual Studio, Xcode, :doc:`Android Studio `, +QtCreator, NMake, Ninja, Cygwin or MinGW. It works fine with CMake-GUI too. -Prime directive used for adding package to the current root is +The prime directive used for adding package to the current root is ``hunter_add_package`` which companioning CMake's ``find_package``. For example: @@ -59,7 +58,6 @@ Sounds interesting? Keep reading! Frequently Asked Questions /contributing /contacts - /donations /reference .. [1] C++ is the main goal, works for other types as well. See :ref:`Manage anything `. diff --git a/docs/jenkins.sh b/docs/jenkins.sh index a9a273bd8..3428035f9 100755 --- a/docs/jenkins.sh +++ b/docs/jenkins.sh @@ -31,4 +31,4 @@ rm -rf _build _static _spelling mkdir _static sphinx-build -v -W . _build -sphinx-build -b spelling . _spelling +sphinx-build -b spelling -W . _spelling diff --git a/docs/make.sh b/docs/make.sh index 01f12d8bd..7cae09339 100755 --- a/docs/make.sh +++ b/docs/make.sh @@ -4,7 +4,7 @@ set -x mkdir -p _static -sphinx-build -v . _build +sphinx-build -W -v . _build set +x diff --git a/docs/overview.rst b/docs/overview.rst index 15bca4a3c..109c354d4 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -5,8 +5,10 @@ Brief overview -------------- This is a brief overview of big picture. It takes about 5 minutes of reading -but will show you the main features/aspects of using Hunter. Avoid running -real code for now, it will be covered in next :ref:`Quick start ` section. +but will show you the main features/aspects of using Hunter. Please **don't make +any assumptions** about how Hunter works without reading this part. Also avoid +running real code for now, it will be covered in next +:ref:`Quick start ` section. .. toctree:: :maxdepth: 1 diff --git a/docs/overview/anything.rst b/docs/overview/anything.rst index c762b3d29..21cfe524d 100644 --- a/docs/overview/anything.rst +++ b/docs/overview/anything.rst @@ -6,7 +6,7 @@ Manage anything .. _manage-anything: -You can manage anything that can be downloaded by ``URL`` and checked with +You can manage anything that can be downloaded by ``URL`` and checked with an ``SHA1`` hash: * C/C++ packages @@ -23,12 +23,11 @@ You can manage anything that can be downloaded by ``URL`` and checked with * CMake modules .. code-block:: cmake - :emphasize-lines: 2 + :emphasize-lines: 4 - hunter_add_package(Sugar) - include("${SUGAR_ROOT}/cmake/Sugar") + hunter_add_package(sugar) + find_package(sugar CONFIG REQUIRED) - include(sugar_files) sugar_files(...) * Additional sources (`OpenCV example `__): @@ -52,3 +51,7 @@ You can manage anything that can be downloaded by ``URL`` and checked with add_test(NAME FooTest1 COMMAND foo --use-data "${MYDATA_ROOT}/case-1.png") add_test(NAME FooTest2 COMMAND foo --use-data "${MYDATA_ROOT}/case-2.png") # ... + +.. note:: + + * See :doc:`alternative approach ` diff --git a/docs/overview/automatic.rst b/docs/overview/automatic.rst index f83b35c28..45c4958db 100644 --- a/docs/overview/automatic.rst +++ b/docs/overview/automatic.rst @@ -11,8 +11,8 @@ Automatic builds No dependencies in README ========================= -Build instructions from Hunter archive triggered automatically when -``hunter_add_package`` function called. Hence there is no need to specify +Build instructions from the Hunter archive are triggered automatically when +the ``hunter_add_package`` function called, hence there is no need to specify dependencies in a raw ``README`` file like: .. code-block:: none @@ -40,7 +40,7 @@ Now it's simply: Optional dependencies ===================== -Optional dependency? No problems, expressed in a pretty clean way: +Optional dependency? No problem, optional dependencies are expressed in a straightforward way: .. code-block:: cmake :emphasize-lines: 4 @@ -52,13 +52,7 @@ Optional dependency? No problems, expressed in a pretty clean way: hunter_add_package(bar) endif() -Same commands: - -:: - - > cmake -H. -B_builds -DBUILD_WITH_BAR=YES # + install bar - -instead of: +Now instead of: .. code-block:: none :emphasize-lines: 2, 3, 6 @@ -70,17 +64,23 @@ instead of: Then run build: > cmake -H. -B_builds -DBUILD_WITH_BAR=YES -Vs. 'requirements.txt' style -============================ +It's simply: + +:: + + > cmake -H. -B_builds -DBUILD_WITH_BAR=YES # + install bar + +Compared to a 'requirements.txt' style approach +=============================================== -Note that such approach differs from +Note that Hunter's approach differs from a `requirements.txt-like approach `__ -(i.e. when external packages specified by separate file). This allow to avoid -duplication of logic in many cases even if ``requirements.txt`` do downloads -automatically too. +(i.e. when external packages are specified in a separate file). This allows Hunter to avoid +duplication of logic in many cases, even if the ``requirements.txt`` style approach also automatically downloads +dependencies too. -Imagine we have to specify dependencies in some kind of ``requirements.cmake`` -file and there is user's option: +Imagine that we have to specify dependencies in some kind of ``requirements.cmake`` +file and there is a user option ``BUILD_WITH_BAR``: .. code-block:: cmake :emphasize-lines: 3 @@ -91,7 +91,7 @@ file and there is user's option: command_to_install(Bar) endif() -In case it's not CMake code this will look even fancy, say ``requirements.json``: +Or, in the case that it isn't CMake code, this might by something fancy like ``requirements.json``: .. code-block:: json @@ -104,7 +104,7 @@ In case it's not CMake code this will look even fancy, say ``requirements.json`` } } -You have to repeat same condition in ``CMakeLists.txt`` file: +You would have to repeat the same condition in the ``CMakeLists.txt`` file: .. code-block:: cmake :emphasize-lines: 3 @@ -125,8 +125,8 @@ You have to repeat same condition in ``CMakeLists.txt`` file: target_compile_definitions(... PUBLIC "WITH_BAR") endif() -In case when this part will change you must not to forget to modify ``requirements`` -accordingly too. And real world libraries can have nontrivial chain of conditions, e.g. +Later, when you need to change this dependency in ``CMakeLists.txt``, you'd better not forget to also modify ``requirements.cmake`` +accordingly. Remember real world libraries can have nontrivial chain of conditions, e.g. `OpenCV components `__. .. admonition:: Stackoverflow diff --git a/docs/overview/binaries.rst b/docs/overview/binaries.rst index f5799ac09..1e8cdd5f8 100644 --- a/docs/overview/binaries.rst +++ b/docs/overview/binaries.rst @@ -8,13 +8,13 @@ Binaries from server -------------------- -Hunter has internal mechanism of saving binaries of installed packages along -with meta information about toolchain, build options and dependencies. -This allow to not trigger same build on creation of new root directory. -For example when user change version of ``OpenSSL`` from ``1.0.1`` to ``1.0.2`` -it does affect ``Config-ID`` so new root will be created. But it will not affect -how ``GTest`` builds (if it's not a dependency) so ``GTest`` archive can be -unpacked from cache. Such cache can be used locally or uploaded to server. +Hunter has an internal mechanism that saves the binaries of installed packages along +with meta-data about the toolchain, build options, and dependencies. +This allows Hunter to avoid triggering the same build when a new root directory is created. +For example, when a user changes the version of ``OpenSSL`` from ``1.0.1`` to ``1.0.2`` +it will affect ``Config-ID``, so a new root will be created. However, it will not affect +how ``GTest`` builds (if it's not a dependency), so the ``GTest`` archive can be +unpacked from the local cache. The cache can be kept local or uploaded to a Hunter cache server. .. seealso:: @@ -24,25 +24,26 @@ unpacked from cache. Such cache can be used locally or uploaded to server. Details ======= -Default server with binaries is +The default server with cached binaries is `ingenue/hunter-cache `__. -Archives saved as assets to `cache tag `__. -Uploaded packages can be found by ``upload.*`` query on page with branches: +Archives are saved as GitHub `release assets `__ +and each is associated with a git `tag `__. +Available packages can be queried using an ``upload.*`` HTTP query from the GitHub branches URL: * `ingenue/hunter@upload. `__ -Note that some toolchains may not work for the specific packages. Check -status in job details. E.g. Qt is broken for iOS armv7s architecture, so -we have to use ``ios-*-wo-armv7s`` toolchains: +Note that some toolchains may not work for specific packages. Check the +status in the Travis CI job details. For example, Qt is broken for the iOS armv7s architecture, so +we have to use the ``ios-*-wo-armv7s`` toolchains: * https://travis-ci.org/ingenue/hunter/builds/140158080 -Binaries/headers stored in archives. Archives are the result of packing -``CMAKE_INSTALL_PREFIX`` directory produced by -``cmake --build _builds --target install`` command. Idea is similar to CPack -functionality but extended for non-CMake packages too. +Binaries/headers are stored in archives and archives are the result of packing the +``CMAKE_INSTALL_PREFIX`` directory produced by the +``cmake --build _builds --target install`` command. The idea is similar to CPack +functionality but is extended for non-CMake packages too. -.. code-block:: shell +.. code-block:: none :emphasize-lines: 3, 6, 8 > mkdir temp-dir diff --git a/docs/overview/compatibility.rst b/docs/overview/compatibility.rst index 8038de0c8..b2176516f 100644 --- a/docs/overview/compatibility.rst +++ b/docs/overview/compatibility.rst @@ -1,4 +1,4 @@ -.. Copyright (c) 2016, Ruslan Baratov +.. Copyright (c) 2016-2017, Ruslan Baratov .. All rights reserved. Backward compatibility @@ -8,15 +8,13 @@ Turn Hunter off by adding one option `HUNTER_ENABLED=NO`_ to use your old settings. For example: .. code-block:: cmake - :emphasize-lines: 1 + :emphasize-lines: 3 - hunter_add_package(OpenSSL) + add_executable(foo openssl-example.cpp) + hunter_add_package(OpenSSL) find_package(OpenSSL REQUIRED) - include_directories("${OPENSSL_INCLUDE_DIR}") - - add_executable(foo openssl-example.cpp) - target_link_libraries(foo ${OPENSSL_LIBRARIES}) + target_link_libraries(foo PUBLIC OpenSSL::SSL OpenSSL::Crypto) by default this code will trigger download and build of OpenSSL: @@ -35,7 +33,7 @@ by default this code will trigger download and build of OpenSSL: /.../_Base/a9bd96a/e8394c3/dd69ac4/Install/lib/libcrypto.a -ldl -but adding ``HUNTER_ENABLED=NO`` make it skip all Hunter instructions and +but adding ``HUNTER_ENABLED=NO`` make it **skip all Hunter instructions** and system library will be used instead: .. code-block:: bash @@ -49,8 +47,21 @@ system library will be used instead: CMakeFiles/foo.dir/openssl-example.cpp.o -o foo -rdynamic - -lssl - -lcrypto + /usr/lib/x86_64-linux-gnu/libssl.so + /usr/lib/x86_64-linux-gnu/libcrypto.so + +.. note:: + + As you can see ``hunter_add_package`` has no effect when ``HUNTER_ENABLED`` + is ``OFF`` hence such code is redundant: + + .. code-block:: cmake + + if(HUNTER_ENABLED) + hunter_add_package(foo) + endif() + + It will behave in the same way as just ``hunter_add_package(foo)`` alone. ``HUNTER_ENABLED=NO`` can be set by default using CMake ``option``: @@ -71,8 +82,35 @@ it still can be used in Hunter, no extra modifications needed. .. _HUNTER_ENABLED=NO: https://github.com/ruslo/hunter/wiki/usr.variables#hunter_enabled -.. warning:: +Helper modules +============== + +Not all packages have the same CMake usage API. E.g. for CURL in Hunter +there is imported target ``CURL::libcurl`` but there are only +``CURL_INCLUDE_DIRS`` and ``CURL_LIBRARIES`` defined in standard ``FindCURL`` +module. + +To mimic Hunter API `disabled-mode `__ +modules can be used. + +``HunterGate`` will load them automatically when ``HUNTER_ENABLED=OFF`` and +they are located in ``${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode``: + +.. code-block:: none + + > cmake -H. -B_builds -DHUNTER_ENABLED=NO -DHUNTER_STATUS_DEBUG=ON + -- [hunter *** DEBUG *** ...] Adding "disabled-mode" modules: /.../cmake/Hunter/disabled-mode + +Module ``CURLConfig`` from "disabled-mode" modules will be added to CMake +search path, loaded, call standard ``FindCURL`` and create imported target +``CURL::libcurl``. This will allow to use same API with and without Hunter: + +.. code-block:: cmake + + hunter_add_package(CURL) + find_package(CURL CONFIG REQUIRED) + target_link_libraries(foo PUBLIC CURL::libcurl) + +.. admonition:: Examples on GitHub - Using old-style ``FOO_LIBRARIES`` variable instead of imported ``Foo::foo`` - targets will make your project non-relocatable because of full paths, so - probably you have to change this code to ``Foo::foo`` anyway. + * `Disabled mode example `__ diff --git a/docs/overview/customization.rst b/docs/overview/customization.rst index a53f2d036..aa925da8b 100644 --- a/docs/overview/customization.rst +++ b/docs/overview/customization.rst @@ -4,14 +4,14 @@ Customization ------------- -You got full control of how packages will be built. You can create your own -mapping ``version`` -> ``URL``, add globals like compiler and flags or add -new build option to external package. +You have full control of how packages will be built. You can create your own +mapping of ``version`` -> ``URL``, add globals like compiler and flags, or add +new build options to external packages. .. toctree:: :maxdepth: 1 Hunter-ID - Config-ID Toolchain-ID - Build types + Config-ID + Build Types diff --git a/docs/overview/customization/build-types.rst b/docs/overview/customization/build-types.rst index 54fd57286..49b58b224 100644 --- a/docs/overview/customization/build-types.rst +++ b/docs/overview/customization/build-types.rst @@ -4,4 +4,4 @@ Build types ----------- -* `Build types like Release/Debug `_ +* `Build types like Release/Debug `__ diff --git a/docs/overview/customization/config-id.rst b/docs/overview/customization/config-id.rst index 243c59166..211b72291 100644 --- a/docs/overview/customization/config-id.rst +++ b/docs/overview/customization/config-id.rst @@ -1,4 +1,4 @@ -.. Copyright (c) 2016, Ruslan Baratov +.. Copyright (c) 2016-2019, Ruslan Baratov .. All rights reserved. Config-ID @@ -10,8 +10,8 @@ Config-ID .. _config-id: -Second level of customization. Set version of package to build and build -options. +Third level of customization. Set version of package to build and +its build options. ``Config-ID`` is the first 7 digits of ``SHA1`` of the file with ``hunter_config`` commands (internal unified representation). This level can @@ -19,40 +19,42 @@ be customized with `HunterGate options`_: ``GLOBAL``, ``LOCAL`` and ``FILEPATH``. Packages from ``Hunter-ID 1eae623`` can be built using different versions and different CMake arguments: -+-------------------+ -| Hunter-ID 1eae623 | -+-------------------+ - -+-------------+----------------------------------------------------------------------+ -| Config-ID | | -+=============+===================+==================================================+ -| ``0fa873a`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/0fa873a/...`` | -| +-------------------+---------+-----------+----------------------------+ -| | Packages | Name | Version | Options | -| | +---------+-----------+----------------------------+ -| | | ``Foo`` | ``1.0.0`` | | -| | +---------+-----------+----------------------------+ -| | | ``Boo`` | ``2.0.0`` | ``BOO_WITH_SOMETHING=YES`` | -+-------------+-------------------+---------+-----------+----------------------------+ -| ``e9da39c`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/e9da39c/...`` | -| +-------------------+---------+-----------+----------------------------+ -| | Packages | Name | Version | Options | -| | +---------+-----------+----------------------------+ -| | | ``Foo`` | ``2.1.0`` | ``FOO_SUPER_MODE=YES`` | -| | +---------+-----------+----------------------------+ -| | | ``Boo`` | ``3.0.0`` | ``BUILD_SHARED_LIBS=ON`` | -+-------------+-------------------+---------+-----------+----------------------------+ ++-------------------+----------------------+ +| Hunter-ID 1eae623 | Toolchain-ID d46ea0b | ++-------------------+----------------------+ + ++-------------+--------------------------------------------------------------------------+ +| Config-ID | | ++=============+===================+======================================================+ +| ``0fa873a`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/d46ea0b/0fa873a/...`` | +| +-------------------+---------+-----------+--------------------------------+ +| | Packages | Name | Version | Options | +| | +---------+-----------+--------------------------------+ +| | | ``Foo`` | ``1.0.0`` | | +| | +---------+-----------+--------------------------------+ +| | | ``Boo`` | ``2.0.0`` | ``BOO_WITH_SOMETHING=YES`` | ++-------------+-------------------+---------+-----------+--------------------------------+ +| ``e9da39c`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/d46ea0b/e9da39c/...`` | +| +-------------------+---------+-----------+--------------------------------+ +| | Packages | Name | Version | Options | +| | +---------+-----------+--------------------------------+ +| | | ``Foo`` | ``2.1.0`` | ``FOO_SUPER_MODE=YES`` | +| | +---------+-----------+--------------------------------+ +| | | ``Boo`` | ``3.0.0`` | ``BUILD_SHARED_LIBS=ON`` | ++-------------+-------------------+---------+-----------+--------------------------------+ Message in logs: -:: +.. code-block:: none - -- [hunter] [ Hunter-ID: 1eae623 | Config-ID: 0fa873a | Toolchain-ID: ... ] - -- [hunter] [ Hunter-ID: 1eae623 | Config-ID: e9da39c | Toolchain-ID: ... ] + -- [hunter] [ Hunter-ID: 1eae623 | Toolchain-ID: d46ea0b | Config-ID: 0fa873a ] + -- [hunter] [ Hunter-ID: 1eae623 | Toolchain-ID: d46ea0b | Config-ID: e9da39c ] .. seealso:: * `Example `_ + * :ref:`HUNTER_BUILD_SHARED_LIBS ` + * :ref:`HUNTER_CONFIGURATION_TYPES ` .. _HunterGate options: https://github.com/hunter-packages/gate#usage-custom-config diff --git a/docs/overview/customization/hunter-id.rst b/docs/overview/customization/hunter-id.rst index 008f4223a..ef7676473 100644 --- a/docs/overview/customization/hunter-id.rst +++ b/docs/overview/customization/hunter-id.rst @@ -50,10 +50,10 @@ of Hunter archive. This level defines list of available packages and mapping Message in logs: -:: +.. code-block:: none - -- [hunter] [ Hunter-ID: 1eae623 | Config-ID: ... | Toolchain-ID: ... ] - -- [hunter] [ Hunter-ID: e07a124 | Config-ID: ... | Toolchain-ID: ... ] + -- [hunter] [ Hunter-ID: 1eae623 | Toolchain-ID: ... | Config-ID: ... ] + -- [hunter] [ Hunter-ID: e07a124 | Toolchain-ID: ... | Config-ID: ... ] .. admonition:: Hunter diff --git a/docs/overview/customization/toolchain-id.rst b/docs/overview/customization/toolchain-id.rst index 942f58bc1..8180dc1b9 100644 --- a/docs/overview/customization/toolchain-id.rst +++ b/docs/overview/customization/toolchain-id.rst @@ -8,60 +8,62 @@ Toolchain-ID ------------ -Third level of customization. Compiler and flags. +Second level of customization. Compiler and flags. Each build can be run with different toolchains. In general the result is -completely different root ``lib``/``include`` directories. For example on +a completely different root directory (containing (``lib``/``include``). For example on Windows you can simultaneously build Visual Studio (32/64), NMake, Cygwin and MinGW projects, on Linux GCC/Clang, on Mac Xcode, Makefile, iOS. Or choose various clang tools like static analyzer/sanitizers and other platforms like -Android/Raspberry Pi. Each toolchain file will be forwarded to external project -so if you create toolchain with compiler ``g++`` and flag ``-std=c++11`` all +Android/Raspberry Pi. Each toolchain file will be forwarded to external project. +This means, if you create a toolchain with compiler ``g++`` and flag ``-std=c++11`` all dependent projects will be built by ``g++ -std=c++11``. Information about -toolchain has some internal representation (``toolchain.info``) and user can -see first 7 digits (ID) of ``SHA1`` hash of this file. +toolchain has some internal representation (``toolchain.info``). As identifier +(ID) the first 7 digits of the ``SHA1`` hash of this file are used. -Toolchain file is the only way to apply global settings for 3rd party projects -in Hunter. Only CMAKE_TOOLCHAIN_FILE will be forwarded for all packages, +**The toolchain file is the only way to apply global settings for 3rd party +projects in Hunter.** + +Only CMAKE_TOOLCHAIN_FILE will be forwarded for all packages, neither standard CMAKE_CXX_COMPILER/CMAKE_CXX_FLAGS nor custom variables like ANDROID_FOO=boo will be applied globally. First reason is the simplicity of forwarding logic, second reason is about distinguishing local and global -settings. E.g. if user want to set ``-Wall`` only for local project he can use -CMAKE_CXX_FLAGS. If user want to set ``-Wall`` globally then he can use +settings. E.g. if a user wants to set ``-Wall`` only for the local project he can use +CMAKE_CXX_FLAGS. If user wants to set ``-Wall`` globally then he can use CMAKE_TOOLCHAIN_FILE. -+-------------------+-------------------+ -| Hunter-ID 1eae623 | Config-ID 0fa873a | -+-------------------+-------------------+ ++-------------------+ +| Hunter-ID 1eae623 | ++-------------------+ +--------------+--------------------------------------------------------------------------+ | Toolchain-ID | | +==============+===================+======================================================+ -| ``d46ea0b`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/0fa873a/d46ea0b/...`` | +| ``d46ea0b`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/d46ea0b/...`` | | +-------------------+-------------------------------+----------------------+ | | | Compiler | Flags | | +-------------------+-------------------------------+----------------------+ | | | ``gcc`` | | +--------------+-------------------+-------------------------------+----------------------+ -| ``c018e63`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/0fa873a/c018e63/...`` | +| ``c018e63`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/c018e63/...`` | | +-------------------+-------------------------------+----------------------+ | | | Compiler | Flags | | +-------------------+-------------------------------+----------------------+ | | | ``clang`` | | +--------------+-------------------+-------------------------------+----------------------+ -| ``c39da39`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/0fa873a/c39da39/...`` | +| ``c39da39`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/c39da39/...`` | | +-------------------+-------------------------------+----------------------+ | | | Compiler | Flags | | +-------------------+-------------------------------+----------------------+ | | | ``clang`` | ``-std=c++11`` | +--------------+-------------------+-------------------------------+----------------------+ -| ``7450099`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/0fa873a/7450099/...`` | +| ``7450099`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/7450099/...`` | | +-------------------+-------------------------------+----------------------+ | | | Compiler | Flags | | +-------------------+-------------------------------+----------------------+ | | | ``arm-linux-androideabi-g++`` | ``-march=armv7-a`` | +--------------+-------------------+-------------------------------+----------------------+ -| ``2d935ea`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/0fa873a/2d935ea/...`` | +| ``2d935ea`` | Working directory | ``${HUNTER_ROOT}/_Base/1eae623/2d935ea/...`` | | +-------------------+-------------------------------+----------------------+ | | | Compiler | Flags | | +-------------------+-------------------------------+----------------------+ @@ -74,9 +76,9 @@ Message in logs: .. code-block:: none - -- [hunter] [ Hunter-ID: 1eae623 | Config-ID: 0fa873a | Toolchain-ID: d46ea0b ] - -- [hunter] [ Hunter-ID: 1eae623 | Config-ID: 0fa873a | Toolchain-ID: c018e63 ] - -- [hunter] [ Hunter-ID: 1eae623 | Config-ID: 0fa873a | Toolchain-ID: c39da39 ] + -- [hunter] [ Hunter-ID: 1eae623 | Toolchain-ID: d46ea0b | Config-ID: ... ] + -- [hunter] [ Hunter-ID: 1eae623 | Toolchain-ID: c018e63 | Config-ID: ... ] + -- [hunter] [ Hunter-ID: 1eae623 | Toolchain-ID: c39da39 | Config-ID: ... ] .. admonition:: Examples on GitHub @@ -89,3 +91,28 @@ Message in logs: .. admonition:: Polly * `Collection of toolchains `__ + +.. _simple toolchains: + +Simple toolchains +================= + +Building with ``-fPIC``: + +.. code-block:: cmake + + # toolchain.cmake + set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) + +Building with ``-std=c++11``: + +.. code-block:: cmake + + # toolchain.cmake + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED YES) + +.. admonition:: CGold + + * `C++11 toolchain `__ + * `Set default toolchain `__ diff --git a/docs/overview/dry.rst b/docs/overview/dry.rst index a49f15e0f..66fd8bdcd 100644 --- a/docs/overview/dry.rst +++ b/docs/overview/dry.rst @@ -4,17 +4,17 @@ Don't Repeat Yourself --------------------- -If you already familiar with `ExternalProject_Add`_ and have wrote some -super-build projects before you probably already aware that writing complete +If you are already familiar with `ExternalProject_Add`_ and have written some +super-build projects before, you are probably already aware that writing a complete solution with toolchains, build types, build options, parallel jobs, -forwarding of compiler flags and making it works correctly for all generators +forwarding of compiler flags, and making it work correctly for all generators is not a trivial task. -Hunter store `ExternalProject_Add`_ recipes as a set of templates. Once -written formula (`build scheme`_) can be reused by other projects without -copying of collection of super-build files (`DRY principle`_). -When new package with new scheme introduced all you need to do is just update -``SHA1``/``URL`` of ``HunterGate`` command. +Hunter stores `ExternalProject_Add`_ recipes as a set of templates. Once +written, formula (`build scheme`_) can be reused by other projects without +copying the collection of super-build files (`DRY principle`_). +When a new package with a new scheme is introduced, all you need to do is just update +the ``SHA1``/``URL`` of ``HunterGate`` command. .. admonition:: Stackoverflow diff --git a/docs/overview/everywhere.rst b/docs/overview/everywhere.rst index 96aa8e13f..062d1ce71 100644 --- a/docs/overview/everywhere.rst +++ b/docs/overview/everywhere.rst @@ -6,3 +6,7 @@ Works everywhere! Hunter works everywhere: CMake-GUI, Qt Creator, Visual Studio, Xcode, Cygwin, MinGW, Jenkins, Travis etc. + +.. seealso:: + + * :doc:`F.A.Q.: How to use Hunter in Android Studio? ` diff --git a/docs/overview/shareable.rst b/docs/overview/shareable.rst index 3113d076b..e5ca1085a 100644 --- a/docs/overview/shareable.rst +++ b/docs/overview/shareable.rst @@ -4,16 +4,16 @@ Shareable --------- -Root directory with installed packages can be shared between several local -projects. In case if one local project trigger installing of some new third -party package then root directory will be locked for modifications until install -finished or interrupted. Other local project that will try to run -``hunter_add_package`` in same root will be automatically paused and spin -waiting for unlock. Note that different root directories do different locks, -e.g. triggering build of ``OpenSSL`` for ``iOS`` will not pause building of -``GTest`` for ``Android``. Internally this is done by ``file(LOCK ...)`` CMake +A root directory with installed packages can be shared between several local +projects. If one local project triggers installation of a new third +party package, then the root directory will be locked against modifications until the install +has either finished or interrupted (i.e. Ctrl-C). Other local projects that try to run +``hunter_add_package`` for the same root at the same time will automatically wait for the root +to be unlocked. Note that different root directories have independent locks, +e.g. triggering a build of ``OpenSSL`` for ``iOS`` will not delay building of +``GTest`` for ``Android``. Internally this is done using the ``file(LOCK ...)`` CMake command (available since ``3.2``). -Same synchronization done for the initializing Hunter by ``HunterGate`` command. -This is very handy feature for the CI systems with environment which is shared +Similar synchronization is done when initializing Hunter using the ``HunterGate`` command. +This is a very handy feature for CI systems where an environment is shared between several jobs, e.g. Jenkins. diff --git a/docs/overview/what-is-it.rst b/docs/overview/what-is-it.rst index 84c77c4ee..2ef01d2a1 100644 --- a/docs/overview/what-is-it.rst +++ b/docs/overview/what-is-it.rst @@ -5,9 +5,9 @@ What is it? ----------- Every Hunter `release`_ (`Atom feed`_) archive is a meta-package with build -instructions and URLs of real packages. Archive will be downloaded and -unpacked automatically by ``HunterGate`` CMake module. You only need to set -``URL`` and ``SHA1``: +instructions and URLs of real packages. The archive will be downloaded and +unpacked automatically by the ``HunterGate`` CMake module. You only need to set +the ``URL`` and ``SHA1``: .. code-block:: cmake :emphasize-lines: 2-3 @@ -17,7 +17,7 @@ unpacked automatically by ``HunterGate`` CMake module. You only need to set SHA1 "f2c3de6d13baf8c5d2aa77bdc47c516e668c677e" ) -Here is content of the archive in simplified form: +Here is the content of the archive in simplified form: .. code-block:: none @@ -29,7 +29,7 @@ Here is content of the archive in simplified form: ... } -If you download and unpack it you can view some internals. Let's see OpenSSL +If you download and unpack it, you can view some internals. Let's look at the OpenSSL package properties: .. literalinclude:: what-is-it.sh @@ -37,7 +37,7 @@ package properties: :start-after: # doc: download-start :end-before: # doc: download-end -`hunter.cmake`_ holds list of available versions: +`hunter.cmake`_ holds the list of available versions: .. literalinclude:: what-is-it.sh :language: shell @@ -83,7 +83,12 @@ Default version from `default.cmake`_ .. code-block:: cmake - hunter_config(OpenSSL VERSION 1.0.2g) + hunter_default_version(OpenSSL VERSION 1.0.2g) + +.. seealso:: + + * :doc:`Detailed sources layout ` + * :doc:`Creating version on the fly from Git submodule ` .. _release: https://github.com/ruslo/hunter/releases .. _Atom feed: https://github.com/ruslo/hunter/releases.atom diff --git a/docs/packages.rst b/docs/packages.rst index 9e6854e50..be75f4d78 100644 --- a/docs/packages.rst +++ b/docs/packages.rst @@ -4,11 +4,50 @@ Packages -------- -List of packages and usage instructions for each package can be found in `wiki sidebar`_. +List of packages and usage instructions for each package. + +.. sidebar:: All packages + + * :doc:`Alphabetically ` + * :ref:`Index ` + +.. toctree:: + :hidden: + + /packages/all .. toctree:: :maxdepth: 1 - /packages/all-packages.rst + /packages/cmake_modules + /packages/concurrency + /packages/containers + /packages/commandline + /packages/compiler + /packages/computer-vision + /packages/compression + /packages/crypto + /packages/database + /packages/datetime + /packages/graphics + /packages/testing + /packages/logging + /packages/frameworks + /packages/filesystem + /packages/machine-learning + /packages/messaging + /packages/math + /packages/media + /packages/networking + /packages/random + /packages/regex + /packages/robotics + /packages/scripting + /packages/serialize + /packages/terminal + /packages/os + +.. note:: -.. _wiki sidebar: https://github.com/ruslo/hunter/wiki + * Don't see packages you need? Feel free to leave a package + `request `__. diff --git a/docs/packages/all-packages.rst b/docs/packages/all-packages.rst deleted file mode 100644 index f9a25b309..000000000 --- a/docs/packages/all-packages.rst +++ /dev/null @@ -1,5 +0,0 @@ -.. Copyright (c) 2016, Ruslan Baratov -.. All rights reserved. - -All packages ------------- diff --git a/docs/quick-start/boost-components.rst b/docs/quick-start/boost-components.rst index 3fd93cc2b..a9d867785 100644 --- a/docs/quick-start/boost-components.rst +++ b/docs/quick-start/boost-components.rst @@ -17,10 +17,15 @@ Set minimum CMake version: .. code-block:: cmake - cmake_minimum_required(VERSION 3.0) + cmake_minimum_required(VERSION 3.2) Copy `HunterGate`_ module to your project and include it: +.. code-block:: none + + > mkdir cmake + > wget https://raw.githubusercontent.com/hunter-packages/gate/master/cmake/HunterGate.cmake -O cmake/HunterGate.cmake + .. code-block:: cmake include("cmake/HunterGate.cmake") @@ -33,8 +38,8 @@ this repository** in general, see `notes`_): :emphasize-lines: 2, 3 HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.10.9.tar.gz" - SHA1 "53b198e364dc7bc8360fc545f798563229bd7e20" + URL "https://github.com/ruslo/hunter/archive/v0.16.15.tar.gz" + SHA1 "6974c2150fc0d3b09de3ad1efcbf15d360647ffa" ) Now project can be started: @@ -49,7 +54,7 @@ Let's download and install ``boost.{regex,system,filesystem}``: hunter_add_package(Boost COMPONENTS regex system filesystem) -Hunter part is done, now well known CMake-style kung fu (see `pkg.boost`_): +Hunter part is done, now well known CMake-style kung fu (see :ref:`pkg.Boost`): .. code-block:: cmake @@ -63,7 +68,7 @@ Summarize: .. code-block:: cmake :emphasize-lines: 5-6, 11 - cmake_minimum_required(VERSION 3.0) + cmake_minimum_required(VERSION 3.2) include("cmake/HunterGate.cmake") HunterGate( @@ -90,4 +95,3 @@ Build it: .. _other options: https://github.com/hunter-packages/gate#effects .. _HunterGate: https://github.com/hunter-packages/gate .. _notes: https://github.com/hunter-packages/gate#notes -.. _pkg.boost: https://github.com/ruslo/hunter/wiki/pkg.boost diff --git a/docs/quick-start/cmake.rst b/docs/quick-start/cmake.rst index 92d76cd04..fbf5aa433 100644 --- a/docs/quick-start/cmake.rst +++ b/docs/quick-start/cmake.rst @@ -4,52 +4,59 @@ Notes about version of CMake ---------------------------- -* `3.0.0`_ **Minimum required** +* `3.2.0`_ **Minimum required** - * **Buggy**, see `PR #198`_ - * Interface header-only libraries - * Sub-option ``VERSION`` for command ``project`` - * New MSVC generator names + * New ``continue`` command + * New synchronization command ``file(LOCK ...)`` -* `3.1.0`_ +* `3.4.1`_ - * **Buggy**, see `issue #105`_ - * Retry download on hash mismatch (`change `__) - * New `CMP0054`_ (best CMake policy!) See `this SO question`_ + * **Buggy**, see `issue #405 `__ -* `3.2.0`_ +* `3.5.0`_ **Minimum for iOS projects** - * New synchronization command ``file(LOCK ...)`` (`change `__) - * `HUNTER_SKIP_LOCK`_ + * New variable `CMAKE_IOS_INSTALL_COMBINED `__ + * `iOS toolchains `__ -* `3.4.1`_ +* `3.7.0`_ - * **Buggy**, see `issue #405`_ + * Minimum version for packages with + :doc:`protected sources ` + * ``USERPWD`` sub-option for ``file(DOWNLOAD|UPLOAD ...)`` + * ``HTTP_{USERNAME|PASSWORD}`` sub-options for ``ExternalProject_Add`` + * List of URLs can be passed to ``ExternalProject_Add``. + Used by :ref:`hunter download server`. -* `3.5.0`_ **Minimum for iOS projects** +* `3.7.1`_ **Minimum for Android projects** + + * CMake now supports Cross Compiling for Android with simple toolchain files + * `Polly Android toolchains `__ - * New variable `CMAKE_IOS_INSTALL_COMBINED`_ (`change `__) - * `iOS toolchains`_ +* `3.9.2`_ **Minimum for Android NDK r16+** .. tip:: - * `CMake change log `__ + * `CMake milestones `__ (`old version `__) -.. _3.0.0: https://www.cmake.org/cmake/help/v3.0/release/3.0.0.html#commands -.. _3.1.0: https://www.cmake.org/cmake/help/v3.1/release/3.1.0.html#syntax -.. _3.2.0: https://www.cmake.org/cmake/help/v3.2/release/3.2.html#commands -.. _3.4.1: https://www.cmake.org/cmake/help/v3.4/release/3.4.html -.. _3.5.0: https://www.cmake.org/cmake/help/v3.5/release/3.5.html#platforms +.. note:: + + If you're building CMake from sources please make sure that + :doc:`HTTPS support is enabled in CURL `. -.. _CMP0054: http://www.cmake.org/cmake/help/v3.1/policy/CMP0054.html +.. note:: -.. _PR #198: https://github.com/ruslo/hunter/pull/198#issuecomment-120630877 -.. _issue #105: https://github.com/ruslo/hunter/issues/105 -.. _issue #405: https://github.com/ruslo/hunter/issues/405 + In theory CMake 3.0 can be used with Hunter versions before v0.22 but in + practice you have to work with v0.14.3 because ``continue`` added to + v0.14.4 code. -.. _this SO question: http://stackoverflow.com/questions/19982340 +.. note:: -.. _HUNTER_SKIP_LOCK: https://github.com/ruslo/hunter/wiki/error.can.not.lock -.. _CMAKE_IOS_INSTALL_COMBINED: https://cmake.org/cmake/help/v3.5/variable/CMAKE_IOS_INSTALL_COMBINED.html + Latest Hunter release with support of old Android toolchains + (before CMake 3.7.1) is v0.16.36 -.. _iOS toolchains: https://github.com/ruslo/polly/wiki/Toolchain-list#ios +.. _3.2.0: https://www.cmake.org/cmake/help/v3.2/release/3.2.html#commands +.. _3.4.1: https://www.cmake.org/cmake/help/v3.4/release/3.4.html +.. _3.5.0: https://www.cmake.org/cmake/help/v3.5/release/3.5.html#platforms +.. _3.7.0: https://cmake.org/cmake/help/latest/release/3.7.html#commands +.. _3.7.1: https://cmake.org/cmake/help/latest/release/3.7.html#platforms +.. _3.9.2: https://gitlab.kitware.com/cmake/cmake/issues/17253 diff --git a/docs/reference.rst b/docs/reference.rst index d83ffedee..95710a66c 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -13,3 +13,5 @@ Reference /reference/user-modules /reference/internal-variables /reference/internal-modules + /reference/layouts + /reference/release-notes diff --git a/docs/reference/errors.rst b/docs/reference/errors.rst index 5f42e148a..d833f9099 100644 --- a/docs/reference/errors.rst +++ b/docs/reference/errors.rst @@ -3,3 +3,9 @@ Errors ------ + +.. toctree:: + :glob: + :maxdepth: 1 + + /reference/errors/* diff --git a/docs/reference/internal-modules.rst b/docs/reference/internal-modules.rst index 803f13999..4aca5ef96 100644 --- a/docs/reference/internal-modules.rst +++ b/docs/reference/internal-modules.rst @@ -3,3 +3,9 @@ Internal modules ---------------- + +.. toctree:: + :maxdepth: 1 + :glob: + + /reference/internal-modules/* diff --git a/docs/reference/internal-variables/hunter_package_scheme.rst b/docs/reference/internal-variables/hunter_package_scheme.rst index 9dfac75dd..2966d3fb1 100644 --- a/docs/reference/internal-variables/hunter_package_scheme.rst +++ b/docs/reference/internal-variables/hunter_package_scheme.rst @@ -12,17 +12,18 @@ HUNTER_PACKAGE_SCHEME_ Type of the currently used scheme. Only one type should be set to ``1``, other types should have empty values. Next table describe the difference between them: -+--------------------------------------+-------------------------+-------------------+----------+------------+ -| | name | _ROOT | EP? [1]_ | cache [2]_ | -+======================================+=========================+===================+==========+============+ -| HUNTER_PACKAGE_SCHEME_DOWNLOAD | url_sha1_download | source directory | no | yes | -+--------------------------------------+-------------------------+-------------------+----------+------------+ -| HUNTER_PACKAGE_SCHEME_UNPACK | url_sha1_unpack | source directory | yes | yes | -+--------------------------------------+-------------------------+-------------------+----------+------------+ -| HUNTER_PACKAGE_SCHEME_UNPACK_INSTALL | url_sha1_unpack_install | install directory | yes | yes | -+--------------------------------------+-------------------------+-------------------+----------+------------+ -| HUNTER_PACKAGE_SCHEME_INSTALL | *other* | install directory | yes | no | -+--------------------------------------+-------------------------+-------------------+----------+------------+ ++------------------------------------------+-----------------------------+-------------------+----------+------------+ +| | name | _ROOT | EP? [1]_ | cache [2]_ | ++==========================================+=============================+===================+==========+============+ +| HUNTER_PACKAGE_SCHEME_DOWNLOAD | url_sha1_download | source directory | no | yes | ++------------------------------------------+-----------------------------+-------------------+----------+------------+ +| HUNTER_PACKAGE_SCHEME_UNPACK | url_sha1_unpack | source directory | yes | yes | ++------------------------------------------+-----------------------------+-------------------+----------+------------+ +| HUNTER_PACKAGE_SCHEME_UNPACK_INSTALL | url_sha1_unpack_install or | install directory | yes | yes | +| | url_sha1_unpack_bin_install | | | | ++------------------------------------------+-----------------------------+-------------------+----------+------------+ +| HUNTER_PACKAGE_SCHEME_INSTALL | *other* | install directory | yes | no | ++------------------------------------------+-----------------------------+-------------------+----------+------------+ .. [1] Does scheme use ExternalProject_Add? (information used while doing look up for stamps) .. [2] Is package cacheable by default? Yes - always cacheable, No - depends on the package (see ``hunter_cacheable``) diff --git a/docs/reference/terminology/hunterize.rst b/docs/reference/terminology/hunterize.rst index 760a7c57b..244cfced6 100644 --- a/docs/reference/terminology/hunterize.rst +++ b/docs/reference/terminology/hunterize.rst @@ -11,4 +11,4 @@ of default one. .. seealso:: - * :doc:`New package: CMake with dependencies ` + * :doc:`New package: CMake with dependencies ` diff --git a/docs/reference/user-modules.rst b/docs/reference/user-modules.rst index c8bdb9e83..b89f0a97f 100644 --- a/docs/reference/user-modules.rst +++ b/docs/reference/user-modules.rst @@ -3,3 +3,9 @@ User modules ------------ + +.. toctree:: + :maxdepth: 1 + :glob: + + /reference/user-modules/* diff --git a/docs/reference/user-variables.rst b/docs/reference/user-variables.rst index 36cf4d0b9..ea22314b4 100644 --- a/docs/reference/user-variables.rst +++ b/docs/reference/user-variables.rst @@ -4,4 +4,459 @@ User variables -------------- -* List of global control `variables `_ +CMake +~~~~~ + +.. note:: + + All Hunter options should be set **to cache** and + **before HunterGate** so user will be able to set + `his own values `__. + Also if package will be used as a third party project managed by Hunter, then + Hunter should be able to forward all values from by parent to child projects. + So **do not** set this variables with ``FORCE`` or as ``INTERNAL``, and don't + set them as a regular variables: + + .. code-block:: cmake + + set(HUNTER_ENABLED ON) # BAD! + + .. code-block:: cmake + + set(HUNTER_STATUS_PRINT OFF CACHE BOOL "..." FORCE) # BAD! + + .. code-block:: cmake + + set(HUNTER_STATUS_DEBUG ON CACHE INTERNAL "...") # BAD! + + .. code-block:: cmake + + option(HUNTER_STATUS_DEBUG "Print a lot of info" ON) # Good + + # Good + set( + HUNTER_CACHE_SERVERS + "https://github.com/elucideye/hunter-cache" + CACHE + STRING + "Hunter cache servers" + ) + + # Good + set(HUNTER_JOBS_NUMBER 6 CACHE STRING "Hunter jobs number") + + # All user options before HunterGate + HunterGate(URL "..." SHA1 "...") + +HUNTER_ENABLED +============== + +Turn on/off Hunter package manager. If this variable is ``OFF`` ``HunterGate`` +module will do nothing, ``hunter_add_package`` command will have no effects. You +can add this variable as ``option`` while experimenting to keep backward +compatibility with old package manager: + +.. code-block:: cmake + + option(HUNTER_ENABLED "Enable Hunter package manager" OFF) + HunterGate(...) # ignored + if(WITH_FOO) + hunter_add_package(Foo) # ignored + find_package(Foo) # found in standard location + endif() + +* Default: ``ON`` + +.. _hunter root: + +HUNTER_ROOT +=========== + +* Path to Hunter root directory. Set this variable if you don't want to install + Hunter packages to default location +* You can set :ref:`environment variable ` + with the same name to avoid specifying it for every project +* See `HunterGate `__ + +.. warning:: + + If you manually cloned Hunter repository for development purposes the values + of ``URL`` and ``SHA1`` of ``HunterGate`` will be ignored, see + `notes `__ and + `testing `__ hints. + +HUNTER_STATUS_PRINT +=================== + +* Print current build status +* Default: ``ON`` + +.. _hunter_status_debug: + +HUNTER_STATUS_DEBUG +=================== + +* Print a lot of info +* Set this variable to ``ON`` before submitting bugs +* Default: ``OFF`` + +HUNTER_PACKAGE_LOG_BUILD +======================== + +* Apply ``LOG_BUILD 1`` + (see `ExternalProject `__) + +HUNTER_PACKAGE_LOG_INSTALL +========================== + +* Apply ``LOG_INSTALL 1`` + (see `ExternalProject `__) + +.. _hunter configuration types: + +HUNTER_CONFIGURATION_TYPES +========================== + +* Build type of the 3rd party packages +* See `example `__ +* Default: ``Release``, ``Debug`` + +.. _hunter build shared libs: + +HUNTER_BUILD_SHARED_LIBS +======================== + +* Value for + `BUILD_SHARED_LIBS `__ + for 3rd party packages + +.. _hunter jobs number: + +HUNTER_JOBS_NUMBER +================== + +* Number of parallel builds that will be used in such native tools like ``make -jN`` or ``xcodebuild -jobs N`` +* For Visual Studio >= 12 2013 flag ``/maxcpucount:N`` will be added to ``MSBuild`` +* Set variable to ``0`` to disable adding any flags: ``HUNTER_JOBS_NUMBER=0`` +* Defaults to maximum of two: + + * `NUMBER_OF_LOGICAL_CORES `__ + * `NUMBER_OF_PHYSICAL_CORES `__ + +.. _hunter run install: + +HUNTER_RUN_INSTALL +================== + +Set this variable to ``ON`` to run auto-install procedure if it's disabled by +:ref:`HUNTER_DISABLE_AUTOINSTALL ` environment variable. + +.. _hunter_run_upload: + +HUNTER_RUN_UPLOAD +================= + +Set this variable to ``YES`` to start +:doc:`uploading procedure `. + +* Default: ``NO`` + +.. note:: + + Upload will start only after any real build triggered by Hunter. + +.. _hunter_disable_builds: + +HUNTER_DISABLE_BUILDS +===================== + +* Set this variable to ``YES`` to disable building packages from sources. This + may be useful in case you want to check that package can be loaded fully from + local/server cache +* Default: ``NO`` + +.. _hunter_cache_servers: + +HUNTER_CACHE_SERVERS +==================== + +* Variable contains list of servers with cache binaries +* Variable should be modified before ``HunterGate`` command: + +.. code-block:: cmake + + set( + HUNTER_CACHE_SERVERS + "https://github.com/elucideye/hunter-cache" + CACHE + STRING + "Hunter cache servers" + ) + HunterGate(URL "..." SHA1 "...") + +Using two servers: + +.. code-block:: cmake + + set( + HUNTER_CACHE_SERVERS + "https://github.com/elucideye/hunter-cache;https://github.com/ingenue/hunter-cache" + CACHE + STRING + "Hunter cache servers" + ) + HunterGate(URL "..." SHA1 "...") + +* Default: https://github.com/ingenue/hunter-cache + +.. seealso:: + + * :doc:`Why binaries from server not used? ` + * :doc:`Using Nexus Repository ` + +.. _hunter_use_cache_servers: + +HUNTER_USE_CACHE_SERVERS +======================== + +* Policy to control downloading cache from server. Possible values: + + * **NO** - never download cache from server, use local cache or build from sources + * **ONLY** - never build from sources, use server/local cache + * **YES** - try to download from server, build from sources if not found + ++----------------------+--------------------------+ +| | HUNTER_USE_CACHE_SERVERS | ++ +--------+--------+--------+ +| | NO | ONLY | YES | ++======================+========+========+========+ +| Build from sources | yes | no | yes | ++----------------------+--------+--------+--------+ +| Download from server | no | yes | yes | ++----------------------+--------+--------+--------+ + +* Default is empty string. Effectively equivalent to **YES**. + +.. _hunter passwords path: + +HUNTER_PASSWORDS_PATH +===================== + +Path to :doc:`Hunter passwords file `. + +.. _hunter keep package sources: + +HUNTER_KEEP_PACKAGE_SOURCES +=========================== + +If this variable is set to ``YES`` then Hunter will keep package sources +after finishing installation. It may be useful for navigation in code while +using debug version of libraries. + +This is a workaround for +`issue #359 `__ +and have some usage peculiarities: + +* It does not work well with Hunter cache mechanism. If package binaries will + be found on server, then there will be no build stage triggered, hence there + will be no sources kept. Use + :ref:`HUNTER_USE_CACHE_SERVERS=NO ` + for always building packages on local machine from sources. +* Sources will be kept inside :doc:`Hunter-ID ` + directory. Hence even if all the packages will be using another + :doc:`Hunter-ID `, + the old :doc:`Hunter-ID ` directory + should not be removed. +* Some packages use in-source build (non-CMake packages) and keep all build + artifacts along with sources. Hunter will just keep directory and will not + track what files was the original sources/what is temporary files + for build. Combining with previous peculiarity it's expected that much + more disk space will be used than usually. +* If package is already installed before ``HUNTER_KEEP_PACKAGE_SOURCES`` set + to ``ON`` there will be no build triggered, hence there will be no sources + kept. To re-trigger the build you can add some dummy parameter to + ``CMAKE_ARGS``, for example: + + .. code-block:: cmake + + hunter_config(foo VERSION ${HUNTER_foo_VERSION} CMAKE_ARGS DUMMY=1) + +.. seealso:: + + * :ref:`hunter_config(... KEEP_PACKAGE_SOURCES) ` + +.. _hunter download server: + +HUNTER_DOWNLOAD_SERVER +====================== + +Define a list of servers to download from. + +We define the following packages for the examples: + +- Package 1 name: ``foo`` +- Package 1 SHA1: ``49dee30c5fedd8613a144f9bf6551fb46bb69e92`` +- Package 1 URL: ``https://foo.com/downloads/foo-1.0.tar.gz`` + +- Package 2 name: ``boo`` +- Package 2 SHA1: ``b1ec7331baf4c9996497851bfa2c847a73cd6085`` +- Package 2 URL: ``https://server-2.com/downloads/boo-3.0.tar.gz`` + +If ``HUNTER_DOWNLOAD_SERVER`` is empty nothing changes and the following URLs +are used to download the sources: + +- ``foo``: ``https://foo.com/downloads/foo-1.0.tar.gz`` +- ``boo``: ``https://server-2.com/downloads/boo-3.0.tar.gz`` + +If ``HUNTER_DOWNLOAD_SERVER`` is a list of servers like +``https://server-1.com;https://server-2.com;https://server-3.com`` +then the original package URL is analyzed. If the original URL matches one of the +defined servers we leave it untouched and set as a server with high priority. + +For package ``foo`` the following URLs are passed to ``ExternalProject_Add`` +(the original URL is not used): + +- ``https://server-1.com/foo/1.0/SHASUM/foo-1.0.tar.gz`` +- ``https://server-2.com/foo/1.0/SHASUM/foo-1.0.tar.gz`` +- ``https://server-3.com/foo/1.0/SHASUM/foo-1.0.tar.gz`` + +For package ``boo`` the following URLs are passed to ``ExternalProject_Add`` +(the original URL has the highest priority): + +- ``https://server-2.com/downloads/boo-3.0.tar.gz`` (take priority, original URL used) +- ``https://server-1.com/boo/3.0/SHASUM/boo-3.0.tar.gz`` +- ``https://server-3.com/boo/3.0/SHASUM/boo-3.0.tar.gz`` + +.. note:: + + Multiple URLs are supported only with CMake 3.7+. For earlier versions + the first listed URL is passed to ``ExternalProject_Add``. + +The retry logic is implemented in the CMake function ``ExternalProject_Add``. + +To create new URLs the following template is used: + + ``${HUNTER_DOWNLOAD_SERVER}/${PACKAGE_NAME}/${PACKAGE_VERSION}/${ARCHIVE_ID}/${filename}`` + +- The characters ``!@#$%^&*?`` occurring in ``${filename}`` are replaced with ``_``. +- ``${ARCHIVE_ID}`` is the first 7 characters of the package archive ``SHA1`` sum. + +.. note:: + + This is the same structure as Hunter uses for its own :ref:`Download ` directory. + +.. note:: + + ``HUNTER_DOWNLOAD_SERVER`` will be applied only to packages enabled with the standard + ``VERSION`` variant of :ref:`hunter_config` entries, which is the case for all default + Hunter package definitions. Custom package definitions introduced with a ``URL``/``SHA1`` + variant on :ref:`hunter_config` in a project's local configuration, such as those included through + ``FILEPATH`` or ``LOCAL`` arguments to ``HunterGate()``, will be unaffected by this variable. + The ``git`` variants of :ref:`hunter_config`, namely ``GIT_SUBMODULE`` and ``GIT_SELF``, have no + transformable URL and are also unaffected by ``HUNTER_DOWNLOAD_SERVER``. + +.. _hunter tls verify: + +HUNTER_TLS_VERIFY +================= + +Define if +`ExternalProject_Add `__ +and +`file(DOWNLOAD) `__ +should verify the server certificate for ``https://`` URLs. + +Default: ``ON`` + +.. warning:: + + Value ``OFF`` will disable certificate verification. It means that the only + protection is SHA1 hash of sources which is `weak `__. + And if you're using binary servers (it's + :ref:`default `) meta cache files like + ``cache.sha1`` will not be checked at all! + +.. _hunter git self ignore untracked: + +HUNTER_GIT_SELF_IGNORE_UNTRACKED +================================ + +Set this option to ``ON`` if you want to ignore untracked files while +using :doc:`GIT_SELF feature `. + +Default: ``OFF`` + +.. _hunter no toolchain id recalculation: + +HUNTER_NO_TOOLCHAIN_ID_RECALCULATION +==================================== + +If set to ``ON`` Hunter will skip calculation of ``Toolchain-ID`` if value is +already present in CMake cache. + +Default: ``OFF`` + +.. note:: + + Do not use this option while making a bug report. + +.. warning:: + + This option is for the **advanced** users only. Incorrect usage of this option + may lead to invalid unrecoverable cache state. Please read carefully + :ref:`this page ` before using this option. + +Environment +~~~~~~~~~~~ + +.. _env hunter root: + +HUNTER_ROOT +=========== + +* Same as CMake's :ref:`HUNTER_ROOT ` variable. + If both environment and CMake variables are set then CMake has a higher priority + +.. _env hunter binary dir: + +HUNTER_BINARY_DIR +================= + +* Use external directory ``HUNTER_BINARY_DIR`` for building external projects. + This variable can be used to fix + `"path too long" `__ error on windows + +.. _hunter disable install: + +HUNTER_DISABLE_AUTOINSTALL +========================== + +Set this environment variable to non-empty value (e.g. ``HUNTER_DISABLE_AUTOINSTALL=ON``) +to disable automatic initialization of Hunter root directory by ``HunterGate`` +module. This will give you more control in some advanced usage situations, see +`examples `__. +Set :ref:`HUNTER_RUN_INSTALL=ON ` CMake variable each time +you want to run auto-install procedure. Note that there is no need to set any +variables if Hunter root is already installed. + +.. _hunter passwords path env: + +HUNTER_PASSWORDS_PATH +===================== + +Environment variable with functionality similar to CMake variable with +:ref:`the same name `. + +.. _hunter git executable env: + +HUNTER_GIT_EXECUTABLE +===================== + +Path to Git executable + +.. _hunter jobs number env: + +HUNTER_JOBS_NUMBER +================== + +See :ref:`HUNTER_JOBS_NUMBER ` CMake variable diff --git a/docs/requirements.txt b/docs/requirements.txt index beca227ec..759f98dc7 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,4 @@ -Sphinx==1.4.5 -sphinx-rtd-theme==0.1.9 -sphinxcontrib-spelling==2.2.0 +Sphinx==1.6.3 +sphinx-rtd-theme==0.4.3 +sphinxcontrib-spelling==4.0.1 +docutils==0.14 diff --git a/docs/spelling.txt b/docs/spelling.txt index a5351603c..232082be4 100644 --- a/docs/spelling.txt +++ b/docs/spelling.txt @@ -1,25 +1,76 @@ +Android AppVeyor +Bonjour CGold CMake +CMakeLists CPack +Cap'n Config +Ctrl Cygwin GCC GTest +GitHub +Google Hunterize IDE IDEs +Installable Makefile NMake +OSX +Proto +RPC +SDK +Scalable +Shareable Stackoverflow Toolchain +Ubuntu Uninstall +Wget +Workflow Xcode +breakpoint cacheable +cancelled companioning +config configs +customizable +decrypt +decrypted +doesn +embeddable +geospatial hunterization +hunterize +hunterized iOS +injectable +internet +inversed +isn +login +macOS +middleware +multi +multiplatform +natively +performant +plugin +plugins +prebuilt +priori reconstructible +reproducibility +runtime +sanitizers +shareable +subdirectory +subfolder +submodules toolchain toolchains +untracked diff --git a/docs/user-guides/cmake-user.rst b/docs/user-guides/cmake-user.rst index 624a1b170..0f859325b 100644 --- a/docs/user-guides/cmake-user.rst +++ b/docs/user-guides/cmake-user.rst @@ -15,9 +15,18 @@ Such developers can do: * Add more targets to project * Add more sources to targets -* Add C++ flags that doesn't break compatibility (e.g. warnings/optimization) +* Add C++ flags that does not break compatibility (e.g. warnings/optimization) Such developers can't do: * Add more external dependencies to project * Adding flags that can break compatibility (e.g. ``-std=c++11`` or ``/MT``) + +See also: + +.. toctree:: + :maxdepth: 1 + + Provide credentials to access protected sources + Downloading private data + Using license files diff --git a/docs/user-guides/hunter-developer.rst b/docs/user-guides/hunter-developer.rst index e46e25074..3b96898a5 100644 --- a/docs/user-guides/hunter-developer.rst +++ b/docs/user-guides/hunter-developer.rst @@ -4,5 +4,13 @@ Hunter developer ---------------- -* reference to modules -* layout guide +.. toctree:: + :maxdepth: 1 + + /user-guides/hunter-developer/cmake-launch + /user-guides/hunter-developer/binary-formula + +.. seealso:: + + * :doc:`Layouts ` + * :doc:`Internal modules ` diff --git a/docs/user-guides/hunter-user.rst b/docs/user-guides/hunter-user.rst index 6859ea5f8..77e5a2377 100644 --- a/docs/user-guides/hunter-user.rst +++ b/docs/user-guides/hunter-user.rst @@ -1,9 +1,61 @@ -.. Copyright (c) 2016, Ruslan Baratov +.. Copyright (c) 2016-2017, Ruslan Baratov .. All rights reserved. Hunter user ----------- +.. toctree:: + :maxdepth: 1 + + /user-guides/hunter-user/git-submodule + /user-guides/hunter-user/git-self + +.. _uploading binaries: + +Uploading binaries +================== + +It's possible to upload local ``Cache`` directory with binaries to server +for future reuse. + +Variables and modules related to uploading: + +* List of servers that will be used for **downloading binaries** can be set in + :ref:`HUNTER_CACHE_SERVERS ` variable + +* If you want to check that there is no third party **builds triggered** by + CMake and all packages downloaded from server you can use + :ref:`HUNTER_DISABLE_BUILDS ` variable + +* Variable :ref:`HUNTER_USE_CACHE_SERVERS ` can be + used to specify **downloading policy** + +* **Uploading parameters** can be set using + :ref:`hunter_upload_password ` module in + :doc:`Hunter passwords file ` + +* Use :ref:`HUNTER_RUN_UPLOAD=YES ` option to **start + upload** procedure + +.. warning:: + + **All entries** from ``Cache`` directory will be uploaded, not only cache for + the current build. Take this information into account while doing upload! + +.. toctree:: + :maxdepth: 1 + + /user-guides/hunter-user/github-cache-server + /user-guides/hunter-user/nexus-cache-server + /user-guides/hunter-user/artifactory-cache-server + +.. seealso:: + + * :doc:`F.A.Q.: Why binaries from server not used? ` + +TODO +==== + * add more find_packages * add toolchain-id flags * add hunter_add_package diff --git a/docs/user-guides/images/cmake-hunter-environment.png b/docs/user-guides/images/cmake-hunter-environment.png index 044799f0f55ebc3b3c8640fff332023e655d3f36..bf3d81cb4c9827332799ef9d53ae7a0cbead7c41 100644 GIT binary patch literal 133160 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ŭs}{K&-w5DW-|g%s5g!9 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 z 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%0D6P>3=D~+?NA<=>Rz`UvP(!6CPzS*2f0e+Wmr*U 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 ZunGK*Ka|Q&ZiW0xMd2Fe#nqdS{tu&|E*Jm+ diff --git a/docs/user-guides/regular.rst b/docs/user-guides/regular.rst index 08bd3ad18..8b3a055fd 100644 --- a/docs/user-guides/regular.rst +++ b/docs/user-guides/regular.rst @@ -5,7 +5,7 @@ Regular user ------------ How does Hunter affect end users which do usually run ``*.msi`` or ``*.dmg`` -installers? The answer - it doesn't at all. Hunter in fact do quite the same +installers? The answer - it does not at all. Hunter in fact do quite the same stuff that developer do with packages: download, build, install, reuse in other projects. There will be no new functionality introduced by package - it will be installed in the same way as system package manager or custom build script do. diff --git a/docs/user-guides/yed/cmake-hunter-environment.graphml b/docs/user-guides/yed/cmake-hunter-environment.graphml index 90d4545be..bbbd04f73 100644 --- a/docs/user-guides/yed/cmake-hunter-environment.graphml +++ b/docs/user-guides/yed/cmake-hunter-environment.graphml @@ -1,6 +1,6 @@ - + @@ -17,7 +17,7 @@ - + @@ -38,10 +38,10 @@ - + - CMake sources + CMake sources @@ -58,10 +58,10 @@ - + - C++ sources + C++ sources @@ -78,10 +78,10 @@ - + - Native tools + Native tools @@ -100,7 +100,7 @@ - generate + Generate @@ -119,7 +119,7 @@ - build + Build @@ -136,10 +136,10 @@ - + - Binaries + Binaries @@ -155,7 +155,7 @@ - + @@ -175,7 +175,7 @@ - + @@ -196,12 +196,15 @@ - + - Generate native tools + Generate native tools from CMake code: -cmake -H. -B_builds + +cmake \ + -H. \ + -B_builds @@ -217,7 +220,7 @@ cmake -H. -B_builds - test + Test @@ -236,7 +239,7 @@ cmake -H. -B_builds - install + Install @@ -255,7 +258,7 @@ cmake -H. -B_builds - pack binaries + Pack binaries @@ -272,10 +275,10 @@ cmake -H. -B_builds - + - Installers + Installers @@ -292,11 +295,15 @@ cmake -H. -B_builds - + - Run native build: -cmake --build _builds + Run native +build: + +cmake \ + --build \ + _builds @@ -310,10 +317,10 @@ cmake --build _builds - + - Use CTest to run tests + Use CTest to run tests @@ -327,11 +334,12 @@ cmake --build _builds - + - Install targets by CMake: -cmake --build _builds --target install + cmake \ + --build _builds \ + --target install @@ -345,12 +353,13 @@ cmake --build _builds --target install - + - Hunter will set variables -appropriately so CMake can -find installed libraries + Hunter will set +variables appropriately +so CMake can find +installed libraries @@ -364,11 +373,18 @@ find installed libraries - + - CPack can create user-friendly installers: -.msi, .exe, .dmg, .sh, .tar.gz, ... + CPack can create +user-friendly installers: + + .msi + .exe + .dmg + .sh + .tar.gz + ... @@ -379,13 +395,12 @@ find installed libraries - - - - + + + - hunter_add_package + Generate @@ -401,10 +416,10 @@ find installed libraries - + - generate + Build @@ -420,10 +435,10 @@ find installed libraries - + - build + Install @@ -439,10 +454,10 @@ find installed libraries - + - install + Unpack sources @@ -458,10 +473,10 @@ find installed libraries - + - unpack sources + Download @@ -475,12 +490,14 @@ find installed libraries + - - - + + + - download + Third party +libraries @@ -497,10 +514,11 @@ find installed libraries - + - Third party libraries + Third party +libraries @@ -516,39 +534,38 @@ find installed libraries - - - - - Third party libraries + + + + + Hunter will run full chain of +installation procedure - - - - + - - - - - - Hunter will run full chain of -installation procedure + + + + + hunter_add_package - + + + + @@ -557,7 +574,7 @@ installation procedure - + @@ -575,7 +592,7 @@ installation procedure - + @@ -593,7 +610,7 @@ installation procedure - + @@ -611,7 +628,7 @@ installation procedure - + @@ -629,7 +646,7 @@ installation procedure - + @@ -647,7 +664,7 @@ installation procedure - + @@ -665,7 +682,7 @@ installation procedure - + @@ -683,7 +700,7 @@ installation procedure - + @@ -695,13 +712,13 @@ installation procedure - + - + @@ -755,7 +772,7 @@ installation procedure - + @@ -773,7 +790,7 @@ installation procedure - + @@ -791,7 +808,7 @@ installation procedure - + @@ -806,10 +823,10 @@ installation procedure - + - + @@ -827,7 +844,7 @@ installation procedure - + @@ -839,13 +856,13 @@ installation procedure - + - + @@ -867,16 +884,15 @@ installation procedure - - + - + - + @@ -888,14 +904,13 @@ installation procedure - - + - + @@ -907,17 +922,16 @@ installation procedure - - + - - + + - + @@ -929,14 +943,13 @@ installation procedure - - + - + @@ -948,14 +961,13 @@ installation procedure - - + - + @@ -967,14 +979,13 @@ installation procedure - - + - + @@ -986,14 +997,13 @@ installation procedure - - + - + @@ -1005,14 +1015,13 @@ installation procedure - - + - + @@ -1024,14 +1033,13 @@ installation procedure - - + - + diff --git a/donate.md b/donate.md deleted file mode 100644 index b75918b3c..000000000 --- a/donate.md +++ /dev/null @@ -1,19 +0,0 @@ -Donations -========= - -If you like this project and it's goals consider supporting it by making a donation. - -[![Donate][2]][1] - -[![Gratipay](https://img.shields.io/gratipay/Hunter.svg?style=social&label=donate)](https://www.gratipay.com/Hunter/) - -Sberbank of Russia: -* 5469 3800 3946 0992 (USD) -* 5469 3800 2768 7895 (RUB) - -Also https://www.bountysource.com/ can be used to open a bounty for the exact problem. For such issues badge [bounty](https://github.com/ruslo/hunter/issues?q=is%3Aopen+is%3Aissue+label%3Abounty) will be added automatically. - -Thanks! :) - -[1]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UN8PDZZ3Q7VVL -[2]: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif diff --git a/examples/Android-SDK-Platform/CMakeLists.txt b/examples/Android-SDK-Platform/CMakeLists.txt index 610866870..b5cd168e8 100644 --- a/examples/Android-SDK-Platform/CMakeLists.txt +++ b/examples/Android-SDK-Platform/CMakeLists.txt @@ -11,7 +11,7 @@ project(Foo) # -- Emulate toolchain set(ANDROID TRUE) -set(ANDROID_NATIVE_API_LEVEL 21) +set(CMAKE_SYSTEM_VERSION 21) # -- end hunter_add_package(Android-SDK-Platform) diff --git a/examples/BZip2/CMakeLists.txt b/examples/BZip2/CMakeLists.txt index f77021931..9237a2030 100644 --- a/examples/BZip2/CMakeLists.txt +++ b/examples/BZip2/CMakeLists.txt @@ -14,3 +14,11 @@ hunter_add_package(BZip2) find_package(BZip2 CONFIG REQUIRED) add_executable(foo foo.cpp) target_link_libraries(foo BZip2::bz2) + +if(MSVC) + target_compile_definitions( + foo + PRIVATE + _CRT_SECURE_NO_WARNINGS + ) +endif() diff --git a/examples/Boost-chrono/CMakeLists.txt b/examples/Boost-chrono/CMakeLists.txt index 0887c2b75..9b5a8dadd 100644 --- a/examples/Boost-chrono/CMakeLists.txt +++ b/examples/Boost-chrono/CMakeLists.txt @@ -9,10 +9,15 @@ include("../common.cmake") project(download-boost) -# download boost hunter_add_package(Boost COMPONENTS system chrono) - -# now boost can be used find_package(Boost CONFIG REQUIRED system chrono) + add_executable(foo foo.cpp) -target_link_libraries(foo Boost::system Boost::chrono) +target_link_libraries( + foo + PUBLIC + Boost::chrono + Boost::system # Should be last + # Boost 1.66.0, Linux, Clang with -stdlib=libstdc++: + # * https://travis-ci.org/ingenue/hunter/jobs/318140468#L2651 +) diff --git a/examples/Boost-compute/CMakeLists.txt b/examples/Boost-compute/CMakeLists.txt index 62e8b4059..8dcf0e34e 100644 --- a/examples/Boost-compute/CMakeLists.txt +++ b/examples/Boost-compute/CMakeLists.txt @@ -9,11 +9,8 @@ include("../common.cmake") project(download-boost-compute) -# download boost.compute hunter_add_package(BoostCompute) - -# now boost.compute can be used find_package(BoostCompute CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo BoostCompute::boost_compute) +target_link_libraries(foo PUBLIC BoostCompute::boost_compute) diff --git a/examples/Boost-filesystem/CMakeLists.txt b/examples/Boost-filesystem/CMakeLists.txt index 11b423ecf..95c111311 100644 --- a/examples/Boost-filesystem/CMakeLists.txt +++ b/examples/Boost-filesystem/CMakeLists.txt @@ -16,31 +16,32 @@ hunter_add_package(Boost COMPONENTS system filesystem) find_package(Boost CONFIG REQUIRED system filesystem) if(ANDROID) + string(COMPARE EQUAL "${CMAKE_ANDROID_NDK}" "" is_empty) + if(is_empty) + message(FATAL_ERROR "CMAKE_ANDROID_NDK is empty") + endif() add_library( foo SHARED foo_android.cpp - "${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c" + "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c" ) else() add_executable(foo foo.cpp) endif() -target_link_libraries(foo Boost::system Boost::filesystem) - -# Compatibility mode -set(Boost_USE_STATIC_LIBS ON) -if(MSVC) - add_definitions(-DBOOST_ALL_NO_LIB=1) -endif() -find_package(Boost REQUIRED system filesystem) -include_directories("${Boost_INCLUDE_DIRS}") -target_link_libraries(foo ${Boost_LIBRARIES}) +target_link_libraries( + foo + Boost::filesystem + Boost::system # Should be last + # Boost 1.66.0, Linux, Clang with -stdlib=libstdc++: + # * https://travis-ci.org/ingenue/hunter/jobs/318140416#L2674 +) if(ANDROID) target_link_libraries(foo log android) target_include_directories( - foo PUBLIC "${ANDROID_NDK}/sources/android/native_app_glue" + foo PUBLIC "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue" ) if(NOT "$ENV{TRAVIS}") @@ -56,6 +57,10 @@ if(ANDROID) message("Path to `emulator`: ${ANDROID-SDK_ROOT}/android-sdk/tools/emulator") message("Path to `adb`: ${ANDROID-SDK_ROOT}/android-sdk/platform-tools/adb") - android_create_apk(NAME foo DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/apk") + android_create_apk( + BASE_TARGET foo + LAUNCH_TARGET foo-launch + DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/apk" + ) endif() endif() diff --git a/examples/Boost-iostreams/CMakeLists.txt b/examples/Boost-iostreams/CMakeLists.txt index 77a40ff8d..f6e7051bb 100644 --- a/examples/Boost-iostreams/CMakeLists.txt +++ b/examples/Boost-iostreams/CMakeLists.txt @@ -9,19 +9,8 @@ include("../common.cmake") project(boost_iostreams) -# download boost hunter_add_package(Boost COMPONENTS iostreams serialization) - -# now boost can be used find_package(Boost CONFIG REQUIRED iostreams serialization) -add_executable(foo foo.cpp) -target_link_libraries(foo Boost::iostreams Boost::serialization) -# Compatibility mode -set(Boost_USE_STATIC_LIBS ON) -if(MSVC) - add_definitions(-DBOOST_ALL_NO_LIB=1) -endif() -find_package(Boost REQUIRED iostreams) -include_directories(${Boost_INCLUDE_DIRS}) -target_link_libraries(foo ${Boost_LIBRARIES}) +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::iostreams Boost::serialization) diff --git a/examples/Boost-process/CMakeLists.txt b/examples/Boost-process/CMakeLists.txt index f5dd6583e..4ab5f3649 100644 --- a/examples/Boost-process/CMakeLists.txt +++ b/examples/Boost-process/CMakeLists.txt @@ -9,11 +9,8 @@ include("../common.cmake") project(example-boost-process) -# download boost.process hunter_add_package(BoostProcess) - -# now boost.process can be used find_package(BoostProcess CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo BoostProcess::boost_process) +target_link_libraries(foo PUBLIC BoostProcess::boost_process) diff --git a/examples/Boost-serialization/CMakeLists.txt b/examples/Boost-serialization/CMakeLists.txt index fb3e6de38..6fe52a0bf 100644 --- a/examples/Boost-serialization/CMakeLists.txt +++ b/examples/Boost-serialization/CMakeLists.txt @@ -13,4 +13,4 @@ hunter_add_package(Boost COMPONENTS serialization) find_package(Boost CONFIG REQUIRED serialization) add_executable(foo foo.cpp) -target_link_libraries(foo Boost::serialization) +target_link_libraries(foo PUBLIC Boost::serialization) diff --git a/examples/Boost-system/CMakeLists.txt b/examples/Boost-system/CMakeLists.txt index 1fb356d0e..de80f992e 100644 --- a/examples/Boost-system/CMakeLists.txt +++ b/examples/Boost-system/CMakeLists.txt @@ -9,19 +9,14 @@ include("../common.cmake") project(download-boost) -# download boost hunter_add_package(Boost COMPONENTS system) - -# now boost can be used find_package(Boost CONFIG REQUIRED system) + add_executable(foo foo.cpp) -target_link_libraries(foo Boost::system) +target_link_libraries(foo PUBLIC Boost::system) -# Compatibility mode -set(Boost_USE_STATIC_LIBS ON) -if(MSVC) - add_definitions(-DBOOST_ALL_NO_LIB=1) +file(GLOB_RECURSE boost_configs "${BOOST_ROOT}/*/BoostConfig.cmake") +list(LENGTH boost_configs len) +if(NOT len EQUAL "1") + message(FATAL_ERROR "More than one *Config: ${boost_configs}") endif() -find_package(Boost REQUIRED system) -include_directories(${Boost_INCLUDE_DIRS}) -target_link_libraries(foo ${Boost_LIBRARIES}) diff --git a/examples/Boost-thread/CMakeLists.txt b/examples/Boost-thread/CMakeLists.txt index 7050fa517..cdb4d19a8 100644 --- a/examples/Boost-thread/CMakeLists.txt +++ b/examples/Boost-thread/CMakeLists.txt @@ -9,11 +9,8 @@ include("../common.cmake") project(download-boost) -# download boost hunter_add_package(Boost COMPONENTS system thread) - -# now boost can be used find_package(Boost CONFIG REQUIRED system thread) -add_executable(foo foo.cpp) -target_link_libraries(foo Boost::system Boost::thread) +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::system Boost::thread) diff --git a/examples/Boost-uuid/CMakeLists.txt b/examples/Boost-uuid/CMakeLists.txt index c044d6f15..64c41f30c 100644 --- a/examples/Boost-uuid/CMakeLists.txt +++ b/examples/Boost-uuid/CMakeLists.txt @@ -9,11 +9,8 @@ include("../common.cmake") project(download-boost) -# download boost hunter_add_package(Boost) - -# now boost can be used find_package(Boost CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo Boost::boost) +target_link_libraries(foo PUBLIC Boost::boost) diff --git a/examples/Boost/CMakeLists.txt b/examples/Boost/CMakeLists.txt index 33c54918d..d1f6c5e0b 100644 --- a/examples/Boost/CMakeLists.txt +++ b/examples/Boost/CMakeLists.txt @@ -9,33 +9,37 @@ include("../common.cmake") project(download-boost) -# download boost hunter_add_package(Boost) - -# now boost can be used find_package(Boost CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo Boost::boost) - -# Create license with Boost's license under 3rd party -if(NOT EXISTS "${Boost_LICENSE}") - message(FATAL_ERROR "License file not found") -endif() - -file(READ "${Boost_LICENSE}" boost_license_content) +target_link_libraries(foo PUBLIC Boost::boost) set(project_license "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt") file( WRITE "${project_license}" "Some info about this project license.\n\n" - "== 3rd party licenses ==\n\n" - "== Boost ==\n\n" - "${boost_license_content}" ) + +string(COMPARE EQUAL "${Boost_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "No licenses") +endif() + +file(APPEND "${project_license}" "== 3rd party licenses ==\n\n") + +foreach(x ${Boost_LICENSES}) + file(READ "${x}" content) + get_filename_component(license_name "${x}" NAME) + file(APPEND "${project_license}" "== Boost (${license_name}) ==\n\n") + file(APPEND "${project_license}" "${content}") +endforeach() + message("Project license: ${project_license}") -# Compatibility mode -find_package(Boost REQUIRED) -include_directories("${Boost_INCLUDE_DIRS}") +file(GLOB_RECURSE boost_configs "${BOOST_ROOT}/*/BoostConfig.cmake") +list(LENGTH boost_configs len) +if(NOT len EQUAL "1") + message(FATAL_ERROR "More than one *Config: ${boost_configs}") +endif() diff --git a/examples/Eigen/CMakeLists.txt b/examples/Eigen/CMakeLists.txt index 2800e14b9..4ce2b3a36 100644 --- a/examples/Eigen/CMakeLists.txt +++ b/examples/Eigen/CMakeLists.txt @@ -9,12 +9,26 @@ include("../common.cmake") project(download-eigen) +# DOCUMENTATION_START { hunter_add_package(Eigen) +find_package(Eigen3 CONFIG REQUIRED) -find_package(Eigen REQUIRED) +add_executable(foo foo.cpp) +target_link_libraries(foo Eigen3::Eigen) +# DOCUMENTATION_END } # Test double library creation -find_package(Eigen REQUIRED) +find_package(Eigen3 CONFIG REQUIRED) -add_executable(foo foo.cpp) -target_link_libraries(foo Eigen::eigen) +string(COMPARE EQUAL "${Eigen_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Licenses not found") +endif() + +message("Eigen licenses:") +foreach(x ${Eigen_LICENSES}) + message("* ${x}") + if(NOT EXISTS "${Eigen_LICENSES}") + message(FATAL_ERROR "File not found") + endif() +endforeach() diff --git a/examples/GTest/CMakeLists.txt b/examples/GTest/CMakeLists.txt index 6e34728a7..52b649e8f 100644 --- a/examples/GTest/CMakeLists.txt +++ b/examples/GTest/CMakeLists.txt @@ -9,11 +9,17 @@ include("../common.cmake") project(download-gtest) -# download gtest -hunter_add_package(GTest) +add_executable(foo foo.cpp) -# now gtest can be used +hunter_add_package(GTest) find_package(GTest CONFIG REQUIRED) +target_link_libraries(foo PUBLIC GTest::main) -add_executable(foo foo.cpp) -target_link_libraries(foo GTest::main) +find_package(GMock CONFIG REQUIRED) +target_link_libraries(foo PUBLIC GMock::gmock) + +if(NOT EXISTS "${GTest_LICENSES}") + message(FATAL_ERROR "File not found: '${GTest_LICENSES}") +endif() + +message("License file: '${GTest_LICENSES}'") diff --git a/examples/GTest/foo.cpp b/examples/GTest/foo.cpp index ba8017ae3..bfff18e89 100644 --- a/examples/GTest/foo.cpp +++ b/examples/GTest/foo.cpp @@ -1,5 +1,24 @@ #include +#include + +class Turtle { + public: + virtual int GetX() const = 0; + virtual ~Turtle() {} +}; + +class MockTurtle: public Turtle { + public: + MOCK_CONST_METHOD0(GetX, int()); +}; TEST(Foo, Boo) { ASSERT_EQ(3, 3); } + +TEST(Foo, Mock) { + MockTurtle turtle; + EXPECT_CALL(turtle, GetX()).Times(::testing::AtLeast(1)); + + turtle.GetX(); +} diff --git a/examples/Jpeg/CMakeLists.txt b/examples/Jpeg/CMakeLists.txt index 438fd0b4c..8342eec22 100644 --- a/examples/Jpeg/CMakeLists.txt +++ b/examples/Jpeg/CMakeLists.txt @@ -9,11 +9,10 @@ include("../common.cmake") project(download-jpeg) -# download gtest +# DOCUMENTATION_START { hunter_add_package(Jpeg) - -# now gtest can be used find_package(JPEG CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo JPEG::jpeg) +target_link_libraries(foo PUBLIC JPEG::jpeg) +# DOCUMENTATION_END } diff --git a/examples/Leathers/CMakeLists.txt b/examples/Leathers/CMakeLists.txt index a4e1dffd5..fb4c66afa 100644 --- a/examples/Leathers/CMakeLists.txt +++ b/examples/Leathers/CMakeLists.txt @@ -9,5 +9,10 @@ include("../common.cmake") project(download-leathers) +# DOCUMENTATION_START { hunter_add_package(Leathers) find_package(Leathers CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC Leathers::leathers) +# DOCUMENTATION_END } diff --git a/examples/Lua/CMakeLists.txt b/examples/Lua/CMakeLists.txt index 29a9c740f..35d4ce5f0 100644 --- a/examples/Lua/CMakeLists.txt +++ b/examples/Lua/CMakeLists.txt @@ -9,18 +9,56 @@ include("../common.cmake") project(download-lua) -# download Lua +# DOCUMENTATION_START_0 { hunter_add_package(Lua) +find_package(Lua CONFIG REQUIRED) +# DOCUMENTATION_END_0 } +if(NOT TARGET Lua::lua) + message(FATAL_ERROR "Target Lua::lua not found") +endif() + +# DOCUMENTATION_START_1 { +# Imported target can be used as-is +# in "build time" commands like 'add_custom_target' +add_custom_target( + show_lua_version + Lua::lua -v + COMMENT "Show version of Lua executable" +) +# DOCUMENTATION_END_1 } + +# DOCUMENTATION_START_2 { +# Full path to executable 'LUA_EXECUTABLE' should be used +# for "generate time" commands like 'execute_process' execute_process( - COMMAND "${LUA_ROOT}/bin/lua" -v + COMMAND ${LUA_EXECUTABLE} -v RESULT_VARIABLE result OUTPUT_VARIABLE output + ERROR_VARIABLE error OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE ) +# DOCUMENTATION_END_2 } -if(NOT result EQUAL 0) - message(FATAL_ERROR "lua failed") +if(NOT result EQUAL "0") + message( + FATAL_ERROR + "lua failed\n" + "result:\n" + " ${result}\n" + "output:\n" + " ${output}\n" + "error:\n" + " ${error}\n" + ) endif() message("Lua version: ${output}") + +add_library(boo boo.cpp) + +# DOCUMENTATION_START_3 { +# Library usage +target_link_libraries(boo PUBLIC Lua::lua_lib) +# DOCUMENTATION_END_3 } diff --git a/examples/MySQL-client/CMakeLists.txt b/examples/MySQL-client/CMakeLists.txt index 31dbab496..b52f0bf8b 100644 --- a/examples/MySQL-client/CMakeLists.txt +++ b/examples/MySQL-client/CMakeLists.txt @@ -7,7 +7,7 @@ include("../common.cmake") project(MySQL-client-example) hunter_add_package(MySQL-client) -find_package(MySQL-client REQUIRED) +find_package(MySQL-client CONFIG REQUIRED) set(${PROJECT_NAME}_SOURCES main.c @@ -17,5 +17,5 @@ add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCES} ) -target_link_libraries(${PROJECT_NAME} "MySQL::client") +target_link_libraries(${PROJECT_NAME} "MySQL::libmysql") diff --git a/examples/OpenCV/CMakeLists.txt b/examples/OpenCV/CMakeLists.txt index c185c06ef..652a11a80 100644 --- a/examples/OpenCV/CMakeLists.txt +++ b/examples/OpenCV/CMakeLists.txt @@ -1,7 +1,7 @@ # Copyright (c) 2015, Ruslan Baratov # All rights reserved. -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.2) # Emulate HunterGate: # * https://github.com/hunter-packages/gate @@ -9,12 +9,14 @@ include("../common.cmake") project(download-opencv) +# DOCUMENTATION_START { hunter_add_package(OpenCV) find_package(OpenCV REQUIRED) +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE ${OpenCV_LIBS}) +# DOCUMENTATION_END } + message("OpenCV_DIR: ${OpenCV_DIR}") message("OpenCV_CONFIG: ${OpenCV_CONFIG}") message("OpenCV_LIBS: ${OpenCV_LIBS}") - -add_executable(foo foo.cpp) -target_link_libraries(foo PRIVATE ${OpenCV_LIBS}) diff --git a/examples/OpenSSL-imported/CMakeLists.txt b/examples/OpenSSL-imported/CMakeLists.txt deleted file mode 100644 index 9f87c362f..000000000 --- a/examples/OpenSSL-imported/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2014, Ruslan Baratov -# All rights reserved. - -cmake_minimum_required(VERSION 3.0) - -# Emulate HunterGate: -# * https://github.com/hunter-packages/gate -include("../common.cmake") - -project(download-openssl) - -# download gtest -hunter_add_package(OpenSSL) - -# now gtest can be used -find_package(OpenSSL REQUIRED) - -add_executable(foo foo.cpp) -target_link_libraries(foo OpenSSL::SSL OpenSSL::Crypto) diff --git a/examples/OpenSSL-imported/foo.cpp b/examples/OpenSSL-imported/foo.cpp deleted file mode 100644 index 237a7c5e7..000000000 --- a/examples/OpenSSL-imported/foo.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include - -int main() { -} diff --git a/examples/OpenSSL/CMakeLists.txt b/examples/OpenSSL/CMakeLists.txt index 5ddf7d72c..7c2c2181c 100644 --- a/examples/OpenSSL/CMakeLists.txt +++ b/examples/OpenSSL/CMakeLists.txt @@ -9,12 +9,8 @@ include("../common.cmake") project(download-openssl) -# download gtest hunter_add_package(OpenSSL) - -# now gtest can be used find_package(OpenSSL REQUIRED) -include_directories("${OPENSSL_INCLUDE_DIR}") add_executable(foo foo.cpp) -target_link_libraries(foo ${OPENSSL_LIBRARIES}) +target_link_libraries(foo PUBLIC OpenSSL::SSL OpenSSL::Crypto) diff --git a/examples/PNG/CMakeLists.txt b/examples/PNG/CMakeLists.txt index 9cfbb1131..3d7dcd25e 100644 --- a/examples/PNG/CMakeLists.txt +++ b/examples/PNG/CMakeLists.txt @@ -10,31 +10,15 @@ include("../common.cmake") project(example-hunter-png) +# DOCUMENTATION_START { hunter_add_package(PNG) - find_package(PNG CONFIG REQUIRED) -add_executable(foo main.cpp) -target_link_libraries(foo PNG::png) - -# Compatibility mode -find_package(PNG REQUIRED) - -string(COMPARE EQUAL "${PNG_INCLUDE_DIRS}" "" is_empty) -if(is_empty) - message(FATAL_ERROR "Expected non-empty") -endif() - -string(COMPARE EQUAL "${PNG_DEFINITIONS}" "" is_empty) -if(NOT is_empty) - message(FATAL_ERROR "Expected empty") -endif() - -string(COMPARE EQUAL "${PNG_LIBRARIES}" "PNG::png" is_good) -if(NOT is_good) - message(FATAL_ERROR "Expected PNG::png but got ${PNG_LIBRARIES}") -endif() +add_executable(boo main.cpp) +target_link_libraries(boo PRIVATE PNG::png) +# DOCUMENTATION_END } -include_directories(${PNG_INCLUDE_DIRS}) -target_link_libraries(foo ${PNG_LIBRARIES}) -add_definitions(${PNG_DEFINITIONS}) +# DOCUMENTATION_START_1 { +add_executable(baz main.cpp) +target_link_libraries(baz PRIVATE PNG::PNG) +# DOCUMENTATION_END_1 } diff --git a/examples/SDL2/CMakeLists.txt b/examples/SDL2/CMakeLists.txt index 8ae814ff6..42ed7216f 100644 --- a/examples/SDL2/CMakeLists.txt +++ b/examples/SDL2/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 3.0) +cmake_minimum_required (VERSION 3.2) # Emulate HunterGate: # * https://github.com/hunter-packages/gate @@ -9,7 +9,15 @@ project(SDL2-test) hunter_add_package(SDL2) find_package(SDL2 CONFIG REQUIRED) -add_executable(main main.cpp) +if(ANDROID) + add_library(main SHARED main.cpp) +elseif(IOS) + # FIXME + add_library(main dummy.cpp) +else() + add_executable(main main.cpp) +endif() + target_link_libraries(main SDL2::SDL2main - SDL2::SDL2-static) + SDL2::SDL2) diff --git a/examples/SQLite3/CMakeLists.txt b/examples/SQLite3/CMakeLists.txt deleted file mode 100644 index 7e7b9d7f8..000000000 --- a/examples/SQLite3/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2015, Ruslan Baratov -# All rights reserved. - -cmake_minimum_required(VERSION 3.0) - -# Emulate HunterGate: -# * https://github.com/hunter-packages/gate -include("../common.cmake") - -project(download-SQLite3) - -hunter_add_package(SQLite3) -find_package(SQLite3 REQUIRED) - -if(NOT TARGET SQLite3) - message(FATAL_ERROR "No SQLite3 target") -endif() diff --git a/examples/Sources-for-Android-SDK/CMakeLists.txt b/examples/Sources-for-Android-SDK/CMakeLists.txt index 5eee427f4..edce5acb0 100644 --- a/examples/Sources-for-Android-SDK/CMakeLists.txt +++ b/examples/Sources-for-Android-SDK/CMakeLists.txt @@ -11,7 +11,7 @@ project(Foo) # -- Emulate toolchain set(ANDROID TRUE) -set(ANDROID_NATIVE_API_LEVEL 21) +set(CMAKE_SYSTEM_VERSION 21) # -- end hunter_add_package(Sources-for-Android-SDK) diff --git a/examples/Sugar/CMakeLists.txt b/examples/Sugar/CMakeLists.txt deleted file mode 100644 index 51d9a4b5d..000000000 --- a/examples/Sugar/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2013, Ruslan Baratov -# All rights reserved. - -cmake_minimum_required(VERSION 3.0) - -# Emulate HunterGate: -# * https://github.com/hunter-packages/gate -include("../common.cmake") - -project(download-sugar) - -# download sugar -hunter_add_package(Sugar) - -# now sugar can be used -include("${SUGAR_ROOT}/cmake/Sugar") -include(sugar_status_print) - -# try some function -set(SUGAR_STATUS_PRINT ON) -sugar_status_print("Sugar downloaded!") diff --git a/examples/ZLIB/CMakeLists.txt b/examples/ZLIB/CMakeLists.txt index 69741e2ab..6c8feab53 100644 --- a/examples/ZLIB/CMakeLists.txt +++ b/examples/ZLIB/CMakeLists.txt @@ -1,7 +1,7 @@ # Copyright (c) 2014, Ruslan Baratov # All rights reserved. -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.2) # Emulate HunterGate: # * https://github.com/hunter-packages/gate @@ -9,26 +9,15 @@ include("../common.cmake") project(download-zlib) -# download gtest +# DOCUMENTATION_START { hunter_add_package(ZLIB) - -# now gtest can be used find_package(ZLIB CONFIG REQUIRED) -add_executable(foo main.c) -target_link_libraries(foo ZLIB::zlib) - -# Compatibility mode -find_package(ZLIB REQUIRED) -string(COMPARE EQUAL "${ZLIB_INCLUDE_DIRS}" "" is_empty) -if(is_empty) - message(FATAL_ERROR "Expected non-empty") -endif() - -string(COMPARE EQUAL "${ZLIB_LIBRARIES}" "ZLIB::zlib" is_good) -if(NOT is_good) - message(FATAL_ERROR "Expected ZLIB::zlib but not ${ZLIB_LIBRARIES}") -endif() +add_executable(boo main.c) +target_link_libraries(boo PRIVATE ZLIB::zlib) +# DOCUMENTATION_END } -include_directories("${ZLIB_INCLUDE_DIRS}") -target_link_libraries(foo ${ZLIB_LIBRARIES}) +# DOCUMENTATION_START_1 { +add_executable(baz main.c) +target_link_libraries(baz PRIVATE ZLIB::ZLIB) +# DOCUMENTATION_END_1 } diff --git a/examples/ZeroMQ/CMakeLists.txt b/examples/ZeroMQ/CMakeLists.txt index 1d0d906f9..46ccfb3dc 100644 --- a/examples/ZeroMQ/CMakeLists.txt +++ b/examples/ZeroMQ/CMakeLists.txt @@ -13,7 +13,5 @@ find_package(ZeroMQ CONFIG REQUIRED) add_executable(version main.cpp) target_link_libraries(version ZeroMQ::libzmq) -if(NOT CMAKE_SYSTEM_NAME STREQUAL Windows) - add_executable(version-static main.cpp) - target_link_libraries(version-static ZeroMQ::libzmq-static) -endif() +add_executable(version-static main.cpp) +target_link_libraries(version-static ZeroMQ::libzmq-static) diff --git a/examples/ccv/CMakeLists.txt b/examples/ccv/CMakeLists.txt index 4faeaf052..0e238c470 100644 --- a/examples/ccv/CMakeLists.txt +++ b/examples/ccv/CMakeLists.txt @@ -9,8 +9,10 @@ include("../common.cmake") project(download-ccv) +# DOCUMENTATION_START { hunter_add_package(ccv) find_package(ccv REQUIRED CONFIG) add_executable(foo test.c) target_link_libraries(foo PRIVATE ccv::ccv) +# DOCUMENTATION_END } diff --git a/examples/common.cmake b/examples/common.cmake index 936834314..79588471b 100644 --- a/examples/common.cmake +++ b/examples/common.cmake @@ -1,7 +1,7 @@ -# Copyright (c) 2013, 2015 Ruslan Baratov +# Copyright (c) 2013, 2015, 2019 Ruslan Baratov # All rights reserved. -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.2) ### Include HunterGate module from git submodule set(gate_dir "${CMAKE_CURRENT_LIST_DIR}/../gate") @@ -18,17 +18,27 @@ endif() message("Including HunterGate: ${gate_module}") include("${gate_module}") +set( + error_message + "Are you using jenkins.py script for testing? + Please check: + - https://docs.hunter.sh/en/latest/creating-new/create/cmake.html#testing-locally" +) + ### Check testing variables are set -string(COMPARE EQUAL "${TESTING_URL}" "" url_is_empty) -string(COMPARE EQUAL "${TESTING_SHA1}" "" sha1_is_empty) -string(COMPARE EQUAL "${HUNTER_ROOT}" "" hunter_root_is_empty) - -if(NOT url_is_empty AND NOT sha1_is_empty AND NOT hunter_root_is_empty) - get_filename_component(TESTING_URL "${TESTING_URL}" ABSOLUTE) - - ### HunterGate module - HunterGate(URL "${TESTING_URL}" SHA1 "${TESTING_SHA1}" ${TESTING_CONFIG_OPT}) -else() - get_filename_component(HUNTER_ROOT "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE) - HunterGate(URL "x" SHA1 "xxxxxxxx" ${TESTING_CONFIG_OPT}) +if("${TESTING_URL}" STREQUAL "") + message(FATAL_ERROR "TESTING_URL is empty. ${error_message}") +endif() + +if("${TESTING_SHA1}" STREQUAL "") + message(FATAL_ERROR "TESTING_SHA1 is empty. ${error_message}") endif() + +if("${HUNTER_ROOT}" STREQUAL "") + message(FATAL_ERROR "HUNTER_ROOT is empty. ${error_message}") +endif() + +get_filename_component(TESTING_URL "${TESTING_URL}" ABSOLUTE) + +### HunterGate module +HunterGate(URL "${TESTING_URL}" SHA1 "${TESTING_SHA1}" ${TESTING_CONFIG_OPT}) diff --git a/examples/dlib/CMakeLists.txt b/examples/dlib/CMakeLists.txt index 4f3c48865..453efb1f1 100644 --- a/examples/dlib/CMakeLists.txt +++ b/examples/dlib/CMakeLists.txt @@ -9,8 +9,16 @@ include("../common.cmake") project(download-dlib) +# DOCUMENTATION_START { hunter_add_package(dlib) find_package(dlib CONFIG REQUIRED) add_executable(bayes_net_ex bayes_net_ex.cpp) -target_link_libraries(bayes_net_ex dlib::dlib) +target_link_libraries(bayes_net_ex PUBLIC dlib::dlib) +# DOCUMENTATION_END } + +if(NOT EXISTS "${dlib_LICENSES}") + message(FATAL_ERROR "File not found: '${dlib_LICENSES}'") +else() + message("License: '${dlib_LICENSES}'") +endif() diff --git a/examples/flatbuffers/CMakeLists.txt b/examples/flatbuffers/CMakeLists.txt index e516f8f71..c0ba63669 100644 --- a/examples/flatbuffers/CMakeLists.txt +++ b/examples/flatbuffers/CMakeLists.txt @@ -9,11 +9,10 @@ include("../common.cmake") project(download-flatbuffers) -# download flatbuffers +# DOCUMENTATION_START { hunter_add_package(flatbuffers) - -# now flatbuffers can be used -find_package(flatbuffers CONFIG REQUIRED) +find_package(Flatbuffers CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo flatbuffers::flatbuffers) +target_link_libraries(foo PUBLIC flatbuffers::flatbuffers) +# DOCUMENTATION_END } diff --git a/examples/fmt/CMakeLists.txt b/examples/fmt/CMakeLists.txt index 62fc61cbd..c0df412d5 100644 --- a/examples/fmt/CMakeLists.txt +++ b/examples/fmt/CMakeLists.txt @@ -11,4 +11,4 @@ set (CMAKE_CXX_STANDARD 11) find_package(fmt CONFIG REQUIRED) add_executable(fmtexample fmtexample.cpp) -target_link_libraries(fmtexample fmt) +target_link_libraries(fmtexample fmt::fmt) diff --git a/examples/fmt/fmtexample.cpp b/examples/fmt/fmtexample.cpp index 3cd8578ac..84eda507b 100644 --- a/examples/fmt/fmtexample.cpp +++ b/examples/fmt/fmtexample.cpp @@ -1,10 +1,11 @@ #include +#include int main() { fmt::print("Hello world\nThis is fmt(ex-cppformat)\n"); std::string as_string = fmt::format("The answer is {}", 42); - fmt::MemoryWriter w; - w.write("{}\nThe previous line and this message were bufferred in memory", as_string); - fmt::print(stderr, "{}\nAnd then were printed to stderr\n", w.c_str()); + fmt::memory_buffer buf; + format_to(buf, "{}\nThe previous line and this message were bufferred in memory", as_string); + fmt::print(stderr, "{}\nAnd then were printed to stderr\n", buf.data()); fmt::print("Fmt supports many nice features, see {url} for details\n", fmt::arg("url", "https://github.com/fmtlib/fmt")); } diff --git a/examples/freetype/CMakeLists.txt b/examples/freetype/CMakeLists.txt index 3b7515794..de63d0a20 100644 --- a/examples/freetype/CMakeLists.txt +++ b/examples/freetype/CMakeLists.txt @@ -9,11 +9,15 @@ include("../common.cmake") project(download-freetype) -# download freetype +# DOCUMENTATION_START { hunter_add_package(freetype) - -# now freetype can be used find_package(freetype CONFIG REQUIRED) -add_executable(foo foo.cpp) -target_link_libraries(foo freetype::freetype) +add_executable(boo boo.cpp) +target_link_libraries(boo PRIVATE freetype::freetype) +# DOCUMENTATION_END } + +# DOCUMENTATION_START_1 { +add_executable(baz boo.cpp) +target_link_libraries(baz PRIVATE Freetype::Freetype) +# DOCUMENTATION_END_1 } diff --git a/examples/freetype/foo.cpp b/examples/freetype/foo.cpp deleted file mode 100644 index acce37cc3..000000000 --- a/examples/freetype/foo.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include // std::cout - -#include -#include FT_FREETYPE_H - -int main() { - FT_Library library; - FT_Error error; - - error = FT_Init_FreeType(&library); - if (error) { - std::cerr << "Library initialization failed" << std::endl; - return EXIT_FAILURE; - } - - std::cout << "Success" << std::endl; - return EXIT_SUCCESS; -} diff --git a/examples/gflags/CMakeLists.txt b/examples/gflags/CMakeLists.txt index 6813fd6a7..f3ced8f42 100644 --- a/examples/gflags/CMakeLists.txt +++ b/examples/gflags/CMakeLists.txt @@ -16,4 +16,4 @@ hunter_add_package(gflags) find_package(gflags CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo gflags-static) +target_link_libraries(foo gflags) diff --git a/examples/gflags/foo.cpp b/examples/gflags/foo.cpp index 4e67f321e..6e373d314 100644 --- a/examples/gflags/foo.cpp +++ b/examples/gflags/foo.cpp @@ -4,5 +4,7 @@ DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing"); DEFINE_string(languages, "english,french,german", "comma-separated list of languages to offer in the 'lang' menu"); -int main() { +int main(int argc, char* argv[]) { + gflags::ParseCommandLineFlags(&argc, &argv, true); + return 0; } diff --git a/examples/glfw/CMakeLists.txt b/examples/glfw/CMakeLists.txt index 5798e5080..4a99a4dbb 100644 --- a/examples/glfw/CMakeLists.txt +++ b/examples/glfw/CMakeLists.txt @@ -8,7 +8,7 @@ include("../common.cmake") project(glfw-example) hunter_add_package(glfw) -find_package(glfw3 REQUIRED) +find_package(glfw3 CONFIG REQUIRED) set(${PROJECT_NAME}_SOURCES simple.c @@ -19,4 +19,3 @@ add_executable(${PROJECT_NAME} ) target_link_libraries(${PROJECT_NAME} glfw) - diff --git a/examples/glm/core_func_common.cpp b/examples/glm/core_func_common.cpp index a610dd51d..2cb289ff1 100644 --- a/examples/glm/core_func_common.cpp +++ b/examples/glm/core_func_common.cpp @@ -30,6 +30,7 @@ /////////////////////////////////////////////////////////////////////////////////// #define GLM_FORCE_EXPLICIT_CTOR +#include #include #include #include diff --git a/examples/glog/CMakeLists.txt b/examples/glog/CMakeLists.txt index 9ccb25727..b1629579e 100644 --- a/examples/glog/CMakeLists.txt +++ b/examples/glog/CMakeLists.txt @@ -14,7 +14,13 @@ hunter_add_package(glog) find_package(glog CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo glog) +target_link_libraries(foo glog::glog) + +if(NOT EXISTS "${glog_LICENSES}") # one file expected + message(FATAL_ERROR "File not found: '${glog_LICENSES}'") +endif() + +message("License: '${glog_LICENSES}'") if(ANDROID) hunter_add_package(Android-Apk) diff --git a/examples/minizip/foo.cpp b/examples/minizip/foo.cpp index ae3c549fc..c9891bc94 100644 --- a/examples/minizip/foo.cpp +++ b/examples/minizip/foo.cpp @@ -1,8 +1,4 @@ #include "minizip/zip.h" -#include "minizip/aes/aes.h" -#include "minizip/aes/fileenc.h" -#include "minizip/aes/prng.h" -#include "minizip/aes/entropy.h" int main() { } diff --git a/examples/nlohmann-json/CMakeLists.txt b/examples/nlohmann-json/CMakeLists.txt deleted file mode 100644 index cc7fc06e8..000000000 --- a/examples/nlohmann-json/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required (VERSION 3.0) - -# Emulate HunterGate: -# * https://github.com/hunter-packages/gate -include("../common.cmake") - -project(dowload-nlohmann-json) - -hunter_add_package(nlohmann-json) -find_package(nlohmann-json) - -add_executable(main main.cpp) - -target_link_libraries(main - nlohmann-json::nlohmann-json) diff --git a/examples/nlohmann-json/main.cpp b/examples/nlohmann-json/main.cpp deleted file mode 100644 index 1031b42f5..000000000 --- a/examples/nlohmann-json/main.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include - -int main (int argc, char** argv) { - - // for convenience - using json = nlohmann::json; - - json j2 = { - {"pi", 3.141}, - {"happy", true}, - {"name", "Niels"}, - {"nothing", nullptr}, - {"answer", { - {"everything", 42} - }}, - {"list", {1, 0, 2}}, - {"object", { - {"currency", "USD"}, - {"value", 42.99} - }} - }; - - std::cout << j2 << std::endl; - - return 0; -} diff --git a/examples/qt-camera/AndroidManifest.xml.in b/examples/qt-camera/AndroidManifest.xml.in index a01eea9aa..d4759f22d 100644 --- a/examples/qt-camera/AndroidManifest.xml.in +++ b/examples/qt-camera/AndroidManifest.xml.in @@ -1,22 +1,21 @@ - + - + @@ -66,15 +65,15 @@ /> - + - + + diff --git a/examples/qt-camera/CMakeLists.txt b/examples/qt-camera/CMakeLists.txt index 5975eeb18..ba3df9387 100644 --- a/examples/qt-camera/CMakeLists.txt +++ b/examples/qt-camera/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.0) +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") + # Emulate HunterGate: # * https://github.com/hunter-packages/gate include("../common.cmake") @@ -14,6 +16,16 @@ hunter_add_package(Qt COMPONENTS qtmultimedia) # Qt5MultimediaWidgets find_package(Qt5MultimediaWidgets REQUIRED) # Qt5::MultimediaWidgets find_package(Qt5PrintSupport REQUIRED) # Qt5::PrintSupport +if(APPLE) + # Travis error: + # * https://travis-ci.org/ingenue/hunter/jobs/354713684 + # * You can't use this version of (null) with this version of macOS. You have macOS 10.12.6. Qt requires macOS 10.13.0 or later. + if(NOT TARGET Qt5::MultimediaWidgets) + message(FATAL_ERROR "No Qt5::Widgets target") + endif() + return() +endif() + set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) @@ -35,6 +47,8 @@ set( ) if(ANDROID) + # Doesn't work in fact, working example is here: + # * https://github.com/forexample/android-cmake/tree/master/08-declarative-camera add_library(qt-camera SHARED ${SOURCES}) set_target_properties(qt-camera PROPERTIES VERSION 1.0) @@ -101,27 +115,27 @@ target_link_libraries( ${plugins} ) -set(fix_cyclic FALSE) -if(APPLE) - set(fix_cyclic FALSE) -elseif(CMAKE_COMPILER_IS_GNUCXX) - # MinGW included - set(fix_cyclic TRUE) -elseif(NOT UNIX) - set(fix_cyclic FALSE) -elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - # Linux Clang - set(fix_cyclic TRUE) -endif() +string(COMPARE EQUAL "${CMAKE_SYSTEM_NAME}" "Linux" is_linux) + +if(is_linux) + configure_file( + qt.conf + ${CMAKE_CURRENT_BINARY_DIR}/qt.conf + @ONLY + ) + + configure_file( + env.sh + ${CMAKE_CURRENT_BINARY_DIR}/env.sh + @ONLY + ) -# Workaround for Linux's linker problems (*_MULTIPLICITY doesn't help, TODO) -- -if(fix_cyclic) - string( - REPLACE - "" - " -Wl,--start-group -Wl,--end-group " - CMAKE_CXX_LINK_EXECUTABLE - "${CMAKE_CXX_LINK_EXECUTABLE}" + enable_testing() + add_test(NAME qt-camera COMMAND qt-camera) + set_tests_properties( + qt-camera + PROPERTIES + ENVIRONMENT + "QT_DEBUG_PLUGINS=1;LD_LIBRARY_PATH=${QT_ROOT}/lib;GST_PLUGIN_SCANNER=1;GST_PLUGIN_PATH=${QT_ROOT}/lib/gstreamer-1.0" ) endif() -# -- diff --git a/examples/qt-camera/main.cpp b/examples/qt-camera/main.cpp index 727349b14..bd183d230 100644 --- a/examples/qt-camera/main.cpp +++ b/examples/qt-camera/main.cpp @@ -42,11 +42,7 @@ #include "camera.h" // Camera -#if defined(Q_OS_IOS) -extern "C" int qtmn(int argc, char** argv) { -#else int main(int argc, char **argv) { -#endif QApplication app(argc, argv); Camera camera; diff --git a/examples/qt-core/CMakeLists.txt b/examples/qt-core/CMakeLists.txt index a12b30c59..51a125b07 100644 --- a/examples/qt-core/CMakeLists.txt +++ b/examples/qt-core/CMakeLists.txt @@ -11,3 +11,8 @@ find_package(Qt5Core REQUIRED) # Qt5::Core add_executable(helloworld main.cpp) target_link_libraries(helloworld Qt5::Core) + +if(IOS) + find_package(Qt5Gui REQUIRED) # Qt5::QIOSIntegrationPlugin + target_link_libraries(helloworld Qt5::QIOSIntegrationPlugin) +endif() diff --git a/examples/qt-core/main.cpp b/examples/qt-core/main.cpp index 86284f190..aa4e083af 100644 --- a/examples/qt-core/main.cpp +++ b/examples/qt-core/main.cpp @@ -1,10 +1,6 @@ #include -#if defined(Q_OS_IOS) -extern "C" int qtmn(int argc, char** argv) { -#else int main(int argc, char **argv) { -#endif QCoreApplication a(argc, argv); return a.exec(); } diff --git a/examples/qt-qml/CMakeLists.txt b/examples/qt-qml/CMakeLists.txt old mode 100644 new mode 100755 index 69b42c5ac..a4f84976d --- a/examples/qt-qml/CMakeLists.txt +++ b/examples/qt-qml/CMakeLists.txt @@ -30,31 +30,8 @@ else() endif() add_executable(qmlexample main.cpp) -target_link_libraries( - qmlexample Qt5::Widgets Qt5::Quick Qt5::QTcpServerConnection ${plugins} -) +target_link_libraries(qmlexample PUBLIC Qt5::Widgets Qt5::Quick ${plugins}) -# Workaround for Linux's linker problems (*_MULTIPLICITY doesn't help, TODO) -- -set(fix_cyclic FALSE) -if(APPLE) - set(fix_cyclic FALSE) -elseif(CMAKE_COMPILER_IS_GNUCXX) - # MinGW included - set(fix_cyclic TRUE) -elseif(NOT UNIX) - set(fix_cyclic FALSE) -elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - # Linux Clang - set(fix_cyclic TRUE) -endif() - -if(fix_cyclic) - string( - REPLACE - "" - " -Wl,--start-group -Wl,--end-group " - CMAKE_CXX_LINK_EXECUTABLE - "${CMAKE_CXX_LINK_EXECUTABLE}" - ) +if(TARGET Qt5::QTcpServerConnection) + target_link_libraries(qmlexample PUBLIC Qt5::QTcpServerConnection) endif() -# -- diff --git a/examples/qt-qml/main.cpp b/examples/qt-qml/main.cpp index ab4070222..13d5f9d9f 100644 --- a/examples/qt-qml/main.cpp +++ b/examples/qt-qml/main.cpp @@ -18,11 +18,8 @@ #include #define QT_QML_NO_DEBUGGER -#if defined(Q_OS_IOS) -extern "C" int qtmn(int argc, char** argv) { -#else + int main(int argc, char **argv) { -#endif QApplication application(argc, argv); QQuickView view; diff --git a/examples/qt-widgets/CMakeLists.txt b/examples/qt-widgets/CMakeLists.txt index 310c0788b..b48d8d1fa 100644 --- a/examples/qt-widgets/CMakeLists.txt +++ b/examples/qt-widgets/CMakeLists.txt @@ -21,6 +21,16 @@ set(CMAKE_AUTOUIC ON) # Find the QtWidgets library find_package(Qt5Widgets REQUIRED) +if(APPLE) + # Travis error: + # * https://travis-ci.org/ingenue/hunter/jobs/354713684 + # * You can't use this version of (null) with this version of macOS. You have macOS 10.12.6. Qt requires macOS 10.13.0 or later. + if(NOT TARGET Qt5::Widgets) + message(FATAL_ERROR "No Qt5::Widgets target") + endif() + return() +endif() + # Tell CMake to create the helloworld executable add_executable( helloworld diff --git a/examples/qt-widgets/main.cpp b/examples/qt-widgets/main.cpp index 40845e5a0..2dfa86303 100644 --- a/examples/qt-widgets/main.cpp +++ b/examples/qt-widgets/main.cpp @@ -1,11 +1,7 @@ #include "MainWindow.h" #include -#if defined(Q_OS_IOS) -extern "C" int qtmn(int argc, char** argv) { -#else int main(int argc, char **argv) { -#endif QApplication a(argc, argv); MainWindow w; w.show(); diff --git a/examples/spdlog/foo.cpp b/examples/spdlog/foo.cpp index ffe582587..b91a8d015 100644 --- a/examples/spdlog/foo.cpp +++ b/examples/spdlog/foo.cpp @@ -1,6 +1,8 @@ #include +#include int main(int argc, char* argv[]) { auto console = spdlog::stdout_logger_mt("console"); console->info("Hello from INFO"); + return 0; } diff --git a/examples/x11/CMakeLists.txt b/examples/x11/CMakeLists.txt index 224b1ac05..b116fff7a 100644 --- a/examples/x11/CMakeLists.txt +++ b/examples/x11/CMakeLists.txt @@ -9,5 +9,8 @@ include("../common.cmake") project(download-x11) -# download x11 hunter_add_package(x11) +find_package(x11 CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::x11) diff --git a/examples/xau/CMakeLists.txt b/examples/xau/CMakeLists.txt index 130b0af28..fc415064d 100644 --- a/examples/xau/CMakeLists.txt +++ b/examples/xau/CMakeLists.txt @@ -11,3 +11,7 @@ project(download-xau) # download xau hunter_add_package(xau) +find_package(xau CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::xau) diff --git a/examples/xcb/CMakeLists.txt b/examples/xcb/CMakeLists.txt index 9d3913e0a..4626e499b 100644 --- a/examples/xcb/CMakeLists.txt +++ b/examples/xcb/CMakeLists.txt @@ -11,3 +11,7 @@ project(download-xcb) # download xcb hunter_add_package(xcb) +find_package(xcb CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::xcb) diff --git a/examples/xgboost/CMakeLists.txt b/examples/xgboost/CMakeLists.txt index 2afe6b66d..0e4c02fce 100644 --- a/examples/xgboost/CMakeLists.txt +++ b/examples/xgboost/CMakeLists.txt @@ -16,4 +16,4 @@ hunter_add_package(xgboost) find_package(xgboost CONFIG REQUIRED) add_executable(foo foo.cpp) -target_link_libraries(foo xgboost::xgboost) +target_link_libraries(foo PUBLIC xgboost::xgboost) diff --git a/examples/xgboost/foo.cpp b/examples/xgboost/foo.cpp index 87e876115..ec69dd795 100644 --- a/examples/xgboost/foo.cpp +++ b/examples/xgboost/foo.cpp @@ -1,4 +1,4 @@ -#include - +#include int main() { + xgboost::Learner::Create({}); } diff --git a/jenkins.py b/jenkins.py index deaa83e9a..89a0b4785 100755 --- a/jenkins.py +++ b/jenkins.py @@ -53,11 +53,6 @@ def run(): action='store_true', help='Remove old testing directories except `Download` directory' ) - parser.add_argument( - '--verbose', - action='store_true', - help='Verbose output' - ) parser.add_argument( '--disable-builds', action='store_true', @@ -68,9 +63,6 @@ def run(): action='store_true', help='Upload cache to server and run checks (clean up will be triggered, same as --clear-except-download)' ) - parser.add_argument( - '--skip-raw', action='store_true', help="Skip uploading of raw files" - ) parsed_args = parser.parse_args() @@ -90,53 +82,24 @@ def run(): if not project_dir: sys.exit('Expected environment variable PROJECT_DIR') - # Check broken builds -- - if (project_dir == 'examples/Boost-filesystem') and (toolchain == 'analyze'): - print('Skip (https://github.com/ruslo/hunter/issues/25)') - sys.exit(0) - - if (project_dir == 'examples/Boost-system') and (toolchain == 'analyze'): - print('Skip (https://github.com/ruslo/hunter/issues/26)') - sys.exit(0) - - if (project_dir == 'examples/OpenSSL') and (toolchain == 'mingw'): - print('Skip (https://github.com/ruslo/hunter/issues/28)') - sys.exit(0) - - if (project_dir == 'examples/OpenSSL') and (toolchain == 'ios-7-0'): - print('Skip (https://github.com/ruslo/hunter/issues/29)') - sys.exit(0) - - if (project_dir == 'examples/OpenSSL') and (toolchain == 'xcode'): - print('Skip (https://github.com/ruslo/hunter/issues/30)') - sys.exit(0) - ci = os.getenv('TRAVIS') or os.getenv('APPVEYOR') if (ci and toolchain == 'dummy'): print('Skip build: CI dummy (workaround)') sys.exit(0) - # -- end verbose = True - if ( - os.getenv('TRAVIS') and - (project_dir == 'examples/CLAPACK') and - (toolchain == 'xcode') - ): - verbose = False - - if ( - os.getenv('TRAVIS') and - (project_dir == 'examples/GSL') and - (toolchain == 'xcode') - ): - verbose = False - - if ( - os.getenv('TRAVIS') and - (project_dir == 'examples/hdf5') - ): - verbose = False + env_verbose = os.getenv('VERBOSE') + if env_verbose: + if env_verbose == '0': + verbose = False + elif env_verbose == '1': + verbose = True + else: + sys.exit( + 'Environment variable VERBOSE: expected 0 or 1, got "{}"'.format( + env_verbose + ) + ) project_dir = os.path.join(cdir, project_dir) project_dir = os.path.normpath(project_dir) @@ -148,6 +111,7 @@ def run(): os.makedirs(testing_dir, exist_ok=True) if os.name == 'nt': + # path too long workaround hunter_junctions = os.getenv('HUNTER_JUNCTIONS') if hunter_junctions: temp_dir = tempfile.mkdtemp(dir=hunter_junctions) @@ -182,6 +146,7 @@ def run(): polly_root = os.getenv('POLLY_ROOT') if polly_root: + polly_root = os.path.abspath(polly_root) print('Using POLLY_ROOT: {}'.format(polly_root)) build_script = os.path.join(polly_root, 'bin', 'build.py') else: @@ -206,6 +171,8 @@ def run(): '--home', project_dir, '--fwd', + 'CMAKE_POLICY_DEFAULT_CMP0069=NEW', + 'HUNTER_SUPPRESS_LIST_OF_FILES=ON', 'HUNTER_ROOT={}'.format(hunter_root), 'TESTING_URL={}'.format(hunter_url), 'TESTING_SHA1={}'.format(hunter_sha1) @@ -220,6 +187,13 @@ def run(): if parsed_args.all_release: args += ['HUNTER_CONFIGURATION_TYPES=Release'] + if parsed_args.upload: + passwords = os.path.join( + cdir, 'maintenance', 'upload-password-template.cmake' + ) + args += ['HUNTER_RUN_UPLOAD=ON'] + args += ['HUNTER_PASSWORDS_PATH={}'.format(passwords)] + args += ['--verbose'] if not verbose: args += ['--discard', '10'] @@ -233,29 +207,6 @@ def run(): subprocess.check_call(args) if parsed_args.upload: - upload_script = os.path.join(cdir, 'maintenance', 'upload-cache-to-github.py') - - print('Uploading cache') - call_args = [ - sys.executable, - upload_script, - '--username', - 'ingenue', - '--repo-owner', - 'ingenue', - '--repo', - 'hunter-cache', - '--cache-dir', - os.path.join(hunter_root, '_Base', 'Cache'), - '--temp-dir', - os.path.join(hunter_root, '__TEMP') - ] - - if parsed_args.skip_raw: - call_args.append('--skip-raw') - - subprocess.check_call(call_args) - seconds = 60 print( 'Wait for GitHub changes became visible ({} seconds)...'.format(seconds) @@ -281,10 +232,15 @@ def run(): '--fwd', 'HUNTER_DISABLE_BUILDS=ON', 'HUNTER_USE_CACHE_SERVERS=ONLY', + 'CMAKE_POLICY_DEFAULT_CMP0069=NEW', + 'HUNTER_SUPPRESS_LIST_OF_FILES=ON', 'HUNTER_ROOT={}'.format(hunter_root), 'TESTING_URL={}'.format(hunter_url), 'TESTING_SHA1={}'.format(hunter_sha1) ] + if not verbose: + args += ['--discard', '10'] + args += ['--tail', '200'] print('Execute command: [') for i in args: diff --git a/maintenance/local-upload/opencv/run-osx.sh b/maintenance/local-upload/opencv/run-osx.sh deleted file mode 100755 index f47770b15..000000000 --- a/maintenance/local-upload/opencv/run-osx.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -e - -set -x - -[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } - -export GITHUB_USER_PASSWORD - -THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` - -cd "${THIS_SCRIPT_DIR}/../../.." - -# Xcode 7.3 for iOS 9.3 -export DEVELOPER_DIR=${IOS_9_3_DEVELOPER_DIR} -export PATH=${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH - -which clang -which clang++ - -# { -export TOOLCHAIN=ios-nocodesign-9-3-wo-armv7s -PROJECT_DIR=examples/OpenCV ./jenkins.py --verbose --upload --clear-except-download -# } - -# { -export TOOLCHAIN=ios-nocodesign-9-3 -PROJECT_DIR=examples/OpenCV ./jenkins.py --verbose --upload --clear-except-download -# } diff --git a/maintenance/local-upload/qt/run-linux.sh b/maintenance/local-upload/qt/run-linux.sh deleted file mode 100755 index d261aec93..000000000 --- a/maintenance/local-upload/qt/run-linux.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -e - -set -x - -[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } -[ "${ANDROID_NDK_r10e}" = "" ] && { echo "ANDROID_NDK_r10e is not set"; exit 1; } - -export GITHUB_USER_PASSWORD - -THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` - -cd "${THIS_SCRIPT_DIR}/../../.." - -# First toolchain will run clean -PROJECT_DIR=examples/GTest TOOLCHAIN=default ./jenkins.py --verbose --clear-except-download - -# { -export TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon -PROJECT_DIR=examples/qt-widgets ./jenkins.py --verbose --clear-except-download -PROJECT_DIR=examples/qt-camera ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-location ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-qml ./jenkins.py --verbose --upload --nocreate -# } - -# { -export TOOLCHAIN=gcc-4-8 -PROJECT_DIR=examples/qt-widgets ./jenkins.py --verbose --clear-except-download -PROJECT_DIR=examples/qt-camera ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-location ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-qml ./jenkins.py --verbose --upload --nocreate -# } - -# { -export TOOLCHAIN=clang-libstdcxx -PROJECT_DIR=examples/qt-widgets ./jenkins.py --verbose --clear-except-download -PROJECT_DIR=examples/qt-camera ./jenkins.py --verbose --nocreate -# PROJECT_DIR=examples/qt-location ./jenkins.py --verbose --nocreate # Broken (see .travis.yml) -PROJECT_DIR=examples/qt-qml ./jenkins.py --verbose --upload --nocreate -# } - -echo "Done" diff --git a/maintenance/local-upload/qt/run-osx.sh b/maintenance/local-upload/qt/run-osx.sh deleted file mode 100755 index c6a355aa5..000000000 --- a/maintenance/local-upload/qt/run-osx.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -e - -set -x - -[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } -[ "${ANDROID_NDK_r10e}" = "" ] && { echo "ANDROID_NDK_r10e is not set"; exit 1; } - -export GITHUB_USER_PASSWORD - -THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` - -cd "${THIS_SCRIPT_DIR}/../../.." - -# Xcode 6.1 for Travis -export DEVELOPER_DIR=${IOS_8_1_DEVELOPER_DIR} -export PATH=${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH - -which clang -which clang++ - -# First toolchain will run clean -PROJECT_DIR=examples/GTest TOOLCHAIN=default ./jenkins.py --verbose --clear-except - -# { -export TOOLCHAIN=osx-10-10-dep-10-9-make # same as 'libcxx' on Travis -PROJECT_DIR=examples/qt-widgets ./jenkins.py --verbose --clear-except-download -PROJECT_DIR=examples/qt-camera ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-location ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-qml ./jenkins.py --verbose --upload --nocreate -# } - -# { -export TOOLCHAIN=osx-10-9 -PROJECT_DIR=examples/qt-widgets ./jenkins.py --verbose --clear-except-download -PROJECT_DIR=examples/qt-camera ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-location ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-qml ./jenkins.py --verbose --upload --nocreate -# } - -# Xcode 7.3 for iOS 9.3 -export DEVELOPER_DIR=${IOS_9_3_DEVELOPER_DIR} -export PATH=${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH - -which clang -which clang++ - -# { -export TOOLCHAIN=ios-nocodesign-9-3-wo-armv7s -PROJECT_DIR=examples/qt-widgets ./jenkins.py --verbose --clear-except-download -PROJECT_DIR=examples/qt-camera ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-location ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-qml ./jenkins.py --verbose --upload --nocreate -# } - -# { -export TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon -PROJECT_DIR=examples/qt-widgets ./jenkins.py --verbose --clear-except-download -PROJECT_DIR=examples/qt-camera ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-location ./jenkins.py --verbose --nocreate -PROJECT_DIR=examples/qt-qml ./jenkins.py --verbose --upload --nocreate -# } - -echo "Done" diff --git a/maintenance/local-upload/qt/run-win.bat b/maintenance/local-upload/qt/run-win.bat deleted file mode 100644 index c747acb76..000000000 --- a/maintenance/local-upload/qt/run-win.bat +++ /dev/null @@ -1,55 +0,0 @@ -REM { -set TOOLCHAIN=vs-14-2015-sdk-8-1 -set PROJECT_DIR=examples/qt-widgets -.\jenkins.py --verbose --clear-except-download || exit /b 1 -set PROJECT_DIR=examples/qt-core -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-qml -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-location -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-camera -.\jenkins.py --verbose --upload --nocreate || exit /b 1 -REM } - -REM { -set TOOLCHAIN=vs-12-2013 -set PROJECT_DIR=examples/qt-widgets -.\jenkins.py --verbose --clear-except-download || exit /b 1 -set PROJECT_DIR=examples/qt-core -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-qml -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-location -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-camera -.\jenkins.py --verbose --upload --nocreate || exit /b 1 -REM } - -REM { -set TOOLCHAIN=vs-12-2013-win64 -set PROJECT_DIR=examples/qt-widgets -.\jenkins.py --verbose --clear-except-download || exit /b 1 -set PROJECT_DIR=examples/qt-core -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-qml -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-location -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-camera -.\jenkins.py --verbose --upload --nocreate || exit /b 1 -REM } - -REM { -set TOOLCHAIN=mingw -set PROJECT_DIR=examples/qt-widgets -.\jenkins.py --verbose --clear-except-download || exit /b 1 -set PROJECT_DIR=examples/qt-core -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-qml -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-location -.\jenkins.py --verbose --nocreate || exit /b 1 -set PROJECT_DIR=examples/qt-camera -.\jenkins.py --verbose --upload --nocreate || exit /b 1 -REM } diff --git a/maintenance/upload-cache-to-github.py b/maintenance/upload-cache-to-github.py deleted file mode 100755 index 245ba27d0..000000000 --- a/maintenance/upload-cache-to-github.py +++ /dev/null @@ -1,479 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import base64 -import hashlib -import json -import os -import requests -import sys -import time - -def sleep_time(attempt): - if attempt <= 0: - raise Exception('Unexpected') - if attempt == 1: - return 0 - if attempt == 2: - return 15 - if attempt == 3: - return 60 - if attempt == 4: - return 90 - if attempt == 5: - return 300 - return 1200 - -def retry(func_in): - def func_out(*args, **kwargs): - retry_max = 10 - i = 0 - while True: - i = i + 1 - try: - return func_in(*args, **kwargs) - except Exception as exc: - if i > retry_max: - raise exc - print('Operation failed. Exception:\n {}'.format(exc)) - sec = sleep_time(i) - print('Retry #{} (of {}) after {} seconds'.format(i, retry_max, sec)) - time.sleep(sec) - raise Exception('Unreachable') - return func_out - -# http://stackoverflow.com/a/16696317/2288008 -@retry -def download_file(url, local_file, auth, chunk_size=1024): - print('Downloading:\n {}\n -> {}'.format(url, local_file)) - r = requests.get(url, stream=True, auth=auth) - if not r.ok: - raise Exception('Downloading failed') - with open(local_file, 'wb') as f: - for chunk in r.iter_content(chunk_size=chunk_size): - if chunk: - f.write(chunk) - -class Github: - def __init__(self, username, password, repo_owner, repo): - self.repo_owner = repo_owner - self.repo = repo - self.auth = requests.auth.HTTPBasicAuth(username, password) - self.simple_request() - - @retry - def simple_request(self): - r = requests.get('https://api.github.com', auth=self.auth) - if not r.ok: - sys.exit('Simple request fails. Check your password.') - - limit = int(r.headers['X-RateLimit-Remaining']) - print('GitHub Limit: {}'.format(limit)) - if limit == 0: - raise Exception('GitHub limit is 0') - - @retry - def get_release_by_tag(self, tagname): - print('Get release-id by tag `{}`'.format(tagname)) - # https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name - # GET /repos/:owner/:repo/releases/tags/:tag - - url = 'https://api.github.com/repos/{}/{}/releases/tags/{}'.format( - self.repo_owner, - self.repo, - tagname - ) - - r = requests.get(url, auth=self.auth) - if not r.ok: - raise Exception('Get tag id failed. Requested url: {}'.format(url)) - - return r.json()['id'] - - @retry - def find_asset_id_by_name(self, release_id, name): - # https://developer.github.com/v3/repos/releases/#list-assets-for-a-release - # GET /repos/:owner/:repo/releases/:id/assets - - page_number = 1 - keep_searching = True - - while keep_searching: - url = 'https://api.github.com/repos/{}/{}/releases/{}/assets?page={}'.format( - self.repo_owner, - self.repo, - release_id, - page_number - ) - - print('Requesting URL: {}'.format(url)) - r = requests.get(url, auth=self.auth) - if not r.ok: - raise Exception('Getting list of assets failed. Requested url: {}'.format(url)) - - json = r.json() - - for x in json: - if name == x['name']: - return x['id'] - - if not json: - keep_searching = False - - page_number = page_number + 1 - - return None - - @retry - def delete_asset_by_id(self, asset_id, asset_name): - # https://developer.github.com/v3/repos/releases/#delete-a-release-asset - # DELETE /repos/:owner/:repo/releases/assets/:id - - url = 'https://api.github.com/repos/{}/{}/releases/assets/{}'.format( - self.repo_owner, - self.repo, - asset_id - ) - - r = requests.delete(url, auth=self.auth) - if r.status_code == 204: - print('Asset removed: {}'.format(asset_name)) - else: - raise Exception('Deletion of asset failed: {}'.format(asset_name)) - - def delete_asset_if_exists(self, release_id, asset_name): - asset_id = self.find_asset_id_by_name(release_id, asset_name) - if not asset_id: - print('Asset not exists: {}'.format(asset_name)) - return - self.delete_asset_by_id(asset_id, asset_name) - - def upload_bzip_once(self, url, local_path): - headers = {'Content-Type': 'application/x-bzip2'} - file_to_upload = open(local_path, 'rb') - r = requests.post(url, data=file_to_upload, headers=headers, auth=self.auth) - if not r.ok: - raise Exception('Upload of file failed') - - @retry - def upload_bzip(self, url, local_path, release_id, asset_name): - print('Uploading:\n {}\n -> {}'.format(local_path, url)) - try: - self.upload_bzip_once(url, local_path) - except Exception as exc: - self.delete_asset_if_exists(release_id, asset_name) - raise exc - - def upload_raw_file(self, local_path): - tagname = 'cache' - release_id = self.get_release_by_tag(tagname) - - # https://developer.github.com/v3/repos/releases/#upload-a-release-asset - # POST https:///repos/:owner/:repo/releases/:id/assets?name=foo.zip - - asset_name = hashlib.sha1(open(local_path, 'rb').read()).hexdigest() - asset_name = asset_name + '.tar.bz2' - - url = 'https://uploads.github.com/repos/{}/{}/releases/{}/assets?name={}'.format( - self.repo_owner, - self.repo, - release_id, - asset_name - ) - - self.upload_bzip(url, local_path, release_id, asset_name) - - @retry - def create_new_file(self, local_path, github_path): - # https://developer.github.com/v3/repos/contents/#create-a-file - # PUT /repos/:owner/:repo/contents/:path - - message = 'Uploading cache info\n\n' - message += 'Create file: {}\n\n'.format(github_path) - - env_list = [] - job_url = '' - - if os.getenv('TRAVIS') == 'true': - # * https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables - message += 'Travis:\n' - job_url = 'https://travis-ci.org/{}/jobs/{}'.format( - os.getenv('TRAVIS_REPO_SLUG'), - os.getenv('TRAVIS_JOB_ID') - ) - - env_list += [ - 'TRAVIS_BRANCH', - 'TRAVIS_BUILD_ID', - 'TRAVIS_BUILD_NUMBER', - 'TRAVIS_JOB_ID', - 'TRAVIS_JOB_NUMBER', - 'TRAVIS_OS_NAME', - 'TRAVIS_REPO_SLUG' - ] - - if os.getenv('APPVEYOR') == 'True': - # * http://www.appveyor.com/docs/environment-variables - message += 'AppVeyor:\n' - job_url = 'https://ci.appveyor.com/project/{}/{}/build/{}/job/{}'.format( - os.getenv('APPVEYOR_ACCOUNT_NAME'), - os.getenv('APPVEYOR_PROJECT_SLUG'), - os.getenv('APPVEYOR_BUILD_VERSION'), - os.getenv('APPVEYOR_JOB_ID') - ) - env_list += [ - 'APPVEYOR_ACCOUNT_NAME', - 'APPVEYOR_PROJECT_ID', - 'APPVEYOR_PROJECT_NAME', - 'APPVEYOR_PROJECT_SLUG', - 'APPVEYOR_BUILD_ID', - 'APPVEYOR_BUILD_NUMBER', - 'APPVEYOR_BUILD_VERSION', - 'APPVEYOR_JOB_ID', - 'APPVEYOR_JOB_NAME', - 'APPVEYOR_REPO_BRANCH' - ] - - # Store some info about build - for env_name in env_list: - env_value = os.getenv(env_name) - if env_value: - message += ' {}: {}\n'.format(env_name, env_value) - - if job_url: - message += '\n Job URL: {}\n'.format(job_url) - - url = 'https://api.github.com/repos/{}/{}/contents/{}'.format( - self.repo_owner, - self.repo, - github_path - ) - - content = base64.b64encode(open(local_path, 'rb').read()).decode() - - put_data = { - 'message': message, - 'content': content - } - - r = requests.put(url, data = json.dumps(put_data), auth=self.auth) - if not r.ok: - print('Put failed. Status code: {}'.format(r.status_code)) - if r.status_code == 409: - raise Exception('Unavailable repository') - return r.ok - -class CacheEntry: - def __init__(self, cache_done_path, cache_dir, temp_dir): - self.cache_dir = cache_dir - self.temp_dir = temp_dir - self.cache_raw = os.path.join(self.cache_dir, 'raw') - self.cache_meta = os.path.join(self.cache_dir, 'meta') - self.cache_done_path = cache_done_path - if not os.path.exists(cache_done_path): - raise Exception('File not exists: {}'.format(cache_done_path)) - self.cache_done_dir = os.path.dirname(self.cache_done_path) - self.from_server = os.path.join(self.cache_done_dir, 'from.server') - self.cache_sha1 = os.path.join(self.cache_done_dir, 'cache.sha1') - - self.internal_deps_id = os.path.split(self.cache_done_dir)[0] - self.type_id = os.path.split(self.internal_deps_id)[0] - self.args_id = os.path.split(self.type_id)[0] - self.archive_id = os.path.split(self.args_id)[0] - self.version = os.path.split(self.archive_id)[0] - self.component = os.path.split(self.version)[0] - if os.path.split(self.component)[1].startswith('__'): - self.package = os.path.split(self.component)[0] - else: - self.package = self.component - self.component = '' - self.toolchain_id = os.path.split(self.package)[0] - meta = os.path.split(self.toolchain_id)[0] - assert(meta == self.cache_meta) - - def entry_from_server(self): - return os.path.exists(self.from_server) - - def upload_raw(self, github): - sha1 = open(self.cache_sha1, 'r').read() - raw = os.path.join(self.cache_raw, sha1 + '.tar.bz2') - github.upload_raw_file(raw) - - def upload_meta(self, github, cache_done): - self.upload_files_from_common_dir(github, self.cache_done_dir, cache_done) - self.upload_files_from_common_dir(github, self.internal_deps_id, cache_done) - self.upload_files_from_common_dir(github, self.type_id, cache_done) - self.upload_files_from_common_dir(github, self.args_id, cache_done) - self.upload_files_from_common_dir(github, self.archive_id, cache_done) - self.upload_files_from_common_dir(github, self.version, cache_done, check_is_empty=True) - if self.component != '': - self.upload_files_from_common_dir(github, self.component, cache_done, check_is_empty=True) - self.upload_files_from_common_dir(github, self.package, cache_done, check_is_empty=True) - self.upload_files_from_common_dir(github, self.toolchain_id, cache_done) - - def upload_files_from_common_dir(self, github, dir_path, cache_done, check_is_empty=False): - to_upload = [] - for i in os.listdir(dir_path): - if i == 'cmake.lock': - continue - if i == 'DONE': - continue - done_file = (i == 'CACHE.DONE') or (i == 'basic-deps.DONE') - if done_file and not cache_done: - continue - if not done_file and cache_done: - continue - i_fullpath = os.path.join(dir_path, i) - if os.path.isfile(i_fullpath): - to_upload.append(i_fullpath) - if not cache_done: - if check_is_empty and len(to_upload) != 0: - raise Exception('Expected no files in directory: {}'.format(dir_path)) - if not check_is_empty and len(to_upload) == 0: - raise Exception('No files found in directory: {}'.format(dir_path)) - for i in to_upload: - relative_path = i[len(self.cache_meta)+1:] - relative_unix_path = relative_path.replace('\\', '/') # convert windows path - expected_download_url = 'https://raw.githubusercontent.com/{}/{}/master/{}'.format( - github.repo_owner, - github.repo, - relative_unix_path - ) - github_url = 'https://github.com/{}/{}/blob/master/{}'.format( - github.repo_owner, - github.repo, - relative_unix_path - ) - print('Uploading file: {}'.format(relative_path)) - ok = github.create_new_file(i, relative_unix_path) - if not ok: - print('Already exist') - temp_file = os.path.join(self.temp_dir, '__TEMP.FILE') - download_file(expected_download_url, temp_file, github.auth) - expected_content = open(i, 'rb').read() - downloaded_content = open(temp_file, 'rb').read() - expected_hash = hashlib.sha1(expected_content).hexdigest() - downloaded_hash = hashlib.sha1(downloaded_content).hexdigest() - os.remove(temp_file) - if expected_hash != downloaded_hash: - print('Hash mismatch:') - print( - ' expected {} (content: {})'.format( - expected_hash, expected_content - ) - ) - print( - ' downloaded {} (content: {})'.format( - downloaded_hash, downloaded_content - ) - ) - print('GitHub link: {}'.format(github_url)) - raise Exception('Hash mismatch') - -class Cache: - def __init__(self, cache_dir, temp_dir): - self.entries = self.create_entries(cache_dir, temp_dir) - self.remove_entries_from_server() - if not os.path.exists(temp_dir): - os.makedirs(temp_dir) - - def create_entries(self, cache_dir, temp_dir): - print('Searching for CACHE.DONE files in directory:\n {}\n'.format(cache_dir)) - entries = [] - for root, dirs, files in os.walk(cache_dir): - for filename in files: - if filename == 'CACHE.DONE': - entries.append(CacheEntry(os.path.join(root, filename), cache_dir, temp_dir)) - print('Found {} files:'.format(len(entries))) - for i in entries: - print(' {}'.format(i.cache_done_path)) - print('') - return entries - - def remove_entries_from_server(self): - new_entries = [] - for i in self.entries: - if i.entry_from_server(): - print('Remove entry (from server):\n {}'.format(i.cache_done_path)) - else: - new_entries.append(i) - self.entries = new_entries - - def upload_raw(self, github): - for i in self.entries: - i.upload_raw(github) - - def upload_meta(self, github, cache_done): - for i in self.entries: - i.upload_meta(github, cache_done) - -parser = argparse.ArgumentParser( - description='Script for uploading Hunter cache files to GitHub' -) - -parser.add_argument( - '--username', - required=True, - help='Username' -) - -parser.add_argument( - '--repo-owner', - required=True, - help='Repository owner' -) - -parser.add_argument( - '--repo', - required=True, - help='Repository name' -) - -parser.add_argument( - '--cache-dir', - required=True, - help='Hunter cache directory, e.g. /home/user/.hunter/_Base/Cache' -) - -parser.add_argument( - '--temp-dir', - required=True, - help='Temporary directory where files will be downloaded for verification' -) - -parser.add_argument( - '--skip-raw', action='store_true', help="Skip uploading of raw files" -) - -args = parser.parse_args() - -cache_dir = os.path.normpath(args.cache_dir) - -if not os.path.isdir(cache_dir): - raise Exception('Not a directory: {}'.format(cache_dir)) - -if os.path.split(cache_dir)[1] != 'Cache': - raise Exception('Cache directory path should ends with Cache: {}'.format(cache_dir)) - -cache = Cache(cache_dir, args.temp_dir) - -password = os.getenv('GITHUB_USER_PASSWORD') - -if password == '' or password is None: - raise Exception('Expected GITHUB_USER_PASSWORD environment variable') - -github = Github( - username = args.username, - password = password, - repo_owner = args.repo_owner, - repo = args.repo -) - -if args.skip_raw: - print('*** WARNING *** Skip uploading of raw files') -else: - cache.upload_raw(github) - -cache.upload_meta(github, cache_done=False) -print('Uploading DONE files') -cache.upload_meta(github, cache_done=True) # Should be last diff --git a/scripts/ShowPredefined.cpp b/scripts/ShowPredefined.cpp index bbf69d5f4..6f9977bee 100644 --- a/scripts/ShowPredefined.cpp +++ b/scripts/ShowPredefined.cpp @@ -87,6 +87,10 @@ # pragma message(HUNTER_INFO(_COMPILER_VERSION)) #endif +#if defined(_CONTROL_FLOW_GUARD) +# pragma message(HUNTER_INFO(_CONTROL_FLOW_GUARD)) +#endif + #if defined(_CPPLIB_VER) # pragma message(HUNTER_INFO(_CPPLIB_VER)) #endif @@ -123,6 +127,14 @@ # pragma message(HUNTER_INFO(_INTEGRAL_MAX_BITS)) #endif +#if defined(_ISO_VOLATILE) +# pragma message(HUNTER_INFO(_ISO_VOLATILE)) +#endif + +#if defined(_KERNEL_MODE) +# pragma message(HUNTER_INFO(_KERNEL_MODE)) +#endif + #if defined(_LIBCPP_HAS_NO_ASAN) # pragma message(HUNTER_INFO(_LIBCPP_HAS_NO_ASAN)) #endif @@ -191,6 +203,10 @@ # pragma message(HUNTER_INFO(_MSC_VER)) #endif +#if defined(_MSVC_LANG) +# pragma message(HUNTER_INFO(_MSVC_LANG)) +#endif + #if defined(_MT) # pragma message(HUNTER_INFO(_MT)) #endif @@ -207,6 +223,14 @@ # pragma message(HUNTER_INFO(_M_ARM)) #endif +#if defined(_M_ARM64) +# pragma message(HUNTER_INFO(_M_ARM64)) +#endif + +#if defined(_M_ARM_ARMV7VE) +# pragma message(HUNTER_INFO(_M_ARM_ARMV7VE)) +#endif + #if defined(_M_ARM_FP) # pragma message(HUNTER_INFO(_M_ARM_FP)) #endif @@ -223,6 +247,22 @@ # pragma message(HUNTER_INFO(_M_CEE_SAFE)) #endif +#if defined(_M_FP_EXCEPT) +# pragma message(HUNTER_INFO(_M_FP_EXCEPT)) +#endif + +#if defined(_M_FP_FAST) +# pragma message(HUNTER_INFO(_M_FP_FAST)) +#endif + +#if defined(_M_FP_PRECISE) +# pragma message(HUNTER_INFO(_M_FP_PRECISE)) +#endif + +#if defined(_M_FP_STRICT) +# pragma message(HUNTER_INFO(_M_FP_STRICT)) +#endif + #if defined(_M_IA64) # pragma message(HUNTER_INFO(_M_IA64)) #endif @@ -283,6 +323,10 @@ # pragma message(HUNTER_INFO(_POWER)) #endif +#if defined(_PREFAST_) +# pragma message(HUNTER_INFO(_PREFAST_)) +#endif + #if defined(_R3000) # pragma message(HUNTER_INFO(_R3000)) #endif @@ -339,6 +383,10 @@ # pragma message(HUNTER_INFO(_WIN64)) #endif +#if defined(_WINRT_DLL) +# pragma message(HUNTER_INFO(_WINRT_DLL)) +#endif + #if defined(_Wp64) # pragma message(HUNTER_INFO(_Wp64)) #endif @@ -375,6 +423,26 @@ # pragma message(HUNTER_INFO(__AARCH64_SIMD__)) #endif +#if defined(__ACCUM_EPSILON__) +# pragma message(HUNTER_INFO(__ACCUM_EPSILON__)) +#endif + +#if defined(__ACCUM_FBIT__) +# pragma message(HUNTER_INFO(__ACCUM_FBIT__)) +#endif + +#if defined(__ACCUM_IBIT__) +# pragma message(HUNTER_INFO(__ACCUM_IBIT__)) +#endif + +#if defined(__ACCUM_MAX__) +# pragma message(HUNTER_INFO(__ACCUM_MAX__)) +#endif + +#if defined(__ACCUM_MIN__) +# pragma message(HUNTER_INFO(__ACCUM_MIN__)) +#endif + #if defined(__ALTIVEC__) # pragma message(HUNTER_INFO(__ALTIVEC__)) #endif @@ -411,6 +479,10 @@ # pragma message(HUNTER_INFO(__ARMEL__)) #endif +#if defined(__ARM_32BIT_STATE) +# pragma message(HUNTER_INFO(__ARM_32BIT_STATE)) +#endif + #if defined(__ARM_64BIT_STATE) # pragma message(HUNTER_INFO(__ARM_64BIT_STATE)) #endif @@ -443,10 +515,22 @@ # pragma message(HUNTER_INFO(__ARM_ARCH_ISA_A64)) #endif +#if defined(__ARM_ARCH_ISA_ARM) +# pragma message(HUNTER_INFO(__ARM_ARCH_ISA_ARM)) +#endif + +#if defined(__ARM_ARCH_ISA_THUMB) +# pragma message(HUNTER_INFO(__ARM_ARCH_ISA_THUMB)) +#endif + #if defined(__ARM_ARCH_PROFILE) # pragma message(HUNTER_INFO(__ARM_ARCH_PROFILE)) #endif +#if defined(__ARM_ASM_SYNTAX_UNIFIED__) +# pragma message(HUNTER_INFO(__ARM_ASM_SYNTAX_UNIFIED__)) +#endif + #if defined(__ARM_EABI__) # pragma message(HUNTER_INFO(__ARM_EABI__)) #endif @@ -463,10 +547,30 @@ # pragma message(HUNTER_INFO(__ARM_FEATURE_DIV)) #endif +#if defined(__ARM_FEATURE_DSP) +# pragma message(HUNTER_INFO(__ARM_FEATURE_DSP)) +#endif + #if defined(__ARM_FEATURE_FMA) # pragma message(HUNTER_INFO(__ARM_FEATURE_FMA)) #endif +#if defined(__ARM_FEATURE_LDREX) +# pragma message(HUNTER_INFO(__ARM_FEATURE_LDREX)) +#endif + +#if defined(__ARM_FEATURE_QBIT) +# pragma message(HUNTER_INFO(__ARM_FEATURE_QBIT)) +#endif + +#if defined(__ARM_FEATURE_SAT) +# pragma message(HUNTER_INFO(__ARM_FEATURE_SAT)) +#endif + +#if defined(__ARM_FEATURE_SIMD32) +# pragma message(HUNTER_INFO(__ARM_FEATURE_SIMD32)) +#endif + #if defined(__ARM_FEATURE_UNALIGNED) # pragma message(HUNTER_INFO(__ARM_FEATURE_UNALIGNED)) #endif @@ -495,6 +599,10 @@ # pragma message(HUNTER_INFO(__ARM_PCS_AAPCS64)) #endif +#if defined(__ARM_PCS_VFP) +# pragma message(HUNTER_INFO(__ARM_PCS_VFP)) +#endif + #if defined(__ARM_SIZEOF_MINIMAL_ENUM) # pragma message(HUNTER_INFO(__ARM_SIZEOF_MINIMAL_ENUM)) #endif @@ -543,6 +651,10 @@ # pragma message(HUNTER_INFO(__ATOMIC_SEQ_CST)) #endif +#if defined(__ATOM__) +# pragma message(HUNTER_INFO(__ATOM__)) +#endif + #if defined(__AVX2__) # pragma message(HUNTER_INFO(__AVX2__)) #endif @@ -599,6 +711,10 @@ # pragma message(HUNTER_INFO(__CHAR_BIT__)) #endif +#if defined(__CHAR_UNSIGNED__) +# pragma message(HUNTER_INFO(__CHAR_UNSIGNED__)) +#endif + #if defined(__CLR_VER) # pragma message(HUNTER_INFO(__CLR_VER)) #endif @@ -643,6 +759,14 @@ # pragma message(HUNTER_INFO(__CYGWIN__)) #endif +#if defined(__DA_FBIT__) +# pragma message(HUNTER_INFO(__DA_FBIT__)) +#endif + +#if defined(__DA_IBIT__) +# pragma message(HUNTER_INFO(__DA_IBIT__)) +#endif + #if defined(__DBL_DECIMAL_DIG__) # pragma message(HUNTER_INFO(__DBL_DECIMAL_DIG__)) #endif @@ -823,6 +947,14 @@ # pragma message(HUNTER_INFO(__DMC__)) #endif +#if defined(__DQ_FBIT__) +# pragma message(HUNTER_INFO(__DQ_FBIT__)) +#endif + +#if defined(__DQ_IBIT__) +# pragma message(HUNTER_INFO(__DQ_IBIT__)) +#endif + #if defined(__DYNAMIC__) # pragma message(HUNTER_INFO(__DYNAMIC__)) #endif @@ -935,6 +1067,38 @@ # pragma message(HUNTER_INFO(__FMA__)) #endif +#if defined(__FP_FAST_FMA) +# pragma message(HUNTER_INFO(__FP_FAST_FMA)) +#endif + +#if defined(__FP_FAST_FMAF) +# pragma message(HUNTER_INFO(__FP_FAST_FMAF)) +#endif + +#if defined(__FP_FAST_FMAL) +# pragma message(HUNTER_INFO(__FP_FAST_FMAL)) +#endif + +#if defined(__FRACT_EPSILON__) +# pragma message(HUNTER_INFO(__FRACT_EPSILON__)) +#endif + +#if defined(__FRACT_FBIT__) +# pragma message(HUNTER_INFO(__FRACT_FBIT__)) +#endif + +#if defined(__FRACT_IBIT__) +# pragma message(HUNTER_INFO(__FRACT_IBIT__)) +#endif + +#if defined(__FRACT_MAX__) +# pragma message(HUNTER_INFO(__FRACT_MAX__)) +#endif + +#if defined(__FRACT_MIN__) +# pragma message(HUNTER_INFO(__FRACT_MIN__)) +#endif + #if defined(__FUNCDNAME__) # pragma message(HUNTER_INFO(__FUNCDNAME__)) #endif @@ -1067,6 +1231,14 @@ # pragma message(HUNTER_INFO(__GNUC_GNU_INLINE__)) #endif +#if defined(__GNUC_LIBSTD_MINOR__) +# pragma message(HUNTER_INFO(__GNUC_LIBSTD_MINOR__)) +#endif + +#if defined(__GNUC_LIBSTD__) +# pragma message(HUNTER_INFO(__GNUC_LIBSTD__)) +#endif + #if defined(__GNUC_MINOR__) # pragma message(HUNTER_INFO(__GNUC_MINOR__)) #endif @@ -1103,6 +1275,10 @@ # pragma message(HUNTER_INFO(__GXX_RTTI)) #endif +#if defined(__GXX_TYPEINFO_EQUALITY_INLINE) +# pragma message(HUNTER_INFO(__GXX_TYPEINFO_EQUALITY_INLINE)) +#endif + #if defined(__GXX_WEAK__) # pragma message(HUNTER_INFO(__GXX_WEAK__)) #endif @@ -1111,6 +1287,14 @@ # pragma message(HUNTER_INFO(__HAIKU__)) #endif +#if defined(__HA_FBIT__) +# pragma message(HUNTER_INFO(__HA_FBIT__)) +#endif + +#if defined(__HA_IBIT__) +# pragma message(HUNTER_INFO(__HA_IBIT__)) +#endif + #if defined(__HIGHC__) # pragma message(HUNTER_INFO(__HIGHC__)) #endif @@ -1131,6 +1315,14 @@ # pragma message(HUNTER_INFO(__HP_aCC)) #endif +#if defined(__HQ_FBIT__) +# pragma message(HUNTER_INFO(__HQ_FBIT__)) +#endif + +#if defined(__HQ_IBIT__) +# pragma message(HUNTER_INFO(__HQ_IBIT__)) +#endif + #if defined(__I86__) # pragma message(HUNTER_INFO(__I86__)) #endif @@ -1315,6 +1507,26 @@ # pragma message(HUNTER_INFO(__KCC)) #endif +#if defined(__LACCUM_EPSILON__) +# pragma message(HUNTER_INFO(__LACCUM_EPSILON__)) +#endif + +#if defined(__LACCUM_FBIT__) +# pragma message(HUNTER_INFO(__LACCUM_FBIT__)) +#endif + +#if defined(__LACCUM_IBIT__) +# pragma message(HUNTER_INFO(__LACCUM_IBIT__)) +#endif + +#if defined(__LACCUM_MAX__) +# pragma message(HUNTER_INFO(__LACCUM_MAX__)) +#endif + +#if defined(__LACCUM_MIN__) +# pragma message(HUNTER_INFO(__LACCUM_MIN__)) +#endif + #if defined(__LDBL_DENORM_MIN__) # pragma message(HUNTER_INFO(__LDBL_DENORM_MIN__)) #endif @@ -1367,6 +1579,26 @@ # pragma message(HUNTER_INFO(__LDBL_MIN__)) #endif +#if defined(__LFRACT_EPSILON__) +# pragma message(HUNTER_INFO(__LFRACT_EPSILON__)) +#endif + +#if defined(__LFRACT_FBIT__) +# pragma message(HUNTER_INFO(__LFRACT_FBIT__)) +#endif + +#if defined(__LFRACT_IBIT__) +# pragma message(HUNTER_INFO(__LFRACT_IBIT__)) +#endif + +#if defined(__LFRACT_MAX__) +# pragma message(HUNTER_INFO(__LFRACT_MAX__)) +#endif + +#if defined(__LFRACT_MIN__) +# pragma message(HUNTER_INFO(__LFRACT_MIN__)) +#endif + #if defined(__LIBCOMO__) # pragma message(HUNTER_INFO(__LIBCOMO__)) #endif @@ -1383,6 +1615,46 @@ # pragma message(HUNTER_INFO(__LITTLE_ENDIAN__)) #endif +#if defined(__LLACCUM_EPSILON__) +# pragma message(HUNTER_INFO(__LLACCUM_EPSILON__)) +#endif + +#if defined(__LLACCUM_FBIT__) +# pragma message(HUNTER_INFO(__LLACCUM_FBIT__)) +#endif + +#if defined(__LLACCUM_IBIT__) +# pragma message(HUNTER_INFO(__LLACCUM_IBIT__)) +#endif + +#if defined(__LLACCUM_MAX__) +# pragma message(HUNTER_INFO(__LLACCUM_MAX__)) +#endif + +#if defined(__LLACCUM_MIN__) +# pragma message(HUNTER_INFO(__LLACCUM_MIN__)) +#endif + +#if defined(__LLFRACT_EPSILON__) +# pragma message(HUNTER_INFO(__LLFRACT_EPSILON__)) +#endif + +#if defined(__LLFRACT_FBIT__) +# pragma message(HUNTER_INFO(__LLFRACT_FBIT__)) +#endif + +#if defined(__LLFRACT_IBIT__) +# pragma message(HUNTER_INFO(__LLFRACT_IBIT__)) +#endif + +#if defined(__LLFRACT_MAX__) +# pragma message(HUNTER_INFO(__LLFRACT_MAX__)) +#endif + +#if defined(__LLFRACT_MIN__) +# pragma message(HUNTER_INFO(__LLFRACT_MIN__)) +#endif + #if defined(__LONG_LONG_MAX__) # pragma message(HUNTER_INFO(__LONG_LONG_MAX__)) #endif @@ -1567,6 +1839,10 @@ # pragma message(HUNTER_INFO(__PIC__)) #endif +#if defined(__PIE__) +# pragma message(HUNTER_INFO(__PIE__)) +#endif + #if defined(__POINTER_WIDTH__) # pragma message(HUNTER_INFO(__POINTER_WIDTH__)) #endif @@ -1607,6 +1883,14 @@ # pragma message(HUNTER_INFO(__QNX__)) #endif +#if defined(__QQ_FBIT__) +# pragma message(HUNTER_INFO(__QQ_FBIT__)) +#endif + +#if defined(__QQ_IBIT__) +# pragma message(HUNTER_INFO(__QQ_IBIT__)) +#endif + #if defined(__REGISTER_PREFIX__) # pragma message(HUNTER_INFO(__REGISTER_PREFIX__)) #endif @@ -1615,6 +1899,34 @@ # pragma message(HUNTER_INFO(__RISC2_0__)) #endif +#if defined(__SACCUM_EPSILON__) +# pragma message(HUNTER_INFO(__SACCUM_EPSILON__)) +#endif + +#if defined(__SACCUM_FBIT__) +# pragma message(HUNTER_INFO(__SACCUM_FBIT__)) +#endif + +#if defined(__SACCUM_IBIT__) +# pragma message(HUNTER_INFO(__SACCUM_IBIT__)) +#endif + +#if defined(__SACCUM_MAX__) +# pragma message(HUNTER_INFO(__SACCUM_MAX__)) +#endif + +#if defined(__SACCUM_MIN__) +# pragma message(HUNTER_INFO(__SACCUM_MIN__)) +#endif + +#if defined(__SA_FBIT__) +# pragma message(HUNTER_INFO(__SA_FBIT__)) +#endif + +#if defined(__SA_IBIT__) +# pragma message(HUNTER_INFO(__SA_IBIT__)) +#endif + #if defined(__SCHAR_MAX__) # pragma message(HUNTER_INFO(__SCHAR_MAX__)) #endif @@ -1627,6 +1939,26 @@ # pragma message(HUNTER_INFO(__SEG_GS)) #endif +#if defined(__SFRACT_EPSILON__) +# pragma message(HUNTER_INFO(__SFRACT_EPSILON__)) +#endif + +#if defined(__SFRACT_FBIT__) +# pragma message(HUNTER_INFO(__SFRACT_FBIT__)) +#endif + +#if defined(__SFRACT_IBIT__) +# pragma message(HUNTER_INFO(__SFRACT_IBIT__)) +#endif + +#if defined(__SFRACT_MAX__) +# pragma message(HUNTER_INFO(__SFRACT_MAX__)) +#endif + +#if defined(__SFRACT_MIN__) +# pragma message(HUNTER_INFO(__SFRACT_MIN__)) +#endif + #if defined(__SGI_STL) # pragma message(HUNTER_INFO(__SGI_STL)) #endif @@ -1739,6 +2071,14 @@ # pragma message(HUNTER_INFO(__SIZE_WIDTH__)) #endif +#if defined(__SQ_FBIT__) +# pragma message(HUNTER_INFO(__SQ_FBIT__)) +#endif + +#if defined(__SQ_IBIT__) +# pragma message(HUNTER_INFO(__SQ_IBIT__)) +#endif + #if defined(__SSE2_MATH__) # pragma message(HUNTER_INFO(__SSE2_MATH__)) #endif @@ -1783,6 +2123,18 @@ # pragma message(HUNTER_INFO(__SSSE3__)) #endif +#if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__) +# pragma message(HUNTER_INFO(__STDCPP_DEFAULT_NEW_ALIGNMENT__)) +#endif + +#if defined(__STDCPP_STRICT_POINTER_SAFETY__) +# pragma message(HUNTER_INFO(__STDCPP_STRICT_POINTER_SAFETY__)) +#endif + +#if defined(__STDCPP_THREADS__) +# pragma message(HUNTER_INFO(__STDCPP_THREADS__)) +#endif + #if defined(__STDC_HOSTED__) # pragma message(HUNTER_INFO(__STDC_HOSTED__)) #endif @@ -1799,6 +2151,10 @@ # pragma message(HUNTER_INFO(__STDC_ISO_10646__)) #endif +#if defined(__STDC_MB_MIGHT_NEQ_WC__) +# pragma message(HUNTER_INFO(__STDC_MB_MIGHT_NEQ_WC__)) +#endif + #if defined(__STDC_NO_THREADS__) # pragma message(HUNTER_INFO(__STDC_NO_THREADS__)) #endif @@ -1859,6 +2215,14 @@ # pragma message(HUNTER_INFO(__TARGET_LIB__)) #endif +#if defined(__TA_FBIT__) +# pragma message(HUNTER_INFO(__TA_FBIT__)) +#endif + +#if defined(__TA_IBIT__) +# pragma message(HUNTER_INFO(__TA_IBIT__)) +#endif + #if defined(__THUMBEB__) # pragma message(HUNTER_INFO(__THUMBEB__)) #endif @@ -1891,14 +2255,94 @@ # pragma message(HUNTER_INFO(__TOS_WIN__)) #endif +#if defined(__TQ_FBIT__) +# pragma message(HUNTER_INFO(__TQ_FBIT__)) +#endif + +#if defined(__TQ_IBIT__) +# pragma message(HUNTER_INFO(__TQ_IBIT__)) +#endif + #if defined(__TenDRA__) # pragma message(HUNTER_INFO(__TenDRA__)) #endif +#if defined(__UACCUM_EPSILON__) +# pragma message(HUNTER_INFO(__UACCUM_EPSILON__)) +#endif + +#if defined(__UACCUM_FBIT__) +# pragma message(HUNTER_INFO(__UACCUM_FBIT__)) +#endif + +#if defined(__UACCUM_IBIT__) +# pragma message(HUNTER_INFO(__UACCUM_IBIT__)) +#endif + +#if defined(__UACCUM_MAX__) +# pragma message(HUNTER_INFO(__UACCUM_MAX__)) +#endif + +#if defined(__UACCUM_MIN__) +# pragma message(HUNTER_INFO(__UACCUM_MIN__)) +#endif + #if defined(__UCLIBC__) # pragma message(HUNTER_INFO(__UCLIBC__)) #endif +#if defined(__UDA_FBIT__) +# pragma message(HUNTER_INFO(__UDA_FBIT__)) +#endif + +#if defined(__UDA_IBIT__) +# pragma message(HUNTER_INFO(__UDA_IBIT__)) +#endif + +#if defined(__UDQ_FBIT__) +# pragma message(HUNTER_INFO(__UDQ_FBIT__)) +#endif + +#if defined(__UDQ_IBIT__) +# pragma message(HUNTER_INFO(__UDQ_IBIT__)) +#endif + +#if defined(__UFRACT_EPSILON__) +# pragma message(HUNTER_INFO(__UFRACT_EPSILON__)) +#endif + +#if defined(__UFRACT_FBIT__) +# pragma message(HUNTER_INFO(__UFRACT_FBIT__)) +#endif + +#if defined(__UFRACT_IBIT__) +# pragma message(HUNTER_INFO(__UFRACT_IBIT__)) +#endif + +#if defined(__UFRACT_MAX__) +# pragma message(HUNTER_INFO(__UFRACT_MAX__)) +#endif + +#if defined(__UFRACT_MIN__) +# pragma message(HUNTER_INFO(__UFRACT_MIN__)) +#endif + +#if defined(__UHA_FBIT__) +# pragma message(HUNTER_INFO(__UHA_FBIT__)) +#endif + +#if defined(__UHA_IBIT__) +# pragma message(HUNTER_INFO(__UHA_IBIT__)) +#endif + +#if defined(__UHQ_FBIT__) +# pragma message(HUNTER_INFO(__UHQ_FBIT__)) +#endif + +#if defined(__UHQ_IBIT__) +# pragma message(HUNTER_INFO(__UHQ_IBIT__)) +#endif + #if defined(__UINT16_C) # pragma message(HUNTER_INFO(__UINT16_C)) #endif @@ -2031,14 +2475,174 @@ # pragma message(HUNTER_INFO(__UINT_LEAST8_TYPE__)) #endif +#if defined(__ULACCUM_EPSILON__) +# pragma message(HUNTER_INFO(__ULACCUM_EPSILON__)) +#endif + +#if defined(__ULACCUM_FBIT__) +# pragma message(HUNTER_INFO(__ULACCUM_FBIT__)) +#endif + +#if defined(__ULACCUM_IBIT__) +# pragma message(HUNTER_INFO(__ULACCUM_IBIT__)) +#endif + +#if defined(__ULACCUM_MAX__) +# pragma message(HUNTER_INFO(__ULACCUM_MAX__)) +#endif + +#if defined(__ULACCUM_MIN__) +# pragma message(HUNTER_INFO(__ULACCUM_MIN__)) +#endif + +#if defined(__ULFRACT_EPSILON__) +# pragma message(HUNTER_INFO(__ULFRACT_EPSILON__)) +#endif + +#if defined(__ULFRACT_FBIT__) +# pragma message(HUNTER_INFO(__ULFRACT_FBIT__)) +#endif + +#if defined(__ULFRACT_IBIT__) +# pragma message(HUNTER_INFO(__ULFRACT_IBIT__)) +#endif + +#if defined(__ULFRACT_MAX__) +# pragma message(HUNTER_INFO(__ULFRACT_MAX__)) +#endif + +#if defined(__ULFRACT_MIN__) +# pragma message(HUNTER_INFO(__ULFRACT_MIN__)) +#endif + +#if defined(__ULLACCUM_EPSILON__) +# pragma message(HUNTER_INFO(__ULLACCUM_EPSILON__)) +#endif + +#if defined(__ULLACCUM_FBIT__) +# pragma message(HUNTER_INFO(__ULLACCUM_FBIT__)) +#endif + +#if defined(__ULLACCUM_IBIT__) +# pragma message(HUNTER_INFO(__ULLACCUM_IBIT__)) +#endif + +#if defined(__ULLACCUM_MAX__) +# pragma message(HUNTER_INFO(__ULLACCUM_MAX__)) +#endif + +#if defined(__ULLACCUM_MIN__) +# pragma message(HUNTER_INFO(__ULLACCUM_MIN__)) +#endif + +#if defined(__ULLFRACT_EPSILON__) +# pragma message(HUNTER_INFO(__ULLFRACT_EPSILON__)) +#endif + +#if defined(__ULLFRACT_FBIT__) +# pragma message(HUNTER_INFO(__ULLFRACT_FBIT__)) +#endif + +#if defined(__ULLFRACT_IBIT__) +# pragma message(HUNTER_INFO(__ULLFRACT_IBIT__)) +#endif + +#if defined(__ULLFRACT_MAX__) +# pragma message(HUNTER_INFO(__ULLFRACT_MAX__)) +#endif + +#if defined(__ULLFRACT_MIN__) +# pragma message(HUNTER_INFO(__ULLFRACT_MIN__)) +#endif + +#if defined(__UQQ_FBIT__) +# pragma message(HUNTER_INFO(__UQQ_FBIT__)) +#endif + +#if defined(__UQQ_IBIT__) +# pragma message(HUNTER_INFO(__UQQ_IBIT__)) +#endif + +#if defined(__USACCUM_EPSILON__) +# pragma message(HUNTER_INFO(__USACCUM_EPSILON__)) +#endif + +#if defined(__USACCUM_FBIT__) +# pragma message(HUNTER_INFO(__USACCUM_FBIT__)) +#endif + +#if defined(__USACCUM_IBIT__) +# pragma message(HUNTER_INFO(__USACCUM_IBIT__)) +#endif + +#if defined(__USACCUM_MAX__) +# pragma message(HUNTER_INFO(__USACCUM_MAX__)) +#endif + +#if defined(__USACCUM_MIN__) +# pragma message(HUNTER_INFO(__USACCUM_MIN__)) +#endif + +#if defined(__USA_FBIT__) +# pragma message(HUNTER_INFO(__USA_FBIT__)) +#endif + +#if defined(__USA_IBIT__) +# pragma message(HUNTER_INFO(__USA_IBIT__)) +#endif + #if defined(__USER_LABEL_PREFIX__) # pragma message(HUNTER_INFO(__USER_LABEL_PREFIX__)) #endif +#if defined(__USFRACT_EPSILON__) +# pragma message(HUNTER_INFO(__USFRACT_EPSILON__)) +#endif + +#if defined(__USFRACT_FBIT__) +# pragma message(HUNTER_INFO(__USFRACT_FBIT__)) +#endif + +#if defined(__USFRACT_IBIT__) +# pragma message(HUNTER_INFO(__USFRACT_IBIT__)) +#endif + +#if defined(__USFRACT_MAX__) +# pragma message(HUNTER_INFO(__USFRACT_MAX__)) +#endif + +#if defined(__USFRACT_MIN__) +# pragma message(HUNTER_INFO(__USFRACT_MIN__)) +#endif + #if defined(__USING_SJLJ_EXCEPTIONS__) # pragma message(HUNTER_INFO(__USING_SJLJ_EXCEPTIONS__)) #endif +#if defined(__USQ_FBIT__) +# pragma message(HUNTER_INFO(__USQ_FBIT__)) +#endif + +#if defined(__USQ_IBIT__) +# pragma message(HUNTER_INFO(__USQ_IBIT__)) +#endif + +#if defined(__UTA_FBIT__) +# pragma message(HUNTER_INFO(__UTA_FBIT__)) +#endif + +#if defined(__UTA_IBIT__) +# pragma message(HUNTER_INFO(__UTA_IBIT__)) +#endif + +#if defined(__UTQ_FBIT__) +# pragma message(HUNTER_INFO(__UTQ_FBIT__)) +#endif + +#if defined(__UTQ_IBIT__) +# pragma message(HUNTER_INFO(__UTQ_IBIT__)) +#endif + #if defined(__VECTOR4DOUBLE__) # pragma message(HUNTER_INFO(__VECTOR4DOUBLE__)) #endif @@ -2083,6 +2687,10 @@ # pragma message(HUNTER_INFO(__WCHAR_TYPE__)) #endif +#if defined(__WCHAR_UNSIGNED__) +# pragma message(HUNTER_INFO(__WCHAR_UNSIGNED__)) +#endif + #if defined(__WCHAR_WIDTH__) # pragma message(HUNTER_INFO(__WCHAR_WIDTH__)) #endif @@ -2267,6 +2875,10 @@ # pragma message(HUNTER_INFO(__cpp_binary_literals)) #endif +#if defined(__cpp_concepts) +# pragma message(HUNTER_INFO(__cpp_concepts)) +#endif + #if defined(__cpp_constexpr) # pragma message(HUNTER_INFO(__cpp_constexpr)) #endif @@ -2527,6 +3139,10 @@ # pragma message(HUNTER_INFO(__pic__)) #endif +#if defined(__pie__) +# pragma message(HUNTER_INFO(__pie__)) +#endif + #if defined(__powerpc) # pragma message(HUNTER_INFO(__powerpc)) #endif diff --git a/scripts/autotools-merge-lipo.cmake.in b/scripts/autotools-merge-lipo.cmake.in index 9982a1b93..bf55580e5 100644 --- a/scripts/autotools-merge-lipo.cmake.in +++ b/scripts/autotools-merge-lipo.cmake.in @@ -1,6 +1,8 @@ -# Copyright (c) 2015 Ruslan Baratov, Alexandre Pretyman +# Copyright (c) 2015, 2019 Ruslan Baratov, Alexandre Pretyman # All rights reserved. +cmake_minimum_required(VERSION 3.2) + ### Input params check string(COMPARE EQUAL "@multi_arch_install_root@" "" is_empty) @@ -18,6 +20,8 @@ if(is_empty) message(FATAL_ERROR "HUNTER_PACKAGE_INSTALL_PREFIX is empty") endif() +set(unrelocatable "@HUNTER_PACKAGE_UNRELOCATABLE_TEXT_FILES@") + set(ios_architectures @ios_architectures@) set(built_arch_roots) foreach(x ${ios_architectures}) @@ -25,48 +29,62 @@ foreach(x ${ios_architectures}) endforeach() list(LENGTH ios_architectures total_arch_number) - # We work with the first root path: we move everything, except the *.a static # library files into @HUNTER_PACKAGE_INSTALL_PREFIX@, then we lipo the static # libraries together into @HUNTER_PACKAGE_INSTALL_PREFIX@ list(GET built_arch_roots 0 first_built_root) -file(GLOB_RECURSE - binary_files - RELATIVE - "${first_built_root}" - ${first_built_root}/* -) - -file(GLOB_RECURSE - libtool_la_files - RELATIVE - "${first_built_root}" - ${first_built_root}/lib/*.la -) file(GLOB_RECURSE - text_files + header_files RELATIVE "${first_built_root}" ${first_built_root}/include/* ) -# Remove all libtool_la_files from all built roots -foreach(arch ${ios_architectures}) - foreach(file_name ${libtool_la_files}) - file(REMOVE - "@multi_arch_install_root@/${arch}/${file_name}" +# Unify unrelocatable files +foreach(x ${unrelocatable}) + foreach(arch ${ios_architectures}) + set(y "@multi_arch_install_root@/${arch}/${x}") + if(NOT EXISTS "${y}") + message(FATAL_ERROR "File not found: ${y}") + endif() + file(READ "${y}" content) + string( + REPLACE + "@multi_arch_install_root@/${arch}" + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + content + "${content}" ) + file(WRITE "${y}" "${content}") endforeach() endforeach() -# Exclude text files and .la files from binaries list -foreach(x ${libtool_la_files}) - list(REMOVE_ITEM binary_files ${x}) +# Check unrelocatable files +foreach(x ${unrelocatable}) + set(etalon "${first_built_root}/${x}") + foreach(arch ${ios_architectures}) + set(to_check "@multi_arch_install_root@/${arch}/${x}") + file( + DIFFERENT + is_different + FILES "${to_check}" "${etalon}" + ) + if(is_different) + message(FATAL_ERROR "Files differ: ${to_check} ${etalon}") + endif() + endforeach() endforeach() -foreach(x ${text_files}) - list(REMOVE_ITEM binary_files ${x}) +# Move unrelocatable files +foreach(x ${unrelocatable}) + set(etalon "${first_built_root}/${x}") + set(dst "@HUNTER_PACKAGE_INSTALL_PREFIX@/${x}") + file(WRITE "${dst}" "") # for creating missing directories + file(RENAME "${etalon}" "${dst}") + foreach(arch ${ios_architectures}) + file(REMOVE "@multi_arch_install_root@/${arch}/${x}") + endforeach() endforeach() # The preprocessor macros below are from @@ -124,7 +142,6 @@ function(move_one_delete_other file_name) endforeach() endfunction() - # Merge a header file that differed in content when the project was built with # different architectures. Guard its contents with #ifdef #elif to guarantee # that each architecture gets only its file @@ -188,7 +205,7 @@ endfunction() # Compare for differences between files in built_arch_roots # If files are different and are in the include/ directory # they are merged with #ifdef guards -foreach(file_name ${text_files}) +foreach(file_name ${header_files}) get_filename_component(final_dir "@HUNTER_PACKAGE_INSTALL_PREFIX@/${file_name}" DIRECTORY @@ -206,8 +223,23 @@ foreach(file_name ${text_files}) endif() endforeach() +file(GLOB_RECURSE + binary_lib_files + RELATIVE + "${first_built_root}" + "${first_built_root}/lib/*.a" + "${first_built_root}/lib/*.dylib" +) + +file(GLOB_RECURSE + binary_bin_files + RELATIVE + "${first_built_root}" + ${first_built_root}/bin/* +) + # we lipo the libraries into @HUNTER_PACKAGE_INSTALL_PREFIX@ -foreach(x ${binary_files}) +foreach(x ${binary_lib_files} ${binary_bin_files}) # if the dir to put the library in, does not exist, then create it # this is needed or else lipo could fail get_filename_component(dir "@HUNTER_PACKAGE_INSTALL_PREFIX@/${x}" DIRECTORY) @@ -237,6 +269,40 @@ foreach(x ${binary_files}) file(REMOVE ${input_libraries}) endforeach() +file( + GLOB_RECURSE + rest_files + RELATIVE + "${first_built_root}" + ${first_built_root}/* +) + +# All other files should be the same +foreach(x ${rest_files}) + set(etalon "${first_built_root}/${x}") + foreach(arch ${ios_architectures}) + set(to_check "@multi_arch_install_root@/${arch}/${x}") + file( + DIFFERENT + is_different + FILES "${to_check}" "${etalon}" + ) + if(is_different) + message(FATAL_ERROR "Files differ: ${to_check} ${etalon}") + endif() + endforeach() +endforeach() + +foreach(x ${rest_files}) + set(etalon "${first_built_root}/${x}") + set(dst "@HUNTER_PACKAGE_INSTALL_PREFIX@/${x}") + file(WRITE "${dst}" "") # for creating missing directories + file(RENAME "${etalon}" "${dst}") + foreach(arch ${ios_architectures}) + file(REMOVE "@multi_arch_install_root@/${arch}/${x}") + endforeach() +endforeach() + # Check no files left (i.e. all binaries fused by lipo, all headers merged) file(GLOB_RECURSE files_left "@multi_arch_install_root@/*") string(COMPARE EQUAL "${files_left}" "" is_empty) diff --git a/scripts/clear-all.cmake b/scripts/clear-all.cmake index e9d56f1d5..8760a0edd 100644 --- a/scripts/clear-all.cmake +++ b/scripts/clear-all.cmake @@ -11,14 +11,15 @@ unset(ENV{APPLE_INTERNAL_DOCUMENTATION_DIR}) unset(ENV{APPLE_INTERNAL_LIBRARY_DIR}) unset(ENV{APPLE_INTERNAL_TOOLS}) unset(ENV{APPLY_RULES_IN_COPY_FILES}) -unset(ENV{AR}) -unset(ENV{ARCHS}) -unset(ENV{ARCHS_STANDARD}) unset(ENV{ARCHS_STANDARD_32_64_BIT}) unset(ENV{ARCHS_STANDARD_32_BIT}) unset(ENV{ARCHS_STANDARD_64_BIT}) unset(ENV{ARCHS_STANDARD_INCLUDING_64_BIT}) +unset(ENV{ARCHS_STANDARD}) unset(ENV{ARCHS_UNIVERSAL_IPHONE_OS}) +unset(ENV{ARCHS}) +unset(ENV{AR}) +unset(ENV{ASM}) unset(ENV{AVAILABLE_PLATFORMS}) unset(ENV{BUILD_COMPONENTS}) unset(ENV{BUILD_DIR}) @@ -116,6 +117,7 @@ unset(ENV{ICONV}) unset(ENV{INFOPLIST_EXPAND_BUILD_SETTINGS}) unset(ENV{INFOPLIST_OUTPUT_FORMAT}) unset(ENV{INFOPLIST_PREPROCESS}) +unset(ENV{INSTALL}) unset(ENV{INSTALL_DIR}) unset(ENV{INSTALL_GROUP}) unset(ENV{INSTALL_MODE_FLAG}) @@ -301,6 +303,11 @@ unset(ENV{ANDROID_SDK_ROOT}) unset(ENV{ANDROID_API_VERSION}) unset(ENV{ANDROID_HOME}) +# https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-android +unset(ENV{ANDROID_NDK}) +unset(ENV{ANDROID_NDK_ROOT}) +unset(ENV{ANDROID_STANDALONE_TOOLCHAIN}) + # See clear-all.sh for more info { unset(ENV{PKG_CONFIG_PATH}) unset(ENV{PKG_CONFIG_DEBUG_SPEW}) diff --git a/scripts/clear-all.sh b/scripts/clear-all.sh index c1329c7d5..1ec2eb1f1 100755 --- a/scripts/clear-all.sh +++ b/scripts/clear-all.sh @@ -19,6 +19,7 @@ unset ARCHS_STANDARD_32_BIT unset ARCHS_STANDARD_64_BIT unset ARCHS_STANDARD_INCLUDING_64_BIT unset ARCHS_UNIVERSAL_IPHONE_OS +unset ASM unset AVAILABLE_PLATFORMS unset BUILD_COMPONENTS unset BUILD_DIR @@ -116,6 +117,7 @@ unset ICONV unset INFOPLIST_EXPAND_BUILD_SETTINGS unset INFOPLIST_OUTPUT_FORMAT unset INFOPLIST_PREPROCESS +unset INSTALL unset INSTALL_DIR unset INSTALL_GROUP unset INSTALL_MODE_FLAG @@ -303,6 +305,11 @@ unset PKG_CONFIG_ALLOW_SYSTEM_CFLAGS unset PKG_CONFIG_ALLOW_SYSTEM_LIBS unset PKG_CONFIG_SYSROOT_DIR +# https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-android +unset ANDROID_NDK +unset ANDROID_NDK_ROOT +unset ANDROID_STANDALONE_TOOLCHAIN + # This variable should be set to empty. # Example from Ubuntu: # > (unset PKG_CONFIG_LIBDIR && pkg-config --cflags xorg-wacom) # return default path! diff --git a/scripts/create-toolchain-info.cmake b/scripts/create-toolchain-info.cmake index 48a988328..aa0bcdb8b 100644 --- a/scripts/create-toolchain-info.cmake +++ b/scripts/create-toolchain-info.cmake @@ -6,8 +6,8 @@ if(NOT HUNTER_SELF) message("[hunter ** INTERNAL **] HUNTER_SELF is empty") message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") message("") - message("------------------------------ WIKI -------------------------------") - message(" https://github.com/ruslo/hunter/wiki/error.internal") + message("------------------------------ ERROR ------------------------------") + message(" https://docs.hunter.sh/en/latest/reference/errors/error.internal.html") message("-------------------------------------------------------------------") message(FATAL_ERROR "") endif() @@ -28,13 +28,13 @@ if(EXISTS "${TOOLCHAIN_INFO_FILE}") hunter_internal_error("${TOOLCHAIN_INFO_FILE} already exists") endif() -include(hunter_test_string_not_empty) -hunter_test_string_not_empty("${HUNTER_CONFIGURATION_TYPES}") +include(hunter_assert_not_empty_string) +hunter_assert_not_empty_string("${HUNTER_CONFIGURATION_TYPES}") file( WRITE "${TOOLCHAIN_INFO_FILE}" - "Cache version: 4\n" + "Cache version: 6\n" "Polly toolchains:\n" " IPHONEOS_ARCHS: ${IPHONEOS_ARCHS}\n" " IPHONESIMULATOR_ARCHS: ${IPHONESIMULATOR_ARCHS}\n" @@ -44,6 +44,15 @@ file( " HUNTER_TOOLCHAIN_UNDETECTABLE_ID: ${HUNTER_TOOLCHAIN_UNDETECTABLE_ID}\n" ) +string(COMPARE EQUAL "${HUNTER_BUILD_SHARED_LIBS}" "" is_empty) +if(NOT is_empty) + file( + APPEND + "${TOOLCHAIN_INFO_FILE}" + " HUNTER_BUILD_SHARED_LIBS: ${HUNTER_BUILD_SHARED_LIBS}\n" + ) +endif() + string(COMPARE EQUAL "${OSX_SDK_VERSION}" "" is_empty) if(NOT is_empty) file( @@ -105,7 +114,7 @@ endfunction() split_string("${outresult}" list_of_strings) -set(macroses "") +set(macros_list "") foreach(x ${list_of_strings}) string( REGEX @@ -123,13 +132,22 @@ foreach(x ${list_of_strings}) result_x "${x}" ) - set(macroses "${macroses}${result_x}\n") + + string(FIND "${result_x}" ";" semicolon_pos) + if(NOT semicolon_pos EQUAL "-1") + hunter_internal_error("Semicolon in string: '${result_x}'") + endif() + + list(APPEND macros_list "${result_x}") endif() endforeach() -string(COMPARE EQUAL "${macroses}" "" is_empty) +list(REMOVE_DUPLICATES macros_list) +string(REPLACE ";" "\n" macros_string "${macros_list}") + +string(COMPARE EQUAL "${macros_string}" "" is_empty) if(is_empty) - hunter_fatal_error("No toolchain info generated" WIKI error.no.toolchain.info) + hunter_fatal_error("No toolchain info generated" ERROR_PAGE error.no.toolchain.info) endif() -file(APPEND "${TOOLCHAIN_INFO_FILE}" "Predefined macroses:\n${macroses}") +file(APPEND "${TOOLCHAIN_INFO_FILE}" "Predefined macroses:\n${macros_string}") diff --git a/scripts/predefined.list b/scripts/predefined.list index 109efbc05..d127f8532 100644 --- a/scripts/predefined.list +++ b/scripts/predefined.list @@ -15,6 +15,7 @@ _BIG_ENDIAN _BYTE_ORDER _CHAR_UNSIGNED _COMPILER_VERSION +_CONTROL_FLOW_GUARD _CPPLIB_VER _CPPRTTI _CPPUNWIND @@ -24,6 +25,8 @@ _GNU_SOURCE _IA64 _IBMR2 _INTEGRAL_MAX_BITS +_ISO_VOLATILE +_KERNEL_MODE _LIBCPP_HAS_NO_ASAN _LIBCPP_VERSION _LITTLE_ENDIAN @@ -41,14 +44,21 @@ _MSC_BUILD _MSC_EXTENSIONS _MSC_FULL_VER _MSC_VER +_MSVC_LANG _MT _M_ALPHA _M_AMD64 _M_ARM +_M_ARM64 +_M_ARM_ARMV7VE _M_ARM_FP _M_CEE _M_CEE_PURE _M_CEE_SAFE +_M_FP_EXCEPT +_M_FP_FAST +_M_FP_PRECISE +_M_FP_STRICT _M_IA64 _M_IX86 _M_IX86_FP @@ -64,6 +74,7 @@ _PA_RISC2_0 _PDP_ENDIAN _POSIX_SOURCE _POWER +_PREFAST_ _R3000 _R4000 _RWSTD_VER @@ -78,6 +89,7 @@ _WCHAR_T_DEFINED _WIN32 _WIN32_WINNT _WIN64 +_WINRT_DLL _Wp64 _X86_ _XENON @@ -87,6 +99,11 @@ __370__ __AARCH64EB__ __AARCH64EL__ __AARCH64_SIMD__ +__ACCUM_EPSILON__ +__ACCUM_FBIT__ +__ACCUM_IBIT__ +__ACCUM_MAX__ +__ACCUM_MIN__ __ALTIVEC__ __ANDROID_API__ __ANDROID__ @@ -96,6 +113,7 @@ __APPLE__ __ARM64_ARCH_8__ __ARMEB__ __ARMEL__ +__ARM_32BIT_STATE __ARM_64BIT_STATE __ARM_ACLE __ARM_ALIGN_MAX_STACK_PWR @@ -104,12 +122,20 @@ __ARM_ARCH_7A__ __ARM_ARCH_7S__ __ARM_ARCH_EXT_IDIV__ __ARM_ARCH_ISA_A64 +__ARM_ARCH_ISA_ARM +__ARM_ARCH_ISA_THUMB __ARM_ARCH_PROFILE +__ARM_ASM_SYNTAX_UNIFIED__ __ARM_EABI__ __ARM_FEATURE_CLZ __ARM_FEATURE_CRYPTO __ARM_FEATURE_DIV +__ARM_FEATURE_DSP __ARM_FEATURE_FMA +__ARM_FEATURE_LDREX +__ARM_FEATURE_QBIT +__ARM_FEATURE_SAT +__ARM_FEATURE_SIMD32 __ARM_FEATURE_UNALIGNED __ARM_FP __ARM_FP16_FORMAT_IEEE @@ -117,6 +143,7 @@ __ARM_NEON __ARM_NEON_FP __ARM_NEON__ __ARM_PCS_AAPCS64 +__ARM_PCS_VFP __ARM_SIZEOF_MINIMAL_ENUM __ARM_SIZEOF_WCHAR_T __ARM_VFPV3__ @@ -129,6 +156,7 @@ __ATOMIC_HLE_RELEASE __ATOMIC_RELAXED __ATOMIC_RELEASE __ATOMIC_SEQ_CST +__ATOM__ __AVX2__ __AVX__ __BEOS__ @@ -143,6 +171,7 @@ __BYTE_ORDER__ __CHAR16_TYPE__ __CHAR32_TYPE__ __CHAR_BIT__ +__CHAR_UNSIGNED__ __CLR_VER __CODEGEARC__ __COMO_VERSION__ @@ -154,6 +183,8 @@ __COUNTER__ __CRTL_VER __CWCC__ __CYGWIN__ +__DA_FBIT__ +__DA_IBIT__ __DBL_DECIMAL_DIG__ __DBL_DENORM_MIN__ __DBL_DIG__ @@ -199,6 +230,8 @@ __DECIMAL_DIG__ __DEC_EVAL_METHOD__ __DEPRECATED __DMC__ +__DQ_FBIT__ +__DQ_IBIT__ __DYNAMIC__ __DragonFly__ __ECC @@ -227,6 +260,14 @@ __FLT_MIN__ __FLT_RADIX__ __FMA4__ __FMA__ +__FP_FAST_FMA +__FP_FAST_FMAF +__FP_FAST_FMAL +__FRACT_EPSILON__ +__FRACT_FBIT__ +__FRACT_IBIT__ +__FRACT_MAX__ +__FRACT_MIN__ __FUNCDNAME__ __FUNCSIG__ __FXSR__ @@ -260,6 +301,8 @@ __GLIBCXX_TYPE_INT_N_0 __GLIBCXX__ __GLIBC__ __GNUC_GNU_INLINE__ +__GNUC_LIBSTD_MINOR__ +__GNUC_LIBSTD__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ __GNUC_STDC_INLINE__ @@ -269,13 +312,18 @@ __GNU_LIBRARY__ __GXX_ABI_VERSION __GXX_EXPERIMENTAL_CXX0X__ __GXX_RTTI +__GXX_TYPEINFO_EQUALITY_INLINE __GXX_WEAK__ __HAIKU__ +__HA_FBIT__ +__HA_IBIT__ __HIGHC__ __HPPA11__ __HPPA20__ __HPPA__ __HP_aCC +__HQ_FBIT__ +__HQ_IBIT__ __I86__ __IA64__ __IAR_SYSTEMS_ICC__ @@ -322,6 +370,11 @@ __INT_LEAST8_MAX__ __INT_LEAST8_TYPE__ __INT_MAX__ __KCC +__LACCUM_EPSILON__ +__LACCUM_FBIT__ +__LACCUM_IBIT__ +__LACCUM_MAX__ +__LACCUM_MIN__ __LDBL_DENORM_MIN__ __LDBL_DIG__ __LDBL_EPSILON__ @@ -335,10 +388,25 @@ __LDBL_MAX__ __LDBL_MIN_10_EXP__ __LDBL_MIN_EXP__ __LDBL_MIN__ +__LFRACT_EPSILON__ +__LFRACT_FBIT__ +__LFRACT_IBIT__ +__LFRACT_MAX__ +__LFRACT_MIN__ __LIBCOMO__ __LIBREL__ __LITTLE_ENDIAN __LITTLE_ENDIAN__ +__LLACCUM_EPSILON__ +__LLACCUM_FBIT__ +__LLACCUM_IBIT__ +__LLACCUM_MAX__ +__LLACCUM_MIN__ +__LLFRACT_EPSILON__ +__LLFRACT_FBIT__ +__LLFRACT_IBIT__ +__LLFRACT_MAX__ +__LLFRACT_MIN__ __LONG_LONG_MAX__ __LONG_MAX__ __LP64__ @@ -385,6 +453,7 @@ __PGIC_MINOR__ __PGIC_PATCHLEVEL__ __PGIC__ __PIC__ +__PIE__ __POINTER_WIDTH__ __POWERPC__ __PPCBROADWAY__ @@ -395,11 +464,25 @@ __PTRDIFF_TYPE__ __PTRDIFF_WIDTH__ __QNXNTO__ __QNX__ +__QQ_FBIT__ +__QQ_IBIT__ __REGISTER_PREFIX__ __RISC2_0__ +__SACCUM_EPSILON__ +__SACCUM_FBIT__ +__SACCUM_IBIT__ +__SACCUM_MAX__ +__SACCUM_MIN__ +__SA_FBIT__ +__SA_IBIT__ __SCHAR_MAX__ __SEG_FS __SEG_GS +__SFRACT_EPSILON__ +__SFRACT_FBIT__ +__SFRACT_IBIT__ +__SFRACT_MAX__ +__SFRACT_MIN__ __SGI_STL __SGI_STL_PORT __SH3__ @@ -428,6 +511,8 @@ __SIZEOF_WINT_T__ __SIZE_MAX__ __SIZE_TYPE__ __SIZE_WIDTH__ +__SQ_FBIT__ +__SQ_IBIT__ __SSE2_MATH__ __SSE2__ __SSE3__ @@ -439,10 +524,14 @@ __SSE__ __SSP_STRONG__ __SSP__ __SSSE3__ +__STDCPP_DEFAULT_NEW_ALIGNMENT__ +__STDCPP_STRICT_POINTER_SAFETY__ +__STDCPP_THREADS__ __STDC_HOSTED__ __STDC_IEC_559_COMPLEX__ __STDC_IEC_559__ __STDC_ISO_10646__ +__STDC_MB_MIGHT_NEQ_WC__ __STDC_NO_THREADS__ __STDC_UTF_16__ __STDC_UTF_32__ @@ -458,6 +547,8 @@ __SYSC__ __TARGET_ARCH_ARM __TARGET_ARCH_THUMB __TARGET_LIB__ +__TA_FBIT__ +__TA_IBIT__ __THUMBEB__ __THUMBEL__ __THUMB_INTERWORK__ @@ -466,8 +557,28 @@ __THW_INTEL__ __THW_RS6000 __TOS_AIX__ __TOS_WIN__ +__TQ_FBIT__ +__TQ_IBIT__ __TenDRA__ +__UACCUM_EPSILON__ +__UACCUM_FBIT__ +__UACCUM_IBIT__ +__UACCUM_MAX__ +__UACCUM_MIN__ __UCLIBC__ +__UDA_FBIT__ +__UDA_IBIT__ +__UDQ_FBIT__ +__UDQ_IBIT__ +__UFRACT_EPSILON__ +__UFRACT_FBIT__ +__UFRACT_IBIT__ +__UFRACT_MAX__ +__UFRACT_MIN__ +__UHA_FBIT__ +__UHA_IBIT__ +__UHQ_FBIT__ +__UHQ_IBIT__ __UINT16_C __UINT16_MAX__ __UINT16_TYPE__ @@ -501,8 +612,48 @@ __UINT_LEAST64_MAX__ __UINT_LEAST64_TYPE__ __UINT_LEAST8_MAX__ __UINT_LEAST8_TYPE__ +__ULACCUM_EPSILON__ +__ULACCUM_FBIT__ +__ULACCUM_IBIT__ +__ULACCUM_MAX__ +__ULACCUM_MIN__ +__ULFRACT_EPSILON__ +__ULFRACT_FBIT__ +__ULFRACT_IBIT__ +__ULFRACT_MAX__ +__ULFRACT_MIN__ +__ULLACCUM_EPSILON__ +__ULLACCUM_FBIT__ +__ULLACCUM_IBIT__ +__ULLACCUM_MAX__ +__ULLACCUM_MIN__ +__ULLFRACT_EPSILON__ +__ULLFRACT_FBIT__ +__ULLFRACT_IBIT__ +__ULLFRACT_MAX__ +__ULLFRACT_MIN__ +__UQQ_FBIT__ +__UQQ_IBIT__ +__USACCUM_EPSILON__ +__USACCUM_FBIT__ +__USACCUM_IBIT__ +__USACCUM_MAX__ +__USACCUM_MIN__ +__USA_FBIT__ +__USA_IBIT__ __USER_LABEL_PREFIX__ +__USFRACT_EPSILON__ +__USFRACT_FBIT__ +__USFRACT_IBIT__ +__USFRACT_MAX__ +__USFRACT_MIN__ __USING_SJLJ_EXCEPTIONS__ +__USQ_FBIT__ +__USQ_IBIT__ +__UTA_FBIT__ +__UTA_IBIT__ +__UTQ_FBIT__ +__UTQ_IBIT__ __VECTOR4DOUBLE__ __VEC__ __VERSION__ @@ -514,6 +665,7 @@ __WATCOMC__ __WCHAR_MAX__ __WCHAR_MIN__ __WCHAR_TYPE__ +__WCHAR_UNSIGNED__ __WCHAR_WIDTH__ __WIN32__ __WINDOWS__ @@ -560,6 +712,7 @@ __cpp_aggregate_nsdmi __cpp_alias_templates __cpp_attributes __cpp_binary_literals +__cpp_concepts __cpp_constexpr __cpp_decltype __cpp_decltype_auto @@ -625,6 +778,7 @@ __mips__ __nocona __nocona__ __pic__ +__pie__ __powerpc __powerpc__ __ppc601__ diff --git a/scripts/try-copy-license.cmake b/scripts/try-copy-license.cmake index ec1f35065..767c61dc3 100644 --- a/scripts/try-copy-license.cmake +++ b/scripts/try-copy-license.cmake @@ -1,4 +1,5 @@ # Copyright (c) 2015 Aaditya Kalsi +# Copyright (c) 2017 Ruslan Baratov # All rights reserved. cmake_minimum_required(VERSION 3.0) @@ -8,76 +9,52 @@ if(is_empty) message(FATAL_ERROR "'srcdir' should not be empty") endif() -string(COMPARE EQUAL "${dstfile}" "" is_empty) +string(COMPARE EQUAL "${dstdir}" "" is_empty) if(is_empty) - message(FATAL_ERROR "'dstfile' should not be empty") + message(FATAL_ERROR "'dstdir' should not be empty") endif() -# macro to copy file to a given file name -# CMake's file(COPY) works for a directory only -# so we use configure_file() with absolute paths -# to achieve this. -macro(copyfileto in out) - # For debugging - # message("-- copylicense: License found; ${in} -> ${out}") - configure_file(${in} ${out} COPYONLY) -endmacro() +set(licenses "${HUNTER_INSTALL_LICENSE_FILES}") +string(COMPARE NOTEQUAL "${licenses}" "" explicit_licenses) -# find the license file to copy -if(EXISTS "${srcdir}/LICENSE") - copyfileto("${srcdir}/LICENSE" ${dstfile}) - return() -endif() - -if(EXISTS "${srcdir}/LICENSE.txt") - copyfileto("${srcdir}/LICENSE.txt" ${dstfile}) - return() -endif() - -if(EXISTS "${srcdir}/COPYING") - copyfileto("${srcdir}/COPYING" ${dstfile}) - return() -endif() - -if(EXISTS "${srcdir}/COPYING.txt") - copyfileto("${srcdir}/COPYING.txt" ${dstfile}) - return() +file(MAKE_DIRECTORY "${dstdir}") +if(NOT EXISTS "${dstdir}") + message(FATAL_ERROR "Can't create directory: '${dstdir}'") endif() - -if(EXISTS "${srcdir}/license") - copyfileto("${srcdir}/license" ${dstfile}) - return() +if(NOT IS_DIRECTORY "${dstdir}") + message(FATAL_ERROR "Is not a directory: '${dstdir}'") endif() -if(EXISTS "${srcdir}/license.txt") - copyfileto("${srcdir}/license.txt" ${dstfile}) - return() -endif() - -if(EXISTS "${srcdir}/copying") - copyfileto("${srcdir}/copying" ${dstfile}) +# Use set explicit license files for the package +# Testing variants: +# * Eigen "HUNTER_INSTALL_LICENSE_FILES=COPYING.MPL2" (good) +# * Eigen "HUNTER_INSTALL_LICENSE_FILES=COPYING.BSD;COPYING.GPL;COPYING.LGPL;COPYING.MINPACK;COPYING.MPL2" (good) +# * Eigen "HUNTER_INSTALL_LICENSE_FILES=COPYING.BSD;COPYING.GPL;COPYING.LGPL;COPYING.XXX;COPYING.MPL2" (bad) +# * Eigen no HUNTER_INSTALL_LICENSE_FILES (bad, no default license) +if(explicit_licenses) + foreach(x ${licenses}) + if(NOT EXISTS "${srcdir}/${x}") + message(FATAL_ERROR "File not found: '${srcdir}/${x}'") + endif() + file(COPY "${srcdir}/${x}" DESTINATION "${dstdir}") + endforeach() return() endif() -if(EXISTS "${srcdir}/copying.txt") - copyfileto("${srcdir}/copying.txt" ${dstfile}) - return() -endif() +# Try standard names +foreach(x "LICENSE" "LICENSE.txt" "COPYING" "COPYING.txt" "license" "license.txt" "copying" "copying.txt") + if(EXISTS "${srcdir}/${x}") + file(COPY "${srcdir}/${x}" DESTINATION "${dstdir}") + return() + endif() +endforeach() -# last effort; glob LICENSE* +# If no standard name found try to glob LICENSE* +# Testing variants: +# * Boost file(GLOB filelist "${srcdir}/LICENSE*") -if(filelist) - set(licfile ) - foreach(el ${filelist}) - if(NOT IS_DIRECTORY ${el}) - if(licfile)# if already set, unset and break; too many results - message(FATAL_ERROR "Could not find license unambiguously. Found:\n ${licfile}\n ${el}") - else()# set licfile to the one found - set(licfile ${el}) - endif() - endif() - endforeach() - if(licfile) - copyfileto(${licfile} ${dstfile}) +foreach(x ${filelist}) + if(NOT IS_DIRECTORY "${x}") + file(COPY "${x}" DESTINATION "${dstdir}") endif() -endif() +endforeach() diff --git a/tests/hunter_create_args_file/CMakeLists.txt b/tests/hunter_create_args_file/CMakeLists.txt index 47b2b1db8..18b56de65 100644 --- a/tests/hunter_create_args_file/CMakeLists.txt +++ b/tests/hunter_create_args_file/CMakeLists.txt @@ -28,6 +28,10 @@ set(test_7_etalon "${CMAKE_CURRENT_LIST_DIR}/test_7") set(test_8_etalon "${CMAKE_CURRENT_LIST_DIR}/test_8") set(test_9_etalon "${CMAKE_CURRENT_LIST_DIR}/test_9") set(test_10_etalon "${CMAKE_CURRENT_LIST_DIR}/test_10") +set(test_11_etalon "${CMAKE_CURRENT_LIST_DIR}/test_11") +set(test_12_etalon "${CMAKE_CURRENT_LIST_DIR}/test_12") +set(test_13_etalon "${CMAKE_CURRENT_LIST_DIR}/test_13") +set(test_14_etalon "${CMAKE_CURRENT_LIST_DIR}/test_14") set(test_1 "${CMAKE_CURRENT_BINARY_DIR}/test_1") set(test_2 "${CMAKE_CURRENT_BINARY_DIR}/test_2") @@ -39,6 +43,10 @@ set(test_7 "${CMAKE_CURRENT_BINARY_DIR}/test_7") set(test_8 "${CMAKE_CURRENT_BINARY_DIR}/test_8") set(test_9 "${CMAKE_CURRENT_BINARY_DIR}/test_9") set(test_10 "${CMAKE_CURRENT_BINARY_DIR}/test_10") +set(test_11 "${CMAKE_CURRENT_BINARY_DIR}/test_11") +set(test_12 "${CMAKE_CURRENT_BINARY_DIR}/test_12") +set(test_13 "${CMAKE_CURRENT_BINARY_DIR}/test_13") +set(test_14 "${CMAKE_CURRENT_BINARY_DIR}/test_14") hunter_create_args_file("A=value1" "${test_1}") hunter_create_args_file("A=value1 value2" "${test_2}") @@ -57,6 +65,26 @@ hunter_create_args_file( "${test_10}" ) +hunter_create_args_file( + "A=--foo=1" + "${test_11}" +) + +hunter_create_args_file( + "A=--boo=1;2;3" + "${test_12}" +) + +hunter_create_args_file( + "A=--boo=1;2;3;--foo=3;4;5" + "${test_13}" +) + +hunter_create_args_file( + "A=1;B=--a;--b;--c=1,2,3,4;C=777" + "${test_14}" +) + check_files("${test_1_etalon}" "${test_1}") check_files("${test_2_etalon}" "${test_2}") check_files("${test_3_etalon}" "${test_3}") @@ -67,3 +95,7 @@ check_files("${test_7_etalon}" "${test_7}") check_files("${test_8_etalon}" "${test_8}") check_files("${test_9_etalon}" "${test_9}") check_files("${test_10_etalon}" "${test_10}") +check_files("${test_11_etalon}" "${test_11}") +check_files("${test_12_etalon}" "${test_12}") +check_files("${test_13_etalon}" "${test_13}") +check_files("${test_14_etalon}" "${test_14}") diff --git a/tests/hunter_create_dependency_entry/CMakeLists.txt b/tests/hunter_create_dependency_entry/CMakeLists.txt index 27224f034..2a7c4041e 100644 --- a/tests/hunter_create_dependency_entry/CMakeLists.txt +++ b/tests/hunter_create_dependency_entry/CMakeLists.txt @@ -8,11 +8,11 @@ project(TestModuleHunterCreateDependencyEntry) include(hunter_create_dependency_entry) -set(toolchain_id "${CMAKE_CURRENT_BINARY_DIR}/toolchain-id") -set(HUNTER_TOOLCHAIN_ID_PATH "${toolchain_id}") +set(config_id "${CMAKE_CURRENT_BINARY_DIR}/config-id") +set(HUNTER_CONFIG_ID_PATH "${config_id}") ### No cache -file(REMOVE_RECURSE "${toolchain_id}") +file(REMOVE_RECURSE "${config_id}") hunter_create_dependency_entry(PACKAGE "Foo" COMPONENT "" RESULT result) if(NOT result STREQUAL "") @@ -20,9 +20,9 @@ if(NOT result STREQUAL "") endif() ### Cache for package -file(REMOVE_RECURSE "${toolchain_id}") +file(REMOVE_RECURSE "${config_id}") -set(foo_home "${toolchain_id}/Build/Foo") +set(foo_home "${config_id}/Build/Foo") file(WRITE "${foo_home}/cache.sha1" "Foo-SHA1") hunter_create_dependency_entry(PACKAGE "Foo" COMPONENT "" RESULT result) @@ -31,9 +31,9 @@ if(NOT result STREQUAL "Foo Foo-SHA1") endif() ### Cache for package with component -file(REMOVE_RECURSE "${toolchain_id}") +file(REMOVE_RECURSE "${config_id}") -set(foo_home "${toolchain_id}/Build/Foo/__Boo") +set(foo_home "${config_id}/Build/Foo/__Boo") file(WRITE "${foo_home}/cache.sha1" "Foo-Boo-SHA1") hunter_create_dependency_entry(PACKAGE "Foo" COMPONENT "Boo" RESULT result) diff --git a/tests/hunter_create_deps_info/CMakeLists.txt b/tests/hunter_create_deps_info/CMakeLists.txt index 85128e269..18083a610 100644 --- a/tests/hunter_create_deps_info/CMakeLists.txt +++ b/tests/hunter_create_deps_info/CMakeLists.txt @@ -25,14 +25,14 @@ function(run_check file1) endfunction() ### Test empty -set(toolchain_id "${CMAKE_CURRENT_BINARY_DIR}/toolchain-id") +set(config_id "${CMAKE_CURRENT_BINARY_DIR}/config-id") set(package_name "Foo") set(temp_deps_info "${CMAKE_CURRENT_BINARY_DIR}/deps.info-TEMP") -set(HUNTER_TOOLCHAIN_ID_PATH "${toolchain_id}") +set(HUNTER_CONFIG_ID_PATH "${config_id}") set(HUNTER_PACKAGE_NAME "${package_name}") -set(home "${toolchain_id}/Build/${package_name}") +set(home "${config_id}/Build/${package_name}") file(WRITE "${home}/cache.sha1" "abc") hunter_create_deps_info("${temp_deps_info}") @@ -40,19 +40,19 @@ run_check("${CMAKE_CURRENT_LIST_DIR}/empty.txt") ### Complex -file(REMOVE_RECURSE "${toolchain_id}") +file(REMOVE_RECURSE "${config_id}") set(package_name "J") set(HUNTER_PACKAGE_NAME "${package_name}") -file(WRITE "${toolchain_id}/Build/A/cache.sha1" "A-SHA1") -file(WRITE "${toolchain_id}/Build/B/cache.sha1" "B-SHA1") -file(WRITE "${toolchain_id}/Build/C/cache.sha1" "C-SHA1") -file(WRITE "${toolchain_id}/Build/D/__E/cache.sha1" "D-E-SHA1") -file(WRITE "${toolchain_id}/Build/F/__G/cache.sha1" "F-G-SHA1") -file(WRITE "${toolchain_id}/Build/H/cache.sha1" "H-SHA1") -file(WRITE "${toolchain_id}/Build/I/cache.sha1" "I-SHA1") -file(WRITE "${toolchain_id}/Build/J/cache.sha1" "J-SHA1") +file(WRITE "${config_id}/Build/A/cache.sha1" "A-SHA1") +file(WRITE "${config_id}/Build/B/cache.sha1" "B-SHA1") +file(WRITE "${config_id}/Build/C/cache.sha1" "C-SHA1") +file(WRITE "${config_id}/Build/D/__E/cache.sha1" "D-E-SHA1") +file(WRITE "${config_id}/Build/F/__G/cache.sha1" "F-G-SHA1") +file(WRITE "${config_id}/Build/H/cache.sha1" "H-SHA1") +file(WRITE "${config_id}/Build/I/cache.sha1" "I-SHA1") +file(WRITE "${config_id}/Build/J/cache.sha1" "J-SHA1") hunter_register_dependency( PACKAGE "J" diff --git a/tests/hunter_generate_qt_info/CMakeLists.txt b/tests/hunter_generate_qt_info/CMakeLists.txt index 174db1119..031e7f453 100644 --- a/tests/hunter_generate_qt_info/CMakeLists.txt +++ b/tests/hunter_generate_qt_info/CMakeLists.txt @@ -88,16 +88,16 @@ endif() ### Test hunter_generate_qt_info("qtenginio" toskip depends_on nobuild "5.5.0" "NO" "") # empty string should work fine too -string(COMPARE EQUAL "${depends_on}" "qtbase;qtdeclarative;qtsvg;qtxmlpatterns" is_good) +string(COMPARE EQUAL "${depends_on}" "qtbase;qtsvg;qtxmlpatterns;qtdeclarative" is_good) if(NOT is_good) message(FATAL_ERROR "Not good") endif() ### Test hunter_generate_qt_info("qtwebchannel" toskip depends_on nobuild "5.5.0" "NO" "NO") -string(COMPARE EQUAL "${depends_on}" "qtbase;qtdeclarative;qtsvg;qtwebsockets;qtxmlpatterns" is_good) +string(COMPARE EQUAL "${depends_on}" "qtbase;qtsvg;qtxmlpatterns;qtdeclarative;qtwebsockets" is_good) if(NOT is_good) - message(FATAL_ERROR "Not good") + message(FATAL_ERROR "Not good: ${depends_on}") endif() ### Test @@ -106,7 +106,7 @@ string( COMPARE EQUAL "${depends_on}" - "qtbase;qtdeclarative;qtlocation;qtmultimedia;qtsensors;qtsvg;qtwebchannel;qtwebsockets;qtxmlpatterns" + "qtbase;qtsvg;qtxmlpatterns;qtdeclarative;qtwebsockets;qtlocation;qtmultimedia;qtsensors;qtwebchannel" is_good ) if(NOT is_good) @@ -119,7 +119,7 @@ string( COMPARE EQUAL "${depends_on}" - "qtbase;qtdeclarative;qtgraphicaleffects;qtlocation;qtmultimedia;qtquickcontrols;qtsensors;qtsvg;qtwebchannel;qtwebkit;qtwebsockets;qtxmlpatterns" + "qtbase;qtsvg;qtxmlpatterns;qtdeclarative;qtgraphicaleffects;qtwebsockets;qtlocation;qtmultimedia;qtsensors;qtwebchannel;qtquickcontrols;qtwebkit" is_good ) if(NOT is_good) diff --git a/tests/hunter_get_package_deps/CMakeLists.txt b/tests/hunter_get_package_deps/CMakeLists.txt index e00639462..0bad92935 100644 --- a/tests/hunter_get_package_deps/CMakeLists.txt +++ b/tests/hunter_get_package_deps/CMakeLists.txt @@ -9,11 +9,11 @@ project(TestModuleHunterGetPackageDeps) include(hunter_get_package_deps) set(package_name "Foo") -set(toolchain_id "${CMAKE_CURRENT_BINARY_DIR}/toolchain-id") +set(config_id "${CMAKE_CURRENT_BINARY_DIR}/config-id") -set(HUNTER_TOOLCHAIN_ID_PATH "${toolchain_id}") +set(HUNTER_CONFIG_ID_PATH "${config_id}") -set(home_dir "${toolchain_id}/Build/${package_name}") +set(home_dir "${config_id}/Build/${package_name}") set(dependencies_dir "${home_dir}/Dependencies") function(cleanup) diff --git a/tests/hunter_get_package_deps_recurse/CMakeLists.txt b/tests/hunter_get_package_deps_recurse/CMakeLists.txt index 0afd19bb0..83291c52f 100644 --- a/tests/hunter_get_package_deps_recurse/CMakeLists.txt +++ b/tests/hunter_get_package_deps_recurse/CMakeLists.txt @@ -9,18 +9,18 @@ project(TestModuleHunterGetPackageDepsRecurse) include(hunter_get_package_deps_recurse) include(hunter_register_dependency) -set(toolchain_id "${CMAKE_CURRENT_BINARY_DIR}/toolchain-id") - -set(HUNTER_TOOLCHAIN_ID_PATH "${toolchain_id}") - -file(MAKE_DIRECTORY "${toolchain_id}/Build/A") -file(MAKE_DIRECTORY "${toolchain_id}/Build/B") -file(MAKE_DIRECTORY "${toolchain_id}/Build/C") -file(MAKE_DIRECTORY "${toolchain_id}/Build/D/__E") -file(MAKE_DIRECTORY "${toolchain_id}/Build/F/__G") -file(MAKE_DIRECTORY "${toolchain_id}/Build/H") -file(MAKE_DIRECTORY "${toolchain_id}/Build/I") -file(MAKE_DIRECTORY "${toolchain_id}/Build/J") +set(config_id "${CMAKE_CURRENT_BINARY_DIR}/config-id") + +set(HUNTER_CONFIG_ID_PATH "${config_id}") + +file(MAKE_DIRECTORY "${config_id}/Build/A") +file(MAKE_DIRECTORY "${config_id}/Build/B") +file(MAKE_DIRECTORY "${config_id}/Build/C") +file(MAKE_DIRECTORY "${config_id}/Build/D/__E") +file(MAKE_DIRECTORY "${config_id}/Build/F/__G") +file(MAKE_DIRECTORY "${config_id}/Build/H") +file(MAKE_DIRECTORY "${config_id}/Build/I") +file(MAKE_DIRECTORY "${config_id}/Build/J") hunter_register_dependency( PACKAGE "J" diff --git a/tests/hunter_register_dependency/CMakeLists.txt b/tests/hunter_register_dependency/CMakeLists.txt index cca19d00c..ec03f4558 100644 --- a/tests/hunter_register_dependency/CMakeLists.txt +++ b/tests/hunter_register_dependency/CMakeLists.txt @@ -8,11 +8,11 @@ project(TestModuleHunterRegisterDependency) include(hunter_register_dependency) -set(toolchain_id "${CMAKE_CURRENT_BINARY_DIR}/toolchain-id") -set(HUNTER_TOOLCHAIN_ID_PATH "${toolchain_id}") +set(config_id "${CMAKE_CURRENT_BINARY_DIR}/config-id") +set(HUNTER_CONFIG_ID_PATH "${config_id}") -set(expected "${toolchain_id}/Build/Foo/Dependencies/Boo/__dep") -file(REMOVE_RECURSE "${toolchain_id}") +set(expected "${config_id}/Build/Foo/Dependencies/Boo/__dep") +file(REMOVE_RECURSE "${config_id}") if(EXISTS "${expected}") message(FATAL_ERROR "Exists") endif() @@ -25,8 +25,8 @@ if(NOT EXISTS "${expected}") message(FATAL_ERROR "Not exists") endif() -set(expected "${toolchain_id}/Build/Foo/__Boo/Dependencies/Bar/__dep") -file(REMOVE_RECURSE "${toolchain_id}") +set(expected "${config_id}/Build/Foo/__Boo/Dependencies/Bar/__dep") +file(REMOVE_RECURSE "${config_id}") if(EXISTS "${expected}") message(FATAL_ERROR "Exists") endif() @@ -39,8 +39,8 @@ if(NOT EXISTS "${expected}") message(FATAL_ERROR "Not exists") endif() -set(expected "${toolchain_id}/Build/Foo/Dependencies/Boo/Bar/__dep") -file(REMOVE_RECURSE "${toolchain_id}") +set(expected "${config_id}/Build/Foo/Dependencies/Boo/Bar/__dep") +file(REMOVE_RECURSE "${config_id}") if(EXISTS "${expected}") message(FATAL_ERROR "Exists") endif() @@ -53,8 +53,8 @@ if(NOT EXISTS "${expected}") message(FATAL_ERROR "Not exists") endif() -set(expected "${toolchain_id}/Build/Foo/__Boo/Dependencies/Bar/Baz/__dep") -file(REMOVE_RECURSE "${toolchain_id}") +set(expected "${config_id}/Build/Foo/__Boo/Dependencies/Bar/Baz/__dep") +file(REMOVE_RECURSE "${config_id}") if(EXISTS "${expected}") message(FATAL_ERROR "Exists") endif() diff --git a/tests/hunter_unpack_directory/CMakeLists.txt b/tests/hunter_unpack_directory/CMakeLists.txt index 09e83bbbb..503177b21 100644 --- a/tests/hunter_unpack_directory/CMakeLists.txt +++ b/tests/hunter_unpack_directory/CMakeLists.txt @@ -10,22 +10,24 @@ include(hunter_pack_directory) include(hunter_unpack_directory) set(temp "${CMAKE_CURRENT_BINARY_DIR}/temp") +set(HUNTER_CACHED_ROOT "${temp}/root") +set(HUNTER_INSTALL_PREFIX "${temp}/install") set(dir_to_pack "${temp}/topack") -set(dir_to_unpack "${temp}/tounpack") file(WRITE "${dir_to_pack}/1.txt" "hello") file(WRITE "${dir_to_pack}/B/2.txt" "boo") file(WRITE "${dir_to_pack}/B/C/3.txt" "foo") -set(dest_dir "${temp}/dest") +set(dest_dir "${HUNTER_CACHED_ROOT}/_Base/Cache/raw") hunter_pack_directory("${dir_to_pack}" "${dest_dir}" result_sha1) -hunter_unpack_directory("${dest_dir}/${result_sha1}.tar.bz2" "${dir_to_unpack}") -set(expected_1 "${dir_to_unpack}/1.txt") -set(expected_2 "${dir_to_unpack}/B/2.txt") -set(expected_3 "${dir_to_unpack}/B/C/3.txt") +hunter_unpack_directory(${result_sha1}) + +set(expected_1 "${HUNTER_INSTALL_PREFIX}/1.txt") +set(expected_2 "${HUNTER_INSTALL_PREFIX}/B/2.txt") +set(expected_3 "${HUNTER_INSTALL_PREFIX}/B/C/3.txt") if(NOT EXISTS "${expected_1}") message(FATAL_ERROR "Not found: ${expected_1}") diff --git a/tests/issue/109/unit/CMakeLists.txt b/tests/issue/109/unit/CMakeLists.txt index bc724fb18..b4e552527 100644 --- a/tests/issue/109/unit/CMakeLists.txt +++ b/tests/issue/109/unit/CMakeLists.txt @@ -5,6 +5,7 @@ include(hunter_boost_component_b2_args) project(TestIssue109Unit) +set(BOOST_VERSION "dummy") hunter_boost_component_b2_args( "bar" "FOO_OPT=1" diff --git a/tests/issue/22/CMakeLists.txt b/tests/issue/22/CMakeLists.txt index c095caa9f..42e9ab31c 100644 --- a/tests/issue/22/CMakeLists.txt +++ b/tests/issue/22/CMakeLists.txt @@ -3,13 +3,23 @@ cmake_minimum_required(VERSION 3.0) include("../../../examples/common.cmake") project(TestIssue22) +include(hunter_default_version) include(hunter_config) include(hunter_configuration_types) -set(HUNTER_ALLOW_CONFIG_LOADING YES) +set(__HUNTER_ALLOW_DEFAULT_VERSION_LOADING YES) +set(__HUNTER_ALLOW_CONFIG_LOADING YES) + +message("--- define default versions in alphabetical order ---") +hunter_default_version(Bar VERSION 2.0) +hunter_default_version(Baz VERSION 2.0) +hunter_default_version(Boo VERSION 2.0) +hunter_default_version(Foo VERSION 1.0) +hunter_default_version(Qoo VERSION 2.0) +hunter_default_version(Qt VERSION 2.0) +hunter_default_version(Roo VERSION 2.0) message("--- Empty by default ---") -hunter_config(Foo VERSION 1.0) string(COMPARE EQUAL "${HUNTER_Foo_CONFIGURATION_TYPES}" "" is_ok) if(NOT is_ok) message(FATAL_ERROR "FAILED") @@ -17,50 +27,46 @@ endif() message("--- Emulate cmake/configs/default.cmake ---") hunter_config(Boo VERSION 2.0 CONFIGURATION_TYPES Release) -string(COMPARE EQUAL "${HUNTER_Boo_CONFIGURATION_TYPES}" "Release" is_ok) +string(COMPARE EQUAL "${__HUNTER_USER_CONFIGURATION_TYPES_Boo}" "Release" is_ok) if(NOT is_ok) message(FATAL_ERROR "FAILED") endif() message("--- Emulate cmake/configs/default.cmake ---") hunter_config(Boo VERSION 2.0 CONFIGURATION_TYPES Release) -string(COMPARE EQUAL "${HUNTER_Boo_CONFIGURATION_TYPES}" "Release" is_ok) +string(COMPARE EQUAL "${__HUNTER_USER_CONFIGURATION_TYPES_Boo}" "Release" is_ok) if(NOT is_ok) message(FATAL_ERROR "FAILED") endif() message("--- Emulate user's config.cmake ---") -hunter_config(Bar VERSION 2.0 CONFIGURATION_TYPES Release) # default hunter_config(Bar VERSION 2.0 CONFIGURATION_TYPES UserRelease) # user's -string(COMPARE EQUAL "${HUNTER_Bar_CONFIGURATION_TYPES}" "UserRelease" is_ok) +string(COMPARE EQUAL "${__HUNTER_USER_CONFIGURATION_TYPES_Bar}" "UserRelease" is_ok) if(NOT is_ok) message(FATAL_ERROR "FAILED") endif() message("--- Emulate default in hunter.cmake ---") -hunter_config(Baz VERSION 2.0) # default # hunter.cmake hunter_configuration_types(Baz CONFIGURATION_TYPES "Release;Debug") -string(COMPARE EQUAL "${HUNTER_Baz_CONFIGURATION_TYPES}" "Release;Debug" is_ok) +string(COMPARE EQUAL "${__HUNTER_DEFAULT_CONFIGURATION_TYPES_Baz}" "Release;Debug" is_ok) if(NOT is_ok) message(FATAL_ERROR "FAILED") endif() message("--- Emulate default in hunter.cmake (list) ---") -hunter_config(Roo VERSION 2.0) # default # hunter.cmake hunter_configuration_types(Roo CONFIGURATION_TYPES Release Debug) -string(COMPARE EQUAL "${HUNTER_Roo_CONFIGURATION_TYPES}" "Release;Debug" is_ok) +string(COMPARE EQUAL "${__HUNTER_DEFAULT_CONFIGURATION_TYPES_Roo}" "Release;Debug" is_ok) if(NOT is_ok) message(FATAL_ERROR "FAILED") endif() message("--- Emulate user overwrite default in hunter.cmake ---") -hunter_config(Qoo VERSION 2.0) # default hunter_config(Qoo VERSION 2.0 CONFIGURATION_TYPES MyRelease Debug) # user # hunter.cmake hunter_configuration_types(Qoo CONFIGURATION_TYPES Release Debug) -string(COMPARE EQUAL "${HUNTER_Qoo_CONFIGURATION_TYPES}" "MyRelease;Debug" is_ok) +string(COMPARE EQUAL "${__HUNTER_USER_CONFIGURATION_TYPES_Qoo}" "MyRelease;Debug" is_ok) if(NOT is_ok) message(FATAL_ERROR "FAILED") endif() @@ -68,7 +74,7 @@ endif() message("--- Count types ---") hunter_config(Qt VERSION 2.0 CONFIGURATION_TYPES MyRelease Debug Fast) # user set(counter "") -foreach(config ${HUNTER_Qt_CONFIGURATION_TYPES}) +foreach(config ${__HUNTER_USER_CONFIGURATION_TYPES_Qt}) set(counter "${counter}x") endforeach() string(COMPARE EQUAL "${counter}" "xxx" is_ok) diff --git a/tests/issue/24/unit/CMakeLists.txt b/tests/issue/24/unit/CMakeLists.txt index b0bf589a5..ebd92caf4 100644 --- a/tests/issue/24/unit/CMakeLists.txt +++ b/tests/issue/24/unit/CMakeLists.txt @@ -4,17 +4,26 @@ include("../../../../examples/common.cmake") project(TestIssue24Unit) +include(hunter_default_version) include(hunter_cmake_args) include(hunter_config) -set(HUNTER_ALLOW_CONFIG_LOADING YES) +set(__HUNTER_ALLOW_DEFAULT_VERSION_LOADING YES) +set(__HUNTER_ALLOW_CONFIG_LOADING YES) +hunter_default_version(Foo VERSION 1.0) hunter_config(Foo VERSION 1.0 CMAKE_ARGS TEST=1) hunter_cmake_args(Foo CMAKE_ARGS TEST=2) -list(GET HUNTER_Foo_CMAKE_ARGS -1 last_item) +list(GET __HUNTER_DEFAULT_CMAKE_ARGS_Foo -1 last_item_default) +if(NOT last_item_default STREQUAL "TEST=2") + message(FATAL_ERROR + "Expected last default CMAKE_ARGS to be the one set by hunter_cmake_args." + "Was '${last_item_default}'") +endif() -if(NOT last_item STREQUAL "TEST=1") +list(GET __HUNTER_USER_CMAKE_ARGS_Foo -1 last_item_user) +if(NOT last_item_user STREQUAL "TEST=1") message(FATAL_ERROR - "Expected last CMAKE_ARGS to be the one set by hunter_config." - "Was '${last_item}'") + "Expected last user CMAKE_ARGS to be the one set by hunter_config." + "Was '${last_item_user}'") endif() diff --git a/tests/simple/CMakeLists.txt b/tests/simple/CMakeLists.txt index b5eb1e55c..86bff43d1 100644 --- a/tests/simple/CMakeLists.txt +++ b/tests/simple/CMakeLists.txt @@ -7,11 +7,11 @@ include("../../examples/common.cmake") project(TestsSimple) -include(hunter_config) +include(hunter_default_version) -set(HUNTER_ALLOW_CONFIG_LOADING YES) +set(__HUNTER_ALLOW_DEFAULT_VERSION_LOADING YES) set(HUNTER_Foo_VERSION "") -hunter_config(Foo VERSION 1.2.3) +hunter_default_version(Foo VERSION 1.2.3) string(COMPARE EQUAL "${HUNTER_Foo_VERSION}" "1.2.3" is_correct) if(NOT is_correct) From 1c0eaab00e428742f1917286f20ffb71baca8e6f Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 10:18:18 +0100 Subject: [PATCH 02/30] Adding missing files --- cmake/HunterGate.cmake | 528 +++++ cmake/find/FindLibR.cmake | 183 ++ cmake/find/Findaccelerate.cmake | 5 + cmake/find/Findandroid.cmake | 5 + cmake/find/Findandroid_log.cmake | 5 + cmake/find/Findappkit.cmake | 5 + cmake/find/Findapplicationservices.cmake | 5 + cmake/find/Findassetslibrary.cmake | 5 + cmake/find/Findaudiotoolbox.cmake | 5 + cmake/find/Findaudiounit.cmake | 5 + cmake/find/Findavfoundation.cmake | 5 + cmake/find/Findcarbon.cmake | 5 + cmake/find/Findcoreaudio.cmake | 5 + cmake/find/Findcoredata.cmake | 5 + cmake/find/Findcorefoundation.cmake | 5 + cmake/find/Findcoregraphics.cmake | 5 + cmake/find/Findcorelocation.cmake | 5 + cmake/find/Findcoremedia.cmake | 5 + cmake/find/Findcoremotion.cmake | 5 + cmake/find/Findcoretext.cmake | 5 + cmake/find/Findcorevideo.cmake | 5 + cmake/find/Findegl.cmake | 5 + cmake/find/Findforcefeedback.cmake | 5 + cmake/find/Findfoundation.cmake | 5 + cmake/find/Findgamecontroller.cmake | 5 + cmake/find/Findglapi.cmake | 5 + cmake/find/Findgles2.cmake | 5 + cmake/find/Findgles3.cmake | 5 + cmake/find/Findglkit.cmake | 5 + cmake/find/Findimageio.cmake | 5 + cmake/find/Findiokit.cmake | 5 + cmake/find/Findjavascriptcore.cmake | 5 + cmake/find/Findmetal.cmake | 5 + cmake/find/Findmobilecoreservices.cmake | 5 + cmake/find/Findopengles.cmake | 5 + cmake/find/Findosmesa.cmake | 5 + cmake/find/Findquartzcore.cmake | 5 + cmake/find/Findreadline.cmake | 23 + cmake/find/Findtcl.cmake | 39 + cmake/find/Finduikit.cmake | 5 + cmake/find/Findvideotoolbox.cmake | 5 + cmake/modules/hunter_append_component.cmake | 57 + .../modules/hunter_assert_empty_string.cmake | 14 + .../hunter_assert_not_empty_string.cmake | 11 + .../hunter_autotools_configure_command.cmake | 238 ++ .../hunter_cache_server_password.cmake | 59 + .../hunter_check_toolchain_definition.cmake | 82 + cmake/modules/hunter_default_version.cmake | 51 + .../modules/hunter_download_server_url.cmake | 135 ++ cmake/modules/hunter_dump_cmake_flags.cmake | 202 ++ cmake/modules/hunter_error_page.cmake | 13 + cmake/modules/hunter_final_config.cmake | 62 + cmake/modules/hunter_find_helper.cmake | 114 + .../hunter_find_helper_framework.cmake | 76 + cmake/modules/hunter_find_licenses.cmake | 37 + .../hunter_generate_qt_5_10_info.cmake | 191 ++ .../hunter_generate_qt_5_11_info.cmake | 190 ++ .../hunter_generate_qt_5_12_info.cmake | 186 ++ .../modules/hunter_generate_qt_5_9_info.cmake | 190 ++ cmake/modules/hunter_get_boost_libs.cmake | 90 + cmake/modules/hunter_get_build_flags.cmake | 152 ++ cmake/modules/hunter_get_cacheable.cmake | 43 + cmake/modules/hunter_get_cmake_args.cmake | 57 + .../hunter_get_configuration_types.cmake | 52 + cmake/modules/hunter_get_git_executable.cmake | 50 + .../hunter_get_keep_package_sources.cmake | 46 + .../hunter_get_lang_standard_flag.cmake | 69 + cmake/modules/hunter_get_package_sha1.cmake | 52 + cmake/modules/hunter_get_package_url.cmake | 51 + cmake/modules/hunter_get_passwords_path.cmake | 56 + .../hunter_get_project_files_to_load.cmake | 67 + .../hunter_get_toolchain_binaries.cmake | 168 ++ cmake/modules/hunter_http_password.cmake | 27 + .../hunter_libxml2_install_tools.cmake | 41 + cmake/modules/hunter_pack_git_self.cmake | 311 +++ cmake/modules/hunter_pack_git_submodule.cmake | 220 ++ .../hunter_parse_boost_config_macros.cmake | 22 + .../hunter_parse_cmake_args_for_keyword.cmake | 63 + cmake/modules/hunter_pick_archiver.cmake | 36 + .../hunter_pkgconfig_export_target.cmake | 112 + cmake/modules/hunter_private_data.cmake | 304 +++ .../hunter_private_data_password.cmake | 34 + cmake/modules/hunter_protected_sources.cmake | 14 + .../hunter_read_http_credentials.cmake | 42 + .../hunter_step_into_unpacked_directory.cmake | 18 + cmake/modules/hunter_upload_cache.cmake | 119 + cmake/modules/hunter_upload_password.cmake | 59 + cmake/modules/hunter_upload_single_file.cmake | 91 + .../hunter_upload_to_custom_server.cmake | 90 + .../projects/ARM_NEON_2_x86_SSE/hunter.cmake | 36 + .../hunter.cmake | 68 + .../hunter.cmake | 24 + .../Android-MIPS-System-Image/hunter.cmake | 24 + cmake/projects/AngelScript/hunter.cmake | 24 + cmake/projects/Beast/hunter.cmake | 36 + cmake/projects/Boost/contract/hunter.cmake | 22 + cmake/projects/Boost/fiber/hunter.cmake | 22 + .../scripts/create-boost-1-66-ios-fatlib.sh | 67 + .../Boost/scripts/patched_boostrap.bat.in | 6 + cmake/projects/Boost/stacktrace/hunter.cmake | 22 + cmake/projects/BoringSSL/hunter.cmake | 41 + cmake/projects/Box2D/hunter.cmake | 24 + cmake/projects/CLI11/hunter.cmake | 112 + cmake/projects/CapnProto/hunter.cmake | 34 + cmake/projects/Catch/hunter.cmake | 119 + cmake/projects/CreateLaunchers/hunter.cmake | 46 + cmake/projects/EnumGroup/hunter.cmake | 31 + cmake/projects/FP16/hunter.cmake | 27 + cmake/projects/FakeIt/hunter.cmake | 21 + cmake/projects/Fruit/hunter.cmake | 32 + cmake/projects/FunctionalPlus/hunter.cmake | 31 + cmake/projects/HalideIR/hunter.cmake | 46 + cmake/projects/HastyNoise/hunter.cmake | 53 + cmake/projects/ICU/hunter.cmake | 112 + cmake/projects/IF97/hunter.cmake | 31 + cmake/projects/LAPACK/hunter-msvc.cmake | 36 + cmake/projects/LAPACK/hunter-source.cmake | 27 + cmake/projects/LAPACK/hunter.cmake | 23 + cmake/projects/Leptonica/hunter.cmake | 24 + cmake/projects/LibCDS/hunter.cmake | 16 + cmake/projects/Libevent/hunter.cmake | 35 + cmake/projects/LodePNG/hunter.cmake | 24 + cmake/projects/MathFu/hunter.cmake | 32 + cmake/projects/Microsoft.GSL/hunter.cmake | 53 + cmake/projects/NASM/hunter.cmake | 48 + .../schemes/url_sha1_nasm_windows.cmake.in | 68 + cmake/projects/NLopt/hunter.cmake | 36 + cmake/projects/ONNX/hunter.cmake | 26 + cmake/projects/OpenAL/hunter.cmake | 16 + cmake/projects/OpenCL-cpp/hunter.cmake | 33 + cmake/projects/OpenCL/hunter.cmake | 43 + cmake/projects/OpenNMTTokenizer/hunter.cmake | 60 + .../OpenSSL/ep-stages/configure.cmake.in | 23 + .../ep-stages/configure_1_1_plus.cmake.in | 27 + .../schemes/url_sha1_openssl_macos.cmake.in | 209 ++ cmake/projects/OpenSceneGraph/hunter.cmake | 24 + cmake/projects/PROJ4/hunter.cmake | 42 + cmake/projects/PhysUnits/hunter.cmake | 24 + cmake/projects/Qt/qtcharts/hunter.cmake | 146 ++ cmake/projects/Qt/qtdatavis3d/hunter.cmake | 146 ++ cmake/projects/Qt/qtdocgallery/hunter.cmake | 146 ++ cmake/projects/Qt/qtfeedback/hunter.cmake | 146 ++ cmake/projects/Qt/qtgamepad/hunter.cmake | 146 ++ cmake/projects/Qt/qtnetworkauth/hunter.cmake | 146 ++ cmake/projects/Qt/qtpim/hunter.cmake | 146 ++ cmake/projects/Qt/qtpurchasing/hunter.cmake | 146 ++ cmake/projects/Qt/qtqa/hunter.cmake | 146 ++ .../projects/Qt/qtremoteobjects/hunter.cmake | 146 ++ cmake/projects/Qt/qtrepotools/hunter.cmake | 146 ++ cmake/projects/Qt/qtscxml/hunter.cmake | 146 ++ cmake/projects/Qt/qtserialbus/hunter.cmake | 146 ++ cmake/projects/Qt/qtspeech/hunter.cmake | 146 ++ cmake/projects/Qt/qtsystems/hunter.cmake | 146 ++ .../Qt/qtvirtualkeyboard/hunter.cmake | 146 ++ cmake/projects/QtPropertyEditor/hunter.cmake | 24 + cmake/projects/Qwt/hunter.cmake | 36 + cmake/projects/RapidXML/hunter.cmake | 21 + cmake/projects/RedisClient/hunter.cmake | 32 + cmake/projects/SDL_image/hunter.cmake | 22 + cmake/projects/SDL_mixer/hunter.cmake | 33 + cmake/projects/SDL_ttf/hunter.cmake | 22 + cmake/projects/SimpleSignal/hunter.cmake | 24 + cmake/projects/Snappy/hunter.cmake | 42 + cmake/projects/Sqlpp11/hunter.cmake | 30 + cmake/projects/SuiteSparse/hunter.cmake | 66 + cmake/projects/TCLAP/hunter.cmake | 27 + cmake/projects/Tesseract/hunter.cmake | 34 + cmake/projects/Urho3D/hunter.cmake | 139 ++ .../VulkanMemoryAllocator/hunter.cmake | 35 + cmake/projects/WDC/hunter.cmake | 67 + cmake/projects/WebKit/hunter.cmake | 51 + cmake/projects/WebP/hunter.cmake | 128 ++ cmake/projects/YAJL/hunter.cmake | 31 + cmake/projects/acf/hunter.cmake | 77 + cmake/projects/actionlib/hunter.cmake | 31 + cmake/projects/aes/hunter.cmake | 35 + cmake/projects/aglet/hunter.cmake | 69 + .../hunter.cmake | 24 + .../hunter.cmake | 24 + .../android_build_tools_packer/hunter.cmake | 24 + .../hunter.cmake | 24 + .../android_google_apis_packer/hunter.cmake | 24 + .../hunter.cmake | 24 + .../hunter.cmake | 24 + .../hunter.cmake | 24 + .../projects/android_sdk_packer/hunter.cmake | 24 + .../android_sdk_platform_packer/hunter.cmake | 24 + .../hunter.cmake | 24 + .../android_sdk_tools_packer/hunter.cmake | 57 + .../hunter.cmake | 24 + cmake/projects/angles/hunter.cmake | 31 + cmake/projects/arabica/hunter.cmake | 32 + cmake/projects/autobahn-cpp/hunter.cmake | 21 + cmake/projects/autoutils/hunter.cmake | 26 + cmake/projects/aws-c-common/hunter.cmake | 24 + cmake/projects/benchmark/hunter.cmake | 32 + cmake/projects/bento4/hunter.cmake | 24 + cmake/projects/binaryen/hunter.cmake | 45 + cmake/projects/bison/hunter.cmake | 30 + cmake/projects/boost-pba/hunter.cmake | 37 + cmake/projects/botan/hunter.cmake | 71 + .../botan/schemes/url_sha1_botan.cmake.in | 299 +++ .../botan/schemes/url_sha1_botan_ios.cmake.in | 324 +++ .../schemes/url_sha1_botan_macos.cmake.in | 268 +++ .../botan/schemes/url_sha1_botan_win.cmake.in | 290 +++ cmake/projects/breakpad/hunter.cmake | 35 + cmake/projects/bullet/hunter.cmake | 36 + cmake/projects/c-ares/hunter.cmake | 28 + cmake/projects/catkin/hunter.cmake | 64 + cmake/projects/cctz/hunter.cmake | 19 + cmake/projects/ceres-solver/hunter.cmake | 89 + cmake/projects/check_ci_tag/hunter.cmake | 24 + cmake/projects/civetweb/hunter.cmake | 49 + cmake/projects/class_loader/hunter.cmake | 32 + cmake/projects/cmcstl2/hunter.cmake | 33 + cmake/projects/corrade/hunter.cmake | 61 + cmake/projects/cpp_redis/hunter.cmake | 31 + cmake/projects/cppcodec/hunter.cmake | 31 + cmake/projects/cpr/hunter.cmake | 30 + cmake/projects/cpuinfo/hunter.cmake | 33 + cmake/projects/crc32c/hunter.cmake | 22 + cmake/projects/cryptopp/hunter.cmake | 63 + cmake/projects/ctti/hunter.cmake | 32 + cmake/projects/cub/hunter.cmake | 37 + cmake/projects/cvsteer/hunter.cmake | 37 + cmake/projects/cxxopts/hunter.cmake | 122 + cmake/projects/czmq/hunter.cmake | 65 + cmake/projects/date/hunter.cmake | 27 + cmake/projects/debug_assert/hunter.cmake | 48 + cmake/projects/dlpack/hunter.cmake | 82 + cmake/projects/dmlc-core/hunter.cmake | 114 + cmake/projects/doctest/hunter.cmake | 56 + cmake/projects/double-conversion/hunter.cmake | 33 + cmake/projects/draco/hunter.cmake | 24 + cmake/projects/drishti/hunter.cmake | 54 + cmake/projects/drishti_assets/hunter.cmake | 47 + cmake/projects/drishti_faces/hunter.cmake | 35 + cmake/projects/duktape/hunter.cmake | 35 + cmake/projects/dynalo/hunter.cmake | 21 + cmake/projects/eigen3-nnls/hunter.cmake | 37 + cmake/projects/enet/hunter.cmake | 27 + cmake/projects/entityx/hunter.cmake | 33 + cmake/projects/ethash/hunter.cmake | 85 + cmake/projects/farmhash/hunter.cmake | 26 + cmake/projects/ffmpeg/hunter.cmake | 83 + cmake/projects/fft2d/hunter.cmake | 26 + cmake/projects/flex/hunter.cmake | 25 + .../schemes/url_sha1_flex_autotools.cmake.in | 51 + cmake/projects/folly/hunter.cmake | 90 + cmake/projects/foo/hunter.cmake | 24 + cmake/projects/frugally-deep/hunter.cmake | 39 + cmake/projects/gRPC/hunter.cmake | 40 + cmake/projects/gauze/hunter.cmake | 158 ++ cmake/projects/gemmlowp/hunter.cmake | 26 + cmake/projects/getopt/hunter.cmake | 26 + cmake/projects/giflib/hunter.cmake | 37 + cmake/projects/glbinding/hunter.cmake | 54 + cmake/projects/glib/hunter.cmake | 54 + cmake/projects/globjects/hunter.cmake | 41 + cmake/projects/glslang/hunter.cmake | 40 + cmake/projects/gst_plugins_bad/hunter.cmake | 143 ++ cmake/projects/gst_plugins_base/hunter.cmake | 104 + cmake/projects/gst_plugins_good/hunter.cmake | 89 + cmake/projects/gst_plugins_ugly/hunter.cmake | 45 + cmake/projects/gstreamer/hunter.cmake | 52 + cmake/projects/gumbo/hunter.cmake | 19 + cmake/projects/h3/hunter.cmake | 40 + cmake/projects/harfbuzz/hunter.cmake | 64 + cmake/projects/highwayhash/hunter.cmake | 26 + cmake/projects/http-parser/hunter.cmake | 17 + cmake/projects/hunter_venv/hunter.cmake | 45 + cmake/projects/icu-le-hb/hunter.cmake | 24 + cmake/projects/icu-lx/hunter.cmake | 35 + cmake/projects/imagequant/hunter.cmake | 24 + cmake/projects/imgui/hunter.cmake | 43 + cmake/projects/imshow/hunter.cmake | 37 + cmake/projects/inja/hunter.cmake | 31 + cmake/projects/intsizeof/hunter.cmake | 57 + cmake/projects/intx/hunter.cmake | 43 + cmake/projects/iroha-ed25519/hunter.cmake | 36 + cmake/projects/jaegertracing/hunter.cmake | 20 + cmake/projects/jansson/hunter.cmake | 21 + cmake/projects/jasper/hunter.cmake | 67 + cmake/projects/jo_jpeg/hunter.cmake | 24 + cmake/projects/jsoncpp/hunter.cmake | 59 + cmake/projects/kNet/hunter.cmake | 24 + cmake/projects/lcms/hunter.cmake | 24 + cmake/projects/lehrfempp/hunter.cmake | 164 ++ cmake/projects/leveldb/hunter.cmake | 27 + cmake/projects/libcpuid/hunter.cmake | 24 + cmake/projects/libdill/hunter.cmake | 20 + cmake/projects/libevhtp/hunter.cmake | 17 + cmake/projects/libffi/hunter.cmake | 40 + cmake/projects/libigl/hunter.cmake | 57 + cmake/projects/libjson-rpc-cpp/hunter.cmake | 61 + cmake/projects/libmill/hunter.cmake | 20 + cmake/projects/libpcre/hunter.cmake | 46 + cmake/projects/librtmp/hunter.cmake | 27 + cmake/projects/libscrypt/hunter.cmake | 34 + cmake/projects/libunibreak/hunter.cmake | 31 + cmake/projects/libusb/hunter.cmake | 37 + cmake/projects/libuv/hunter.cmake | 93 + cmake/projects/libxdg-basedir/hunter.cmake | 27 + cmake/projects/libxml2/hunter.cmake | 24 + .../schemes/url_sha1_libxml2_msvc.cmake.in | 140 ++ .../libxml2/scripts/patched_bootstrap.bat.in | 7 + cmake/projects/libzip/hunter.cmake | 39 + cmake/projects/lmdb/hunter.cmake | 35 + cmake/projects/lmdbxx/hunter.cmake | 16 + cmake/projects/lz4/hunter.cmake | 35 + cmake/projects/lzma/hunter.cmake | 57 + cmake/projects/magnum/hunter.cmake | 116 + cmake/projects/md5/hunter.cmake | 24 + cmake/projects/mkl/hunter.cmake | 82 + cmake/projects/mkldnn/hunter.cmake | 66 + cmake/projects/mng/hunter.cmake | 49 + cmake/projects/mojoshader/hunter.cmake | 24 + cmake/projects/mongoose/hunter.cmake | 35 + cmake/projects/mpark_variant/hunter.cmake | 29 + cmake/projects/mshadow/hunter.cmake | 35 + cmake/projects/mtplz/hunter.cmake | 44 + cmake/projects/mxnet/hunter.cmake | 108 + cmake/projects/nanoflann/hunter.cmake | 33 + cmake/projects/nanosvg/hunter.cmake | 24 + cmake/projects/ncnn/hunter.cmake | 32 + cmake/projects/ncursesw/hunter.cmake | 43 + cmake/projects/nlohmann_fifo_map/hunter.cmake | 24 + cmake/projects/nlohmann_json/hunter.cmake | 127 ++ cmake/projects/nsync/hunter.cmake | 26 + cmake/projects/oniguruma/hunter.cmake | 17 + cmake/projects/onmt/hunter.cmake | 38 + cmake/projects/opentracing-cpp/hunter.cmake | 56 + cmake/projects/pcg/hunter.cmake | 19 + cmake/projects/pcre2/hunter.cmake | 35 + cmake/projects/pegtl/hunter.cmake | 66 + cmake/projects/pip_GitPython/hunter.cmake | 31 + cmake/projects/pip_astroid/hunter.cmake | 38 + cmake/projects/pip_boto3/hunter.cmake | 40 + cmake/projects/pip_botocore/hunter.cmake | 24 + cmake/projects/pip_certifi/hunter.cmake | 24 + cmake/projects/pip_chardet/hunter.cmake | 24 + cmake/projects/pip_cpplint/hunter.cmake | 24 + cmake/projects/pip_decorator/hunter.cmake | 25 + cmake/projects/pip_gitdb/hunter.cmake | 31 + cmake/projects/pip_idna/hunter.cmake | 24 + cmake/projects/pip_jmespath/hunter.cmake | 24 + .../pip_lazy-object-proxy/hunter.cmake | 24 + cmake/projects/pip_nose-timer/hunter.cmake | 24 + cmake/projects/pip_nose/hunter.cmake | 24 + cmake/projects/pip_numpy/hunter.cmake | 24 + cmake/projects/pip_pylint/hunter.cmake | 31 + .../projects/pip_python-dateutil/hunter.cmake | 31 + cmake/projects/pip_requests/hunter.cmake | 39 + cmake/projects/pip_six/hunter.cmake | 24 + cmake/projects/pip_smmap/hunter.cmake | 24 + cmake/projects/pip_urllib3/hunter.cmake | 24 + cmake/projects/pip_wrapt/hunter.cmake | 24 + cmake/projects/pluginlib/hunter.cmake | 31 + cmake/projects/prometheus-cpp/hunter.cmake | 33 + cmake/projects/protobuf-c/hunter.cmake | 25 + cmake/projects/pugixml/hunter.cmake | 18 + cmake/projects/pybind11/hunter.cmake | 25 + cmake/projects/qhull/hunter.cmake | 35 + cmake/projects/quickjs/hunter.cmake | 24 + cmake/projects/rabit/hunter.cmake | 48 + cmake/projects/rang/hunter.cmake | 24 + cmake/projects/range-v3/hunter.cmake | 72 + cmake/projects/re2/hunter.cmake | 26 + cmake/projects/readline/hunter.cmake | 35 + cmake/projects/recastnavigation/hunter.cmake | 24 + cmake/projects/rocksdb/hunter.cmake | 47 + cmake/projects/ros/hunter.cmake | 42 + cmake/projects/ros_comm/hunter.cmake | 31 + cmake/projects/ros_comm_msgs/hunter.cmake | 31 + cmake/projects/ros_common_msgs/hunter.cmake | 42 + .../projects/ros_console_bridge/hunter.cmake | 35 + cmake/projects/ros_environment/hunter.cmake | 42 + cmake/projects/ros_gencpp/hunter.cmake | 42 + cmake/projects/ros_geneus/hunter.cmake | 31 + cmake/projects/ros_genlisp/hunter.cmake | 31 + cmake/projects/ros_genmsg/hunter.cmake | 42 + cmake/projects/ros_gennodejs/hunter.cmake | 31 + cmake/projects/ros_genpy/hunter.cmake | 42 + .../ros_message_generation/hunter.cmake | 31 + .../projects/ros_message_runtime/hunter.cmake | 31 + cmake/projects/ros_std_msgs/hunter.cmake | 42 + cmake/projects/rosconsole/hunter.cmake | 31 + cmake/projects/roscpp_core/hunter.cmake | 42 + cmake/projects/rospack/hunter.cmake | 42 + cmake/projects/s3/hunter.cmake | 35 + cmake/projects/sds/hunter.cmake | 19 + cmake/projects/sentencepiece/hunter.cmake | 47 + .../shaka_player_embedded/hunter.cmake | 35 + cmake/projects/sleef/hunter.cmake | 27 + cmake/projects/soil/hunter.cmake | 19 + .../hunter.cmake | 24 + cmake/projects/spirv-cross/hunter.cmake | 24 + cmake/projects/sqlite3/hunter.cmake | 73 + cmake/projects/sse2neon/hunter.cmake | 25 + cmake/projects/stanhull/hunter.cmake | 24 + cmake/projects/state_machine/hunter.cmake | 24 + cmake/projects/stb/hunter.cmake | 35 + cmake/projects/stdext-path/hunter.cmake | 24 + cmake/projects/stormlib/hunter.cmake | 27 + cmake/projects/sugar/hunter.cmake | 24 + cmake/projects/tacopie/hunter.cmake | 42 + cmake/projects/taocpp-json/hunter.cmake | 31 + cmake/projects/tcl/hunter.cmake | 23 + .../schemes/url_sha1_tcl_autotools.cmake.in | 103 + cmake/projects/tcl/scripts/android_def.h | 3 + cmake/projects/tcl/scripts/android_uname.in | 20 + cmake/projects/tcl/scripts/configure | 3 + cmake/projects/termcolor/hunter.cmake | 26 + cmake/projects/tf/hunter.cmake | 31 + cmake/projects/tf2/hunter.cmake | 31 + cmake/projects/thrift/hunter.cmake | 76 + cmake/projects/tinyxml2/hunter.cmake | 31 + cmake/projects/tmxparser/hunter.cmake | 34 + cmake/projects/toluapp/hunter.cmake | 35 + cmake/projects/tomcrypt/hunter.cmake | 58 + cmake/projects/tommath/hunter.cmake | 36 + cmake/projects/tvm/hunter.cmake | 124 + cmake/projects/type_safe/hunter.cmake | 81 + cmake/projects/units/hunter.cmake | 43 + cmake/projects/utf8/hunter.cmake | 35 + cmake/projects/util_linux/hunter.cmake | 49 + cmake/projects/v8/hunter.cmake | 57 + cmake/projects/vectorial/hunter.cmake | 24 + cmake/projects/vorbis/hunter.cmake | 24 + cmake/projects/wt/hunter.cmake | 39 + cmake/projects/wyrm/hunter.cmake | 33 + cmake/projects/x264/hunter.cmake | 41 + .../x264/schemes/url_sha1_x264.cmake.in | 351 +++ cmake/projects/xi/hunter.cmake | 52 + cmake/projects/xxhash/hunter.cmake | 24 + cmake/projects/yaml-cpp/hunter.cmake | 72 + cmake/projects/zip/hunter.cmake | 31 + cmake/projects/zookeeper/hunter.cmake | 27 + cmake/schemes/url_sha1_pip.cmake.in | 147 ++ .../url_sha1_unpack_bin_install.cmake.in | 50 + cmake/templates/libxml2Config.cmake.in | 29 + cmake/templates/libxml2Targets.cmake.in | 15 + cmake/templates/pip_config.cmake.in | 5 + docs/creating-new/create.rst | 18 + docs/creating-new/create/autotools.rst | 146 ++ docs/creating-new/create/ci/.travis-NEW.yml | 107 + docs/creating-new/create/ci/.travis-OLD.yml | 103 + .../create/cmake-dependencies.rst | 82 + docs/creating-new/create/cmake.rst | 982 ++++++++ docs/creating-new/create/custom.rst | 189 ++ docs/creating-new/default-NEW.cmake | 312 +++ docs/creating-new/default.cmake | 312 +++ docs/creating-new/hunter-NEW.cmake | 35 + docs/creating-new/hunter.cmake | 24 + docs/creating-new/images/branches.png | Bin 0 -> 93738 bytes docs/creating-new/images/package-testing.png | Bin 0 -> 50208 bytes docs/creating-new/images/pr-change-branch.png | Bin 0 -> 35919 bytes docs/creating-new/images/pr-number.png | Bin 0 -> 17239 bytes .../creating-new/images/pr-update-version.png | Bin 0 -> 26997 bytes docs/creating-new/images/pr-with-package.png | Bin 0 -> 30959 bytes docs/creating-new/images/pr-with-tests.png | Bin 0 -> 32292 bytes .../images/pull-request-testing.png | Bin 0 -> 24709 bytes docs/creating-new/images/pull-request.png | Bin 0 -> 32520 bytes docs/creating-new/images/release.png | Bin 0 -> 20667 bytes docs/creating-new/images/upload.png | Bin 0 -> 30829 bytes docs/creating-new/patch.rst | 63 + docs/creating-new/update.rst | 136 ++ docs/creating-new/yed/branches.graphml | 711 ++++++ .../yed/pr-update-version.graphml | 373 +++ .../yed/pull-request-testing.graphml | 342 +++ docs/creating-new/yed/pull-request.graphml | 440 ++++ docs/faq/android-studio-breakpoint.png | Bin 0 -> 129211 bytes docs/faq/android-studio-debugger.png | Bin 0 -> 155179 bytes docs/faq/android-studio-hello-jni.png | Bin 0 -> 267835 bytes docs/faq/android-studio.rst | 374 +++ docs/faq/foo-v1.0-hunter.cmake | 7 + docs/faq/foo-v1.0.cmake | 5 + docs/faq/foo-v2.0-hunter.cmake | 7 + docs/faq/foo-v2.0.cmake | 5 + .../how-to-download-private-github-asset.rst | 67 + docs/faq/how-to-fix-download-error.rst | 57 + docs/faq/how-to-fix-hash-mismatch-error.rst | 66 + docs/faq/why-do-we-need-forks.rst | 174 ++ .../faq/why-do-we-need-hunter-add-package.rst | 89 + docs/faq/why-hunter-is-slow.rst | 305 +++ docs/old-wiki/Home.md | 19 + docs/old-wiki/Pitfalls.md | 46 + docs/old-wiki/Rationale.md | 11 + docs/old-wiki/Requirements.md | 86 + docs/old-wiki/Used-variables.md | 17 + docs/old-wiki/dev.build.schemes.md | 46 + docs/old-wiki/dev.hunter.root.md | 91 + docs/old-wiki/dev.scheme_variables.md | 48 + docs/old-wiki/dev.variables.md | 68 + docs/old-wiki/example.custom.config.id.md | 201 ++ docs/old-wiki/example.find_package.config.md | 107 + docs/old-wiki/example.hunter.run.install.md | 40 + .../example.hunter_configuration_types.md | 98 + docs/old-wiki/jenkins-pitfalls.md | 53 + .../rationale-toolchain-verification.md | 1 + .../usr.adding.new.package.custom.scheme.md | 167 ++ docs/packages/all.rst | 12 + docs/packages/cmake_modules.rst | 10 + docs/packages/commandline.rst | 12 + docs/packages/compiler.rst | 7 + docs/packages/compression.rst | 9 + docs/packages/computer-vision.rst | 22 + docs/packages/concurrency.rst | 24 + docs/packages/containers.rst | 5 + docs/packages/crypto.rst | 11 + docs/packages/database.rst | 18 + docs/packages/datetime.rst | 9 + docs/packages/filesystem.rst | 9 + docs/packages/frameworks.rst | 16 + docs/packages/graphics.rst | 18 + docs/packages/logging.rst | 7 + docs/packages/machine-learning.rst | 11 + docs/packages/math.rst | 19 + docs/packages/media.rst | 17 + docs/packages/messaging.rst | 12 + docs/packages/networking.rst | 30 + docs/packages/os.rst | 10 + docs/packages/pkg/ARM_NEON_2_x86_SSE.rst | 20 + docs/packages/pkg/AllTheFlopsThreads.rst | 28 + .../pkg/Android-ARM-EABI-v7a-System-Image.rst | 29 + .../pkg/Android-ARM64-v8a-System-Image.rst | 21 + docs/packages/pkg/Android-Apk.rst | 23 + docs/packages/pkg/Android-Build-Tools.rst | 28 + ...oogle-APIs-Intel-x86-Atom-System-Image.rst | 29 + docs/packages/pkg/Android-Google-APIs.rst | 29 + .../pkg/Android-Google-Repository.rst | 28 + .../Android-Intel-x86-Atom-System-Image.rst | 28 + .../pkg/Android-MIPS-System-Image.rst | 20 + docs/packages/pkg/Android-Modules.rst | 22 + .../pkg/Android-SDK-Platform-tools.rst | 28 + docs/packages/pkg/Android-SDK-Platform.rst | 28 + docs/packages/pkg/Android-SDK-Tools.rst | 28 + docs/packages/pkg/Android-SDK.rst | 23 + .../pkg/Android-Support-Repository.rst | 28 + docs/packages/pkg/AngelScript.rst | 20 + docs/packages/pkg/ArrayFire.rst | 27 + docs/packages/pkg/Assimp.rst | 21 + docs/packages/pkg/Async++.rst | 25 + docs/packages/pkg/Avahi.rst | 26 + docs/packages/pkg/BZip2.rst | 26 + docs/packages/pkg/Beast.rst | 24 + docs/packages/pkg/Boost.rst | 177 ++ docs/packages/pkg/BoostCompute.rst | 25 + docs/packages/pkg/BoostProcess.rst | 27 + docs/packages/pkg/BoringSSL.rst | 28 + docs/packages/pkg/Box2D.rst | 21 + docs/packages/pkg/CLAPACK.rst | 28 + docs/packages/pkg/CLI11.rst | 20 + docs/packages/pkg/CURL.rst | 20 + docs/packages/pkg/CapnProto.rst | 25 + docs/packages/pkg/Catch.rst | 23 + docs/packages/pkg/Clang.rst | 28 + docs/packages/pkg/ClangToolsExtra.rst | 28 + docs/packages/pkg/Comet.rst | 18 + docs/packages/pkg/CppNetlib.rst | 28 + docs/packages/pkg/CppNetlibUri.rst | 25 + docs/packages/pkg/CreateLaunchers.rst | 18 + docs/packages/pkg/CsvParserCPlusPlus.rst | 23 + docs/packages/pkg/Eigen.rst | 29 + docs/packages/pkg/EnumGroup.rst | 19 + docs/packages/pkg/Expat.rst | 28 + docs/packages/pkg/FP16.rst | 21 + docs/packages/pkg/FakeIt.rst | 24 + docs/packages/pkg/Fruit.rst | 37 + docs/packages/pkg/FunctionalPlus.rst | 18 + docs/packages/pkg/GPUImage.rst | 19 + docs/packages/pkg/GSL.rst | 20 + docs/packages/pkg/GTest.rst | 60 + docs/packages/pkg/HalideIR.rst | 20 + docs/packages/pkg/HastyNoise.rst | 21 + docs/packages/pkg/ICU.rst | 45 + docs/packages/pkg/IF97.rst | 21 + docs/packages/pkg/Igloo.rst | 28 + docs/packages/pkg/Jpeg.rst | 19 + docs/packages/pkg/JsonSpirit.rst | 24 + docs/packages/pkg/LAPACK.rst | 27 + docs/packages/pkg/LLVM.rst | 30 + docs/packages/pkg/LLVMCompilerRT.rst | 28 + docs/packages/pkg/Leathers.rst | 17 + docs/packages/pkg/Leptonica.rst | 26 + docs/packages/pkg/LibCDS.rst | 21 + docs/packages/pkg/Libcxx.rst | 28 + docs/packages/pkg/Libcxxabi.rst | 28 + docs/packages/pkg/Libevent.rst | 22 + docs/packages/pkg/Libssh2.rst | 19 + docs/packages/pkg/LodePNG.rst | 20 + docs/packages/pkg/Lua.rst | 41 + docs/packages/pkg/MathFu.rst | 21 + docs/packages/pkg/Microsoft.GSL.rst | 21 + docs/packages/pkg/MySQL-client.rst | 32 + docs/packages/pkg/NASM.rst | 28 + docs/packages/pkg/NLopt.rst | 21 + docs/packages/pkg/ONNX.rst | 21 + docs/packages/pkg/OpenAL.rst | 20 + docs/packages/pkg/OpenBLAS.rst | 25 + docs/packages/pkg/OpenCL-cpp.rst | 29 + docs/packages/pkg/OpenCL.rst | 45 + docs/packages/pkg/OpenCV-Extra.rst | 28 + docs/packages/pkg/OpenCV.rst | 62 + docs/packages/pkg/OpenNMTTokenizer.rst | 19 + docs/packages/pkg/OpenSSL.rst | 33 + docs/packages/pkg/OpenSceneGraph.rst | 21 + docs/packages/pkg/PNG.rst | 29 + docs/packages/pkg/PROJ4.rst | 18 + docs/packages/pkg/PhysUnits.rst | 21 + docs/packages/pkg/PocoCpp.rst | 39 + docs/packages/pkg/PostgreSQL.rst | 36 + docs/packages/pkg/Protobuf.rst | 36 + docs/packages/pkg/Qt.rst | 252 +++ docs/packages/pkg/QtAndroidCMake.rst | 24 + docs/packages/pkg/QtCMakeExtra.rst | 28 + docs/packages/pkg/QtPropertyEditor.rst | 21 + docs/packages/pkg/QtQmlManager.rst | 21 + docs/packages/pkg/Qwt.rst | 21 + docs/packages/pkg/RapidJSON.rst | 21 + docs/packages/pkg/RapidXML.rst | 22 + docs/packages/pkg/RedisClient.rst | 20 + docs/packages/pkg/SDL2.rst | 26 + docs/packages/pkg/SDL_image.rst | 24 + docs/packages/pkg/SDL_mixer.rst | 23 + docs/packages/pkg/SDL_ttf.rst | 25 + docs/packages/pkg/SimpleSignal.rst | 21 + docs/packages/pkg/Snappy.rst | 21 + docs/packages/pkg/Sober.rst | 28 + docs/packages/pkg/Sources-for-Android-SDK.rst | 28 + docs/packages/pkg/Sqlpp11.rst | 21 + docs/packages/pkg/SuiteSparse.rst | 44 + docs/packages/pkg/TIFF.rst | 20 + docs/packages/pkg/Tesseract.rst | 25 + docs/packages/pkg/Urho3D.rst | 42 + docs/packages/pkg/VulkanMemoryAllocator.rst | 31 + docs/packages/pkg/WDC.rst | 20 + docs/packages/pkg/WTL.rst | 26 + docs/packages/pkg/Washer.rst | 28 + docs/packages/pkg/WebKit.rst | 20 + docs/packages/pkg/WebP.rst | 23 + docs/packages/pkg/WinSparkle.rst | 28 + docs/packages/pkg/YAJL.rst | 21 + docs/packages/pkg/ZLIB.rst | 28 + docs/packages/pkg/ZMQPP.rst | 41 + docs/packages/pkg/ZeroMQ.rst | 36 + docs/packages/pkg/accelerate.rst | 27 + docs/packages/pkg/acf.rst | 20 + docs/packages/pkg/actionlib.rst | 22 + docs/packages/pkg/aes.rst | 20 + docs/packages/pkg/aglet.rst | 19 + docs/packages/pkg/android.rst | 19 + .../android_arm64_v8a_system_image_packer.rst | 23 + ...droid_arm_eabi_v7a_system_image_packer.rst | 18 + .../pkg/android_build_tools_packer.rst | 21 + ...pis_intel_x86_atom_system_image_packer.rst | 26 + .../pkg/android_google_apis_packer.rst | 21 + .../pkg/android_google_repository_packer.rst | 21 + ...oid_intel_x86_atom_system_image_packer.rst | 24 + docs/packages/pkg/android_log.rst | 19 + .../pkg/android_mips_system_image_packer.rst | 22 + docs/packages/pkg/android_sdk_packer.rst | 20 + .../pkg/android_sdk_platform_packer.rst | 21 + .../pkg/android_sdk_platform_tools_packer.rst | 22 + .../packages/pkg/android_sdk_tools_packer.rst | 21 + .../pkg/android_support_repository_packer.rst | 21 + docs/packages/pkg/angles.rst | 21 + docs/packages/pkg/appkit.rst | 27 + docs/packages/pkg/applicationservices.rst | 27 + docs/packages/pkg/arabica.rst | 21 + docs/packages/pkg/assetslibrary.rst | 27 + docs/packages/pkg/audiotoolbox.rst | 27 + docs/packages/pkg/audiounit.rst | 27 + docs/packages/pkg/autobahn-cpp.rst | 24 + docs/packages/pkg/autoutils.rst | 19 + docs/packages/pkg/avfoundation.rst | 27 + docs/packages/pkg/aws-c-common.rst | 22 + docs/packages/pkg/benchmark.rst | 20 + docs/packages/pkg/bento4.rst | 20 + docs/packages/pkg/binaryen.rst | 22 + docs/packages/pkg/bison.rst | 21 + docs/packages/pkg/boost-pba.rst | 19 + docs/packages/pkg/botan.rst | 20 + docs/packages/pkg/breakpad.rst | 21 + docs/packages/pkg/bullet.rst | 30 + docs/packages/pkg/c-ares.rst | 20 + docs/packages/pkg/caffe.rst | 31 + docs/packages/pkg/carbon.rst | 25 + docs/packages/pkg/catkin.rst | 23 + docs/packages/pkg/cctz.rst | 20 + docs/packages/pkg/ccv.rst | 19 + docs/packages/pkg/cereal.rst | 19 + docs/packages/pkg/ceres-solver.rst | 87 + docs/packages/pkg/check_ci_tag.rst | 18 + docs/packages/pkg/civetweb.rst | 20 + docs/packages/pkg/clBLAS.rst | 28 + docs/packages/pkg/class_loader.rst | 26 + docs/packages/pkg/cmcstl2.rst | 19 + docs/packages/pkg/convertutf.rst | 19 + docs/packages/pkg/coreaudio.rst | 27 + docs/packages/pkg/coredata.rst | 27 + docs/packages/pkg/corefoundation.rst | 27 + docs/packages/pkg/coregraphics.rst | 27 + docs/packages/pkg/corelocation.rst | 27 + docs/packages/pkg/coremedia.rst | 27 + docs/packages/pkg/coremotion.rst | 27 + docs/packages/pkg/coretext.rst | 27 + docs/packages/pkg/corevideo.rst | 27 + docs/packages/pkg/corrade.rst | 35 + docs/packages/pkg/cpp_redis.rst | 27 + docs/packages/pkg/cppcodec.rst | 21 + docs/packages/pkg/cpr.rst | 23 + docs/packages/pkg/cpuinfo.rst | 21 + docs/packages/pkg/crashpad.rst | 39 + docs/packages/pkg/crashup.rst | 28 + docs/packages/pkg/crc32c.rst | 22 + docs/packages/pkg/cryptopp.rst | 21 + docs/packages/pkg/ctti.rst | 27 + docs/packages/pkg/cub.rst | 21 + docs/packages/pkg/cvmatio.rst | 19 + docs/packages/pkg/cvsteer.rst | 18 + docs/packages/pkg/cxxopts.rst | 18 + docs/packages/pkg/czmq.rst | 28 + docs/packages/pkg/damageproto.rst | 28 + docs/packages/pkg/date.rst | 19 + docs/packages/pkg/dbus.rst | 28 + docs/packages/pkg/debug_assert.rst | 20 + docs/packages/pkg/dest.rst | 20 + docs/packages/pkg/dlib.rst | 25 + docs/packages/pkg/dlpack.rst | 19 + docs/packages/pkg/dmlc-core.rst | 19 + docs/packages/pkg/doctest.rst | 24 + docs/packages/pkg/double-conversion.rst | 22 + docs/packages/pkg/draco.rst | 21 + docs/packages/pkg/dri2proto.rst | 29 + docs/packages/pkg/dri3proto.rst | 29 + docs/packages/pkg/drishti.rst | 25 + docs/packages/pkg/drishti_assets.rst | 28 + docs/packages/pkg/drishti_faces.rst | 28 + docs/packages/pkg/drm.rst | 28 + docs/packages/pkg/duktape.rst | 19 + docs/packages/pkg/dynalo.rst | 19 + docs/packages/pkg/egl.rst | 19 + docs/packages/pkg/eigen3-nnls.rst | 29 + docs/packages/pkg/enet.rst | 28 + docs/packages/pkg/entityx.rst | 21 + docs/packages/pkg/eos.rst | 25 + docs/packages/pkg/ethash.rst | 19 + docs/packages/pkg/farmhash.rst | 21 + docs/packages/pkg/ffmpeg.rst | 21 + docs/packages/pkg/fft2d.rst | 21 + docs/packages/pkg/fixesproto.rst | 28 + docs/packages/pkg/flatbuffers.rst | 32 + docs/packages/pkg/flex.rst | 44 + docs/packages/pkg/fmt.rst | 38 + docs/packages/pkg/folly.rst | 19 + docs/packages/pkg/foo.rst | 21 + docs/packages/pkg/forcefeedback.rst | 27 + docs/packages/pkg/foundation.rst | 36 + docs/packages/pkg/freetype.rst | 30 + docs/packages/pkg/frugally-deep.rst | 18 + docs/packages/pkg/gRPC.rst | 22 + docs/packages/pkg/gamecontroller.rst | 27 + docs/packages/pkg/gauze.rst | 19 + docs/packages/pkg/gemmlowp.rst | 21 + docs/packages/pkg/geos.rst | 28 + docs/packages/pkg/getopt.rst | 28 + docs/packages/pkg/gflags.rst | 25 + docs/packages/pkg/giflib.rst | 21 + docs/packages/pkg/glapi.rst | 34 + docs/packages/pkg/glbinding.rst | 21 + docs/packages/pkg/gles2.rst | 20 + docs/packages/pkg/gles3.rst | 20 + docs/packages/pkg/glew.rst | 21 + docs/packages/pkg/glfw.rst | 21 + docs/packages/pkg/glib.rst | 19 + docs/packages/pkg/glkit.rst | 27 + docs/packages/pkg/glm.rst | 20 + docs/packages/pkg/globjects.rst | 29 + docs/packages/pkg/glog.rst | 34 + docs/packages/pkg/glproto.rst | 28 + docs/packages/pkg/glslang.rst | 21 + docs/packages/pkg/gst_plugins_bad.rst | 19 + docs/packages/pkg/gst_plugins_base.rst | 19 + docs/packages/pkg/gst_plugins_good.rst | 18 + docs/packages/pkg/gst_plugins_ugly.rst | 18 + docs/packages/pkg/gstreamer.rst | 23 + docs/packages/pkg/gumbo.rst | 21 + docs/packages/pkg/h3.rst | 19 + docs/packages/pkg/half.rst | 27 + docs/packages/pkg/harfbuzz.rst | 20 + docs/packages/pkg/hdf5.rst | 23 + docs/packages/pkg/highwayhash.rst | 21 + docs/packages/pkg/http-parser.rst | 20 + docs/packages/pkg/hunter_venv.rst | 82 + docs/packages/pkg/ice.rst | 28 + docs/packages/pkg/icu-le-hb.rst | 22 + docs/packages/pkg/icu-lx.rst | 27 + docs/packages/pkg/imageio.rst | 27 + docs/packages/pkg/imagequant.rst | 21 + docs/packages/pkg/imgui.rst | 22 + docs/packages/pkg/imshow.rst | 20 + docs/packages/pkg/inja.rst | 20 + docs/packages/pkg/inputproto.rst | 28 + docs/packages/pkg/intltool.rst | 28 + docs/packages/pkg/intsizeof.rst | 19 + docs/packages/pkg/intx.rst | 22 + docs/packages/pkg/iokit.rst | 27 + docs/packages/pkg/ios_sim.rst | 29 + docs/packages/pkg/ippicv.rst | 28 + docs/packages/pkg/iroha-ed25519.rst | 21 + docs/packages/pkg/irrXML.rst | 19 + docs/packages/pkg/jaegertracing.rst | 19 + docs/packages/pkg/jansson.rst | 20 + docs/packages/pkg/jasper.rst | 20 + docs/packages/pkg/javascriptcore.rst | 27 + docs/packages/pkg/jo_jpeg.rst | 21 + docs/packages/pkg/jsoncpp.rst | 25 + docs/packages/pkg/kNet.rst | 20 + docs/packages/pkg/kbproto.rst | 28 + docs/packages/pkg/lcms.rst | 20 + docs/packages/pkg/lehrfempp.rst | 19 + docs/packages/pkg/leveldb.rst | 21 + docs/packages/pkg/libcpuid.rst | 20 + docs/packages/pkg/libdaemon.rst | 28 + docs/packages/pkg/libdill.rst | 21 + docs/packages/pkg/libevhtp.rst | 20 + docs/packages/pkg/libffi.rst | 19 + docs/packages/pkg/libigl.rst | 21 + docs/packages/pkg/libjson-rpc-cpp.rst | 30 + docs/packages/pkg/libmill.rst | 22 + docs/packages/pkg/libogg.rst | 21 + docs/packages/pkg/libpcre.rst | 19 + docs/packages/pkg/librtmp.rst | 28 + docs/packages/pkg/libscrypt.rst | 19 + docs/packages/pkg/libsodium.rst | 19 + docs/packages/pkg/libunibreak.rst | 19 + docs/packages/pkg/libusb.rst | 30 + docs/packages/pkg/libuv.rst | 34 + docs/packages/pkg/libxdg-basedir.rst | 21 + docs/packages/pkg/libxml2.rst | 18 + docs/packages/pkg/libyuv.rst | 21 + docs/packages/pkg/libzip.rst | 21 + docs/packages/pkg/lmdb.rst | 21 + docs/packages/pkg/lmdbxx.rst | 21 + docs/packages/pkg/log4cplus.rst | 25 + docs/packages/pkg/lz4.rst | 21 + docs/packages/pkg/lzma.rst | 25 + docs/packages/pkg/magnum.rst | 24 + docs/packages/pkg/md5.rst | 19 + docs/packages/pkg/metal.rst | 27 + docs/packages/pkg/mini_chromium.rst | 28 + docs/packages/pkg/minizip.rst | 20 + docs/packages/pkg/mkl.rst | 19 + docs/packages/pkg/mkldnn.rst | 21 + docs/packages/pkg/mng.rst | 19 + docs/packages/pkg/mobilecoreservices.rst | 27 + docs/packages/pkg/mojoshader.rst | 20 + docs/packages/pkg/mongoose.rst | 23 + docs/packages/pkg/mpark_variant.rst | 28 + docs/packages/pkg/msgpack.rst | 26 + docs/packages/pkg/mshadow.rst | 20 + docs/packages/pkg/mtplz.rst | 28 + docs/packages/pkg/mxnet.rst | 47 + docs/packages/pkg/nanoflann.rst | 28 + docs/packages/pkg/nanosvg.rst | 20 + docs/packages/pkg/ncnn.rst | 19 + docs/packages/pkg/ncursesw.rst | 22 + docs/packages/pkg/nlohmann_fifo_map.rst | 22 + docs/packages/pkg/nlohmann_json.rst | 69 + docs/packages/pkg/nsync.rst | 21 + docs/packages/pkg/odb-boost.rst | 28 + docs/packages/pkg/odb-compiler.rst | 29 + docs/packages/pkg/odb-mysql.rst | 29 + docs/packages/pkg/odb-pgsql.rst | 28 + docs/packages/pkg/odb-sqlite.rst | 29 + docs/packages/pkg/odb.rst | 28 + docs/packages/pkg/ogles_gpgpu.rst | 23 + docs/packages/pkg/oniguruma.rst | 20 + docs/packages/pkg/onmt.rst | 28 + docs/packages/pkg/openddlparser.rst | 19 + docs/packages/pkg/opengles.rst | 27 + docs/packages/pkg/opentracing-cpp.rst | 25 + docs/packages/pkg/osmesa.rst | 34 + docs/packages/pkg/pcg.rst | 20 + docs/packages/pkg/pciaccess.rst | 28 + docs/packages/pkg/pcre2.rst | 21 + docs/packages/pkg/pegtl.rst | 20 + docs/packages/pkg/pip_GitPython.rst | 21 + docs/packages/pkg/pip_astroid.rst | 21 + docs/packages/pkg/pip_boto3.rst | 21 + docs/packages/pkg/pip_botocore.rst | 21 + docs/packages/pkg/pip_certifi.rst | 19 + docs/packages/pkg/pip_chardet.rst | 21 + docs/packages/pkg/pip_cpplint.rst | 20 + docs/packages/pkg/pip_decorator.rst | 20 + docs/packages/pkg/pip_gitdb.rst | 21 + docs/packages/pkg/pip_idna.rst | 20 + docs/packages/pkg/pip_jmespath.rst | 21 + docs/packages/pkg/pip_lazy-object-proxy.rst | 23 + docs/packages/pkg/pip_nose-timer.rst | 20 + docs/packages/pkg/pip_nose.rst | 21 + docs/packages/pkg/pip_numpy.rst | 21 + docs/packages/pkg/pip_pylint.rst | 21 + docs/packages/pkg/pip_python-dateutil.rst | 21 + docs/packages/pkg/pip_requests.rst | 21 + docs/packages/pkg/pip_six.rst | 21 + docs/packages/pkg/pip_smmap.rst | 21 + docs/packages/pkg/pip_urllib3.rst | 21 + docs/packages/pkg/pip_wrapt.rst | 21 + docs/packages/pkg/pluginlib.rst | 21 + docs/packages/pkg/poly2tri.rst | 21 + docs/packages/pkg/polyclipping.rst | 20 + docs/packages/pkg/presentproto.rst | 28 + docs/packages/pkg/prometheus-cpp.rst | 22 + docs/packages/pkg/protobuf-c.rst | 20 + docs/packages/pkg/pthread-stubs.rst | 28 + docs/packages/pkg/pugixml.rst | 21 + docs/packages/pkg/pybind11.rst | 21 + docs/packages/pkg/qhull.rst | 21 + docs/packages/pkg/quartzcore.rst | 27 + docs/packages/pkg/quickjs.rst | 20 + docs/packages/pkg/rabbitmq-c.rst | 20 + docs/packages/pkg/rabit.rst | 19 + docs/packages/pkg/randrproto.rst | 28 + docs/packages/pkg/rang.rst | 21 + docs/packages/pkg/range-v3.rst | 20 + docs/packages/pkg/re2.rst | 21 + docs/packages/pkg/readline.rst | 21 + docs/packages/pkg/recastnavigation.rst | 27 + docs/packages/pkg/renderproto.rst | 28 + docs/packages/pkg/rocksdb.rst | 25 + docs/packages/pkg/ros.rst | 23 + docs/packages/pkg/ros_comm.rst | 22 + docs/packages/pkg/ros_comm_msgs.rst | 24 + docs/packages/pkg/ros_common_msgs.rst | 24 + docs/packages/pkg/ros_console_bridge.rst | 23 + docs/packages/pkg/ros_environment.rst | 23 + docs/packages/pkg/ros_gencpp.rst | 24 + docs/packages/pkg/ros_geneus.rst | 24 + docs/packages/pkg/ros_genlisp.rst | 24 + docs/packages/pkg/ros_genmsg.rst | 24 + docs/packages/pkg/ros_gennodejs.rst | 24 + docs/packages/pkg/ros_genpy.rst | 24 + docs/packages/pkg/ros_message_generation.rst | 24 + docs/packages/pkg/ros_message_runtime.rst | 24 + docs/packages/pkg/ros_std_msgs.rst | 24 + docs/packages/pkg/rosconsole.rst | 21 + docs/packages/pkg/roscpp_core.rst | 24 + docs/packages/pkg/rospack.rst | 23 + docs/packages/pkg/s3.rst | 20 + docs/packages/pkg/sds.rst | 21 + docs/packages/pkg/sentencepiece.rst | 20 + docs/packages/pkg/shaka_player_embedded.rst | 30 + docs/packages/pkg/sleef.rst | 21 + docs/packages/pkg/sm.rst | 28 + docs/packages/pkg/soil.rst | 22 + .../pkg/sources_for_android_sdk_packer.rst | 22 + docs/packages/pkg/sparsehash.rst | 22 + docs/packages/pkg/spdlog.rst | 22 + docs/packages/pkg/spirv-cross.rst | 20 + docs/packages/pkg/sqlite3.rst | 19 + docs/packages/pkg/sse2neon.rst | 19 + docs/packages/pkg/stanhull.rst | 19 + docs/packages/pkg/state_machine.rst | 20 + docs/packages/pkg/stb.rst | 20 + docs/packages/pkg/stdext-path.rst | 19 + docs/packages/pkg/stormlib.rst | 23 + docs/packages/pkg/sugar.rst | 18 + docs/packages/pkg/szip.rst | 20 + docs/packages/pkg/tacopie.rst | 26 + docs/packages/pkg/taocpp-json.rst | 21 + docs/packages/pkg/tcl.rst | 20 + docs/packages/pkg/tclap.rst | 21 + docs/packages/pkg/termcolor.rst | 23 + docs/packages/pkg/tf.rst | 22 + docs/packages/pkg/tf2.rst | 23 + docs/packages/pkg/thread-pool-cpp.rst | 20 + docs/packages/pkg/thrift.rst | 35 + docs/packages/pkg/tinydir.rst | 20 + docs/packages/pkg/tinyxml2.rst | 20 + docs/packages/pkg/tmxparser.rst | 21 + docs/packages/pkg/toluapp.rst | 30 + docs/packages/pkg/tomcrypt.rst | 28 + docs/packages/pkg/tommath.rst | 28 + docs/packages/pkg/tvm.rst | 42 + docs/packages/pkg/type_safe.rst | 21 + docs/packages/pkg/uikit.rst | 27 + docs/packages/pkg/units.rst | 20 + docs/packages/pkg/utf8.rst | 21 + docs/packages/pkg/util_linux.rst | 33 + docs/packages/pkg/v8.rst | 21 + docs/packages/pkg/vectorial.rst | 21 + docs/packages/pkg/videotoolbox.rst | 27 + docs/packages/pkg/vorbis.rst | 21 + docs/packages/pkg/websocketpp.rst | 21 + docs/packages/pkg/wt.rst | 22 + docs/packages/pkg/wxWidgets.rst | 30 + docs/packages/pkg/wyrm.rst | 21 + docs/packages/pkg/x11.rst | 28 + docs/packages/pkg/x264.rst | 18 + docs/packages/pkg/xau.rst | 28 + docs/packages/pkg/xcb-proto.rst | 29 + docs/packages/pkg/xcb.rst | 28 + docs/packages/pkg/xcursor.rst | 28 + docs/packages/pkg/xdamage.rst | 28 + docs/packages/pkg/xext.rst | 28 + docs/packages/pkg/xextproto.rst | 28 + docs/packages/pkg/xf86vidmodeproto.rst | 29 + docs/packages/pkg/xfixes.rst | 28 + docs/packages/pkg/xgboost.rst | 20 + docs/packages/pkg/xi.rst | 28 + docs/packages/pkg/xinerama.rst | 28 + docs/packages/pkg/xineramaproto.rst | 28 + docs/packages/pkg/xorg-macros.rst | 28 + docs/packages/pkg/xproto.rst | 28 + docs/packages/pkg/xrandr.rst | 28 + docs/packages/pkg/xrender.rst | 28 + docs/packages/pkg/xshmfence.rst | 28 + docs/packages/pkg/xtrans.rst | 28 + docs/packages/pkg/xxf86vm.rst | 29 + docs/packages/pkg/xxhash.rst | 21 + docs/packages/pkg/yaml-cpp.rst | 29 + docs/packages/pkg/zip.rst | 20 + docs/packages/pkg/zookeeper.rst | 24 + docs/packages/random.rst | 8 + docs/packages/regex.rst | 11 + docs/packages/robotics.rst | 58 + docs/packages/scripting.rst | 12 + docs/packages/serialize.rst | 28 + docs/packages/terminal.rst | 11 + docs/packages/testing.rst | 14 + .../errors/error.abi.detection.failure.rst | 32 + .../errors/error.boost.mpi.on.windows.rst | 20 + docs/reference/errors/error.boost.toolset.rst | 26 + .../reference/errors/error.broken.package.rst | 14 + .../reference/errors/error.build.disabled.rst | 20 + .../errors/error.cache.file.not.found.rst | 12 + .../errors/error.detect.hunter.root.rst | 26 + .../errors/error.external.build.failed.rst | 121 + .../error.hunteraddpackage.after.project.rst | 45 + .../error.huntergate.before.project.rst | 71 + .../errors/error.incorrect.input.data.rst | 12 + docs/reference/errors/error.internal.rst | 13 + .../errors/error.no.toolchain.info.rst | 22 + .../errors/error.openssl.perl.not.found.rst | 22 + docs/reference/errors/error.run.install.rst | 33 + .../errors/error.spaces.in.hunter.root.rst | 27 + .../errors/error.unexpected.hunter_config.rst | 22 + docs/reference/errors/error.vs.devenv.rst | 29 + docs/reference/errors/error.xcrun.clang.rst | 21 + .../internal-modules/hunter_fatal_error.rst | 25 + .../hunter_internal_error.rst | 7 + docs/reference/layouts.rst | 11 + docs/reference/layouts/deployed.rst | 277 +++ docs/reference/layouts/sources.rst | 55 + docs/reference/release-notes.rst | 11 + docs/reference/release-notes/v0.rst | 11 + docs/reference/release-notes/v0/20..21.diff | 358 +++ docs/reference/release-notes/v0/21..22.diff | 104 + docs/reference/release-notes/v0/22..23.diff | 190 ++ docs/reference/release-notes/v0/v0.21.rst | 21 + docs/reference/release-notes/v0/v0.22.rst | 33 + docs/reference/release-notes/v0/v0.23.rst | 26 + .../terminology/hunter-passwords-file.rst | 35 + .../user-modules/hunter_cacheable.rst | 43 + .../hunter_check_toolchain_definition.rst | 58 + docs/reference/user-modules/hunter_config.rst | 66 + .../user-modules/hunter_download.rst | 35 + .../user-modules/hunter_http_password.rst | 49 + .../user-modules/hunter_pick_scheme.rst | 50 + .../user-modules/hunter_private_data.rst | 89 + .../hunter_private_data_password.rst | 89 + .../user-modules/hunter_protected_sources.rst | 38 + .../user-modules/hunter_upload_password.rst | 40 + docs/user-guides/cmake-user/private-data.rst | 49 + .../cmake-user/protected-sources.rst | 33 + .../cmake-user/using-license-files.rst | 61 + .../hunter-developer/binary-formula.rst | 101 + .../hunter-developer/cmake-launch.rst | 61 + .../hunter-user/artifactory-cache-server.rst | 195 ++ docs/user-guides/hunter-user/git-self.rst | 106 + .../user-guides/hunter-user/git-submodule.rst | 274 +++ .../hunter-user/github-cache-server.rst | 342 +++ .../hunter-user/hunter-internal.graphml | 839 +++++++ .../01-admin-permissions.png | Bin 0 -> 41556 bytes .../images-artifactory/02-remove-anon.png | Bin 0 -> 41969 bytes .../03-local-repository.png | Bin 0 -> 91414 bytes .../images-artifactory/04-type-generic.png | Bin 0 -> 74729 bytes .../images-artifactory/05-save-finish.png | Bin 0 -> 45923 bytes .../images-artifactory/06-add-user.png | Bin 0 -> 71694 bytes .../images-artifactory/07-create-reader.png | Bin 0 -> 45700 bytes .../08-generate-api-key.png | Bin 0 -> 43728 bytes .../images-artifactory/09-add-permissions.png | Bin 0 -> 71755 bytes .../10-hunter-access-permissions.png | Bin 0 -> 42141 bytes .../11-users-permissions.png | Bin 0 -> 52569 bytes .../images-artifactory/12-layout.png | Bin 0 -> 99231 bytes .../hunter-user/images/accept-invitation.png | Bin 0 -> 24599 bytes .../hunter-user/images/appveyor-add.png | Bin 0 -> 8291 bytes .../hunter-user/images/appveyor-encrypt.png | Bin 0 -> 29521 bytes .../hunter-user/images/create-server.png | Bin 0 -> 25853 bytes .../images/hunter-cache-collaborator.png | Bin 0 -> 43897 bytes .../hunter-user/images/ingenue-login.png | Bin 0 -> 12547 bytes .../images/ingenue-public-repo.png | Bin 0 -> 30310 bytes .../hunter-user/images/ingenue-token.png | Bin 0 -> 16522 bytes .../hunter-user/images/travis-owner.png | Bin 0 -> 46123 bytes .../hunter-user/images/upload.graphml | 725 ++++++ .../user-guides/hunter-user/images/upload.png | Bin 0 -> 62097 bytes .../hunter-user/nexus-cache-server.rst | 57 + docs/user-guides/images/repo-scope.png | Bin 0 -> 6783 bytes examples/ARM_NEON_2_x86_SSE/CMakeLists.txt | 19 + examples/ARM_NEON_2_x86_SSE/foo.cpp | 4 + .../CMakeLists.txt | 12 + .../CMakeLists.txt | 14 + .../Android-MIPS-System-Image/CMakeLists.txt | 14 + examples/Android-SDK/CMakeLists.txt | 12 + examples/AngelScript/CMakeLists.txt | 16 + examples/AngelScript/boo.cpp | 6 + examples/Beast/CMakeLists.txt | 16 + examples/Beast/example.cpp | 13 + examples/Boost-contract/CMakeLists.txt | 16 + examples/Boost-contract/foo.cpp | 4 + examples/Boost-custom-args/CMakeLists.txt | 17 + examples/Boost-custom-args/config.cmake | 7 + examples/Boost-custom-args/foo.cpp | 21 + examples/Boost-fiber/CMakeLists.txt | 16 + examples/Boost-fiber/foo.cpp | 22 + .../Boost-filesystem-shared/CMakeLists.txt | 17 + examples/Boost-filesystem-shared/config.cmake | 4 + examples/Boost-filesystem-shared/foo.cpp | 7 + examples/Boost-iostreams-1-64/CMakeLists.txt | 18 + examples/Boost-iostreams-1-64/config.cmake | 1 + examples/Boost-iostreams-1-64/foo.cpp | 66 + examples/Boost-log-shared/CMakeLists.txt | 28 + examples/Boost-log-shared/config.cmake | 4 + examples/Boost-log-shared/foo.cpp | 13 + examples/Boost-log/CMakeLists.txt | 16 + examples/Boost-log/foo.cpp | 4 + examples/Boost-math/CMakeLists.txt | 28 + examples/Boost-math/foo.cpp | 5 + examples/Boost-program-options/CMakeLists.txt | 13 + examples/Boost-python/CMakeLists.txt | 34 + examples/Boost-python/config.cmake | 3 + examples/Boost-python/foo.cpp | 12 + examples/Boost-random/CMakeLists.txt | 16 + examples/Boost-random/foo.cpp | 10 + examples/Boost-stacktrace/CMakeLists.txt | 16 + examples/Boost-stacktrace/foo.cpp | 4 + examples/Boost-system-1-66/CMakeLists.txt | 18 + examples/Boost-system-1-66/config.cmake | 1 + examples/Boost-system-1-66/foo.cpp | 4 + examples/Boost-test/CMakeLists.txt | 13 + examples/BoringSSL/CMakeLists.txt | 17 + examples/BoringSSL/foo.cpp | 5 + examples/Box2D/CMakeLists.txt | 16 + examples/Box2D/boo.cpp | 7 + examples/CLI11/CMakeLists.txt | 15 + examples/CLI11/main.cpp | 8 + examples/CURL-BoringSSL/CMakeLists.txt | 18 + examples/CURL-BoringSSL/config.cmake | 5 + examples/CURL-BoringSSL/foo.cpp | 51 + examples/CURL-with-ares/CMakeLists.txt | 21 + examples/CURL-with-ares/config.cmake | 1 + examples/CURL-with-ares/foo.cpp | 51 + examples/CapnProto/CMakeLists.txt | 14 + examples/CapnProto/foo.cpp | 7 + examples/Catch/CMakeLists.txt | 24 + examples/Catch/foo.cpp | 5 + examples/Catch/foo.hpp | 9 + examples/Catch/foo_test.cpp | 9 + examples/Catch/main.cpp | 2 + examples/CppNetlibUri/CMakeLists.txt | 14 + examples/CppNetlibUri/foo.cpp | 6 + examples/CreateLaunchers/CMakeLists.txt | 23 + examples/CreateLaunchers/main.cpp | 4 + examples/Eigen-Boost/CMakeLists.txt | 23 + examples/EnumGroup/CMakeLists.txt | 18 + examples/EnumGroup/boo.cpp | 4 + examples/FP16/CMakeLists.txt | 18 + examples/FP16/boo.cpp | 16 + examples/FakeIt/CMakeLists.txt | 23 + examples/FakeIt/fakeit_test.cpp | 30 + examples/Fruit/CMakeLists.txt | 16 + examples/Fruit/foo.cpp | 52 + examples/FunctionalPlus/CMakeLists.txt | 19 + examples/FunctionalPlus/foo.cpp | 4 + examples/GPUImage/CMakeLists.txt | 19 + examples/GPUImage/foo.mm | 5 + examples/HalideIR/CMakeLists.txt | 18 + examples/HalideIR/boo.cpp | 4 + examples/HastyNoise/CMakeLists.txt | 16 + examples/HastyNoise/config.cmake | 4 + examples/HastyNoise/main.cpp | 8 + examples/ICU/CMakeLists.txt | 18 + examples/ICU/boo.cpp | 16 + examples/IF97/CMakeLists.txt | 16 + examples/IF97/IF97.cpp | 36 + examples/LAPACK-CBLAS/CMakeLists.txt | 35 + examples/LAPACK-CBLAS/config.cmake | 4 + examples/LAPACK-CBLAS/foo.cpp | 14 + examples/LAPACK-dynamic/CMakeLists.txt | 35 + examples/LAPACK-dynamic/config.cmake | 4 + examples/LAPACK-dynamic/foo.cpp | 5 + examples/LAPACK/CMakeLists.txt | 33 + examples/LAPACK/foo.cpp | 5 + examples/LLVM/CMakeLists.txt | 50 + examples/LLVM/boo.cpp | 4 + examples/Leathers/boo.cpp | 5 + examples/Leptonica/CMakeLists.txt | 20 + examples/Leptonica/example.c | 9 + examples/LibCDS/CMakeLists.txt | 12 + examples/LibCDS/main.cpp | 6 + examples/Libevent/CMakeLists.txt | 13 + examples/Libevent/main.cpp | 7 + examples/LodePNG/CMakeLists.txt | 18 + examples/LodePNG/main.cpp | 7 + examples/Lua/boo.cpp | 11 + examples/MathFu/CMakeLists.txt | 18 + examples/MathFu/boo.cpp | 9 + examples/Microsoft.GSL/CMakeLists.txt | 18 + examples/Microsoft.GSL/boo.cpp | 4 + examples/NASM/CMakeLists.txt | 32 + examples/NLopt/CMakeLists.txt | 18 + examples/NLopt/boo.cpp | 4 + examples/ONNX/CMakeLists.txt | 18 + examples/ONNX/test.cpp | 8 + examples/OpenAL/CMakeLists.txt | 12 + examples/OpenAL/main.cpp | 6 + examples/OpenCL-cpp/CMakeLists.txt | 13 + examples/OpenCL-cpp/main.cpp | 18 + examples/OpenCL/CMakeLists.txt | 13 + examples/OpenCL/main.cpp | 14 + examples/OpenCV-Qt/CMakeLists.txt | 19 + examples/OpenCV-Qt/config.cmake | 7 + examples/OpenCV-Qt/foo.cpp | 86 + examples/OpenCV-extra/CMakeLists.txt | 20 + examples/OpenCV-extra/config.cmake | 10 + examples/OpenCV-extra/foo.cpp | 26 + examples/OpenCV-ffmpeg/CMakeLists.txt | 18 + examples/OpenCV-ffmpeg/config.cmake | 27 + examples/OpenCV-ffmpeg/foo.cpp | 49 + examples/OpenNMTTokenizer/CMakeLists.txt | 18 + examples/OpenNMTTokenizer/foo.cpp | 11 + examples/OpenSSL-1.0.2/CMakeLists.txt | 18 + examples/OpenSSL-1.0.2/config.cmake | 1 + examples/OpenSSL-1.0.2/foo.cpp | 4 + examples/OpenSSL-asm/CMakeLists.txt | 18 + examples/OpenSSL-asm/config.cmake | 3 + examples/OpenSSL-asm/foo.cpp | 4 + examples/OpenSceneGraph/CMakeLists.txt | 18 + examples/OpenSceneGraph/boo.cpp | 8 + examples/PROJ4/CMakeLists.txt | 18 + examples/PROJ4/hello-proj4.cpp | 8 + examples/PhysUnits/CMakeLists.txt | 18 + examples/PhysUnits/boo.cpp | 4 + examples/QtPropertyEditor/CMakeLists.txt | 18 + examples/QtPropertyEditor/boo.cpp | 4 + examples/Qwt/CMakeLists.txt | 18 + examples/Qwt/boo.cpp | 4 + examples/RapidXML/CMakeLists.txt | 20 + examples/RapidXML/foo.cpp | 7 + examples/RedisClient/CMakeLists.txt | 18 + examples/RedisClient/boo.cpp | 50 + examples/SDL2/dummy.cpp | 4 + examples/SDL_image/CMakeLists.txt | 15 + examples/SDL_image/main.cpp | 77 + examples/SDL_mixer/CMakeLists.txt | 15 + examples/SDL_mixer/main.cpp | 237 ++ examples/SDL_ttf/CMakeLists.txt | 16 + examples/SDL_ttf/main.cpp | 342 +++ examples/SimpleSignal/CMakeLists.txt | 18 + examples/SimpleSignal/boo.cpp | 41 + examples/Snappy/CMakeLists.txt | 16 + examples/Snappy/main.cpp | 15 + examples/Sqlpp11/CMakeLists.txt | 19 + examples/Sqlpp11/example.cpp | 7 + examples/SuiteSparse-dynLAPACK/CMakeLists.txt | 36 + examples/SuiteSparse-dynLAPACK/config.cmake | 4 + examples/SuiteSparse-dynLAPACK/foo.cpp | 13 + examples/SuiteSparse/CMakeLists.txt | 34 + examples/SuiteSparse/foo.cpp | 13 + examples/TCLAP/CMakeLists.txt | 20 + examples/TCLAP/main.cpp | 9 + examples/Tesseract/CMakeLists.txt | 18 + examples/Tesseract/example.cpp | 10 + examples/Urho3D/CMakeLists.txt | 43 + examples/Urho3D/Mover.cpp | 64 + examples/Urho3D/Mover.h | 57 + examples/Urho3D/Sample.h | 121 + examples/Urho3D/Sample.inl | 428 ++++ examples/Urho3D/SkeletalAnimation.cpp | 256 +++ examples/Urho3D/SkeletalAnimation.h | 86 + examples/Urho3D/config.cmake | 6 + examples/VulkanMemoryAllocator/CMakeLists.txt | 18 + examples/VulkanMemoryAllocator/boo.cpp | 3 + examples/WDC/CMakeLists.txt | 14 + examples/WDC/init.cpp | 60 + examples/WebKit/CMakeLists.txt | 23 + examples/WebKit/boo.cpp | 4 + examples/WebP/CMakeLists.txt | 19 + examples/WebP/main.cpp | 8 + examples/YAJL/CMakeLists.txt | 18 + examples/YAJL/boo.cpp | 4 + examples/accelerate/CMakeLists.txt | 15 + examples/accelerate/foo.mm | 4 + examples/acf/CMakeLists.txt | 17 + examples/acf/foo.cpp | 5 + examples/actionlib/CMakeLists.txt | 21 + examples/actionlib/main.cpp | 10 + examples/actionlib/package.xml | 11 + examples/aes/CMakeLists.txt | 16 + examples/aes/foo.cpp | 10 + examples/aglet/CMakeLists.txt | 16 + examples/aglet/foo.cpp | 4 + examples/android/CMakeLists.txt | 15 + examples/android/foo.cpp | 7 + .../CMakeLists.txt | 14 + .../CMakeLists.txt | 14 + .../android_build_tools_packer/CMakeLists.txt | 14 + .../CMakeLists.txt | 14 + .../android_google_apis_packer/CMakeLists.txt | 14 + .../CMakeLists.txt | 14 + .../CMakeLists.txt | 14 + examples/android_log/CMakeLists.txt | 15 + examples/android_log/foo.cpp | 8 + .../CMakeLists.txt | 14 + examples/android_sdk_packer/CMakeLists.txt | 15 + .../CMakeLists.txt | 14 + .../CMakeLists.txt | 14 + .../android_sdk_tools_packer/CMakeLists.txt | 14 + .../CMakeLists.txt | 14 + examples/angles/CMakeLists.txt | 20 + examples/angles/main.cpp | 4 + examples/angles/package.xml | 11 + examples/applicationservices/CMakeLists.txt | 15 + examples/applicationservices/foo.mm | 4 + examples/arabica/CMakeLists.txt | 18 + examples/arabica/boo.cpp | 4 + examples/audiounit/CMakeLists.txt | 15 + examples/audiounit/foo.mm | 4 + examples/autobahn-cpp/CMakeLists.txt | 14 + examples/autobahn-cpp/parameters.cpp | 149 ++ examples/autobahn-cpp/parameters.hpp | 69 + examples/autobahn-cpp/websocket_callee.cpp | 144 ++ examples/autoutils/CMakeLists.txt | 19 + examples/aws-c-common/CMakeLists.txt | 21 + examples/aws-c-common/boo.cpp | 8 + examples/benchmark/CMakeLists.txt | 12 + examples/benchmark/main.cpp | 24 + examples/bento4/CMakeLists.txt | 18 + examples/bento4/main.cpp | 8 + examples/binaryen/CMakeLists.txt | 18 + examples/binaryen/boo.cpp | 32 + examples/bison/CMakeLists.txt | 11 + examples/bison/rpcalc.y | 94 + examples/boost-pba/CMakeLists.txt | 17 + examples/boost-pba/config.cmake | 1 + examples/boost-pba/main.cpp | 4 + examples/botan/CMakeLists.txt | 18 + examples/botan/boo.cpp | 26 + examples/breakpad/CMakeLists.txt | 18 + examples/breakpad/boo.cpp | 4 + examples/bullet/CMakeLists.txt | 23 + examples/bullet/boo.cpp | 4 + examples/c-ares/CMakeLists.txt | 12 + examples/c-ares/main.cpp | 6 + examples/carbon/CMakeLists.txt | 15 + examples/carbon/foo.mm | 4 + examples/catkin/CMakeLists.txt | 17 + examples/catkin/package.xml | 11 + examples/cctz/CMakeLists.txt | 15 + examples/cctz/main.cpp | 8 + .../CMakeLists.txt | 29 + .../config.cmake | 10 + .../foo.cpp | 43 + .../ceres-solver-suitesparse/CMakeLists.txt | 28 + .../ceres-solver-suitesparse/config.cmake | 6 + examples/ceres-solver-suitesparse/foo.cpp | 43 + examples/ceres-solver/CMakeLists.txt | 18 + examples/ceres-solver/foo.cpp | 36 + examples/check_ci_tag/CMakeLists.txt | 23 + examples/civetweb/CMakeLists.txt | 16 + examples/civetweb/boo.cpp | 6 + examples/class_loader/CMakeLists.txt | 20 + examples/class_loader/main.cpp | 4 + examples/class_loader/package.xml | 12 + examples/cmcstl2/CMakeLists.txt | 18 + examples/cmcstl2/simple.cpp | 26 + examples/coreaudio/CMakeLists.txt | 15 + examples/coreaudio/foo.mm | 4 + examples/coretext/CMakeLists.txt | 15 + examples/coretext/foo.mm | 4 + examples/corrade/CMakeLists.txt | 24 + examples/corrade/foo.cpp | 83 + examples/cpp_redis/CMakeLists.txt | 20 + examples/cpp_redis/foo.cpp | 4 + examples/cppcodec/CMakeLists.txt | 18 + examples/cppcodec/boo.cpp | 39 + examples/cpr/CMakeLists.txt | 16 + examples/cpr/example.cpp | 10 + examples/cpuinfo/CMakeLists.txt | 19 + examples/cpuinfo/example.cpp | 10 + examples/crc32c/CMakeLists.txt | 14 + examples/crc32c/main.cpp | 6 + examples/cryptopp/CMakeLists.txt | 15 + examples/cryptopp/main.cpp | 21 + examples/ctti/CMakeLists.txt | 15 + examples/ctti/main.cpp | 44 + examples/cub/CMakeLists.txt | 29 + examples/cub/foo.cu | 8 + examples/cvsteer/CMakeLists.txt | 19 + examples/cvsteer/foo.cpp | 6 + examples/cxxopts/CMakeLists.txt | 18 + examples/cxxopts/boo.cpp | 138 ++ examples/czmq/CMakeLists.txt | 15 + examples/czmq/main.cpp | 17 + examples/date/CMakeLists.txt | 18 + examples/date/boo.cpp | 10 + examples/debug_assert/CMakeLists.txt | 20 + examples/debug_assert/main.cpp | 68 + examples/dlib-staticLib/CMakeLists.txt | 17 + examples/dlib-staticLib/config.cmake | 5 + examples/dlib-staticLib/timer_ex.cpp | 56 + examples/dlpack/CMakeLists.txt | 18 + examples/dlpack/boo.cpp | 4 + examples/dmlc-core/CMakeLists.txt | 19 + examples/dmlc-core/foo.cpp | 62 + examples/doctest/CMakeLists.txt | 21 + examples/doctest/foo.cpp | 5 + examples/doctest/foo.hpp | 9 + examples/doctest/foo_test.cpp | 9 + examples/doctest/foo_test_main.cpp | 2 + examples/double-conversion/CMakeLists.txt | 13 + examples/double-conversion/main.cpp | 6 + examples/draco/CMakeLists.txt | 18 + examples/draco/boo.cpp | 7 + examples/drishti/CMakeLists.txt | 20 + examples/drishti/config.cmake | 35 + examples/drishti/foo.cpp | 6 + examples/drishti_assets/CMakeLists.txt | 17 + examples/drishti_faces/CMakeLists.txt | 17 + examples/duktape/CMakeLists.txt | 18 + examples/duktape/boo.cpp | 4 + examples/dynalo/CMakeLists.txt | 19 + examples/dynalo/dynalo-example-loader.cpp | 18 + examples/egl/CMakeLists.txt | 15 + examples/egl/foo.cpp | 7 + examples/eigen3-nnls/CMakeLists.txt | 17 + examples/eigen3-nnls/foo.cpp | 5 + examples/enet/CMakeLists.txt | 14 + examples/enet/main.c | 15 + examples/entityx/CMakeLists.txt | 18 + examples/entityx/boo.cpp | 7 + examples/ethash/CMakeLists.txt | 15 + examples/ethash/main.cpp | 7 + examples/farmhash/CMakeLists.txt | 17 + examples/farmhash/foo.cpp | 4 + examples/ffmpeg/CMakeLists.txt | 26 + examples/ffmpeg/boo.cpp | 7 + examples/fft2d/CMakeLists.txt | 17 + examples/fft2d/foo.cpp | 59 + examples/flex/CMakeLists.txt | 13 + examples/flex/numbers.lex | 145 ++ examples/folly/CMakeLists.txt | 18 + examples/folly/boo.cpp | 4 + examples/foo/CMakeLists.txt | 18 + examples/foo/boo.cpp | 4 + examples/forcefeedback/CMakeLists.txt | 15 + examples/forcefeedback/foo.mm | 4 + examples/foundation/CMakeLists.txt | 15 + examples/foundation/foo.mm | 5 + examples/freetype/boo.cpp | 18 + examples/frugally-deep/CMakeLists.txt | 19 + examples/frugally-deep/foo.cpp | 4 + examples/gRPC/CMakeLists.txt | 16 + examples/gRPC/config.cmake | 2 + examples/gRPC/main.cpp | 6 + examples/gauze/CMakeLists.txt | 17 + examples/gauze/foo.cpp | 5 + examples/gemmlowp/CMakeLists.txt | 17 + examples/gemmlowp/foo.cpp | 4 + examples/getopt/CMakeLists.txt | 21 + examples/getopt/main.cpp | 45 + examples/giflib/CMakeLists.txt | 17 + examples/giflib/foo.cpp | 4 + examples/glapi/CMakeLists.txt | 15 + examples/glapi/foo.cpp | 7 + examples/glbinding/CMakeLists.txt | 36 + examples/glbinding/foo.cpp | 9 + examples/gles2/CMakeLists.txt | 15 + examples/gles2/foo.cpp | 7 + examples/gles3/CMakeLists.txt | 15 + examples/gles3/foo.cpp | 7 + examples/glib/CMakeLists.txt | 16 + examples/glib/foo.cpp | 4 + examples/globjects/CMakeLists.txt | 39 + examples/globjects/config.cmake | 3 + examples/globjects/foo.cpp | 15 + examples/glslang/CMakeLists.txt | 18 + examples/glslang/boo.cpp | 4 + examples/gst_plugins_bad/CMakeLists.txt | 16 + examples/gst_plugins_bad/foo.cpp | 4 + examples/gst_plugins_base/CMakeLists.txt | 16 + examples/gst_plugins_base/foo.cpp | 4 + examples/gst_plugins_good/CMakeLists.txt | 14 + examples/gst_plugins_good/foo.cpp | 2 + examples/gst_plugins_ugly/CMakeLists.txt | 14 + examples/gst_plugins_ugly/foo.cpp | 2 + examples/gstreamer/CMakeLists.txt | 16 + examples/gstreamer/foo.cpp | 4 + examples/gumbo/CMakeLists.txt | 12 + examples/gumbo/main.cpp | 6 + examples/h3/CMakeLists.txt | 13 + examples/h3/main.c | 8 + examples/harfbuzz/CMakeLists.txt | 18 + examples/harfbuzz/boo.cpp | 5 + examples/highwayhash/CMakeLists.txt | 17 + examples/highwayhash/foo.cpp | 12 + examples/http-parser/CMakeLists.txt | 12 + examples/http-parser/main.c | 3 + examples/hunter_venv/CMakeLists.txt | 54 + examples/hunter_venv/script.py | 1 + examples/icu-le-hb/CMakeLists.txt | 18 + examples/icu-le-hb/boo.cpp | 4 + examples/icu-lx/CMakeLists.txt | 18 + examples/icu-lx/boo.cpp | 4 + examples/imagequant/CMakeLists.txt | 18 + examples/imagequant/boo.cpp | 5 + examples/imgui/CMakeLists.txt | 15 + examples/imgui/main.cpp | 34 + examples/imshow/CMakeLists.txt | 16 + examples/imshow/foo.cpp | 45 + examples/inja/CMakeLists.txt | 16 + examples/inja/inja.cpp | 10 + examples/intsizeof/CMakeLists.txt | 16 + examples/intsizeof/foo.cpp | 6 + examples/intx/CMakeLists.txt | 18 + examples/intx/main.cpp | 9 + examples/iroha-ed25519/CMakeLists.txt | 18 + examples/iroha-ed25519/boo.cpp | 19 + examples/jaegertracing/CMakeLists.txt | 13 + examples/jaegertracing/main.cpp | 7 + examples/jansson/CMakeLists.txt | 12 + examples/jansson/main.c | 9 + examples/jasper/CMakeLists.txt | 18 + examples/jasper/boo.cpp | 4 + examples/javascriptcore/CMakeLists.txt | 15 + examples/javascriptcore/foo.mm | 4 + examples/jo_jpeg/CMakeLists.txt | 16 + examples/jo_jpeg/foo.cpp | 13 + examples/jsoncpp/CMakeLists.txt | 19 + examples/jsoncpp/main.cpp | 10 + examples/kNet/CMakeLists.txt | 16 + examples/kNet/boo.cpp | 5 + examples/lcms/CMakeLists.txt | 18 + examples/lcms/boo.cpp | 4 + examples/lehrfempp/CMakeLists.txt | 18 + examples/lehrfempp/boo.cpp | 4 + examples/leveldb/CMakeLists.txt | 14 + examples/leveldb/main.cpp | 6 + examples/libcpuid/CMakeLists.txt | 16 + examples/libcpuid/boo.cpp | 7 + examples/libdill/CMakeLists.txt | 12 + examples/libdill/main.cpp | 6 + examples/libevhtp/CMakeLists.txt | 12 + examples/libevhtp/main.c | 10 + examples/libffi/CMakeLists.txt | 16 + examples/libffi/foo.cpp | 4 + examples/libigl/CMakeLists.txt | 18 + examples/libigl/boo.cpp | 21 + examples/libjson-rpc-cpp/CMakeLists.txt | 15 + examples/libjson-rpc-cpp/main.cpp | 23 + examples/libmill/CMakeLists.txt | 12 + examples/libmill/main.cpp | 6 + examples/libogg/CMakeLists.txt | 18 + examples/libogg/foo.cpp | 4 + examples/libpcre/CMakeLists.txt | 16 + examples/libpcre/foo.cpp | 4 + examples/librtmp/CMakeLists.txt | 17 + examples/librtmp/main.cpp | 14 + examples/libscrypt/CMakeLists.txt | 15 + examples/libscrypt/main.cpp | 20 + examples/libunibreak/CMakeLists.txt | 18 + examples/libunibreak/boo.cpp | 5 + examples/libusb/CMakeLists.txt | 18 + examples/libusb/boo.cpp | 20 + examples/libuv/CMakeLists.txt | 29 + examples/libuv/example.c | 17 + examples/libxdg-basedir/CMakeLists.txt | 13 + examples/libxdg-basedir/example.cpp | 8 + examples/libxml2/CMakeLists.txt | 15 + examples/libxml2/main.c | 8 + examples/libzip/CMakeLists.txt | 18 + examples/libzip/boo.cpp | 217 ++ examples/lmdb/CMakeLists.txt | 18 + examples/lmdb/foo.cpp | 4 + examples/lmdbxx/CMakeLists.txt | 12 + examples/lmdbxx/main.cpp | 34 + examples/lz4/CMakeLists.txt | 16 + examples/lz4/boo.cpp | 13 + examples/lzma/CMakeLists.txt | 16 + examples/lzma/foo.cpp | 6 + examples/magnum/CMakeLists.txt | 34 + examples/magnum/PrimitivesExample.cpp | 146 ++ examples/md5/CMakeLists.txt | 16 + examples/md5/boo.cpp | 6 + examples/mkl/CMakeLists.txt | 18 + examples/mkl/boo.cpp | 4 + examples/mkldnn/CMakeLists.txt | 18 + examples/mkldnn/boo.cpp | 820 +++++++ examples/mng/CMakeLists.txt | 18 + examples/mng/boo.cpp | 4 + examples/mojoshader/CMakeLists.txt | 16 + examples/mojoshader/boo.cpp | 5 + examples/mongoose/CMakeLists.txt | 16 + examples/mongoose/simplest_web_server.c | 38 + examples/mpark_variant/CMakeLists.txt | 16 + examples/mpark_variant/main.cpp | 6 + examples/mshadow/CMakeLists.txt | 21 + examples/mshadow/boo.cpp | 4 + examples/mtplz/CMakeLists.txt | 19 + examples/mtplz/foo.cpp | 4 + examples/mxnet/CMakeLists.txt | 30 + examples/mxnet/boo.cpp | 263 +++ examples/mxnet/config.cmake | 16 + examples/nanoflann/CMakeLists.txt | 17 + examples/nanoflann/foo.cpp | 4 + examples/nanosvg/CMakeLists.txt | 16 + examples/nanosvg/main.cpp | 11 + examples/ncnn/CMakeLists.txt | 19 + examples/ncnn/boo.cpp | 8 + examples/ncursesw/CMakeLists.txt | 18 + examples/ncursesw/boo.cpp | 31 + examples/nlohmann_fifo_map/CMakeLists.txt | 18 + examples/nlohmann_fifo_map/main.cpp | 38 + examples/nlohmann_json/CMakeLists.txt | 15 + examples/nlohmann_json/main.cpp | 27 + examples/nsync/CMakeLists.txt | 17 + examples/nsync/foo.cpp | 4 + examples/oniguruma/CMakeLists.txt | 12 + examples/oniguruma/main.c | 9 + examples/onmt/CMakeLists.txt | 16 + examples/onmt/foo.cpp | 14 + examples/opengles/CMakeLists.txt | 15 + examples/opengles/foo.mm | 18 + examples/opentracing-cpp/CMakeLists.txt | 15 + examples/opentracing-cpp/main.cpp | 6 + examples/osmesa/CMakeLists.txt | 15 + examples/osmesa/foo.cpp | 7 + examples/pcg/CMakeLists.txt | 13 + examples/pcg/main.c | 10 + examples/pcre2/CMakeLists.txt | 18 + examples/pcre2/boo.c | 45 + examples/pegtl/CMakeLists.txt | 18 + examples/pegtl/boo.cpp | 47 + examples/pip_GitPython/CMakeLists.txt | 28 + examples/pip_astroid/CMakeLists.txt | 28 + examples/pip_boto3/CMakeLists.txt | 28 + examples/pip_botocore/CMakeLists.txt | 28 + examples/pip_certifi/CMakeLists.txt | 28 + examples/pip_chardet/CMakeLists.txt | 28 + examples/pip_cpplint/CMakeLists.txt | 26 + examples/pip_decorator/CMakeLists.txt | 28 + examples/pip_gitdb/CMakeLists.txt | 28 + examples/pip_idna/CMakeLists.txt | 28 + examples/pip_jmespath/CMakeLists.txt | 28 + examples/pip_lazy-object-proxy/CMakeLists.txt | 28 + examples/pip_nose-timer/CMakeLists.txt | 28 + examples/pip_nose/CMakeLists.txt | 28 + examples/pip_numpy/CMakeLists.txt | 28 + examples/pip_pylint/CMakeLists.txt | 26 + examples/pip_python-dateutil/CMakeLists.txt | 28 + examples/pip_requests/CMakeLists.txt | 28 + examples/pip_six/CMakeLists.txt | 28 + examples/pip_smmap/CMakeLists.txt | 28 + examples/pip_urllib3/CMakeLists.txt | 28 + examples/pip_wrapt/CMakeLists.txt | 28 + examples/pluginlib/CMakeLists.txt | 20 + examples/pluginlib/main.cpp | 4 + examples/pluginlib/package.xml | 12 + examples/prometheus-cpp/CMakeLists.txt | 18 + examples/prometheus-cpp/boo.cpp | 8 + examples/protobuf-c/CMakeLists.txt | 27 + examples/protobuf-c/main.c | 8 + examples/protobuf-c/person.proto | 7 + examples/pugixml/CMakeLists.txt | 21 + examples/pugixml/main.cpp | 10 + examples/pybind11/CMakeLists.txt | 12 + examples/pybind11/main.cpp | 6 + examples/qhull/CMakeLists.txt | 18 + examples/qhull/boo.cpp | 4 + examples/qt-camera/config.cmake | 50 + examples/qt-camera/env.sh | 4 + examples/qt-camera/qt.conf | 3 + examples/quickjs/CMakeLists.txt | 30 + examples/quickjs/cutils.h | 292 +++ examples/quickjs/list.h | 100 + examples/quickjs/run-test262.c | 2002 +++++++++++++++++ examples/rabit/CMakeLists.txt | 19 + examples/rabit/foo.cpp | 11 + examples/rang/CMakeLists.txt | 18 + examples/rang/boo.cpp | 8 + examples/range-v3/CMakeLists.txt | 18 + examples/range-v3/comprehensions.cpp | 129 ++ examples/re2/CMakeLists.txt | 17 + examples/re2/foo.cpp | 4 + examples/readline/CMakeLists.txt | 18 + examples/readline/boo.cpp | 8 + examples/recastnavigation/CMakeLists.txt | 23 + examples/recastnavigation/boo.cpp | 4 + examples/rocksdb/CMakeLists.txt | 15 + examples/rocksdb/test.cpp | 8 + examples/ros/CMakeLists.txt | 20 + examples/ros/main.cpp | 4 + examples/ros/package.xml | 11 + examples/ros_comm/CMakeLists.txt | 22 + examples/ros_comm/main.cpp | 17 + examples/ros_comm/package.xml | 11 + examples/ros_comm_msgs/CMakeLists.txt | 23 + examples/ros_comm_msgs/main.cpp | 4 + examples/ros_comm_msgs/package.xml | 11 + examples/ros_common_msgs/CMakeLists.txt | 24 + examples/ros_common_msgs/main.cpp | 5 + examples/ros_common_msgs/package.xml | 11 + examples/ros_console_bridge/CMakeLists.txt | 18 + examples/ros_console_bridge/boo.cpp | 8 + examples/ros_environment/CMakeLists.txt | 17 + examples/ros_environment/package.xml | 11 + examples/ros_gencpp/CMakeLists.txt | 20 + examples/ros_gencpp/msg/dummy.msg | 1 + examples/ros_gencpp/package.xml | 11 + examples/ros_geneus/CMakeLists.txt | 21 + examples/ros_geneus/msg/dummy.msg | 1 + examples/ros_geneus/package.xml | 11 + examples/ros_genlisp/CMakeLists.txt | 20 + examples/ros_genlisp/msg/dummy.msg | 1 + examples/ros_genlisp/package.xml | 11 + examples/ros_genmsg/CMakeLists.txt | 20 + examples/ros_genmsg/msg/dummy.msg | 0 examples/ros_genmsg/package.xml | 11 + examples/ros_gennodejs/CMakeLists.txt | 20 + examples/ros_gennodejs/msg/dummy.msg | 1 + examples/ros_gennodejs/package.xml | 11 + examples/ros_genpy/CMakeLists.txt | 20 + examples/ros_genpy/msg/dummy.msg | 1 + examples/ros_genpy/package.xml | 11 + .../ros_message_generation/CMakeLists.txt | 20 + examples/ros_message_generation/msg/dummy.msg | 1 + examples/ros_message_generation/package.xml | 11 + examples/ros_message_runtime/CMakeLists.txt | 20 + examples/ros_message_runtime/main.cpp | 10 + examples/ros_message_runtime/package.xml | 11 + examples/ros_std_msgs/CMakeLists.txt | 20 + examples/ros_std_msgs/main.cpp | 4 + examples/ros_std_msgs/package.xml | 11 + examples/rosconsole/CMakeLists.txt | 20 + examples/rosconsole/main.cpp | 4 + examples/rosconsole/package.xml | 12 + examples/roscpp_core/CMakeLists.txt | 22 + examples/roscpp_core/main.cpp | 10 + examples/roscpp_core/package.xml | 11 + examples/rospack/CMakeLists.txt | 21 + examples/rospack/main.cpp | 8 + examples/rospack/package.xml | 11 + examples/s3/CMakeLists.txt | 18 + examples/s3/boo.cpp | 9 + examples/sds/CMakeLists.txt | 12 + examples/sds/main.c | 10 + examples/sentencepiece/CMakeLists.txt | 18 + examples/sentencepiece/boo.cpp | 15 + examples/shaka_player_embedded/CMakeLists.txt | 50 + examples/shaka_player_embedded/boo.cpp | 229 ++ examples/shaka_player_embedded/boo.mm | 1 + examples/shaka_player_embedded/config.cmake | 21 + examples/sleef/CMakeLists.txt | 12 + examples/sleef/main.c | 8 + examples/soil/CMakeLists.txt | 12 + examples/soil/main.c | 29 + .../CMakeLists.txt | 14 + examples/spirv-cross/CMakeLists.txt | 18 + examples/spirv-cross/boo.cpp | 4 + examples/sqlite3/CMakeLists.txt | 18 + examples/sqlite3/boo.cpp | 9 + examples/sse2neon/CMakeLists.txt | 15 + examples/sse2neon/foo.cpp | 4 + examples/stanhull/CMakeLists.txt | 16 + examples/stanhull/boo.cpp | 15 + examples/state_machine/CMakeLists.txt | 16 + examples/state_machine/foo.cpp | 30 + examples/stb/CMakeLists.txt | 16 + examples/stb/boo.cpp | 7 + examples/stdext-path/CMakeLists.txt | 18 + examples/stdext-path/boo.cpp | 4 + examples/stormlib/CMakeLists.txt | 14 + examples/stormlib/main.cpp | 65 + examples/sugar/CMakeLists.txt | 30 + examples/sugar/boo/boo.cpp | 0 examples/sugar/boo/sugar.cmake | 4 + examples/tacopie/CMakeLists.txt | 21 + examples/tacopie/foo.cpp | 4 + examples/taocpp-json/CMakeLists.txt | 18 + examples/taocpp-json/boo.cpp | 56 + examples/tcl/CMakeLists.txt | 18 + examples/tcl/tcl_test.c | 17 + examples/termcolor/CMakeLists.txt | 15 + examples/termcolor/main.cpp | 14 + examples/tf/CMakeLists.txt | 21 + examples/tf/main.cpp | 9 + examples/tf/package.xml | 11 + examples/tf2/CMakeLists.txt | 22 + examples/tf2/main.cpp | 14 + examples/tf2/package.xml | 11 + examples/thrift/CMakeLists.txt | 12 + examples/thrift/main.cpp | 6 + examples/tinyxml2/CMakeLists.txt | 18 + examples/tinyxml2/boo.cpp | 8 + examples/tmxparser/CMakeLists.txt | 18 + examples/tmxparser/boo.cpp | 4 + examples/toluapp/CMakeLists.txt | 20 + examples/toluapp/boo.cpp | 9 + examples/toluapp/config.cmake | 4 + examples/tomcrypt/CMakeLists.txt | 14 + examples/tomcrypt/main.c | 40 + examples/tommath/CMakeLists.txt | 14 + examples/tommath/main.c | 987 ++++++++ examples/tvm/CMakeLists.txt | 28 + examples/tvm/boo.cpp | 4 + examples/tvm/config.cmake | 15 + examples/type_safe/CMakeLists.txt | 19 + examples/type_safe/main.cpp | 125 + examples/units/CMakeLists.txt | 18 + examples/units/boo.cpp | 13 + examples/utf8/CMakeLists.txt | 18 + examples/utf8/boo.cpp | 52 + examples/util_linux/CMakeLists.txt | 29 + examples/util_linux/foo.cpp | 8 + examples/v8/CMakeLists.txt | 28 + examples/v8/boo.cpp | 103 + examples/vectorial/CMakeLists.txt | 18 + examples/vectorial/boo.cpp | 11 + examples/videotoolbox/CMakeLists.txt | 15 + examples/videotoolbox/foo.mm | 4 + examples/vorbis/CMakeLists.txt | 18 + examples/vorbis/boo.cpp | 5 + examples/wt/CMakeLists.txt | 15 + examples/wt/main.cpp | 27 + examples/wyrm/CMakeLists.txt | 18 + examples/wyrm/boo.cpp | 4 + examples/x11/foo.cpp | 4 + examples/x264/CMakeLists.txt | 17 + examples/x264/example.c | 140 ++ examples/xau/foo.cpp | 2 + examples/xcb/foo.cpp | 2 + examples/xi/CMakeLists.txt | 16 + examples/xi/foo.cpp | 4 + examples/xxhash/CMakeLists.txt | 18 + examples/xxhash/boo.cpp | 8 + examples/yaml-cpp/CMakeLists.txt | 15 + examples/yaml-cpp/parse.cpp | 61 + examples/zip/CMakeLists.txt | 18 + examples/zip/boo.cpp | 9 + examples/zookeeper/CMakeLists.txt | 15 + examples/zookeeper/main.c | 697 ++++++ maintenance/convert_wiki.py | 129 ++ maintenance/docs_create_missing_stubs.py | 78 + maintenance/download_package_for_server.sh | 145 ++ maintenance/graphs/module_dependencies2dot.sh | 154 ++ maintenance/graphs/modules2dot.sh | 121 + maintenance/local-upload/llvm/linux/gcc.sh | 18 + .../llvm/osx/run-osx-10-11-make.sh | 18 + .../llvm/win/run-win-vs-14-2015-sdk-8-1.bat | 5 + .../ios-nocodesign-11-4-dep-9-3-arm64.sh | 16 + .../ios-nocodesign-11-4-dep-9-3-armv7.sh | 16 + maintenance/local-upload/qt/linux/android.sh | 22 + maintenance/local-upload/qt/linux/clang.sh | 21 + maintenance/local-upload/qt/linux/gcc.sh | 21 + maintenance/local-upload/qt/osx/ios.sh | 19 + maintenance/local-upload/qt/osx/osx-make.sh | 21 + maintenance/local-upload/qt/osx/osx.sh | 21 + .../local-upload/qt/win/run-win-mingw.bat | 13 + .../qt/win/run-win-vs-14-2015-sdk-8-1.bat | 13 + maintenance/local-upload/urho3d/osx/ios.sh | 16 + maintenance/upload-password-template.cmake | 6 + scripts/append-boost-config-macros.cmake.in | 17 + scripts/clean-boost-configs.cmake | 23 + scripts/find_python.cmake | 9 + scripts/link-all.cmake | 106 + scripts/link-all.py | 52 + scripts/pkgconfig-export-targets.cmake.in | 22 + scripts/upload-cache-to-github.py | 598 +++++ .../append-boost-config-macros/CMakeLists.txt | 180 ++ .../CMakeLists.txt | 43 + tests/hunter_create_args_file/test_11 | 1 + tests/hunter_create_args_file/test_12 | 3 + tests/hunter_create_args_file/test_13 | 6 + tests/hunter_create_args_file/test_14 | 5 + .../CMakeLists.txt | 48 + tests/hunter_standard_flag/CMakeLists.txt | 176 ++ 1898 files changed, 69927 insertions(+) create mode 100644 cmake/HunterGate.cmake create mode 100644 cmake/find/FindLibR.cmake create mode 100644 cmake/find/Findaccelerate.cmake create mode 100644 cmake/find/Findandroid.cmake create mode 100644 cmake/find/Findandroid_log.cmake create mode 100644 cmake/find/Findappkit.cmake create mode 100644 cmake/find/Findapplicationservices.cmake create mode 100644 cmake/find/Findassetslibrary.cmake create mode 100644 cmake/find/Findaudiotoolbox.cmake create mode 100644 cmake/find/Findaudiounit.cmake create mode 100644 cmake/find/Findavfoundation.cmake create mode 100644 cmake/find/Findcarbon.cmake create mode 100644 cmake/find/Findcoreaudio.cmake create mode 100644 cmake/find/Findcoredata.cmake create mode 100644 cmake/find/Findcorefoundation.cmake create mode 100644 cmake/find/Findcoregraphics.cmake create mode 100644 cmake/find/Findcorelocation.cmake create mode 100644 cmake/find/Findcoremedia.cmake create mode 100644 cmake/find/Findcoremotion.cmake create mode 100644 cmake/find/Findcoretext.cmake create mode 100644 cmake/find/Findcorevideo.cmake create mode 100644 cmake/find/Findegl.cmake create mode 100644 cmake/find/Findforcefeedback.cmake create mode 100644 cmake/find/Findfoundation.cmake create mode 100644 cmake/find/Findgamecontroller.cmake create mode 100644 cmake/find/Findglapi.cmake create mode 100644 cmake/find/Findgles2.cmake create mode 100644 cmake/find/Findgles3.cmake create mode 100644 cmake/find/Findglkit.cmake create mode 100644 cmake/find/Findimageio.cmake create mode 100644 cmake/find/Findiokit.cmake create mode 100644 cmake/find/Findjavascriptcore.cmake create mode 100644 cmake/find/Findmetal.cmake create mode 100644 cmake/find/Findmobilecoreservices.cmake create mode 100644 cmake/find/Findopengles.cmake create mode 100644 cmake/find/Findosmesa.cmake create mode 100644 cmake/find/Findquartzcore.cmake create mode 100644 cmake/find/Findreadline.cmake create mode 100644 cmake/find/Findtcl.cmake create mode 100644 cmake/find/Finduikit.cmake create mode 100644 cmake/find/Findvideotoolbox.cmake create mode 100644 cmake/modules/hunter_append_component.cmake create mode 100644 cmake/modules/hunter_assert_empty_string.cmake create mode 100644 cmake/modules/hunter_assert_not_empty_string.cmake create mode 100644 cmake/modules/hunter_autotools_configure_command.cmake create mode 100644 cmake/modules/hunter_cache_server_password.cmake create mode 100644 cmake/modules/hunter_check_toolchain_definition.cmake create mode 100644 cmake/modules/hunter_default_version.cmake create mode 100644 cmake/modules/hunter_download_server_url.cmake create mode 100644 cmake/modules/hunter_dump_cmake_flags.cmake create mode 100644 cmake/modules/hunter_error_page.cmake create mode 100644 cmake/modules/hunter_final_config.cmake create mode 100644 cmake/modules/hunter_find_helper.cmake create mode 100644 cmake/modules/hunter_find_helper_framework.cmake create mode 100644 cmake/modules/hunter_find_licenses.cmake create mode 100644 cmake/modules/hunter_generate_qt_5_10_info.cmake create mode 100644 cmake/modules/hunter_generate_qt_5_11_info.cmake create mode 100644 cmake/modules/hunter_generate_qt_5_12_info.cmake create mode 100644 cmake/modules/hunter_generate_qt_5_9_info.cmake create mode 100644 cmake/modules/hunter_get_boost_libs.cmake create mode 100644 cmake/modules/hunter_get_build_flags.cmake create mode 100644 cmake/modules/hunter_get_cacheable.cmake create mode 100644 cmake/modules/hunter_get_cmake_args.cmake create mode 100644 cmake/modules/hunter_get_configuration_types.cmake create mode 100644 cmake/modules/hunter_get_git_executable.cmake create mode 100644 cmake/modules/hunter_get_keep_package_sources.cmake create mode 100644 cmake/modules/hunter_get_lang_standard_flag.cmake create mode 100644 cmake/modules/hunter_get_package_sha1.cmake create mode 100644 cmake/modules/hunter_get_package_url.cmake create mode 100644 cmake/modules/hunter_get_passwords_path.cmake create mode 100644 cmake/modules/hunter_get_project_files_to_load.cmake create mode 100644 cmake/modules/hunter_get_toolchain_binaries.cmake create mode 100644 cmake/modules/hunter_http_password.cmake create mode 100644 cmake/modules/hunter_libxml2_install_tools.cmake create mode 100644 cmake/modules/hunter_pack_git_self.cmake create mode 100644 cmake/modules/hunter_pack_git_submodule.cmake create mode 100644 cmake/modules/hunter_parse_boost_config_macros.cmake create mode 100644 cmake/modules/hunter_parse_cmake_args_for_keyword.cmake create mode 100644 cmake/modules/hunter_pick_archiver.cmake create mode 100644 cmake/modules/hunter_pkgconfig_export_target.cmake create mode 100644 cmake/modules/hunter_private_data.cmake create mode 100644 cmake/modules/hunter_private_data_password.cmake create mode 100644 cmake/modules/hunter_protected_sources.cmake create mode 100644 cmake/modules/hunter_read_http_credentials.cmake create mode 100644 cmake/modules/hunter_step_into_unpacked_directory.cmake create mode 100644 cmake/modules/hunter_upload_cache.cmake create mode 100644 cmake/modules/hunter_upload_password.cmake create mode 100644 cmake/modules/hunter_upload_single_file.cmake create mode 100644 cmake/modules/hunter_upload_to_custom_server.cmake create mode 100644 cmake/projects/ARM_NEON_2_x86_SSE/hunter.cmake create mode 100755 cmake/projects/Android-ARM-EABI-v7a-System-Image/hunter.cmake create mode 100644 cmake/projects/Android-ARM64-v8a-System-Image/hunter.cmake create mode 100755 cmake/projects/Android-MIPS-System-Image/hunter.cmake create mode 100644 cmake/projects/AngelScript/hunter.cmake create mode 100644 cmake/projects/Beast/hunter.cmake create mode 100644 cmake/projects/Boost/contract/hunter.cmake create mode 100644 cmake/projects/Boost/fiber/hunter.cmake create mode 100755 cmake/projects/Boost/scripts/create-boost-1-66-ios-fatlib.sh create mode 100644 cmake/projects/Boost/scripts/patched_boostrap.bat.in create mode 100644 cmake/projects/Boost/stacktrace/hunter.cmake create mode 100644 cmake/projects/BoringSSL/hunter.cmake create mode 100644 cmake/projects/Box2D/hunter.cmake create mode 100644 cmake/projects/CLI11/hunter.cmake create mode 100644 cmake/projects/CapnProto/hunter.cmake create mode 100644 cmake/projects/Catch/hunter.cmake create mode 100644 cmake/projects/CreateLaunchers/hunter.cmake create mode 100644 cmake/projects/EnumGroup/hunter.cmake create mode 100644 cmake/projects/FP16/hunter.cmake create mode 100644 cmake/projects/FakeIt/hunter.cmake create mode 100644 cmake/projects/Fruit/hunter.cmake create mode 100644 cmake/projects/FunctionalPlus/hunter.cmake create mode 100644 cmake/projects/HalideIR/hunter.cmake create mode 100644 cmake/projects/HastyNoise/hunter.cmake create mode 100644 cmake/projects/ICU/hunter.cmake create mode 100644 cmake/projects/IF97/hunter.cmake create mode 100644 cmake/projects/LAPACK/hunter-msvc.cmake create mode 100644 cmake/projects/LAPACK/hunter-source.cmake create mode 100644 cmake/projects/LAPACK/hunter.cmake create mode 100644 cmake/projects/Leptonica/hunter.cmake create mode 100644 cmake/projects/LibCDS/hunter.cmake create mode 100644 cmake/projects/Libevent/hunter.cmake create mode 100644 cmake/projects/LodePNG/hunter.cmake create mode 100644 cmake/projects/MathFu/hunter.cmake create mode 100644 cmake/projects/Microsoft.GSL/hunter.cmake create mode 100644 cmake/projects/NASM/hunter.cmake create mode 100644 cmake/projects/NASM/schemes/url_sha1_nasm_windows.cmake.in create mode 100644 cmake/projects/NLopt/hunter.cmake create mode 100644 cmake/projects/ONNX/hunter.cmake create mode 100644 cmake/projects/OpenAL/hunter.cmake create mode 100644 cmake/projects/OpenCL-cpp/hunter.cmake create mode 100644 cmake/projects/OpenCL/hunter.cmake create mode 100644 cmake/projects/OpenNMTTokenizer/hunter.cmake create mode 100644 cmake/projects/OpenSSL/ep-stages/configure.cmake.in create mode 100644 cmake/projects/OpenSSL/ep-stages/configure_1_1_plus.cmake.in create mode 100644 cmake/projects/OpenSSL/schemes/url_sha1_openssl_macos.cmake.in create mode 100644 cmake/projects/OpenSceneGraph/hunter.cmake create mode 100644 cmake/projects/PROJ4/hunter.cmake create mode 100644 cmake/projects/PhysUnits/hunter.cmake create mode 100644 cmake/projects/Qt/qtcharts/hunter.cmake create mode 100644 cmake/projects/Qt/qtdatavis3d/hunter.cmake create mode 100644 cmake/projects/Qt/qtdocgallery/hunter.cmake create mode 100644 cmake/projects/Qt/qtfeedback/hunter.cmake create mode 100644 cmake/projects/Qt/qtgamepad/hunter.cmake create mode 100644 cmake/projects/Qt/qtnetworkauth/hunter.cmake create mode 100644 cmake/projects/Qt/qtpim/hunter.cmake create mode 100644 cmake/projects/Qt/qtpurchasing/hunter.cmake create mode 100644 cmake/projects/Qt/qtqa/hunter.cmake create mode 100644 cmake/projects/Qt/qtremoteobjects/hunter.cmake create mode 100644 cmake/projects/Qt/qtrepotools/hunter.cmake create mode 100644 cmake/projects/Qt/qtscxml/hunter.cmake create mode 100644 cmake/projects/Qt/qtserialbus/hunter.cmake create mode 100644 cmake/projects/Qt/qtspeech/hunter.cmake create mode 100644 cmake/projects/Qt/qtsystems/hunter.cmake create mode 100644 cmake/projects/Qt/qtvirtualkeyboard/hunter.cmake create mode 100644 cmake/projects/QtPropertyEditor/hunter.cmake create mode 100644 cmake/projects/Qwt/hunter.cmake create mode 100644 cmake/projects/RapidXML/hunter.cmake create mode 100644 cmake/projects/RedisClient/hunter.cmake create mode 100644 cmake/projects/SDL_image/hunter.cmake create mode 100644 cmake/projects/SDL_mixer/hunter.cmake create mode 100644 cmake/projects/SDL_ttf/hunter.cmake create mode 100644 cmake/projects/SimpleSignal/hunter.cmake create mode 100644 cmake/projects/Snappy/hunter.cmake create mode 100644 cmake/projects/Sqlpp11/hunter.cmake create mode 100644 cmake/projects/SuiteSparse/hunter.cmake create mode 100644 cmake/projects/TCLAP/hunter.cmake create mode 100644 cmake/projects/Tesseract/hunter.cmake create mode 100644 cmake/projects/Urho3D/hunter.cmake create mode 100644 cmake/projects/VulkanMemoryAllocator/hunter.cmake create mode 100644 cmake/projects/WDC/hunter.cmake create mode 100644 cmake/projects/WebKit/hunter.cmake create mode 100644 cmake/projects/WebP/hunter.cmake create mode 100644 cmake/projects/YAJL/hunter.cmake create mode 100644 cmake/projects/acf/hunter.cmake create mode 100644 cmake/projects/actionlib/hunter.cmake create mode 100644 cmake/projects/aes/hunter.cmake create mode 100644 cmake/projects/aglet/hunter.cmake create mode 100644 cmake/projects/android_arm64_v8a_system_image_packer/hunter.cmake create mode 100644 cmake/projects/android_arm_eabi_v7a_system_image_packer/hunter.cmake create mode 100644 cmake/projects/android_build_tools_packer/hunter.cmake create mode 100644 cmake/projects/android_google_apis_intel_x86_atom_system_image_packer/hunter.cmake create mode 100644 cmake/projects/android_google_apis_packer/hunter.cmake create mode 100644 cmake/projects/android_google_repository_packer/hunter.cmake create mode 100644 cmake/projects/android_intel_x86_atom_system_image_packer/hunter.cmake create mode 100644 cmake/projects/android_mips_system_image_packer/hunter.cmake create mode 100644 cmake/projects/android_sdk_packer/hunter.cmake create mode 100644 cmake/projects/android_sdk_platform_packer/hunter.cmake create mode 100644 cmake/projects/android_sdk_platform_tools_packer/hunter.cmake create mode 100644 cmake/projects/android_sdk_tools_packer/hunter.cmake create mode 100644 cmake/projects/android_support_repository_packer/hunter.cmake create mode 100644 cmake/projects/angles/hunter.cmake create mode 100644 cmake/projects/arabica/hunter.cmake create mode 100644 cmake/projects/autobahn-cpp/hunter.cmake create mode 100644 cmake/projects/autoutils/hunter.cmake create mode 100644 cmake/projects/aws-c-common/hunter.cmake create mode 100644 cmake/projects/benchmark/hunter.cmake create mode 100644 cmake/projects/bento4/hunter.cmake create mode 100644 cmake/projects/binaryen/hunter.cmake create mode 100644 cmake/projects/bison/hunter.cmake create mode 100644 cmake/projects/boost-pba/hunter.cmake create mode 100644 cmake/projects/botan/hunter.cmake create mode 100644 cmake/projects/botan/schemes/url_sha1_botan.cmake.in create mode 100644 cmake/projects/botan/schemes/url_sha1_botan_ios.cmake.in create mode 100644 cmake/projects/botan/schemes/url_sha1_botan_macos.cmake.in create mode 100644 cmake/projects/botan/schemes/url_sha1_botan_win.cmake.in create mode 100644 cmake/projects/breakpad/hunter.cmake create mode 100644 cmake/projects/bullet/hunter.cmake create mode 100644 cmake/projects/c-ares/hunter.cmake create mode 100644 cmake/projects/catkin/hunter.cmake create mode 100644 cmake/projects/cctz/hunter.cmake create mode 100644 cmake/projects/ceres-solver/hunter.cmake create mode 100644 cmake/projects/check_ci_tag/hunter.cmake create mode 100644 cmake/projects/civetweb/hunter.cmake create mode 100644 cmake/projects/class_loader/hunter.cmake create mode 100644 cmake/projects/cmcstl2/hunter.cmake create mode 100644 cmake/projects/corrade/hunter.cmake create mode 100644 cmake/projects/cpp_redis/hunter.cmake create mode 100644 cmake/projects/cppcodec/hunter.cmake create mode 100644 cmake/projects/cpr/hunter.cmake create mode 100644 cmake/projects/cpuinfo/hunter.cmake create mode 100644 cmake/projects/crc32c/hunter.cmake create mode 100644 cmake/projects/cryptopp/hunter.cmake create mode 100644 cmake/projects/ctti/hunter.cmake create mode 100644 cmake/projects/cub/hunter.cmake create mode 100644 cmake/projects/cvsteer/hunter.cmake create mode 100644 cmake/projects/cxxopts/hunter.cmake create mode 100644 cmake/projects/czmq/hunter.cmake create mode 100644 cmake/projects/date/hunter.cmake create mode 100644 cmake/projects/debug_assert/hunter.cmake create mode 100644 cmake/projects/dlpack/hunter.cmake create mode 100644 cmake/projects/dmlc-core/hunter.cmake create mode 100644 cmake/projects/doctest/hunter.cmake create mode 100644 cmake/projects/double-conversion/hunter.cmake create mode 100644 cmake/projects/draco/hunter.cmake create mode 100644 cmake/projects/drishti/hunter.cmake create mode 100644 cmake/projects/drishti_assets/hunter.cmake create mode 100644 cmake/projects/drishti_faces/hunter.cmake create mode 100644 cmake/projects/duktape/hunter.cmake create mode 100644 cmake/projects/dynalo/hunter.cmake create mode 100644 cmake/projects/eigen3-nnls/hunter.cmake create mode 100644 cmake/projects/enet/hunter.cmake create mode 100644 cmake/projects/entityx/hunter.cmake create mode 100644 cmake/projects/ethash/hunter.cmake create mode 100644 cmake/projects/farmhash/hunter.cmake create mode 100644 cmake/projects/ffmpeg/hunter.cmake create mode 100644 cmake/projects/fft2d/hunter.cmake create mode 100644 cmake/projects/flex/hunter.cmake create mode 100644 cmake/projects/flex/schemes/url_sha1_flex_autotools.cmake.in create mode 100644 cmake/projects/folly/hunter.cmake create mode 100644 cmake/projects/foo/hunter.cmake create mode 100644 cmake/projects/frugally-deep/hunter.cmake create mode 100644 cmake/projects/gRPC/hunter.cmake create mode 100644 cmake/projects/gauze/hunter.cmake create mode 100644 cmake/projects/gemmlowp/hunter.cmake create mode 100644 cmake/projects/getopt/hunter.cmake create mode 100644 cmake/projects/giflib/hunter.cmake create mode 100644 cmake/projects/glbinding/hunter.cmake create mode 100644 cmake/projects/glib/hunter.cmake create mode 100644 cmake/projects/globjects/hunter.cmake create mode 100644 cmake/projects/glslang/hunter.cmake create mode 100644 cmake/projects/gst_plugins_bad/hunter.cmake create mode 100644 cmake/projects/gst_plugins_base/hunter.cmake create mode 100644 cmake/projects/gst_plugins_good/hunter.cmake create mode 100644 cmake/projects/gst_plugins_ugly/hunter.cmake create mode 100644 cmake/projects/gstreamer/hunter.cmake create mode 100644 cmake/projects/gumbo/hunter.cmake create mode 100644 cmake/projects/h3/hunter.cmake create mode 100644 cmake/projects/harfbuzz/hunter.cmake create mode 100644 cmake/projects/highwayhash/hunter.cmake create mode 100644 cmake/projects/http-parser/hunter.cmake create mode 100644 cmake/projects/hunter_venv/hunter.cmake create mode 100644 cmake/projects/icu-le-hb/hunter.cmake create mode 100644 cmake/projects/icu-lx/hunter.cmake create mode 100644 cmake/projects/imagequant/hunter.cmake create mode 100644 cmake/projects/imgui/hunter.cmake create mode 100644 cmake/projects/imshow/hunter.cmake create mode 100644 cmake/projects/inja/hunter.cmake create mode 100644 cmake/projects/intsizeof/hunter.cmake create mode 100644 cmake/projects/intx/hunter.cmake create mode 100644 cmake/projects/iroha-ed25519/hunter.cmake create mode 100644 cmake/projects/jaegertracing/hunter.cmake create mode 100644 cmake/projects/jansson/hunter.cmake create mode 100644 cmake/projects/jasper/hunter.cmake create mode 100644 cmake/projects/jo_jpeg/hunter.cmake create mode 100644 cmake/projects/jsoncpp/hunter.cmake create mode 100644 cmake/projects/kNet/hunter.cmake create mode 100644 cmake/projects/lcms/hunter.cmake create mode 100644 cmake/projects/lehrfempp/hunter.cmake create mode 100644 cmake/projects/leveldb/hunter.cmake create mode 100644 cmake/projects/libcpuid/hunter.cmake create mode 100644 cmake/projects/libdill/hunter.cmake create mode 100644 cmake/projects/libevhtp/hunter.cmake create mode 100644 cmake/projects/libffi/hunter.cmake create mode 100644 cmake/projects/libigl/hunter.cmake create mode 100644 cmake/projects/libjson-rpc-cpp/hunter.cmake create mode 100644 cmake/projects/libmill/hunter.cmake create mode 100644 cmake/projects/libpcre/hunter.cmake create mode 100644 cmake/projects/librtmp/hunter.cmake create mode 100644 cmake/projects/libscrypt/hunter.cmake create mode 100644 cmake/projects/libunibreak/hunter.cmake create mode 100644 cmake/projects/libusb/hunter.cmake create mode 100644 cmake/projects/libuv/hunter.cmake create mode 100644 cmake/projects/libxdg-basedir/hunter.cmake create mode 100644 cmake/projects/libxml2/hunter.cmake create mode 100644 cmake/projects/libxml2/schemes/url_sha1_libxml2_msvc.cmake.in create mode 100644 cmake/projects/libxml2/scripts/patched_bootstrap.bat.in create mode 100644 cmake/projects/libzip/hunter.cmake create mode 100644 cmake/projects/lmdb/hunter.cmake create mode 100644 cmake/projects/lmdbxx/hunter.cmake create mode 100644 cmake/projects/lz4/hunter.cmake create mode 100644 cmake/projects/lzma/hunter.cmake create mode 100644 cmake/projects/magnum/hunter.cmake create mode 100644 cmake/projects/md5/hunter.cmake create mode 100644 cmake/projects/mkl/hunter.cmake create mode 100644 cmake/projects/mkldnn/hunter.cmake create mode 100644 cmake/projects/mng/hunter.cmake create mode 100644 cmake/projects/mojoshader/hunter.cmake create mode 100644 cmake/projects/mongoose/hunter.cmake create mode 100644 cmake/projects/mpark_variant/hunter.cmake create mode 100644 cmake/projects/mshadow/hunter.cmake create mode 100644 cmake/projects/mtplz/hunter.cmake create mode 100644 cmake/projects/mxnet/hunter.cmake create mode 100644 cmake/projects/nanoflann/hunter.cmake create mode 100644 cmake/projects/nanosvg/hunter.cmake create mode 100644 cmake/projects/ncnn/hunter.cmake create mode 100644 cmake/projects/ncursesw/hunter.cmake create mode 100644 cmake/projects/nlohmann_fifo_map/hunter.cmake create mode 100644 cmake/projects/nlohmann_json/hunter.cmake create mode 100644 cmake/projects/nsync/hunter.cmake create mode 100644 cmake/projects/oniguruma/hunter.cmake create mode 100644 cmake/projects/onmt/hunter.cmake create mode 100644 cmake/projects/opentracing-cpp/hunter.cmake create mode 100644 cmake/projects/pcg/hunter.cmake create mode 100644 cmake/projects/pcre2/hunter.cmake create mode 100644 cmake/projects/pegtl/hunter.cmake create mode 100644 cmake/projects/pip_GitPython/hunter.cmake create mode 100644 cmake/projects/pip_astroid/hunter.cmake create mode 100644 cmake/projects/pip_boto3/hunter.cmake create mode 100644 cmake/projects/pip_botocore/hunter.cmake create mode 100644 cmake/projects/pip_certifi/hunter.cmake create mode 100644 cmake/projects/pip_chardet/hunter.cmake create mode 100644 cmake/projects/pip_cpplint/hunter.cmake create mode 100644 cmake/projects/pip_decorator/hunter.cmake create mode 100644 cmake/projects/pip_gitdb/hunter.cmake create mode 100644 cmake/projects/pip_idna/hunter.cmake create mode 100644 cmake/projects/pip_jmespath/hunter.cmake create mode 100644 cmake/projects/pip_lazy-object-proxy/hunter.cmake create mode 100644 cmake/projects/pip_nose-timer/hunter.cmake create mode 100644 cmake/projects/pip_nose/hunter.cmake create mode 100644 cmake/projects/pip_numpy/hunter.cmake create mode 100644 cmake/projects/pip_pylint/hunter.cmake create mode 100644 cmake/projects/pip_python-dateutil/hunter.cmake create mode 100644 cmake/projects/pip_requests/hunter.cmake create mode 100644 cmake/projects/pip_six/hunter.cmake create mode 100644 cmake/projects/pip_smmap/hunter.cmake create mode 100644 cmake/projects/pip_urllib3/hunter.cmake create mode 100644 cmake/projects/pip_wrapt/hunter.cmake create mode 100644 cmake/projects/pluginlib/hunter.cmake create mode 100644 cmake/projects/prometheus-cpp/hunter.cmake create mode 100644 cmake/projects/protobuf-c/hunter.cmake create mode 100644 cmake/projects/pugixml/hunter.cmake create mode 100644 cmake/projects/pybind11/hunter.cmake create mode 100644 cmake/projects/qhull/hunter.cmake create mode 100644 cmake/projects/quickjs/hunter.cmake create mode 100644 cmake/projects/rabit/hunter.cmake create mode 100644 cmake/projects/rang/hunter.cmake create mode 100644 cmake/projects/range-v3/hunter.cmake create mode 100644 cmake/projects/re2/hunter.cmake create mode 100644 cmake/projects/readline/hunter.cmake create mode 100644 cmake/projects/recastnavigation/hunter.cmake create mode 100644 cmake/projects/rocksdb/hunter.cmake create mode 100644 cmake/projects/ros/hunter.cmake create mode 100644 cmake/projects/ros_comm/hunter.cmake create mode 100644 cmake/projects/ros_comm_msgs/hunter.cmake create mode 100644 cmake/projects/ros_common_msgs/hunter.cmake create mode 100644 cmake/projects/ros_console_bridge/hunter.cmake create mode 100644 cmake/projects/ros_environment/hunter.cmake create mode 100644 cmake/projects/ros_gencpp/hunter.cmake create mode 100644 cmake/projects/ros_geneus/hunter.cmake create mode 100644 cmake/projects/ros_genlisp/hunter.cmake create mode 100644 cmake/projects/ros_genmsg/hunter.cmake create mode 100644 cmake/projects/ros_gennodejs/hunter.cmake create mode 100644 cmake/projects/ros_genpy/hunter.cmake create mode 100644 cmake/projects/ros_message_generation/hunter.cmake create mode 100644 cmake/projects/ros_message_runtime/hunter.cmake create mode 100644 cmake/projects/ros_std_msgs/hunter.cmake create mode 100644 cmake/projects/rosconsole/hunter.cmake create mode 100644 cmake/projects/roscpp_core/hunter.cmake create mode 100644 cmake/projects/rospack/hunter.cmake create mode 100644 cmake/projects/s3/hunter.cmake create mode 100644 cmake/projects/sds/hunter.cmake create mode 100644 cmake/projects/sentencepiece/hunter.cmake create mode 100644 cmake/projects/shaka_player_embedded/hunter.cmake create mode 100644 cmake/projects/sleef/hunter.cmake create mode 100644 cmake/projects/soil/hunter.cmake create mode 100644 cmake/projects/sources_for_android_sdk_packer/hunter.cmake create mode 100644 cmake/projects/spirv-cross/hunter.cmake create mode 100644 cmake/projects/sqlite3/hunter.cmake create mode 100644 cmake/projects/sse2neon/hunter.cmake create mode 100644 cmake/projects/stanhull/hunter.cmake create mode 100644 cmake/projects/state_machine/hunter.cmake create mode 100644 cmake/projects/stb/hunter.cmake create mode 100644 cmake/projects/stdext-path/hunter.cmake create mode 100644 cmake/projects/stormlib/hunter.cmake create mode 100644 cmake/projects/sugar/hunter.cmake create mode 100644 cmake/projects/tacopie/hunter.cmake create mode 100644 cmake/projects/taocpp-json/hunter.cmake create mode 100644 cmake/projects/tcl/hunter.cmake create mode 100644 cmake/projects/tcl/schemes/url_sha1_tcl_autotools.cmake.in create mode 100644 cmake/projects/tcl/scripts/android_def.h create mode 100755 cmake/projects/tcl/scripts/android_uname.in create mode 100755 cmake/projects/tcl/scripts/configure create mode 100644 cmake/projects/termcolor/hunter.cmake create mode 100644 cmake/projects/tf/hunter.cmake create mode 100644 cmake/projects/tf2/hunter.cmake create mode 100644 cmake/projects/thrift/hunter.cmake create mode 100755 cmake/projects/tinyxml2/hunter.cmake create mode 100644 cmake/projects/tmxparser/hunter.cmake create mode 100644 cmake/projects/toluapp/hunter.cmake create mode 100644 cmake/projects/tomcrypt/hunter.cmake create mode 100644 cmake/projects/tommath/hunter.cmake create mode 100644 cmake/projects/tvm/hunter.cmake create mode 100644 cmake/projects/type_safe/hunter.cmake create mode 100644 cmake/projects/units/hunter.cmake create mode 100644 cmake/projects/utf8/hunter.cmake create mode 100644 cmake/projects/util_linux/hunter.cmake create mode 100644 cmake/projects/v8/hunter.cmake create mode 100644 cmake/projects/vectorial/hunter.cmake create mode 100644 cmake/projects/vorbis/hunter.cmake create mode 100644 cmake/projects/wt/hunter.cmake create mode 100644 cmake/projects/wyrm/hunter.cmake create mode 100644 cmake/projects/x264/hunter.cmake create mode 100644 cmake/projects/x264/schemes/url_sha1_x264.cmake.in create mode 100644 cmake/projects/xi/hunter.cmake create mode 100644 cmake/projects/xxhash/hunter.cmake create mode 100644 cmake/projects/yaml-cpp/hunter.cmake create mode 100644 cmake/projects/zip/hunter.cmake create mode 100644 cmake/projects/zookeeper/hunter.cmake create mode 100644 cmake/schemes/url_sha1_pip.cmake.in create mode 100644 cmake/schemes/url_sha1_unpack_bin_install.cmake.in create mode 100644 cmake/templates/libxml2Config.cmake.in create mode 100644 cmake/templates/libxml2Targets.cmake.in create mode 100644 cmake/templates/pip_config.cmake.in create mode 100644 docs/creating-new/create.rst create mode 100644 docs/creating-new/create/autotools.rst create mode 100644 docs/creating-new/create/ci/.travis-NEW.yml create mode 100644 docs/creating-new/create/ci/.travis-OLD.yml create mode 100644 docs/creating-new/create/cmake-dependencies.rst create mode 100644 docs/creating-new/create/cmake.rst create mode 100644 docs/creating-new/create/custom.rst create mode 100644 docs/creating-new/default-NEW.cmake create mode 100644 docs/creating-new/default.cmake create mode 100644 docs/creating-new/hunter-NEW.cmake create mode 100644 docs/creating-new/hunter.cmake create mode 100644 docs/creating-new/images/branches.png create mode 100644 docs/creating-new/images/package-testing.png create mode 100644 docs/creating-new/images/pr-change-branch.png create mode 100644 docs/creating-new/images/pr-number.png create mode 100644 docs/creating-new/images/pr-update-version.png create mode 100644 docs/creating-new/images/pr-with-package.png create mode 100644 docs/creating-new/images/pr-with-tests.png create mode 100644 docs/creating-new/images/pull-request-testing.png create mode 100644 docs/creating-new/images/pull-request.png create mode 100644 docs/creating-new/images/release.png create mode 100644 docs/creating-new/images/upload.png create mode 100644 docs/creating-new/patch.rst create mode 100644 docs/creating-new/update.rst create mode 100644 docs/creating-new/yed/branches.graphml create mode 100644 docs/creating-new/yed/pr-update-version.graphml create mode 100644 docs/creating-new/yed/pull-request-testing.graphml create mode 100644 docs/creating-new/yed/pull-request.graphml create mode 100644 docs/faq/android-studio-breakpoint.png create mode 100644 docs/faq/android-studio-debugger.png create mode 100644 docs/faq/android-studio-hello-jni.png create mode 100644 docs/faq/android-studio.rst create mode 100644 docs/faq/foo-v1.0-hunter.cmake create mode 100644 docs/faq/foo-v1.0.cmake create mode 100644 docs/faq/foo-v2.0-hunter.cmake create mode 100644 docs/faq/foo-v2.0.cmake create mode 100644 docs/faq/how-to-download-private-github-asset.rst create mode 100644 docs/faq/how-to-fix-download-error.rst create mode 100644 docs/faq/how-to-fix-hash-mismatch-error.rst create mode 100644 docs/faq/why-do-we-need-forks.rst create mode 100644 docs/faq/why-do-we-need-hunter-add-package.rst create mode 100644 docs/faq/why-hunter-is-slow.rst create mode 100644 docs/old-wiki/Home.md create mode 100644 docs/old-wiki/Pitfalls.md create mode 100644 docs/old-wiki/Rationale.md create mode 100644 docs/old-wiki/Requirements.md create mode 100644 docs/old-wiki/Used-variables.md create mode 100644 docs/old-wiki/dev.build.schemes.md create mode 100644 docs/old-wiki/dev.hunter.root.md create mode 100644 docs/old-wiki/dev.scheme_variables.md create mode 100644 docs/old-wiki/dev.variables.md create mode 100644 docs/old-wiki/example.custom.config.id.md create mode 100644 docs/old-wiki/example.find_package.config.md create mode 100644 docs/old-wiki/example.hunter.run.install.md create mode 100644 docs/old-wiki/example.hunter_configuration_types.md create mode 100644 docs/old-wiki/jenkins-pitfalls.md create mode 100644 docs/old-wiki/rationale-toolchain-verification.md create mode 100644 docs/old-wiki/usr.adding.new.package.custom.scheme.md create mode 100644 docs/packages/all.rst create mode 100644 docs/packages/cmake_modules.rst create mode 100644 docs/packages/commandline.rst create mode 100644 docs/packages/compiler.rst create mode 100644 docs/packages/compression.rst create mode 100644 docs/packages/computer-vision.rst create mode 100644 docs/packages/concurrency.rst create mode 100644 docs/packages/containers.rst create mode 100644 docs/packages/crypto.rst create mode 100644 docs/packages/database.rst create mode 100644 docs/packages/datetime.rst create mode 100644 docs/packages/filesystem.rst create mode 100644 docs/packages/frameworks.rst create mode 100644 docs/packages/graphics.rst create mode 100644 docs/packages/logging.rst create mode 100644 docs/packages/machine-learning.rst create mode 100644 docs/packages/math.rst create mode 100644 docs/packages/media.rst create mode 100644 docs/packages/messaging.rst create mode 100644 docs/packages/networking.rst create mode 100644 docs/packages/os.rst create mode 100644 docs/packages/pkg/ARM_NEON_2_x86_SSE.rst create mode 100644 docs/packages/pkg/AllTheFlopsThreads.rst create mode 100644 docs/packages/pkg/Android-ARM-EABI-v7a-System-Image.rst create mode 100644 docs/packages/pkg/Android-ARM64-v8a-System-Image.rst create mode 100644 docs/packages/pkg/Android-Apk.rst create mode 100644 docs/packages/pkg/Android-Build-Tools.rst create mode 100644 docs/packages/pkg/Android-Google-APIs-Intel-x86-Atom-System-Image.rst create mode 100644 docs/packages/pkg/Android-Google-APIs.rst create mode 100644 docs/packages/pkg/Android-Google-Repository.rst create mode 100644 docs/packages/pkg/Android-Intel-x86-Atom-System-Image.rst create mode 100644 docs/packages/pkg/Android-MIPS-System-Image.rst create mode 100644 docs/packages/pkg/Android-Modules.rst create mode 100644 docs/packages/pkg/Android-SDK-Platform-tools.rst create mode 100644 docs/packages/pkg/Android-SDK-Platform.rst create mode 100644 docs/packages/pkg/Android-SDK-Tools.rst create mode 100644 docs/packages/pkg/Android-SDK.rst create mode 100644 docs/packages/pkg/Android-Support-Repository.rst create mode 100644 docs/packages/pkg/AngelScript.rst create mode 100644 docs/packages/pkg/ArrayFire.rst create mode 100644 docs/packages/pkg/Assimp.rst create mode 100644 docs/packages/pkg/Async++.rst create mode 100644 docs/packages/pkg/Avahi.rst create mode 100644 docs/packages/pkg/BZip2.rst create mode 100644 docs/packages/pkg/Beast.rst create mode 100644 docs/packages/pkg/Boost.rst create mode 100644 docs/packages/pkg/BoostCompute.rst create mode 100644 docs/packages/pkg/BoostProcess.rst create mode 100644 docs/packages/pkg/BoringSSL.rst create mode 100644 docs/packages/pkg/Box2D.rst create mode 100644 docs/packages/pkg/CLAPACK.rst create mode 100644 docs/packages/pkg/CLI11.rst create mode 100644 docs/packages/pkg/CURL.rst create mode 100644 docs/packages/pkg/CapnProto.rst create mode 100644 docs/packages/pkg/Catch.rst create mode 100644 docs/packages/pkg/Clang.rst create mode 100644 docs/packages/pkg/ClangToolsExtra.rst create mode 100644 docs/packages/pkg/Comet.rst create mode 100644 docs/packages/pkg/CppNetlib.rst create mode 100644 docs/packages/pkg/CppNetlibUri.rst create mode 100644 docs/packages/pkg/CreateLaunchers.rst create mode 100644 docs/packages/pkg/CsvParserCPlusPlus.rst create mode 100644 docs/packages/pkg/Eigen.rst create mode 100644 docs/packages/pkg/EnumGroup.rst create mode 100644 docs/packages/pkg/Expat.rst create mode 100644 docs/packages/pkg/FP16.rst create mode 100644 docs/packages/pkg/FakeIt.rst create mode 100644 docs/packages/pkg/Fruit.rst create mode 100644 docs/packages/pkg/FunctionalPlus.rst create mode 100644 docs/packages/pkg/GPUImage.rst create mode 100644 docs/packages/pkg/GSL.rst create mode 100644 docs/packages/pkg/GTest.rst create mode 100644 docs/packages/pkg/HalideIR.rst create mode 100644 docs/packages/pkg/HastyNoise.rst create mode 100644 docs/packages/pkg/ICU.rst create mode 100644 docs/packages/pkg/IF97.rst create mode 100644 docs/packages/pkg/Igloo.rst create mode 100644 docs/packages/pkg/Jpeg.rst create mode 100644 docs/packages/pkg/JsonSpirit.rst create mode 100644 docs/packages/pkg/LAPACK.rst create mode 100644 docs/packages/pkg/LLVM.rst create mode 100644 docs/packages/pkg/LLVMCompilerRT.rst create mode 100644 docs/packages/pkg/Leathers.rst create mode 100644 docs/packages/pkg/Leptonica.rst create mode 100644 docs/packages/pkg/LibCDS.rst create mode 100644 docs/packages/pkg/Libcxx.rst create mode 100644 docs/packages/pkg/Libcxxabi.rst create mode 100644 docs/packages/pkg/Libevent.rst create mode 100644 docs/packages/pkg/Libssh2.rst create mode 100644 docs/packages/pkg/LodePNG.rst create mode 100644 docs/packages/pkg/Lua.rst create mode 100644 docs/packages/pkg/MathFu.rst create mode 100644 docs/packages/pkg/Microsoft.GSL.rst create mode 100644 docs/packages/pkg/MySQL-client.rst create mode 100644 docs/packages/pkg/NASM.rst create mode 100644 docs/packages/pkg/NLopt.rst create mode 100644 docs/packages/pkg/ONNX.rst create mode 100644 docs/packages/pkg/OpenAL.rst create mode 100644 docs/packages/pkg/OpenBLAS.rst create mode 100644 docs/packages/pkg/OpenCL-cpp.rst create mode 100644 docs/packages/pkg/OpenCL.rst create mode 100644 docs/packages/pkg/OpenCV-Extra.rst create mode 100644 docs/packages/pkg/OpenCV.rst create mode 100644 docs/packages/pkg/OpenNMTTokenizer.rst create mode 100644 docs/packages/pkg/OpenSSL.rst create mode 100644 docs/packages/pkg/OpenSceneGraph.rst create mode 100644 docs/packages/pkg/PNG.rst create mode 100644 docs/packages/pkg/PROJ4.rst create mode 100644 docs/packages/pkg/PhysUnits.rst create mode 100644 docs/packages/pkg/PocoCpp.rst create mode 100644 docs/packages/pkg/PostgreSQL.rst create mode 100644 docs/packages/pkg/Protobuf.rst create mode 100644 docs/packages/pkg/Qt.rst create mode 100644 docs/packages/pkg/QtAndroidCMake.rst create mode 100644 docs/packages/pkg/QtCMakeExtra.rst create mode 100644 docs/packages/pkg/QtPropertyEditor.rst create mode 100644 docs/packages/pkg/QtQmlManager.rst create mode 100644 docs/packages/pkg/Qwt.rst create mode 100644 docs/packages/pkg/RapidJSON.rst create mode 100644 docs/packages/pkg/RapidXML.rst create mode 100644 docs/packages/pkg/RedisClient.rst create mode 100644 docs/packages/pkg/SDL2.rst create mode 100644 docs/packages/pkg/SDL_image.rst create mode 100644 docs/packages/pkg/SDL_mixer.rst create mode 100644 docs/packages/pkg/SDL_ttf.rst create mode 100644 docs/packages/pkg/SimpleSignal.rst create mode 100644 docs/packages/pkg/Snappy.rst create mode 100644 docs/packages/pkg/Sober.rst create mode 100644 docs/packages/pkg/Sources-for-Android-SDK.rst create mode 100644 docs/packages/pkg/Sqlpp11.rst create mode 100644 docs/packages/pkg/SuiteSparse.rst create mode 100644 docs/packages/pkg/TIFF.rst create mode 100644 docs/packages/pkg/Tesseract.rst create mode 100644 docs/packages/pkg/Urho3D.rst create mode 100644 docs/packages/pkg/VulkanMemoryAllocator.rst create mode 100644 docs/packages/pkg/WDC.rst create mode 100644 docs/packages/pkg/WTL.rst create mode 100644 docs/packages/pkg/Washer.rst create mode 100644 docs/packages/pkg/WebKit.rst create mode 100644 docs/packages/pkg/WebP.rst create mode 100644 docs/packages/pkg/WinSparkle.rst create mode 100644 docs/packages/pkg/YAJL.rst create mode 100644 docs/packages/pkg/ZLIB.rst create mode 100644 docs/packages/pkg/ZMQPP.rst create mode 100644 docs/packages/pkg/ZeroMQ.rst create mode 100644 docs/packages/pkg/accelerate.rst create mode 100644 docs/packages/pkg/acf.rst create mode 100644 docs/packages/pkg/actionlib.rst create mode 100644 docs/packages/pkg/aes.rst create mode 100644 docs/packages/pkg/aglet.rst create mode 100644 docs/packages/pkg/android.rst create mode 100644 docs/packages/pkg/android_arm64_v8a_system_image_packer.rst create mode 100644 docs/packages/pkg/android_arm_eabi_v7a_system_image_packer.rst create mode 100644 docs/packages/pkg/android_build_tools_packer.rst create mode 100644 docs/packages/pkg/android_google_apis_intel_x86_atom_system_image_packer.rst create mode 100644 docs/packages/pkg/android_google_apis_packer.rst create mode 100644 docs/packages/pkg/android_google_repository_packer.rst create mode 100644 docs/packages/pkg/android_intel_x86_atom_system_image_packer.rst create mode 100644 docs/packages/pkg/android_log.rst create mode 100644 docs/packages/pkg/android_mips_system_image_packer.rst create mode 100644 docs/packages/pkg/android_sdk_packer.rst create mode 100644 docs/packages/pkg/android_sdk_platform_packer.rst create mode 100644 docs/packages/pkg/android_sdk_platform_tools_packer.rst create mode 100644 docs/packages/pkg/android_sdk_tools_packer.rst create mode 100644 docs/packages/pkg/android_support_repository_packer.rst create mode 100644 docs/packages/pkg/angles.rst create mode 100644 docs/packages/pkg/appkit.rst create mode 100644 docs/packages/pkg/applicationservices.rst create mode 100644 docs/packages/pkg/arabica.rst create mode 100644 docs/packages/pkg/assetslibrary.rst create mode 100644 docs/packages/pkg/audiotoolbox.rst create mode 100644 docs/packages/pkg/audiounit.rst create mode 100644 docs/packages/pkg/autobahn-cpp.rst create mode 100644 docs/packages/pkg/autoutils.rst create mode 100644 docs/packages/pkg/avfoundation.rst create mode 100644 docs/packages/pkg/aws-c-common.rst create mode 100644 docs/packages/pkg/benchmark.rst create mode 100644 docs/packages/pkg/bento4.rst create mode 100644 docs/packages/pkg/binaryen.rst create mode 100644 docs/packages/pkg/bison.rst create mode 100644 docs/packages/pkg/boost-pba.rst create mode 100644 docs/packages/pkg/botan.rst create mode 100644 docs/packages/pkg/breakpad.rst create mode 100644 docs/packages/pkg/bullet.rst create mode 100644 docs/packages/pkg/c-ares.rst create mode 100644 docs/packages/pkg/caffe.rst create mode 100644 docs/packages/pkg/carbon.rst create mode 100644 docs/packages/pkg/catkin.rst create mode 100644 docs/packages/pkg/cctz.rst create mode 100644 docs/packages/pkg/ccv.rst create mode 100644 docs/packages/pkg/cereal.rst create mode 100644 docs/packages/pkg/ceres-solver.rst create mode 100644 docs/packages/pkg/check_ci_tag.rst create mode 100644 docs/packages/pkg/civetweb.rst create mode 100644 docs/packages/pkg/clBLAS.rst create mode 100644 docs/packages/pkg/class_loader.rst create mode 100644 docs/packages/pkg/cmcstl2.rst create mode 100644 docs/packages/pkg/convertutf.rst create mode 100644 docs/packages/pkg/coreaudio.rst create mode 100644 docs/packages/pkg/coredata.rst create mode 100644 docs/packages/pkg/corefoundation.rst create mode 100644 docs/packages/pkg/coregraphics.rst create mode 100644 docs/packages/pkg/corelocation.rst create mode 100644 docs/packages/pkg/coremedia.rst create mode 100644 docs/packages/pkg/coremotion.rst create mode 100644 docs/packages/pkg/coretext.rst create mode 100644 docs/packages/pkg/corevideo.rst create mode 100644 docs/packages/pkg/corrade.rst create mode 100644 docs/packages/pkg/cpp_redis.rst create mode 100644 docs/packages/pkg/cppcodec.rst create mode 100644 docs/packages/pkg/cpr.rst create mode 100644 docs/packages/pkg/cpuinfo.rst create mode 100644 docs/packages/pkg/crashpad.rst create mode 100644 docs/packages/pkg/crashup.rst create mode 100644 docs/packages/pkg/crc32c.rst create mode 100644 docs/packages/pkg/cryptopp.rst create mode 100644 docs/packages/pkg/ctti.rst create mode 100644 docs/packages/pkg/cub.rst create mode 100644 docs/packages/pkg/cvmatio.rst create mode 100644 docs/packages/pkg/cvsteer.rst create mode 100644 docs/packages/pkg/cxxopts.rst create mode 100644 docs/packages/pkg/czmq.rst create mode 100644 docs/packages/pkg/damageproto.rst create mode 100644 docs/packages/pkg/date.rst create mode 100644 docs/packages/pkg/dbus.rst create mode 100644 docs/packages/pkg/debug_assert.rst create mode 100644 docs/packages/pkg/dest.rst create mode 100644 docs/packages/pkg/dlib.rst create mode 100644 docs/packages/pkg/dlpack.rst create mode 100644 docs/packages/pkg/dmlc-core.rst create mode 100644 docs/packages/pkg/doctest.rst create mode 100644 docs/packages/pkg/double-conversion.rst create mode 100644 docs/packages/pkg/draco.rst create mode 100644 docs/packages/pkg/dri2proto.rst create mode 100644 docs/packages/pkg/dri3proto.rst create mode 100644 docs/packages/pkg/drishti.rst create mode 100644 docs/packages/pkg/drishti_assets.rst create mode 100644 docs/packages/pkg/drishti_faces.rst create mode 100644 docs/packages/pkg/drm.rst create mode 100644 docs/packages/pkg/duktape.rst create mode 100644 docs/packages/pkg/dynalo.rst create mode 100644 docs/packages/pkg/egl.rst create mode 100644 docs/packages/pkg/eigen3-nnls.rst create mode 100644 docs/packages/pkg/enet.rst create mode 100644 docs/packages/pkg/entityx.rst create mode 100644 docs/packages/pkg/eos.rst create mode 100644 docs/packages/pkg/ethash.rst create mode 100644 docs/packages/pkg/farmhash.rst create mode 100644 docs/packages/pkg/ffmpeg.rst create mode 100644 docs/packages/pkg/fft2d.rst create mode 100644 docs/packages/pkg/fixesproto.rst create mode 100644 docs/packages/pkg/flatbuffers.rst create mode 100644 docs/packages/pkg/flex.rst create mode 100644 docs/packages/pkg/fmt.rst create mode 100644 docs/packages/pkg/folly.rst create mode 100644 docs/packages/pkg/foo.rst create mode 100644 docs/packages/pkg/forcefeedback.rst create mode 100644 docs/packages/pkg/foundation.rst create mode 100644 docs/packages/pkg/freetype.rst create mode 100644 docs/packages/pkg/frugally-deep.rst create mode 100644 docs/packages/pkg/gRPC.rst create mode 100644 docs/packages/pkg/gamecontroller.rst create mode 100644 docs/packages/pkg/gauze.rst create mode 100644 docs/packages/pkg/gemmlowp.rst create mode 100644 docs/packages/pkg/geos.rst create mode 100644 docs/packages/pkg/getopt.rst create mode 100644 docs/packages/pkg/gflags.rst create mode 100644 docs/packages/pkg/giflib.rst create mode 100644 docs/packages/pkg/glapi.rst create mode 100644 docs/packages/pkg/glbinding.rst create mode 100644 docs/packages/pkg/gles2.rst create mode 100644 docs/packages/pkg/gles3.rst create mode 100644 docs/packages/pkg/glew.rst create mode 100644 docs/packages/pkg/glfw.rst create mode 100644 docs/packages/pkg/glib.rst create mode 100644 docs/packages/pkg/glkit.rst create mode 100644 docs/packages/pkg/glm.rst create mode 100644 docs/packages/pkg/globjects.rst create mode 100644 docs/packages/pkg/glog.rst create mode 100644 docs/packages/pkg/glproto.rst create mode 100644 docs/packages/pkg/glslang.rst create mode 100644 docs/packages/pkg/gst_plugins_bad.rst create mode 100644 docs/packages/pkg/gst_plugins_base.rst create mode 100644 docs/packages/pkg/gst_plugins_good.rst create mode 100644 docs/packages/pkg/gst_plugins_ugly.rst create mode 100644 docs/packages/pkg/gstreamer.rst create mode 100644 docs/packages/pkg/gumbo.rst create mode 100644 docs/packages/pkg/h3.rst create mode 100644 docs/packages/pkg/half.rst create mode 100644 docs/packages/pkg/harfbuzz.rst create mode 100644 docs/packages/pkg/hdf5.rst create mode 100644 docs/packages/pkg/highwayhash.rst create mode 100644 docs/packages/pkg/http-parser.rst create mode 100644 docs/packages/pkg/hunter_venv.rst create mode 100644 docs/packages/pkg/ice.rst create mode 100644 docs/packages/pkg/icu-le-hb.rst create mode 100644 docs/packages/pkg/icu-lx.rst create mode 100644 docs/packages/pkg/imageio.rst create mode 100644 docs/packages/pkg/imagequant.rst create mode 100644 docs/packages/pkg/imgui.rst create mode 100644 docs/packages/pkg/imshow.rst create mode 100644 docs/packages/pkg/inja.rst create mode 100644 docs/packages/pkg/inputproto.rst create mode 100644 docs/packages/pkg/intltool.rst create mode 100644 docs/packages/pkg/intsizeof.rst create mode 100644 docs/packages/pkg/intx.rst create mode 100644 docs/packages/pkg/iokit.rst create mode 100644 docs/packages/pkg/ios_sim.rst create mode 100644 docs/packages/pkg/ippicv.rst create mode 100644 docs/packages/pkg/iroha-ed25519.rst create mode 100644 docs/packages/pkg/irrXML.rst create mode 100644 docs/packages/pkg/jaegertracing.rst create mode 100644 docs/packages/pkg/jansson.rst create mode 100644 docs/packages/pkg/jasper.rst create mode 100644 docs/packages/pkg/javascriptcore.rst create mode 100644 docs/packages/pkg/jo_jpeg.rst create mode 100644 docs/packages/pkg/jsoncpp.rst create mode 100644 docs/packages/pkg/kNet.rst create mode 100644 docs/packages/pkg/kbproto.rst create mode 100644 docs/packages/pkg/lcms.rst create mode 100644 docs/packages/pkg/lehrfempp.rst create mode 100644 docs/packages/pkg/leveldb.rst create mode 100644 docs/packages/pkg/libcpuid.rst create mode 100644 docs/packages/pkg/libdaemon.rst create mode 100644 docs/packages/pkg/libdill.rst create mode 100644 docs/packages/pkg/libevhtp.rst create mode 100644 docs/packages/pkg/libffi.rst create mode 100644 docs/packages/pkg/libigl.rst create mode 100644 docs/packages/pkg/libjson-rpc-cpp.rst create mode 100644 docs/packages/pkg/libmill.rst create mode 100644 docs/packages/pkg/libogg.rst create mode 100644 docs/packages/pkg/libpcre.rst create mode 100644 docs/packages/pkg/librtmp.rst create mode 100644 docs/packages/pkg/libscrypt.rst create mode 100644 docs/packages/pkg/libsodium.rst create mode 100644 docs/packages/pkg/libunibreak.rst create mode 100644 docs/packages/pkg/libusb.rst create mode 100644 docs/packages/pkg/libuv.rst create mode 100644 docs/packages/pkg/libxdg-basedir.rst create mode 100644 docs/packages/pkg/libxml2.rst create mode 100644 docs/packages/pkg/libyuv.rst create mode 100644 docs/packages/pkg/libzip.rst create mode 100644 docs/packages/pkg/lmdb.rst create mode 100644 docs/packages/pkg/lmdbxx.rst create mode 100644 docs/packages/pkg/log4cplus.rst create mode 100644 docs/packages/pkg/lz4.rst create mode 100644 docs/packages/pkg/lzma.rst create mode 100644 docs/packages/pkg/magnum.rst create mode 100644 docs/packages/pkg/md5.rst create mode 100644 docs/packages/pkg/metal.rst create mode 100644 docs/packages/pkg/mini_chromium.rst create mode 100644 docs/packages/pkg/minizip.rst create mode 100644 docs/packages/pkg/mkl.rst create mode 100644 docs/packages/pkg/mkldnn.rst create mode 100644 docs/packages/pkg/mng.rst create mode 100644 docs/packages/pkg/mobilecoreservices.rst create mode 100644 docs/packages/pkg/mojoshader.rst create mode 100644 docs/packages/pkg/mongoose.rst create mode 100644 docs/packages/pkg/mpark_variant.rst create mode 100644 docs/packages/pkg/msgpack.rst create mode 100644 docs/packages/pkg/mshadow.rst create mode 100644 docs/packages/pkg/mtplz.rst create mode 100644 docs/packages/pkg/mxnet.rst create mode 100644 docs/packages/pkg/nanoflann.rst create mode 100644 docs/packages/pkg/nanosvg.rst create mode 100644 docs/packages/pkg/ncnn.rst create mode 100644 docs/packages/pkg/ncursesw.rst create mode 100644 docs/packages/pkg/nlohmann_fifo_map.rst create mode 100644 docs/packages/pkg/nlohmann_json.rst create mode 100644 docs/packages/pkg/nsync.rst create mode 100644 docs/packages/pkg/odb-boost.rst create mode 100644 docs/packages/pkg/odb-compiler.rst create mode 100644 docs/packages/pkg/odb-mysql.rst create mode 100644 docs/packages/pkg/odb-pgsql.rst create mode 100644 docs/packages/pkg/odb-sqlite.rst create mode 100644 docs/packages/pkg/odb.rst create mode 100644 docs/packages/pkg/ogles_gpgpu.rst create mode 100644 docs/packages/pkg/oniguruma.rst create mode 100644 docs/packages/pkg/onmt.rst create mode 100644 docs/packages/pkg/openddlparser.rst create mode 100644 docs/packages/pkg/opengles.rst create mode 100644 docs/packages/pkg/opentracing-cpp.rst create mode 100644 docs/packages/pkg/osmesa.rst create mode 100644 docs/packages/pkg/pcg.rst create mode 100644 docs/packages/pkg/pciaccess.rst create mode 100644 docs/packages/pkg/pcre2.rst create mode 100644 docs/packages/pkg/pegtl.rst create mode 100644 docs/packages/pkg/pip_GitPython.rst create mode 100644 docs/packages/pkg/pip_astroid.rst create mode 100644 docs/packages/pkg/pip_boto3.rst create mode 100644 docs/packages/pkg/pip_botocore.rst create mode 100644 docs/packages/pkg/pip_certifi.rst create mode 100644 docs/packages/pkg/pip_chardet.rst create mode 100644 docs/packages/pkg/pip_cpplint.rst create mode 100644 docs/packages/pkg/pip_decorator.rst create mode 100644 docs/packages/pkg/pip_gitdb.rst create mode 100644 docs/packages/pkg/pip_idna.rst create mode 100644 docs/packages/pkg/pip_jmespath.rst create mode 100644 docs/packages/pkg/pip_lazy-object-proxy.rst create mode 100644 docs/packages/pkg/pip_nose-timer.rst create mode 100644 docs/packages/pkg/pip_nose.rst create mode 100644 docs/packages/pkg/pip_numpy.rst create mode 100644 docs/packages/pkg/pip_pylint.rst create mode 100644 docs/packages/pkg/pip_python-dateutil.rst create mode 100644 docs/packages/pkg/pip_requests.rst create mode 100644 docs/packages/pkg/pip_six.rst create mode 100644 docs/packages/pkg/pip_smmap.rst create mode 100644 docs/packages/pkg/pip_urllib3.rst create mode 100644 docs/packages/pkg/pip_wrapt.rst create mode 100644 docs/packages/pkg/pluginlib.rst create mode 100644 docs/packages/pkg/poly2tri.rst create mode 100644 docs/packages/pkg/polyclipping.rst create mode 100644 docs/packages/pkg/presentproto.rst create mode 100644 docs/packages/pkg/prometheus-cpp.rst create mode 100644 docs/packages/pkg/protobuf-c.rst create mode 100644 docs/packages/pkg/pthread-stubs.rst create mode 100644 docs/packages/pkg/pugixml.rst create mode 100644 docs/packages/pkg/pybind11.rst create mode 100644 docs/packages/pkg/qhull.rst create mode 100644 docs/packages/pkg/quartzcore.rst create mode 100644 docs/packages/pkg/quickjs.rst create mode 100644 docs/packages/pkg/rabbitmq-c.rst create mode 100644 docs/packages/pkg/rabit.rst create mode 100644 docs/packages/pkg/randrproto.rst create mode 100644 docs/packages/pkg/rang.rst create mode 100644 docs/packages/pkg/range-v3.rst create mode 100644 docs/packages/pkg/re2.rst create mode 100644 docs/packages/pkg/readline.rst create mode 100644 docs/packages/pkg/recastnavigation.rst create mode 100644 docs/packages/pkg/renderproto.rst create mode 100644 docs/packages/pkg/rocksdb.rst create mode 100644 docs/packages/pkg/ros.rst create mode 100644 docs/packages/pkg/ros_comm.rst create mode 100644 docs/packages/pkg/ros_comm_msgs.rst create mode 100644 docs/packages/pkg/ros_common_msgs.rst create mode 100644 docs/packages/pkg/ros_console_bridge.rst create mode 100644 docs/packages/pkg/ros_environment.rst create mode 100644 docs/packages/pkg/ros_gencpp.rst create mode 100644 docs/packages/pkg/ros_geneus.rst create mode 100644 docs/packages/pkg/ros_genlisp.rst create mode 100644 docs/packages/pkg/ros_genmsg.rst create mode 100644 docs/packages/pkg/ros_gennodejs.rst create mode 100644 docs/packages/pkg/ros_genpy.rst create mode 100644 docs/packages/pkg/ros_message_generation.rst create mode 100644 docs/packages/pkg/ros_message_runtime.rst create mode 100644 docs/packages/pkg/ros_std_msgs.rst create mode 100644 docs/packages/pkg/rosconsole.rst create mode 100644 docs/packages/pkg/roscpp_core.rst create mode 100644 docs/packages/pkg/rospack.rst create mode 100644 docs/packages/pkg/s3.rst create mode 100644 docs/packages/pkg/sds.rst create mode 100644 docs/packages/pkg/sentencepiece.rst create mode 100644 docs/packages/pkg/shaka_player_embedded.rst create mode 100644 docs/packages/pkg/sleef.rst create mode 100644 docs/packages/pkg/sm.rst create mode 100644 docs/packages/pkg/soil.rst create mode 100644 docs/packages/pkg/sources_for_android_sdk_packer.rst create mode 100644 docs/packages/pkg/sparsehash.rst create mode 100644 docs/packages/pkg/spdlog.rst create mode 100644 docs/packages/pkg/spirv-cross.rst create mode 100644 docs/packages/pkg/sqlite3.rst create mode 100644 docs/packages/pkg/sse2neon.rst create mode 100644 docs/packages/pkg/stanhull.rst create mode 100644 docs/packages/pkg/state_machine.rst create mode 100644 docs/packages/pkg/stb.rst create mode 100644 docs/packages/pkg/stdext-path.rst create mode 100644 docs/packages/pkg/stormlib.rst create mode 100644 docs/packages/pkg/sugar.rst create mode 100644 docs/packages/pkg/szip.rst create mode 100644 docs/packages/pkg/tacopie.rst create mode 100644 docs/packages/pkg/taocpp-json.rst create mode 100644 docs/packages/pkg/tcl.rst create mode 100644 docs/packages/pkg/tclap.rst create mode 100644 docs/packages/pkg/termcolor.rst create mode 100644 docs/packages/pkg/tf.rst create mode 100644 docs/packages/pkg/tf2.rst create mode 100644 docs/packages/pkg/thread-pool-cpp.rst create mode 100644 docs/packages/pkg/thrift.rst create mode 100644 docs/packages/pkg/tinydir.rst create mode 100644 docs/packages/pkg/tinyxml2.rst create mode 100644 docs/packages/pkg/tmxparser.rst create mode 100644 docs/packages/pkg/toluapp.rst create mode 100644 docs/packages/pkg/tomcrypt.rst create mode 100644 docs/packages/pkg/tommath.rst create mode 100644 docs/packages/pkg/tvm.rst create mode 100644 docs/packages/pkg/type_safe.rst create mode 100644 docs/packages/pkg/uikit.rst create mode 100644 docs/packages/pkg/units.rst create mode 100644 docs/packages/pkg/utf8.rst create mode 100644 docs/packages/pkg/util_linux.rst create mode 100644 docs/packages/pkg/v8.rst create mode 100644 docs/packages/pkg/vectorial.rst create mode 100644 docs/packages/pkg/videotoolbox.rst create mode 100644 docs/packages/pkg/vorbis.rst create mode 100644 docs/packages/pkg/websocketpp.rst create mode 100644 docs/packages/pkg/wt.rst create mode 100644 docs/packages/pkg/wxWidgets.rst create mode 100644 docs/packages/pkg/wyrm.rst create mode 100644 docs/packages/pkg/x11.rst create mode 100644 docs/packages/pkg/x264.rst create mode 100644 docs/packages/pkg/xau.rst create mode 100644 docs/packages/pkg/xcb-proto.rst create mode 100644 docs/packages/pkg/xcb.rst create mode 100644 docs/packages/pkg/xcursor.rst create mode 100644 docs/packages/pkg/xdamage.rst create mode 100644 docs/packages/pkg/xext.rst create mode 100644 docs/packages/pkg/xextproto.rst create mode 100644 docs/packages/pkg/xf86vidmodeproto.rst create mode 100644 docs/packages/pkg/xfixes.rst create mode 100644 docs/packages/pkg/xgboost.rst create mode 100644 docs/packages/pkg/xi.rst create mode 100644 docs/packages/pkg/xinerama.rst create mode 100644 docs/packages/pkg/xineramaproto.rst create mode 100644 docs/packages/pkg/xorg-macros.rst create mode 100644 docs/packages/pkg/xproto.rst create mode 100644 docs/packages/pkg/xrandr.rst create mode 100644 docs/packages/pkg/xrender.rst create mode 100644 docs/packages/pkg/xshmfence.rst create mode 100644 docs/packages/pkg/xtrans.rst create mode 100644 docs/packages/pkg/xxf86vm.rst create mode 100644 docs/packages/pkg/xxhash.rst create mode 100644 docs/packages/pkg/yaml-cpp.rst create mode 100644 docs/packages/pkg/zip.rst create mode 100644 docs/packages/pkg/zookeeper.rst create mode 100644 docs/packages/random.rst create mode 100644 docs/packages/regex.rst create mode 100644 docs/packages/robotics.rst create mode 100644 docs/packages/scripting.rst create mode 100644 docs/packages/serialize.rst create mode 100644 docs/packages/terminal.rst create mode 100644 docs/packages/testing.rst create mode 100644 docs/reference/errors/error.abi.detection.failure.rst create mode 100644 docs/reference/errors/error.boost.mpi.on.windows.rst create mode 100644 docs/reference/errors/error.boost.toolset.rst create mode 100644 docs/reference/errors/error.broken.package.rst create mode 100644 docs/reference/errors/error.build.disabled.rst create mode 100644 docs/reference/errors/error.cache.file.not.found.rst create mode 100644 docs/reference/errors/error.detect.hunter.root.rst create mode 100644 docs/reference/errors/error.external.build.failed.rst create mode 100644 docs/reference/errors/error.hunteraddpackage.after.project.rst create mode 100644 docs/reference/errors/error.huntergate.before.project.rst create mode 100644 docs/reference/errors/error.incorrect.input.data.rst create mode 100644 docs/reference/errors/error.internal.rst create mode 100644 docs/reference/errors/error.no.toolchain.info.rst create mode 100644 docs/reference/errors/error.openssl.perl.not.found.rst create mode 100644 docs/reference/errors/error.run.install.rst create mode 100644 docs/reference/errors/error.spaces.in.hunter.root.rst create mode 100644 docs/reference/errors/error.unexpected.hunter_config.rst create mode 100644 docs/reference/errors/error.vs.devenv.rst create mode 100644 docs/reference/errors/error.xcrun.clang.rst create mode 100644 docs/reference/internal-modules/hunter_fatal_error.rst create mode 100644 docs/reference/internal-modules/hunter_internal_error.rst create mode 100644 docs/reference/layouts.rst create mode 100644 docs/reference/layouts/deployed.rst create mode 100644 docs/reference/layouts/sources.rst create mode 100644 docs/reference/release-notes.rst create mode 100644 docs/reference/release-notes/v0.rst create mode 100644 docs/reference/release-notes/v0/20..21.diff create mode 100644 docs/reference/release-notes/v0/21..22.diff create mode 100644 docs/reference/release-notes/v0/22..23.diff create mode 100644 docs/reference/release-notes/v0/v0.21.rst create mode 100644 docs/reference/release-notes/v0/v0.22.rst create mode 100644 docs/reference/release-notes/v0/v0.23.rst create mode 100644 docs/reference/terminology/hunter-passwords-file.rst create mode 100644 docs/reference/user-modules/hunter_cacheable.rst create mode 100644 docs/reference/user-modules/hunter_check_toolchain_definition.rst create mode 100644 docs/reference/user-modules/hunter_config.rst create mode 100644 docs/reference/user-modules/hunter_download.rst create mode 100644 docs/reference/user-modules/hunter_http_password.rst create mode 100644 docs/reference/user-modules/hunter_pick_scheme.rst create mode 100644 docs/reference/user-modules/hunter_private_data.rst create mode 100644 docs/reference/user-modules/hunter_private_data_password.rst create mode 100644 docs/reference/user-modules/hunter_protected_sources.rst create mode 100644 docs/reference/user-modules/hunter_upload_password.rst create mode 100644 docs/user-guides/cmake-user/private-data.rst create mode 100644 docs/user-guides/cmake-user/protected-sources.rst create mode 100644 docs/user-guides/cmake-user/using-license-files.rst create mode 100644 docs/user-guides/hunter-developer/binary-formula.rst create mode 100644 docs/user-guides/hunter-developer/cmake-launch.rst create mode 100644 docs/user-guides/hunter-user/artifactory-cache-server.rst create mode 100644 docs/user-guides/hunter-user/git-self.rst create mode 100644 docs/user-guides/hunter-user/git-submodule.rst create mode 100644 docs/user-guides/hunter-user/github-cache-server.rst create mode 100644 docs/user-guides/hunter-user/hunter-internal.graphml create mode 100644 docs/user-guides/hunter-user/images-artifactory/01-admin-permissions.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/02-remove-anon.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/03-local-repository.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/04-type-generic.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/05-save-finish.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/06-add-user.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/07-create-reader.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/08-generate-api-key.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/09-add-permissions.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/10-hunter-access-permissions.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/11-users-permissions.png create mode 100644 docs/user-guides/hunter-user/images-artifactory/12-layout.png create mode 100644 docs/user-guides/hunter-user/images/accept-invitation.png create mode 100644 docs/user-guides/hunter-user/images/appveyor-add.png create mode 100644 docs/user-guides/hunter-user/images/appveyor-encrypt.png create mode 100644 docs/user-guides/hunter-user/images/create-server.png create mode 100644 docs/user-guides/hunter-user/images/hunter-cache-collaborator.png create mode 100644 docs/user-guides/hunter-user/images/ingenue-login.png create mode 100644 docs/user-guides/hunter-user/images/ingenue-public-repo.png create mode 100644 docs/user-guides/hunter-user/images/ingenue-token.png create mode 100644 docs/user-guides/hunter-user/images/travis-owner.png create mode 100644 docs/user-guides/hunter-user/images/upload.graphml create mode 100644 docs/user-guides/hunter-user/images/upload.png create mode 100644 docs/user-guides/hunter-user/nexus-cache-server.rst create mode 100644 docs/user-guides/images/repo-scope.png create mode 100644 examples/ARM_NEON_2_x86_SSE/CMakeLists.txt create mode 100644 examples/ARM_NEON_2_x86_SSE/foo.cpp create mode 100644 examples/Android-ARM-EABI-v7a-System-Image/CMakeLists.txt create mode 100644 examples/Android-ARM64-v8a-System-Image/CMakeLists.txt create mode 100644 examples/Android-MIPS-System-Image/CMakeLists.txt create mode 100644 examples/Android-SDK/CMakeLists.txt create mode 100644 examples/AngelScript/CMakeLists.txt create mode 100644 examples/AngelScript/boo.cpp create mode 100644 examples/Beast/CMakeLists.txt create mode 100644 examples/Beast/example.cpp create mode 100644 examples/Boost-contract/CMakeLists.txt create mode 100644 examples/Boost-contract/foo.cpp create mode 100644 examples/Boost-custom-args/CMakeLists.txt create mode 100644 examples/Boost-custom-args/config.cmake create mode 100644 examples/Boost-custom-args/foo.cpp create mode 100644 examples/Boost-fiber/CMakeLists.txt create mode 100644 examples/Boost-fiber/foo.cpp create mode 100644 examples/Boost-filesystem-shared/CMakeLists.txt create mode 100644 examples/Boost-filesystem-shared/config.cmake create mode 100644 examples/Boost-filesystem-shared/foo.cpp create mode 100644 examples/Boost-iostreams-1-64/CMakeLists.txt create mode 100644 examples/Boost-iostreams-1-64/config.cmake create mode 100644 examples/Boost-iostreams-1-64/foo.cpp create mode 100644 examples/Boost-log-shared/CMakeLists.txt create mode 100644 examples/Boost-log-shared/config.cmake create mode 100644 examples/Boost-log-shared/foo.cpp create mode 100644 examples/Boost-log/CMakeLists.txt create mode 100644 examples/Boost-log/foo.cpp create mode 100644 examples/Boost-math/CMakeLists.txt create mode 100644 examples/Boost-math/foo.cpp create mode 100644 examples/Boost-program-options/CMakeLists.txt create mode 100644 examples/Boost-python/CMakeLists.txt create mode 100644 examples/Boost-python/config.cmake create mode 100644 examples/Boost-python/foo.cpp create mode 100644 examples/Boost-random/CMakeLists.txt create mode 100644 examples/Boost-random/foo.cpp create mode 100644 examples/Boost-stacktrace/CMakeLists.txt create mode 100644 examples/Boost-stacktrace/foo.cpp create mode 100644 examples/Boost-system-1-66/CMakeLists.txt create mode 100644 examples/Boost-system-1-66/config.cmake create mode 100644 examples/Boost-system-1-66/foo.cpp create mode 100644 examples/Boost-test/CMakeLists.txt create mode 100644 examples/BoringSSL/CMakeLists.txt create mode 100644 examples/BoringSSL/foo.cpp create mode 100644 examples/Box2D/CMakeLists.txt create mode 100644 examples/Box2D/boo.cpp create mode 100644 examples/CLI11/CMakeLists.txt create mode 100644 examples/CLI11/main.cpp create mode 100644 examples/CURL-BoringSSL/CMakeLists.txt create mode 100644 examples/CURL-BoringSSL/config.cmake create mode 100644 examples/CURL-BoringSSL/foo.cpp create mode 100644 examples/CURL-with-ares/CMakeLists.txt create mode 100644 examples/CURL-with-ares/config.cmake create mode 100644 examples/CURL-with-ares/foo.cpp create mode 100644 examples/CapnProto/CMakeLists.txt create mode 100644 examples/CapnProto/foo.cpp create mode 100644 examples/Catch/CMakeLists.txt create mode 100644 examples/Catch/foo.cpp create mode 100644 examples/Catch/foo.hpp create mode 100644 examples/Catch/foo_test.cpp create mode 100644 examples/Catch/main.cpp create mode 100644 examples/CppNetlibUri/CMakeLists.txt create mode 100644 examples/CppNetlibUri/foo.cpp create mode 100644 examples/CreateLaunchers/CMakeLists.txt create mode 100644 examples/CreateLaunchers/main.cpp create mode 100644 examples/Eigen-Boost/CMakeLists.txt create mode 100644 examples/EnumGroup/CMakeLists.txt create mode 100644 examples/EnumGroup/boo.cpp create mode 100644 examples/FP16/CMakeLists.txt create mode 100644 examples/FP16/boo.cpp create mode 100644 examples/FakeIt/CMakeLists.txt create mode 100644 examples/FakeIt/fakeit_test.cpp create mode 100644 examples/Fruit/CMakeLists.txt create mode 100644 examples/Fruit/foo.cpp create mode 100644 examples/FunctionalPlus/CMakeLists.txt create mode 100644 examples/FunctionalPlus/foo.cpp create mode 100644 examples/GPUImage/CMakeLists.txt create mode 100644 examples/GPUImage/foo.mm create mode 100644 examples/HalideIR/CMakeLists.txt create mode 100644 examples/HalideIR/boo.cpp create mode 100644 examples/HastyNoise/CMakeLists.txt create mode 100644 examples/HastyNoise/config.cmake create mode 100644 examples/HastyNoise/main.cpp create mode 100644 examples/ICU/CMakeLists.txt create mode 100644 examples/ICU/boo.cpp create mode 100644 examples/IF97/CMakeLists.txt create mode 100644 examples/IF97/IF97.cpp create mode 100644 examples/LAPACK-CBLAS/CMakeLists.txt create mode 100644 examples/LAPACK-CBLAS/config.cmake create mode 100644 examples/LAPACK-CBLAS/foo.cpp create mode 100644 examples/LAPACK-dynamic/CMakeLists.txt create mode 100644 examples/LAPACK-dynamic/config.cmake create mode 100644 examples/LAPACK-dynamic/foo.cpp create mode 100644 examples/LAPACK/CMakeLists.txt create mode 100644 examples/LAPACK/foo.cpp create mode 100644 examples/LLVM/CMakeLists.txt create mode 100644 examples/LLVM/boo.cpp create mode 100644 examples/Leathers/boo.cpp create mode 100644 examples/Leptonica/CMakeLists.txt create mode 100644 examples/Leptonica/example.c create mode 100644 examples/LibCDS/CMakeLists.txt create mode 100644 examples/LibCDS/main.cpp create mode 100644 examples/Libevent/CMakeLists.txt create mode 100644 examples/Libevent/main.cpp create mode 100644 examples/LodePNG/CMakeLists.txt create mode 100644 examples/LodePNG/main.cpp create mode 100644 examples/Lua/boo.cpp create mode 100644 examples/MathFu/CMakeLists.txt create mode 100644 examples/MathFu/boo.cpp create mode 100644 examples/Microsoft.GSL/CMakeLists.txt create mode 100644 examples/Microsoft.GSL/boo.cpp create mode 100644 examples/NASM/CMakeLists.txt create mode 100644 examples/NLopt/CMakeLists.txt create mode 100644 examples/NLopt/boo.cpp create mode 100644 examples/ONNX/CMakeLists.txt create mode 100644 examples/ONNX/test.cpp create mode 100644 examples/OpenAL/CMakeLists.txt create mode 100644 examples/OpenAL/main.cpp create mode 100644 examples/OpenCL-cpp/CMakeLists.txt create mode 100644 examples/OpenCL-cpp/main.cpp create mode 100644 examples/OpenCL/CMakeLists.txt create mode 100644 examples/OpenCL/main.cpp create mode 100644 examples/OpenCV-Qt/CMakeLists.txt create mode 100644 examples/OpenCV-Qt/config.cmake create mode 100644 examples/OpenCV-Qt/foo.cpp create mode 100644 examples/OpenCV-extra/CMakeLists.txt create mode 100644 examples/OpenCV-extra/config.cmake create mode 100644 examples/OpenCV-extra/foo.cpp create mode 100644 examples/OpenCV-ffmpeg/CMakeLists.txt create mode 100644 examples/OpenCV-ffmpeg/config.cmake create mode 100644 examples/OpenCV-ffmpeg/foo.cpp create mode 100644 examples/OpenNMTTokenizer/CMakeLists.txt create mode 100644 examples/OpenNMTTokenizer/foo.cpp create mode 100644 examples/OpenSSL-1.0.2/CMakeLists.txt create mode 100644 examples/OpenSSL-1.0.2/config.cmake create mode 100644 examples/OpenSSL-1.0.2/foo.cpp create mode 100644 examples/OpenSSL-asm/CMakeLists.txt create mode 100644 examples/OpenSSL-asm/config.cmake create mode 100644 examples/OpenSSL-asm/foo.cpp create mode 100644 examples/OpenSceneGraph/CMakeLists.txt create mode 100644 examples/OpenSceneGraph/boo.cpp create mode 100644 examples/PROJ4/CMakeLists.txt create mode 100644 examples/PROJ4/hello-proj4.cpp create mode 100644 examples/PhysUnits/CMakeLists.txt create mode 100644 examples/PhysUnits/boo.cpp create mode 100644 examples/QtPropertyEditor/CMakeLists.txt create mode 100644 examples/QtPropertyEditor/boo.cpp create mode 100644 examples/Qwt/CMakeLists.txt create mode 100644 examples/Qwt/boo.cpp create mode 100644 examples/RapidXML/CMakeLists.txt create mode 100644 examples/RapidXML/foo.cpp create mode 100644 examples/RedisClient/CMakeLists.txt create mode 100644 examples/RedisClient/boo.cpp create mode 100644 examples/SDL2/dummy.cpp create mode 100644 examples/SDL_image/CMakeLists.txt create mode 100644 examples/SDL_image/main.cpp create mode 100644 examples/SDL_mixer/CMakeLists.txt create mode 100644 examples/SDL_mixer/main.cpp create mode 100644 examples/SDL_ttf/CMakeLists.txt create mode 100644 examples/SDL_ttf/main.cpp create mode 100644 examples/SimpleSignal/CMakeLists.txt create mode 100644 examples/SimpleSignal/boo.cpp create mode 100644 examples/Snappy/CMakeLists.txt create mode 100644 examples/Snappy/main.cpp create mode 100644 examples/Sqlpp11/CMakeLists.txt create mode 100644 examples/Sqlpp11/example.cpp create mode 100644 examples/SuiteSparse-dynLAPACK/CMakeLists.txt create mode 100644 examples/SuiteSparse-dynLAPACK/config.cmake create mode 100644 examples/SuiteSparse-dynLAPACK/foo.cpp create mode 100644 examples/SuiteSparse/CMakeLists.txt create mode 100644 examples/SuiteSparse/foo.cpp create mode 100644 examples/TCLAP/CMakeLists.txt create mode 100644 examples/TCLAP/main.cpp create mode 100644 examples/Tesseract/CMakeLists.txt create mode 100644 examples/Tesseract/example.cpp create mode 100644 examples/Urho3D/CMakeLists.txt create mode 100644 examples/Urho3D/Mover.cpp create mode 100644 examples/Urho3D/Mover.h create mode 100644 examples/Urho3D/Sample.h create mode 100644 examples/Urho3D/Sample.inl create mode 100644 examples/Urho3D/SkeletalAnimation.cpp create mode 100644 examples/Urho3D/SkeletalAnimation.h create mode 100644 examples/Urho3D/config.cmake create mode 100644 examples/VulkanMemoryAllocator/CMakeLists.txt create mode 100644 examples/VulkanMemoryAllocator/boo.cpp create mode 100644 examples/WDC/CMakeLists.txt create mode 100644 examples/WDC/init.cpp create mode 100644 examples/WebKit/CMakeLists.txt create mode 100644 examples/WebKit/boo.cpp create mode 100644 examples/WebP/CMakeLists.txt create mode 100644 examples/WebP/main.cpp create mode 100644 examples/YAJL/CMakeLists.txt create mode 100644 examples/YAJL/boo.cpp create mode 100644 examples/accelerate/CMakeLists.txt create mode 100644 examples/accelerate/foo.mm create mode 100644 examples/acf/CMakeLists.txt create mode 100644 examples/acf/foo.cpp create mode 100644 examples/actionlib/CMakeLists.txt create mode 100644 examples/actionlib/main.cpp create mode 100644 examples/actionlib/package.xml create mode 100644 examples/aes/CMakeLists.txt create mode 100644 examples/aes/foo.cpp create mode 100644 examples/aglet/CMakeLists.txt create mode 100644 examples/aglet/foo.cpp create mode 100644 examples/android/CMakeLists.txt create mode 100644 examples/android/foo.cpp create mode 100644 examples/android_arm64_v8a_system_image_packer/CMakeLists.txt create mode 100644 examples/android_arm_eabi_v7a_system_image_packer/CMakeLists.txt create mode 100644 examples/android_build_tools_packer/CMakeLists.txt create mode 100644 examples/android_google_apis_intel_x86_atom_system_image_packer/CMakeLists.txt create mode 100644 examples/android_google_apis_packer/CMakeLists.txt create mode 100644 examples/android_google_repository_packer/CMakeLists.txt create mode 100644 examples/android_intel_x86_atom_system_image_packer/CMakeLists.txt create mode 100644 examples/android_log/CMakeLists.txt create mode 100644 examples/android_log/foo.cpp create mode 100644 examples/android_mips_system_image_packer/CMakeLists.txt create mode 100644 examples/android_sdk_packer/CMakeLists.txt create mode 100644 examples/android_sdk_platform_packer/CMakeLists.txt create mode 100644 examples/android_sdk_platform_tools_packer/CMakeLists.txt create mode 100644 examples/android_sdk_tools_packer/CMakeLists.txt create mode 100644 examples/android_support_repository_packer/CMakeLists.txt create mode 100644 examples/angles/CMakeLists.txt create mode 100644 examples/angles/main.cpp create mode 100644 examples/angles/package.xml create mode 100644 examples/applicationservices/CMakeLists.txt create mode 100644 examples/applicationservices/foo.mm create mode 100644 examples/arabica/CMakeLists.txt create mode 100644 examples/arabica/boo.cpp create mode 100644 examples/audiounit/CMakeLists.txt create mode 100644 examples/audiounit/foo.mm create mode 100644 examples/autobahn-cpp/CMakeLists.txt create mode 100644 examples/autobahn-cpp/parameters.cpp create mode 100644 examples/autobahn-cpp/parameters.hpp create mode 100644 examples/autobahn-cpp/websocket_callee.cpp create mode 100644 examples/autoutils/CMakeLists.txt create mode 100644 examples/aws-c-common/CMakeLists.txt create mode 100644 examples/aws-c-common/boo.cpp create mode 100644 examples/benchmark/CMakeLists.txt create mode 100644 examples/benchmark/main.cpp create mode 100644 examples/bento4/CMakeLists.txt create mode 100644 examples/bento4/main.cpp create mode 100644 examples/binaryen/CMakeLists.txt create mode 100644 examples/binaryen/boo.cpp create mode 100644 examples/bison/CMakeLists.txt create mode 100644 examples/bison/rpcalc.y create mode 100644 examples/boost-pba/CMakeLists.txt create mode 100644 examples/boost-pba/config.cmake create mode 100644 examples/boost-pba/main.cpp create mode 100644 examples/botan/CMakeLists.txt create mode 100644 examples/botan/boo.cpp create mode 100644 examples/breakpad/CMakeLists.txt create mode 100644 examples/breakpad/boo.cpp create mode 100644 examples/bullet/CMakeLists.txt create mode 100644 examples/bullet/boo.cpp create mode 100644 examples/c-ares/CMakeLists.txt create mode 100644 examples/c-ares/main.cpp create mode 100644 examples/carbon/CMakeLists.txt create mode 100644 examples/carbon/foo.mm create mode 100644 examples/catkin/CMakeLists.txt create mode 100644 examples/catkin/package.xml create mode 100644 examples/cctz/CMakeLists.txt create mode 100644 examples/cctz/main.cpp create mode 100644 examples/ceres-solver-suitesparse-dynLAPACK/CMakeLists.txt create mode 100644 examples/ceres-solver-suitesparse-dynLAPACK/config.cmake create mode 100644 examples/ceres-solver-suitesparse-dynLAPACK/foo.cpp create mode 100644 examples/ceres-solver-suitesparse/CMakeLists.txt create mode 100644 examples/ceres-solver-suitesparse/config.cmake create mode 100644 examples/ceres-solver-suitesparse/foo.cpp create mode 100644 examples/ceres-solver/CMakeLists.txt create mode 100644 examples/ceres-solver/foo.cpp create mode 100644 examples/check_ci_tag/CMakeLists.txt create mode 100644 examples/civetweb/CMakeLists.txt create mode 100644 examples/civetweb/boo.cpp create mode 100644 examples/class_loader/CMakeLists.txt create mode 100644 examples/class_loader/main.cpp create mode 100644 examples/class_loader/package.xml create mode 100644 examples/cmcstl2/CMakeLists.txt create mode 100644 examples/cmcstl2/simple.cpp create mode 100644 examples/coreaudio/CMakeLists.txt create mode 100644 examples/coreaudio/foo.mm create mode 100644 examples/coretext/CMakeLists.txt create mode 100644 examples/coretext/foo.mm create mode 100644 examples/corrade/CMakeLists.txt create mode 100644 examples/corrade/foo.cpp create mode 100644 examples/cpp_redis/CMakeLists.txt create mode 100644 examples/cpp_redis/foo.cpp create mode 100644 examples/cppcodec/CMakeLists.txt create mode 100644 examples/cppcodec/boo.cpp create mode 100644 examples/cpr/CMakeLists.txt create mode 100644 examples/cpr/example.cpp create mode 100644 examples/cpuinfo/CMakeLists.txt create mode 100644 examples/cpuinfo/example.cpp create mode 100644 examples/crc32c/CMakeLists.txt create mode 100644 examples/crc32c/main.cpp create mode 100644 examples/cryptopp/CMakeLists.txt create mode 100644 examples/cryptopp/main.cpp create mode 100644 examples/ctti/CMakeLists.txt create mode 100644 examples/ctti/main.cpp create mode 100644 examples/cub/CMakeLists.txt create mode 100644 examples/cub/foo.cu create mode 100644 examples/cvsteer/CMakeLists.txt create mode 100644 examples/cvsteer/foo.cpp create mode 100644 examples/cxxopts/CMakeLists.txt create mode 100644 examples/cxxopts/boo.cpp create mode 100644 examples/czmq/CMakeLists.txt create mode 100644 examples/czmq/main.cpp create mode 100644 examples/date/CMakeLists.txt create mode 100644 examples/date/boo.cpp create mode 100644 examples/debug_assert/CMakeLists.txt create mode 100644 examples/debug_assert/main.cpp create mode 100644 examples/dlib-staticLib/CMakeLists.txt create mode 100644 examples/dlib-staticLib/config.cmake create mode 100644 examples/dlib-staticLib/timer_ex.cpp create mode 100644 examples/dlpack/CMakeLists.txt create mode 100644 examples/dlpack/boo.cpp create mode 100644 examples/dmlc-core/CMakeLists.txt create mode 100644 examples/dmlc-core/foo.cpp create mode 100644 examples/doctest/CMakeLists.txt create mode 100644 examples/doctest/foo.cpp create mode 100644 examples/doctest/foo.hpp create mode 100644 examples/doctest/foo_test.cpp create mode 100644 examples/doctest/foo_test_main.cpp create mode 100644 examples/double-conversion/CMakeLists.txt create mode 100644 examples/double-conversion/main.cpp create mode 100644 examples/draco/CMakeLists.txt create mode 100644 examples/draco/boo.cpp create mode 100644 examples/drishti/CMakeLists.txt create mode 100644 examples/drishti/config.cmake create mode 100644 examples/drishti/foo.cpp create mode 100644 examples/drishti_assets/CMakeLists.txt create mode 100644 examples/drishti_faces/CMakeLists.txt create mode 100644 examples/duktape/CMakeLists.txt create mode 100644 examples/duktape/boo.cpp create mode 100644 examples/dynalo/CMakeLists.txt create mode 100644 examples/dynalo/dynalo-example-loader.cpp create mode 100644 examples/egl/CMakeLists.txt create mode 100644 examples/egl/foo.cpp create mode 100644 examples/eigen3-nnls/CMakeLists.txt create mode 100644 examples/eigen3-nnls/foo.cpp create mode 100644 examples/enet/CMakeLists.txt create mode 100644 examples/enet/main.c create mode 100644 examples/entityx/CMakeLists.txt create mode 100644 examples/entityx/boo.cpp create mode 100644 examples/ethash/CMakeLists.txt create mode 100644 examples/ethash/main.cpp create mode 100644 examples/farmhash/CMakeLists.txt create mode 100644 examples/farmhash/foo.cpp create mode 100644 examples/ffmpeg/CMakeLists.txt create mode 100644 examples/ffmpeg/boo.cpp create mode 100644 examples/fft2d/CMakeLists.txt create mode 100644 examples/fft2d/foo.cpp create mode 100644 examples/flex/CMakeLists.txt create mode 100644 examples/flex/numbers.lex create mode 100644 examples/folly/CMakeLists.txt create mode 100644 examples/folly/boo.cpp create mode 100644 examples/foo/CMakeLists.txt create mode 100644 examples/foo/boo.cpp create mode 100644 examples/forcefeedback/CMakeLists.txt create mode 100644 examples/forcefeedback/foo.mm create mode 100644 examples/foundation/CMakeLists.txt create mode 100644 examples/foundation/foo.mm create mode 100644 examples/freetype/boo.cpp create mode 100644 examples/frugally-deep/CMakeLists.txt create mode 100644 examples/frugally-deep/foo.cpp create mode 100644 examples/gRPC/CMakeLists.txt create mode 100644 examples/gRPC/config.cmake create mode 100644 examples/gRPC/main.cpp create mode 100644 examples/gauze/CMakeLists.txt create mode 100644 examples/gauze/foo.cpp create mode 100644 examples/gemmlowp/CMakeLists.txt create mode 100644 examples/gemmlowp/foo.cpp create mode 100644 examples/getopt/CMakeLists.txt create mode 100644 examples/getopt/main.cpp create mode 100644 examples/giflib/CMakeLists.txt create mode 100644 examples/giflib/foo.cpp create mode 100644 examples/glapi/CMakeLists.txt create mode 100644 examples/glapi/foo.cpp create mode 100644 examples/glbinding/CMakeLists.txt create mode 100644 examples/glbinding/foo.cpp create mode 100644 examples/gles2/CMakeLists.txt create mode 100644 examples/gles2/foo.cpp create mode 100644 examples/gles3/CMakeLists.txt create mode 100644 examples/gles3/foo.cpp create mode 100644 examples/glib/CMakeLists.txt create mode 100644 examples/glib/foo.cpp create mode 100644 examples/globjects/CMakeLists.txt create mode 100644 examples/globjects/config.cmake create mode 100644 examples/globjects/foo.cpp create mode 100644 examples/glslang/CMakeLists.txt create mode 100644 examples/glslang/boo.cpp create mode 100644 examples/gst_plugins_bad/CMakeLists.txt create mode 100644 examples/gst_plugins_bad/foo.cpp create mode 100644 examples/gst_plugins_base/CMakeLists.txt create mode 100644 examples/gst_plugins_base/foo.cpp create mode 100644 examples/gst_plugins_good/CMakeLists.txt create mode 100644 examples/gst_plugins_good/foo.cpp create mode 100644 examples/gst_plugins_ugly/CMakeLists.txt create mode 100644 examples/gst_plugins_ugly/foo.cpp create mode 100644 examples/gstreamer/CMakeLists.txt create mode 100644 examples/gstreamer/foo.cpp create mode 100644 examples/gumbo/CMakeLists.txt create mode 100644 examples/gumbo/main.cpp create mode 100644 examples/h3/CMakeLists.txt create mode 100644 examples/h3/main.c create mode 100644 examples/harfbuzz/CMakeLists.txt create mode 100644 examples/harfbuzz/boo.cpp create mode 100644 examples/highwayhash/CMakeLists.txt create mode 100644 examples/highwayhash/foo.cpp create mode 100644 examples/http-parser/CMakeLists.txt create mode 100644 examples/http-parser/main.c create mode 100644 examples/hunter_venv/CMakeLists.txt create mode 100644 examples/hunter_venv/script.py create mode 100644 examples/icu-le-hb/CMakeLists.txt create mode 100644 examples/icu-le-hb/boo.cpp create mode 100644 examples/icu-lx/CMakeLists.txt create mode 100644 examples/icu-lx/boo.cpp create mode 100644 examples/imagequant/CMakeLists.txt create mode 100644 examples/imagequant/boo.cpp create mode 100644 examples/imgui/CMakeLists.txt create mode 100644 examples/imgui/main.cpp create mode 100644 examples/imshow/CMakeLists.txt create mode 100644 examples/imshow/foo.cpp create mode 100644 examples/inja/CMakeLists.txt create mode 100644 examples/inja/inja.cpp create mode 100644 examples/intsizeof/CMakeLists.txt create mode 100644 examples/intsizeof/foo.cpp create mode 100644 examples/intx/CMakeLists.txt create mode 100644 examples/intx/main.cpp create mode 100644 examples/iroha-ed25519/CMakeLists.txt create mode 100644 examples/iroha-ed25519/boo.cpp create mode 100644 examples/jaegertracing/CMakeLists.txt create mode 100644 examples/jaegertracing/main.cpp create mode 100644 examples/jansson/CMakeLists.txt create mode 100644 examples/jansson/main.c create mode 100644 examples/jasper/CMakeLists.txt create mode 100644 examples/jasper/boo.cpp create mode 100644 examples/javascriptcore/CMakeLists.txt create mode 100644 examples/javascriptcore/foo.mm create mode 100644 examples/jo_jpeg/CMakeLists.txt create mode 100644 examples/jo_jpeg/foo.cpp create mode 100644 examples/jsoncpp/CMakeLists.txt create mode 100644 examples/jsoncpp/main.cpp create mode 100644 examples/kNet/CMakeLists.txt create mode 100644 examples/kNet/boo.cpp create mode 100644 examples/lcms/CMakeLists.txt create mode 100644 examples/lcms/boo.cpp create mode 100644 examples/lehrfempp/CMakeLists.txt create mode 100644 examples/lehrfempp/boo.cpp create mode 100644 examples/leveldb/CMakeLists.txt create mode 100644 examples/leveldb/main.cpp create mode 100644 examples/libcpuid/CMakeLists.txt create mode 100644 examples/libcpuid/boo.cpp create mode 100644 examples/libdill/CMakeLists.txt create mode 100644 examples/libdill/main.cpp create mode 100644 examples/libevhtp/CMakeLists.txt create mode 100644 examples/libevhtp/main.c create mode 100644 examples/libffi/CMakeLists.txt create mode 100644 examples/libffi/foo.cpp create mode 100644 examples/libigl/CMakeLists.txt create mode 100644 examples/libigl/boo.cpp create mode 100644 examples/libjson-rpc-cpp/CMakeLists.txt create mode 100644 examples/libjson-rpc-cpp/main.cpp create mode 100644 examples/libmill/CMakeLists.txt create mode 100644 examples/libmill/main.cpp create mode 100644 examples/libogg/CMakeLists.txt create mode 100644 examples/libogg/foo.cpp create mode 100644 examples/libpcre/CMakeLists.txt create mode 100644 examples/libpcre/foo.cpp create mode 100644 examples/librtmp/CMakeLists.txt create mode 100644 examples/librtmp/main.cpp create mode 100644 examples/libscrypt/CMakeLists.txt create mode 100644 examples/libscrypt/main.cpp create mode 100644 examples/libunibreak/CMakeLists.txt create mode 100644 examples/libunibreak/boo.cpp create mode 100644 examples/libusb/CMakeLists.txt create mode 100644 examples/libusb/boo.cpp create mode 100644 examples/libuv/CMakeLists.txt create mode 100644 examples/libuv/example.c create mode 100644 examples/libxdg-basedir/CMakeLists.txt create mode 100644 examples/libxdg-basedir/example.cpp create mode 100644 examples/libxml2/CMakeLists.txt create mode 100644 examples/libxml2/main.c create mode 100644 examples/libzip/CMakeLists.txt create mode 100644 examples/libzip/boo.cpp create mode 100644 examples/lmdb/CMakeLists.txt create mode 100644 examples/lmdb/foo.cpp create mode 100644 examples/lmdbxx/CMakeLists.txt create mode 100644 examples/lmdbxx/main.cpp create mode 100644 examples/lz4/CMakeLists.txt create mode 100644 examples/lz4/boo.cpp create mode 100644 examples/lzma/CMakeLists.txt create mode 100644 examples/lzma/foo.cpp create mode 100644 examples/magnum/CMakeLists.txt create mode 100644 examples/magnum/PrimitivesExample.cpp create mode 100644 examples/md5/CMakeLists.txt create mode 100644 examples/md5/boo.cpp create mode 100644 examples/mkl/CMakeLists.txt create mode 100644 examples/mkl/boo.cpp create mode 100644 examples/mkldnn/CMakeLists.txt create mode 100644 examples/mkldnn/boo.cpp create mode 100644 examples/mng/CMakeLists.txt create mode 100644 examples/mng/boo.cpp create mode 100644 examples/mojoshader/CMakeLists.txt create mode 100644 examples/mojoshader/boo.cpp create mode 100644 examples/mongoose/CMakeLists.txt create mode 100644 examples/mongoose/simplest_web_server.c create mode 100644 examples/mpark_variant/CMakeLists.txt create mode 100644 examples/mpark_variant/main.cpp create mode 100644 examples/mshadow/CMakeLists.txt create mode 100644 examples/mshadow/boo.cpp create mode 100644 examples/mtplz/CMakeLists.txt create mode 100644 examples/mtplz/foo.cpp create mode 100644 examples/mxnet/CMakeLists.txt create mode 100644 examples/mxnet/boo.cpp create mode 100644 examples/mxnet/config.cmake create mode 100644 examples/nanoflann/CMakeLists.txt create mode 100644 examples/nanoflann/foo.cpp create mode 100644 examples/nanosvg/CMakeLists.txt create mode 100644 examples/nanosvg/main.cpp create mode 100644 examples/ncnn/CMakeLists.txt create mode 100644 examples/ncnn/boo.cpp create mode 100644 examples/ncursesw/CMakeLists.txt create mode 100644 examples/ncursesw/boo.cpp create mode 100644 examples/nlohmann_fifo_map/CMakeLists.txt create mode 100644 examples/nlohmann_fifo_map/main.cpp create mode 100644 examples/nlohmann_json/CMakeLists.txt create mode 100644 examples/nlohmann_json/main.cpp create mode 100644 examples/nsync/CMakeLists.txt create mode 100644 examples/nsync/foo.cpp create mode 100644 examples/oniguruma/CMakeLists.txt create mode 100644 examples/oniguruma/main.c create mode 100644 examples/onmt/CMakeLists.txt create mode 100644 examples/onmt/foo.cpp create mode 100644 examples/opengles/CMakeLists.txt create mode 100644 examples/opengles/foo.mm create mode 100644 examples/opentracing-cpp/CMakeLists.txt create mode 100644 examples/opentracing-cpp/main.cpp create mode 100644 examples/osmesa/CMakeLists.txt create mode 100644 examples/osmesa/foo.cpp create mode 100644 examples/pcg/CMakeLists.txt create mode 100644 examples/pcg/main.c create mode 100644 examples/pcre2/CMakeLists.txt create mode 100644 examples/pcre2/boo.c create mode 100644 examples/pegtl/CMakeLists.txt create mode 100644 examples/pegtl/boo.cpp create mode 100644 examples/pip_GitPython/CMakeLists.txt create mode 100644 examples/pip_astroid/CMakeLists.txt create mode 100644 examples/pip_boto3/CMakeLists.txt create mode 100644 examples/pip_botocore/CMakeLists.txt create mode 100644 examples/pip_certifi/CMakeLists.txt create mode 100644 examples/pip_chardet/CMakeLists.txt create mode 100644 examples/pip_cpplint/CMakeLists.txt create mode 100644 examples/pip_decorator/CMakeLists.txt create mode 100644 examples/pip_gitdb/CMakeLists.txt create mode 100644 examples/pip_idna/CMakeLists.txt create mode 100644 examples/pip_jmespath/CMakeLists.txt create mode 100644 examples/pip_lazy-object-proxy/CMakeLists.txt create mode 100644 examples/pip_nose-timer/CMakeLists.txt create mode 100644 examples/pip_nose/CMakeLists.txt create mode 100644 examples/pip_numpy/CMakeLists.txt create mode 100644 examples/pip_pylint/CMakeLists.txt create mode 100644 examples/pip_python-dateutil/CMakeLists.txt create mode 100644 examples/pip_requests/CMakeLists.txt create mode 100644 examples/pip_six/CMakeLists.txt create mode 100644 examples/pip_smmap/CMakeLists.txt create mode 100644 examples/pip_urllib3/CMakeLists.txt create mode 100644 examples/pip_wrapt/CMakeLists.txt create mode 100644 examples/pluginlib/CMakeLists.txt create mode 100644 examples/pluginlib/main.cpp create mode 100644 examples/pluginlib/package.xml create mode 100644 examples/prometheus-cpp/CMakeLists.txt create mode 100644 examples/prometheus-cpp/boo.cpp create mode 100644 examples/protobuf-c/CMakeLists.txt create mode 100644 examples/protobuf-c/main.c create mode 100644 examples/protobuf-c/person.proto create mode 100644 examples/pugixml/CMakeLists.txt create mode 100644 examples/pugixml/main.cpp create mode 100644 examples/pybind11/CMakeLists.txt create mode 100644 examples/pybind11/main.cpp create mode 100644 examples/qhull/CMakeLists.txt create mode 100644 examples/qhull/boo.cpp create mode 100644 examples/qt-camera/config.cmake create mode 100644 examples/qt-camera/env.sh create mode 100644 examples/qt-camera/qt.conf create mode 100644 examples/quickjs/CMakeLists.txt create mode 100644 examples/quickjs/cutils.h create mode 100644 examples/quickjs/list.h create mode 100644 examples/quickjs/run-test262.c create mode 100644 examples/rabit/CMakeLists.txt create mode 100644 examples/rabit/foo.cpp create mode 100644 examples/rang/CMakeLists.txt create mode 100644 examples/rang/boo.cpp create mode 100644 examples/range-v3/CMakeLists.txt create mode 100644 examples/range-v3/comprehensions.cpp create mode 100644 examples/re2/CMakeLists.txt create mode 100644 examples/re2/foo.cpp create mode 100644 examples/readline/CMakeLists.txt create mode 100644 examples/readline/boo.cpp create mode 100644 examples/recastnavigation/CMakeLists.txt create mode 100644 examples/recastnavigation/boo.cpp create mode 100644 examples/rocksdb/CMakeLists.txt create mode 100644 examples/rocksdb/test.cpp create mode 100644 examples/ros/CMakeLists.txt create mode 100644 examples/ros/main.cpp create mode 100644 examples/ros/package.xml create mode 100644 examples/ros_comm/CMakeLists.txt create mode 100644 examples/ros_comm/main.cpp create mode 100644 examples/ros_comm/package.xml create mode 100644 examples/ros_comm_msgs/CMakeLists.txt create mode 100644 examples/ros_comm_msgs/main.cpp create mode 100644 examples/ros_comm_msgs/package.xml create mode 100644 examples/ros_common_msgs/CMakeLists.txt create mode 100644 examples/ros_common_msgs/main.cpp create mode 100644 examples/ros_common_msgs/package.xml create mode 100644 examples/ros_console_bridge/CMakeLists.txt create mode 100644 examples/ros_console_bridge/boo.cpp create mode 100644 examples/ros_environment/CMakeLists.txt create mode 100644 examples/ros_environment/package.xml create mode 100644 examples/ros_gencpp/CMakeLists.txt create mode 100644 examples/ros_gencpp/msg/dummy.msg create mode 100644 examples/ros_gencpp/package.xml create mode 100644 examples/ros_geneus/CMakeLists.txt create mode 100644 examples/ros_geneus/msg/dummy.msg create mode 100644 examples/ros_geneus/package.xml create mode 100644 examples/ros_genlisp/CMakeLists.txt create mode 100644 examples/ros_genlisp/msg/dummy.msg create mode 100644 examples/ros_genlisp/package.xml create mode 100644 examples/ros_genmsg/CMakeLists.txt create mode 100644 examples/ros_genmsg/msg/dummy.msg create mode 100644 examples/ros_genmsg/package.xml create mode 100644 examples/ros_gennodejs/CMakeLists.txt create mode 100644 examples/ros_gennodejs/msg/dummy.msg create mode 100644 examples/ros_gennodejs/package.xml create mode 100644 examples/ros_genpy/CMakeLists.txt create mode 100644 examples/ros_genpy/msg/dummy.msg create mode 100644 examples/ros_genpy/package.xml create mode 100644 examples/ros_message_generation/CMakeLists.txt create mode 100644 examples/ros_message_generation/msg/dummy.msg create mode 100644 examples/ros_message_generation/package.xml create mode 100644 examples/ros_message_runtime/CMakeLists.txt create mode 100644 examples/ros_message_runtime/main.cpp create mode 100644 examples/ros_message_runtime/package.xml create mode 100644 examples/ros_std_msgs/CMakeLists.txt create mode 100644 examples/ros_std_msgs/main.cpp create mode 100644 examples/ros_std_msgs/package.xml create mode 100644 examples/rosconsole/CMakeLists.txt create mode 100644 examples/rosconsole/main.cpp create mode 100644 examples/rosconsole/package.xml create mode 100644 examples/roscpp_core/CMakeLists.txt create mode 100644 examples/roscpp_core/main.cpp create mode 100644 examples/roscpp_core/package.xml create mode 100644 examples/rospack/CMakeLists.txt create mode 100644 examples/rospack/main.cpp create mode 100644 examples/rospack/package.xml create mode 100644 examples/s3/CMakeLists.txt create mode 100644 examples/s3/boo.cpp create mode 100644 examples/sds/CMakeLists.txt create mode 100644 examples/sds/main.c create mode 100644 examples/sentencepiece/CMakeLists.txt create mode 100644 examples/sentencepiece/boo.cpp create mode 100644 examples/shaka_player_embedded/CMakeLists.txt create mode 100644 examples/shaka_player_embedded/boo.cpp create mode 100644 examples/shaka_player_embedded/boo.mm create mode 100644 examples/shaka_player_embedded/config.cmake create mode 100644 examples/sleef/CMakeLists.txt create mode 100644 examples/sleef/main.c create mode 100644 examples/soil/CMakeLists.txt create mode 100644 examples/soil/main.c create mode 100644 examples/sources_for_android_sdk_packer/CMakeLists.txt create mode 100644 examples/spirv-cross/CMakeLists.txt create mode 100644 examples/spirv-cross/boo.cpp create mode 100644 examples/sqlite3/CMakeLists.txt create mode 100644 examples/sqlite3/boo.cpp create mode 100644 examples/sse2neon/CMakeLists.txt create mode 100644 examples/sse2neon/foo.cpp create mode 100644 examples/stanhull/CMakeLists.txt create mode 100644 examples/stanhull/boo.cpp create mode 100644 examples/state_machine/CMakeLists.txt create mode 100644 examples/state_machine/foo.cpp create mode 100644 examples/stb/CMakeLists.txt create mode 100644 examples/stb/boo.cpp create mode 100644 examples/stdext-path/CMakeLists.txt create mode 100644 examples/stdext-path/boo.cpp create mode 100644 examples/stormlib/CMakeLists.txt create mode 100644 examples/stormlib/main.cpp create mode 100644 examples/sugar/CMakeLists.txt create mode 100644 examples/sugar/boo/boo.cpp create mode 100644 examples/sugar/boo/sugar.cmake create mode 100644 examples/tacopie/CMakeLists.txt create mode 100644 examples/tacopie/foo.cpp create mode 100644 examples/taocpp-json/CMakeLists.txt create mode 100644 examples/taocpp-json/boo.cpp create mode 100644 examples/tcl/CMakeLists.txt create mode 100644 examples/tcl/tcl_test.c create mode 100644 examples/termcolor/CMakeLists.txt create mode 100644 examples/termcolor/main.cpp create mode 100644 examples/tf/CMakeLists.txt create mode 100644 examples/tf/main.cpp create mode 100644 examples/tf/package.xml create mode 100644 examples/tf2/CMakeLists.txt create mode 100644 examples/tf2/main.cpp create mode 100644 examples/tf2/package.xml create mode 100644 examples/thrift/CMakeLists.txt create mode 100644 examples/thrift/main.cpp create mode 100644 examples/tinyxml2/CMakeLists.txt create mode 100644 examples/tinyxml2/boo.cpp create mode 100644 examples/tmxparser/CMakeLists.txt create mode 100644 examples/tmxparser/boo.cpp create mode 100644 examples/toluapp/CMakeLists.txt create mode 100644 examples/toluapp/boo.cpp create mode 100644 examples/toluapp/config.cmake create mode 100644 examples/tomcrypt/CMakeLists.txt create mode 100644 examples/tomcrypt/main.c create mode 100644 examples/tommath/CMakeLists.txt create mode 100644 examples/tommath/main.c create mode 100644 examples/tvm/CMakeLists.txt create mode 100644 examples/tvm/boo.cpp create mode 100644 examples/tvm/config.cmake create mode 100644 examples/type_safe/CMakeLists.txt create mode 100644 examples/type_safe/main.cpp create mode 100644 examples/units/CMakeLists.txt create mode 100644 examples/units/boo.cpp create mode 100644 examples/utf8/CMakeLists.txt create mode 100644 examples/utf8/boo.cpp create mode 100644 examples/util_linux/CMakeLists.txt create mode 100644 examples/util_linux/foo.cpp create mode 100644 examples/v8/CMakeLists.txt create mode 100644 examples/v8/boo.cpp create mode 100644 examples/vectorial/CMakeLists.txt create mode 100644 examples/vectorial/boo.cpp create mode 100644 examples/videotoolbox/CMakeLists.txt create mode 100644 examples/videotoolbox/foo.mm create mode 100644 examples/vorbis/CMakeLists.txt create mode 100644 examples/vorbis/boo.cpp create mode 100644 examples/wt/CMakeLists.txt create mode 100644 examples/wt/main.cpp create mode 100644 examples/wyrm/CMakeLists.txt create mode 100644 examples/wyrm/boo.cpp create mode 100644 examples/x11/foo.cpp create mode 100644 examples/x264/CMakeLists.txt create mode 100644 examples/x264/example.c create mode 100644 examples/xau/foo.cpp create mode 100644 examples/xcb/foo.cpp create mode 100644 examples/xi/CMakeLists.txt create mode 100644 examples/xi/foo.cpp create mode 100644 examples/xxhash/CMakeLists.txt create mode 100644 examples/xxhash/boo.cpp create mode 100644 examples/yaml-cpp/CMakeLists.txt create mode 100644 examples/yaml-cpp/parse.cpp create mode 100644 examples/zip/CMakeLists.txt create mode 100644 examples/zip/boo.cpp create mode 100644 examples/zookeeper/CMakeLists.txt create mode 100644 examples/zookeeper/main.c create mode 100644 maintenance/convert_wiki.py create mode 100644 maintenance/docs_create_missing_stubs.py create mode 100755 maintenance/download_package_for_server.sh create mode 100755 maintenance/graphs/module_dependencies2dot.sh create mode 100755 maintenance/graphs/modules2dot.sh create mode 100755 maintenance/local-upload/llvm/linux/gcc.sh create mode 100755 maintenance/local-upload/llvm/osx/run-osx-10-11-make.sh create mode 100644 maintenance/local-upload/llvm/win/run-win-vs-14-2015-sdk-8-1.bat create mode 100755 maintenance/local-upload/opencv/ios-nocodesign-11-4-dep-9-3-arm64.sh create mode 100755 maintenance/local-upload/opencv/ios-nocodesign-11-4-dep-9-3-armv7.sh create mode 100755 maintenance/local-upload/qt/linux/android.sh create mode 100755 maintenance/local-upload/qt/linux/clang.sh create mode 100755 maintenance/local-upload/qt/linux/gcc.sh create mode 100755 maintenance/local-upload/qt/osx/ios.sh create mode 100755 maintenance/local-upload/qt/osx/osx-make.sh create mode 100755 maintenance/local-upload/qt/osx/osx.sh create mode 100644 maintenance/local-upload/qt/win/run-win-mingw.bat create mode 100644 maintenance/local-upload/qt/win/run-win-vs-14-2015-sdk-8-1.bat create mode 100755 maintenance/local-upload/urho3d/osx/ios.sh create mode 100644 maintenance/upload-password-template.cmake create mode 100644 scripts/append-boost-config-macros.cmake.in create mode 100644 scripts/clean-boost-configs.cmake create mode 100644 scripts/find_python.cmake create mode 100644 scripts/link-all.cmake create mode 100644 scripts/link-all.py create mode 100644 scripts/pkgconfig-export-targets.cmake.in create mode 100755 scripts/upload-cache-to-github.py create mode 100644 tests/append-boost-config-macros/CMakeLists.txt create mode 100644 tests/hunter_check_toolchain_definition/CMakeLists.txt create mode 100644 tests/hunter_create_args_file/test_11 create mode 100644 tests/hunter_create_args_file/test_12 create mode 100644 tests/hunter_create_args_file/test_13 create mode 100644 tests/hunter_create_args_file/test_14 create mode 100644 tests/hunter_init_not_found_counter/CMakeLists.txt create mode 100644 tests/hunter_standard_flag/CMakeLists.txt diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake new file mode 100644 index 000000000..e78d3e891 --- /dev/null +++ b/cmake/HunterGate.cmake @@ -0,0 +1,528 @@ +# Copyright (c) 2013-2019, Ruslan Baratov +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This is a gate file to Hunter package manager. +# Include this file using `include` command and add package you need, example: +# +# cmake_minimum_required(VERSION 3.2) +# +# include("cmake/HunterGate.cmake") +# HunterGate( +# URL "https://github.com/path/to/hunter/archive.tar.gz" +# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d" +# ) +# +# project(MyProject) +# +# hunter_add_package(Foo) +# hunter_add_package(Boo COMPONENTS Bar Baz) +# +# Projects: +# * https://github.com/hunter-packages/gate/ +# * https://github.com/ruslo/hunter + +option(HUNTER_ENABLED "Enable Hunter package manager support" ON) + +if(HUNTER_ENABLED) + if(CMAKE_VERSION VERSION_LESS "3.2") + message( + FATAL_ERROR + "At least CMake version 3.2 required for Hunter dependency management." + " Update CMake or set HUNTER_ENABLED to OFF." + ) + endif() +endif() + +include(CMakeParseArguments) # cmake_parse_arguments + +option(HUNTER_STATUS_PRINT "Print working status" ON) +option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) +option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON) + +set(HUNTER_ERROR_PAGE "https://docs.hunter.sh/en/latest/reference/errors") + +function(hunter_gate_status_print) + if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + message(STATUS "[hunter] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_status_debug) + if(HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + string(TIMESTAMP timestamp) + message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_error_page error_page) + message("------------------------------ ERROR ------------------------------") + message(" ${HUNTER_ERROR_PAGE}/${error_page}.html") + message("-------------------------------------------------------------------") + message("") + message(FATAL_ERROR "") +endfunction() + +function(hunter_gate_internal_error) + message("") + foreach(print_message ${ARGV}) + message("[hunter ** INTERNAL **] ${print_message}") + endforeach() + message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("error.internal") +endfunction() + +function(hunter_gate_fatal_error) + cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}") + if("${hunter_ERROR_PAGE}" STREQUAL "") + hunter_gate_internal_error("Expected ERROR_PAGE") + endif() + message("") + foreach(x ${hunter_UNPARSED_ARGUMENTS}) + message("[hunter ** FATAL ERROR **] ${x}") + endforeach() + message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("${hunter_ERROR_PAGE}") +endfunction() + +function(hunter_gate_user_error) + hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data") +endfunction() + +function(hunter_gate_self root version sha1 result) + string(COMPARE EQUAL "${root}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("root is empty") + endif() + + string(COMPARE EQUAL "${version}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("version is empty") + endif() + + string(COMPARE EQUAL "${sha1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("sha1 is empty") + endif() + + string(SUBSTRING "${sha1}" 0 7 archive_id) + + set( + hunter_self + "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" + ) + + set("${result}" "${hunter_self}" PARENT_SCOPE) +endfunction() + +# Set HUNTER_GATE_ROOT cmake variable to suitable value. +function(hunter_gate_detect_root) + # Check CMake variable + string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty) + if(not_empty) + set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable") + return() + endif() + + # Check environment variable + string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty) + if(not_empty) + set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by environment variable") + return() + endif() + + # Check HOME environment variable + string(COMPARE NOTEQUAL "$ENV{HOME}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable") + return() + endif() + + # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only) + if(WIN32) + string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using SYSTEMDRIVE environment variable" + ) + return() + endif() + + string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using USERPROFILE environment variable" + ) + return() + endif() + endif() + + hunter_gate_fatal_error( + "Can't detect HUNTER_ROOT" + ERROR_PAGE "error.detect.hunter.root" + ) +endfunction() + +function(hunter_gate_download dir) + string( + COMPARE + NOTEQUAL + "$ENV{HUNTER_DISABLE_AUTOINSTALL}" + "" + disable_autoinstall + ) + if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL) + hunter_gate_fatal_error( + "Hunter not found in '${dir}'" + "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'" + "Settings:" + " HUNTER_ROOT: ${HUNTER_GATE_ROOT}" + " HUNTER_SHA1: ${HUNTER_GATE_SHA1}" + ERROR_PAGE "error.run.install" + ) + endif() + string(COMPARE EQUAL "${dir}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("Empty 'dir' argument") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_SHA1 empty") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_URL empty") + endif() + + set(done_location "${dir}/DONE") + set(sha1_location "${dir}/SHA1") + + set(build_dir "${dir}/Build") + set(cmakelists "${dir}/CMakeLists.txt") + + hunter_gate_status_debug("Locking directory: ${dir}") + file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) + hunter_gate_status_debug("Lock done") + + if(EXISTS "${done_location}") + # while waiting for lock other instance can do all the job + hunter_gate_status_debug("File '${done_location}' found, skip install") + return() + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(MAKE_DIRECTORY "${build_dir}") # check directory permissions + + # Disabling languages speeds up a little bit, reduces noise in the output + # and avoids path too long windows error + file( + WRITE + "${cmakelists}" + "cmake_minimum_required(VERSION 3.2)\n" + "project(HunterDownload LANGUAGES NONE)\n" + "include(ExternalProject)\n" + "ExternalProject_Add(\n" + " Hunter\n" + " URL\n" + " \"${HUNTER_GATE_URL}\"\n" + " URL_HASH\n" + " SHA1=${HUNTER_GATE_SHA1}\n" + " DOWNLOAD_DIR\n" + " \"${dir}\"\n" + " TLS_VERIFY\n" + " ${HUNTER_TLS_VERIFY}\n" + " SOURCE_DIR\n" + " \"${dir}/Unpacked\"\n" + " CONFIGURE_COMMAND\n" + " \"\"\n" + " BUILD_COMMAND\n" + " \"\"\n" + " INSTALL_COMMAND\n" + " \"\"\n" + ")\n" + ) + + if(HUNTER_STATUS_DEBUG) + set(logging_params "") + else() + set(logging_params OUTPUT_QUIET) + endif() + + hunter_gate_status_debug("Run generate") + + # Need to add toolchain file too. + # Otherwise on Visual Studio + MDD this will fail with error: + # "Could not find an appropriate version of the Windows 10 SDK installed on this machine" + if(EXISTS "${CMAKE_TOOLCHAIN_FILE}") + get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE) + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}") + else() + # 'toolchain_arg' can't be empty + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") + endif() + + string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make) + if(no_make) + set(make_arg "") + else() + # Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM + set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") + endif() + + execute_process( + COMMAND + "${CMAKE_COMMAND}" + "-H${dir}" + "-B${build_dir}" + "-G${CMAKE_GENERATOR}" + "${toolchain_arg}" + ${make_arg} + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error( + "Configure project failed." + "To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}" + "In directory ${dir}" + ) + endif() + + hunter_gate_status_print( + "Initializing Hunter workspace (${HUNTER_GATE_SHA1})" + " ${HUNTER_GATE_URL}" + " -> ${dir}" + ) + execute_process( + COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error("Build project failed") + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}") + file(WRITE "${done_location}" "DONE") + + hunter_gate_status_debug("Finished") +endfunction() + +# Must be a macro so master file 'cmake/Hunter' can +# apply all variables easily just by 'include' command +# (otherwise PARENT_SCOPE magic needed) +macro(HunterGate) + if(HUNTER_GATE_DONE) + # variable HUNTER_GATE_DONE set explicitly for external project + # (see `hunter_download`) + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() + + # First HunterGate command will init Hunter, others will be ignored + get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET) + + if(NOT HUNTER_ENABLED) + # Empty function to avoid error "unknown function" + function(hunter_add_package) + endfunction() + + set( + _hunter_gate_disabled_mode_dir + "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode" + ) + if(EXISTS "${_hunter_gate_disabled_mode_dir}") + hunter_gate_status_debug( + "Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}" + ) + list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}") + endif() + elseif(_hunter_gate_done) + hunter_gate_status_debug("Secondary HunterGate (use old settings)") + hunter_gate_self( + "${HUNTER_CACHED_ROOT}" + "${HUNTER_VERSION}" + "${HUNTER_SHA1}" + _hunter_self + ) + include("${_hunter_self}/cmake/Hunter") + else() + set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}") + + string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name) + if(_have_project_name) + hunter_gate_fatal_error( + "Please set HunterGate *before* 'project' command. " + "Detected project: ${PROJECT_NAME}" + ERROR_PAGE "error.huntergate.before.project" + ) + endif() + + cmake_parse_arguments( + HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV} + ) + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1) + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url) + string( + COMPARE + NOTEQUAL + "${HUNTER_GATE_UNPARSED_ARGUMENTS}" + "" + _have_unparsed + ) + string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global) + string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath) + + if(_have_unparsed) + hunter_gate_user_error( + "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}" + ) + endif() + if(_empty_sha1) + hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory") + endif() + if(_empty_url) + hunter_gate_user_error("URL suboption of HunterGate is mandatory") + endif() + if(_have_global) + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)") + endif() + endif() + if(HUNTER_GATE_LOCAL) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)") + endif() + endif() + if(_have_filepath) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)") + endif() + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)") + endif() + endif() + + hunter_gate_detect_root() # set HUNTER_GATE_ROOT + + # Beautify path, fix probable problems with windows path slashes + get_filename_component( + HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE + ) + hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}") + if(NOT HUNTER_ALLOW_SPACES_IN_PATH) + string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces) + if(NOT _contain_spaces EQUAL -1) + hunter_gate_fatal_error( + "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces." + "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error" + "(Use at your own risk!)" + ERROR_PAGE "error.spaces.in.hunter.root" + ) + endif() + endif() + + string( + REGEX + MATCH + "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*" + HUNTER_GATE_VERSION + "${HUNTER_GATE_URL}" + ) + string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty) + if(_is_empty) + set(HUNTER_GATE_VERSION "unknown") + endif() + + hunter_gate_self( + "${HUNTER_GATE_ROOT}" + "${HUNTER_GATE_VERSION}" + "${HUNTER_GATE_SHA1}" + _hunter_self + ) + + set(_master_location "${_hunter_self}/cmake/Hunter") + get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE) + set(_done_location "${_archive_id_location}/DONE") + set(_sha1_location "${_archive_id_location}/SHA1") + + # Check Hunter already downloaded by HunterGate + if(NOT EXISTS "${_done_location}") + hunter_gate_download("${_archive_id_location}") + endif() + + if(NOT EXISTS "${_done_location}") + hunter_gate_internal_error("hunter_gate_download failed") + endif() + + if(NOT EXISTS "${_sha1_location}") + hunter_gate_internal_error("${_sha1_location} not found") + endif() + file(READ "${_sha1_location}" _sha1_value) + string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal) + if(NOT _is_equal) + hunter_gate_internal_error( + "Short SHA1 collision:" + " ${_sha1_value} (from ${_sha1_location})" + " ${HUNTER_GATE_SHA1} (HunterGate)" + ) + endif() + if(NOT EXISTS "${_master_location}") + hunter_gate_user_error( + "Master file not found:" + " ${_master_location}" + "try to update Hunter/HunterGate" + ) + endif() + include("${_master_location}") + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() +endmacro() diff --git a/cmake/find/FindLibR.cmake b/cmake/find/FindLibR.cmake new file mode 100644 index 000000000..db2b89a10 --- /dev/null +++ b/cmake/find/FindLibR.cmake @@ -0,0 +1,183 @@ +# CMake module for R +# Borrows ideas from RStudio's FindLibR.cmake +# +# Defines the following: +# LIBR_FOUND +# LIBR_HOME +# LIBR_EXECUTABLE +# LIBR_INCLUDE_DIRS +# LIBR_LIB_DIR +# LIBR_CORE_LIBRARY +# and a cmake function to create R.lib for MSVC +# +# The following could be provided by user through cmake's -D options: +# LIBR_EXECUTABLE (for unix and win) +# R_VERSION (for win) +# R_ARCH (for win 64 when want 32 bit build) +# +# TODO: +# - someone to verify OSX detection, +# - possibly, add OSX detection based on current R in PATH or LIBR_EXECUTABLE +# - improve registry-based R_HOME detection in Windows (from a set of R_VERSION's) + + +# Windows users might want to change this to their R version: +if(NOT R_VERSION) + set(R_VERSION "3.4.1") +endif() +if(NOT R_ARCH) + if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") + set(R_ARCH "i386") + else() + set(R_ARCH "x64") + endif() +endif() + + +# Creates R.lib and R.def in the build directory for linking with MSVC +function(create_rlib_for_msvc) + # various checks and warnings + if(NOT WIN32 OR NOT MSVC) + message(FATAL_ERROR "create_rlib_for_msvc() can only be used with MSVC") + endif() + if(NOT EXISTS "${LIBR_LIB_DIR}") + message(FATAL_ERROR "LIBR_LIB_DIR was not set!") + endif() + find_program(GENDEF_EXE gendef) + find_program(DLLTOOL_EXE dlltool) + if(NOT GENDEF_EXE OR NOT DLLTOOL_EXE) + message(FATAL_ERROR "\nEither gendef.exe or dlltool.exe not found!\ + \nDo you have Rtools installed with its MinGW's bin/ in PATH?") + endif() + # extract symbols from R.dll into R.def and R.lib import library + execute_process(COMMAND gendef + "-" "${LIBR_LIB_DIR}/R.dll" + OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/R.def") + execute_process(COMMAND dlltool + "--input-def" "${CMAKE_CURRENT_BINARY_DIR}/R.def" + "--output-lib" "${CMAKE_CURRENT_BINARY_DIR}/R.lib") +endfunction(create_rlib_for_msvc) + + +# detection for OSX +if(APPLE) + + find_library(LIBR_LIBRARIES R) + + if(LIBR_LIBRARIES MATCHES ".*\\.framework") + set(LIBR_HOME "${LIBR_LIBRARIES}/Resources" CACHE PATH "R home directory") + set(LIBR_INCLUDE_DIRS "${LIBR_HOME}/include" CACHE PATH "R include directory") + set(LIBR_EXECUTABLE "${LIBR_HOME}/R" CACHE PATH "R executable") + set(LIBR_LIB_DIR "${LIBR_HOME}/lib" CACHE PATH "R lib directory") + else() + get_filename_component(_LIBR_LIBRARIES "${LIBR_LIBRARIES}" REALPATH) + get_filename_component(_LIBR_LIBRARIES_DIR "${_LIBR_LIBRARIES}" DIRECTORY) + set(LIBR_EXECUTABLE "${_LIBR_LIBRARIES_DIR}/../bin/R") + execute_process( + COMMAND ${LIBR_EXECUTABLE} "--slave" "--vanilla" "-e" "cat(R.home())" + OUTPUT_VARIABLE LIBR_HOME) + set(LIBR_HOME ${LIBR_HOME} CACHE PATH "R home directory") + set(LIBR_INCLUDE_DIRS "${LIBR_HOME}/include" CACHE PATH "R include directory") + set(LIBR_LIB_DIR "${LIBR_HOME}/lib" CACHE PATH "R lib directory") + endif() + +# detection for UNIX & Win32 +else() + + # attempt to find R executable + if(NOT LIBR_EXECUTABLE) + find_program(LIBR_EXECUTABLE NAMES R R.exe) + endif() + + if(UNIX) + + if(NOT LIBR_EXECUTABLE) + message(FATAL_ERROR "Unable to locate R executable.\ + \nEither add its location to PATH or provide it through the LIBR_EXECUTABLE cmake variable") + endif() + + # ask R for the home path + execute_process( + COMMAND ${LIBR_EXECUTABLE} "--slave" "--vanilla" "-e" "cat(R.home())" + OUTPUT_VARIABLE LIBR_HOME + ) + # ask R for the include dir + execute_process( + COMMAND ${LIBR_EXECUTABLE} "--slave" "--no-save" "-e" "cat(R.home('include'))" + OUTPUT_VARIABLE LIBR_INCLUDE_DIRS + ) + # ask R for the lib dir + execute_process( + COMMAND ${LIBR_EXECUTABLE} "--slave" "--no-save" "-e" "cat(R.home('lib'))" + OUTPUT_VARIABLE LIBR_LIB_DIR + ) + + # Windows + else() + # ask R for R_HOME + if(LIBR_EXECUTABLE) + execute_process( + COMMAND ${LIBR_EXECUTABLE} "--slave" "--no-save" "-e" "cat(normalizePath(R.home(), winslash='/'))" + OUTPUT_VARIABLE LIBR_HOME) + endif() + # if R executable not available, query R_HOME path from registry + if(NOT LIBR_HOME) + get_filename_component(LIBR_HOME + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\R-core\\R\\${R_VERSION};InstallPath]" + ABSOLUTE) + if(NOT LIBR_HOME) + message(FATAL_ERROR "\nUnable to locate R executable.\ + \nEither add its location to PATH or provide it through the LIBR_EXECUTABLE cmake variable") + endif() + endif() + # set exe location based on R_ARCH + if(NOT LIBR_EXECUTABLE) + set(LIBR_EXECUTABLE "${LIBR_HOME}/bin/${R_ARCH}/R.exe") + endif() + # set other R paths based on home path + set(LIBR_INCLUDE_DIRS "${LIBR_HOME}/include") + set(LIBR_LIB_DIR "${LIBR_HOME}/bin/${R_ARCH}") + +message(STATUS "LIBR_HOME [${LIBR_HOME}]") +message(STATUS "LIBR_EXECUTABLE [${LIBR_EXECUTABLE}]") +message(STATUS "LIBR_INCLUDE_DIRS [${LIBR_INCLUDE_DIRS}]") +message(STATUS "LIBR_LIB_DIR [${LIBR_LIB_DIR}]") +message(STATUS "LIBR_CORE_LIBRARY [${LIBR_CORE_LIBRARY}]") + + endif() + +endif() + +if(WIN32 AND MSVC) + # create a local R.lib import library for R.dll if it doesn't exist + if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/R.lib") + create_rlib_for_msvc() + endif() +endif() + +# look for the core R library +find_library(LIBR_CORE_LIBRARY NAMES R + HINTS "${CMAKE_CURRENT_BINARY_DIR}" "${LIBR_LIB_DIR}" "${LIBR_HOME}/bin" "${LIBR_LIBRARIES}") +if(LIBR_CORE_LIBRARY-NOTFOUND) + message(STATUS "Could not find R core shared library.") +endif() + +set(LIBR_HOME ${LIBR_HOME} CACHE PATH "R home directory") +set(LIBR_EXECUTABLE ${LIBR_EXECUTABLE} CACHE PATH "R executable") +set(LIBR_INCLUDE_DIRS ${LIBR_INCLUDE_DIRS} CACHE PATH "R include directory") +set(LIBR_LIB_DIR ${LIBR_LIB_DIR} CACHE PATH "R shared libraries directory") +set(LIBR_CORE_LIBRARY ${LIBR_CORE_LIBRARY} CACHE PATH "R core shared library") + +# define find requirements +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibR DEFAULT_MSG + LIBR_HOME + LIBR_EXECUTABLE + LIBR_INCLUDE_DIRS + LIBR_LIB_DIR + LIBR_CORE_LIBRARY +) + +if(LIBR_FOUND) + message(STATUS "Found R: ${LIBR_EXECUTABLE}") +endif() diff --git a/cmake/find/Findaccelerate.cmake b/cmake/find/Findaccelerate.cmake new file mode 100644 index 000000000..4ed1c187e --- /dev/null +++ b/cmake/find/Findaccelerate.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "Accelerate") diff --git a/cmake/find/Findandroid.cmake b/cmake/find/Findandroid.cmake new file mode 100644 index 000000000..dfc12b58b --- /dev/null +++ b/cmake/find/Findandroid.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper) +hunter_find_helper(LIBRARY "android" HEADER "android/api-level.h") diff --git a/cmake/find/Findandroid_log.cmake b/cmake/find/Findandroid_log.cmake new file mode 100644 index 000000000..ff6a4c770 --- /dev/null +++ b/cmake/find/Findandroid_log.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper) +hunter_find_helper(LIBRARY "log" HEADER "android/log.h") diff --git a/cmake/find/Findappkit.cmake b/cmake/find/Findappkit.cmake new file mode 100644 index 000000000..0d171d682 --- /dev/null +++ b/cmake/find/Findappkit.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "AppKit") diff --git a/cmake/find/Findapplicationservices.cmake b/cmake/find/Findapplicationservices.cmake new file mode 100644 index 000000000..9edcb6063 --- /dev/null +++ b/cmake/find/Findapplicationservices.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017-2019, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "ApplicationServices") diff --git a/cmake/find/Findassetslibrary.cmake b/cmake/find/Findassetslibrary.cmake new file mode 100644 index 000000000..5f4af5516 --- /dev/null +++ b/cmake/find/Findassetslibrary.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "AssetsLibrary") diff --git a/cmake/find/Findaudiotoolbox.cmake b/cmake/find/Findaudiotoolbox.cmake new file mode 100644 index 000000000..d9f861325 --- /dev/null +++ b/cmake/find/Findaudiotoolbox.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "AudioToolbox") diff --git a/cmake/find/Findaudiounit.cmake b/cmake/find/Findaudiounit.cmake new file mode 100644 index 000000000..e0e6aa682 --- /dev/null +++ b/cmake/find/Findaudiounit.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "AudioUnit") diff --git a/cmake/find/Findavfoundation.cmake b/cmake/find/Findavfoundation.cmake new file mode 100644 index 000000000..f17e61a6f --- /dev/null +++ b/cmake/find/Findavfoundation.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "AVFoundation") diff --git a/cmake/find/Findcarbon.cmake b/cmake/find/Findcarbon.cmake new file mode 100644 index 000000000..54b0db946 --- /dev/null +++ b/cmake/find/Findcarbon.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "Carbon") diff --git a/cmake/find/Findcoreaudio.cmake b/cmake/find/Findcoreaudio.cmake new file mode 100644 index 000000000..cf236a94d --- /dev/null +++ b/cmake/find/Findcoreaudio.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreAudio") diff --git a/cmake/find/Findcoredata.cmake b/cmake/find/Findcoredata.cmake new file mode 100644 index 000000000..308ec63ca --- /dev/null +++ b/cmake/find/Findcoredata.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreData") diff --git a/cmake/find/Findcorefoundation.cmake b/cmake/find/Findcorefoundation.cmake new file mode 100644 index 000000000..fc820c989 --- /dev/null +++ b/cmake/find/Findcorefoundation.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreFoundation") diff --git a/cmake/find/Findcoregraphics.cmake b/cmake/find/Findcoregraphics.cmake new file mode 100644 index 000000000..e6cc3bba9 --- /dev/null +++ b/cmake/find/Findcoregraphics.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreGraphics") diff --git a/cmake/find/Findcorelocation.cmake b/cmake/find/Findcorelocation.cmake new file mode 100644 index 000000000..d26a8318b --- /dev/null +++ b/cmake/find/Findcorelocation.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreLocation") diff --git a/cmake/find/Findcoremedia.cmake b/cmake/find/Findcoremedia.cmake new file mode 100644 index 000000000..19e2d1d01 --- /dev/null +++ b/cmake/find/Findcoremedia.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreMedia") diff --git a/cmake/find/Findcoremotion.cmake b/cmake/find/Findcoremotion.cmake new file mode 100644 index 000000000..ad7c9a9f1 --- /dev/null +++ b/cmake/find/Findcoremotion.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreMotion") diff --git a/cmake/find/Findcoretext.cmake b/cmake/find/Findcoretext.cmake new file mode 100644 index 000000000..381e4b612 --- /dev/null +++ b/cmake/find/Findcoretext.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017-2019, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreText") diff --git a/cmake/find/Findcorevideo.cmake b/cmake/find/Findcorevideo.cmake new file mode 100644 index 000000000..8533f7262 --- /dev/null +++ b/cmake/find/Findcorevideo.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "CoreVideo") diff --git a/cmake/find/Findegl.cmake b/cmake/find/Findegl.cmake new file mode 100644 index 000000000..72c132341 --- /dev/null +++ b/cmake/find/Findegl.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper) +hunter_find_helper(LIBRARY "EGL" HEADER "EGL/egl.h") diff --git a/cmake/find/Findforcefeedback.cmake b/cmake/find/Findforcefeedback.cmake new file mode 100644 index 000000000..d97badd29 --- /dev/null +++ b/cmake/find/Findforcefeedback.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "ForceFeedback") diff --git a/cmake/find/Findfoundation.cmake b/cmake/find/Findfoundation.cmake new file mode 100644 index 000000000..b825aafa7 --- /dev/null +++ b/cmake/find/Findfoundation.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "Foundation") diff --git a/cmake/find/Findgamecontroller.cmake b/cmake/find/Findgamecontroller.cmake new file mode 100644 index 000000000..eca46844a --- /dev/null +++ b/cmake/find/Findgamecontroller.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "GameController") diff --git a/cmake/find/Findglapi.cmake b/cmake/find/Findglapi.cmake new file mode 100644 index 000000000..746c2eea3 --- /dev/null +++ b/cmake/find/Findglapi.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper) +hunter_find_helper(LIBRARY "glapi" HEADER "GL/gl.h") diff --git a/cmake/find/Findgles2.cmake b/cmake/find/Findgles2.cmake new file mode 100644 index 000000000..3f484274f --- /dev/null +++ b/cmake/find/Findgles2.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper) +hunter_find_helper(LIBRARY "GLESv2" HEADER "GLES2/gl2.h") diff --git a/cmake/find/Findgles3.cmake b/cmake/find/Findgles3.cmake new file mode 100644 index 000000000..736036697 --- /dev/null +++ b/cmake/find/Findgles3.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper) +hunter_find_helper(LIBRARY "GLESv3" HEADER "GLES3/gl3.h") diff --git a/cmake/find/Findglkit.cmake b/cmake/find/Findglkit.cmake new file mode 100644 index 000000000..aa118ab27 --- /dev/null +++ b/cmake/find/Findglkit.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "GLKit") diff --git a/cmake/find/Findimageio.cmake b/cmake/find/Findimageio.cmake new file mode 100644 index 000000000..9e51ece10 --- /dev/null +++ b/cmake/find/Findimageio.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "ImageIO") diff --git a/cmake/find/Findiokit.cmake b/cmake/find/Findiokit.cmake new file mode 100644 index 000000000..65ea2258c --- /dev/null +++ b/cmake/find/Findiokit.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "IOKit") diff --git a/cmake/find/Findjavascriptcore.cmake b/cmake/find/Findjavascriptcore.cmake new file mode 100644 index 000000000..cd116bfbf --- /dev/null +++ b/cmake/find/Findjavascriptcore.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2019, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "JavaScriptCore") diff --git a/cmake/find/Findmetal.cmake b/cmake/find/Findmetal.cmake new file mode 100644 index 000000000..949aa7825 --- /dev/null +++ b/cmake/find/Findmetal.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "Metal") diff --git a/cmake/find/Findmobilecoreservices.cmake b/cmake/find/Findmobilecoreservices.cmake new file mode 100644 index 000000000..1143c56d5 --- /dev/null +++ b/cmake/find/Findmobilecoreservices.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "MobileCoreServices") diff --git a/cmake/find/Findopengles.cmake b/cmake/find/Findopengles.cmake new file mode 100644 index 000000000..e3824a306 --- /dev/null +++ b/cmake/find/Findopengles.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "OpenGLES") diff --git a/cmake/find/Findosmesa.cmake b/cmake/find/Findosmesa.cmake new file mode 100644 index 000000000..cb4b756b7 --- /dev/null +++ b/cmake/find/Findosmesa.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper) +hunter_find_helper(LIBRARY "OSMesa" HEADER "GL/osmesa.h") diff --git a/cmake/find/Findquartzcore.cmake b/cmake/find/Findquartzcore.cmake new file mode 100644 index 000000000..091f550dc --- /dev/null +++ b/cmake/find/Findquartzcore.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "QuartzCore") diff --git a/cmake/find/Findreadline.cmake b/cmake/find/Findreadline.cmake new file mode 100644 index 000000000..0009fa754 --- /dev/null +++ b/cmake/find/Findreadline.cmake @@ -0,0 +1,23 @@ + +# The readline library is autotools-based, but does not include +# pkgconfig files. So, a find module is needed to locate the outputs. +find_library(readline_library "libreadline.a") +find_library(history_library "libhistory.a") +find_path(readline_INCLUDE_DIRS readline/readline.h) + +find_package(ncursesw CONFIG REQUIRED) + +add_library("readline::readline" UNKNOWN IMPORTED) +set_target_properties("readline::readline" + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${readline_INCLUDE_DIRS}" + IMPORTED_LOCATION "${readline_library}" + INTERFACE_LINK_LIBRARIES PkgConfig::ncursesw +) + +add_library("readline::history" UNKNOWN IMPORTED) +set_target_properties("readline::history" + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${readline_INCLUDE_DIRS}" + IMPORTED_LOCATION "${history_library}" +) diff --git a/cmake/find/Findtcl.cmake b/cmake/find/Findtcl.cmake new file mode 100644 index 000000000..abfea5440 --- /dev/null +++ b/cmake/find/Findtcl.cmake @@ -0,0 +1,39 @@ +find_path( + TCL_INCLUDE_DIR + tcl.h + PATHS + "${TCL_ROOT}/include" + NO_DEFAULT_PATH +) + +find_library( + TCL_LIBRARY + tcl8.6 + PATHS + "${TCL_ROOT}/lib" + NO_DEFAULT_PATH +) + +set(interface_libraries m z) +if(ANDROID) + list(APPEND interface_libraries dl) +elseif(APPLE) + list(APPEND interface_libraries pthread) +else() + list(APPEND interface_libraries dl pthread) +endif() + +if(NOT TARGET "tcl::tcl") + if(NOT TCL_LIBRARY) + message(FATAL_ERROR "TCL_LIBRARY not found!") + endif() + add_library("tcl::tcl" UNKNOWN IMPORTED) + set_target_properties( + "tcl::tcl" + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${TCL_INCLUDE_DIR}" + IMPORTED_LOCATION "${TCL_LIBRARY}" + IMPORTED_LINK_INTERFACE_LIBRARIES "${interface_libraries}" + ) + set(TCL_FOUND TRUE) +endif() diff --git a/cmake/find/Finduikit.cmake b/cmake/find/Finduikit.cmake new file mode 100644 index 000000000..f3dad94de --- /dev/null +++ b/cmake/find/Finduikit.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "UIKit") diff --git a/cmake/find/Findvideotoolbox.cmake b/cmake/find/Findvideotoolbox.cmake new file mode 100644 index 000000000..30a612fde --- /dev/null +++ b/cmake/find/Findvideotoolbox.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2017-2019, Ruslan Baratov +# All rights reserved. + +include(hunter_find_helper_framework) +hunter_find_helper_framework(FRAMEWORK "VideoToolbox") diff --git a/cmake/modules/hunter_append_component.cmake b/cmake/modules/hunter_append_component.cmake new file mode 100644 index 000000000..e093f79fd --- /dev/null +++ b/cmake/modules/hunter_append_component.cmake @@ -0,0 +1,57 @@ +# Copyright (c) 2017 NeroBurner +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_not_empty_string) + +# check if component is in specified version range, add to 'varname' if valid +# - varname: name of the variable of the list to append component names +# - name: name of the component to add to list if version is valid +# - given_version: version to check +# - version_since: first version the component is included +# - version_until: first version the component isn't included anymore +function(hunter_append_component) + set(function_name "hunter_append_component") + set(function_synopsis "${function_name}(LIST varname VERSION given-version COMPONENT name SINCE version_since [UNTIL version_until])") + + # parse arguments + set(one_value_args LIST VERSION COMPONENT SINCE UNTIL) + cmake_parse_arguments(x "" "${one_value_args}" "" ${ARGV}) + + # No free arguments allowed + list(LENGTH x_UNPARSED_ARGUMENTS x_len) + if(NOT x_len EQUAL 0) + hunter_internal_error( + "'${function_name}' incorrect usage," + " expected no free arguments '${x_UNPARSED_ARGUMENTS}'." + " Synopsis: ${function_synopsis}" + ) + endif() + + # check mandatory arguments + foreach(arg LIST VERSION COMPONENT SINCE) + string(COMPARE EQUAL "${x_${arg}}" "" is_empty) + if(is_empty) + hunter_internal_error( + "'${function_name}' incorrect usage," + " option '${arg}' with one argument is mandatory." + " Synopsis: ${function_synopsis}" + ) + endif() + endforeach() + + set(component_list ${${x_LIST}}) + if(NOT x_VERSION VERSION_LESS x_SINCE) + # check until only if set + string(COMPARE EQUAL "${x_UNTIL}" "" _is_empty) + if(_is_empty) + list(APPEND component_list ${x_COMPONENT}) + elseif(x_VERSION VERSION_LESS x_UNTIL) + list(APPEND component_list ${x_COMPONENT}) + endif() + endif() + + # set output_var to found definition + set(${x_LIST} ${component_list} PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_assert_empty_string.cmake b/cmake/modules/hunter_assert_empty_string.cmake new file mode 100644 index 000000000..dbb66f976 --- /dev/null +++ b/cmake/modules/hunter_assert_empty_string.cmake @@ -0,0 +1,14 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(hunter_internal_error) + +function(hunter_assert_empty_string string_to_check) + if(NOT ARGN STREQUAL "") + hunter_internal_error("Unexpected: '${ARGN}'") + endif() + + if(NOT string_to_check STREQUAL "") + hunter_internal_error("Expected to be empty: '${string_to_check}'") + endif() +endfunction() diff --git a/cmake/modules/hunter_assert_not_empty_string.cmake b/cmake/modules/hunter_assert_not_empty_string.cmake new file mode 100644 index 000000000..3bd724758 --- /dev/null +++ b/cmake/modules/hunter_assert_not_empty_string.cmake @@ -0,0 +1,11 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +include(hunter_internal_error) + +function(hunter_assert_not_empty_string test_string) + string(COMPARE EQUAL "${test_string}" "" is_empty) + if(is_empty) + hunter_internal_error("Unexpected empty string") + endif() +endfunction() diff --git a/cmake/modules/hunter_autotools_configure_command.cmake b/cmake/modules/hunter_autotools_configure_command.cmake new file mode 100644 index 000000000..a5150e8fd --- /dev/null +++ b/cmake/modules/hunter_autotools_configure_command.cmake @@ -0,0 +1,238 @@ +# Copyright (c) 2017 Ruslan Baratov, Alexandre Pretyman +# All rights reserved. +# +# This function generates a ./configure command line for autotools +# +# Usage example: +# hunter_autotools_project(out_command_line # saves the result in this var +# PACKAGE_CONFIGURATION_TYPES +# "Release" # Mandatory ONE build config type +# CONFIGURE_HOST +# "armv7" # passed to --configure-host= +# PACKAGE_INSTALL_DIR +# "${HUNTER_PACKAGE_INSTALL_DIR}" # passed to --prefix= +# INSTALL_DIR +# "${HUNTER_INSTALL_DIR}" # of hunter +# CPPFLAGS +# "-DEXTRA_CPP_FLAGS" # extra preprocessor flags +# CFLAGS +# "-O2" # extra c compilation flags +# CXXFLAGS +# "-Wall" # extra c++ compilation flags +# LDFLAGS +# "-lmycrazylib" # extra linking flags +# EXTRA_FLAGS +# --any-other # extra flags to be appended +# --flags +# --needed +# ) +include(CMakeParseArguments) + +include(hunter_dump_cmake_flags) +include(hunter_fatal_error) +include(hunter_user_error) +include(hunter_get_build_flags) +include(hunter_get_toolchain_binaries) +include(hunter_internal_error) +include(hunter_status_debug) + +function(hunter_autotools_configure_command out_command_line) + set(optional_params) + set(one_value_params + CONFIGURE_HOST + PACKAGE_INSTALL_DIR + INSTALL_DIR + CPPFLAGS + CFLAGS + CXXFLAGS + LDFLAGS + ) + set(multi_value_params + PACKAGE_CONFIGURATION_TYPES + EXTRA_FLAGS + ) + cmake_parse_arguments( + PARAM + "${optional_params}" + "${one_value_params}" + "${multi_value_params}" + ${ARGN} + ) + + if(PARAM_UNPARSED_ARGUMENTS) + hunter_internal_error( + "Invalid arguments passed to hunter_autotools_configure_command" + " ${PARAM_UNPARSED_ARGUMENTS}" + ) + endif() + + set(configure_host) + string(COMPARE NOTEQUAL "${ANDROID}" "" is_android) + string(COMPARE NOTEQUAL "${IPHONEOS_ARCHS}${IPHONESIMULATOR_ARCHS}" "" is_ios) + string(COMPARE NOTEQUAL "${CROSS_COMPILE_TOOLCHAIN_PREFIX}" "" is_cross_compile) + if(is_android) + set(configure_host --host=${CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE}) + elseif(is_ios) + string(COMPARE NOTEQUAL "${PARAM_CONFIGURE_HOST}" "" has_configure_host) + if(has_configure_host) + set(configure_host --host=${PARAM_CONFIGURE_HOST}) + else() + hunter_user_error("hunter_autotools_configure_command on iOS build must supply a CONFIGURE_HOST") + endif() + elseif(is_cross_compile) + set(configure_host --host=${CROSS_COMPILE_TOOLCHAIN_PREFIX}) + endif() + + + + # Build the configure command line options + set(configure_command) + + list(APPEND configure_command "./configure") + + string(COMPARE NOTEQUAL "${configure_host}" "" has_configure_host) + if(has_configure_host) + list(APPEND configure_command ${configure_host}) + endif() + + hunter_get_toolchain_binaries( + OUT_AR + ar + OUT_AS + as + OUT_LD + ld + OUT_NM + nm + OUT_OBJCOPY + objcopy + OUT_OBJDUMP + objdump + OUT_RANLIB + ranlib + OUT_STRIP + strip + OUT_CPP + cpp + OUT_CC + cc + OUT_CXX + cxx + ) + + set(toolchain_binaries) + if(ar) + list(APPEND toolchain_binaries "AR=${ar}") + endif() + if(as) + list(APPEND toolchain_binaries "AS=${as}") + endif() + if(ld) + list(APPEND toolchain_binaries "LD=${ld}") + endif() + if(nm) + list(APPEND toolchain_binaries "NM=${nm}") + endif() + if(objcopy) + list(APPEND toolchain_binaries "OBJCOPY=${objcopy}") + endif() + if(objdump) + list(APPEND toolchain_binaries "OBJDUMP=${objdump}") + endif() + if(ranlib) + list(APPEND toolchain_binaries "RANLIB=${ranlib}") + endif() + if(strip) + list(APPEND toolchain_binaries "STRIP=${strip}") + endif() + if(cpp) + list(APPEND toolchain_binaries "CPP=${cpp}") + endif() + if(cc) + list(APPEND toolchain_binaries "CC=${cc}") + endif() + if(cxx) + list(APPEND toolchain_binaries "CXX=${cxx}") + endif() + + if(toolchain_binaries) + list(APPEND configure_command ${toolchain_binaries}) + endif() + + list(LENGTH PARAM_PACKAGE_CONFIGURATION_TYPES len) + if(NOT "${len}" EQUAL "1") + hunter_fatal_error( + "Autotools PACKAGE_CONFIGURATION_TYPES has ${len} elements: ${PARAM_PACKAGE_CONFIGURATION_TYPES}. Only 1 is allowed" + ERROR_PAGE "autools.package.configuration.types" + ) + endif() + string(TOUPPER ${PARAM_PACKAGE_CONFIGURATION_TYPES} config_type) + + hunter_get_build_flags( + INSTALL_DIR + ${PARAM_INSTALL_DIR} + PACKAGE_CONFIGURATION_TYPES + ${PARAM_PACKAGE_CONFIGURATION_TYPES} + OUT_CPPFLAGS + cppflags + OUT_CFLAGS + cflags + OUT_CXXFLAGS + cxxflags + OUT_LDFLAGS + ldflags + ) + # -> CMAKE_C_FLAGS + # -> CMAKE_CXX_FLAGS + hunter_status_debug("Autotools complation/linking flags:") + set(cppflags "${cppflags} ${PARAM_CPPFLAGS}") + string(STRIP "${cppflags}" cppflags) + hunter_status_debug(" CPPFLAGS=${cppflags}") + list(APPEND configure_command CPPFLAGS=${cppflags}) + + set(cflags "${cflags} ${PARAM_CFLAGS}") + string(STRIP "${cflags}" cflags) + hunter_status_debug(" CFLAGS=${cflags}") + list(APPEND configure_command CFLAGS=${cflags}) + + set(cxxflags "${cxxflags} ${PARAM_CXXFLAGS}") + string(STRIP "${cxxflags}" cxxflags) + hunter_status_debug(" CXXFLAGS=${cxxflags}") + list(APPEND configure_command CXXFLAGS=${cxxflags}) + + hunter_status_debug(" PARAM_LDFLAGS=${PARAM_LDFLAGS}") + set(ldflags "${ldflags} ${PARAM_LDFLAGS}") + string(STRIP "${ldflags}" ldflags) + hunter_status_debug(" LDFLAGS=${ldflags}") + list(APPEND configure_command LDFLAGS=${ldflags}) + + + if(PARAM_EXTRA_FLAGS) + list(APPEND configure_command ${PARAM_EXTRA_FLAGS}) + endif() + + # Hunter builds static libraries by default + if(BUILD_SHARED_LIBS) + list(APPEND configure_command --enable-shared --disable-static) + else() + list(APPEND configure_command --disable-shared --enable-static) + endif() + + list(APPEND configure_command "--prefix=${PARAM_PACKAGE_INSTALL_DIR}") + + # See: https://github.com/ruslo/hunter/pull/1910#discussion_r300725504 + list( + APPEND + configure_command + "--with-pkg-config-libdir=${PARAM_PACKAGE_INSTALL_DIR}/lib/pkgconfig" + ) + + if(HUNTER_STATUS_DEBUG) + string(REPLACE ";" " " final_configure_command "${configure_command}") + hunter_status_debug("Final configure command:") + hunter_status_debug(" ${final_configure_command}") + endif() + + set(${out_command_line} ${configure_command} PARENT_SCOPE) +endfunction() + diff --git a/cmake/modules/hunter_cache_server_password.cmake b/cmake/modules/hunter_cache_server_password.cmake new file mode 100644 index 000000000..6de2e84b9 --- /dev/null +++ b/cmake/modules/hunter_cache_server_password.cmake @@ -0,0 +1,59 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_status_debug) +include(hunter_user_error) + +function(hunter_cache_server_password) + set(opt SUB_SHA1_SUFFIX) + set(one SERVER USERNAME PASSWORD) + set(multi HTTPHEADER) + + cmake_parse_arguments(x "${opt}" "${one}" "${multi}" "${ARGN}") + # -> x_SUB_SHA1_SUFFIX + # -> x_SERVER + # -> x_USERNAME + # -> x_PASSWORD + # -> x_HTTPHEADER + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + hunter_user_error( + "'hunter_cache_server_password' unparsed arguments: ${x_UNPARSED_ARGUMENTS}" + ) + endif() + + string(COMPARE EQUAL "${x_SERVER}" "" no_server) + if(no_server) + hunter_user_error("'SERVER' required") + endif() + + string(COMPARE EQUAL "${HUNTER_CACHE_SERVER_NAME}" "" no_cache_server) + if(no_cache_server) + return() + endif() + + string(COMPARE EQUAL "${HUNTER_CACHE_SERVER_NAME}" "${x_SERVER}" hit) + if(NOT hit) + hunter_status_debug("Skip '${HUNTER_CACHE_SERVER_NAME}' server") + return() + endif() + + set(httpheaders) + foreach(httpheader ${x_HTTPHEADER}) + list(APPEND httpheaders HTTPHEADER "${httpheader}") + endforeach() + + string(COMPARE NOTEQUAL "${x_USERNAME}" "" has_username) + string(COMPARE NOTEQUAL "${x_PASSWORD}" "" has_password) + set(userpwd) + if(has_username OR has_password) + set(userpwd USERPWD "${x_USERNAME}:${x_PASSWORD}") + endif() + + set(HUNTER_CACHE_SERVER_USERPWD "${userpwd}" PARENT_SCOPE) + set(HUNTER_CACHE_SERVER_HTTPHEADER "${httpheaders}" PARENT_SCOPE) + set(HUNTER_CACHE_SERVER_SUB_SHA1_SUFFIX "${x_SUB_SHA1_SUFFIX}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_check_toolchain_definition.cmake b/cmake/modules/hunter_check_toolchain_definition.cmake new file mode 100644 index 000000000..5156274a4 --- /dev/null +++ b/cmake/modules/hunter_check_toolchain_definition.cmake @@ -0,0 +1,82 @@ +# Copyright (c) 2016 NeroBurner +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_not_empty_string) + +function(hunter_check_toolchain_definition) + set(function_name "hunter_check_toolchain_definition") + set(function_synopsis "${function_name}(NAME definition [DEFINED out_is_defined] [VALUE out_value])") + + # parse arguments + set(one_value_args NAME DEFINED VALUE) + cmake_parse_arguments(hunter_ct_arg "" "${one_value_args}" "" ${ARGV}) + + string(COMPARE NOTEQUAL "${hunter_ct_arg_NAME}" "" arg_NAME) + string(COMPARE NOTEQUAL "${hunter_ct_arg_DEFINED}" "" arg_DEFINED) + string(COMPARE NOTEQUAL "${hunter_ct_arg_VALUE}" "" arg_VALUE) + # No free arguments allowed + list(LENGTH hunter_ct_arg_UNPARSED_ARGUMENTS hunter_ct_len) + if(NOT hunter_ct_len EQUAL 0) + hunter_internal_error( + "'${function_name}' incorrect usage," + " expected no free arguments '${hunter_ct_arg_UNPARSED_ARGUMENTS}'." + " Synopsis: ${function_synopsis}" + ) + endif() + # option NAME is mandatory + if(NOT arg_NAME) + hunter_internal_error( + "'${function_name}' incorrect usage," + " option 'NAME' with one argument is mandatory." + " Synopsis: ${function_synopsis}" + ) + endif() + string(FIND "${hunter_ct_arg_NAME}" " " arg_NAME_whitespace_position) + if(NOT arg_NAME_whitespace_position EQUAL -1) + hunter_internal_error( + "'${function_name}' incorrect usage," + " definition '${hunter_ct_arg_NAME}' with whitespaces not allowed." + ) + endif() + set(definition "${hunter_ct_arg_NAME}") + + # the toolchain path must be set + hunter_assert_not_empty_string("${HUNTER_TOOLCHAIN_ID_PATH}") + set(TOOLCHAIN_INFO_FILE "${HUNTER_TOOLCHAIN_ID_PATH}/toolchain.info") + + # read toolchain.info file into memory, each line a entry in a list + file(STRINGS "${TOOLCHAIN_INFO_FILE}" toolchain_contents) + + # clean ouptut variables + set(is_defined NO) + set(defined_value) + + foreach(line ${toolchain_contents}) + # find the specified define + string(REGEX MATCH "^#define ${definition} .*$" match "${line}") + if(match) + # check for double definition + if(is_defined) + hunter_internal_error( + "'${function_name}' incorrect toolchain.info file," + " double definition of define '${definition}'" + " in file '${TOOLCHAIN_INFO_FILE}'." + ) + endif() + # definition found + set(is_defined YES) + # extract the definition + string(REGEX REPLACE "^#define ${definition} " "" defined_value "${match}") + endif() + endforeach() + + # set output_var to found definition + if(arg_DEFINED) + set(${hunter_ct_arg_DEFINED} ${is_defined} PARENT_SCOPE) + endif() + if(arg_VALUE) + set(${hunter_ct_arg_VALUE} ${defined_value} PARENT_SCOPE) + endif() +endfunction() diff --git a/cmake/modules/hunter_default_version.cmake b/cmake/modules/hunter_default_version.cmake new file mode 100644 index 000000000..20fae2c6e --- /dev/null +++ b/cmake/modules/hunter_default_version.cmake @@ -0,0 +1,51 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) +include(hunter_fatal_error) +include(hunter_internal_error) + +function(hunter_default_version package) + hunter_assert_not_empty_string("${package}") + + set(optional "") + set(one VERSION) + set(multiple "") + + # Introduce: + # * x_VERSION + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGN}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_VERSION}") + + if(NOT __HUNTER_ALLOW_DEFAULT_VERSION_LOADING) + hunter_fatal_error( + "Unexpected 'hunter_default_version' usage from:" + " ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}" + ERROR_PAGE "error.unexpected.hunter_config" + ) + endif() + + set(last_name "${__HUNTER_LAST_DEFAULT_VERSION_NAME}") + if(NOT last_name STREQUAL "") + if(package STREQUAL last_name) + hunter_internal_error("'${package}' specified twice") + endif() + + if(package STRLESS last_name) + hunter_internal_error( + "Alphabetical order violation:" + " '${package}' should appear before '${last_name}'" + ) + endif() + endif() + + set(__HUNTER_LAST_DEFAULT_VERSION_NAME "${package}" PARENT_SCOPE) + + set("HUNTER_${package}_VERSION" "${x_VERSION}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_download_server_url.cmake b/cmake/modules/hunter_download_server_url.cmake new file mode 100644 index 000000000..050e3913c --- /dev/null +++ b/cmake/modules/hunter_download_server_url.cmake @@ -0,0 +1,135 @@ +# Copyright (c) 2017 NeroBurner +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_status_print) +include(hunter_internal_error) +include(hunter_assert_not_empty_string) + +# used gobal variables +# - HUNTER_DOWNLOAD_SERVER +# - if given, a list of servers to download from + +# update download url to point to HUNTER_DOWNLOAD_SERVER +# - PACKAGE: name of the package to update the url for +# - VERSION: version of the package +# - SHA1: SHA1 of the package to download, only first 7 digits are used as archive-ID +# - URL: original URL for the package +# - OUTPUT: variable to output the updated URL +function(hunter_download_server_url) + set(function_name "hunter_download_server_url") + set(function_synopsis "${function_name}(PACKAGE foo VERSION 0.1.2-p3 SHA1 somelongsha URL http://original_url.example.com OUTPUT variable)") + + # parse arguments + set(one_value_args PACKAGE VERSION SHA1 URL OUTPUT) + cmake_parse_arguments(x "" "${one_value_args}" "" ${ARGV}) + + # No free arguments allowed + list(LENGTH x_UNPARSED_ARGUMENTS x_len) + if(NOT x_len EQUAL "0") + hunter_internal_error( + "'${function_name}' incorrect usage," + " expected no free arguments '${x_UNPARSED_ARGUMENTS}'." + " Synopsis: ${function_synopsis}" + ) + endif() + + # check mandatory arguments + foreach(arg PACKAGE VERSION SHA1 URL OUTPUT) + string(COMPARE EQUAL "${x_${arg}}" "" is_empty) + if(is_empty) + hunter_internal_error( + "'${function_name}' incorrect usage," + " option '${arg}' with one argument is mandatory." + " Synopsis: ${function_synopsis}" + ) + endif() + endforeach() + + # default to the given URL + set(hunter_package_new_url "${x_URL}") + + # check if download server is given + string(COMPARE NOTEQUAL "${HUNTER_DOWNLOAD_SERVER}" "" use_download_server) + if(NOT use_download_server) + # nothing to be done, set variable and exit + set(${x_OUTPUT} ${hunter_package_new_url} PARENT_SCOPE) + return() + endif() + + # update download url to point to HUNTER_DOWNLOAD_SERVER + set(hunter_main_url) # variable for main_url (x_URL if it matches one of the download server) + set(hunter_url_list) # list of URLs to try downloading from + + # extract archive-ID from archive SHA1 + string(SUBSTRING "${x_SHA1}" 0 7 archive_id) + + # get filename from download URL + get_filename_component(package_filename_raw "${x_URL}" NAME) + # replace special characters from filename + string(REGEX REPLACE "[!@#$%^&*?]" "_" package_filename "${package_filename_raw}") + + foreach(list_item ${HUNTER_DOWNLOAD_SERVER}) + # create new URL + set(download_server_url "${list_item}/${x_PACKAGE}/${x_VERSION}/${archive_id}/${package_filename}") + + # check if package URL is in the download server list + string(FIND "${x_URL}" "${list_item}" found) + if(NOT (found EQUAL "-1")) + # if in list use the original URL instead of name mangling + hunter_status_print("DOWNLOAD_SERVER: \"${x_PACKAGE}\": URL \"${x_URL}\" matches list item \"${list_item}\".") + set(hunter_main_url "${x_URL}") + else() + # append URL to list of download URLs + list(APPEND hunter_url_list "${download_server_url}") + endif() + endforeach() + + # check version to determine if external_project_add can handle multiple download URLs + set(multiple_urls_allowed TRUE) + if(CMAKE_VERSION VERSION_LESS "3.7") + set(msg "DOWNLOAD_SERVER: Multiple URLs are not supported,") + set(msg "${msg} only one URL will be used as download server.") + set(msg "${msg} Use CMake 3.7+ for multiple URLs (current version: ${CMAKE_VERSION})") + hunter_status_debug("${msg}") + set(multiple_urls_allowed FALSE) + endif() + + string(COMPARE NOTEQUAL "${hunter_main_url}" "" has_main_url) + if(has_main_url) + if(multiple_urls_allowed) + # highest priority for original URL + set(hunter_package_new_url "${hunter_main_url}" ${hunter_url_list}) + else() + # use only original URL + set(hunter_package_new_url "${hunter_main_url}") + endif() + else() + if(multiple_urls_allowed) + # try all download server one after another + set(hunter_package_new_url ${hunter_url_list}) + else() + # use only first server + list(GET hunter_url_list 0 hunter_package_new_url) + endif() + endif() + + hunter_status_print("DOWNLOAD_SERVER: replacing URL + PACKAGE: \"${x_PACKAGE}\" + VERSION: \"${x_VERSION}\" + SHA1: \"${x_SHA1}\" + old URL: \"${x_URL}\" + new URL: \"${hunter_package_new_url}\"") + + set(download_command "./download_package_for_server.sh") + set(download_command "${download_command} --PACKAGE \"${x_PACKAGE}\"") + set(download_command "${download_command} --VERSION \"${x_VERSION}\" ") + set(download_command "${download_command} --SHA1 \"${x_SHA1}\" ") + set(download_command "${download_command} --URL \"${x_URL}\"") + hunter_status_print("DOWNLOAD_SERVER: download with maintenance-script: + ${download_command}") + + # set output_var to found definition + set(${x_OUTPUT} ${hunter_package_new_url} PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_dump_cmake_flags.cmake b/cmake/modules/hunter_dump_cmake_flags.cmake new file mode 100644 index 000000000..cba81ab1c --- /dev/null +++ b/cmake/modules/hunter_dump_cmake_flags.cmake @@ -0,0 +1,202 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_internal_error) +include(hunter_get_lang_standard_flag) +include(hunter_assert_not_empty_string) + +# Packages to test this function: +# * Boost +# * libxml2 +# * OpenSSL +# * odb-boost +# * ncursesw +function(hunter_dump_cmake_flags) + cmake_parse_arguments(x "SKIP_INCLUDES;SKIP_PIC" "CPPFLAGS" "" "${ARGV}") + # -> x_SKIP_INCLUDES + # -> x_SKIP_PIC + # -> x_CPPFLAGS + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + hunter_internal_error("Unparsed arguments: ${x_UNPARSED_ARGUMENTS}") + endif() + + + if(IOS) + hunter_assert_not_empty_string("${IOS_SDK_VERSION}") + string(COMPARE EQUAL "${IOS_DEPLOYMENT_SDK_VERSION}" "" _no_deployment_sdk_version) + if(_no_deployment_sdk_version) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -miphoneos-version-min=${IOS_SDK_VERSION}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -miphoneos-version-min=${IOS_SDK_VERSION}") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -miphoneos-version-min=${IOS_DEPLOYMENT_SDK_VERSION}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -miphoneos-version-min=${IOS_DEPLOYMENT_SDK_VERSION}") + endif() + + if(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode") + endif() + endif() + + set(cppflags "") + + if(APPLE AND NOT IOS) + if(NOT "${CMAKE_OSX_SYSROOT}" STREQUAL "") + if(NOT EXISTS "${CMAKE_OSX_SYSROOT}") + hunter_internal_error("Not exists: '${CMAKE_OSX_SYSROOT}'") + endif() + # Note: do not use quotes here, see OpenSSL-1.0.2 example + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}") + set(cppflags "-isysroot ${CMAKE_OSX_SYSROOT}") + endif() + + if(NOT "${CMAKE_OSX_DEPLOYMENT_TARGET}" STREQUAL "") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(cppflags "${cppflags} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") + endif() + endif() + + if(ANDROID) + string(COMPARE EQUAL "${CMAKE_SYSROOT_COMPILE}" "" no_sysroot_compile) + if(no_sysroot_compile) + set(android_sysroot "${CMAKE_SYSROOT}") + else() + set(android_sysroot "${CMAKE_SYSROOT_COMPILE}") + + hunter_assert_not_empty_string("${CMAKE_SYSROOT}") + set(CMAKE_EXE_LINKER_FLAGS "--sysroot=${CMAKE_SYSROOT} ${CMAKE_EXE_LINKER_FLAGS}") + endif() + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${android_sysroot}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${android_sysroot}") + set(cppflags "${cppflags} --sysroot=${android_sysroot}") + + if(NOT x_SKIP_INCLUDES) + foreach(x ${CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES}) + set( + CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${CMAKE_INCLUDE_SYSTEM_FLAG_CXX} ${x}" + ) + set( + cppflags + "${cppflags} ${CMAKE_INCLUDE_SYSTEM_FLAG_CXX} ${x}" + ) + endforeach() + + foreach(x ${CMAKE_C_STANDARD_INCLUDE_DIRECTORIES}) + set( + CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} ${CMAKE_INCLUDE_SYSTEM_FLAG_CXX} ${x}" + ) + endforeach() + endif() + + foreach(x ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES}) + if(EXISTS "${x}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${x}") + else() + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -l${x}") + endif() + endforeach() + endif() + + hunter_get_lang_standard_flag(CXX flag) + string(COMPARE NOTEQUAL "${flag}" "" has_flag) + if(has_flag) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") + endif() + + hunter_get_lang_standard_flag(C flag) + string(COMPARE NOTEQUAL "${flag}" "" has_flag) + if(has_flag) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") + endif() + + string(COMPARE NOTEQUAL "${CMAKE_CXX_COMPILER_TARGET}" "" has_value) + string(COMPARE NOTEQUAL "${CMAKE_CXX_COMPILE_OPTIONS_TARGET}" "" has_option) + if(has_value AND has_option) + set( + CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${CMAKE_CXX_COMPILER_TARGET}" + ) + endif() + + string(COMPARE NOTEQUAL "${CMAKE_C_COMPILER_TARGET}" "" has_value) + string(COMPARE NOTEQUAL "${CMAKE_C_COMPILE_OPTIONS_TARGET}" "" has_option) + if(has_value AND has_option) + set( + CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} ${CMAKE_C_COMPILE_OPTIONS_TARGET}${CMAKE_C_COMPILER_TARGET}" + ) + endif() + + string(COMPARE NOTEQUAL "${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}" "" has_value) + string(COMPARE NOTEQUAL "${CMAKE_CXX_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}" "" has_option) + if(has_value AND has_option) + set( + CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}" + ) + endif() + + string(COMPARE NOTEQUAL "${CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN}" "" has_value) + string(COMPARE NOTEQUAL "${CMAKE_C_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}" "" has_option) + if(has_value AND has_option) + set( + CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} ${CMAKE_C_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN}" + ) + endif() + + # PIC { + string(COMPARE NOTEQUAL "${CMAKE_CXX_COMPILE_OPTIONS_PIC}" "" has_pic) + if(CMAKE_POSITION_INDEPENDENT_CODE AND has_pic AND NOT x_SKIP_PIC) + set( + CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_COMPILE_OPTIONS_PIC}" + ) + endif() + + string(COMPARE NOTEQUAL "${CMAKE_C_COMPILE_OPTIONS_PIC}" "" has_pic) + if(CMAKE_POSITION_INDEPENDENT_CODE AND has_pic AND NOT x_SKIP_PIC) + set( + CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_COMPILE_OPTIONS_PIC}" + ) + endif() + # } + + # IPO { + string(COMPARE NOTEQUAL "${CMAKE_CXX_COMPILE_OPTIONS_IPO}" "" has_ipo) + if(CMAKE_INTERPROCEDURAL_OPTIMIZATION AND has_ipo) + foreach(x ${CMAKE_CXX_COMPILE_OPTIONS_IPO}) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${x}") + endforeach() + endif() + + string(COMPARE NOTEQUAL "${CMAKE_C_COMPILE_OPTIONS_IPO}" "" has_ipo) + if(CMAKE_INTERPROCEDURAL_OPTIMIZATION AND has_ipo) + foreach(x ${CMAKE_C_COMPILE_OPTIONS_IPO}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${x}") + endforeach() + endif() + + string(COMPARE NOTEQUAL "${CMAKE_CXX_LINK_OPTIONS_IPO}" "" has_ipo) + if(CMAKE_INTERPROCEDURAL_OPTIMIZATION AND has_ipo) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_CXX_LINK_OPTIONS_IPO}") + endif() + # } + + string(COMPARE EQUAL "${x_CPPFLAGS}" "" is_empty) + if(NOT is_empty) + set("${x_CPPFLAGS}" "${${x_CPPFLAGS}} ${cppflags}" PARENT_SCOPE) + endif() + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" PARENT_SCOPE) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_error_page.cmake b/cmake/modules/hunter_error_page.cmake new file mode 100644 index 000000000..3fbfafaa3 --- /dev/null +++ b/cmake/modules/hunter_error_page.cmake @@ -0,0 +1,13 @@ +# Copyright (c) 2014-2015, Ruslan Baratov +# All rights reserved. + +# Do not move to master - build schemes use this module but they not use master +set(HUNTER_ERROR_PAGE "https://docs.hunter.sh/en/latest/reference/errors") + +function(hunter_error_page error_page) + message("------------------------------ ERROR -----------------------------") + message(" ${HUNTER_ERROR_PAGE}/${error_page}.html") + message("------------------------------------------------------------------") + message("") + message(FATAL_ERROR "") +endfunction() diff --git a/cmake/modules/hunter_final_config.cmake b/cmake/modules/hunter_final_config.cmake new file mode 100644 index 000000000..6e62ab340 --- /dev/null +++ b/cmake/modules/hunter_final_config.cmake @@ -0,0 +1,62 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) + +function(hunter_final_config) + set(optional KEEP_PACKAGE_SOURCES) + set(one PACKAGE SHA1 VERSION URL ) + set(multiple CMAKE_ARGS CONFIGURATION_TYPES) + + # Introduce: + # * x_KEEP_PACKAGE_SOURCES + # * x_PACKAGE + # * x_SHA1 + # * x_VERSION + # * x_URL + # * x_CMAKE_ARGS + # * x_CONFIGURATION_TYPES + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_VERSION}") + + set(package "${x_PACKAGE}") + + set("HUNTER_${package}_VERSION" "${x_VERSION}" PARENT_SCOPE) + + if(NOT "${x_SHA1}" STREQUAL "") + set("__HUNTER_FINAL_SHA1_${package}" "${x_SHA1}" PARENT_SCOPE) + endif() + + if(NOT "${x_CMAKE_ARGS}" STREQUAL "") + set("__HUNTER_FINAL_CMAKE_ARGS_${package}" "${x_CMAKE_ARGS}" PARENT_SCOPE) + endif() + + if(NOT "${x_CONFIGURATION_TYPES}" STREQUAL "") + set( + "__HUNTER_FINAL_CONFIGURATION_TYPES_${package}" + "${x_CONFIGURATION_TYPES}" + PARENT_SCOPE + ) + endif() + + if(NOT "${x_URL}" STREQUAL "") + set("__HUNTER_FINAL_URL_${package}" "${x_URL}" PARENT_SCOPE) + endif() + + if(x_KEEP_PACKAGE_SOURCES) + set("__HUNTER_FINAL_KEEP_PACKAGE_SOURCES_${package}" TRUE PARENT_SCOPE) + endif() + + string(TOUPPER "${package}" package_upper) + set(package_root "${package_upper}_ROOT") + + hunter_unsetvar("${package_root}") + set("${package_root}" "" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_find_helper.cmake b/cmake/modules/hunter_find_helper.cmake new file mode 100644 index 000000000..b6260e8f9 --- /dev/null +++ b/cmake/modules/hunter_find_helper.cmake @@ -0,0 +1,114 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_internal_error) +include(hunter_status_debug) +include(hunter_user_error) + +# Test examples: +# * android +# * android_log +# * egl +# * glapi +# * gles2 +# * gles3 +# * osmesa +function(hunter_find_helper) + set(optional "") + set(one LIBRARY HEADER) + set(multiple "") + + # Introduce: + # * x_LIBRARY + # * x_HEADER + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + hunter_internal_error(FATAL_ERROR "Unparsed arguments: ${x_UNPARSED_ARGUMENTS}") + endif() + + string(COMPARE EQUAL "${x_LIBRARY}" "" is_empty) + if(is_empty) + hunter_internal_error("No LIBRARY") + endif() + + string(COMPARE EQUAL "${x_HEADER}" "" is_empty) + if(is_empty) + hunter_internal_error("No HEADER") + endif() + + string(COMPARE EQUAL "${CMAKE_FIND_PACKAGE_NAME}" "" is_empty) + if(is_empty) + hunter_internal_error("CMAKE_FIND_PACKAGE_NAME is empty") + endif() + + set(package_name "${CMAKE_FIND_PACKAGE_NAME}") + + get_filename_component(parent_name "${CMAKE_PARENT_LIST_FILE}" NAME) + string(COMPARE EQUAL "${parent_name}" "Find${package_name}.cmake" is_equal) + if(NOT is_equal) + hunter_internal_error("Unexpected filename: ${CMAKE_PARENT_LIST_FILE}") + endif() + + set(err_msg "'find_package(${package_name})' should be called") + + if(NOT ${package_name}_FIND_REQUIRED) + hunter_user_error("${err_msg} with REQUIRED") + endif() + + if(${package_name}_FIND_QUIETLY) + hunter_user_error("${err_msg} without QUIET") + endif() + + string(COMPARE EQUAL "${${package_name}_FIND_VERSION}" "" is_empty) + if(NOT is_empty) + hunter_user_error("${err_msg} without version") + endif() + + string(COMPARE EQUAL "${${package_name}_FIND_COMPONENTS}" "" is_empty) + if(NOT is_empty) + hunter_user_error("${err_msg} without components") + endif() + + set(target_name "${package_name}::${package_name}") + if(TARGET "${target_name}") + return() + endif() + + add_library("${target_name}" UNKNOWN IMPORTED) + + unset(_hunter_library CACHE) + unset(_hunter_header CACHE) + + find_library(_hunter_library "${x_LIBRARY}") + find_path(_hunter_header "${x_HEADER}") + + set(wiki "https://github.com/ruslo/hunter/wiki/pkg.${package_name}") + set(details "See ${wiki} for details.") + + if(NOT _hunter_library) + hunter_user_error("Library '${x_LIBRARY}' not found in system. ${details}") + endif() + + if(NOT _hunter_header) + hunter_user_error("Header '${x_HEADER}' not found in system. ${details}") + endif() + + hunter_status_debug("Creating target '${target_name}':") + hunter_status_debug("* library: '${_hunter_library}'") + hunter_status_debug("* header: '${_hunter_header}'") + + set_target_properties( + "${target_name}" + PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGE "CXX" + IMPORTED_LOCATION "${_hunter_library}" + INTERFACE_INCLUDE_DIRECTORIES "${_hunter_header}" + ) + + unset(_hunter_library CACHE) + unset(_hunter_header CACHE) +endfunction() diff --git a/cmake/modules/hunter_find_helper_framework.cmake b/cmake/modules/hunter_find_helper_framework.cmake new file mode 100644 index 000000000..31ebff264 --- /dev/null +++ b/cmake/modules/hunter_find_helper_framework.cmake @@ -0,0 +1,76 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_internal_error) +include(hunter_user_error) + +# Test examples: +# * opengles +function(hunter_find_helper_framework) + set(optional "") + set(one FRAMEWORK) + set(multiple "") + + # Introduce: + # * x_FRAMEWORK + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + hunter_internal_error(FATAL_ERROR "Unparsed arguments: ${x_UNPARSED_ARGUMENTS}") + endif() + + string(COMPARE EQUAL "${x_FRAMEWORK}" "" is_empty) + if(is_empty) + hunter_internal_error("No FRAMEWORK") + endif() + + string(COMPARE EQUAL "${CMAKE_FIND_PACKAGE_NAME}" "" is_empty) + if(is_empty) + hunter_internal_error("CMAKE_FIND_PACKAGE_NAME is empty") + endif() + + set(package_name "${CMAKE_FIND_PACKAGE_NAME}") + + get_filename_component(parent_name "${CMAKE_PARENT_LIST_FILE}" NAME) + string(COMPARE EQUAL "${parent_name}" "Find${package_name}.cmake" is_equal) + if(NOT is_equal) + hunter_internal_error("Unexpected filename: ${CMAKE_PARENT_LIST_FILE}") + endif() + + set(err_msg "'find_package(${package_name})' should be called") + + if(NOT ${package_name}_FIND_REQUIRED) + hunter_user_error("${err_msg} with REQUIRED") + endif() + + if(${package_name}_FIND_QUIETLY) + hunter_user_error("${err_msg} without QUIET") + endif() + + string(COMPARE EQUAL "${${package_name}_FIND_VERSION}" "" is_empty) + if(NOT is_empty) + hunter_user_error("${err_msg} without version") + endif() + + string(COMPARE EQUAL "${${package_name}_FIND_COMPONENTS}" "" is_empty) + if(NOT is_empty) + hunter_user_error("${err_msg} without components") + endif() + + set(target_name "${package_name}::${package_name}") + if(TARGET "${target_name}") + return() + endif() + + add_library("${target_name}" IMPORTED INTERFACE) + + set_target_properties( + "${target_name}" + PROPERTIES + INTERFACE_LINK_LIBRARIES + "-framework ${x_FRAMEWORK}" + ) +endfunction() diff --git a/cmake/modules/hunter_find_licenses.cmake b/cmake/modules/hunter_find_licenses.cmake new file mode 100644 index 000000000..d50e08ac5 --- /dev/null +++ b/cmake/modules/hunter_find_licenses.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_not_empty_string) + +# We must use macro to set variable to parent scope of the caller. +# +# In: +# * HUNTER_PACKAGE_HOME_DIR +# * HUNTER_PACKAGE_LICENSE_SEARCH_DIR +# * HUNTER_PACKAGE_NAME +# * HUNTER_PACKAGE_SCHEME_UNPACK +# * HUNTER_PACKAGE_SHA1 +# Out: +# * ${HUNTER_PACKAGE_NAME}_LICENSES (parent scope) +macro(hunter_find_licenses) + hunter_assert_not_empty_string("${HUNTER_PACKAGE_LICENSE_SEARCH_DIR}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_NAME}") + + file(GLOB _licenses "${HUNTER_PACKAGE_LICENSE_SEARCH_DIR}/*") + + set("${HUNTER_PACKAGE_NAME}_LICENSES" "${_licenses}" PARENT_SCOPE) + + # HACK (to refactor) { + if(HUNTER_PACKAGE_SCHEME_UNPACK) + hunter_assert_not_empty_string("${HUNTER_PACKAGE_HOME_DIR}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_SHA1}") + file( + WRITE + "${HUNTER_PACKAGE_HOME_DIR}/cache.sha1" + "${HUNTER_PACKAGE_SHA1}" + ) + endif() + # } +endmacro() diff --git a/cmake/modules/hunter_generate_qt_5_10_info.cmake b/cmake/modules/hunter_generate_qt_5_10_info.cmake new file mode 100644 index 000000000..9cf165eab --- /dev/null +++ b/cmake/modules/hunter_generate_qt_5_10_info.cmake @@ -0,0 +1,191 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# All rights reserved. + +include(hunter_internal_error) +include(hunter_qt_add_module) +include(hunter_assert_not_empty_string) + +# See cmake/projects/Qt/generate.sh + +# This function will be used in build scheme too so it's better to set +# regular CMake variables like WIN32 or ANDROID explicitly by is_{android,win32} + +function( + hunter_generate_qt_5_10_info + component_name + skip_components_varname + component_depends_on_varname + is_android + is_win32 +) + hunter_assert_not_empty_string("${component_name}") + hunter_assert_not_empty_string("${skip_components_varname}") + hunter_assert_not_empty_string("${component_depends_on_varname}") + + string(COMPARE NOTEQUAL "${ARGN}" "" has_unparsed) + if(has_unparsed) + hunter_internal_error("Unparsed argument: ${ARGN}") + endif() + + set( + all_components + qt3d + qtactiveqt + qtandroidextras + qtbase + qtcanvas3d + qtcharts + qtconnectivity + qtdatavis3d + qtdeclarative + qtdoc + qtdocgallery + qtenginio + qtfeedback + qtgamepad + qtgraphicaleffects + qtimageformats + qtlocation + qtmacextras + qtmultimedia + qtnetworkauth + qtpim + qtpurchasing + qtqa + qtquick1 + qtquickcontrols + qtquickcontrols2 + qtremoteobjects + qtrepotools + qtscript + qtscxml + qtsensors + qtserialbus + qtserialport + qtspeech + qtsvg + qtsystems + qttools + qttranslations + qtvirtualkeyboard + qtwayland + qtwebchannel + qtwebengine + qtwebsockets + qtwebview + qtwinextras + qtx11extras + qtxmlpatterns + ) + + # This is modified copy/paste code from /qt.pro + + if(is_android) + set(ANDROID_EXTRAS qtandroidextras) + else() + set(ANDROID_EXTRAS "") + endif() + + if(is_win32) + set(ACTIVE_QT qtactiveqt) + else() + # Project MESSAGE: ActiveQt is a Windows Desktop-only module. Will just generate a docs target. + set(ACTIVE_QT "") + endif() + + # Order is important. Component of each section should not depends on entry + # from section below. + + # Components are in list but not exists in fact: + # * qtdocgallery + # * qtfeedback + # * qtpim + # * qtsystems + + # Depends on nothing + hunter_qt_add_module(NAME qtbase) + # -- + + # Depends only on qtbase + hunter_qt_add_module(NAME qtandroidextras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtmacextras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtx11extras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtsvg COMPONENTS qtbase) + hunter_qt_add_module(NAME ${ACTIVE_QT} COMPONENTS qtbase) + hunter_qt_add_module(NAME qtimageformats COMPONENTS qtbase) + hunter_qt_add_module(NAME qtserialport COMPONENTS qtbase) + # -- + + # -- + hunter_qt_add_module(NAME qtxmlpatterns COMPONENTS qtsvg) + # -- + + # -- + hunter_qt_add_module(NAME qtdeclarative COMPONENTS qtxmlpatterns) + # -- + + # Depends only on qtbase/qtdeclarative + hunter_qt_add_module(NAME qtcanvas3d COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtdoc COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtenginio COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtgraphicaleffects COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtmultimedia COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtsensors COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtwayland COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtwebsockets COMPONENTS qtbase qtdeclarative) + # -- + + # -- + hunter_qt_add_module(NAME qtquickcontrols COMPONENTS qtdeclarative qtgraphicaleffects) + hunter_qt_add_module(NAME qtwinextras COMPONENTS qtbase qtdeclarative qtmultimedia) + hunter_qt_add_module(NAME qtconnectivity COMPONENTS qtbase ${ANDROID_EXTRAS} qtdeclarative) + hunter_qt_add_module(NAME qtwebchannel COMPONENTS qtbase qtdeclarative qtwebsockets) + hunter_qt_add_module(NAME qt3d COMPONENTS qtdeclarative qtimageformats) + # -- + + # -- + hunter_qt_add_module(NAME qtlocation COMPONENTS qtbase qtdeclarative qtquickcontrols) + hunter_qt_add_module(NAME qtquickcontrols2 COMPONENTS qtquickcontrols) + # -- + + # -- + hunter_qt_add_module(NAME qttools COMPONENTS qtbase qtdeclarative ${ACTIVE_QT}) + hunter_qt_add_module(NAME qtwebengine COMPONENTS qtquickcontrols qtwebchannel qtlocation) + # -- + + # -- + hunter_qt_add_module(NAME qtwebview COMPONENTS qtdeclarative qtwebengine) + hunter_qt_add_module(NAME qtscript COMPONENTS qtbase qttools) + hunter_qt_add_module(NAME qttranslations COMPONENTS qttools) + # -- + + string(COMPARE EQUAL "${component_name}" "qtbase" is_qtbase) + string(COMPARE EQUAL "${component_${component_name}_depends_on}" "" depends_on_nothing) + if(is_qtbase) + if(NOT depends_on_nothing) + hunter_internal_error("qtbase should not depends on anything") + endif() + else() + if(depends_on_nothing) + hunter_internal_error( + "component `${component_name}` should have at least one dependency:" + " qtbase" + ) + endif() + endif() + + set( + "${component_depends_on_varname}" + "${component_${component_name}_depends_on}" + PARENT_SCOPE + ) + + set(skip_list ${all_components}) + list( + REMOVE_ITEM + skip_list + "${component_name}" + ${component_${component_name}_depends_on} + ) + set("${skip_components_varname}" "${skip_list}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_generate_qt_5_11_info.cmake b/cmake/modules/hunter_generate_qt_5_11_info.cmake new file mode 100644 index 000000000..cc84ed666 --- /dev/null +++ b/cmake/modules/hunter_generate_qt_5_11_info.cmake @@ -0,0 +1,190 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# All rights reserved. + +include(hunter_internal_error) +include(hunter_qt_add_module) +include(hunter_assert_not_empty_string) + +# See cmake/projects/Qt/generate.sh + +# This function will be used in build scheme too so it's better to set +# regular CMake variables like WIN32 or ANDROID explicitly by is_{android,win32} + +function( + hunter_generate_qt_5_11_info + component_name + skip_components_varname + component_depends_on_varname + is_android + is_win32 +) + hunter_assert_not_empty_string("${component_name}") + hunter_assert_not_empty_string("${skip_components_varname}") + hunter_assert_not_empty_string("${component_depends_on_varname}") + + string(COMPARE NOTEQUAL "${ARGN}" "" has_unparsed) + if(has_unparsed) + hunter_internal_error("Unparsed argument: ${ARGN}") + endif() + + set( + all_components + qt3d + qtactiveqt + qtandroidextras + qtbase + qtcanvas3d + qtcharts + qtconnectivity + qtdatavis3d + qtdeclarative + qtdoc + qtdocgallery + qtenginio + qtfeedback + qtgamepad + qtgraphicaleffects + qtimageformats + qtlocation + qtmacextras + qtmultimedia + qtnetworkauth + qtpim + qtpurchasing + qtqa + qtquickcontrols + qtquickcontrols2 + qtremoteobjects + qtrepotools + qtscript + qtscxml + qtsensors + qtserialbus + qtserialport + qtspeech + qtsvg + qtsystems + qttools + qttranslations + qtvirtualkeyboard + qtwayland + qtwebchannel + qtwebengine + qtwebsockets + qtwebview + qtwinextras + qtx11extras + qtxmlpatterns + ) + + # This is modified copy/paste code from /qt.pro + + if(is_android) + set(ANDROID_EXTRAS qtandroidextras) + else() + set(ANDROID_EXTRAS "") + endif() + + if(is_win32) + set(ACTIVE_QT qtactiveqt) + else() + # Project MESSAGE: ActiveQt is a Windows Desktop-only module. Will just generate a docs target. + set(ACTIVE_QT "") + endif() + + # Order is important. Component of each section should not depends on entry + # from section below. + + # Components are in list but not exists in fact: + # * qtdocgallery + # * qtfeedback + # * qtpim + # * qtsystems + + # Depends on nothing + hunter_qt_add_module(NAME qtbase) + # -- + + # Depends only on qtbase + hunter_qt_add_module(NAME qtandroidextras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtmacextras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtx11extras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtsvg COMPONENTS qtbase) + hunter_qt_add_module(NAME ${ACTIVE_QT} COMPONENTS qtbase) + hunter_qt_add_module(NAME qtimageformats COMPONENTS qtbase) + hunter_qt_add_module(NAME qtserialport COMPONENTS qtbase) + # -- + + # -- + hunter_qt_add_module(NAME qtxmlpatterns COMPONENTS qtsvg) + # -- + + # -- + hunter_qt_add_module(NAME qtdeclarative COMPONENTS qtxmlpatterns) + # -- + + # Depends only on qtbase/qtdeclarative + hunter_qt_add_module(NAME qtcanvas3d COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtdoc COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtenginio COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtgraphicaleffects COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtmultimedia COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtsensors COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtwayland COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtwebsockets COMPONENTS qtbase qtdeclarative) + # -- + + # -- + hunter_qt_add_module(NAME qtquickcontrols COMPONENTS qtdeclarative qtgraphicaleffects) + hunter_qt_add_module(NAME qtwinextras COMPONENTS qtbase qtdeclarative qtmultimedia) + hunter_qt_add_module(NAME qtconnectivity COMPONENTS qtbase ${ANDROID_EXTRAS} qtdeclarative) + hunter_qt_add_module(NAME qtwebchannel COMPONENTS qtbase qtdeclarative qtwebsockets) + hunter_qt_add_module(NAME qt3d COMPONENTS qtdeclarative qtimageformats) + # -- + + # -- + hunter_qt_add_module(NAME qtlocation COMPONENTS qtbase qtdeclarative qtquickcontrols) + hunter_qt_add_module(NAME qtquickcontrols2 COMPONENTS qtquickcontrols) + # -- + + # -- + hunter_qt_add_module(NAME qttools COMPONENTS qtbase qtdeclarative ${ACTIVE_QT}) + hunter_qt_add_module(NAME qtwebengine COMPONENTS qtquickcontrols qtwebchannel qtlocation) + # -- + + # -- + hunter_qt_add_module(NAME qtwebview COMPONENTS qtdeclarative qtwebengine) + hunter_qt_add_module(NAME qtscript COMPONENTS qtbase qttools) + hunter_qt_add_module(NAME qttranslations COMPONENTS qttools) + # -- + + string(COMPARE EQUAL "${component_name}" "qtbase" is_qtbase) + string(COMPARE EQUAL "${component_${component_name}_depends_on}" "" depends_on_nothing) + if(is_qtbase) + if(NOT depends_on_nothing) + hunter_internal_error("qtbase should not depends on anything") + endif() + else() + if(depends_on_nothing) + hunter_internal_error( + "component `${component_name}` should have at least one dependency:" + " qtbase" + ) + endif() + endif() + + set( + "${component_depends_on_varname}" + "${component_${component_name}_depends_on}" + PARENT_SCOPE + ) + + set(skip_list ${all_components}) + list( + REMOVE_ITEM + skip_list + "${component_name}" + ${component_${component_name}_depends_on} + ) + set("${skip_components_varname}" "${skip_list}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_generate_qt_5_12_info.cmake b/cmake/modules/hunter_generate_qt_5_12_info.cmake new file mode 100644 index 000000000..17fa04d99 --- /dev/null +++ b/cmake/modules/hunter_generate_qt_5_12_info.cmake @@ -0,0 +1,186 @@ +# Copyright (c) 2015-2019, Ruslan Baratov +# All rights reserved. + +include(hunter_internal_error) +include(hunter_qt_add_module) +include(hunter_assert_not_empty_string) + +# See cmake/projects/Qt/generate.sh + +# This function will be used in build scheme too so it's better to set +# regular CMake variables like WIN32 or ANDROID explicitly by is_{android,win32} + +function( + hunter_generate_qt_5_12_info + component_name + skip_components_varname + component_depends_on_varname + is_android + is_win32 +) + hunter_assert_not_empty_string("${component_name}") + hunter_assert_not_empty_string("${skip_components_varname}") + hunter_assert_not_empty_string("${component_depends_on_varname}") + + string(COMPARE NOTEQUAL "${ARGN}" "" has_unparsed) + if(has_unparsed) + hunter_internal_error("Unparsed argument: ${ARGN}") + endif() + + set( + all_components + qt3d + qtactiveqt + qtandroidextras + qtbase + qtcanvas3d + qtcharts + qtconnectivity + qtdatavis3d + qtdeclarative + qtdoc + qtgamepad + qtgraphicaleffects + qtimageformats + qtlocation + qtmacextras + qtmultimedia + qtnetworkauth + qtpurchasing + qtqa + qtquickcontrols + qtquickcontrols2 + qtremoteobjects + qtrepotools + qtscript + qtscxml + qtsensors + qtserialbus + qtserialport + qtspeech + qtsvg + qttools + qttranslations + qtvirtualkeyboard + qtwayland + qtwebchannel + qtwebengine + qtwebglplugin + qtwebsockets + qtwebview + qtwinextras + qtx11extras + qtxmlpatterns + ) + + # This is modified copy/paste code from /qt.pro + + if(is_android) + set(ANDROID_EXTRAS qtandroidextras) + else() + set(ANDROID_EXTRAS "") + endif() + + if(is_win32) + set(ACTIVE_QT qtactiveqt) + else() + # Project MESSAGE: ActiveQt is a Windows Desktop-only module. Will just generate a docs target. + set(ACTIVE_QT "") + endif() + + # Order is important. Component of each section should not depends on entry + # from section below. + + # Components are in list but not exists in fact: + # * qtdocgallery + # * qtfeedback + # * qtpim + # * qtsystems + + # Depends on nothing + hunter_qt_add_module(NAME qtbase) + # -- + + # Depends only on qtbase + hunter_qt_add_module(NAME qtandroidextras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtmacextras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtx11extras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtsvg COMPONENTS qtbase) + hunter_qt_add_module(NAME ${ACTIVE_QT} COMPONENTS qtbase) + hunter_qt_add_module(NAME qtimageformats COMPONENTS qtbase) + hunter_qt_add_module(NAME qtserialport COMPONENTS qtbase) + # -- + + # -- + hunter_qt_add_module(NAME qtxmlpatterns COMPONENTS qtsvg) + # -- + + # -- + hunter_qt_add_module(NAME qtdeclarative COMPONENTS qtxmlpatterns) + # -- + + # Depends only on qtbase/qtdeclarative + hunter_qt_add_module(NAME qtcanvas3d COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtdoc COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtgraphicaleffects COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtmultimedia COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtsensors COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtwayland COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtwebsockets COMPONENTS qtbase qtdeclarative) + # -- + + # -- + hunter_qt_add_module(NAME qtquickcontrols COMPONENTS qtdeclarative qtgraphicaleffects) + hunter_qt_add_module(NAME qtwinextras COMPONENTS qtbase qtdeclarative qtmultimedia) + hunter_qt_add_module(NAME qtconnectivity COMPONENTS qtbase ${ANDROID_EXTRAS} qtdeclarative) + hunter_qt_add_module(NAME qtwebchannel COMPONENTS qtbase qtdeclarative qtwebsockets) + hunter_qt_add_module(NAME qt3d COMPONENTS qtdeclarative qtimageformats) + hunter_qt_add_module(NAME qtwebglplugin COMPONENTS qtbase qtdeclarative qtwebsockets) + # -- + + # -- + hunter_qt_add_module(NAME qtlocation COMPONENTS qtbase qtdeclarative qtquickcontrols) + hunter_qt_add_module(NAME qtquickcontrols2 COMPONENTS qtquickcontrols) + # -- + + # -- + hunter_qt_add_module(NAME qttools COMPONENTS qtbase qtdeclarative ${ACTIVE_QT}) + hunter_qt_add_module(NAME qtwebengine COMPONENTS qtquickcontrols qtwebchannel qtlocation) + # -- + + # -- + hunter_qt_add_module(NAME qtwebview COMPONENTS qtdeclarative qtwebengine) + hunter_qt_add_module(NAME qtscript COMPONENTS qtbase qttools) + hunter_qt_add_module(NAME qttranslations COMPONENTS qttools) + # -- + + string(COMPARE EQUAL "${component_name}" "qtbase" is_qtbase) + string(COMPARE EQUAL "${component_${component_name}_depends_on}" "" depends_on_nothing) + if(is_qtbase) + if(NOT depends_on_nothing) + hunter_internal_error("qtbase should not depends on anything") + endif() + else() + if(depends_on_nothing) + hunter_internal_error( + "component `${component_name}` should have at least one dependency:" + " qtbase" + ) + endif() + endif() + + set( + "${component_depends_on_varname}" + "${component_${component_name}_depends_on}" + PARENT_SCOPE + ) + + set(skip_list ${all_components}) + list( + REMOVE_ITEM + skip_list + "${component_name}" + ${component_${component_name}_depends_on} + ) + set("${skip_components_varname}" "${skip_list}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_generate_qt_5_9_info.cmake b/cmake/modules/hunter_generate_qt_5_9_info.cmake new file mode 100644 index 000000000..7f36a8b00 --- /dev/null +++ b/cmake/modules/hunter_generate_qt_5_9_info.cmake @@ -0,0 +1,190 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +include(hunter_internal_error) +include(hunter_qt_add_module) +include(hunter_assert_not_empty_string) + +# See cmake/projects/Qt/generate.sh + +# This function will be used in build scheme too so it's better to set +# regular CMake variables like WIN32 or ANDROID explicitly by is_{android,win32} + +function( + hunter_generate_qt_5_9_info + component_name + skip_components_varname + component_depends_on_varname + is_android + is_win32 +) + hunter_assert_not_empty_string("${component_name}") + hunter_assert_not_empty_string("${skip_components_varname}") + hunter_assert_not_empty_string("${component_depends_on_varname}") + + string(COMPARE NOTEQUAL "${ARGN}" "" has_unparsed) + if(has_unparsed) + hunter_internal_error("Unparsed argument: ${ARGN}") + endif() + + set( + all_components + qt3d + qtactiveqt + qtandroidextras + qtbase + qtcanvas3d + qtcharts + qtconnectivity + qtdatavis3d + qtdeclarative + qtdoc + qtdocgallery + qtenginio + qtfeedback + qtgamepad + qtgraphicaleffects + qtimageformats + qtlocation + qtmacextras + qtmultimedia + qtnetworkauth + qtpim + qtpurchasing + qtqa + qtquick1 + qtquickcontrols + qtquickcontrols2 + qtremoteobjects + qtrepotools + qtscript + qtscxml + qtsensors + qtserialbus + qtserialport + qtspeech + qtsvg + qtsystems + qttools + qttranslations + qtvirtualkeyboard + qtwayland + qtwebchannel + qtwebengine + qtwebkit + qtwebkit-examples + qtwebsockets + qtwebview + qtwinextras + qtx11extras + qtxmlpatterns + ) + + # This is modified copy/paste code from /qt.pro + + if(is_android) + set(ANDROID_EXTRAS qtandroidextras) + else() + set(ANDROID_EXTRAS "") + endif() + + if(is_win32) + set(ACTIVE_QT qtactiveqt) + else() + # Project MESSAGE: ActiveQt is a Windows Desktop-only module. Will just generate a docs target. + set(ACTIVE_QT "") + endif() + + # Order is important. Component of each section should not depends on entry + # from section below. + + # Components are in list but not exists in fact: + # * qtdocgallery + # * qtfeedback + # * qtpim + # * qtsystems + + # Depends on nothing + hunter_qt_add_module(NAME qtbase) + # -- + + # Depends only on qtbase + hunter_qt_add_module(NAME qtandroidextras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtmacextras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtx11extras COMPONENTS qtbase) + hunter_qt_add_module(NAME qtsvg COMPONENTS qtbase) + hunter_qt_add_module(NAME qtxmlpatterns COMPONENTS qtbase) + hunter_qt_add_module(NAME ${ACTIVE_QT} COMPONENTS qtbase) + hunter_qt_add_module(NAME qtimageformats COMPONENTS qtbase) + hunter_qt_add_module(NAME qtserialport COMPONENTS qtbase) + # -- + + # -- + hunter_qt_add_module(NAME qtdeclarative COMPONENTS qtbase qtsvg qtxmlpatterns) + # -- + + # Depends only on qtbase/qtdeclarative + hunter_qt_add_module(NAME qtcanvas3d COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtdoc COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtenginio COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtgraphicaleffects COMPONENTS qtdeclarative) + hunter_qt_add_module(NAME qtmultimedia COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtsensors COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtwayland COMPONENTS qtbase qtdeclarative) + hunter_qt_add_module(NAME qtwebsockets COMPONENTS qtbase qtdeclarative) + # -- + + # -- + hunter_qt_add_module(NAME qtquickcontrols COMPONENTS qtdeclarative qtgraphicaleffects) + hunter_qt_add_module(NAME qtwinextras COMPONENTS qtbase qtdeclarative qtmultimedia) + hunter_qt_add_module(NAME qtconnectivity COMPONENTS qtbase ${ANDROID_EXTRAS} qtdeclarative) + hunter_qt_add_module(NAME qtwebchannel COMPONENTS qtbase qtdeclarative qtwebsockets) + hunter_qt_add_module(NAME qt3d COMPONENTS qtdeclarative qtimageformats) + # -- + + # -- + hunter_qt_add_module(NAME qtlocation COMPONENTS qtbase qtdeclarative qtquickcontrols) + hunter_qt_add_module(NAME qtquickcontrols2 COMPONENTS qtquickcontrols) + # -- + + # -- + hunter_qt_add_module(NAME qttools COMPONENTS qtbase qtdeclarative ${ACTIVE_QT}) + hunter_qt_add_module(NAME qtwebengine COMPONENTS qtquickcontrols qtwebchannel qtlocation) + # -- + + # -- + hunter_qt_add_module(NAME qtwebview COMPONENTS qtdeclarative qtwebengine) + hunter_qt_add_module(NAME qtscript COMPONENTS qtbase qttools) + hunter_qt_add_module(NAME qttranslations COMPONENTS qttools) + # -- + + string(COMPARE EQUAL "${component_name}" "qtbase" is_qtbase) + string(COMPARE EQUAL "${component_${component_name}_depends_on}" "" depends_on_nothing) + if(is_qtbase) + if(NOT depends_on_nothing) + hunter_internal_error("qtbase should not depends on anything") + endif() + else() + if(depends_on_nothing) + hunter_internal_error( + "component `${component_name}` should have at least one dependency:" + " qtbase" + ) + endif() + endif() + + set( + "${component_depends_on_varname}" + "${component_${component_name}_depends_on}" + PARENT_SCOPE + ) + + set(skip_list ${all_components}) + list( + REMOVE_ITEM + skip_list + "${component_name}" + ${component_${component_name}_depends_on} + ) + set("${skip_components_varname}" "${skip_list}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_boost_libs.cmake b/cmake/modules/hunter_get_boost_libs.cmake new file mode 100644 index 000000000..716583e4a --- /dev/null +++ b/cmake/modules/hunter_get_boost_libs.cmake @@ -0,0 +1,90 @@ +# Copyright (c) 2017 NeroBurner +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_not_empty_string) +include(hunter_append_component) + +function(hunter_get_boost_libs) + set(function_name "hunter_get_boost_libs") + set(function_synopsis "${function_name}(VERSION requested_boost_version LIBS found_libs)") + + # parse arguments + set(one_value_args VERSION LIBS) + cmake_parse_arguments(x "" "${one_value_args}" "" ${ARGV}) + + # No free arguments allowed + list(LENGTH x_UNPARSED_ARGUMENTS x_len) + if(NOT x_len EQUAL 0) + hunter_internal_error( + "'${function_name}' incorrect usage," + " expected no free arguments '${x_UNPARSED_ARGUMENTS}'." + " Synopsis: ${function_synopsis}" + ) + endif() + + # check mandatory arguments + foreach(arg VERSION LIBS) + string(COMPARE EQUAL "${x_${arg}}" "" is_empty) + if(is_empty) + hunter_internal_error( + "'${function_name}' incorrect usage," + " option '${arg}' with one argument is mandatory." + " Synopsis: ${function_synopsis}" + ) + endif() + + string(FIND "${x_${arg}}" " " arg_whitespace_position) + if(NOT arg_whitespace_position EQUAL -1) + hunter_internal_error( + "'${function_name}' incorrect usage," + " argument '${arg}' with whitespaces not allowed." + " offending value '${x_${arg}}'" + ) + endif() + endforeach() + + # list of all boost components valid for given version + set(boost_libs) + # common arguments for hunter_append_component + set(common_args LIST boost_libs VERSION ${x_VERSION}) + + # DOCUMENTATION_START { + hunter_append_component(${common_args} COMPONENT atomic SINCE 1.53.0) + hunter_append_component(${common_args} COMPONENT chrono SINCE 1.47.0) + hunter_append_component(${common_args} COMPONENT container SINCE 1.56.0) + hunter_append_component(${common_args} COMPONENT context SINCE 1.51.0) + hunter_append_component(${common_args} COMPONENT contract SINCE 1.67.0) + hunter_append_component(${common_args} COMPONENT coroutine SINCE 1.53.0) + hunter_append_component(${common_args} COMPONENT coroutine2 SINCE 1.60.0 UNTIL 1.65.0) + hunter_append_component(${common_args} COMPONENT date_time SINCE 1.29.0) + hunter_append_component(${common_args} COMPONENT exception SINCE 1.36.0) + hunter_append_component(${common_args} COMPONENT fiber SINCE 1.62.0) + hunter_append_component(${common_args} COMPONENT filesystem SINCE 1.30.0) + hunter_append_component(${common_args} COMPONENT graph SINCE 1.18.0) + hunter_append_component(${common_args} COMPONENT graph_parallel SINCE 1.18.0) + hunter_append_component(${common_args} COMPONENT iostreams SINCE 1.33.0) + hunter_append_component(${common_args} COMPONENT locale SINCE 1.48.0) + hunter_append_component(${common_args} COMPONENT log SINCE 1.54.0) + hunter_append_component(${common_args} COMPONENT math SINCE 1.23.0) + hunter_append_component(${common_args} COMPONENT metaparse SINCE 1.61.0 UNTIL 1.66.0) + hunter_append_component(${common_args} COMPONENT mpi SINCE 1.35.0) + hunter_append_component(${common_args} COMPONENT program_options SINCE 1.32.0) + hunter_append_component(${common_args} COMPONENT python SINCE 1.19.0) + hunter_append_component(${common_args} COMPONENT random SINCE 1.15.0) + hunter_append_component(${common_args} COMPONENT regex SINCE 1.18.0) + hunter_append_component(${common_args} COMPONENT serialization SINCE 1.32.0) + hunter_append_component(${common_args} COMPONENT signals SINCE 1.29.0 UNTIL 1.69.0) + hunter_append_component(${common_args} COMPONENT stacktrace SINCE 1.65.0) + hunter_append_component(${common_args} COMPONENT system SINCE 1.35.0) + hunter_append_component(${common_args} COMPONENT test SINCE 1.21.0) + hunter_append_component(${common_args} COMPONENT thread SINCE 1.25.0) + hunter_append_component(${common_args} COMPONENT timer SINCE 1.9.0) + hunter_append_component(${common_args} COMPONENT type_erasure SINCE 1.60.0) + hunter_append_component(${common_args} COMPONENT wave SINCE 1.33.0) + # DOCUMENTATION_END } + + # set output_var to found definition + set(${x_LIBS} ${boost_libs} PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_build_flags.cmake b/cmake/modules/hunter_get_build_flags.cmake new file mode 100644 index 000000000..b4a3aa212 --- /dev/null +++ b/cmake/modules/hunter_get_build_flags.cmake @@ -0,0 +1,152 @@ +# Copyright (c) 2017 Ruslan Baratov, Alexandre Pretyman +# All rights reserved. +# +# This function dump build flags. +# Only OUT_* paramaters which are passed will be written too (i.e. optional) +# +# Usage example: +# hunter_get_build_flags( +# PACKAGE_CONFIGURATION_TYPES +# "Release" # Mandatory ONE build config type +# INSTALL_DIR +# "${HUNTER_INSTALL_DIR}" # Mandatory of hunter +# OUT_CPPFLAGS +# cppflags # set cppflags with preprocessor flags +# OUT_CFLAGS +# cflags # set cflags with c compilation flags +# OUT_CXXFLAGS +# cxxflags # set cxxflags with c++ compilation flags +# OUT_LDFLAGS +# ldflags # set ldflags with linking flags +# ) + +include(CMakeParseArguments) + +include(hunter_dump_cmake_flags) +include(hunter_fatal_error) +include(hunter_internal_error) +include(hunter_status_debug) + +function(hunter_get_build_flags) + set(optional_params) + set(one_value_params + INSTALL_DIR + OUT_CPPFLAGS + OUT_CFLAGS + OUT_CXXFLAGS + OUT_LDFLAGS + ) + set(multi_value_params + PACKAGE_CONFIGURATION_TYPES + ) + cmake_parse_arguments( + PARAM + "${optional_params}" + "${one_value_params}" + "${multi_value_params}" + ${ARGN} + ) + + if(PARAM_UNPARSED_ARGUMENTS) + hunter_internal_error( + "Invalid arguments passed to hunter_get_build_flags" + " ${PARAM_UNPARSED_ARGUMENTS}" + ) + endif() + + string(COMPARE NOTEQUAL "${PARAM_INSTALL_DIR}" "" has_install_dir) + if (NOT has_install_dir) + hunter_internal_error( + "hunter_get_build_flags expects INSTALL_DIR, it must be provided" + ) + endif() + + list(LENGTH PARAM_PACKAGE_CONFIGURATION_TYPES len) + if(NOT "${len}" EQUAL "1") + hunter_fatal_error( + "hunter_get_build_flags expects PACKAGE_CONFIGURATION_TYPES to have exactly 1 value, but has ${len} with elements: ${PARAM_PACKAGE_CONFIGURATION_TYPES}" + ) + endif() + string(TOUPPER ${PARAM_PACKAGE_CONFIGURATION_TYPES} config_type) + + hunter_status_debug( + "Build flags config ${config_type} on dir ${PARAM_GLOBAL_INSTALLDIR}" + ) + string(COMPARE NOTEQUAL "${PARAM_OUT_CPPFLAGS}" "" has_out_cppflags) + string(COMPARE NOTEQUAL "${PARAM_OUT_CFLAGS}" "" has_out_cflags) + string(COMPARE NOTEQUAL "${PARAM_OUT_CXXFLAGS}" "" has_out_cxxflags) + string(COMPARE NOTEQUAL "${PARAM_OUT_LDFLAGS}" "" has_out_ldflags) + + if(has_out_cppflags) + # CPPFLAGS=${PARAM_CPPFLAGS} [-D${COMPILE_DEFINITIONS}] + # [-I${INCLUDE_DIRECTORIES}] + # + # C Preprocessor flags + + hunter_dump_cmake_flags(CPPFLAGS cppflags) + set(cppflags "${cppflags} -I${PARAM_INSTALL_DIR}/include") + string(STRIP "${cppflags}" cppflags) + # build config type definitions + get_directory_property(defs + COMPILE_DEFINITIONS_${config_type} + ) + foreach(def ${defs}) + set(cppflags "${cppflags} -D${def}") + endforeach() + # non-build config specific definitions + get_directory_property(defs COMPILE_DEFINITIONS) + foreach(def ${defs}) + set(cppflags "${cppflags} -D${def}") + endforeach() + + get_directory_property(include_dirs INCLUDE_DIRECTORIES) + foreach(include_dir ${include_dirs}) + set(cppflags + "${cppflags} ${CMAKE_INCLUDE_SYSTEM_FLAG_CXX} ${include_dir}" + ) + endforeach() + + hunter_status_debug(" CPPFLAGS=${cppflags}") + set(${PARAM_OUT_CPPFLAGS} ${cppflags} PARENT_SCOPE) + endif() + + if(has_out_cflags) + # CFLAGS=${cflags} ${CMAKE_C_FLAGS} + # + # C Compiler Flags (defines or include directories should not be needed here) + set(cflags "${CMAKE_C_FLAGS_${config_type}} ${CMAKE_C_FLAGS}") + string(STRIP "${cflags}" cflags) + hunter_status_debug(" CFLAGS=${cflags}") + set(${PARAM_OUT_CFLAGS} ${cflags} PARENT_SCOPE) + endif() + + if(has_out_cxxflags) + # CXXFLAGS=${cxxflags} ${CMAKE_CXX_FLAGS} + # + # C++ Compiler flags (defines or include directories should not be needed here) + set(cxxflags + "${CMAKE_CXX_FLAGS_${config_type}} ${CMAKE_CXX_FLAGS} ${PARAM_CXXFLAGS}" + ) + string(STRIP "${cxxflags}" cxxflags) + hunter_status_debug(" CXXFLAGS=${cxxflags}") + set(${PARAM_OUT_CXXFLAGS} ${cxxflags} PARENT_SCOPE) + endif() + + if(has_out_ldflags) + # LDFLAGS=${ldflags} + # + # Linker flags + set(ldflags "-L${PARAM_INSTALL_DIR}/lib") + set(ldflags "${ldflags} ${CMAKE_EXE_LINKER_FLAGS_${config_type}}") + string(STRIP "${ldflags}" ldflags) + set(ldflags "${ldflags} ${CMAKE_EXE_LINKER_FLAGS}") + string(STRIP "${ldflags}" ldflags) + string(COMPARE NOTEQUAL "${ANDROID}" "" is_android) + if(is_android) + set(ldflags "${ldflags} ${__libstl}") + endif() + hunter_status_debug(" LDFLAGS=${ldflags}") + set(${PARAM_OUT_LDFLAGS} ${ldflags} PARENT_SCOPE) + endif() +endfunction() + diff --git a/cmake/modules/hunter_get_cacheable.cmake b/cmake/modules/hunter_get_cacheable.cmake new file mode 100644 index 000000000..88c65c2af --- /dev/null +++ b/cmake/modules/hunter_get_cacheable.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_user_error) + +function(hunter_get_cacheable) + set(optional "") + set(one PACKAGE OUT) + set(multiple UNRELOCATABLE) + + # Introduce: + # * x_PACKAGE + # * x_OUT + # * x_UNRELOCATABLE + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_OUT}") + + if(__HUNTER_CACHEABLE_${x_PACKAGE}) + set(cacheable YES) + else() + set(cacheable NO) + + if(NOT "${x_UNRELOCATABLE}" STREQUAL "") + hunter_user_error( + "PACKAGE_UNRELOCATABLE_TEXT_FILES for uncacheable package:" + " please add hunter_cacheable to hunter.cmake" + ) + endif() + endif() + + hunter_status_debug("Package '${x_PACKAGE}' is cacheable: ${cacheable}") + + set("${x_OUT}" "${cacheable}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_cmake_args.cmake b/cmake/modules/hunter_get_cmake_args.cmake new file mode 100644 index 000000000..c42c452df --- /dev/null +++ b/cmake/modules/hunter_get_cmake_args.cmake @@ -0,0 +1,57 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) + +function(hunter_get_cmake_args) + set(optional "") + set(one PACKAGE OUT) + set(multiple "") + + # Introduce: + # * x_PACKAGE + # * x_OUT + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_OUT}") + + set(default_args "${__HUNTER_DEFAULT_CMAKE_ARGS_${x_PACKAGE}}") + set(user_args "${__HUNTER_FINAL_CMAKE_ARGS_${x_PACKAGE}}") + + set(cmake_args "") + + # Lowest priority: CMAKE_ARGS from 'hunter.cmake' + if(NOT default_args STREQUAL "") + hunter_status_debug( + "Package '${x_PACKAGE}' default arguments: '${default_args}'" + ) + list(APPEND cmake_args "${default_args}") + endif() + + # Priority is higher than default CMAKE_ARGS from 'hunter.cmake' but + # lower than user's CMAKE_ARGS from 'config.cmake' + if(NOT "${HUNTER_CACHED_BUILD_SHARED_LIBS}" STREQUAL "") + list( + APPEND + cmake_args + "BUILD_SHARED_LIBS=${HUNTER_CACHED_BUILD_SHARED_LIBS}" + ) + endif() + + # Highest priority: CMAKE_ARGS from user's 'config.cmake' + if(NOT user_args STREQUAL "") + hunter_status_debug( + "Package '${x_PACKAGE}' user arguments: '${user_args}'" + ) + list(APPEND cmake_args "${user_args}") + endif() + + set("${x_OUT}" "${cmake_args}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_configuration_types.cmake b/cmake/modules/hunter_get_configuration_types.cmake new file mode 100644 index 000000000..99b7a73f7 --- /dev/null +++ b/cmake/modules/hunter_get_configuration_types.cmake @@ -0,0 +1,52 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) +include(hunter_internal_error) +include(hunter_status_debug) + +function(hunter_get_configuration_types) + set(optional "") + set(one PACKAGE OUT) + set(multiple "") + + # Introduce: + # * x_PACKAGE + # * x_OUT + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_OUT}") + + if(NOT HUNTER_PACKAGE_SCHEME_INSTALL) + return() + endif() + + set(user_types "${__HUNTER_FINAL_CONFIGURATION_TYPES_${x_PACKAGE}}") + set( + package_default_types + "${__HUNTER_DEFAULT_CONFIGURATION_TYPES_${x_PACKAGE}}" + ) + set(global_default_types "${HUNTER_CACHED_CONFIGURATION_TYPES}") + + if(NOT user_types STREQUAL "") + set(types "${user_types}") + elseif(NOT package_default_types STREQUAL "") + set(types "${package_default_types}") + elseif(NOT global_default_types STREQUAL "") + set(types "${global_default_types}") + else() + hunter_internal_error("No CONFIGURATION_TYPES") + endif() + + hunter_assert_not_empty_string("${types}") + + hunter_status_debug("Package '${x_PACKAGE}' CONFIGURATION_TYPES: ${types}") + + set("${x_OUT}" "${types}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_git_executable.cmake b/cmake/modules/hunter_get_git_executable.cmake new file mode 100644 index 000000000..7302b237e --- /dev/null +++ b/cmake/modules/hunter_get_git_executable.cmake @@ -0,0 +1,50 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) +include(hunter_internal_error) +include(hunter_user_error) + +function(hunter_get_git_executable git_executable_varname) + hunter_assert_not_empty_string("${git_executable_varname}") + hunter_assert_empty_string("${ARGN}") + + if("$ENV{HUNTER_GIT_EXECUTABLE}" STREQUAL "") + find_package(Git REQUIRED) + set(git_executable ${GIT_EXECUTABLE}) + set(git_version ${GIT_VERSION_STRING}) + else() + set(git_executable "$ENV{HUNTER_GIT_EXECUTABLE}") + execute_process( + COMMAND + ${git_executable} --version + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE output + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + if(result EQUAL "0") + if(output MATCHES "^git version [0-9]") + string(REPLACE "git version " "" git_version "${output}") + else() + hunter_internal_error("Unexpected output: ${output}") + endif() + else() + hunter_internal_error("Can't get Git version: ${result} ${output}") + endif() + endif() + + hunter_status_debug("Using git executable: ${git_executable}") + + hunter_assert_not_empty_string("${git_version}") + + # For '--git-path': + # * https://git-scm.com/docs/git-rev-parse/2.5.0 + if(git_version VERSION_LESS "2.5.0") + hunter_user_error("At least Git 2.5.0 required") + endif() + + set("${git_executable_varname}" "${git_executable}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_keep_package_sources.cmake b/cmake/modules/hunter_get_keep_package_sources.cmake new file mode 100644 index 000000000..24baf058e --- /dev/null +++ b/cmake/modules/hunter_get_keep_package_sources.cmake @@ -0,0 +1,46 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) +include(hunter_internal_error) +include(hunter_status_debug) + +function(hunter_get_keep_package_sources) + set(optional "") + set(one PACKAGE OUT) + set(multiple "") + + # Introduce: + # * x_PACKAGE + # * x_OUT + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_OUT}") + + set(user_keep "${__HUNTER_FINAL_KEEP_PACKAGE_SOURCES_${x_PACKAGE}}") + if(user_keep STREQUAL "") + if(HUNTER_KEEP_PACKAGE_SOURCES) + set(keep_sources YES) + else() + set(keep_sources NO) + endif() + else() + if(user_keep STREQUAL "TRUE") + set(keep_sources YES) + else() + hunter_internal_error("Unexpected") + endif() + endif() + + hunter_status_debug( + "Keep sources for package '${x_PACKAGE}': ${keep_sources}" + ) + + set("${x_OUT}" "${keep_sources}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_lang_standard_flag.cmake b/cmake/modules/hunter_get_lang_standard_flag.cmake new file mode 100644 index 000000000..abb0cd9aa --- /dev/null +++ b/cmake/modules/hunter_get_lang_standard_flag.cmake @@ -0,0 +1,69 @@ +# Copyright (c) 2017 Pawel Bylica +# All rights reserved. + +include(hunter_status_debug) + +function(hunter_get_lang_standard_flag LANG OUTPUT) + # https://github.com/Kitware/CMake/blob/9d48d3f61b25400a191f12ea92b8e5496ab47a8f/Source/cmLocalGenerator.cxx#L1766-L1782 + set(CXX_standards 20 17 14 11 98) + set(C_standards 11 99 90) + + # Find the standard flag. + # This maps the logic in the CMake code: + # https://github.com/Kitware/CMake/blob/3bccdd89c88864839a0c8d4ea56bd069c90fa02b/Source/cmLocalGenerator.cxx#L1433-L1467 + + hunter_status_debug("CMAKE_${LANG}_STANDARD_DEFAULT: ${CMAKE_${LANG}_STANDARD_DEFAULT}") + hunter_status_debug("CMAKE_${LANG}_STANDARD: ${CMAKE_${LANG}_STANDARD}") + hunter_status_debug("CMAKE_${LANG}_EXTENSIONS: ${CMAKE_${LANG}_EXTENSIONS}") + hunter_status_debug("CMAKE_${LANG}_STANDARD_REQUIRED: ${CMAKE_${LANG}_STANDARD_REQUIRED}") + + set("${OUTPUT}" "" PARENT_SCOPE) # Reset output in case of quick return. + + string(COMPARE EQUAL "${CMAKE_${LANG}_STANDARD_DEFAULT}" "" no_default) + if(no_default) + # This compiler has no notion of language standard levels. + # https://github.com/Kitware/CMake/blob/3bccdd89c88864839a0c8d4ea56bd069c90fa02b/Source/cmLocalGenerator.cxx#L1427-L1432 + return() + endif() + + set(standard "${CMAKE_${LANG}_STANDARD}") + string(COMPARE EQUAL "${standard}" "" no_standard) + if(no_standard) + # The standard not defined by user. + # https://github.com/Kitware/CMake/blob/3bccdd89c88864839a0c8d4ea56bd069c90fa02b/Source/cmLocalGenerator.cxx#L1433-L1437 + return() + endif() + + # Decide on version with extensions or a clean one. + # By default extensions are assumed On. + # https://github.com/Kitware/CMake/blob/3bccdd89c88864839a0c8d4ea56bd069c90fa02b/Source/cmLocalGenerator.cxx#L1438-L1446 + set(ext "EXTENSION") + if(DEFINED CMAKE_${LANG}_EXTENSIONS AND NOT CMAKE_${LANG}_EXTENSIONS) + set(ext "STANDARD") + endif() + + set(standards "${${LANG}_standards}") + list(FIND standards "${standard}" begin) + if("${begin}" EQUAL "-1") + hunter_internal_error("${LANG} standard ${standard} not known") + return() + endif() + + set(flag "") + list(LENGTH standards end) + math(EXPR end "${end} - 1") + foreach(idx RANGE ${begin} ${end}) + list(GET standards ${idx} standard) + set(option_name "CMAKE_${LANG}${standard}_${ext}_COMPILE_OPTION") + set(flag "${${option_name}}") + hunter_status_debug("${option_name}: '${flag}'") + string(COMPARE NOTEQUAL "${flag}" "" has_flag) + if(has_flag OR CMAKE_${LANG}_STANDARD_REQUIRED) + # Break if flag found or standard is required and we don't want to + # continue checking older standards. + break() + endif() + endforeach() + hunter_status_debug("hunter_get_lang_standard_flag(${LANG}): '${flag}'") + set("${OUTPUT}" "${flag}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_package_sha1.cmake b/cmake/modules/hunter_get_package_sha1.cmake new file mode 100644 index 000000000..58fb3f3cb --- /dev/null +++ b/cmake/modules/hunter_get_package_sha1.cmake @@ -0,0 +1,52 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_user_error) + +function(hunter_get_package_sha1) + set(optional "") + set(one PACKAGE VERSION OUT) + set(multiple AVAILABLE_VERSIONS) + + # Introduce: + # * x_PACKAGE + # * x_VERSION + # * x_AVAILABLE_VERSIONS + # * x_OUT + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_VERSION}") + hunter_assert_not_empty_string("${x_OUT}") + + set(user_sha1 "${__HUNTER_FINAL_SHA1_${x_PACKAGE}}") + set(hunter_sha1 "${HUNTER_${x_PACKAGE}_SHA1}") + + if(NOT user_sha1 STREQUAL "" AND NOT hunter_sha1 STREQUAL "") + hunter_internal_error("Unexpected") + endif() + + if(NOT user_sha1 STREQUAL "") + set("${x_OUT}" "${user_sha1}" PARENT_SCOPE) + elseif(NOT hunter_sha1 STREQUAL "") + set("${x_OUT}" "${hunter_sha1}" PARENT_SCOPE) + else() + if(NOT "${x_AVAILABLE_VERSIONS}" STREQUAL "") + hunter_status_debug("Available versions:") + foreach(version ${x_AVAILABLE_VERSIONS}) + hunter_status_debug("* ${version}") + endforeach() + endif() + + hunter_user_error( + "Version not found: ${x_VERSION}. Please check 'hunter_config' command." + ) + endif() +endfunction() diff --git a/cmake/modules/hunter_get_package_url.cmake b/cmake/modules/hunter_get_package_url.cmake new file mode 100644 index 000000000..df74a7a7f --- /dev/null +++ b/cmake/modules/hunter_get_package_url.cmake @@ -0,0 +1,51 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) +include(hunter_download_server_url) + +function(hunter_get_package_url) + set(optional "") + set(one PACKAGE VERSION SHA1 OUT) + set(multiple "") + + # Introduce: + # * x_PACKAGE + # * x_VERSION + # * x_SHA1 + # * x_OUT + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_VERSION}") + hunter_assert_not_empty_string("${x_SHA1}") + hunter_assert_not_empty_string("${x_OUT}") + + set(user_url "${__HUNTER_FINAL_URL_${x_PACKAGE}}") + if(NOT user_url STREQUAL "") + # URL from user's local 'hunter_config'. It's either local Git archive or + # explicitly specified URL. + set("${x_OUT}" "${user_url}" PARENT_SCOPE) + return() + endif() + + set(hunter_url "${HUNTER_${x_PACKAGE}_URL}") + + hunter_assert_not_empty_string("${hunter_url}") + + # set download URL, either direct download or redirected if HUNTER_DOWNLOAD_SERVER is set + hunter_download_server_url( + PACKAGE "${x_PACKAGE}" + VERSION "${x_VERSION}" + SHA1 "${x_SHA1}" + URL "${hunter_url}" + OUTPUT result_url + ) + + set("${x_OUT}" "${result_url}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_passwords_path.cmake b/cmake/modules/hunter_get_passwords_path.cmake new file mode 100644 index 000000000..c6484401d --- /dev/null +++ b/cmake/modules/hunter_get_passwords_path.cmake @@ -0,0 +1,56 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +include(hunter_status_debug) +include(hunter_user_error) + +function(hunter_get_passwords_path varname) + string(COMPARE EQUAL "${HUNTER_PASSWORDS_PATH}" "" cmake_is_empty) + string(COMPARE EQUAL "$ENV{HUNTER_PASSWORDS_PATH}" "" env_is_empty) + string(COMPARE EQUAL "$ENV{HOME}" "" home_is_empty) + string(COMPARE EQUAL "$ENV{USERPROFILE}" "" userprofile_is_empty) + + if(NOT cmake_is_empty) + hunter_status_debug("Using CMake variable HUNTER_PASSWORDS_PATH") + set(pass_path "${HUNTER_PASSWORDS_PATH}") + if(NOT EXISTS ${pass_path}) + hunter_user_error( + "File not found: '${pass_path}'." + " Check HUNTER_PASSWORDS_PATH CMake variable." + ) + endif() + elseif(NOT env_is_empty) + hunter_status_debug("Using environment variable HUNTER_PASSWORDS_PATH") + set(pass_path "$ENV{HUNTER_PASSWORDS_PATH}") + if(NOT EXISTS ${pass_path}) + hunter_user_error( + "File not found: '${pass_path}'." + " Check HUNTER_PASSWORDS_PATH environment variable." + ) + endif() + elseif(home_is_empty AND CMAKE_HOST_WIN32) + if(userprofile_is_empty) + hunter_user_error( + "USERPROFILE environment variable is empty on Windows host" + ) + endif() + hunter_status_debug("Using environment variable USERPROFILE") + set(pass_path "$ENV{USERPROFILE}/.config/Hunter/passwords.cmake") + if(NOT EXISTS ${pass_path}) + # Ignore USERPROFILE + set(pass_path "") + endif() + else() + if(home_is_empty) + hunter_user_error("HOME environment variable is empty") + endif() + hunter_status_debug("Using environment variable HOME") + set(pass_path "$ENV{HOME}/.config/Hunter/passwords.cmake") + if(NOT EXISTS ${pass_path}) + # Ignore USERPROFILE + set(pass_path "") + endif() + endif() + + set("${varname}" "${pass_path}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_project_files_to_load.cmake b/cmake/modules/hunter_get_project_files_to_load.cmake new file mode 100644 index 000000000..1969251ca --- /dev/null +++ b/cmake/modules/hunter_get_project_files_to_load.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2017 Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_empty_string) +include(hunter_assert_not_empty_string) +include(hunter_internal_error) + +function(hunter_get_project_files_to_load) + hunter_assert_not_empty_string("${HUNTER_SELF}") + + set(optional "") + set(one PROJECT_NAME FILES NEW_INJECTED_PACKAGE) + set(multiple COMPONENTS) + + # Introduce: + # * x_PROJECT_NAME + # * x_FILES + # * x_NEW_INJECTED_PACKAGE + # * x_COMPONENTS + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PROJECT_NAME}") + hunter_assert_not_empty_string("${x_FILES}") + hunter_assert_not_empty_string("${x_NEW_INJECTED_PACKAGE}") + + set(project_dir "${HUNTER_SELF}/cmake/projects/${x_PROJECT_NAME}") + set(hunter_cmake "${project_dir}/hunter.cmake") + + if(NOT EXISTS "${hunter_cmake}") + hunter_status_debug("File not found (injected package): ${hunter_cmake}") + set("${x_NEW_INJECTED_PACKAGE}" "TRUE" PARENT_SCOPE) + return() + endif() + + set("${x_NEW_INJECTED_PACKAGE}" "FALSE" PARENT_SCOPE) + + set(result_list "") + list(APPEND result_list "${hunter_cmake}") + + # Check components + foreach(x ${x_COMPONENTS}) + set(dir "${project_dir}/${x}") + if(NOT EXISTS "${dir}") + hunter_internal_error( + "Component '${x}' not found in project '${x_PROJECT_NAME}'" + ) + endif() + if(NOT IS_DIRECTORY "${dir}") + hunter_internal_error( + "Component '${x}' not found in project '${x_PROJECT_NAME}'" + ) + endif() + set(component_cmake "${dir}/hunter.cmake") + if(NOT EXISTS "${component_cmake}") + hunter_internal_error( + "File not found: ${component_cmake}" + ) + endif() + list(APPEND result_list "${component_cmake}") + endforeach() + + set("${x_FILES}" "${result_list}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_get_toolchain_binaries.cmake b/cmake/modules/hunter_get_toolchain_binaries.cmake new file mode 100644 index 000000000..6f7221a45 --- /dev/null +++ b/cmake/modules/hunter_get_toolchain_binaries.cmake @@ -0,0 +1,168 @@ +include(hunter_internal_error) +include(hunter_pick_archiver) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) + +function(hunter_get_toolchain_binaries) + set(optional_params) + set(one_value_params + OUT_AR + OUT_AS + OUT_LD + OUT_NM + OUT_OBJCOPY + OUT_OBJDUMP + OUT_RANLIB + OUT_STRIP + OUT_CPP + OUT_CC + OUT_CXX + ) + set(multi_value_params) + cmake_parse_arguments( + PARAM + "${optional_params}" + "${one_value_params}" + "${multi_value_params}" + ${ARGN} + ) + + if(PARAM_UNPARSED_ARGUMENTS) + hunter_internal_error( + "Invalid arguments passed to hunter_get_toolchain_binaries" + " ${PARAM_UNPARSED_ARGUMENTS}" + ) + endif() + + + string(COMPARE NOTEQUAL "${ANDROID}" "" is_android) + string(COMPARE NOTEQUAL "${RASPBERRY_PI}" "" is_raspberry_pi) + if(is_android) + hunter_assert_not_empty_string("${CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE}") + hunter_assert_not_empty_string("${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}") + # CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX can be empty + + # Extra Android variables that can't be set in toolchain + # (some variables available only after toolchain processed). + set( + CMAKE_C_PREPROCESSOR + "${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX}cpp${CMAKE_C_ANDROID_TOOLCHAIN_SUFFIX}" + ) + if(NOT EXISTS "${CMAKE_C_PREPROCESSOR}") + # GCC has been removed from NDK r18. + set(CMAKE_C_PREPROCESSOR "") + endif() + endif() + + if(is_android OR is_raspberry_pi) + hunter_assert_not_empty_string("${CMAKE_C_FLAGS}") + hunter_assert_not_empty_string("${CMAKE_CXX_FLAGS}") + hunter_assert_not_empty_string("${CMAKE_AR}") + hunter_assert_not_empty_string("${CMAKE_C_COMPILER}") + hunter_assert_not_empty_string("${CMAKE_CXX_COMPILER}") + hunter_assert_not_empty_string("${CMAKE_LINKER}") + hunter_assert_not_empty_string("${CMAKE_NM}") + hunter_assert_not_empty_string("${CMAKE_OBJCOPY}") + hunter_assert_not_empty_string("${CMAKE_OBJDUMP}") + hunter_assert_not_empty_string("${CMAKE_RANLIB}") + hunter_assert_not_empty_string("${CMAKE_STRIP}") + endif() + + # -> CMAKE_AR + # -> CMAKE_RANLIB + hunter_pick_archiver() + + string(COMPARE NOTEQUAL "${PARAM_OUT_AR}" "" has_out_ar) + string(COMPARE NOTEQUAL "${PARAM_OUT_AS}" "" has_out_as) + string(COMPARE NOTEQUAL "${PARAM_OUT_LD}" "" has_out_ld) + string(COMPARE NOTEQUAL "${PARAM_OUT_NM}" "" has_out_nm) + string(COMPARE NOTEQUAL "${PARAM_OUT_OBJCOPY}" "" has_out_objcopy) + string(COMPARE NOTEQUAL "${PARAM_OUT_OBJDUMP}" "" has_out_objdump) + string(COMPARE NOTEQUAL "${PARAM_OUT_RANLIB}" "" has_out_ranlib) + string(COMPARE NOTEQUAL "${PARAM_OUT_STRIP}" "" has_out_strip) + string(COMPARE NOTEQUAL "${PARAM_OUT_CPP}" "" has_out_cpp) + string(COMPARE NOTEQUAL "${PARAM_OUT_CC}" "" has_out_cc) + string(COMPARE NOTEQUAL "${PARAM_OUT_CXX}" "" has_out_cxx) + + # Sets the toolchain binaries + # AR=${CMAKE_AR} + # AS=${CMAKE_ASM_COMPILER} + # LD=${CMAKE_LINKER} + # NM=${CMAKE_NM} + # OBJCOPY=${CMAKE_OBJCOPY} + # OBJDUMP=${CMAKE_OBJDUMP} + # RANLIB=${CMAKE_RANLIB} + # STRIP=${CMAKE_STRIP} + # CPP=${CMAKE_C_PREPROCESSOR} + # CC=${CMAKE_C_COMPILER} + # CXX=${CMAKE_CXX_COMPILER} + # + hunter_status_debug("Toolchain Binaries:") + if(has_out_ar) + hunter_status_debug(" AR=${CMAKE_AR}") + if(CMAKE_AR) + set(${PARAM_OUT_AR} ${CMAKE_AR} PARENT_SCOPE) + endif() + endif() + if(has_out_as) + hunter_status_debug(" AS=${CMAKE_ASM_COMPILER}") + if(CMAKE_ASM_COMPILER) + set(${PARAM_OUT_AS} ${CMAKE_ASM_COMPILER} PARENT_SCOPE) + endif() + endif() + if(has_out_ld) + hunter_status_debug(" LD=${CMAKE_LINKER}") + if(CMAKE_LINKER) + set(${PARAM_OUT_LD} ${CMAKE_LINKER} PARENT_SCOPE) + endif() + endif() + if(has_out_nm) + hunter_status_debug(" NM=${CMAKE_NM}") + if(CMAKE_NM) + set(${PARAM_OUT_NM} ${CMAKE_NM} PARENT_SCOPE) + endif() + endif() + if(has_out_objcopy) + hunter_status_debug(" OBJCOPY=${CMAKE_OBJCOPY}") + if(CMAKE_OBJCOPY) + set(${PARAM_OUT_OBJCOPY} ${CMAKE_OBJCOPY} PARENT_SCOPE) + endif() + endif() + if(has_out_objdump) + hunter_status_debug(" OBJDUMP=${CMAKE_OBJDUMP}") + if(CMAKE_OBJDUMP) + set(${PARAM_OUT_OBJDUMP} ${CMAKE_OBJDUMP} PARENT_SCOPE) + endif() + endif() + if(has_out_ranlib) + hunter_status_debug(" RANLIB=${CMAKE_RANLIB}") + if(CMAKE_RANLIB) + set(${PARAM_OUT_RANLIB} ${CMAKE_RANLIB} PARENT_SCOPE) + endif() + endif() + if(has_out_strip) + hunter_status_debug(" STRIP=${CMAKE_STRIP}") + if(CMAKE_STRIP) + set(${PARAM_OUT_STRIP} ${CMAKE_STRIP} PARENT_SCOPE) + endif() + endif() + if(has_out_cpp) + hunter_status_debug(" CPP=${CMAKE_C_PREPROCESSOR}") + if(CMAKE_C_PREPROCESSOR) + set(${PARAM_OUT_CPP} ${CMAKE_C_PREPROCESSOR} PARENT_SCOPE) + endif() + endif() + if(has_out_cc) + hunter_status_debug(" CC=${CMAKE_C_COMPILER}") + if(CMAKE_C_COMPILER) + set(${PARAM_OUT_CC} ${CMAKE_C_COMPILER} PARENT_SCOPE) + endif() + endif() + if(has_out_cxx) + hunter_status_debug(" CXX=${CMAKE_CXX_COMPILER}") + if(CMAKE_CXX_COMPILER) + set(${PARAM_OUT_CXX} ${CMAKE_CXX_COMPILER} PARENT_SCOPE) + endif() + endif() +endfunction() + diff --git a/cmake/modules/hunter_http_password.cmake b/cmake/modules/hunter_http_password.cmake new file mode 100644 index 000000000..821a8f401 --- /dev/null +++ b/cmake/modules/hunter_http_password.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_user_error) + +function(hunter_http_password package_name) + set(one USERNAME PASSWORD) + + cmake_parse_arguments(x "" "${one}" "" "${ARGN}") + # -> x_USERNAME + # -> x_PASSWORD + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + hunter_user_error( + "'hunter_user_error' unparsed arguments: ${x_UNPARSED_ARGUMENTS}" + ) + endif() + + string(COMPARE EQUAL "${HUNTER_PACKAGE_NAME}" "${package_name}" hit) + if(hit) + set(HUNTER_PACKAGE_HTTP_USERNAME "${x_USERNAME}" PARENT_SCOPE) + set(HUNTER_PACKAGE_HTTP_PASSWORD "${x_PASSWORD}" PARENT_SCOPE) + endif() +endfunction() diff --git a/cmake/modules/hunter_libxml2_install_tools.cmake b/cmake/modules/hunter_libxml2_install_tools.cmake new file mode 100644 index 000000000..8c393b616 --- /dev/null +++ b/cmake/modules/hunter_libxml2_install_tools.cmake @@ -0,0 +1,41 @@ +include(CMakePackageConfigHelpers) +include(hunter_assert_not_empty_string) + +function(hunter_install_libxml2_config) + + hunter_assert_not_empty_string("${HUNTER_libxml2_VERSION}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_SELF}") + + set(templates "${HUNTER_SELF}/cmake/templates") + set(configs "${HUNTER_PACKAGE_INSTALL_PREFIX}/lib/cmake/libxml2") + file(MAKE_DIRECTORY "${templates}" "${HUNTER_PACKAGE_INSTALL_PREFIX}/lib/cmake" "${configs}") + + write_basic_package_version_file("${configs}/libxml2Config.cmake" VERSION "${HUNTER_libxml2_VERSION}" COMPATIBILITY ExactVersion) + + configure_file( + "${templates}/libxml2Config.cmake.in" + "${configs}/libxml2Config.cmake" + @ONLY + ) + +endfunction() + + +function(hunter_install_libxml2_targets) + + hunter_assert_not_empty_string("${HUNTER_PACKAGE_INSTALL_PREFIX}") + hunter_assert_not_empty_string("${HUNTER_SELF}") + hunter_assert_not_empty_string("${TARGET_CONFIGURATION}") + hunter_assert_not_empty_string("${TARGET_LIB_FILE}") + + set(templates "${HUNTER_SELF}/cmake/templates") + set(configs "${HUNTER_PACKAGE_INSTALL_PREFIX}/lib/cmake/libxml2") + + configure_file( + "${templates}/libxml2Targets.cmake.in" + "${configs}/libxml2Targets-${TARGET_CONFIGURATION}.cmake" + @ONLY + ) + +endfunction() \ No newline at end of file diff --git a/cmake/modules/hunter_pack_git_self.cmake b/cmake/modules/hunter_pack_git_self.cmake new file mode 100644 index 000000000..e7abf0aee --- /dev/null +++ b/cmake/modules/hunter_pack_git_self.cmake @@ -0,0 +1,311 @@ +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_assert_not_empty_string) +include(hunter_get_git_executable) +include(hunter_internal_error) +include(hunter_status_debug) + +function(hunter_pack_git_self) + hunter_assert_not_empty_string("${HUNTER_GATE_LOCATION}") + + set(optional "") + set(one PACKAGE URL_OUT SHA1_OUT) + set(multiple "") + + # Introduce: + # * x_PACKAGE + # * x_URL_OUT + # * x_SHA1_OUT + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_URL_OUT}") + hunter_assert_not_empty_string("${x_SHA1_OUT}") + + hunter_get_git_executable(git_executable) + + set(cmd "${git_executable}" rev-parse --show-toplevel) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + set(top_git_directory "${output}") + + if(NOT EXISTS "${top_git_directory}") + hunter_internal_error("Directory not found: ${top_git_directory}") + endif() + + if(NOT IS_DIRECTORY "${top_git_directory}") + hunter_internal_error("Not a directory: ${top_git_directory}") + endif() + + set(cmd "${git_executable}" status --porcelain) + hunter_status_debug( + "Run command '${cmd}' in '${top_git_directory}' directory" + ) + hunter_status_debug( + "All changes in '${HUNTER_GATE_LOCATION}' directory will be ignored" + ) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${top_git_directory}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + # https://git-scm.com/docs/git-status#_short_format + string(REPLACE "\n" ";" output "${output}") + foreach(status_full_line ${output}) + # status_full_line can be: + # * 'XY PATH' + # * 'XY ORIG_PATH -> PATH' + string(REGEX REPLACE "^.. " "" no_status_line "${status_full_line}") + string(COMPARE EQUAL "${no_status_line}" "${status_full_line}" no_change) + if(no_change) + hunter_internal_error("Unexpected status format: '${status_full_line}'") + endif() + + if(HUNTER_GIT_SELF_IGNORE_UNTRACKED) + string(REGEX MATCH "^\\?\\? " status_only "${status_full_line}") + if(status_only STREQUAL "?? ") + hunter_status_debug("File will be ignored: '${status_full_line}'") + continue() + endif() + endif() + + # no_status_line can be: + # * 'PATH' + # * 'ORIG_PATH -> PATH' + string(REGEX REPLACE " -> " ";" status_files "${no_status_line}") + + # status_files can be: + # * 'PATH' + # * 'ORIG_PATH;PATH' + + # Check that dirty files are part of directory with HunterGate + foreach(status_file ${status_files}) + set(path_to_check "${top_git_directory}/${status_file}") + + string(LENGTH "${path_to_check}" path_to_check_len) + string(LENGTH "${HUNTER_GATE_LOCATION}" hunter_gate_location_len) + + if(hunter_gate_location_len EQUAL path_to_check_len) + # HUNTER_GATE_LOCATION is a directory, path_to_check is a file, + # if they have same size then path_to_check is not in + # HUNTER_GATE_LOCATION directory for sure + hunter_user_error( + "Git directory is dirty: '${path_to_check}'" + "Please commit or stash changes." + ) + endif() + + if(hunter_gate_location_len GREATER path_to_check_len) + hunter_user_error( + "Git directory is dirty: '${path_to_check}'" + "Please commit or stash changes." + ) + endif() + + string( + SUBSTRING + "${path_to_check}" + 0 + ${hunter_gate_location_len} + path_to_check_begin + ) + + math( + EXPR + path_to_check_end_len + "${path_to_check_len} - ${hunter_gate_location_len}" + ) + + string( + SUBSTRING + "${path_to_check}" + ${hunter_gate_location_len} + ${path_to_check_end_len} + path_to_check_end + ) + + string( + COMPARE + EQUAL + "${path_to_check}" + "${path_to_check_begin}${path_to_check_end}" + is_ok + ) + if(NOT is_ok) + hunter_internal_error("Split failed") + endif() + + string( + COMPARE + EQUAL + "${path_to_check_begin}" + "${HUNTER_GATE_LOCATION}" + is_same + ) + + if(NOT is_same) + hunter_user_error( + "Git directory is dirty: '${path_to_check}'" + "Please commit or stash changes." + ) + endif() + + get_filename_component( + full_path_1 + "${HUNTER_GATE_LOCATION}/${path_to_check_end}" + ABSOLUTE + ) + + get_filename_component( + full_path_2 + "${path_to_check}" + ABSOLUTE + ) + + string(COMPARE EQUAL "${full_path_1}" "${full_path_2}" is_same) + if(is_same) + hunter_status_debug("Change ignored: '${path_to_check}'") + else() + hunter_user_error( + "Git directory is dirty: '${path_to_check}'" + "Please commit or stash changes." + ) + endif() + endforeach() + endforeach() + + set(cmd "${git_executable}" rev-parse --git-path HEAD) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${top_git_directory}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + set(head_file "${output}") + if(NOT IS_ABSOLUTE "${head_file}") + set(head_file ${top_git_directory}/${head_file}) + endif() + + if(NOT EXISTS "${head_file}") + hunter_internal_error("File not found: '${head_file}'") + endif() + set_property( + DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${head_file}" + ) + + set(cmd "${git_executable}" rev-parse --symbolic-full-name HEAD) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${top_git_directory}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + set(head_ref "${output}") + set(cmd "${git_executable}" rev-parse --git-path "${head_ref}") + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${top_git_directory}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + set(ref_file "${output}") + if(NOT IS_ABSOLUTE "${ref_file}") + set(ref_file "${top_git_directory}/${ref_file}") + endif() + if(NOT EXISTS "${ref_file}") + hunter_internal_error("File not fond: ${ref_file}") + endif() + + set_property( + DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${ref_file}" + ) + + set( + archives_directory + "${CMAKE_CURRENT_BINARY_DIR}/_3rdParty/Hunter/git-archives" + ) + file(MAKE_DIRECTORY "${archives_directory}") + + set(archive "${archives_directory}/${x_PACKAGE}.tar") + hunter_status_debug("Creating archive '${archive}'") + + set(cmd "${git_executable}" archive HEAD -o "${archive}") + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${top_git_directory}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + file(SHA1 "${archive}" package_sha1) + set(package_url "file://${archive}") + + set("${x_URL_OUT}" "${package_url}" PARENT_SCOPE) + set("${x_SHA1_OUT}" "${package_sha1}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_pack_git_submodule.cmake b/cmake/modules/hunter_pack_git_submodule.cmake new file mode 100644 index 000000000..58049fa4d --- /dev/null +++ b/cmake/modules/hunter_pack_git_submodule.cmake @@ -0,0 +1,220 @@ +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_internal_error) +include(hunter_status_debug) +include(hunter_user_error) + +function(hunter_pack_git_submodule) + set(optional "") + set(one PACKAGE GIT_SUBMODULE SUBMODULE_SOURCE_SUBDIR URL_OUT SHA1_OUT) + set(multiple "") + + # Introduce: + # * x_PACKAGE + # * x_GIT_SUBMODULE + # * x_SUBMODULE_SOURCE_SUBDIR + # * x_URL_OUT + # * x_SHA1_OUT + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + hunter_assert_empty_string("${x_UNPARSED_ARGUMENTS}") + + hunter_assert_not_empty_string("${x_PACKAGE}") + hunter_assert_not_empty_string("${x_GIT_SUBMODULE}") + hunter_assert_not_empty_string("${x_URL_OUT}") + hunter_assert_not_empty_string("${x_SHA1_OUT}") + + hunter_get_git_executable(git_executable) + + set(cmd "${git_executable}" rev-parse --show-toplevel) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + set(top_git_directory "${output}") + + set(cmd "${git_executable}" submodule status "${x_GIT_SUBMODULE}") + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${top_git_directory}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + string(REPLACE ";" " " cmd "${cmd}") + hunter_internal_error( + "Command failed: '${cmd}' (${result}, ${output}, ${error})" + "To reproduce error go to '${top_git_directory}' and" + "run command '${cmd}'" + ) + endif() + + set(submodule_file "${top_git_directory}/.gitmodules") + if(NOT EXISTS "${submodule_file}") + hunter_internal_error("File not found: '${submodule_file}'") + endif() + set_property( + DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${submodule_file}" + ) + + set(submodule_dir "${top_git_directory}/${x_GIT_SUBMODULE}") + if(NOT EXISTS "${submodule_dir}") + hunter_internal_error("Directory not exist: '${submodule_dir}'") + endif() + + set(cmd "${git_executable}" status --porcelain) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${submodule_dir}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + if(NOT "${output}" STREQUAL "") + hunter_user_error( + "Git directory '${submodule_dir}' is dirty." + "Please commit or stash changes." + ) + endif() + + set(cmd "${git_executable}" rev-parse --git-path HEAD) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${submodule_dir}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + set(head_file "${output}") + if(NOT EXISTS "${head_file}") + hunter_internal_error("File not found: '${head_file}'") + endif() + set_property( + DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${head_file}" + ) + + set(cmd "${git_executable}" rev-parse --symbolic-full-name HEAD) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${submodule_dir}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL 0) + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + set(head_ref "${output}") + set(cmd "${git_executable}" rev-parse --git-path "${head_ref}") + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${submodule_dir}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + set(ref_file "${output}") + if(NOT EXISTS "${ref_file}") + hunter_internal_error("File not found: ${ref_file}") + endif() + + set_property( + DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${ref_file}" + ) + + set( + archives_directory + "${CMAKE_CURRENT_BINARY_DIR}/_3rdParty/Hunter/git-archives" + ) + + file(MAKE_DIRECTORY "${archives_directory}") + + set(archive "${archives_directory}/${x_PACKAGE}.tar") + hunter_status_debug("Creating archive '${archive}'") + + # check if whole submodule or just a subfolder is to be archived + if("${x_SUBMODULE_SOURCE_SUBDIR}" STREQUAL "") + hunter_status_debug( + "No SUBMODULE_SOURCE_SUBDIR specified, archive whole submodule" + ) + set(source_flag) + else() + hunter_status_debug( + "SUBMODULE_SOURCE_SUBDIR specified, only archive subfolder:" + " * ${x_SUBMODULE_SOURCE_SUBDIR}" + ) + set(source_flag "/${x_SUBMODULE_SOURCE_SUBDIR}") + endif() + + set(cmd "${git_executable}" archive HEAD -o "${archive}") + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${submodule_dir}${source_flag}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if(NOT result EQUAL "0") + hunter_internal_error( + "Command failed: ${cmd} (${result}, ${output}, ${error})" + ) + endif() + + file(SHA1 "${archive}" package_sha1) + set(package_url "file://${archive}") + + set("${x_URL_OUT}" "${package_url}" PARENT_SCOPE) + set("${x_SHA1_OUT}" "${package_sha1}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_parse_boost_config_macros.cmake b/cmake/modules/hunter_parse_boost_config_macros.cmake new file mode 100644 index 000000000..02c439c4c --- /dev/null +++ b/cmake/modules/hunter_parse_boost_config_macros.cmake @@ -0,0 +1,22 @@ +function(hunter_parse_boost_config_macros outvar) + # parse ARGN to convert 'CONFIG_MACRO=id1;id2;CONFIG_MACRO_id3=3' to 'id1;id2;id3=3' + unset(boost_config_macros_list) + set(config_macros_without_value_mode FALSE) + foreach(arg ${ARGN}) + if ("${arg}" MATCHES "[^=]+=.+") + set(config_macros_without_value_mode FALSE) + endif() + if(config_macros_without_value_mode) + # CONFIG_MACRO=id_1 id_2 ... id_n -> APPEND id_n + list(APPEND boost_config_macros_list "${arg}") + elseif("${arg}" MATCHES "^CONFIG_MACRO=(.+)" ) + # CONFIG_MACRO=id_1 id_2 ... id_n -> APPEND id_1 + list(APPEND boost_config_macros_list "${CMAKE_MATCH_1}") + set(config_macros_without_value_mode TRUE) + elseif("${arg}" MATCHES "^CONFIG_MACRO_([^=]+=.+)" ) + # CONFIG_MACRO_id=val -> APPEND id=val + list(APPEND boost_config_macros_list "${CMAKE_MATCH_1}") + endif() + endforeach() + set(${outvar} ${boost_config_macros_list} PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_parse_cmake_args_for_keyword.cmake b/cmake/modules/hunter_parse_cmake_args_for_keyword.cmake new file mode 100644 index 000000000..f5f800d15 --- /dev/null +++ b/cmake/modules/hunter_parse_cmake_args_for_keyword.cmake @@ -0,0 +1,63 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_internal_error) +include(hunter_status_debug) + +function(hunter_parse_cmake_args_for_keyword) + set(optional "") + set(one KEYWORD OUTPUT) + set(multiple CMAKE_ARGS) + + # Introduce: + # * x_CMAKE_ARGS + # * x_KEYWORD + # * x_OUTPUT + cmake_parse_arguments(x "${optional}" "${one}" "${multiple}" "${ARGV}") + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + hunter_internal_error("Unparsed arguments: ${x_UNPARSED_ARGUMENTS}") + endif() + + string(COMPARE EQUAL "${x_KEYWORD}" "" is_empty) + if(is_empty) + hunter_internal_error("KEYWORD is empty") + endif() + string(COMPARE EQUAL "${x_OUTPUT}" "" is_empty) + if(is_empty) + hunter_internal_error("OUTPUT is empty") + endif() + + # get KEYWORD from CMAKE_ARGS + set(output) + foreach(entry ${x_CMAKE_ARGS}) + string(FIND "${entry}" "=" update_var) + if(update_var EQUAL -1) + # nothing to to + else() + # Format = + # Note that we can have more than one '=' sign, e.g. A=-opt=value1 + string(REGEX REPLACE "=.*" "" var_name "${entry}") + + # 'string(REGEX REPLACE' will replace as much patterns as it found so + # it's not possible to replace only one '=' as we need. + string(LENGTH "${var_name}" var_name_len) + math(EXPR value_begin "${var_name_len} + 1") + string(SUBSTRING "${entry}" "${value_begin}" -1 var_value) + + # Check for submodule-source-dir keyword + string(COMPARE EQUAL "${var_name}" "${x_KEYWORD}" is_keyword) + if(is_keyword) + hunter_status_debug("Found ${var_name} = '${var_value}'") + set(output "${var_value}") + endif() + endif() + endforeach() + + # set OUTPUT variable + set("${x_OUTPUT}" "${output}" PARENT_SCOPE) +endfunction() + diff --git a/cmake/modules/hunter_pick_archiver.cmake b/cmake/modules/hunter_pick_archiver.cmake new file mode 100644 index 000000000..68dc6c2b4 --- /dev/null +++ b/cmake/modules/hunter_pick_archiver.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2017 Ruslan Baratov +# All rights reserved. + +# Set CMAKE_AR/CMAKE_RANLIB variables +function(hunter_pick_archiver) + if(NOT CMAKE_INTERPROCEDURAL_OPTIMIZATION) + return() + endif() + + string(COMPARE EQUAL "${CMAKE_CXX_COMPILER_ID}" "AppleClang" is_apple_clang) + string(COMPARE EQUAL "${CMAKE_CXX_COMPILER_ID}" "Clang" is_clang) + string(COMPARE EQUAL "${CMAKE_CXX_COMPILER_ID}" "GNU" is_gcc) + + if(is_gcc) + set(CMAKE_AR "${CMAKE_CXX_COMPILER_AR}" PARENT_SCOPE) + set(CMAKE_RANLIB "${CMAKE_CXX_COMPILER_RANLIB}" PARENT_SCOPE) + return() + endif() + + if(is_apple_clang) + # https://gitlab.kitware.com/cmake/cmake/blob/0e967e3b1dd8a705e304b4d94f1556249622d747/Modules/Compiler/Clang.cmake#L63-69 + return() + endif() + + if(NOT is_clang) + return() + endif() + + if(ANDROID) + # https://gitlab.kitware.com/cmake/cmake/blob/0e967e3b1dd8a705e304b4d94f1556249622d747/Modules/Compiler/Clang.cmake#L63-69 + return() + endif() + + set(CMAKE_AR "${CMAKE_CXX_COMPILER_AR}" PARENT_SCOPE) + set(CMAKE_RANLIB "${CMAKE_CXX_COMPILER_RANLIB}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_pkgconfig_export_target.cmake b/cmake/modules/hunter_pkgconfig_export_target.cmake new file mode 100644 index 000000000..c470bc00a --- /dev/null +++ b/cmake/modules/hunter_pkgconfig_export_target.cmake @@ -0,0 +1,112 @@ +# ---------------------------------------------------------------------- +# Auto creation of CMake targets from pkg-config +# +# Copyright (C) 2017 Alexandre Pretyman. All rights reserved. +# +# Looks for a pkgconfig module of a given name and exports a cmake +# target under the namespace PkgConfig::. +# ---------------------------------------------------------------------- + +include(FindPkgConfig) + +include(hunter_internal_error) +include(hunter_status_debug) + +# Packages to test this function: +# * x11 +# * x264 +# * xcb +function(hunter_pkgconfig_export_target PKG_CONFIG_MODULE PKG_GENERATE_SHARED) + set(target_name "PkgConfig::${PKG_CONFIG_MODULE}") + if(TARGET "${target_name}") + return() + endif() + pkg_check_modules(${PKG_CONFIG_MODULE} ${PKG_CONFIG_MODULE}) + if(NOT ${PKG_CONFIG_MODULE}_FOUND) + hunter_internal_error( + "Could not find pkg-config module: ${PKG_CONFIG_MODULE}" + ) + endif() + add_library("${target_name}" INTERFACE IMPORTED GLOBAL) + + if(${PKG_GENERATE_SHARED}) + set(PKG_CONFIG_PREFIX "${PKG_CONFIG_MODULE}") + else() + set(PKG_CONFIG_PREFIX "${PKG_CONFIG_MODULE}_STATIC") + endif() + + hunter_status_debug( + "PKG_CONFIG_MODULE ${PKG_CONFIG_MODULE} Using prefix ${PKG_CONFIG_PREFIX}" + ) + + # --- INTERFACE_INCLUDE_DIRECTORIES begin --- + hunter_status_debug( + "PKG_CONFIG_MODULE ${PKG_CONFIG_MODULE} INCLUDE_DIRS: ${${PKG_CONFIG_PREFIX}_INCLUDE_DIRS}" + ) + if(NOT "${${PKG_CONFIG_PREFIX}_INCLUDE_DIRS}" STREQUAL "") + set_target_properties("${target_name}" + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES + "${${PKG_CONFIG_PREFIX}_INCLUDE_DIRS}" + ) + endif() + # --- INTERFACE_INCLUDE_DIRECTORIES end --- + + # --- INTERFACE_LINK_LIBRARIES begin --- + set(link_libs) + + hunter_status_debug( + "PKG_CONFIG_MODULE ${PKG_CONFIG_MODULE} LDFLAGS: ${${PKG_CONFIG_PREFIX}_LDFLAGS}" + ) + if(NOT "${${PKG_CONFIG_PREFIX}_LDFLAGS}" STREQUAL "") + # turn "-framework;A;-framework;B" into "-framework A;-framework B" + string(REPLACE "-framework;" "-framework " ldflags "${${PKG_CONFIG_PREFIX}_LDFLAGS}") + list(APPEND link_libs ${ldflags}) + endif() + + hunter_status_debug( + "PKG_CONFIG_MODULE ${PKG_CONFIG_MODULE} LDFLAGS_OTHER: ${${PKG_CONFIG_PREFIX}_LDFLAGS_OTHER}" + ) + if(NOT "${${PKG_CONFIG_PREFIX}_LDFLAGS_OTHER}" STREQUAL "") + # turn "-framework;A;-framework;B" into "-framework A;-framework B" + string(REPLACE "-framework;" "-framework " ldflags_other "${${PKG_CONFIG_PREFIX}_LDFLAGS_OTHER}") + list(APPEND link_libs ${ldflags_other}) + endif() + + # No need to treat the pkg-config module's _LIBRARY_DIRS and _LIBRARIES + # as they are already included in LD_FLAGS + if(NOT "${link_libs}" STREQUAL "") + set_target_properties("${target_name}" + PROPERTIES + INTERFACE_LINK_LIBRARIES + "${link_libs}" + ) + endif() + # --- INTERFACE_LINK_LIBRARIES begin --- + + # --- INTERFACE_COMPILE_OPTIONS begin --- + set(compile_opts) + + hunter_status_debug( + "PKG_CONFIG_MODULE ${PKG_CONFIG_MODULE} CFLAGS: ${${PKG_CONFIG_PREFIX}_CFLAGS}" + ) + if(NOT "${${PKG_CONFIG_PREFIX}_CFLAGS}" STREQUAL "") + list(APPEND compile_opts ${${PKG_CONFIG_PREFIX}_CFLAGS}) + endif() + + hunter_status_debug( + "PKG_CONFIG_MODULE ${PKG_CONFIG_MODULE} CFLAGS_OTHER: ${${PKG_CONFIG_PREFIX}_CFLAGS_OTHER}" + ) + if(NOT "${${PKG_CONFIG_PREFIX}_CFLAGS_OTHER}" STREQUAL "") + list(APPEND compile_opts ${${PKG_CONFIG_PREFIX}_CFLAGS_OTHER}) + endif() + + if(NOT "${compile_opts}" STREQUAL "") + set_target_properties("${target_name}" + PROPERTIES + INTERFACE_COMPILE_OPTIONS + "${compile_opts}" + ) + endif() + # --- INTERFACE_COMPILE_OPTIONS end --- +endfunction() diff --git a/cmake/modules/hunter_private_data.cmake b/cmake/modules/hunter_private_data.cmake new file mode 100644 index 000000000..995bc78cf --- /dev/null +++ b/cmake/modules/hunter_private_data.cmake @@ -0,0 +1,304 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_cache_server_password) +include(hunter_check_download_error_message) +include(hunter_get_passwords_path) +include(hunter_http_password) +include(hunter_init_not_found_counter) +include(hunter_internal_error) +include(hunter_lock_directory) +include(hunter_private_data_password) +include(hunter_sleep_before_download) +include(hunter_step_into_unpacked_directory) +include(hunter_upload_password) +include(hunter_user_error) + +function(hunter_private_data) + set(func "'hunter_private_data'") + + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + + set(one URL SHA1 CREDENTIALS LOCATION FILE) + set(multiple HTTPHEADER) + + cmake_parse_arguments(x "" "${one}" "${multiple}" "${ARGN}") + # -> x_URL + # -> x_SHA1 + # -> x_CREDENTIALS + # -> x_LOCATION + # -> x_FILE + # -> x_HTTPHEADER + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + hunter_user_error("${func} unparsed arguments: ${x_UNPARSED_ARGUMENTS}") + endif() + + string(COMPARE EQUAL "${x_URL}" "" is_empty) + if(is_empty) + hunter_user_error("${func}: URL is missing") + endif() + + string(COMPARE EQUAL "${x_SHA1}" "" is_empty) + if(is_empty) + hunter_user_error("${func}: SHA1 is missing") + endif() + + string(COMPARE EQUAL "${x_LOCATION}" "" is_empty) + if(is_empty) + hunter_user_error("${func}: LOCATION is missing") + endif() + + string(COMPARE EQUAL "${x_FILE}" "" do_unpack) + if(NOT do_unpack) + get_filename_component(file_name "${x_FILE}" NAME) + string(COMPARE EQUAL "${file_name}" "${x_FILE}" ok) + if(NOT ok) + hunter_user_error( + "${func}: FILE with directories not allowed '${x_FILE}'" + ) + endif() + endif() + + set(priv_dir_root "${HUNTER_CACHED_ROOT}/_Base/PrivateData") + + hunter_make_directory("${priv_dir_root}/${x_SHA1}" "${x_SHA1}" priv_dir) + set(done_stamp "${priv_dir}/unpack.DONE") + set(raw_dir "${priv_dir}/raw") + set(param_file "${priv_dir}/param.file") # consistency check + + if(do_unpack) + # return path to unpacked directory + set(output "${raw_dir}") + set(dst_file "${priv_dir}/archive.file") + else() + # return path to file + set(output "${raw_dir}/${x_FILE}") + set(dst_file "${output}") + endif() + + if(NOT EXISTS "${done_stamp}") + hunter_lock_directory("${priv_dir}" "") + endif() + + # While waiting for lock other instance can do all the job + if(EXISTS "${done_stamp}") + if(EXISTS "${dst_file}") + if(NOT EXISTS "${output}") + hunter_internal_error("File not found: '${output}'") + endif() + + if(do_unpack) + hunter_step_into_unpacked_directory("${output}" output) + endif() + + set("${x_LOCATION}" ${output} PARENT_SCOPE) + return() + endif() + + # Something went wrong + if(EXISTS "${param_file}") + # Previous call was with FILE + file(READ "${param_file}" file_value) + string(COMPARE EQUAL "${file_value}" "" is_empty) + if(is_empty) + hunter_internal_error("Value from ${param_file} is empty") + endif() + else() + set(file_value "") + endif() + + if(do_unpack) + # archive.file not found, previous call was with FILE + hunter_user_error( + "Inconsistent ${func}.\n" + "Previous call was with 'FILE ${file_value}'" + ) + else() + # raw/ not found, previous call was with different FILE + # or without FILE + string(COMPARE EQUAL "${file_value}" "" is_empty) + if(is_empty) + hunter_user_error( + "Inconsistent ${func}.\n" + "Previous call was without 'FILE'" + ) + else() + hunter_user_error( + "Inconsistent ${func}.\n" + "Previous call was with 'FILE ${file_value}'" + ) + endif() + endif() + endif() + + file(REMOVE "${param_file}") + + string(COMPARE NOTEQUAL "${x_CREDENTIALS}" "" protected) + if(protected) + set(HUNTER_PRIVATE_DATA_CREDENTIALS "${x_CREDENTIALS}") + hunter_get_passwords_path(pass_path) + + # May use: + # * hunter_http_password + # * hunter_private_data_password + # * hunter_upload_password + # * hunter_cache_server_password + include("${pass_path}") + + string(COMPARE EQUAL "${HUNTER_PRIVATE_DATA_USERNAME}" "" no_username) + string(COMPARE EQUAL "${HUNTER_PRIVATE_DATA_PASSWORD}" "" no_password) + + if(no_username AND no_password) + hunter_user_error( + "Credentials for '${x_CREDENTIALS}' are empty,\n" + "'hunter_private_data_password' is missing?" + ) + endif() + + if(no_username) + hunter_user_error("Private data: USERNAME is missing") + endif() + + if(no_password) + hunter_user_error("Private data: PASSWORD is missing") + endif() + endif() + + if(HUNTER_STATUS_DEBUG) + set(progress SHOW_PROGRESS) + else() + set(progress "") + endif() + + if(protected) + set( + userpwd + USERPWD + "${HUNTER_PRIVATE_DATA_USERNAME}:${HUNTER_PRIVATE_DATA_PASSWORD}" + ) + else() + set(userpwd "") + endif() + + string(COMPARE EQUAL "${x_HTTPHEADER}" "" no_header) + if(no_header) + set(httpheader "") + else() + foreach(header ${x_HTTPHEADER}) + list(APPEND httpheader HTTPHEADER "${header}") + endforeach() + endif() + + hunter_init_not_found_counter(NOT_FOUND_NEEDED not_found_counter "1") + + set(download_done FALSE) + + set(total_retry 10) + foreach(x RANGE ${total_retry}) + if(EXISTS "${dst_file}") + file(SHA1 "${dst_file}" local_sha1) + string(COMPARE EQUAL "${local_sha1}" "${x_SHA1}" is_good) + if(is_good) + set(download_done TRUE) + else() + hunter_status_debug("File exists but SHA1 differs: '${dst_file}'") + file(REMOVE "${dst_file}") + endif() + endif() + + if(download_done) + # TODO: Update to CMake 3.2 to use 'continue' + else() + + hunter_status_debug("Downloading file (try #${x} of ${total_retry}):") + hunter_status_debug(" ${x_URL}") + hunter_status_debug(" -> ${dst_file}") + + hunter_sleep_before_download("${x}") + + file( + DOWNLOAD + "${x_URL}" + "${dst_file}" + ${progress} + STATUS status + ${userpwd} + ${httpheader} + TLS_VERIFY ${HUNTER_TLS_VERIFY} + ) + file(SHA1 "${dst_file}" local_sha1) + + string(COMPARE EQUAL "${local_sha1}" "${x_SHA1}" sha1_is_good) + + list(GET status 0 error_code) + list(GET status 1 error_message) + + hunter_check_download_error_message( + ERROR_CODE "${error_code}" + ERROR_MESSAGE "${error_message}" + REMOVE_ON_ERROR "${dst_file}" + NOT_FOUND_COUNTER not_found_counter + ) + + if(error_code EQUAL 0) + if(sha1_is_good) + set(download_done TRUE) + else() + hunter_status_debug("SHA1 mismatch (retry):") + hunter_status_debug(" ${local_sha1} (local)") + hunter_status_debug(" ${x_SHA1} (expected)") + file(REMOVE "${dst_file}") + endif() + elseif(error_code EQUAL 22) + hunter_status_debug("File not found") + if(NOT_FOUND_NEEDED EQUAL not_found_counter) + hunter_user_error("File not found by URL '${x_URL}'") + endif() + else() + hunter_status_debug("Download error (${error_message})") + endif() + endif() + endforeach() + + if(NOT download_done) + hunter_user_error("Download failed") + endif() + + if(do_unpack) + if(EXISTS "${output}") + hunter_status_debug("Removing directory '${output}'") + file(REMOVE_RECURSE "${output}") + endif() + file(MAKE_DIRECTORY "${output}") + hunter_status_debug("Unpacking archive '${dst_file}' to '${output}'") + if(HUNTER_STATUS_DEBUG AND NOT HUNTER_SUPPRESS_LIST_OF_FILES) + set(tar_params "xvf") + else() + set(tar_params "xf") + endif() + execute_process( + COMMAND "${CMAKE_COMMAND}" -E tar ${tar_params} "${dst_file}" + WORKING_DIRECTORY "${output}" + RESULT_VARIABLE result + ) + if(NOT result EQUAL "0") + hunter_user_error("Unpacking failed") + endif() + endif() + + if(do_unpack) + hunter_step_into_unpacked_directory("${output}" output) + endif() + + set("${x_LOCATION}" ${output} PARENT_SCOPE) + + if(NOT do_unpack) + file(WRITE "${param_file}" "${x_FILE}") + endif() + + file(WRITE "${done_stamp}" "") +endfunction() diff --git a/cmake/modules/hunter_private_data_password.cmake b/cmake/modules/hunter_private_data_password.cmake new file mode 100644 index 000000000..aa26db9b7 --- /dev/null +++ b/cmake/modules/hunter_private_data_password.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_user_error) + +function(hunter_private_data_password) + set(one CREDENTIALS USERNAME PASSWORD) + + cmake_parse_arguments(x "" "${one}" "" "${ARGN}") + # -> x_CREDENTIALS + # -> x_USERNAME + # -> x_PASSWORD + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + set(func "'hunter_private_data_password'") + hunter_user_error("${func} unparsed arguments: ${x_UNPARSED_ARGUMENTS}") + endif() + + string( + COMPARE + EQUAL + "${x_CREDENTIALS}" + "${HUNTER_PRIVATE_DATA_CREDENTIALS}" + hit + ) + + if(hit) + set(HUNTER_PRIVATE_DATA_USERNAME "${x_USERNAME}" PARENT_SCOPE) + set(HUNTER_PRIVATE_DATA_PASSWORD "${x_PASSWORD}" PARENT_SCOPE) + endif() +endfunction() diff --git a/cmake/modules/hunter_protected_sources.cmake b/cmake/modules/hunter_protected_sources.cmake new file mode 100644 index 000000000..c161fbd40 --- /dev/null +++ b/cmake/modules/hunter_protected_sources.cmake @@ -0,0 +1,14 @@ +# Copyright (c) 2016 Ruslan Baratov +# All rights reserved. + +include(hunter_user_error) + +function(hunter_protected_sources package_name) + if(CMAKE_VERSION VERSION_LESS "3.7") + hunter_user_error( + "'hunter_protected_sources' need CMake version 3.7+, see" + " https://docs.hunter.sh/en/latest/quick-start/cmake.html" + ) + endif() + set("HUNTER_${package_name}_PROTECTED_SOURCES" YES PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_read_http_credentials.cmake b/cmake/modules/hunter_read_http_credentials.cmake new file mode 100644 index 000000000..86c718821 --- /dev/null +++ b/cmake/modules/hunter_read_http_credentials.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +include(hunter_cache_server_password) +include(hunter_get_passwords_path) +include(hunter_http_password) +include(hunter_private_data_password) +include(hunter_status_debug) +include(hunter_upload_password) + +# Read credentials for package HUNTER_PACKAGE_NAME and +# save them in parent scope variables: +# * HUNTER_PACKAGE_HTTP_USERNAME +# * HUNTER_PACKAGE_HTTP_PASSWORD +function(hunter_read_http_credentials) + hunter_status_debug( + "Reading HTTP credentials for protected package '${HUNTER_PACKAGE_NAME}'" + ) + + hunter_get_passwords_path(pass_path) + + hunter_status_debug("Including file '${pass_path}'") + + # May use: + # * hunter_http_password + # * hunter_private_data_password + # * hunter_upload_password + # * hunter_cache_server_password + include("${pass_path}") + + set( + HUNTER_PACKAGE_HTTP_USERNAME + "${HUNTER_PACKAGE_HTTP_USERNAME}" + PARENT_SCOPE + ) + + set( + HUNTER_PACKAGE_HTTP_PASSWORD + "${HUNTER_PACKAGE_HTTP_PASSWORD}" + PARENT_SCOPE + ) +endfunction() diff --git a/cmake/modules/hunter_step_into_unpacked_directory.cmake b/cmake/modules/hunter_step_into_unpacked_directory.cmake new file mode 100644 index 000000000..404e2a472 --- /dev/null +++ b/cmake/modules/hunter_step_into_unpacked_directory.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +# If unpacked archive has only one directory at the top then step into it. +# Same logic as for ExternalProject_Add: +# * https://github.com/Kitware/CMake/blob/1da3f3e916de5ac6e64b473575d02bb3d358fc76/Modules/ExternalProject.cmake#L1551-L1559 + +function(hunter_step_into_unpacked_directory unpacked_directory output) + file(GLOB contents "${unpacked_directory}/*") + list(REMOVE_ITEM contents "${unpacked_directory}/.DS_Store") + list(LENGTH contents n) + + if(n EQUAL "1" AND IS_DIRECTORY "${contents}") + set("${output}" "${contents}" PARENT_SCOPE) + else() + set("${output}" "${unpacked_directory}") + endif() +endfunction() diff --git a/cmake/modules/hunter_upload_cache.cmake b/cmake/modules/hunter_upload_cache.cmake new file mode 100644 index 000000000..7b20c2071 --- /dev/null +++ b/cmake/modules/hunter_upload_cache.cmake @@ -0,0 +1,119 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(hunter_cache_server_password) +include(hunter_get_passwords_path) +include(hunter_http_password) +include(hunter_internal_error) +include(hunter_private_data_password) +include(hunter_assert_not_empty_string) +include(hunter_upload_password) +include(hunter_upload_to_custom_server) +include(hunter_user_error) + +function(hunter_upload_cache) + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_PACKAGE_BUILD_DIR}") + hunter_assert_not_empty_string("${HUNTER_SELF}") + + if(NOT HUNTER_RUN_UPLOAD) + return() + endif() + + hunter_status_debug("Uploading cache") + + hunter_get_passwords_path(pass_path) + + hunter_status_debug("Including file '${pass_path}'") + + # May use: + # * hunter_http_password + # * hunter_private_data_password + # * hunter_upload_password + # * hunter_cache_server_password + include("${pass_path}") + + string(COMPARE EQUAL "${HUNTER_UPLOAD_REPO_OWNER}" "" empty_repo_owner) + string(COMPARE EQUAL "${HUNTER_UPLOAD_REPO}" "" empty_repo) + string(COMPARE EQUAL "${HUNTER_UPLOAD_USERNAME}" "" empty_username) + string(COMPARE EQUAL "${HUNTER_UPLOAD_PASSWORD}" "" empty_password) + + string(COMPARE EQUAL "${HUNTER_UPLOAD_SERVER}" "" empty_server) + string(COMPARE EQUAL "${HUNTER_UPLOAD_SUB_SHA1_SUFFIX}" "" empty_sub_sha1_suffix) + string(COMPARE EQUAL "${HUNTER_UPLOAD_HTTPHEADER}" "" empty_httpheader) + + if( + empty_repo_owner + AND empty_repo + AND empty_username + AND empty_password + AND empty_server + AND empty_sub_sha1_suffix + AND empty_httpheader + ) + hunter_user_error( + "Upload parameters are empty, 'hunter_upload_password' is missing?" + ) + endif() + + if(empty_server) + if(empty_repo_owner) + hunter_user_error("Upload: REPO_OWNER is missing") + endif() + if(empty_repo) + hunter_user_error("Upload: REPO is missing") + endif() + if(empty_username) + hunter_user_error("Upload: USERNAME is missing") + endif() + if(empty_password) + hunter_user_error("Upload: PASSWORD is missing") + endif() + else() + hunter_upload_to_custom_server() + file(REMOVE_RECURSE "${HUNTER_PACKAGE_BUILD_DIR}") + return() + endif() + + # Run isolated script to aviod cross-compiling issues and + # other variables effects + execute_process( + COMMAND ${CMAKE_COMMAND} -P ${HUNTER_SELF}/scripts/find_python.cmake + RESULT_VARIABLE result + OUTPUT_VARIABLE python_path + ERROR_VARIABLE python_path + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + if(result EQUAL "0") + hunter_status_debug("Upload using Python: '${python_path}'") + else() + hunter_user_error("Python not found (required for uploading)") + endif() + + set(upload_script "${HUNTER_SELF}/scripts/upload-cache-to-github.py") + if(NOT EXISTS "${upload_script}") + hunter_internal_error("Script not found: ${upload_script}") + endif() + + set(cache_directory "${HUNTER_CACHED_ROOT}/_Base/Cache") + + execute_process( + COMMAND + "${python_path}" + "${upload_script}" + --repo-owner "${HUNTER_UPLOAD_REPO_OWNER}" + --repo "${HUNTER_UPLOAD_REPO}" + --username "${HUNTER_UPLOAD_USERNAME}" + --password "${HUNTER_UPLOAD_PASSWORD}" + --cache-dir "${cache_directory}" + WORKING_DIRECTORY "${CELLAR_RAW_DIRECTORY}" + RESULT_VARIABLE result + ) + + file(REMOVE_RECURSE "${HUNTER_PACKAGE_BUILD_DIR}") + + if(NOT result EQUAL "0") + hunter_internal_error("Upload script failed") + endif() +endfunction() diff --git a/cmake/modules/hunter_upload_password.cmake b/cmake/modules/hunter_upload_password.cmake new file mode 100644 index 000000000..94bcf02e5 --- /dev/null +++ b/cmake/modules/hunter_upload_password.cmake @@ -0,0 +1,59 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(CMakeParseArguments) # cmake_parse_arguments + +include(hunter_user_error) + +function(hunter_upload_password) + set(opt SUB_SHA1_SUFFIX) + set(one REPO_OWNER REPO USERNAME PASSWORD SERVER) + set(multi HTTPHEADER) + + cmake_parse_arguments(x "${opt}" "${one}" "${multi}" "${ARGN}") + # -> x_SUB_SHA1_SUFFIX + # -> x_REPO_OWNER + # -> x_REPO + # -> x_USERNAME + # -> x_PASSWORD + # -> x_SERVER + # -> x_HTTPHEADER + + string(COMPARE NOTEQUAL "${x_UNPARSED_ARGUMENTS}" "" has_unparsed) + if(has_unparsed) + hunter_user_error( + "'hunter_upload_password' unparsed arguments: ${x_UNPARSED_ARGUMENTS}" + ) + endif() + + string(COMPARE NOTEQUAL "${x_SERVER}" "" has_server) + string(COMPARE NOTEQUAL "${x_REPO_OWNER}" "" has_repo_owner) + string(COMPARE NOTEQUAL "${x_REPO}" "" has_repo) + string(COMPARE NOTEQUAL "${x_HTTPHEADER}" "" has_httpheader) + + if(has_server) + # Not GitHub server + if(has_repo_owner) + hunter_user_error("Unexpected REPO_OWNER") + endif() + if(has_repo) + hunter_user_error("Unexpected REPO") + endif() + else() + # GitHub server + if(has_httpheader) + hunter_user_error("Unexpected HTTPHEADER") + endif() + if(x_SUB_SHA1_SUFFIX) + hunter_user_error("Unexpected SUB_SHA1_SUFFIX") + endif() + endif() + + set(HUNTER_UPLOAD_REPO_OWNER "${x_REPO_OWNER}" PARENT_SCOPE) + set(HUNTER_UPLOAD_REPO "${x_REPO}" PARENT_SCOPE) + set(HUNTER_UPLOAD_USERNAME "${x_USERNAME}" PARENT_SCOPE) + set(HUNTER_UPLOAD_PASSWORD "${x_PASSWORD}" PARENT_SCOPE) + set(HUNTER_UPLOAD_SERVER "${x_SERVER}" PARENT_SCOPE) + set(HUNTER_UPLOAD_SUB_SHA1_SUFFIX "${x_SUB_SHA1_SUFFIX}" PARENT_SCOPE) + set(HUNTER_UPLOAD_HTTPHEADER "${x_HTTPHEADER}" PARENT_SCOPE) +endfunction() diff --git a/cmake/modules/hunter_upload_single_file.cmake b/cmake/modules/hunter_upload_single_file.cmake new file mode 100644 index 000000000..1c2766464 --- /dev/null +++ b/cmake/modules/hunter_upload_single_file.cmake @@ -0,0 +1,91 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(hunter_internal_error) +include(hunter_sleep_before_download) +include(hunter_status_debug) + +function(hunter_upload_single_file filename) + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + hunter_assert_not_empty_string("${HUNTER_UPLOAD_SERVER}") + + set(cache_root_dir "${HUNTER_CACHED_ROOT}/_Base/Cache") + if(NOT EXISTS ${cache_root_dir}) + hunter_internal_error("Not found: ${cache_root_dir}") + endif() + + set(full_path "${cache_root_dir}/${filename}") + if(NOT EXISTS ${full_path}) + hunter_internal_error("File not found: ${full_path}") + endif() + + set(upload_url "${HUNTER_UPLOAD_SERVER}/${filename}") + + if(HUNTER_UPLOAD_SUB_SHA1_SUFFIX) + string( + REGEX + REPLACE + "/cache\\.sha1$" + "/cache_sha1" + upload_url + "${upload_url}" + ) + endif() + + string(COMPARE EQUAL "${HUNTER_UPLOAD_USERNAME}" "" empty_username) + string(COMPARE EQUAL "${HUNTER_UPLOAD_PASSWORD}" "" empty_password) + + if(empty_username AND empty_password) + set(userpwd "") + else() + set(userpwd USERPWD "${HUNTER_UPLOAD_USERNAME}:${HUNTER_UPLOAD_PASSWORD}") + endif() + + string(COMPARE EQUAL "${HUNTER_UPLOAD_HTTPHEADER}" "" empty_httpheader) + if(empty_httpheader) + set(httpheader "") + else() + set(httpheader "") + foreach(header ${HUNTER_UPLOAD_HTTPHEADER}) + list(APPEND httpheader HTTPHEADER "${header}") + endforeach() + endif() + + file(SHA256 "${full_path}" sha256_value) + file(SHA1 "${full_path}" sha1_value) + file(MD5 "${full_path}" md5_value) + + list(APPEND httpheader HTTPHEADER "X-Checksum-Sha256: ${sha256_value}") + list(APPEND httpheader HTTPHEADER "X-Checksum-Sha1: ${sha1_value}") + list(APPEND httpheader HTTPHEADER "X-Checksum: ${md5_value}") + + set(total_retry 10) + foreach(x RANGE ${total_retry}) + hunter_status_debug("Uploading file (try #${x} of ${total_retry}):") + hunter_status_debug(" ${full_path}") + hunter_status_debug(" -> ${upload_url}") + + # right name is 'hunter_sleep_before_upload' + hunter_sleep_before_download("${x}") + + file( + UPLOAD "${full_path}" "${upload_url}" + STATUS status + ${userpwd} + ${httpheader} + ) + + list(GET status 0 error_code) + list(GET status 1 error_message) + + if(error_code EQUAL "0") + return() + endif() + + hunter_status_debug("Upload failed") + hunter_status_debug("Error code: ${error_code}") + hunter_status_debug("Error message: ${error_message}") + endforeach() + + hunter_internal_error("Upload failed") +endfunction() diff --git a/cmake/modules/hunter_upload_to_custom_server.cmake b/cmake/modules/hunter_upload_to_custom_server.cmake new file mode 100644 index 000000000..d98a1bbac --- /dev/null +++ b/cmake/modules/hunter_upload_to_custom_server.cmake @@ -0,0 +1,90 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +include(hunter_internal_error) +include(hunter_assert_not_empty_string) +include(hunter_upload_single_file) + +function(hunter_upload_to_custom_server) + hunter_assert_not_empty_string("${HUNTER_CACHED_ROOT}") + + set(cache_root_dir "${HUNTER_CACHED_ROOT}/_Base/Cache") + if(NOT EXISTS ${cache_root_dir}) + hunter_internal_error("Not found: ${cache_root_dir}") + endif() + + file( + GLOB_RECURSE + cache_done_list + RELATIVE + ${cache_root_dir} + "${cache_root_dir}/*/CACHE.DONE" + ) + + foreach(cache_done_file ${cache_done_list}) + get_filename_component(deps_id_dir ${cache_done_file} DIRECTORY) + get_filename_component(internal_deps_id_dir ${deps_id_dir} DIRECTORY) + get_filename_component(types_id_dir ${internal_deps_id_dir} DIRECTORY) + get_filename_component(args_id_dir ${types_id_dir} DIRECTORY) + get_filename_component(archive_id_dir ${args_id_dir} DIRECTORY) + get_filename_component(version_dir ${archive_id_dir} DIRECTORY) + get_filename_component(component_dir ${version_dir} DIRECTORY) + + get_filename_component(component_name ${component_dir} NAME) + if(component_name MATCHES "^__") + # We have component + get_filename_component(package_dir ${component_dir} DIRECTORY) + else() + # No component + set(package_dir ${component_dir}) + endif() + + get_filename_component(toolchain_id_dir ${package_dir} DIRECTORY) + get_filename_component(meta_dir ${toolchain_id_dir} DIRECTORY) + + string(COMPARE EQUAL "${meta_dir}" "meta" match) + if(NOT match) + hunter_internal_error("Unexpected 'meta' directory: '${meta_dir}'") + endif() + + set(from_server_path "${cache_root_dir}/${deps_id_dir}/from.server") + if(EXISTS "${from_server_path}") + hunter_status_debug("Skip. File present: ${from_server_path}") + continue() + endif() + + set(deps_info_path "${cache_root_dir}/${deps_id_dir}/deps.info") + if(NOT EXISTS "${deps_info_path}") + hunter_status_debug("Skip. File not found: ${deps_info_path}") + continue() + endif() + + set(cache_sha1_path "${cache_root_dir}/${deps_id_dir}/cache.sha1") + if(NOT EXISTS "${cache_sha1_path}") + hunter_status_debug("Skip. File not found: ${cache_sha1_path}") + continue() + endif() + + file(READ "${cache_sha1_path}" cache_sha1) + + set(raw_path "${cache_root_dir}/raw/${cache_sha1}.tar.bz2") + if(NOT EXISTS "${raw_path}") + hunter_status_debug("Skip. File not found: ${raw_path}") + continue() + endif() + + hunter_upload_single_file(${toolchain_id_dir}/toolchain.info) + hunter_upload_single_file(${args_id_dir}/args.cmake) + hunter_upload_single_file(${types_id_dir}/types.info) + hunter_upload_single_file(${internal_deps_id_dir}/internal_deps.id) + hunter_upload_single_file(${internal_deps_id_dir}/basic-deps.info) + hunter_upload_single_file(${internal_deps_id_dir}/basic-deps.DONE) + hunter_upload_single_file(${deps_id_dir}/cache.sha1) + hunter_upload_single_file(${deps_id_dir}/deps.info) + + hunter_upload_single_file(raw/${cache_sha1}.tar.bz2) + + hunter_upload_single_file(${deps_id_dir}/CACHE.DONE) + file(WRITE "${cache_root_dir}/${deps_id_dir}/from.server" "") + endforeach() +endfunction() diff --git a/cmake/projects/ARM_NEON_2_x86_SSE/hunter.cmake b/cmake/projects/ARM_NEON_2_x86_SSE/hunter.cmake new file mode 100644 index 000000000..caad82dc0 --- /dev/null +++ b/cmake/projects/ARM_NEON_2_x86_SSE/hunter.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ARM_NEON_2_x86_SSE + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/ARM_NEON_2_x86_SSE/archive/v1.0.0.tar.gz" + SHA1 + 8067ea1b7aa9ec991db5989d7eda6ed7293d0fda +) + +hunter_add_version( + PACKAGE_NAME + ARM_NEON_2_x86_SSE + VERSION + 1.0.0-p0 + URL + "https://github.com/hunter-packages/ARM_NEON_2_x86_SSE/archive/v1.0.0-p0.tar.gz" + SHA1 + bf97b9ae78060b4dc9aa2afd3a2a1d577b405b2c +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ARM_NEON_2_x86_SSE) +hunter_download(PACKAGE_NAME ARM_NEON_2_x86_SSE) diff --git a/cmake/projects/Android-ARM-EABI-v7a-System-Image/hunter.cmake b/cmake/projects/Android-ARM-EABI-v7a-System-Image/hunter.cmake new file mode 100755 index 000000000..37726c349 --- /dev/null +++ b/cmake/projects/Android-ARM-EABI-v7a-System-Image/hunter.cmake @@ -0,0 +1,68 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) + +# https://dl.google.com/android/repository/sys-img/android/sys-img.xml + +hunter_add_version( + PACKAGE_NAME + Android-ARM-EABI-v7a-System-Image + VERSION + "16_r04" + URL + "https://dl.google.com/android/repository/sys-img/android/sysimg_armv7a-16_r04.zip" + SHA1 + 39c093ea755098f0ee79f607be7df9e54ba4943f +) + +hunter_add_version( + PACKAGE_NAME + Android-ARM-EABI-v7a-System-Image + VERSION + "19_r05" + URL + "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-19_r05.zip" + SHA1 + d1a5fd4f2e1c013c3d3d9bfe7e9db908c3ed56fa +) + +hunter_add_version( + PACKAGE_NAME + Android-ARM-EABI-v7a-System-Image + VERSION + "21_r04" + URL + "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-21_r04.zip" + SHA1 + 8c606f81306564b65e41303d2603e4c42ded0d10 +) + +hunter_add_version( + PACKAGE_NAME + Android-ARM-EABI-v7a-System-Image + VERSION + "22_r02" + URL + "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-22_r02.zip" + SHA1 + 2114ec015dbf3a16cbcb4f63e8a84a1b206a07a1 +) + +hunter_add_version( + PACKAGE_NAME + Android-ARM-EABI-v7a-System-Image + VERSION + "24_r07" + URL + "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-24_r07.zip" + SHA1 + 3454546b4eed2d6c3dd06d47757d6da9f4176033 +) + +hunter_pick_scheme(DEFAULT url_sha1_unpack) +hunter_download(PACKAGE_NAME Android-ARM-EABI-v7a-System-Image) diff --git a/cmake/projects/Android-ARM64-v8a-System-Image/hunter.cmake b/cmake/projects/Android-ARM64-v8a-System-Image/hunter.cmake new file mode 100644 index 000000000..69e15eb97 --- /dev/null +++ b/cmake/projects/Android-ARM64-v8a-System-Image/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) + +# https://dl.google.com/android/repository/sys-img/android/sys-img.xml + +hunter_add_version( + PACKAGE_NAME + Android-ARM64-v8a-System-Image + VERSION + 24_r07 + URL + "https://dl.google.com/android/repository/sys-img/android/arm64-v8a-24_r07.zip" + SHA1 + e8ab2e49e4efe4b064232b33b5eeaded61437d7f +) + +hunter_pick_scheme(DEFAULT url_sha1_unpack) +hunter_download(PACKAGE_NAME Android-ARM64-v8a-System-Image) diff --git a/cmake/projects/Android-MIPS-System-Image/hunter.cmake b/cmake/projects/Android-MIPS-System-Image/hunter.cmake new file mode 100755 index 000000000..630858eb7 --- /dev/null +++ b/cmake/projects/Android-MIPS-System-Image/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) + +# https://dl.google.com/android/repository/sys-img/android/sys-img.xml + +hunter_add_version( + PACKAGE_NAME + Android-MIPS-System-Image + VERSION + "16_r04" + URL + "https://dl.google.com/android/repository/sys-img/android/sysimg_mips-16_r04.zip" + SHA1 + 67943c54fb3943943ffeb05fdd39c0b753681f6e +) + +hunter_pick_scheme(DEFAULT url_sha1_unpack) +hunter_download(PACKAGE_NAME Android-MIPS-System-Image) diff --git a/cmake/projects/AngelScript/hunter.cmake b/cmake/projects/AngelScript/hunter.cmake new file mode 100644 index 000000000..66c9a1dc8 --- /dev/null +++ b/cmake/projects/AngelScript/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + AngelScript + VERSION + 2.30-p0 + URL + "https://github.com/hunter-packages/AngelScript/archive/v2.30-p0.tar.gz" + SHA1 + 0323f68eb7d7c76d88c8d3193995bdf4cfff7f62 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(AngelScript) +hunter_download(PACKAGE_NAME AngelScript) diff --git a/cmake/projects/Beast/hunter.cmake b/cmake/projects/Beast/hunter.cmake new file mode 100644 index 000000000..f04bf8f69 --- /dev/null +++ b/cmake/projects/Beast/hunter.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + Beast + VERSION + "1.0.0-b84-hunter-0" + URL + "https://github.com/hunter-packages/Beast/archive/v1.0.0-b84-hunter-0.tar.gz" + SHA1 + 4268caa6c044fc8180d36d918aa731ffa931380d +) + +hunter_add_version( + PACKAGE_NAME + Beast + VERSION + "1.0.0-b32-hunter-4" + URL + "https://github.com/hunter-packages/Beast/archive/v1.0.0-b32-hunter-4.tar.gz" + SHA1 + 469ff269b5c437255b8392a6bcee829c07d59ce7 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Beast) +hunter_download(PACKAGE_NAME Beast) diff --git a/cmake/projects/Boost/contract/hunter.cmake b/cmake/projects/Boost/contract/hunter.cmake new file mode 100644 index 000000000..d8568188a --- /dev/null +++ b/cmake/projects/Boost/contract/hunter.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_download) +include(hunter_pick_scheme) + +hunter_pick_scheme( + DEFAULT + url_sha1_boost_library + IPHONEOS + url_sha1_boost_ios_library +) + +hunter_download( + PACKAGE_NAME + Boost + PACKAGE_COMPONENT + contract + PACKAGE_INTERNAL_DEPS_ID "44" +) diff --git a/cmake/projects/Boost/fiber/hunter.cmake b/cmake/projects/Boost/fiber/hunter.cmake new file mode 100644 index 000000000..0e6ef57c7 --- /dev/null +++ b/cmake/projects/Boost/fiber/hunter.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_download) +include(hunter_pick_scheme) + +hunter_pick_scheme( + DEFAULT + url_sha1_boost_library + IPHONEOS + url_sha1_boost_ios_library +) + +hunter_download( + PACKAGE_NAME + Boost + PACKAGE_COMPONENT + fiber + PACKAGE_INTERNAL_DEPS_ID "44" +) diff --git a/cmake/projects/Boost/scripts/create-boost-1-66-ios-fatlib.sh b/cmake/projects/Boost/scripts/create-boost-1-66-ios-fatlib.sh new file mode 100755 index 000000000..933c7fa0c --- /dev/null +++ b/cmake/projects/Boost/scripts/create-boost-1-66-ios-fatlib.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +[ "$#" == "4" ] || { echo "usage: $0 "; exit 1; } + +BUILD_DIR="$1" +LIBNAME="$2" +DIRNAME="$3" +INSTALL_DIR="$4" + +COMMON_DIR="${BUILD_DIR}/bin.v2/libs/${DIRNAME}/build" + +IPHONE_DEBUG=`find "${COMMON_DIR}/darwin-gnu-iphoneos/debug" -name "libboost_${LIBNAME}[^_]*.a"` +IPHONE_RELEASE=`find "${COMMON_DIR}/darwin-gnu-iphoneos/release" -name "libboost_${LIBNAME}[^_]*.a"` + +SIM_DEBUG=`find "${COMMON_DIR}/darwin-gnu-iphonesimulator/debug" -name "libboost_${LIBNAME}[^_]*.a"` +SIM_RELEASE=`find "${COMMON_DIR}/darwin-gnu-iphonesimulator/release" -name "libboost_${LIBNAME}[^_]*.a"` + +echo "-- [iOS universal] IPHONE_DEBUG: $IPHONE_DEBUG" +echo "-- [iOS universal] IPHONE_RELEASE: $IPHONE_RELEASE" +echo "-- [iOS universal] ISIM_DEBUG: $SIM_DEBUG" +echo "-- [iOS universal] ISIM_RELEASE: $SIM_RELEASE" + +if [[ -f "${SIM_DEBUG}" ]] +then + DEBUG=`basename ${SIM_DEBUG}` +else + DEBUG=`basename ${IPHONE_DEBUG}` +fi + +if [[ -f "${SIM_RELEASE}" ]] +then + RELEASE=`basename ${SIM_RELEASE}` +else + RELEASE=`basename ${IPHONE_RELEASE}` +fi + +function lipo_create { + iphone=$1 + sim=$2 + dst=$3 + + if [[ -f "${iphone}" || -f "${sim}" ]] + then + if [[ -f "${iphone}" && -f "${sim}" ]] + then + lipo -create "${iphone}" "${sim}" -o "${dst}" + else + if [[ -f "${iphone}" ]] + then + cp "${iphone}" "${dst}" + fi + if [[ -f "${sim}" ]] + then + cp "${sim}" "${dst}" + fi + fi + fi + +} + +lipo_create "${IPHONE_DEBUG}" "${SIM_DEBUG}" "${INSTALL_DIR}/${DEBUG}" +lipo_create "${IPHONE_RELEASE}" "${SIM_RELEASE}" "${INSTALL_DIR}/${RELEASE}" + +echo "-- [iOS universal] Done: ${INSTALL_DIR}/{${DEBUG}, ${RELEASE}}" diff --git a/cmake/projects/Boost/scripts/patched_boostrap.bat.in b/cmake/projects/Boost/scripts/patched_boostrap.bat.in new file mode 100644 index 000000000..6af80ac93 --- /dev/null +++ b/cmake/projects/Boost/scripts/patched_boostrap.bat.in @@ -0,0 +1,6 @@ +call "@HUNTER_MSVC_VCVARSALL@" @HUNTER_MSVC_ARCH@ +REM The /d flag is required because vcvarsall.bat changes the current drive +REM If the hunter cache is located on a different drive to vcvarsall.bat the +REM cd command will fail. https://technet.microsoft.com/en-gb/library/bb490875.aspx +cd /d @HUNTER_PACKAGE_SOURCE_DIR@ +bootstrap.bat diff --git a/cmake/projects/Boost/stacktrace/hunter.cmake b/cmake/projects/Boost/stacktrace/hunter.cmake new file mode 100644 index 000000000..087d04403 --- /dev/null +++ b/cmake/projects/Boost/stacktrace/hunter.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_download) +include(hunter_pick_scheme) + +hunter_pick_scheme( + DEFAULT + url_sha1_boost_library + IPHONEOS + url_sha1_boost_ios_library +) + +hunter_download( + PACKAGE_NAME + Boost + PACKAGE_COMPONENT + stacktrace + PACKAGE_INTERNAL_DEPS_ID "44" +) diff --git a/cmake/projects/BoringSSL/hunter.cmake b/cmake/projects/BoringSSL/hunter.cmake new file mode 100644 index 000000000..f6288df18 --- /dev/null +++ b/cmake/projects/BoringSSL/hunter.cmake @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + BoringSSL + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/boringssl/archive/v1.0.0.tar.gz" + SHA1 + caa7cd122960c9427bda30db5020b9058cb1ed0a + ) + +hunter_add_version( + PACKAGE_NAME + BoringSSL + VERSION + 0.0.0-0f5ecd3a8-p0 + URL + "https://github.com/hunter-packages/boringssl/archive/v0.0.0-0f5ecd3a8-p0.tar.gz" + SHA1 + fee17b226c3132edc44711365eb5ea023c55bb1d + ) + +if(MSVC) + hunter_cmake_args(BoringSSL CMAKE_ARGS OPENSSL_NO_ASM=YES) +endif() + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(BoringSSL) +hunter_download(PACKAGE_NAME BoringSSL) diff --git a/cmake/projects/Box2D/hunter.cmake b/cmake/projects/Box2D/hunter.cmake new file mode 100644 index 000000000..4b832c1e0 --- /dev/null +++ b/cmake/projects/Box2D/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + Box2D + VERSION + 2.3.1-p0 + URL + "https://github.com/hunter-packages/Box2D/archive/v2.3.1-p0.tar.gz" + SHA1 + 5e34dad2674c65d5c79d2a23abcd881da1af90b9 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Box2D) +hunter_download(PACKAGE_NAME Box2D) diff --git a/cmake/projects/CLI11/hunter.cmake b/cmake/projects/CLI11/hunter.cmake new file mode 100644 index 000000000..3ee18f563 --- /dev/null +++ b/cmake/projects/CLI11/hunter.cmake @@ -0,0 +1,112 @@ +# Copyright (c) 2018, Pawel Bylica +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + CLI11 + VERSION + 1.5.3 + URL + "https://github.com/CLIUtils/CLI11/archive/v1.5.3.tar.gz" + SHA1 + 00c982a7e6819524acda111515ea02308e93a92f + ) + +hunter_add_version( + PACKAGE_NAME + CLI11 + VERSION + 1.5.4 + URL + "https://github.com/CLIUtils/CLI11/archive/v1.5.4.tar.gz" + SHA1 + 94c6860aaa13b16c47e939194a2cdd26e869256c + ) + +hunter_add_version( + PACKAGE_NAME + CLI11 + VERSION + 1.6.0 + URL + "https://github.com/CLIUtils/CLI11/archive/v1.6.0.tar.gz" + SHA1 + f49b36ca4707dc89cb2bd03fc4f7558e30417afc + ) + + +hunter_add_version( + PACKAGE_NAME + CLI11 + VERSION + 1.6.1 + URL + "https://github.com/CLIUtils/CLI11/archive/v1.6.1.tar.gz" + SHA1 + 4d900c543cc73b80bc31da20998b2d516d67e0ae +) + +hunter_add_version( + PACKAGE_NAME + CLI11 + VERSION + 1.6.2 + URL + "https://github.com/CLIUtils/CLI11/archive/v1.6.2.tar.gz" + SHA1 + a2012510cb565f17c76c1b1c0e4a7bc80fbccb33 +) + +hunter_add_version( + PACKAGE_NAME + CLI11 + VERSION + 1.7.0 + URL + "https://github.com/CLIUtils/CLI11/archive/v1.7.0.tar.gz" + SHA1 + 223a3c3dff2ccbb37e9caafb3f6308fc32564060 +) + +hunter_add_version( + PACKAGE_NAME + CLI11 + VERSION + 1.7.1 + URL + "https://github.com/CLIUtils/CLI11/archive/v1.7.1.tar.gz" + SHA1 + 05b6b47b58201e00db8346a9ad4df172014a4a04 + +) + +hunter_add_version( + PACKAGE_NAME + CLI11 + VERSION + 1.8.0 + URL + "https://github.com/CLIUtils/CLI11/archive/v1.8.0.tar.gz" + SHA1 + c21bdd4ca965931c9c36dadd15f74209ec1b9bca +) + +hunter_cmake_args( + CLI11 + CMAKE_ARGS + CLI11_TESTING=OFF + CLI11_EXAMPLES=OFF + CLI11_SINGLE_FILE=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(CLI11) +hunter_download(PACKAGE_NAME CLI11) diff --git a/cmake/projects/CapnProto/hunter.cmake b/cmake/projects/CapnProto/hunter.cmake new file mode 100644 index 000000000..44b512bcf --- /dev/null +++ b/cmake/projects/CapnProto/hunter.cmake @@ -0,0 +1,34 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME CapnProto + VERSION "0.7.0" + URL "https://capnproto.org/capnproto-c++-0.7.0.tar.gz" + SHA1 348f5af790c65927480106e1143c9c9554cf2443 +) + +hunter_add_version( + PACKAGE_NAME CapnProto + VERSION "0.6.1" + URL "https://capnproto.org/capnproto-c++-0.6.1.tar.gz" + SHA1 745dc4c60c02d0a664574a63ec85ef7a03c57676 +) + +hunter_add_version( + PACKAGE_NAME CapnProto + VERSION "0.6.0" + URL "https://capnproto.org/capnproto-c++-0.6.0.tar.gz" + SHA1 c601f0d9da8942fc19dffca79ac3f2279297047b +) + +hunter_cmake_args(CapnProto CMAKE_ARGS BUILD_TESTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(CapnProto) +hunter_download(PACKAGE_NAME CapnProto) diff --git a/cmake/projects/Catch/hunter.cmake b/cmake/projects/Catch/hunter.cmake new file mode 100644 index 000000000..fb7849039 --- /dev/null +++ b/cmake/projects/Catch/hunter.cmake @@ -0,0 +1,119 @@ +# Copyright (c) 2016 Alexey Ulyanov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_pick_scheme) +include(hunter_cacheable) +include(hunter_download) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "2.9.1" + URL + "https://github.com/catchorg/Catch2/archive/v2.9.1.tar.gz" + SHA1 + caf84ac93f6b624b9583bc9712feb3fba9417c68 +) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "2.7.0" + URL + "https://github.com/catchorg/Catch2/archive/v2.7.0.tar.gz" + SHA1 + 6df37d5b64a71b840a6a9d8c79c3705aa8a3f56e +) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "2.6.0" + URL + "https://github.com/catchorg/Catch2/archive/v2.6.0.tar.gz" + SHA1 + e32263de5489cfaf57d1a059f1f901312b81f7d1 +) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "2.5.0" + URL + "https://github.com/catchorg/Catch2/archive/v2.5.0.tar.gz" + SHA1 + 55fa742c9d2b6890da7060ca8c58693e7c8929fb +) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "2.2.2" + URL + "https://github.com/catchorg/Catch2/archive/v2.2.2.tar.gz" + SHA1 + 834fcbf7be9c5c06fc1253ebbfdd290fa5983d9e +) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "2.2.1" + URL + "https://github.com/catchorg/Catch2/archive/v2.2.1.tar.gz" + SHA1 + effa701a5120f191417823b60e06e0148dd589b3 +) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "2.0.1" + URL + "https://github.com/hunter-packages/Catch/archive/v2.0.1-p0.tar.gz" + SHA1 + fbfa84ce24b33386f80fe34bc855455de8b8e45e +) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "1.8.2-p0" + URL + "https://github.com/hunter-packages/Catch/archive/v1.8.2-p0-hunter.tar.gz" + SHA1 + d8de13879e7be959d95a8e4a0daa2d5eb5fef807 +) + +hunter_add_version( + PACKAGE_NAME + Catch + VERSION + "1.5.9" + URL + "https://github.com/hunter-packages/Catch/releases/download/v1.5.9-hunter/v1.5.9-hunter.tar.gz" + SHA1 + 737cb1c98fedccceb95e7bfd385e5dea0ad5d047 +) + +hunter_cmake_args( + Catch + CMAKE_ARGS + NO_SELFTEST=TRUE CATCH_BUILD_TESTING=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Catch) +hunter_download(PACKAGE_NAME Catch) diff --git a/cmake/projects/CreateLaunchers/hunter.cmake b/cmake/projects/CreateLaunchers/hunter.cmake new file mode 100644 index 000000000..a0f5be44b --- /dev/null +++ b/cmake/projects/CreateLaunchers/hunter.cmake @@ -0,0 +1,46 @@ +# Copyright (c) 2013-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + CreateLaunchers + VERSION + "0.2.1" + URL + "https://github.com/caseymcc/CreateLaunchers/archive/0.2.1.tar.gz" + SHA1 + e330f0c8a7562f23eb323c36c2ce9417a88686ea +) + +hunter_add_version( + PACKAGE_NAME + CreateLaunchers + VERSION + "0.2.0" + URL + "https://github.com/caseymcc/CreateLaunchers/archive/0.2.0.tar.gz" + SHA1 + c09496f49eb6557f91cd0f927d61bf901f38240d +) + +hunter_add_version( + PACKAGE_NAME + CreateLaunchers + VERSION + "0.1.0" + URL + "https://github.com/caseymcc/CreateLaunchers/archive/0.1.0.tar.gz" + SHA1 + f0769de3d5968d1308ee9c9a566f0619a94a288a +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(CreateLaunchers) +hunter_download(PACKAGE_NAME CreateLaunchers) diff --git a/cmake/projects/EnumGroup/hunter.cmake b/cmake/projects/EnumGroup/hunter.cmake new file mode 100644 index 000000000..a2f650f04 --- /dev/null +++ b/cmake/projects/EnumGroup/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + EnumGroup + VERSION + 0.0.1 + URL + "https://github.com/Person-93/EnumGroup/archive/0.0.1.tar.gz" + SHA1 + e842e9c81865db3006e1b457b5bedea401ae5734 +) + +hunter_cmake_args( + EnumGroup + CMAKE_ARGS + ENUM_GROUP_WITH_TESTS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(EnumGroup) +hunter_download(PACKAGE_NAME EnumGroup) diff --git a/cmake/projects/FP16/hunter.cmake b/cmake/projects/FP16/hunter.cmake new file mode 100644 index 000000000..ca310b985 --- /dev/null +++ b/cmake/projects/FP16/hunter.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + FP16 + VERSION + 0.0.0-febbb1c-p0 + URL + "https://github.com/hunter-packages/FP16/archive/v0.0.0-febbb1c-p0.tar.gz" + SHA1 + 86a7e35a2193e60440ea152628ade89eff4cd0cd +) + +hunter_cmake_args(FP16 CMAKE_ARGS FP16_BUILD_BENCHMARKS=OFF FP16_BUILD_TESTS=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(FP16) +hunter_download(PACKAGE_NAME FP16) diff --git a/cmake/projects/FakeIt/hunter.cmake b/cmake/projects/FakeIt/hunter.cmake new file mode 100644 index 000000000..90a276f7e --- /dev/null +++ b/cmake/projects/FakeIt/hunter.cmake @@ -0,0 +1,21 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_pick_scheme) +include(hunter_cacheable) +include(hunter_download) + +hunter_add_version( + PACKAGE_NAME + FakeIt + VERSION + "2.0.3" + URL + "https://github.com/hunter-packages/FakeIt/archive/2.0.3-hunter.tar.gz" + SHA1 + 9ac096c5d990bc8b8d8d8b0ac6b4902c21928a22 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(FakeIt) +hunter_download(PACKAGE_NAME FakeIt) diff --git a/cmake/projects/Fruit/hunter.cmake b/cmake/projects/Fruit/hunter.cmake new file mode 100644 index 000000000..4cbe9d2e2 --- /dev/null +++ b/cmake/projects/Fruit/hunter.cmake @@ -0,0 +1,32 @@ +# cmake/projects/Fruit/hunter.cmake + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + Fruit + VERSION + "3.1.1-p0" + URL + "https://github.com/hunter-packages/fruit/archive/v3.1.1-p0.tar.gz" + SHA1 + f406060a51ee80e14fc34ba9242a230182ac2b12 +) + +hunter_cmake_args( + Fruit + CMAKE_ARGS + FRUIT_USES_BOOST=OFF + FRUIT_BUILD_TESTS=OFF + FRUIT_BUILD_EXAMPLES=OFF + FRUIT_BUILD_EXTRAS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) + +hunter_cacheable(Fruit) +hunter_download(PACKAGE_NAME Fruit) diff --git a/cmake/projects/FunctionalPlus/hunter.cmake b/cmake/projects/FunctionalPlus/hunter.cmake new file mode 100644 index 000000000..a0a0dfd13 --- /dev/null +++ b/cmake/projects/FunctionalPlus/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2013-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME FunctionalPlus + VERSION 0.2-p0 + URL "https://github.com/Dobiasd/FunctionalPlus/archive/0.2.tar.gz" + SHA1 d637860643bb0199a8b558f3d55460de2c88fb50 + ) + +hunter_cmake_args( + FunctionalPlus + CMAKE_ARGS + FPLUS_USE_TOOLCHAIN=ON + FPLUS_BUILD_EXAMPLES=OFF + FPLUS_BUILD_UNITTEST=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(FunctionalPlus) +hunter_download(PACKAGE_NAME FunctionalPlus) diff --git a/cmake/projects/HalideIR/hunter.cmake b/cmake/projects/HalideIR/hunter.cmake new file mode 100644 index 000000000..76f0d3d4f --- /dev/null +++ b/cmake/projects/HalideIR/hunter.cmake @@ -0,0 +1,46 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + HalideIR + VERSION + 0.0-2f3ecdf-p0 + URL + "https://github.com/hunter-packages/HalideIR/archive/v0.0-2f3ecdf-p0.tar.gz" + SHA1 + 1f1dfb75eb296ad874aac67cf5b604ddfbe944a1 +) + +hunter_add_version( + PACKAGE_NAME + HalideIR + VERSION + 0.0-b257a92-p1 + URL + "https://github.com/hunter-packages/HalideIR/archive/v0.0-b257a92-p1.tar.gz" + SHA1 + 3b527b4e9d07e194f2143ce14563f69dc6a4db93 +) + +hunter_add_version( + PACKAGE_NAME + HalideIR + VERSION + 0.0-32057b5-p0 + URL + "https://github.com/hunter-packages/HalideIR/archive/v0.0-32057b5-p0.tar.gz" + SHA1 + f1becfb86a2e59e40094a74b200f5d2e374676de +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(HalideIR) +hunter_download(PACKAGE_NAME HalideIR) diff --git a/cmake/projects/HastyNoise/hunter.cmake b/cmake/projects/HastyNoise/hunter.cmake new file mode 100644 index 000000000..5996eef3d --- /dev/null +++ b/cmake/projects/HastyNoise/hunter.cmake @@ -0,0 +1,53 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + HastyNoise + VERSION + "0.8.2" + URL + "https://github.com/caseymcc/HastyNoise/archive/0.8.2.tar.gz" + SHA1 + 563bd6d8e5cd7fd37ec4a52fd4c12e7bf722685b +) + +hunter_add_version( + PACKAGE_NAME + HastyNoise + VERSION + "0.8.1" + URL + "https://github.com/caseymcc/HastyNoise/archive/0.8.1.tar.gz" + SHA1 + 355f1ef9446d9942e327859e90a141401ce194c7 +) + +hunter_add_version( + PACKAGE_NAME + HastyNoise + VERSION + "0.8.0" + URL + "https://github.com/caseymcc/HastyNoise/archive/0.8.0.tar.gz" + SHA1 + f4e9fd3fb2b53eeb10d6c7705d34eac7c7493059 +) + +hunter_cmake_args( + HastyNoise + CMAKE_ARGS + HN_PREVIEW_APP=OFF +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(HastyNoise) +hunter_download(PACKAGE_NAME HastyNoise) diff --git a/cmake/projects/ICU/hunter.cmake b/cmake/projects/ICU/hunter.cmake new file mode 100644 index 000000000..695ff7fb7 --- /dev/null +++ b/cmake/projects/ICU/hunter.cmake @@ -0,0 +1,112 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 55.1-p1 + URL + "https://github.com/hunter-packages/icu/archive/v55.1-p1.tar.gz" + SHA1 + 605defbeb77697dc59edff6bcfcd37ce89e43457 +) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 55.1-p2 + URL + "https://github.com/hunter-packages/icu/archive/v55.1-p2.tar.gz" + SHA1 + fe7aef7858fbd3bcc951ebb1e427d20d03c7cbde +) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 55.1-p3 + URL + "https://github.com/hunter-packages/icu/archive/v55.1-p3.tar.gz" + SHA1 + 0e9f4d37b1601a0a2947fe3abb7d6945df9e5ea4 +) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 55.1-p4 + URL + "https://github.com/hunter-packages/icu/archive/v55.1-p4.tar.gz" + SHA1 + 4c14de025043ef43b0d8418b87fe6b25a31c6aa7 +) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 63.1-p1 + URL + "https://github.com/hunter-packages/icu/archive/v63.1-p1.tar.gz" + SHA1 + 581d4ff13168ecb6eab5cdf559df8cba3d93a778 +) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 63.1-p2 + URL + "https://github.com/hunter-packages/icu/archive/v63.1-p2.tar.gz" + SHA1 + 562740c5ab644d8334b20974e73b372625f99c2e +) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 63.1-p3 + URL + "https://github.com/hunter-packages/icu/archive/v63.1-p3.tar.gz" + SHA1 + 6192cef73b0f15c0f4d93a8a3deffeaeb562a65e +) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 63.1-p4 + URL + "https://github.com/hunter-packages/icu/archive/v63.1-p4.tar.gz" + SHA1 + eead3c1c8f8ec00cb224a50a8895e0333c6c65a8 +) + +hunter_add_version( + PACKAGE_NAME + ICU + VERSION + 63.1-p5 + URL + "https://github.com/hunter-packages/icu/archive/v63.1-p5.tar.gz" + SHA1 + 506109ef6fa0c3105be64bcebb5bd9e3fba1a24f +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ICU) +hunter_download(PACKAGE_NAME ICU) diff --git a/cmake/projects/IF97/hunter.cmake b/cmake/projects/IF97/hunter.cmake new file mode 100644 index 000000000..70b7154eb --- /dev/null +++ b/cmake/projects/IF97/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cmake_args) +include(hunter_pick_scheme) +include(hunter_cacheable) +include(hunter_download) + +hunter_add_version( + PACKAGE_NAME + IF97 + VERSION + 2.1.2 + URL + "https://github.com/CoolProp/IF97/archive/v2.1.2.tar.gz" + SHA1 + 84d7a541d7aee33c708b25499c82e12cf68f63f1 +) + +hunter_cmake_args( + IF97 + CMAKE_ARGS + IF97_CMAKE_MODULE=ON +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(IF97) +hunter_download(PACKAGE_NAME IF97) diff --git a/cmake/projects/LAPACK/hunter-msvc.cmake b/cmake/projects/LAPACK/hunter-msvc.cmake new file mode 100644 index 000000000..066bd44e0 --- /dev/null +++ b/cmake/projects/LAPACK/hunter-msvc.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +include(hunter_report_broken_package) + +#hunter_cacheable(LAPACK) # install is always cacheable + +# determine architecture +include(hunter_check_toolchain_definition) +hunter_check_toolchain_definition(NAME "_WIN64" DEFINED _WIN64_defined) + +if(_WIN64_defined) + hunter_add_version( + PACKAGE_NAME + LAPACK + VERSION + "3.7.1" + URL + https://github.com/hunter-packages/lapack/releases/download/v3.7.1-p0/lapack-prebuilt-3.7.1-msvc-amd64.zip + SHA1 + 4a6e51690e36747d51e4334358abac99ca22378c + ) +else() + hunter_report_broken_package("LAPACK on MSVC is only available on WIN64") +endif() + +# pass cmake arguments +hunter_cmake_args( + LAPACK + CMAKE_ARGS + HUNTER_INSTALL_LICENSE_FILES=LICENSE +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_unpack_install) + diff --git a/cmake/projects/LAPACK/hunter-source.cmake b/cmake/projects/LAPACK/hunter-source.cmake new file mode 100644 index 000000000..7ccaf220e --- /dev/null +++ b/cmake/projects/LAPACK/hunter-source.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +hunter_cacheable(LAPACK) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + LAPACK + VERSION + "3.7.1" + URL + https://github.com/hunter-packages/lapack/archive/v3.7.1-p0.tar.gz + SHA1 + 82616c0878fbe42f22ece5fadfb38e09456ba5b5 +) + +# pass cmake arguments +hunter_cmake_args( + LAPACK + CMAKE_ARGS + HUNTER_INSTALL_LICENSE_FILES=LICENSE +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) + diff --git a/cmake/projects/LAPACK/hunter.cmake b/cmake/projects/LAPACK/hunter.cmake new file mode 100644 index 000000000..66476814e --- /dev/null +++ b/cmake/projects/LAPACK/hunter.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +if(NOT MSVC) + include("${CMAKE_CURRENT_LIST_DIR}/hunter-source.cmake") +else() + include("${CMAKE_CURRENT_LIST_DIR}/hunter-msvc.cmake") +endif() + +# Download package. +# Two versions of library will be build: +# * libexample_A.a +# * libexample_Ad.a +hunter_download(PACKAGE_NAME LAPACK) diff --git a/cmake/projects/Leptonica/hunter.cmake b/cmake/projects/Leptonica/hunter.cmake new file mode 100644 index 000000000..0e2047d9a --- /dev/null +++ b/cmake/projects/Leptonica/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2017, Sacha Refshauge +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + Leptonica + VERSION + "1.74.2-p4" + URL + "https://github.com/hunter-packages/leptonica/archive/v1.74.2-p4.tar.gz" + SHA1 + b317631496a683759565fc925e5125fddf85466a +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Leptonica) +hunter_download(PACKAGE_NAME Leptonica) diff --git a/cmake/projects/LibCDS/hunter.cmake b/cmake/projects/LibCDS/hunter.cmake new file mode 100644 index 000000000..0397f169b --- /dev/null +++ b/cmake/projects/LibCDS/hunter.cmake @@ -0,0 +1,16 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME LibCDS + VERSION "2.3.1" + URL "https://github.com/hunter-packages/libcds/archive/v2.3.1-p0.tar.gz" + SHA1 "86cc0d2d57075830feaaa1c6e1200e970b96f9f8") + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(LibCDS) +hunter_download(PACKAGE_NAME LibCDS) diff --git a/cmake/projects/Libevent/hunter.cmake b/cmake/projects/Libevent/hunter.cmake new file mode 100644 index 000000000..755cff41f --- /dev/null +++ b/cmake/projects/Libevent/hunter.cmake @@ -0,0 +1,35 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME Libevent + VERSION "2.1.8" + URL "https://github.com/hunter-packages/libevent/archive/v2.1.8-p2.tar.gz" + SHA1 "492abb962dad3071f34bbe4975e28768fd29edf0") + +hunter_add_version( + PACKAGE_NAME Libevent + VERSION "2.1.8-p3" + URL "https://github.com/hunter-packages/libevent/archive/v2.1.8-p3.tar.gz" + SHA1 "c6a1b1ffe52d73d9cf5c6ed2088708f8e6a093fe") + +hunter_add_version( + PACKAGE_NAME Libevent + VERSION "2.1.8-p4" + URL "https://github.com/hunter-packages/libevent/archive/v2.1.8-p4.tar.gz" + SHA1 "a969958d9064c44338d78b097975a14c46501c03") + +hunter_cmake_args(Libevent CMAKE_ARGS + EVENT__DISABLE_TESTS=ON + EVENT__DISABLE_SAMPLES=ON + EVENT__DISABLE_REGRESS=ON + EVENT__DISABLE_BENCHMARK=ON) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Libevent) +hunter_download(PACKAGE_NAME Libevent) diff --git a/cmake/projects/LodePNG/hunter.cmake b/cmake/projects/LodePNG/hunter.cmake new file mode 100644 index 000000000..42d4b0d0e --- /dev/null +++ b/cmake/projects/LodePNG/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + LodePNG + VERSION + "0.0.0-p1" + URL + "https://github.com/hunter-packages/lodepng/archive/v0.0.0-p1.tar.gz" + SHA1 + 315129891c5ea6c922ed98398c853a7a83a3c662 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(LodePNG) +hunter_download(PACKAGE_NAME LodePNG) diff --git a/cmake/projects/MathFu/hunter.cmake b/cmake/projects/MathFu/hunter.cmake new file mode 100644 index 000000000..6c866075d --- /dev/null +++ b/cmake/projects/MathFu/hunter.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + MathFu + VERSION + 1.1.0-p0 + URL + "https://github.com/hunter-packages/mathfu/archive/v1.1.0-p0.tar.gz" + SHA1 + 8ab4c19240e65e406ec2fcb8c6886d9030ca9d83 +) + +hunter_cmake_args( + MathFu + CMAKE_ARGS + mathfu_build_benchmarks=OFF + mathfu_build_tests=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(MathFu) +hunter_download(PACKAGE_NAME MathFu) diff --git a/cmake/projects/Microsoft.GSL/hunter.cmake b/cmake/projects/Microsoft.GSL/hunter.cmake new file mode 100644 index 000000000..38f6037d9 --- /dev/null +++ b/cmake/projects/Microsoft.GSL/hunter.cmake @@ -0,0 +1,53 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + Microsoft.GSL + VERSION + 1.0.0-p0 + URL + "https://github.com/hunter-packages/Microsoft.GSL/archive/v1.0.0-p0.tar.gz" + SHA1 + 3cc3b9f2f7e5cde7827b8793ab6b4a8717511c9a +) + +hunter_add_version( + PACKAGE_NAME + Microsoft.GSL + VERSION + 1.0.0-p1 + URL + "https://github.com/hunter-packages/Microsoft.GSL/archive/v1.0.0-p1.tar.gz" + SHA1 + d38a9e318a1ad1d96d169cd91f0909f1dc85e0d7 +) + +hunter_add_version( + PACKAGE_NAME + Microsoft.GSL + VERSION + 2.0.0-p0 + URL + "https://github.com/hunter-packages/Microsoft.GSL/archive/v2.0.0-p0.tar.gz" + SHA1 + a94c9c1e41edf787a1c080b7cab8f2f4217dbc4b +) + +hunter_cmake_args( + Microsoft.GSL + CMAKE_ARGS + GSL_TEST=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Microsoft.GSL) +hunter_download(PACKAGE_NAME Microsoft.GSL) diff --git a/cmake/projects/NASM/hunter.cmake b/cmake/projects/NASM/hunter.cmake new file mode 100644 index 000000000..9cd7cbf18 --- /dev/null +++ b/cmake/projects/NASM/hunter.cmake @@ -0,0 +1,48 @@ +# Copyright (c) 2017, Zhuhao Wang +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_configuration_types) + +if(MINGW) + # NASM only supports a subset of VS compilers on Windows. + hunter_add_version( + PACKAGE_NAME + NASM + VERSION + "2.12.02" + URL + "http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/win32/nasm-2.12.02-win32.zip" + SHA1 + 07d7c742dcc1107d7a322db7a3a19065d7d1cbb4 + ) +else() + hunter_add_version( + PACKAGE_NAME + NASM + VERSION + "2.12.02" + URL + "http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/nasm-2.12.02.tar.gz" + SHA1 + 6d23d4be63f3a73d7df3053e65168f7906dd99e7 + ) +endif() + +if(MINGW OR MSYS) + hunter_pick_scheme(DEFAULT url_sha1_unpack_bin_install) +elseif(CMAKE_HOST_WIN32) + hunter_pick_scheme(DEFAULT url_sha1_nasm_windows) + hunter_cacheable(NASM) +else() + hunter_configuration_types(NASM CONFIGURATION_TYPES Release) + hunter_pick_scheme(DEFAULT url_sha1_autotools) + hunter_cacheable(NASM) +endif() + +hunter_download(PACKAGE_NAME NASM PACKAGE_INTERNAL_DEPS_ID "1") diff --git a/cmake/projects/NASM/schemes/url_sha1_nasm_windows.cmake.in b/cmake/projects/NASM/schemes/url_sha1_nasm_windows.cmake.in new file mode 100644 index 000000000..d44af3ff6 --- /dev/null +++ b/cmake/projects/NASM/schemes/url_sha1_nasm_windows.cmake.in @@ -0,0 +1,68 @@ +# Copyright (c) 2017, Zhuhao Wang +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +project(Hunter) + +include(ExternalProject) # ExternalProject_Add + +# Scheme for download and install NASM library for Windows + +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_status_debug) +include(hunter_assert_not_empty_string) + +hunter_status_debug("Scheme: url_sha1_nasm_windows") + +# Check preconditions +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_MSVC_ARCH@") +hunter_assert_not_empty_string("@HUNTER_MSVC_VCVARSALL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +ExternalProject_Add( + "@HUNTER_EP_NAME@" + URL + "@HUNTER_PACKAGE_URL@" + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + "@HUNTER_MSVC_VCVARSALL@" "@HUNTER_MSVC_ARCH@" + BUILD_COMMAND + nmake /f Mkfiles/msvc.mak + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + "@CMAKE_COMMAND@" + "-E" "make_directory" "@HUNTER_PACKAGE_INSTALL_PREFIX@/bin" + COMMAND + "@CMAKE_COMMAND@" + "-E" "copy" "nasm.exe" "ndisasm.exe" "@HUNTER_PACKAGE_INSTALL_PREFIX@/bin" + COMMAND + "@CMAKE_COMMAND@" + "-E" "copy_directory" "rdoff" "@HUNTER_PACKAGE_INSTALL_PREFIX@/bin" + COMMAND # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" +) diff --git a/cmake/projects/NLopt/hunter.cmake b/cmake/projects/NLopt/hunter.cmake new file mode 100644 index 000000000..9c4c3a93d --- /dev/null +++ b/cmake/projects/NLopt/hunter.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + NLopt + VERSION + 2.5.0-p0 + URL + "https://github.com/hunter-packages/nlopt/archive/v2.5.0-p0.tar.gz" + SHA1 + 30838bcdc191b6dae8af1d0e8f704fe51a0ad3ef +) + +hunter_cmake_args(NLopt CMAKE_ARGS + NLOPT_CXX=OFF + NLOPT_PYTHON=OFF + NLOPT_OCTAVE=OFF + NLOPT_MATLAB=OFF + NLOPT_GUILE=OFF + NLOPT_SWIG=OFF + NLOPT_TESTS=OFF + NLOPT_LINK_PYTHON=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(NLopt) +hunter_download(PACKAGE_NAME NLopt) diff --git a/cmake/projects/ONNX/hunter.cmake b/cmake/projects/ONNX/hunter.cmake new file mode 100644 index 000000000..9d825d8c4 --- /dev/null +++ b/cmake/projects/ONNX/hunter.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ONNX + VERSION + 1.4.1-p0 + URL + "https://github.com/hunter-packages/onnx/archive/v1.4.1-p0.tar.gz" + SHA1 + 70032d6e55c61a6716203cbf44a5773318d2f86e +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ONNX) +hunter_download(PACKAGE_NAME ONNX) diff --git a/cmake/projects/OpenAL/hunter.cmake b/cmake/projects/OpenAL/hunter.cmake new file mode 100644 index 000000000..be6b31b0c --- /dev/null +++ b/cmake/projects/OpenAL/hunter.cmake @@ -0,0 +1,16 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME OpenAL + VERSION "1.18.2" + URL "https://github.com/kcat/openal-soft/archive/openal-soft-1.18.2.tar.gz" + SHA1 "f819c6720c4beead7653ebc35fbb2c287a8970fc") + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(OpenAL) +hunter_download(PACKAGE_NAME OpenAL) diff --git a/cmake/projects/OpenCL-cpp/hunter.cmake b/cmake/projects/OpenCL-cpp/hunter.cmake new file mode 100644 index 000000000..c0fc35d4a --- /dev/null +++ b/cmake/projects/OpenCL-cpp/hunter.cmake @@ -0,0 +1,33 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + OpenCL-cpp + VERSION + "2.0.10-p0" + URL + "https://github.com/hunter-packages/OpenCL-CLHPP/archive/2.0.10-p0.tar.gz" + SHA1 + 78a41a5b5e40b9e1cdfb794df446fb4d05edfe42 +) + +hunter_cmake_args( + OpenCL-cpp + CMAKE_ARGS + BUILD_DOCS=OFF + BUILD_EXAMPLES=OFF + BUILD_TESTS=OFF +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(OpenCL-cpp) +hunter_download(PACKAGE_NAME OpenCL-cpp) diff --git a/cmake/projects/OpenCL/hunter.cmake b/cmake/projects/OpenCL/hunter.cmake new file mode 100644 index 000000000..d6a0632fb --- /dev/null +++ b/cmake/projects/OpenCL/hunter.cmake @@ -0,0 +1,43 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + OpenCL + VERSION + "2.1-p3" + URL + "https://github.com/hunter-packages/OpenCL-ICD-Loader/archive/2.1-p3.tar.gz" + SHA1 + be6a6c575088103f1b87c5202dc0f69e49b3764f +) + +hunter_add_version( + PACKAGE_NAME + OpenCL + VERSION + "2.1-p0" + URL + "https://github.com/hunter-packages/OpenCL-ICD-Loader/archive/2.1-p0.tar.gz" + SHA1 + 1cb4fed5bc4d0e1583c07e02f43daccab12eb99a +) + + +hunter_cmake_args( + OpenCL + CMAKE_ARGS + OPENCL_TESTS=OFF +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(OpenCL) +hunter_download(PACKAGE_NAME OpenCL) diff --git a/cmake/projects/OpenNMTTokenizer/hunter.cmake b/cmake/projects/OpenNMTTokenizer/hunter.cmake new file mode 100644 index 000000000..d70440dc0 --- /dev/null +++ b/cmake/projects/OpenNMTTokenizer/hunter.cmake @@ -0,0 +1,60 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + OpenNMTTokenizer + VERSION + 0.2.0-p0 + URL + "https://github.com/hunter-packages/OpenNMT-Tokenizer/archive/v0.2.0-p0.tar.gz" + SHA1 + 8d6025d92014586c5ff5a831c13b9238e6c07da8 +) + +hunter_add_version( + PACKAGE_NAME + OpenNMTTokenizer + VERSION + 0.2.0-p1 + URL + "https://github.com/hunter-packages/OpenNMT-Tokenizer/archive/v0.2.0-p1.tar.gz" + SHA1 + 33c75c6d22a79a0410b28a518b57a5b257762f1f +) + +hunter_add_version( + PACKAGE_NAME + OpenNMTTokenizer + VERSION + 1.11.0-p0 + URL + "https://github.com/hunter-packages/OpenNMT-Tokenizer/archive/v1.11.0-p0.tar.gz" + SHA1 + 1dc732b6c4d3a2e9e7c9b75e753fbc02680e8b17 +) + +hunter_add_version( + PACKAGE_NAME + OpenNMTTokenizer + VERSION + 1.11.0-p1 + URL + "https://github.com/hunter-packages/OpenNMT-Tokenizer/archive/v1.11.0-p1.tar.gz" + SHA1 + 0d557399a8e31ffa2208ad41c2a6c2bd38b3e9d4 +) + +hunter_cmake_args(OpenNMTTokenizer CMAKE_ARGS LIB_ONLY=YES WITH_ICU=YES) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(OpenNMTTokenizer) +hunter_download(PACKAGE_NAME OpenNMTTokenizer) diff --git a/cmake/projects/OpenSSL/ep-stages/configure.cmake.in b/cmake/projects/OpenSSL/ep-stages/configure.cmake.in new file mode 100644 index 000000000..da8558f47 --- /dev/null +++ b/cmake/projects/OpenSSL/ep-stages/configure.cmake.in @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.2) + +if(NOT "@NASM_ROOT@" STREQUAL "") + set(ENV{PATH} "@NASM_ROOT@/bin;$ENV{PATH}") +endif() + +if("@openssl_install_dir@" STREQUAL "") + message(FATAL_ERROR "openssl_install_dir is empty") +endif() + +execute_process(COMMAND + perl Configure @arch@ @opt@ "--prefix=@openssl_install_dir@" RESULT_VARIABLE result) + +if(NOT result EQUAL 0) + message(FATAL_ERROR "OpenSSL configure failed: ${result}") +endif() + +execute_process(COMMAND + "ms\\@do_ms@" RESULT_VARIABLE result) + +if(NOT result EQUAL 0) + message(FATAL_ERROR "OpenSSL do_ms failed: ${result}") +endif() diff --git a/cmake/projects/OpenSSL/ep-stages/configure_1_1_plus.cmake.in b/cmake/projects/OpenSSL/ep-stages/configure_1_1_plus.cmake.in new file mode 100644 index 000000000..d49e53327 --- /dev/null +++ b/cmake/projects/OpenSSL/ep-stages/configure_1_1_plus.cmake.in @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.2) + +if(NOT "@NASM_ROOT@" STREQUAL "") + set(ENV{PATH} "@NASM_ROOT@/bin;$ENV{PATH}") +endif() + +if("@openssl_install_dir@" STREQUAL "") + message(FATAL_ERROR "openssl_install_dir is empty") +endif() + +if("@openssl_dir@" STREQUAL "") + message(FATAL_ERROR "openssl_dir is empty") +endif() + +execute_process(COMMAND + perl Configure @arch@ @opt@ @shared@ "--prefix=@openssl_install_dir@" "--openssldir=@openssl_dir@" RESULT_VARIABLE result) + +if(NOT result EQUAL 0) + message(FATAL_ERROR "OpenSSL configure failed: ${result}") +endif() + +execute_process(COMMAND + nmake RESULT_VARIABLE result) + +if(NOT result EQUAL 0) + message(FATAL_ERROR "OpenSSL nmake failed: ${result}") +endif() diff --git a/cmake/projects/OpenSSL/schemes/url_sha1_openssl_macos.cmake.in b/cmake/projects/OpenSSL/schemes/url_sha1_openssl_macos.cmake.in new file mode 100644 index 000000000..2f79aa2e4 --- /dev/null +++ b/cmake/projects/OpenSSL/schemes/url_sha1_openssl_macos.cmake.in @@ -0,0 +1,209 @@ +# Copyright (c) 2013, 2015 Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +project(Hunter) + +include(ExternalProject) # ExternalProject_Add + +# Scheme for download and install OpenSSL macOS universal library + +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_dump_cmake_flags) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_unsetvar) +include(hunter_user_error) + +hunter_status_debug("Scheme: url_sha1_openssl_macos") + +# Check preconditions +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +# Supported macOS architectures: +# i386, x86_64, ppc, ppc64 +set(configure_command "./Configure") +set(configure_architectures @CMAKE_OSX_ARCHITECTURES@) + +if(NOT configure_architectures) + hunter_status_debug("Using default macOS architecture: x86_64") + set(configure_architectures "x86_64") +endif() + +# OpenSSL appends the version number differently by version +if("@HUNTER_OpenSSL_VERSION@" VERSION_LESS "1.0") + string(REGEX MATCH "^[0-9\\.]+" shared_library_version_extension "@HUNTER_OpenSSL_VERSION@") +else() + string(REGEX MATCH "^[0-9]\\.[0-9]" shared_library_version_extension "@HUNTER_OpenSSL_VERSION@") + if("@HUNTER_OpenSSL_VERSION@" VERSION_LESS "1.1") + set(shared_library_version_extension "${shared_library_version_extension}.0") + endif() +endif() + +if(BUILD_SHARED_LIBS) + set(libsuffix ".${shared_library_version_extension}.dylib") + set(shared_flag shared) +else() + set(libsuffix ".a") + set(shared_flag no-shared) +endif() + +hunter_unsetvar(ssl_libraries) +hunter_unsetvar(crypto_libraries) +foreach(arch ${configure_architectures}) + list(APPEND ssl_libraries "@HUNTER_PACKAGE_SOURCE_DIR@/${arch}/libssl${libsuffix}") + list(APPEND crypto_libraries "@HUNTER_PACKAGE_SOURCE_DIR@/${arch}/libcrypto${libsuffix}") +endforeach() + +# Skip position independent code flags for macOS +hunter_dump_cmake_flags(SKIP_INCLUDES SKIP_PIC) +# -> CMAKE_CXX_FLAGS +# -> CMAKE_C_FLAGS + +string(REGEX REPLACE "^ " "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") + +# Pass C compiler through +set(configure_command + MACHINE=${CMAKE_SYSTEM_PROCESSOR} + CC=${CMAKE_C_COMPILER} + ${configure_command}) + +# Pass C flags through +set(configure_opts ${CMAKE_C_FLAGS}) + +# Add clear-all to commands +set(configure_command . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && "${configure_command}") +set(build_command . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && make) + +# Configuration options +set(configure_opts ${configure_opts} threads ${shared_flag}) + +hunter_status_debug("Configure command: ${configure_command}") +hunter_status_debug("Configure architectures: ${configure_architectures}") +hunter_status_debug("Configure options: ${configure_opts}") + +if(BUILD_SHARED_LIBS) + set( + extra_install_commands + # Fix shared library paths + COMMAND + install_name_tool + -id + "@loader_path/../lib/libssl${libsuffix}" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/libssl${libsuffix}" + COMMAND + install_name_tool + -change + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/libcrypto${libsuffix}" + "@loader_path/../lib/libcrypto${libsuffix}" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/libssl${libsuffix}" + COMMAND + install_name_tool + -id + "@loader_path/../lib/libcrypto${libsuffix}" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/libcrypto${libsuffix}" + ) +else() + set(extra_install_commands "") +endif() + +# fuse all libraries with 'lipo' +list(GET configure_architectures 0 first_architecture) +ExternalProject_Add( + "@HUNTER_EP_NAME@-macos_universal" + DOWNLOAD_COMMAND + "@CMAKE_COMMAND@" -E echo "Dummy download command" + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@/macos_universal" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + "@CMAKE_COMMAND@" -E echo "Dummy configure command" + BUILD_COMMAND + "@CMAKE_COMMAND@" -E echo "Dummy build command" + INSTALL_COMMAND + lipo + -create + ${ssl_libraries} + -o + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/libssl${libsuffix}" + COMMAND + lipo + -create + ${crypto_libraries} + -o + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/libcrypto${libsuffix}" + # Extra commands + ${extra_install_commands} + COMMAND # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@/${first_architecture}" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" +) + +foreach(arch ${configure_architectures}) + if("${arch}" STREQUAL "x86_64") + set(configure_arch "darwin64-x86_64-cc") + elseif("${arch}" STREQUAL "ppc64") + set(configure_arch "darwin64-ppc-cc") + elseif("${arch}" STREQUAL "i386") + set(configure_arch "darwin-i386-cc") + elseif("${arch}" STREQUAL "ppc") + set(configure_arch "darwin-ppc-cc") + else() + hunter_user_error("Could not find the macOS architecture ${arch}. Please update the CMAKE_OSX_ARCHITECTURES option in your toolchain.") + endif() + + ExternalProject_Add( + "@HUNTER_EP_NAME@-${arch}" + URL + @HUNTER_PACKAGE_URL@ + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@/${arch}" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + "${configure_command}" + "${configure_arch}" + "${configure_opts}" + "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@" + BUILD_COMMAND + "${build_command}" + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + make install_sw + # installed libraries will be rewrited, + # other files are equal + ) + + add_dependencies( + "@HUNTER_EP_NAME@-macos_universal" + "@HUNTER_EP_NAME@-${arch}" + ) +endforeach() diff --git a/cmake/projects/OpenSceneGraph/hunter.cmake b/cmake/projects/OpenSceneGraph/hunter.cmake new file mode 100644 index 000000000..8cd913c83 --- /dev/null +++ b/cmake/projects/OpenSceneGraph/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + OpenSceneGraph + VERSION + "3.6.3-p0" + URL + "https://github.com/hunter-packages/OpenSceneGraph/archive/v3.6.3-p0.tar.gz" + SHA1 + 0c9eab9364fa1d2d0451c565650851a167f02fe4 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(OpenSceneGraph) +hunter_download(PACKAGE_NAME OpenSceneGraph) diff --git a/cmake/projects/PROJ4/hunter.cmake b/cmake/projects/PROJ4/hunter.cmake new file mode 100644 index 000000000..e9ee30219 --- /dev/null +++ b/cmake/projects/PROJ4/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + PROJ4 + VERSION + 5.0.0 + URL + "https://github.com/OSGeo/proj.4/releases/download/5.0.1/proj-5.0.1.tar.gz" + SHA1 + 4ADD83369C6F29637D806D51CDCA7378181E53FF +) + +hunter_cmake_args( + PROJ4 + CMAKE_ARGS + BUILD_TESTING=OFF + PROJ4_TESTS=OFF + BUILD_CCT=OFF + BUILD_CS2CS=OFF + BUILD_GEOD=OFF + BUILD_GIE=OFF + BUILD_NAD2BIN=OFF + BUILD_PROJ=OFF + + INCLUDEDIR=include + LIBDIR=lib + CMAKECONFIGDIR=lib/cmake/PROJ4 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(PROJ4) +hunter_download(PACKAGE_NAME PROJ4) diff --git a/cmake/projects/PhysUnits/hunter.cmake b/cmake/projects/PhysUnits/hunter.cmake new file mode 100644 index 000000000..21e75d740 --- /dev/null +++ b/cmake/projects/PhysUnits/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + PhysUnits + VERSION + 1.1.0-p0 + URL + "https://github.com/martinmoene/PhysUnits-CT-Cpp11/archive/12eafc669d0710b02536dcd8d2f96ae6bc69601b.tar.gz" + SHA1 + 14064acf4a04c08150ca9749e0e52b6bb8ee9cbc +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(PhysUnits) +hunter_download(PACKAGE_NAME PhysUnits) diff --git a/cmake/projects/Qt/qtcharts/hunter.cmake b/cmake/projects/Qt/qtcharts/hunter.cmake new file mode 100644 index 000000000..7762c8744 --- /dev/null +++ b/cmake/projects/Qt/qtcharts/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtcharts" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtcharts" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtcharts" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtcharts" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtcharts" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtcharts" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtcharts" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtcharts" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtcharts" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtcharts" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtcharts" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtcharts" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtcharts" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtcharts" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtcharts" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtcharts" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtcharts" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtcharts" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtcharts" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtcharts" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtcharts" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtcharts" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtcharts" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtcharts" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtcharts" + ) + return() +endif() + +string(COMPARE EQUAL "qtcharts" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtcharts" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtdatavis3d/hunter.cmake b/cmake/projects/Qt/qtdatavis3d/hunter.cmake new file mode 100644 index 000000000..33a938e37 --- /dev/null +++ b/cmake/projects/Qt/qtdatavis3d/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtdatavis3d" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtdatavis3d" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtdatavis3d" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtdatavis3d" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtdatavis3d" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtdatavis3d" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtdatavis3d" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtdatavis3d" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtdatavis3d" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtdatavis3d" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtdatavis3d" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtdatavis3d" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtdatavis3d" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtdatavis3d" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtdatavis3d" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtdatavis3d" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtdatavis3d" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtdatavis3d" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtdatavis3d" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtdatavis3d" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtdatavis3d" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtdatavis3d" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtdatavis3d" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtdatavis3d" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtdatavis3d" + ) + return() +endif() + +string(COMPARE EQUAL "qtdatavis3d" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtdatavis3d" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtdocgallery/hunter.cmake b/cmake/projects/Qt/qtdocgallery/hunter.cmake new file mode 100644 index 000000000..abc6f3440 --- /dev/null +++ b/cmake/projects/Qt/qtdocgallery/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtdocgallery" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtdocgallery" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtdocgallery" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtdocgallery" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtdocgallery" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtdocgallery" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtdocgallery" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtdocgallery" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtdocgallery" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtdocgallery" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtdocgallery" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtdocgallery" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtdocgallery" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtdocgallery" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtdocgallery" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtdocgallery" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtdocgallery" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtdocgallery" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtdocgallery" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtdocgallery" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtdocgallery" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtdocgallery" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtdocgallery" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtdocgallery" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtdocgallery" + ) + return() +endif() + +string(COMPARE EQUAL "qtdocgallery" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtdocgallery" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtfeedback/hunter.cmake b/cmake/projects/Qt/qtfeedback/hunter.cmake new file mode 100644 index 000000000..9fc55f8c9 --- /dev/null +++ b/cmake/projects/Qt/qtfeedback/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtfeedback" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtfeedback" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtfeedback" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtfeedback" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtfeedback" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtfeedback" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtfeedback" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtfeedback" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtfeedback" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtfeedback" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtfeedback" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtfeedback" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtfeedback" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtfeedback" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtfeedback" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtfeedback" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtfeedback" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtfeedback" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtfeedback" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtfeedback" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtfeedback" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtfeedback" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtfeedback" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtfeedback" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtfeedback" + ) + return() +endif() + +string(COMPARE EQUAL "qtfeedback" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtfeedback" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtgamepad/hunter.cmake b/cmake/projects/Qt/qtgamepad/hunter.cmake new file mode 100644 index 000000000..c29c42279 --- /dev/null +++ b/cmake/projects/Qt/qtgamepad/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtgamepad" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtgamepad" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtgamepad" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtgamepad" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtgamepad" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtgamepad" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtgamepad" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtgamepad" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtgamepad" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtgamepad" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtgamepad" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtgamepad" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtgamepad" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtgamepad" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtgamepad" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtgamepad" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtgamepad" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtgamepad" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtgamepad" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtgamepad" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtgamepad" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtgamepad" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtgamepad" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtgamepad" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtgamepad" + ) + return() +endif() + +string(COMPARE EQUAL "qtgamepad" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtgamepad" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtnetworkauth/hunter.cmake b/cmake/projects/Qt/qtnetworkauth/hunter.cmake new file mode 100644 index 000000000..ec7d2ef57 --- /dev/null +++ b/cmake/projects/Qt/qtnetworkauth/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtnetworkauth" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtnetworkauth" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtnetworkauth" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtnetworkauth" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtnetworkauth" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtnetworkauth" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtnetworkauth" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtnetworkauth" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtnetworkauth" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtnetworkauth" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtnetworkauth" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtnetworkauth" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtnetworkauth" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtnetworkauth" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtnetworkauth" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtnetworkauth" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtnetworkauth" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtnetworkauth" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtnetworkauth" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtnetworkauth" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtnetworkauth" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtnetworkauth" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtnetworkauth" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtnetworkauth" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtnetworkauth" + ) + return() +endif() + +string(COMPARE EQUAL "qtnetworkauth" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtnetworkauth" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtpim/hunter.cmake b/cmake/projects/Qt/qtpim/hunter.cmake new file mode 100644 index 000000000..72d523a4b --- /dev/null +++ b/cmake/projects/Qt/qtpim/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtpim" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtpim" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtpim" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtpim" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtpim" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtpim" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtpim" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtpim" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtpim" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtpim" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtpim" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtpim" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtpim" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtpim" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtpim" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtpim" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtpim" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtpim" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtpim" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtpim" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtpim" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtpim" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtpim" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtpim" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtpim" + ) + return() +endif() + +string(COMPARE EQUAL "qtpim" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtpim" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtpurchasing/hunter.cmake b/cmake/projects/Qt/qtpurchasing/hunter.cmake new file mode 100644 index 000000000..b7a7cbc49 --- /dev/null +++ b/cmake/projects/Qt/qtpurchasing/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtpurchasing" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtpurchasing" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtpurchasing" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtpurchasing" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtpurchasing" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtpurchasing" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtpurchasing" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtpurchasing" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtpurchasing" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtpurchasing" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtpurchasing" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtpurchasing" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtpurchasing" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtpurchasing" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtpurchasing" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtpurchasing" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtpurchasing" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtpurchasing" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtpurchasing" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtpurchasing" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtpurchasing" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtpurchasing" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtpurchasing" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtpurchasing" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtpurchasing" + ) + return() +endif() + +string(COMPARE EQUAL "qtpurchasing" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtpurchasing" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtqa/hunter.cmake b/cmake/projects/Qt/qtqa/hunter.cmake new file mode 100644 index 000000000..134cf0527 --- /dev/null +++ b/cmake/projects/Qt/qtqa/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtqa" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtqa" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtqa" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtqa" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtqa" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtqa" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtqa" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtqa" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtqa" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtqa" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtqa" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtqa" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtqa" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtqa" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtqa" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtqa" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtqa" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtqa" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtqa" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtqa" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtqa" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtqa" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtqa" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtqa" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtqa" + ) + return() +endif() + +string(COMPARE EQUAL "qtqa" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtqa" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtremoteobjects/hunter.cmake b/cmake/projects/Qt/qtremoteobjects/hunter.cmake new file mode 100644 index 000000000..95e4dbc26 --- /dev/null +++ b/cmake/projects/Qt/qtremoteobjects/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtremoteobjects" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtremoteobjects" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtremoteobjects" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtremoteobjects" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtremoteobjects" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtremoteobjects" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtremoteobjects" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtremoteobjects" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtremoteobjects" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtremoteobjects" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtremoteobjects" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtremoteobjects" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtremoteobjects" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtremoteobjects" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtremoteobjects" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtremoteobjects" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtremoteobjects" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtremoteobjects" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtremoteobjects" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtremoteobjects" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtremoteobjects" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtremoteobjects" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtremoteobjects" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtremoteobjects" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtremoteobjects" + ) + return() +endif() + +string(COMPARE EQUAL "qtremoteobjects" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtremoteobjects" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtrepotools/hunter.cmake b/cmake/projects/Qt/qtrepotools/hunter.cmake new file mode 100644 index 000000000..9fe27fa5e --- /dev/null +++ b/cmake/projects/Qt/qtrepotools/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtrepotools" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtrepotools" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtrepotools" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtrepotools" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtrepotools" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtrepotools" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtrepotools" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtrepotools" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtrepotools" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtrepotools" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtrepotools" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtrepotools" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtrepotools" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtrepotools" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtrepotools" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtrepotools" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtrepotools" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtrepotools" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtrepotools" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtrepotools" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtrepotools" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtrepotools" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtrepotools" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtrepotools" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtrepotools" + ) + return() +endif() + +string(COMPARE EQUAL "qtrepotools" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtrepotools" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtscxml/hunter.cmake b/cmake/projects/Qt/qtscxml/hunter.cmake new file mode 100644 index 000000000..f15da9e83 --- /dev/null +++ b/cmake/projects/Qt/qtscxml/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtscxml" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtscxml" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtscxml" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtscxml" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtscxml" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtscxml" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtscxml" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtscxml" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtscxml" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtscxml" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtscxml" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtscxml" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtscxml" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtscxml" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtscxml" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtscxml" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtscxml" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtscxml" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtscxml" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtscxml" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtscxml" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtscxml" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtscxml" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtscxml" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtscxml" + ) + return() +endif() + +string(COMPARE EQUAL "qtscxml" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtscxml" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtserialbus/hunter.cmake b/cmake/projects/Qt/qtserialbus/hunter.cmake new file mode 100644 index 000000000..792f58858 --- /dev/null +++ b/cmake/projects/Qt/qtserialbus/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtserialbus" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtserialbus" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtserialbus" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtserialbus" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtserialbus" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtserialbus" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtserialbus" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtserialbus" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtserialbus" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtserialbus" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtserialbus" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtserialbus" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtserialbus" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtserialbus" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtserialbus" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtserialbus" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtserialbus" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtserialbus" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtserialbus" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtserialbus" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtserialbus" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtserialbus" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtserialbus" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtserialbus" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtserialbus" + ) + return() +endif() + +string(COMPARE EQUAL "qtserialbus" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtserialbus" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtspeech/hunter.cmake b/cmake/projects/Qt/qtspeech/hunter.cmake new file mode 100644 index 000000000..c4fd8df97 --- /dev/null +++ b/cmake/projects/Qt/qtspeech/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtspeech" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtspeech" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtspeech" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtspeech" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtspeech" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtspeech" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtspeech" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtspeech" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtspeech" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtspeech" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtspeech" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtspeech" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtspeech" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtspeech" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtspeech" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtspeech" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtspeech" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtspeech" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtspeech" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtspeech" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtspeech" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtspeech" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtspeech" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtspeech" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtspeech" + ) + return() +endif() + +string(COMPARE EQUAL "qtspeech" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtspeech" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtsystems/hunter.cmake b/cmake/projects/Qt/qtsystems/hunter.cmake new file mode 100644 index 000000000..111dbe766 --- /dev/null +++ b/cmake/projects/Qt/qtsystems/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtsystems" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtsystems" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtsystems" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtsystems" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtsystems" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtsystems" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtsystems" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtsystems" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtsystems" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtsystems" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtsystems" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtsystems" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtsystems" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtsystems" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtsystems" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtsystems" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtsystems" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtsystems" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtsystems" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtsystems" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtsystems" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtsystems" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtsystems" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtsystems" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtsystems" + ) + return() +endif() + +string(COMPARE EQUAL "qtsystems" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtsystems" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/Qt/qtvirtualkeyboard/hunter.cmake b/cmake/projects/Qt/qtvirtualkeyboard/hunter.cmake new file mode 100644 index 000000000..ef1481979 --- /dev/null +++ b/cmake/projects/Qt/qtvirtualkeyboard/hunter.cmake @@ -0,0 +1,146 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_package) +include(hunter_download) +include(hunter_generate_qt_info) +include(hunter_pick_scheme) +include(hunter_status_debug) + +## 5.5 only -- +string(COMPARE EQUAL "qtvirtualkeyboard" "qtquick1" _is_qtquick1) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtwebkit" _is_qtwebkit) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtwebkit-examples" _is_qtwebkit_examples) + +if(_is_qtquick1 OR _is_qtwebkit OR _is_qtwebkit_examples) + if(NOT HUNTER_Qt_VERSION MATCHES "^5\\.5\\.") + return() + endif() +endif() +## -- end + +## 5.6+ only -- +string(COMPARE EQUAL "qtvirtualkeyboard" "qtquickcontrol2" _is_qtquickcontrols2) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtwebview" _is_qtwebview) + +if(_is_qtquickcontrols2 OR _is_qtwebview) + if(HUNTER_Qt_VERSION MATCHES "^5\\.6\\.") + # Qt 5.6.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + else() + return() + endif() +endif() +## -- end + +## 5.9+ only -- +string(COMPARE EQUAL "qtvirtualkeyboard" "qtcharts" _is_qtcharts) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtdatavis3d" _is_qtdatavis3d) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtdocgallery" _is_qtdocgallery) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtfeedback" _is_qtfeedback) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtgamepad" _is_qtgamepad) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtnetworkauth" _is_qtnetworkauth) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtpim" _is_qtpim) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtpurchasing" _is_qtpurchasing) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtqa" _is_qtqa) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtremoteobjects" _is_qtremoteobjects) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtrepotools" _is_qtrepotools) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtscxml" _is_qtscxml) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtserialbus" _is_qtserialbus) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtspeech" _is_qtspeech) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtsystems" _is_qtsystems) +string(COMPARE EQUAL "qtvirtualkeyboard" "qtvirtualkeyboard" _is_qtvirtualkeyboard) + +if( + _is_qtcharts OR + _is_qtdatavis3d OR + _is_qtdocgallery OR + _is_qtfeedback OR + _is_qtgamepad OR + _is_qtnetworkauth OR + _is_qtpim OR + _is_qtpurchasing OR + _is_qtqa OR + _is_qtremoteobjects OR + _is_qtrepotools OR + _is_qtscxml OR + _is_qtserialbus OR + _is_qtspeech OR + _is_qtsystems OR + _is_qtvirtualkeyboard +) + if(HUNTER_Qt_VERSION MATCHES "^5\\.9\\.") + # Qt 5.9.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.10\\.") + # Qt 5.10.* + elseif(HUNTER_Qt_VERSION MATCHES "^5\\.11\\.") + # Qt 5.11.* + else() + return() + endif() +endif() +## -- end + +if(NOT _HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES) + # '_depends_on' will return **all** dependencies of the component so there is + # no need to traverse them recursively (optimization) + hunter_generate_qt_info( + "qtvirtualkeyboard" + _unused_toskip + _depends_on + _unused_nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" + ) + + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES TRUE) + foreach(_x ${_depends_on}) + hunter_add_package(Qt COMPONENTS ${_x}) + endforeach() + set(_HUNTER_INTERNAL_LOADING_QT_DEPENDENCIES FALSE) +endif() + +# We should call this function again since hunter_add_package is include-like +# instruction, i.e. will overwrite variable values (foreach's _x will survive) +hunter_generate_qt_info( + "qtvirtualkeyboard" + _unused_toskip + _unused_depends_on + _nobuild + "${HUNTER_Qt_VERSION}" + "${ANDROID}" + "${WIN32}" +) + +list(FIND _nobuild "qtvirtualkeyboard" _dont_build_it) +if(NOT _dont_build_it EQUAL -1) + hunter_status_debug( + "Qt component doesn't install anything and will be skipped: qtvirtualkeyboard" + ) + return() +endif() + +string(COMPARE EQUAL "qtvirtualkeyboard" "qtdeclarative" _is_qtdeclarative) +if(WIN32 AND _is_qtdeclarative) + find_program(_python_path NAME "python" PATHS ENV PATH) + if(NOT _python_path) + hunter_user_error( + "Python not found in PATH:\n $ENV{PATH}\n" + "Python required for building Qt component (qtdeclarative):\n" + " http://doc.qt.io/qt-5/windows-requirements.html" + ) + endif() +endif() + +hunter_pick_scheme(DEFAULT url_sha1_qt) +hunter_download( + PACKAGE_NAME Qt + PACKAGE_COMPONENT "qtvirtualkeyboard" + PACKAGE_INTERNAL_DEPS_ID "14" +) diff --git a/cmake/projects/QtPropertyEditor/hunter.cmake b/cmake/projects/QtPropertyEditor/hunter.cmake new file mode 100644 index 000000000..16a234b85 --- /dev/null +++ b/cmake/projects/QtPropertyEditor/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + QtPropertyEditor + VERSION + 2.1.3-p0 + URL + "https://github.com/hunter-packages/QtPropertyEditor/archive/v2.1.3-p0.tar.gz" + SHA1 + e566457c8f44cbb00d3001d659ed4e164ea57fdf +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(QtPropertyEditor) +hunter_download(PACKAGE_NAME QtPropertyEditor) diff --git a/cmake/projects/Qwt/hunter.cmake b/cmake/projects/Qwt/hunter.cmake new file mode 100644 index 000000000..7d8c9c284 --- /dev/null +++ b/cmake/projects/Qwt/hunter.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + Qwt + VERSION + 6.1-p3 + URL + https://github.com/hunter-packages/Qwt/archive/6.1-p3.tar.gz + SHA1 + 9db2e7c254c181b43de414b05cca38152e4b6f88 +) + +hunter_cmake_args( + Qwt + CMAKE_ARGS + LIBQWT_ENABLE_PLOT=ON + LIBQWT_ENABLE_WIDGETS=ON + LIBQWT_ENABLE_MATHML=OFF + LIBQWT_ENABLE_OPENGL=ON + LIBQWT_ENABLE_SVG=ON + +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Qwt) +hunter_download(PACKAGE_NAME Qwt) diff --git a/cmake/projects/RapidXML/hunter.cmake b/cmake/projects/RapidXML/hunter.cmake new file mode 100644 index 000000000..b0514b997 --- /dev/null +++ b/cmake/projects/RapidXML/hunter.cmake @@ -0,0 +1,21 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + RapidXML + VERSION + "1.13" + URL + "https://github.com/hunter-packages/rapidxml/archive/v1.13-hunter.tar.gz" + SHA1 + d7f9b263a4c1e90dca488d3cf040364339ff09e2 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(RapidXML) +hunter_download(PACKAGE_NAME RapidXML) diff --git a/cmake/projects/RedisClient/hunter.cmake b/cmake/projects/RedisClient/hunter.cmake new file mode 100644 index 000000000..edc7a49fe --- /dev/null +++ b/cmake/projects/RedisClient/hunter.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + RedisClient + VERSION + 0.6.1-p1 + URL + "https://github.com/hunter-packages/redisclient/archive/v0.6.1-p1.tar.gz" + SHA1 + 0f105334715b512a6c08118b232f6b2f05ce8274 +) + +hunter_cmake_args( + RedisClient + CMAKE_ARGS + BUILD_TEST=OFF + BUILD_EXAMPLES=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(RedisClient) +hunter_download(PACKAGE_NAME RedisClient) diff --git a/cmake/projects/SDL_image/hunter.cmake b/cmake/projects/SDL_image/hunter.cmake new file mode 100644 index 000000000..b6d93d165 --- /dev/null +++ b/cmake/projects/SDL_image/hunter.cmake @@ -0,0 +1,22 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +hunter_add_version( + PACKAGE_NAME + SDL_image + VERSION + "2.0.1-p1" + URL + "https://github.com/hunter-packages/SDL_image_cmake/archive/2.0.1-p1.tar.gz" + SHA1 + 8f644d026256f48f0e2ba5411422eaf2a91c0463 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(SDL_image) +hunter_download(PACKAGE_NAME SDL_image) diff --git a/cmake/projects/SDL_mixer/hunter.cmake b/cmake/projects/SDL_mixer/hunter.cmake new file mode 100644 index 000000000..331de5ef8 --- /dev/null +++ b/cmake/projects/SDL_mixer/hunter.cmake @@ -0,0 +1,33 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +hunter_add_version( + PACKAGE_NAME + SDL_mixer + VERSION + "2.0.1-p1" + URL + "https://github.com/hunter-packages/SDL_mixer/archive/v2.0.1-p1.tar.gz" + SHA1 + b4e97fb430309d5218185afa702f16f0129678be +) + +hunter_add_version( + PACKAGE_NAME + SDL_mixer + VERSION + "2.0.2-p0" + URL + "https://github.com/hunter-packages/SDL_mixer/archive/v2.0.2-p0.tar.gz" + SHA1 + a5c33841d5546611dd707a24553e9bf22cbc24f4 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(SDL_mixer) +hunter_download(PACKAGE_NAME SDL_mixer) diff --git a/cmake/projects/SDL_ttf/hunter.cmake b/cmake/projects/SDL_ttf/hunter.cmake new file mode 100644 index 000000000..2e94083b7 --- /dev/null +++ b/cmake/projects/SDL_ttf/hunter.cmake @@ -0,0 +1,22 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + SDL_ttf + VERSION + "2.0.14-p0" + URL + "https://github.com/hunter-packages/SDL_ttf/archive/v2.0.14-p0.tar.gz" + SHA1 + cd7f7806b5de657081d558ef1c12033c43522efe +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(SDL_ttf) +hunter_download(PACKAGE_NAME SDL_ttf) diff --git a/cmake/projects/SimpleSignal/hunter.cmake b/cmake/projects/SimpleSignal/hunter.cmake new file mode 100644 index 000000000..53ca0de11 --- /dev/null +++ b/cmake/projects/SimpleSignal/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + SimpleSignal + VERSION + 0.0.0-79c3f68-p1 + URL + "https://github.com/hunter-packages/SimpleSignal/archive/v0.0.0-79c3f68-p1.tar.gz" + SHA1 + 27ab940b3d803bb19311b993c76dfaf675aabfdd +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(SimpleSignal) +hunter_download(PACKAGE_NAME SimpleSignal) diff --git a/cmake/projects/Snappy/hunter.cmake b/cmake/projects/Snappy/hunter.cmake new file mode 100644 index 000000000..ad357bf20 --- /dev/null +++ b/cmake/projects/Snappy/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2019, Pawel Bylica +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + Snappy + VERSION + 1.1.6-p0 + URL + "https://github.com/google/snappy/archive/77c12adc192ac6620a0f0d340c99149ec56a97a3.tar.gz" + SHA1 + 5f26e7130061e41faa0b7d500a132d8c08a92a48 +) + +hunter_add_version( + PACKAGE_NAME + Snappy + VERSION + 1.1.7 + URL + "https://github.com/google/snappy/archive/1.1.7.tar.gz" + SHA1 + 1ec676b842fc96fd8a95b03c12758935e7f257b0 +) + +hunter_cmake_args( + Snappy + CMAKE_ARGS + SNAPPY_BUILD_TESTS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Snappy) +hunter_download(PACKAGE_NAME Snappy) diff --git a/cmake/projects/Sqlpp11/hunter.cmake b/cmake/projects/Sqlpp11/hunter.cmake new file mode 100644 index 000000000..22db33c4c --- /dev/null +++ b/cmake/projects/Sqlpp11/hunter.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + Sqlpp11 + VERSION + 0.57-p0 + URL + https://github.com/hunter-packages/sqlpp11/archive/v0.57-p0.tar.gz + SHA1 + 472f23489f9a063d2b9a492910ea59a36bc55263 +) + +hunter_cmake_args(Sqlpp11 CMAKE_ARGS + ENABLE_TESTS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Sqlpp11) +hunter_download(PACKAGE_NAME Sqlpp11) + diff --git a/cmake/projects/SuiteSparse/hunter.cmake b/cmake/projects/SuiteSparse/hunter.cmake new file mode 100644 index 000000000..7a53db434 --- /dev/null +++ b/cmake/projects/SuiteSparse/hunter.cmake @@ -0,0 +1,66 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +hunter_cacheable(SuiteSparse) + +# List of versions here... +## suitesparse-metis-for-windows version is 1.3.1 +## suitesparse library version is 4.5.1 +hunter_add_version( + PACKAGE_NAME + SuiteSparse + VERSION + "4.5.1-p1" + URL + "https://github.com/hunter-packages/suitesparse-metis-for-windows/archive/v1.3.1-p1.tar.gz" + SHA1 + b5c678a7dbb88ff60e454c9f93c30b618d8451ac +) +hunter_add_version( + PACKAGE_NAME + SuiteSparse + VERSION + "4.5.1-p0" + URL + "https://github.com/hunter-packages/suitesparse-metis-for-windows/archive/v1.3.1-p0.tar.gz" + SHA1 + 1350eab5d1a8d488e7b28d217fa751906d4767da +) +## suitesparse-metis-for-windows version is 1.4.0 +## suitesparse library version is 5.1.2 +hunter_add_version( + PACKAGE_NAME + SuiteSparse + VERSION + "5.1.2-p0" + URL + "https://github.com/hunter-packages/suitesparse-metis-for-windows/archive/v1.4.0-p0.tar.gz" + SHA1 + 6ea701f288a51bc57f1db5918c6b0879d800ed28 +) + + +hunter_cmake_args( + SuiteSparse + CMAKE_ARGS + BUILD_METIS=NO + HUNTER_INSTALL_LICENSE_FILES=LICENSE.md +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) + +# Download package. +# Two versions of library will be build: +# * libexample_A.a +# * libexample_Ad.a +hunter_download(PACKAGE_NAME SuiteSparse) diff --git a/cmake/projects/TCLAP/hunter.cmake b/cmake/projects/TCLAP/hunter.cmake new file mode 100644 index 000000000..6a2ac3fb0 --- /dev/null +++ b/cmake/projects/TCLAP/hunter.cmake @@ -0,0 +1,27 @@ + +# by Cyberunner23 +# for the Hunter project + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + TCLAP + VERSION + 1.2.2-p1 + URL + "https://github.com/hunter-packages/tclap/archive/v1.2.2-p1.zip" + SHA1 + c31f3b37c5f1cc34e802000e338d3f04a4d5da79 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(TCLAP) +hunter_download(PACKAGE_NAME TCLAP) + diff --git a/cmake/projects/Tesseract/hunter.cmake b/cmake/projects/Tesseract/hunter.cmake new file mode 100644 index 000000000..294a6ecd0 --- /dev/null +++ b/cmake/projects/Tesseract/hunter.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + Tesseract + VERSION + "3.05.01-hunter-3" + URL + "https://github.com/hunter-packages/tesseract/archive/v3.05.01-hunter-3.tar.gz" + SHA1 + 0ccf9537a17634448618b21d3fd26537a26b94ae +) + +if(ANDROID OR MINGW) + hunter_cmake_args( + Tesseract + CMAKE_ARGS + Tesseract_USE_OPENCL=OFF +) +endif() + + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Tesseract) +hunter_download(PACKAGE_NAME Tesseract) diff --git a/cmake/projects/Urho3D/hunter.cmake b/cmake/projects/Urho3D/hunter.cmake new file mode 100644 index 000000000..9b175ed3a --- /dev/null +++ b/cmake/projects/Urho3D/hunter.cmake @@ -0,0 +1,139 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p2 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p2.tar.gz" + SHA1 + c828fad52e40475e34aa9829eb733dfe690b8942 +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p4 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p4.tar.gz" + SHA1 + af0daeaa7be483ed98830b5080cfab54976db47e +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p5 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p5.tar.gz" + SHA1 + 42bc93e302c8e35312fa966f4a9b1faf3ac8db7f +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p6 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p6.tar.gz" + SHA1 + b75bc0de6ff64c403f45a39d27d60a7cd6363038 +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p7 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p7.tar.gz" + SHA1 + 66b296e00edee7ba65c211a892e5ac0ae9a8877d +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p8 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p8.tar.gz" + SHA1 + c150a5495a317ad2d92187d31388d42a8d413434 +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p9 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p9.tar.gz" + SHA1 + df696bba70384368a703c3650988e91951ce51f1 +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p12 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p12.tar.gz" + SHA1 + 1c6258cce46018d8386cf836bfda8fdfbfe225f6 +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p13 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p13.tar.gz" + SHA1 + 9dc5df770d7b454feb880ada76bcc0868879adfb +) + +hunter_add_version( + PACKAGE_NAME + Urho3D + VERSION + 1.7-p15 + URL + "https://github.com/hunter-packages/Urho3D/archive/v1.7-p15.tar.gz" + SHA1 + 2413d786c419845fdcb062c102f810503ddd09d4 +) + +hunter_cmake_args( + Urho3D + CMAKE_ARGS + URHO3D_ANGELSCRIPT=ON + URHO3D_DATABASE_ODBC=OFF + URHO3D_DATABASE_SQLITE=ON + URHO3D_LUA=ON + URHO3D_NAVIGATION=ON + URHO3D_NETWORK=ON + URHO3D_PCH=OFF + URHO3D_PHYSICS=ON + URHO3D_SAMPLES=OFF + URHO3D_URHO2D=ON +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(Urho3D) +hunter_download(PACKAGE_NAME Urho3D) diff --git a/cmake/projects/VulkanMemoryAllocator/hunter.cmake b/cmake/projects/VulkanMemoryAllocator/hunter.cmake new file mode 100644 index 000000000..102fd0269 --- /dev/null +++ b/cmake/projects/VulkanMemoryAllocator/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + VulkanMemoryAllocator + VERSION + 2.1.0-p0 + URL + "https://github.com/hunter-packages/VulkanMemoryAllocator/archive/v2.1.0-p0.tar.gz" + SHA1 + 3c09ea611290039ee58baa8971da424f46a4534c +) + +hunter_add_version( + PACKAGE_NAME + VulkanMemoryAllocator + VERSION + 2.0.0-p0 + URL + "https://github.com/hunter-packages/VulkanMemoryAllocator/archive/v2.0.0-p0.tar.gz" + SHA1 + f3b38054d2062563cf7cca66bd2e3fc8b9df832d +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(VulkanMemoryAllocator) +hunter_download(PACKAGE_NAME VulkanMemoryAllocator) diff --git a/cmake/projects/WDC/hunter.cmake b/cmake/projects/WDC/hunter.cmake new file mode 100644 index 000000000..e414a2d48 --- /dev/null +++ b/cmake/projects/WDC/hunter.cmake @@ -0,0 +1,67 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME WDC + VERSION "1.1.5" + URL "https://github.com/CloudPolis/webdav-client-cpp/archive/v1.1.5.tar.gz" + SHA1 652e3ea6e873b8b97fab9e95bd30a347c3329809 +) + +hunter_add_version( + PACKAGE_NAME WDC + VERSION "1.1.1" + URL "https://github.com/CloudPolis/webdav-client-cpp/archive/v1.1.1.tar.gz" + SHA1 ae111eee686c2f7d9091164ba270a6be11f8d4a8 +) + +hunter_add_version( + PACKAGE_NAME WDC + VERSION "1.1.0" + URL "https://github.com/CloudPolis/webdav-client-cpp/archive/v1.1.0.tar.gz" + SHA1 cc0923530fd1ce13fe927592bad3999db4f22d5e +) + +hunter_add_version( + PACKAGE_NAME WDC + VERSION "1.0.9" + URL "https://github.com/CloudPolis/webdav-client-cpp/archive/v1.0.9.tar.gz" + SHA1 a4035ce5ac73581384c71105a4716839e1f54b5f +) + +hunter_add_version( + PACKAGE_NAME WDC + VERSION "1.0.8" + URL "https://github.com/CloudPolis/webdav-client-cpp/archive/v1.0.8.tar.gz" + SHA1 10db2c64fd9165011c9caaea572e07bf97c817cd +) + +hunter_add_version( + PACKAGE_NAME WDC + VERSION "1.0.7" + URL "https://github.com/CloudPolis/webdav-client-cpp/archive/v1.0.7.tar.gz" + SHA1 58dd5181bf11f842f6eb8c7206d89070f2d52190 +) + +hunter_add_version( + PACKAGE_NAME WDC + VERSION "1.0.6" + URL "https://github.com/CloudPolis/webdav-client-cpp/archive/v1.0.6.tar.gz" + SHA1 db0358658f689cc9118d96acf1d6de6eeb4d9041 +) + +hunter_add_version( + PACKAGE_NAME WDC + VERSION "1.0.5" + URL "https://github.com/CloudPolis/webdav-client-cpp/archive/v1.0.5.tar.gz" + SHA1 5f0d0cce727d079f3acc822737fc5e9f93aabed2 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(WDC) +hunter_download(PACKAGE_NAME WDC) diff --git a/cmake/projects/WebKit/hunter.cmake b/cmake/projects/WebKit/hunter.cmake new file mode 100644 index 000000000..43e06d92e --- /dev/null +++ b/cmake/projects/WebKit/hunter.cmake @@ -0,0 +1,51 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + WebKit + VERSION + 0.0.2 + URL + "https://github.com/hunter-packages/WebKit/archive/v0.0.2.tar.gz" + SHA1 + 2da25c0485984e8ffb236050316d454e6c0ff849 +) + +hunter_add_version( + PACKAGE_NAME + WebKit + VERSION + 0.0.2-p0 + URL + "https://github.com/hunter-packages/WebKit/archive/v0.0.2-p0.tar.gz" + SHA1 + a7becb00409bd2731040b175dd4fe69792014714 +) + +hunter_cmake_args( + WebKit + CMAKE_ARGS + PORT=JSCOnly + ENABLE_TOOLS=OFF + ENABLE_API_TESTS=OFF + ENABLE_WEBCORE=OFF + ENABLE_WEBKIT=OFF + ENABLE_JIT=ON +) + +# Package is pretty big + Debug is not working on Android +hunter_configuration_types(WebKit CONFIGURATION_TYPES Release) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(WebKit) +hunter_download(PACKAGE_NAME WebKit) diff --git a/cmake/projects/WebP/hunter.cmake b/cmake/projects/WebP/hunter.cmake new file mode 100644 index 000000000..a8d466656 --- /dev/null +++ b/cmake/projects/WebP/hunter.cmake @@ -0,0 +1,128 @@ +# Copyright (c) 2018, Ruslan Baratov +# Copyright (c) 2018, Mathieu-Andre Chiasson +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + WebP + VERSION + "0.6.1-p2" + URL + "https://github.com/hunter-packages/libwebp/archive/v0.6.1-p2.tar.gz" + SHA1 + 533f0f09be3134dd8c3d76be267bef56d1a1f4a2 +) + +hunter_add_version( + PACKAGE_NAME + WebP + VERSION + "0.6.1-p3" + URL + "https://github.com/hunter-packages/libwebp/archive/v0.6.1-p3.tar.gz" + SHA1 + bcce817366c9ba5f42d36130d973dc2f072e2862 +) + +hunter_add_version( + PACKAGE_NAME + WebP + VERSION + "0.6.1-p4" + URL + "https://github.com/hunter-packages/libwebp/archive/v0.6.1-p4.tar.gz" + SHA1 + 982223088b7594608861d25d716cdfa5f72c26c7 +) + +hunter_add_version( + PACKAGE_NAME + WebP + VERSION + "1.0.2-p0" + URL + "https://github.com/hunter-packages/libwebp/archive/v1.0.2-p0.tar.gz" + SHA1 + 2b5aba3283e1f61b7d3c60a9b9eb97c3910806c1 +) + +hunter_add_version( + PACKAGE_NAME + WebP + VERSION + "1.0.2-p2" + URL + "https://github.com/hunter-packages/libwebp/archive/v1.0.2-p2.tar.gz" + SHA1 + 58d3784b1552a03678bc35e5f38b35b356d528d9 +) + +hunter_add_version( + PACKAGE_NAME + WebP + VERSION + "1.0.2-p3" + URL + "https://github.com/hunter-packages/libwebp/archive/v1.0.2-p3.tar.gz" + SHA1 + f29c5354f31b91b4f9a73e6b0426af19e25d4ea2 +) + +set( + _hunter_webp_cmake_args + WEBP_BUILD_WEBP_JS=OFF + WEBP_ENABLE_NEAR_LOSSLESS=ON + WEBP_ENABLE_SIMD=ON + WEBP_ENABLE_SWAP_16BIT_CSP=OFF + WEBP_EXPERIMENTAL_FEATURES=OFF +) + +if(ANDROID OR IOS) + list( + APPEND + _hunter_webp_cmake_args + WEBP_BUILD_ANIM_UTILS=OFF + WEBP_BUILD_CWEBP=OFF + WEBP_BUILD_DWEBP=OFF + WEBP_BUILD_EXTRAS=OFF + WEBP_BUILD_GIF2WEBP=OFF + WEBP_BUILD_IMG2WEBP=OFF + WEBP_BUILD_WEBPINFO=OFF + WEBP_BUILD_WEBPMUX=OFF + ) +else() + list( + APPEND + _hunter_webp_cmake_args + WEBP_BUILD_CWEBP=ON + WEBP_BUILD_DWEBP=ON + WEBP_BUILD_GIF2WEBP=ON + WEBP_BUILD_IMG2WEBP=ON + WEBP_BUILD_WEBPINFO=ON + ) +endif() + +if(APPLE) + # FindGLUT issue: + # - https://travis-ci.org/ingenue/hunter/jobs/502944277 + list( + APPEND + _hunter_webp_cmake_args + WEBP_BUILD_VWEBP=OFF + ) +endif() + +hunter_cmake_args(WebP CMAKE_ARGS ${_hunter_webp_cmake_args}) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(WebP) +hunter_download(PACKAGE_NAME WebP) diff --git a/cmake/projects/YAJL/hunter.cmake b/cmake/projects/YAJL/hunter.cmake new file mode 100644 index 000000000..b3983a41b --- /dev/null +++ b/cmake/projects/YAJL/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + YAJL + VERSION + 2.1.0-p0 + URL + "https://github.com/hunter-packages/yajl/archive/v2.1.0-p0.tar.gz" + SHA1 + d2dc11da34efb5148e6b84f43ba08783f1aefef4 +) + +hunter_cmake_args( + YAJL + CMAKE_ARGS + YAJL_BUILD_TOOLS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(YAJL) +hunter_download(PACKAGE_NAME YAJL) diff --git a/cmake/projects/acf/hunter.cmake b/cmake/projects/acf/hunter.cmake new file mode 100644 index 000000000..c0184b44d --- /dev/null +++ b/cmake/projects/acf/hunter.cmake @@ -0,0 +1,77 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + acf + VERSION + 0.0.1 + URL + "https://github.com/elucideye/acf/archive/v0.0.1.tar.gz" + SHA1 + 985bd3005b14120625e3684a8596d499bfc23a48 + ) + +hunter_add_version( + PACKAGE_NAME + acf + VERSION + 0.0.2 + URL + "https://github.com/elucideye/acf/archive/v0.0.2.tar.gz" + SHA1 + 0b2c6a2584539f1825eabc928e4b2abc7d16bbac + ) + +hunter_add_version( + PACKAGE_NAME + acf + VERSION + 0.1.3 + URL + "https://github.com/elucideye/acf/archive/v0.1.3.tar.gz" + SHA1 + 7df65c31312e6f364895dae249bb4fc9f20a8d7c +) + +hunter_add_version( + PACKAGE_NAME + acf + VERSION + 0.1.13 + URL + "https://github.com/elucideye/acf/archive/v0.1.13.tar.gz" + SHA1 + ab74bd7a6eead7f2fc1ca5c4d95b2d970f10cc71 +) + +hunter_add_version( + PACKAGE_NAME + acf + VERSION + 0.1.14 + URL + "https://github.com/elucideye/acf/archive/v0.1.14.tar.gz" + SHA1 + 79f9ccba6c8078c2831d68bb25c7bb40a17740ef +) + +hunter_cmake_args(acf CMAKE_ARGS + ACF_BUILD_OGLES_GPGPU=ON # optional opengl shaders on + ACF_USE_DRISHTI_CACHE=OFF # use hunter cache + ACF_BUILD_EXAMPLES=OFF + ACF_BUILD_TESTS=OFF + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(acf) +hunter_download(PACKAGE_NAME acf) diff --git a/cmake/projects/actionlib/hunter.cmake b/cmake/projects/actionlib/hunter.cmake new file mode 100644 index 000000000..b1b6c3994 --- /dev/null +++ b/cmake/projects/actionlib/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + actionlib + VERSION + 1.11.13-p0 + URL + "https://github.com/hunter-packages/actionlib/archive/v1.11.13-p0.tar.gz" + SHA1 + f8efaa72ea2d28727832b99b1900f1c1bd21c438 +) + +hunter_cmake_args( + actionlib + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(actionlib) +hunter_download(PACKAGE_NAME actionlib) diff --git a/cmake/projects/aes/hunter.cmake b/cmake/projects/aes/hunter.cmake new file mode 100644 index 000000000..2d0cf381d --- /dev/null +++ b/cmake/projects/aes/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + aes + VERSION + 0.0.1-p0 + URL + "https://github.com/hunter-packages/aes/archive/v0.0.1-p0.tar.gz" + SHA1 + 49ae29df3b0e0619c1db7e7696795c956386f71b +) + +hunter_add_version( + PACKAGE_NAME + aes + VERSION + 0.0.1-p1 + URL + "https://github.com/hunter-packages/aes/archive/v0.0.1-p1.tar.gz" + SHA1 + 5ec961526679246b34332afd1d83c015c377bd79 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(aes) +hunter_download(PACKAGE_NAME aes) diff --git a/cmake/projects/aglet/hunter.cmake b/cmake/projects/aglet/hunter.cmake new file mode 100644 index 000000000..63ecd5014 --- /dev/null +++ b/cmake/projects/aglet/hunter.cmake @@ -0,0 +1,69 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + aglet + VERSION + 1.0 + URL + "https://github.com/elucideye/aglet/archive/v1.0.tar.gz" + SHA1 + fbc018f8d7fdb757b23daa972ac6f83aea87c30c +) + +hunter_add_version( + PACKAGE_NAME + aglet + VERSION + 1.1.0 + URL + "https://github.com/elucideye/aglet/archive/v1.1.0.tar.gz" + SHA1 + 1857a8d99c0224688d7131a09f295f48723209aa +) + +hunter_add_version( + PACKAGE_NAME + aglet + VERSION + 1.2.0 + URL + "https://github.com/elucideye/aglet/archive/v1.2.0.tar.gz" + SHA1 + 65d910c63e0c030a20ca4da9473753ce284c49de + ) + +hunter_add_version( + PACKAGE_NAME + aglet + VERSION + 1.2.1 + URL + "https://github.com/elucideye/aglet/archive/v1.2.1.tar.gz" + SHA1 + bbd0c7ec9e5b559aba05aabdeffefb843f76edb8 +) + +hunter_add_version( + PACKAGE_NAME + aglet + VERSION + 1.2.2 + URL + "https://github.com/elucideye/aglet/archive/v1.2.2.tar.gz" + SHA1 + cf82d02ec34583f8a878be8f331279445b5b53e2 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(aglet) +hunter_download(PACKAGE_NAME aglet) diff --git a/cmake/projects/android_arm64_v8a_system_image_packer/hunter.cmake b/cmake/projects/android_arm64_v8a_system_image_packer/hunter.cmake new file mode 100644 index 000000000..6bee554be --- /dev/null +++ b/cmake/projects/android_arm64_v8a_system_image_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_arm64_v8a_system_image_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_arm64_v8a_system_image_packer/archive/v1.0.0.tar.gz" + SHA1 + e11d0b19f4d542c2a1347fb7d813a8efa9031622 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_arm64_v8a_system_image_packer) +hunter_download(PACKAGE_NAME android_arm64_v8a_system_image_packer) diff --git a/cmake/projects/android_arm_eabi_v7a_system_image_packer/hunter.cmake b/cmake/projects/android_arm_eabi_v7a_system_image_packer/hunter.cmake new file mode 100644 index 000000000..f6911d200 --- /dev/null +++ b/cmake/projects/android_arm_eabi_v7a_system_image_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_arm_eabi_v7a_system_image_packer + VERSION + 1.0 + URL + "https://github.com/hunter-packages/android_arm_eabi_v7a_system_image_packer/archive/v1.0.tar.gz" + SHA1 + a7a2e11c0fc621363600852a6e7e92d11781f554 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_arm_eabi_v7a_system_image_packer) +hunter_download(PACKAGE_NAME android_arm_eabi_v7a_system_image_packer) diff --git a/cmake/projects/android_build_tools_packer/hunter.cmake b/cmake/projects/android_build_tools_packer/hunter.cmake new file mode 100644 index 000000000..20e5e41b2 --- /dev/null +++ b/cmake/projects/android_build_tools_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_build_tools_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_build_tools_packer/archive/v1.0.0.tar.gz" + SHA1 + dcbd65c26c30d43c52c8dbb5a764201b3d270f55 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_build_tools_packer) +hunter_download(PACKAGE_NAME android_build_tools_packer) diff --git a/cmake/projects/android_google_apis_intel_x86_atom_system_image_packer/hunter.cmake b/cmake/projects/android_google_apis_intel_x86_atom_system_image_packer/hunter.cmake new file mode 100644 index 000000000..9e3ecbcfe --- /dev/null +++ b/cmake/projects/android_google_apis_intel_x86_atom_system_image_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_google_apis_intel_x86_atom_system_image_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_google_apis_intel_x86_atom_system_image_packer/archive/v1.0.0.tar.gz" + SHA1 + beb881562b055e0c6a050f26c5f14512793e9330 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_google_apis_intel_x86_atom_system_image_packer) +hunter_download(PACKAGE_NAME android_google_apis_intel_x86_atom_system_image_packer) diff --git a/cmake/projects/android_google_apis_packer/hunter.cmake b/cmake/projects/android_google_apis_packer/hunter.cmake new file mode 100644 index 000000000..ddb743488 --- /dev/null +++ b/cmake/projects/android_google_apis_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_google_apis_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_google_apis_packer/archive/v1.0.0.tar.gz" + SHA1 + aa0567990152846ee8c9aedb401bd8e6b0bdb67d +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_google_apis_packer) +hunter_download(PACKAGE_NAME android_google_apis_packer) diff --git a/cmake/projects/android_google_repository_packer/hunter.cmake b/cmake/projects/android_google_repository_packer/hunter.cmake new file mode 100644 index 000000000..fce402bc8 --- /dev/null +++ b/cmake/projects/android_google_repository_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_google_repository_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_google_repository_packer/archive/v1.0.0.tar.gz" + SHA1 + 0ed84e8bae92cc4f4d0a5eabd880299cd660624a +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_google_repository_packer) +hunter_download(PACKAGE_NAME android_google_repository_packer) diff --git a/cmake/projects/android_intel_x86_atom_system_image_packer/hunter.cmake b/cmake/projects/android_intel_x86_atom_system_image_packer/hunter.cmake new file mode 100644 index 000000000..d9078052b --- /dev/null +++ b/cmake/projects/android_intel_x86_atom_system_image_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_intel_x86_atom_system_image_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_intel_x86_atom_system_image_packer/archive/v1.0.0.tar.gz" + SHA1 + fb5c8373370c41ae2291825ff03ae50fbd244b09 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_intel_x86_atom_system_image_packer) +hunter_download(PACKAGE_NAME android_intel_x86_atom_system_image_packer) diff --git a/cmake/projects/android_mips_system_image_packer/hunter.cmake b/cmake/projects/android_mips_system_image_packer/hunter.cmake new file mode 100644 index 000000000..57fa0d920 --- /dev/null +++ b/cmake/projects/android_mips_system_image_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_mips_system_image_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_mips_system_image_packer/archive/v1.0.0.tar.gz" + SHA1 + 0b5b6d0771b6986ae50f6f7813c98608584bc31a +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_mips_system_image_packer) +hunter_download(PACKAGE_NAME android_mips_system_image_packer) diff --git a/cmake/projects/android_sdk_packer/hunter.cmake b/cmake/projects/android_sdk_packer/hunter.cmake new file mode 100644 index 000000000..fa83f9a44 --- /dev/null +++ b/cmake/projects/android_sdk_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_sdk_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_sdk_packer/archive/v1.0.0.tar.gz" + SHA1 + 9b32b707535d59f036d2600a1d876a0ca28a472e +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_sdk_packer) +hunter_download(PACKAGE_NAME android_sdk_packer) diff --git a/cmake/projects/android_sdk_platform_packer/hunter.cmake b/cmake/projects/android_sdk_platform_packer/hunter.cmake new file mode 100644 index 000000000..0c4319ed2 --- /dev/null +++ b/cmake/projects/android_sdk_platform_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_sdk_platform_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_sdk_platform_packer/archive/v1.0.0.tar.gz" + SHA1 + b99ffa829d6f0a80c02a038ccb24061881fb4d73 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_sdk_platform_packer) +hunter_download(PACKAGE_NAME android_sdk_platform_packer) diff --git a/cmake/projects/android_sdk_platform_tools_packer/hunter.cmake b/cmake/projects/android_sdk_platform_tools_packer/hunter.cmake new file mode 100644 index 000000000..228db686d --- /dev/null +++ b/cmake/projects/android_sdk_platform_tools_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_sdk_platform_tools_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_sdk_platform_tools_packer/archive/v1.0.0.tar.gz" + SHA1 + 4d5ac574a9e6e67f6c122fcc984a3a026bc0bc24 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_sdk_platform_tools_packer) +hunter_download(PACKAGE_NAME android_sdk_platform_tools_packer) diff --git a/cmake/projects/android_sdk_tools_packer/hunter.cmake b/cmake/projects/android_sdk_tools_packer/hunter.cmake new file mode 100644 index 000000000..c7268c08c --- /dev/null +++ b/cmake/projects/android_sdk_tools_packer/hunter.cmake @@ -0,0 +1,57 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_sdk_tools_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_sdk_tools_packer/archive/v1.0.0.tar.gz" + SHA1 + cff5f8931e74f3635b94282c7e0958fdd8cb740e +) + +hunter_add_version( + PACKAGE_NAME + android_sdk_tools_packer + VERSION + 1.0.1 + URL + "https://github.com/hunter-packages/android_sdk_tools_packer/archive/v1.0.1.tar.gz" + SHA1 + 06f6788c558ee5891d07301208260fbc64545768 +) + +hunter_add_version( + PACKAGE_NAME + android_sdk_tools_packer + VERSION + 1.0.2 + URL + "https://github.com/hunter-packages/android_sdk_tools_packer/archive/v1.0.2.tar.gz" + SHA1 + 486140b9a3db1610aba7fcbda8474f2d97d40072 +) + +hunter_add_version( + PACKAGE_NAME + android_sdk_tools_packer + VERSION + 1.0.3 + URL + "https://github.com/hunter-packages/android_sdk_tools_packer/archive/v1.0.3.tar.gz" + SHA1 + 71a497152e3e1efe535df2c30210596e91042ecf +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_sdk_tools_packer) +hunter_download(PACKAGE_NAME android_sdk_tools_packer) diff --git a/cmake/projects/android_support_repository_packer/hunter.cmake b/cmake/projects/android_support_repository_packer/hunter.cmake new file mode 100644 index 000000000..2ef8753af --- /dev/null +++ b/cmake/projects/android_support_repository_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + android_support_repository_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/android_support_repository_packer/archive/v1.0.0.tar.gz" + SHA1 + 3bea5189fd4a29cc060e235e304d8cc28badbdcc +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(android_support_repository_packer) +hunter_download(PACKAGE_NAME android_support_repository_packer) diff --git a/cmake/projects/angles/hunter.cmake b/cmake/projects/angles/hunter.cmake new file mode 100644 index 000000000..e3dd59977 --- /dev/null +++ b/cmake/projects/angles/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + angles + VERSION + 1.9.11-p0 + URL + "https://github.com/hunter-packages/angles/archive/v1.9.11-p0.tar.gz" + SHA1 + 455a91947b1f81dba5769a6b6b59e00b2208119f +) + +hunter_cmake_args( + angles + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(angles) +hunter_download(PACKAGE_NAME angles) diff --git a/cmake/projects/arabica/hunter.cmake b/cmake/projects/arabica/hunter.cmake new file mode 100644 index 000000000..554af6746 --- /dev/null +++ b/cmake/projects/arabica/hunter.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + arabica + VERSION + 0.0.0-a202766-p0 + URL + "https://github.com/hunter-packages/arabica/archive/v0.0.0-a202766-p0.tar.gz" + SHA1 + b922f397223d54f7e6c646a862b3b4d93b0b9227 +) + +hunter_cmake_args( + arabica + CMAKE_ARGS + BUILD_ARABICA_EXAMPLES=OFF + ARABICA_XML_BACKEND=USE_EXPAT +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(arabica) +hunter_download(PACKAGE_NAME arabica) diff --git a/cmake/projects/autobahn-cpp/hunter.cmake b/cmake/projects/autobahn-cpp/hunter.cmake new file mode 100644 index 000000000..f92fe328a --- /dev/null +++ b/cmake/projects/autobahn-cpp/hunter.cmake @@ -0,0 +1,21 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + autobahn-cpp + VERSION + "0.2.0" + URL + "https://github.com/hunter-packages/autobahn-cpp/archive/0.2.0-hunter-p1.tar.gz" + SHA1 + 43e37635abc924017aeff1036479fde1aea36ceb + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(autobahn-cpp) +hunter_download(PACKAGE_NAME autobahn-cpp) diff --git a/cmake/projects/autoutils/hunter.cmake b/cmake/projects/autoutils/hunter.cmake new file mode 100644 index 000000000..a07a21be0 --- /dev/null +++ b/cmake/projects/autoutils/hunter.cmake @@ -0,0 +1,26 @@ +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME autoutils + VERSION "0.1.0" + URL "https://github.com/isaachier/autoutils/archive/v0.1.0.tar.gz" + SHA1 "5e7a54fe584a6055e54fd4e6fcfc6de1e458eb07") + +hunter_add_version( + PACKAGE_NAME autoutils + VERSION "0.2.0" + URL "https://github.com/isaachier/autoutils/archive/v0.2.0.tar.gz" + SHA1 "8f1390453f0fa4c8b438dc2a2a5d65db452fe4f1") + +hunter_add_version( + PACKAGE_NAME autoutils + VERSION "0.3.0" + URL "https://github.com/isaachier/autoutils/archive/v0.3.0.tar.gz" + SHA1 "289b3364766460f37ca311671e27487cef4c3dfe") + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(autoutils) +hunter_download(PACKAGE_NAME autoutils) diff --git a/cmake/projects/aws-c-common/hunter.cmake b/cmake/projects/aws-c-common/hunter.cmake new file mode 100644 index 000000000..92d7df400 --- /dev/null +++ b/cmake/projects/aws-c-common/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + aws-c-common + VERSION + 0.2.1-p0 + URL + "https://github.com/hunter-packages/aws-c-common/archive/v0.2.1-p0.tar.gz" + SHA1 + 65cf17a47d77054a4c043ef9c59978c872f8ed3d +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(aws-c-common) +hunter_download(PACKAGE_NAME aws-c-common) diff --git a/cmake/projects/benchmark/hunter.cmake b/cmake/projects/benchmark/hunter.cmake new file mode 100644 index 000000000..7e45c6182 --- /dev/null +++ b/cmake/projects/benchmark/hunter.cmake @@ -0,0 +1,32 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME benchmark + VERSION "1.4.0" + URL "https://github.com/google/benchmark/archive/v1.4.0.tar.gz" + SHA1 "7d3c1379319d1c1c74e0854d023a0bf16f0cc978" +) + +hunter_add_version( + PACKAGE_NAME benchmark + VERSION "1.3.0" + URL "https://github.com/google/benchmark/archive/v1.3.0.tar.gz" + SHA1 "ea74b9d99327f7ef8150dc7c683e6155fa29ef3c") + +hunter_add_version( + PACKAGE_NAME benchmark + VERSION "1.2.0" + URL "https://github.com/google/benchmark/archive/v1.2.0.tar.gz" + SHA1 "5f26619848c59ddc354e2d51e2f196d2a6ddb189") + +hunter_cmake_args(benchmark CMAKE_ARGS BENCHMARK_ENABLE_TESTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(benchmark) +hunter_download(PACKAGE_NAME benchmark) diff --git a/cmake/projects/bento4/hunter.cmake b/cmake/projects/bento4/hunter.cmake new file mode 100644 index 000000000..c561a3584 --- /dev/null +++ b/cmake/projects/bento4/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + + # !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + + hunter_add_version( + PACKAGE_NAME + bento4 + VERSION + "1.5.1-628-e6ee435-p0" + URL + "https://github.com/hunter-packages/Bento4/archive/v1.5.1-628-e6ee435-p0.tar.gz" + SHA1 + 9193721f6b7dce92afa01c37d6c28ddf55103ba5 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(bento4) +hunter_download(PACKAGE_NAME bento4) diff --git a/cmake/projects/binaryen/hunter.cmake b/cmake/projects/binaryen/hunter.cmake new file mode 100644 index 000000000..784140923 --- /dev/null +++ b/cmake/projects/binaryen/hunter.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + + +hunter_add_version( + PACKAGE_NAME + binaryen + VERSION + 1.38.28-p0 + URL + "https://github.com/Warchant/binaryen/archive/1.38.28-p0.tar.gz" + SHA1 + 6c95a5a46a9e17a04521bb775266f2bae1763287 +) + +hunter_add_version( + PACKAGE_NAME + binaryen + VERSION + 1.38.28-p1 + URL + "https://github.com/Warchant/binaryen/archive/1.38.28-p1.tar.gz" + SHA1 + f8ff97ee1e16862e8c88bfea2ffb88247ad65223 +) + +hunter_cmake_args( + binaryen + CMAKE_ARGS + BUILD_STATIC_LIB=ON + BUILD_TOOLS=OFF # we don't want to build executables by default + ENABLE_WERROR=OFF # some new compilers (g++-{7,8}) produce warnings so build may fail. we explicitly disable -Werror +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(binaryen) +hunter_download(PACKAGE_NAME binaryen) diff --git a/cmake/projects/bison/hunter.cmake b/cmake/projects/bison/hunter.cmake new file mode 100644 index 000000000..65127c21a --- /dev/null +++ b/cmake/projects/bison/hunter.cmake @@ -0,0 +1,30 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + bison + VERSION + "3.0.4" + URL "https://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.gz" + SHA1 "ec1f2706a7cfedda06d29dc394b03e092a1e1b74" +) + +hunter_add_version( + PACKAGE_NAME + bison + VERSION + "3.0.4-p0" + URL "https://github.com/hunter-packages/bison/releases/download/v3.0.4/bison-3.0.4.tar.gz" + SHA1 "984caba9061e21d048b71a49bf553d2e32ac8252" +) + +hunter_configuration_types(bison CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) +# bison is not cacheable at this time because it hard codes paths to m4sugar +# directories in C source code. +hunter_download(PACKAGE_NAME bison) diff --git a/cmake/projects/boost-pba/hunter.cmake b/cmake/projects/boost-pba/hunter.cmake new file mode 100644 index 000000000..e41e9dbcc --- /dev/null +++ b/cmake/projects/boost-pba/hunter.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_package) +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + boost-pba + VERSION + "1.0.0" + URL + "https://github.com/hunter-packages/boost-pba/archive/v1.0.0.tar.gz" + SHA1 + 65b28b923cf0330860b36d568bf4a98503fb0455 +) + +hunter_add_version( + PACKAGE_NAME + boost-pba + VERSION + "1.0.0-p0" + URL + "https://github.com/hunter-packages/boost-pba/archive/v1.0.0-p0.tar.gz" + SHA1 + c4dd316edbb6839c5be2a5e1a9decd3bdfd848d0 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(boost-pba) +hunter_download(PACKAGE_NAME boost-pba) diff --git a/cmake/projects/botan/hunter.cmake b/cmake/projects/botan/hunter.cmake new file mode 100644 index 000000000..18669c23f --- /dev/null +++ b/cmake/projects/botan/hunter.cmake @@ -0,0 +1,71 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) +include(hunter_configuration_types) + +hunter_add_version( + PACKAGE_NAME + botan + VERSION + 2.11.0-110af9494 + URL + "https://github.com/randombit/botan/archive/110af949412e7c4b28b447a3600a947ddf2a2f2f.zip" + SHA1 + b97b5a934c872310992635a2ef5d016e1e59a2dd +) + +hunter_add_version( + PACKAGE_NAME + botan + VERSION + 2.11.0 + URL + "https://github.com/randombit/botan/archive/2.11.0.tar.gz" + SHA1 + f9667a53c19a7eb8999f3580baf21dc29c6a5f33 +) + +hunter_add_version( + PACKAGE_NAME + botan + VERSION + 2.10.0 + URL + "https://github.com/randombit/botan/archive/2.10.0.tar.gz" + SHA1 + 6e6b0e4a4b5a69ff42de2dfec2cd998a981abd2d +) + +hunter_cmake_args( + botan + CMAKE_ARGS + WITH_BZIP2=NO + WITH_ZLIB=NO + PKGCONFIG_EXPORT_TARGETS=botan-2 +) + +hunter_configuration_types(botan CONFIGURATION_TYPES Release) + +if(MINGW) + hunter_pick_scheme(DEFAULT url_sha1_botan) +elseif(WIN32) + hunter_pick_scheme(DEFAULT url_sha1_botan_win) +elseif(APPLE) + if(IOS) + hunter_pick_scheme(DEFAULT url_sha1_botan_ios) + else() + hunter_pick_scheme(DEFAULT url_sha1_botan_macos) + endif() +else() + hunter_pick_scheme(DEFAULT url_sha1_botan) +endif() + +hunter_cacheable(botan) +hunter_download(PACKAGE_NAME botan + PACKAGE_UNRELOCATABLE_TEXT_FILES + lib/pkgconfig/botan-2.pc +) diff --git a/cmake/projects/botan/schemes/url_sha1_botan.cmake.in b/cmake/projects/botan/schemes/url_sha1_botan.cmake.in new file mode 100644 index 000000000..61f4e73f7 --- /dev/null +++ b/cmake/projects/botan/schemes/url_sha1_botan.cmake.in @@ -0,0 +1,299 @@ +cmake_minimum_required(VERSION 3.0) + +project(Hunter) + +include("@HUNTER_SELF@/cmake/Hunter") + +include(ExternalProject) # ExternalProject_Add + +# some Hunter modules will be used +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_get_toolchain_binaries) +include(hunter_get_build_flags) + +# print this message if HUNTER_STATUS_DEBUG option is ON +hunter_status_debug("Scheme: url_sha1_botan") + +# Check variables is not empty +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +# Build command and options + +hunter_get_toolchain_binaries( + OUT_AR + ar + OUT_AS + as + OUT_LD + ld + OUT_NM + nm + OUT_OBJCOPY + objcopy + OUT_OBJDUMP + objdump + OUT_RANLIB + ranlib + OUT_STRIP + strip + OUT_CPP + cpp + OUT_CC + cc + OUT_CXX + cxx +) + +hunter_get_build_flags( + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + PACKAGE_CONFIGURATION_TYPES + "@HUNTER_PACKAGE_CONFIGURATION_TYPES@" + OUT_CPPFLAGS + cppflags + OUT_CFLAGS + cflags + OUT_CXXFLAGS + cxxflags + OUT_LDFLAGS + ldflags +) + +# Usage: configure.py [options] +# +# Options: +# --version show program's version number and exit +# -h, --help show this help message and exit +# --verbose Show debug messages +# --quiet Show only warnings and errors +# +# Target options: +# --cpu=CPU set the target CPU architecture +# --os=OS set the target operating system +# --cc=COMPILER set the desired build compiler +# --cc-min-version=MAJOR.MINOR Set the minimal version of the target +# compiler. Use --cc-min-version=0.0 to +# support all compiler versions. Default is +# auto detection. +# --cc-bin=BINARY set path to compiler binary +# --cc-abi-flags=FLAGS set compiler ABI flags +# --cxxflags=FLAGS override all compiler flags +# --extra-cxxflags=FLAGS set extra compiler flags +# --ldflags=FLAGS set linker flags +# --ar-command=AR set path to static archive creator +# --ar-options=AR_OPTIONS set options for ar +# --msvc-runtime=RT specify MSVC runtime (MT, MD, MTd, MDd) +# --with-endian=ORDER override byte order guess +# --with-os-features=FEAT specify OS features to use +# --without-os-features=FEAT specify OS features to disable +# --disable-sse2 disable SSE2 intrinsics +# --disable-ssse3 disable SSSE3 intrinsics +# --disable-sse4.1 disable SSE4.1 intrinsics +# --disable-sse4.2 disable SSE4.2 intrinsics +# --disable-avx2 disable AVX2 intrinsics +# --disable-bmi2 disable BMI2 intrinsics +# --disable-rdrand disable RDRAND intrinsics +# --disable-rdseed disable RDSEED intrinsics +# --disable-aes-ni disable AES-NI intrinsics +# --disable-sha-ni disable SHA-NI intrinsics +# --disable-altivec disable AltiVec intrinsics +# --disable-neon disable NEON intrinsics +# --disable-armv8crypto disable ARMv8Crypto intrinsics +# +# Build options: +# --with-debug-info include debug symbols +# --with-sanitizers enable ASan/UBSan checks +# --enable-sanitizers=SAN enable specific sanitizers +# --without-stack-protector disable stack smashing protections +# --with-coverage add coverage info and disable opts +# --with-coverage-info add coverage info +# --disable-shared-library disable building shared library +# --disable-static-library disable building static library +# --optimize-for-size optimize for code size +# --no-optimizations disable all optimizations (for debugging) +# --debug-mode enable debug info, disable optimizations +# --amalgamation use amalgamation to build +# --single-amalgamation-file build single file instead of splitting on +# ABI +# --with-build-dir=DIR setup the build in DIR +# --with-external-includedir=DIR use DIR for external includes +# --with-external-libdir=DIR use DIR for external libs +# --with-sysroot-dir=DIR use DIR for system root while cross- +# compiling +# --with-openmp enable use of OpenMP +# --link-method=METHOD choose how links to include headers are +# created (symlink, hardlink, copy) +# --with-local-config=FILE include the contents of FILE into build.h +# --distribution-info=STRING distribution specific version +# --maintainer-mode Enable extra warnings +# --with-python-versions=N.M where to install botan2.py (def 2.7) +# --with-valgrind use valgrind API +# --unsafe-fuzzer-mode Disable essential checks for testing +# --build-fuzzers=TYPE Build fuzzers (afl, libfuzzer, klee, test) +# --with-fuzzer-lib=LIB additionally link in LIB +# +# Documentation Options: +# --without-documentation Skip building/installing documentation +# --with-sphinx Use Sphinx +# --with-pdf Use Sphinx to generate PDF doc +# --with-rst2man Use rst2man to generate man page +# --with-doxygen Use Doxygen +# +# Module selection: +# --module-policy=POL module policy file (see src/build- +# data/policy) +# --enable-modules=MODS enable specific modules +# --disable-modules=MODS disable specific modules +# --minimized-build minimize build +# --with-bearssl use bearssl +# --with-boost use boost +# --with-bzip2 use bzip2 +# --with-lzma use lzma +# --with-openssl use openssl +# --with-commoncrypto use commoncrypto +# --with-sqlite3 use sqlite3 +# --with-zlib use zlib +# --with-tpm use tpm +# +# Installation options: +# --program-suffix=SUFFIX append string to program names +# --library-suffix=SUFFIX append string to library names +# --prefix=DIR set the install prefix +# --docdir=DIR set the doc install dir +# --bindir=DIR set the binary install dir +# --libdir=DIR set the library install dir +# --mandir=DIR set the install dir for man pages +# --includedir=DIR set the include file install dir +# +# Informational: +# --list-modules list available modules and exit +# --list-os-features list available OS features and exit +# + +if(ANDROID) + list(APPEND configure_opts --os=android) + set(cpu_flag "${CMAKE_ANDROID_ARCH_ABI}") + if("${CMAKE_ANDROID_ARCH_ABI}" STREQUAL "arm64-v8a") + set(cpu_flag "arm64") + elseif("${CMAKE_ANDROID_ARCH_ABI}" STREQUAL "armeabi-v7a") + set(cpu_flag "armv7-a") + elseif("${CMAKE_ANDROID_ARCH_ABI}" STREQUAL "armeabi") + set(cpu_flag "arm") + endif() + + list(APPEND configure_opts --cpu=${cpu_flag}) +elseif(UNIX) + list(APPEND configure_opts --os=linux) +endif() + +if("@HUNTER_PACKAGE_CONFIGURATION_TYPES@" STREQUAL "Debug") + list(APPEND configure_opts --debug-mode) +endif() + +if(HUNTER_STATUS_DEBUG) + list(APPEND configure_opts --verbose) +endif() + +if(BUILD_SHARED_LIBS) + list(APPEND configure_opt --disable-static-library) +else() + list(APPEND configure_opts --disable-shared-library) +endif() + +if(WITH_ZLIB) + list(APPEND configure_opts --with-zlib) + hunter_add_package(ZLIB) +endif() + +if(WITH_BZIP2) + list(APPEND configure_opts --with-bzip2) + hunter_add_package(BZip2) +endif() + +if(ENABLE_MODULES) + list(APPEND configure_opts --enable-modules=${ENABLE_MODULES}) +endif() + +list(APPEND configure_opts + --cc-bin=${cxx} + --extra-cxxflags=${cxxflags} + "--ldflags=${cxxflags} ${ldflags}" +) + +if(NOT "${ar}" STREQUAL "") + list(APPEND configure_opts --ar-command=${ar}) +endif() + +set(autotools_build_command "make") +if(MINGW) + set(autotools_build_command "nmake") +endif() + +if(NOT "@HUNTER_JOBS_OPTION@" STREQUAL "") + list(APPEND autotools_build_command "-j" "@HUNTER_JOBS_OPTION@") +endif() + +ExternalProject_Add( + @HUNTER_EP_NAME@ # Name of the external project. Actually not used set for beautify logging messages + URL + @HUNTER_PACKAGE_URL@ # URL of the package to download + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ # SHA1 hash + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" # Archive destination location + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" # Unpack directory + INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" # not used actually (see install command) + CONFIGURE_COMMAND + "./configure.py" + "--without-documentation" + "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@" + "--with-external-includedir=@HUNTER_INSTALL_PREFIX@/include" + "--with-external-libdir=@HUNTER_INSTALL_PREFIX@/lib" + ${configure_opts} + BUILD_COMMAND + ${autotools_build_command} libs + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + make install + COMMAND # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" +) + +string(COMPARE EQUAL "${DEPENDS_ON_PKGCONFIGS}" "" default_pkgconfig) +if(NOT default_pkgconfig) + set(DEPENDS_ON_PACKAGES ${DEPENDS_ON_PKGCONFIGS}) +endif() + +set(PKG_GENERATE_SHARED "${BUILD_SHARED_LIBS}") + +foreach(PKG_CONFIG_MODULE ${PKGCONFIG_EXPORT_TARGETS}) + # Use: + # * DEPENDS_ON_PACKAGES + # * PKG_GENERATE_SHARED + configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/pkgconfig-export-targets.cmake.in" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/cmake/${PKG_CONFIG_MODULE}/${PKG_CONFIG_MODULE}Config.cmake" + @ONLY + ) +endforeach() diff --git a/cmake/projects/botan/schemes/url_sha1_botan_ios.cmake.in b/cmake/projects/botan/schemes/url_sha1_botan_ios.cmake.in new file mode 100644 index 000000000..080439064 --- /dev/null +++ b/cmake/projects/botan/schemes/url_sha1_botan_ios.cmake.in @@ -0,0 +1,324 @@ +cmake_minimum_required(VERSION 3.0) + +project(Hunter) + +include("@HUNTER_SELF@/cmake/Hunter") + +include(ExternalProject) # ExternalProject_Add + +# some Hunter modules will be used +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_dump_cmake_flags) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_unsetvar) + +# print this message if HUNTER_STATUS_DEBUG option is ON +hunter_status_debug("Scheme: url_sha1_botan_ios") + +# Check variables is not empty +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +# Note: support for single architecture/native iOS builds (i.e., arm64) +hunter_assert_not_empty_string("@IPHONEOS_ARCHS@@IPHONESIMULATOR_ARCHS@") +hunter_assert_not_empty_string("@IOS_SDK_VERSION@") +hunter_assert_not_empty_string("@IPHONESIMULATOR_ROOT@") +hunter_assert_not_empty_string("@IPHONEOS_ROOT@") + +hunter_dump_cmake_flags(SKIP_INCLUDES) +# -> CMAKE_CXX_FLAGS +# -> CMAKE_C_FLAGS + +set(configure_architectures @IPHONEOS_ARCHS@ @IPHONESIMULATOR_ARCHS@) + +list(FIND configure_architectures "armv7s" x) +if(${x} GREATER -1) + message(STATUS "armv7s not supported by botan.") + list(REMOVE_ITEM configure_architectures "armv7s") +endif() + +hunter_unsetvar(botan_input_libraries) + +foreach(arch ${configure_architectures}) + list( + APPEND + botan_input_libraries + "@HUNTER_PACKAGE_SOURCE_DIR@/${arch}/libbotan-2.a" + ) +endforeach() + +# fuse all libraries by 'lipo' +list(GET configure_architectures 0 first_architecture) +ExternalProject_Add( + "@HUNTER_EP_NAME@-ios_universal" + DOWNLOAD_COMMAND + "" + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@/ios_universal" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + "" + BUILD_COMMAND + "" + INSTALL_COMMAND + lipo + -create + ${botan_input_libraries} + -o + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/libbotan-2.a" + COMMAND # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@/${first_architecture}" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" +) + +# Usage: configure.py [options] +# +# Options: +# --version show program's version number and exit +# -h, --help show this help message and exit +# --verbose Show debug messages +# --quiet Show only warnings and errors +# +# Target options: +# --cpu=CPU set the target CPU architecture +# --os=OS set the target operating system +# --cc=COMPILER set the desired build compiler +# --cc-min-version=MAJOR.MINOR Set the minimal version of the target +# compiler. Use --cc-min-version=0.0 to +# support all compiler versions. Default is +# auto detection. +# --cc-bin=BINARY set path to compiler binary +# --cc-abi-flags=FLAGS set compiler ABI flags +# --cxxflags=FLAGS override all compiler flags +# --extra-cxxflags=FLAGS set extra compiler flags +# --ldflags=FLAGS set linker flags +# --ar-command=AR set path to static archive creator +# --ar-options=AR_OPTIONS set options for ar +# --msvc-runtime=RT specify MSVC runtime (MT, MD, MTd, MDd) +# --with-endian=ORDER override byte order guess +# --with-os-features=FEAT specify OS features to use +# --without-os-features=FEAT specify OS features to disable +# --disable-sse2 disable SSE2 intrinsics +# --disable-ssse3 disable SSSE3 intrinsics +# --disable-sse4.1 disable SSE4.1 intrinsics +# --disable-sse4.2 disable SSE4.2 intrinsics +# --disable-avx2 disable AVX2 intrinsics +# --disable-bmi2 disable BMI2 intrinsics +# --disable-rdrand disable RDRAND intrinsics +# --disable-rdseed disable RDSEED intrinsics +# --disable-aes-ni disable AES-NI intrinsics +# --disable-sha-ni disable SHA-NI intrinsics +# --disable-altivec disable AltiVec intrinsics +# --disable-neon disable NEON intrinsics +# --disable-armv8crypto disable ARMv8Crypto intrinsics +# +# Build options: +# --with-debug-info include debug symbols +# --with-sanitizers enable ASan/UBSan checks +# --enable-sanitizers=SAN enable specific sanitizers +# --without-stack-protector disable stack smashing protections +# --with-coverage add coverage info and disable opts +# --with-coverage-info add coverage info +# --disable-shared-library disable building shared library +# --disable-static-library disable building static library +# --optimize-for-size optimize for code size +# --no-optimizations disable all optimizations (for debugging) +# --debug-mode enable debug info, disable optimizations +# --amalgamation use amalgamation to build +# --single-amalgamation-file build single file instead of splitting on +# ABI +# --with-build-dir=DIR setup the build in DIR +# --with-external-includedir=DIR use DIR for external includes +# --with-external-libdir=DIR use DIR for external libs +# --with-sysroot-dir=DIR use DIR for system root while cross- +# compiling +# --with-openmp enable use of OpenMP +# --link-method=METHOD choose how links to include headers are +# created (symlink, hardlink, copy) +# --with-local-config=FILE include the contents of FILE into build.h +# --distribution-info=STRING distribution specific version +# --maintainer-mode Enable extra warnings +# --with-python-versions=N.M where to install botan2.py (def 2.7) +# --with-valgrind use valgrind API +# --unsafe-fuzzer-mode Disable essential checks for testing +# --build-fuzzers=TYPE Build fuzzers (afl, libfuzzer, klee, test) +# --with-fuzzer-lib=LIB additionally link in LIB +# +# Documentation Options: +# --without-documentation Skip building/installing documentation +# --with-sphinx Use Sphinx +# --with-pdf Use Sphinx to generate PDF doc +# --with-rst2man Use rst2man to generate man page +# --with-doxygen Use Doxygen +# +# Module selection: +# --module-policy=POL module policy file (see src/build- +# data/policy) +# --enable-modules=MODS enable specific modules +# --disable-modules=MODS disable specific modules +# --minimized-build minimize build +# --with-bearssl use bearssl +# --with-boost use boost +# --with-bzip2 use bzip2 +# --with-lzma use lzma +# --with-openssl use openssl +# --with-commoncrypto use commoncrypto +# --with-sqlite3 use sqlite3 +# --with-zlib use zlib +# --with-tpm use tpm +# +# Installation options: +# --program-suffix=SUFFIX append string to program names +# --library-suffix=SUFFIX append string to library names +# --prefix=DIR set the install prefix +# --docdir=DIR set the doc install dir +# --bindir=DIR set the binary install dir +# --libdir=DIR set the library install dir +# --mandir=DIR set the install dir for man pages +# --includedir=DIR set the include file install dir +# +# Informational: +# --list-modules list available modules and exit +# --list-os-features list available OS features and exit +# +if("@HUNTER_PACKAGE_CONFIGURATION_TYPES@" STREQUAL "Debug") + list(APPEND configure_opts --debug-mode) +endif() + +if(HUNTER_STATUS_DEBUG) + list(APPEND configure_opts --verbose) +endif() + +if(BUILD_SHARED_LIBS) + list(APPEND configure_opt --disable-static-library) +else() + list(APPEND configure_opts --disable-shared-library) +endif() + +if(WITH_ZLIB) + list(APPEND configure_opts --with-zlib) + hunter_add_package(ZLIB) +endif() + +if(WITH_BZIP2) + list(APPEND configure_opts --with-bzip2) + hunter_add_package(BZip2) +endif() + +if(ENABLE_MODULES) + list(APPEND configure_opts --enable-modules=${ENABLE_MODULES}) +endif() + +list(APPEND configure_opts + --extra-cxxflags=${cxxflags} +) + +if(NOT "${ar}" STREQUAL "") + list(APPEND configure_opts --ar-command=${ar}) +endif() + +set(autotools_build_command "make") +if(NOT "@HUNTER_JOBS_OPTION@" STREQUAL "") + list(APPEND autotools_build_command "-j" "@HUNTER_JOBS_OPTION@") +endif() + +foreach(variant ${configure_architectures}) + + hunter_status_debug("Configure architecture: ${variant}") + + set(cc_abi_flags "${variant}") + set(cpu_flag "${variant}") + set(IPHONE_SDK "iphoneos") + set(additional_configure_opts "") + + if("${variant}" STREQUAL "armv7") + #list(APPEND additional_configure_opts --disable-neon) + message(STATUS "Disable newhope module in armv7 build because of of compiler crash see https://github.com/randombit/botan/issues/2015#issuecomment-508818269") + list(APPEND additional_configure_opts --disable-modules=newhope) + elseif("${variant}" STREQUAL "i386") + set(IPHONE_SDK "iphonesimulator") + elseif("${variant}" STREQUAL "x86_64") + set(IPHONE_SDK "iphonesimulator") + endif() + + hunter_status_debug("Configure options: ${configure_opts} ${additional_configure_opts}") + + ExternalProject_Add( + "@HUNTER_EP_NAME@-${variant}" # Name of the external project. Actually not used set for beautify logging messages + URL + @HUNTER_PACKAGE_URL@ # URL of the package to download + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ # SHA1 hash + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" # Archive destination location + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@/${variant}" # Unpack directory + INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" # not used actually (see install command) + CONFIGURE_COMMAND + . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && + xcrun --sdk ${IPHONE_SDK} "./configure.py" + "--os=ios" + "--cc=clang" + "--cpu=${cpu_flag}" + "--cc-abi-flags=-arch ${cc_abi_flags}" + "--without-documentation" + "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@" + "--with-external-includedir=@HUNTER_INSTALL_PREFIX@/include" + "--with-external-libdir=@HUNTER_INSTALL_PREFIX@/lib" + ${additional_configure_opts} + ${configure_opts} + BUILD_COMMAND + . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && + xcrun --sdk ${IPHONE_SDK} make libs + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && + xcrun --sdk ${IPHONE_SDK} make install + ) + + add_dependencies( + "@HUNTER_EP_NAME@-ios_universal" + "@HUNTER_EP_NAME@-${variant}" + ) +endforeach() + +string(COMPARE EQUAL "${DEPENDS_ON_PKGCONFIGS}" "" default_pkgconfig) +if(NOT default_pkgconfig) + set(DEPENDS_ON_PACKAGES ${DEPENDS_ON_PKGCONFIGS}) +endif() + +set(PKG_GENERATE_SHARED "${BUILD_SHARED_LIBS}") + +foreach(PKG_CONFIG_MODULE ${PKGCONFIG_EXPORT_TARGETS}) + # Use: + # * DEPENDS_ON_PACKAGES + # * PKG_GENERATE_SHARED + configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/pkgconfig-export-targets.cmake.in" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/cmake/${PKG_CONFIG_MODULE}/${PKG_CONFIG_MODULE}Config.cmake" + @ONLY + ) +endforeach() diff --git a/cmake/projects/botan/schemes/url_sha1_botan_macos.cmake.in b/cmake/projects/botan/schemes/url_sha1_botan_macos.cmake.in new file mode 100644 index 000000000..a4afcc550 --- /dev/null +++ b/cmake/projects/botan/schemes/url_sha1_botan_macos.cmake.in @@ -0,0 +1,268 @@ +cmake_minimum_required(VERSION 3.0) + +project(Hunter) + +include("@HUNTER_SELF@/cmake/Hunter") + +include(ExternalProject) # ExternalProject_Add + +# some Hunter modules will be used +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_dump_cmake_flags) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_unsetvar) +include(hunter_user_error) + +# print this message if HUNTER_STATUS_DEBUG option is ON +hunter_status_debug("Scheme: url_sha1_botan_macos") + +# Check variables is not empty +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +# Skip position independent code flags for macOS +hunter_dump_cmake_flags(SKIP_INCLUDES SKIP_PIC) +# -> CMAKE_CXX_FLAGS +# -> CMAKE_C_FLAGS + +set(configure_architectures @CMAKE_OSX_ARCHITECTURES@) + +if(NOT configure_architectures) + hunter_status_debug("Using default macOS architecture: x86_64") + set(configure_architectures "x86_64") +endif() + +# Usage: configure.py [options] +# +# Options: +# --version show program's version number and exit +# -h, --help show this help message and exit +# --verbose Show debug messages +# --quiet Show only warnings and errors +# +# Target options: +# --cpu=CPU set the target CPU architecture +# --os=OS set the target operating system +# --cc=COMPILER set the desired build compiler +# --cc-min-version=MAJOR.MINOR Set the minimal version of the target +# compiler. Use --cc-min-version=0.0 to +# support all compiler versions. Default is +# auto detection. +# --cc-bin=BINARY set path to compiler binary +# --cc-abi-flags=FLAGS set compiler ABI flags +# --cxxflags=FLAGS override all compiler flags +# --extra-cxxflags=FLAGS set extra compiler flags +# --ldflags=FLAGS set linker flags +# --ar-command=AR set path to static archive creator +# --ar-options=AR_OPTIONS set options for ar +# --msvc-runtime=RT specify MSVC runtime (MT, MD, MTd, MDd) +# --with-endian=ORDER override byte order guess +# --with-os-features=FEAT specify OS features to use +# --without-os-features=FEAT specify OS features to disable +# --disable-sse2 disable SSE2 intrinsics +# --disable-ssse3 disable SSSE3 intrinsics +# --disable-sse4.1 disable SSE4.1 intrinsics +# --disable-sse4.2 disable SSE4.2 intrinsics +# --disable-avx2 disable AVX2 intrinsics +# --disable-bmi2 disable BMI2 intrinsics +# --disable-rdrand disable RDRAND intrinsics +# --disable-rdseed disable RDSEED intrinsics +# --disable-aes-ni disable AES-NI intrinsics +# --disable-sha-ni disable SHA-NI intrinsics +# --disable-altivec disable AltiVec intrinsics +# --disable-neon disable NEON intrinsics +# --disable-armv8crypto disable ARMv8Crypto intrinsics +# +# Build options: +# --with-debug-info include debug symbols +# --with-sanitizers enable ASan/UBSan checks +# --enable-sanitizers=SAN enable specific sanitizers +# --without-stack-protector disable stack smashing protections +# --with-coverage add coverage info and disable opts +# --with-coverage-info add coverage info +# --disable-shared-library disable building shared library +# --disable-static-library disable building static library +# --optimize-for-size optimize for code size +# --no-optimizations disable all optimizations (for debugging) +# --debug-mode enable debug info, disable optimizations +# --amalgamation use amalgamation to build +# --single-amalgamation-file build single file instead of splitting on +# ABI +# --with-build-dir=DIR setup the build in DIR +# --with-external-includedir=DIR use DIR for external includes +# --with-external-libdir=DIR use DIR for external libs +# --with-sysroot-dir=DIR use DIR for system root while cross- +# compiling +# --with-openmp enable use of OpenMP +# --link-method=METHOD choose how links to include headers are +# created (symlink, hardlink, copy) +# --with-local-config=FILE include the contents of FILE into build.h +# --distribution-info=STRING distribution specific version +# --maintainer-mode Enable extra warnings +# --with-python-versions=N.M where to install botan2.py (def 2.7) +# --with-valgrind use valgrind API +# --unsafe-fuzzer-mode Disable essential checks for testing +# --build-fuzzers=TYPE Build fuzzers (afl, libfuzzer, klee, test) +# --with-fuzzer-lib=LIB additionally link in LIB +# +# Documentation Options: +# --without-documentation Skip building/installing documentation +# --with-sphinx Use Sphinx +# --with-pdf Use Sphinx to generate PDF doc +# --with-rst2man Use rst2man to generate man page +# --with-doxygen Use Doxygen +# +# Module selection: +# --module-policy=POL module policy file (see src/build- +# data/policy) +# --enable-modules=MODS enable specific modules +# --disable-modules=MODS disable specific modules +# --minimized-build minimize build +# --with-bearssl use bearssl +# --with-boost use boost +# --with-bzip2 use bzip2 +# --with-lzma use lzma +# --with-openssl use openssl +# --with-commoncrypto use commoncrypto +# --with-sqlite3 use sqlite3 +# --with-zlib use zlib +# --with-tpm use tpm +# +# Installation options: +# --program-suffix=SUFFIX append string to program names +# --library-suffix=SUFFIX append string to library names +# --prefix=DIR set the install prefix +# --docdir=DIR set the doc install dir +# --bindir=DIR set the binary install dir +# --libdir=DIR set the library install dir +# --mandir=DIR set the install dir for man pages +# --includedir=DIR set the include file install dir +# +# Informational: +# --list-modules list available modules and exit +# --list-os-features list available OS features and exit +# +if("@HUNTER_PACKAGE_CONFIGURATION_TYPES@" STREQUAL "Debug") + list(APPEND configure_opts --debug-mode) +endif() + +if(HUNTER_STATUS_DEBUG) + list(APPEND configure_opts --verbose) +endif() + +if(BUILD_SHARED_LIBS) + list(APPEND configure_opt --disable-static-library) +else() + list(APPEND configure_opts --disable-shared-library) +endif() + +if(WITH_ZLIB) + list(APPEND configure_opts --with-zlib) + hunter_add_package(ZLIB) +endif() + +if(WITH_BZIP2) + list(APPEND configure_opts --with-bzip2) + hunter_add_package(BZip2) +endif() + +if(ENABLE_MODULES) + list(APPEND configure_opts --enable-modules=${ENABLE_MODULES}) +endif() + +list(APPEND configure_opts + --extra-cxxflags=${cxxflags} +) + +if(NOT "${ar}" STREQUAL "") + list(APPEND configure_opts --ar-command=${ar}) +endif() + +set(build_command . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && "make") +if(NOT "@HUNTER_JOBS_OPTION@" STREQUAL "") + list(APPEND build_command "-j" "@HUNTER_JOBS_OPTION@") +endif() + +list(LENGTH configure_architectures configure_architectures_lenght) +if(${configure_architectures_lenght} GREATER 1) + set(arch_flags "") + foreach(arch ${configure_architectures}) + string(APPEND arch_flags "-arch ${arch} ") + endforeach() + list(APPEND configure_opts "--cc-abi-flags=\"-force_cpusubtype_ALL ${arch_flags}\"") +endif() + +set(configure_command . "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh" && "./configure.py") + +hunter_status_debug("Configure command: ${configure_command}") +hunter_status_debug("Configure architectures: ${configure_architectures}") +hunter_status_debug("Configure options: ${configure_opts}") + +list(GET configure_architectures 0 first_architecture) +ExternalProject_Add( + "@HUNTER_EP_NAME@" # Name of the external project. Actually not used set for beautify logging messages + URL + @HUNTER_PACKAGE_URL@ # URL of the package to download + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ # SHA1 hash + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" # Archive destination location + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" # Unpack directory + INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" # not used actually (see install command) + CONFIGURE_COMMAND + "${configure_command}" + "--os=darwin" + "--cc=clang" + "--cpu=${first_architecture}" + "--without-documentation" + "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@" + "--with-external-includedir=@HUNTER_INSTALL_PREFIX@/include" + "--with-external-libdir=@HUNTER_INSTALL_PREFIX@/lib" + ${configure_opts} + BUILD_COMMAND + ${build_command} libs + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + make install + COMMAND # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@/${first_architecture}" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" +) + +string(COMPARE EQUAL "${DEPENDS_ON_PKGCONFIGS}" "" default_pkgconfig) +if(NOT default_pkgconfig) + set(DEPENDS_ON_PACKAGES ${DEPENDS_ON_PKGCONFIGS}) +endif() + +set(PKG_GENERATE_SHARED "${BUILD_SHARED_LIBS}") + +foreach(PKG_CONFIG_MODULE ${PKGCONFIG_EXPORT_TARGETS}) + # Use: + # * DEPENDS_ON_PACKAGES + # * PKG_GENERATE_SHARED + configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/pkgconfig-export-targets.cmake.in" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/cmake/${PKG_CONFIG_MODULE}/${PKG_CONFIG_MODULE}Config.cmake" + @ONLY + ) +endforeach() diff --git a/cmake/projects/botan/schemes/url_sha1_botan_win.cmake.in b/cmake/projects/botan/schemes/url_sha1_botan_win.cmake.in new file mode 100644 index 000000000..b27a180c1 --- /dev/null +++ b/cmake/projects/botan/schemes/url_sha1_botan_win.cmake.in @@ -0,0 +1,290 @@ +cmake_minimum_required(VERSION 3.0) + +project(Hunter) + +include("@HUNTER_SELF@/cmake/Hunter") + +include(ExternalProject) # ExternalProject_Add + +# some Hunter modules will be used +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_get_toolchain_binaries) +include(hunter_get_build_flags) +include(hunter_setup_msvc) + +# print this message if HUNTER_STATUS_DEBUG option is ON +hunter_status_debug("Scheme: url_sha1_botan_win") + +# Check variables is not empty +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +# TODO These properties are not set in msys-cxx17 build +#hunter_assert_not_empty_string("@HUNTER_MSVC_ARCH@") +#hunter_assert_not_empty_string("@HUNTER_MSVC_VCVARSALL@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +# Build command and options + +hunter_get_toolchain_binaries( + OUT_AR + ar + OUT_AS + as + OUT_LD + ld + OUT_NM + nm + OUT_OBJCOPY + objcopy + OUT_OBJDUMP + objdump + OUT_RANLIB + ranlib + OUT_STRIP + strip + OUT_CPP + cpp + OUT_CC + cc + OUT_CXX + cxx +) + +hunter_get_build_flags( + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + PACKAGE_CONFIGURATION_TYPES + "@HUNTER_PACKAGE_CONFIGURATION_TYPES@" + OUT_CPPFLAGS + cppflags + OUT_CFLAGS + cflags + OUT_CXXFLAGS + cxxflags + OUT_LDFLAGS + ldflags +) + +hunter_setup_msvc() + +# Usage: configure.py [options] +# +# Options: +# --version show program's version number and exit +# -h, --help show this help message and exit +# --verbose Show debug messages +# --quiet Show only warnings and errors +# +# Target options: +# --cpu=CPU set the target CPU architecture +# --os=OS set the target operating system +# --cc=COMPILER set the desired build compiler +# --cc-min-version=MAJOR.MINOR Set the minimal version of the target +# compiler. Use --cc-min-version=0.0 to +# support all compiler versions. Default is +# auto detection. +# --cc-bin=BINARY set path to compiler binary +# --cc-abi-flags=FLAGS set compiler ABI flags +# --cxxflags=FLAGS override all compiler flags +# --extra-cxxflags=FLAGS set extra compiler flags +# --ldflags=FLAGS set linker flags +# --ar-command=AR set path to static archive creator +# --ar-options=AR_OPTIONS set options for ar +# --msvc-runtime=RT specify MSVC runtime (MT, MD, MTd, MDd) +# --with-endian=ORDER override byte order guess +# --with-os-features=FEAT specify OS features to use +# --without-os-features=FEAT specify OS features to disable +# --disable-sse2 disable SSE2 intrinsics +# --disable-ssse3 disable SSSE3 intrinsics +# --disable-sse4.1 disable SSE4.1 intrinsics +# --disable-sse4.2 disable SSE4.2 intrinsics +# --disable-avx2 disable AVX2 intrinsics +# --disable-bmi2 disable BMI2 intrinsics +# --disable-rdrand disable RDRAND intrinsics +# --disable-rdseed disable RDSEED intrinsics +# --disable-aes-ni disable AES-NI intrinsics +# --disable-sha-ni disable SHA-NI intrinsics +# --disable-altivec disable AltiVec intrinsics +# --disable-neon disable NEON intrinsics +# --disable-armv8crypto disable ARMv8Crypto intrinsics +# +# Build options: +# --with-debug-info include debug symbols +# --with-sanitizers enable ASan/UBSan checks +# --enable-sanitizers=SAN enable specific sanitizers +# --without-stack-protector disable stack smashing protections +# --with-coverage add coverage info and disable opts +# --with-coverage-info add coverage info +# --disable-shared-library disable building shared library +# --disable-static-library disable building static library +# --optimize-for-size optimize for code size +# --no-optimizations disable all optimizations (for debugging) +# --debug-mode enable debug info, disable optimizations +# --amalgamation use amalgamation to build +# --single-amalgamation-file build single file instead of splitting on +# ABI +# --with-build-dir=DIR setup the build in DIR +# --with-external-includedir=DIR use DIR for external includes +# --with-external-libdir=DIR use DIR for external libs +# --with-sysroot-dir=DIR use DIR for system root while cross- +# compiling +# --with-openmp enable use of OpenMP +# --link-method=METHOD choose how links to include headers are +# created (symlink, hardlink, copy) +# --with-local-config=FILE include the contents of FILE into build.h +# --distribution-info=STRING distribution specific version +# --maintainer-mode Enable extra warnings +# --with-python-versions=N.M where to install botan2.py (def 2.7) +# --with-valgrind use valgrind API +# --unsafe-fuzzer-mode Disable essential checks for testing +# --build-fuzzers=TYPE Build fuzzers (afl, libfuzzer, klee, test) +# --with-fuzzer-lib=LIB additionally link in LIB +# +# Documentation Options: +# --without-documentation Skip building/installing documentation +# --with-sphinx Use Sphinx +# --with-pdf Use Sphinx to generate PDF doc +# --with-rst2man Use rst2man to generate man page +# --with-doxygen Use Doxygen +# +# Module selection: +# --module-policy=POL module policy file (see src/build- +# data/policy) +# --enable-modules=MODS enable specific modules +# --disable-modules=MODS disable specific modules +# --minimized-build minimize build +# --with-bearssl use bearssl +# --with-boost use boost +# --with-bzip2 use bzip2 +# --with-lzma use lzma +# --with-openssl use openssl +# --with-commoncrypto use commoncrypto +# --with-sqlite3 use sqlite3 +# --with-zlib use zlib +# --with-tpm use tpm +# +# Installation options: +# --program-suffix=SUFFIX append string to program names +# --library-suffix=SUFFIX append string to library names +# --prefix=DIR set the install prefix +# --docdir=DIR set the doc install dir +# --bindir=DIR set the binary install dir +# --libdir=DIR set the library install dir +# --mandir=DIR set the install dir for man pages +# --includedir=DIR set the include file install dir +# +# Informational: +# --list-modules list available modules and exit +# --list-os-features list available OS features and exit +# +if("@HUNTER_PACKAGE_CONFIGURATION_TYPES@" STREQUAL "Debug") + list(APPEND configure_opts --debug-mode) +endif() + +if(HUNTER_STATUS_DEBUG) + list(APPEND configure_opts --verbose) +endif() + +if(BUILD_SHARED_LIBS) + list(APPEND configure_opt --disable-static-library) +else() + list(APPEND configure_opts --disable-shared-library) +endif() + +if(WITH_ZLIB) + list(APPEND configure_opts --with-zlib) + hunter_add_package(ZLIB) +endif() + +if(WITH_BZIP2) + list(APPEND configure_opts --with-bzip2) + hunter_add_package(BZip2) +endif() + +if(ENABLE_MODULES) + list(APPEND configure_opts --enable-modules=${ENABLE_MODULES}) +endif() + +if("${HUNTER_MSVC_ARCH}" STREQUAL "amd64") + list(APPEND configure_opts --cpu=x64) +else() + list(APPEND configure_opts --cpu=x86) +endif() + +# file(TO_NATIVE_PATH "${cxx}" CXX_BIN) + +# list(APPEND configure_opts +# #--cc-bin=${cxx} +# #"--cc-bin=${CXX_BIN}" +# "--extra-cxxflags=${cxxflags}" +# "--ldflags=${ldflags}" +# #--amalgamation --single-amalgamation-file +# ) + +if(NOT "${ar}" STREQUAL "") + list(APPEND configure_opts --ar-command=${ar}) +endif() + +# MSVS="2015" PLATFORM="x86_amd64" TARGET="shared" +#.\configure.py +#--prefix=c:\users\appveyor\appdata\local\temp\1\botan-install +#--cc=msvc +#--os=windows +#--cpu=x64 or --cpu=x86 +#--cc-bin=sccache cl --no-store-vc-rev + +if(NOT "@HUNTER_MSVC_VCVARSALL@" STREQUAL "") + file(TO_NATIVE_PATH "@HUNTER_MSVC_VCVARSALL@" RUN_MSVC_VCVARSALL) +endif() +file(TO_NATIVE_PATH "@HUNTER_PACKAGE_INSTALL_PREFIX@" INSTALL_PATH) +file(TO_NATIVE_PATH "@HUNTER_PACKAGE_INSTALL_PREFIX@/include" EXTERNAL_INCLUDE) +file(TO_NATIVE_PATH "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib" EXTERNAL_LIB) + +ExternalProject_Add( + @HUNTER_EP_NAME@ # Name of the external project. Actually not used set for beautify logging messages + URL + @HUNTER_PACKAGE_URL@ # URL of the package to download + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ # SHA1 hash + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" # Archive destination location + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" # Unpack directory + INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" # not used actually (see install command) + CONFIGURE_COMMAND + "${RUN_MSVC_VCVARSALL}" "@HUNTER_MSVC_ARCH@" + COMMAND + "./configure.py" + "--os=windows" + "--cc=msvc" + "--without-documentation" + "--prefix=${INSTALL_PATH}" + "--with-external-includedir=${EXTERNAL_INCLUDE}" + "--with-external-libdir=${EXTERNAL_LIB}" + ${configure_opts} + BUILD_COMMAND + nmake libs + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + nmake install + COMMAND # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" +) diff --git a/cmake/projects/breakpad/hunter.cmake b/cmake/projects/breakpad/hunter.cmake new file mode 100644 index 000000000..a0a52b9d6 --- /dev/null +++ b/cmake/projects/breakpad/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + breakpad + VERSION + 0.0.0-12ecff3-p1 + URL + "https://github.com/hunter-packages/breakpad/archive/v0.0.0-12ecff3-p1.tar.gz" + SHA1 + 6d6ba5d3f0b8d317b61d1a4256dcdd55f29d19ee +) + +hunter_add_version( + PACKAGE_NAME + breakpad + VERSION + 0.0.0-12ecff3-p2 + URL + "https://github.com/hunter-packages/breakpad/archive/v0.0.0-12ecff3-p2.tar.gz" + SHA1 + 583524ee8f08d0b036bfb4ad3566144b4c272965 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(breakpad) +hunter_download(PACKAGE_NAME breakpad) diff --git a/cmake/projects/bullet/hunter.cmake b/cmake/projects/bullet/hunter.cmake new file mode 100644 index 000000000..41891cf79 --- /dev/null +++ b/cmake/projects/bullet/hunter.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + bullet + VERSION + 2.87-p0 + URL + "https://github.com/hunter-packages/bullet3/archive/2.87-p0.tar.gz" + SHA1 + 7cd3e8b27b081d4c7f7503c3270009d7dc052a0f +) + +hunter_cmake_args( + bullet + CMAKE_ARGS + BUILD_BULLET2_DEMOS=OFF + BUILD_BULLET3=OFF + BUILD_EXTRAS=OFF + BUILD_OPENGL3_DEMOS=OFF + BUILD_UNIT_TESTS=OFF + INSTALL_LIBS=ON +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(bullet) +hunter_download(PACKAGE_NAME bullet) diff --git a/cmake/projects/c-ares/hunter.cmake b/cmake/projects/c-ares/hunter.cmake new file mode 100644 index 000000000..7d27f88bf --- /dev/null +++ b/cmake/projects/c-ares/hunter.cmake @@ -0,0 +1,28 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME c-ares + VERSION "1.13.0" + URL "https://github.com/c-ares/c-ares/archive/cares-1_13_0.tar.gz" + SHA1 "00a0dcb85db6f08afdaf4731cc8e3606daf5a12b") + + +hunter_add_version( + PACKAGE_NAME c-ares + VERSION "1.14.0-p0" + URL "https://github.com/hunter-packages/c-ares/archive/v1.14.0-p0.tar.gz" + SHA1 "4708595fb0eb053a3ca8160cdd579ff626408973") + +if(ANDROID OR IOS) + hunter_cmake_args(c-ares CMAKE_ARGS CARES_BUILD_TOOLS=OFF) +endif() + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(c-ares) +hunter_download(PACKAGE_NAME c-ares) diff --git a/cmake/projects/catkin/hunter.cmake b/cmake/projects/catkin/hunter.cmake new file mode 100644 index 000000000..9da66a2e8 --- /dev/null +++ b/cmake/projects/catkin/hunter.cmake @@ -0,0 +1,64 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + catkin + VERSION + 0.7.11-p0 + URL + "https://github.com/hunter-packages/catkin/archive/v0.7.11-p0.tar.gz" + SHA1 + "f7d64b4908fe800e5ec128e78e8e2f5bb5c955b3" +) + +hunter_add_version( + PACKAGE_NAME + catkin + VERSION + 0.7.11-p1 + URL + "https://github.com/hunter-packages/catkin/archive/v0.7.11-p1.tar.gz" + SHA1 + "465960e1a8bf849ef045a6d543ed23c5be84e36f" +) + +hunter_add_version( + PACKAGE_NAME + catkin + VERSION + 0.7.11-p2 + URL + "https://github.com/hunter-packages/catkin/archive/v0.7.11-p2.tar.gz" + SHA1 + "d8001b873e2482a48eeb6fe573f88fc4d6d63b7b" +) + +hunter_add_version( + PACKAGE_NAME + catkin + VERSION + 0.7.17-p0 + URL + "https://github.com/hunter-packages/catkin/archive/v0.7.17-p0.tar.gz" + SHA1 + "13aac5184149590d3da67eb23002da690e8df0a6" +) + +hunter_cmake_args( + catkin + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(catkin) +hunter_download(PACKAGE_NAME catkin) diff --git a/cmake/projects/cctz/hunter.cmake b/cmake/projects/cctz/hunter.cmake new file mode 100644 index 000000000..394905e47 --- /dev/null +++ b/cmake/projects/cctz/hunter.cmake @@ -0,0 +1,19 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME cctz + VERSION "2.2.0" + URL "https://github.com/hunter-packages/cctz/archive/hunter-2.2-p0.tar.gz" + SHA1 "86d5ab7555a2f6a8c255dcb50fb7734c4cb8fdfd") + +hunter_cmake_args(cctz CMAKE_ARGS BUILD_TESTING=OFF BUILD_EXAMPLES=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(cctz) +hunter_download(PACKAGE_NAME cctz) diff --git a/cmake/projects/ceres-solver/hunter.cmake b/cmake/projects/ceres-solver/hunter.cmake new file mode 100644 index 000000000..fabeb4781 --- /dev/null +++ b/cmake/projects/ceres-solver/hunter.cmake @@ -0,0 +1,89 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# starting with 1.12.0-p2 ceres-solver is cacheable +hunter_cacheable(ceres-solver) + +# use base url for hunter fork +set(_hunter_ceres_base_url_fork "https://github.com/hunter-packages/ceres-solver/archive") + + +# List of versions +hunter_add_version( + PACKAGE_NAME + ceres-solver + VERSION + "1.12.0-p2" + URL + "${_hunter_ceres_base_url_fork}/v1.12.0-p2.tar.gz" + SHA1 + 04724b04aaa17fdd1feaa7d21e8a37723f78d9fc +) + +hunter_add_version( + PACKAGE_NAME + ceres-solver + VERSION + "1.12.0-p1" + URL + "${_hunter_ceres_base_url_fork}/v1.12.0-p1.tar.gz" + SHA1 + d8676dcfe72c19d77aa099a894b94515761e8e94 +) + +hunter_add_version( + PACKAGE_NAME + ceres-solver + VERSION + "1.12.0-p0" + URL + "${_hunter_ceres_base_url_fork}/v1.12.0-p0.tar.gz" + SHA1 + c8a24d83bf4b26b99fd8fc3bed28a267e6247c85 +) + +hunter_add_version( + PACKAGE_NAME + ceres-solver + VERSION + "1.14.0-p0" + URL + "${_hunter_ceres_base_url_fork}/v1.14.0-p0.tar.gz" + SHA1 + e27d6c0720977667a7789fd7e865e7362dc58695 +) +hunter_add_version( + PACKAGE_NAME + ceres-solver + VERSION + "1.14.0-p1" + URL + "${_hunter_ceres_base_url_fork}/v1.14.0-p1.tar.gz" + SHA1 + fb63a3f1ee8c39a6eda1c3e1611aeb3789015fdf +) +hunter_cmake_args(ceres-solver CMAKE_ARGS + # explicitly remove dependency on gflags (only needed for tests) + GFLAGS=OFF + # explicitly disable suitesparse support + LAPACK=OFF + SUITESPARSE=OFF + CXSPARSE=OFF # since 1.14.0-p0 + # don't build tests + BUILD_TESTING=OFF + # also don't build examples: when suitesparse is enabled the examples need Fortran libraries + BUILD_EXAMPLES=OFF +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +# Download package. +hunter_download(PACKAGE_NAME ceres-solver) + diff --git a/cmake/projects/check_ci_tag/hunter.cmake b/cmake/projects/check_ci_tag/hunter.cmake new file mode 100644 index 000000000..b10eae560 --- /dev/null +++ b/cmake/projects/check_ci_tag/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + check_ci_tag + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/check_ci_tag/archive/v1.0.0.tar.gz" + SHA1 + f220960c1174cda57a50a71d6037ca1c4fbbe796 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(check_ci_tag) +hunter_download(PACKAGE_NAME check_ci_tag) diff --git a/cmake/projects/civetweb/hunter.cmake b/cmake/projects/civetweb/hunter.cmake new file mode 100644 index 000000000..a9d651787 --- /dev/null +++ b/cmake/projects/civetweb/hunter.cmake @@ -0,0 +1,49 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + civetweb + VERSION + 1.11-p0 + URL + "https://github.com/hunter-packages/civetweb/archive/v1.11-p0.tar.gz" + SHA1 + de6eee085d98419c2db70787cea0d3aff4639ea7 +) + +hunter_add_version( + PACKAGE_NAME + civetweb + VERSION + 1.10-p1 + URL + "https://github.com/hunter-packages/civetweb/archive/v1.10-p1.tar.gz" + SHA1 + 151d705b4c8eb3fe81b273da6ef65ad8a4c1ef8a +) + +hunter_cmake_args( + civetweb + CMAKE_ARGS + BUILD_TESTING=OFF + CIVETWEB_ENABLE_ASAN=OFF + CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING=OFF + CIVETWEB_INSTALL_EXECUTABLE=OFF + CIVETWEB_BUILD_TESTING=OFF + CIVETWEB_ENABLE_CXX=ON + CIVETWEB_ENABLE_SERVER_EXECUTABLE=OFF + CIVETWEB_INSTALL_EXECUTABLE=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(civetweb) +hunter_download(PACKAGE_NAME civetweb) diff --git a/cmake/projects/class_loader/hunter.cmake b/cmake/projects/class_loader/hunter.cmake new file mode 100644 index 000000000..364bf3c5f --- /dev/null +++ b/cmake/projects/class_loader/hunter.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + class_loader + VERSION + 0.4.1-p0 + URL + "https://github.com/hunter-packages/class_loader/archive/v0.4.1-p0.tar.gz" + SHA1 + 43e3227edd9131a3b4d9e655e60dbba7cd26c3ed +) + +hunter_cmake_args( + class_loader + CMAKE_ARGS + BUILD_SHARED_LIBS:BOOL=ON + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(class_loader) +hunter_download(PACKAGE_NAME class_loader) diff --git a/cmake/projects/cmcstl2/hunter.cmake b/cmake/projects/cmcstl2/hunter.cmake new file mode 100644 index 000000000..559bd44f1 --- /dev/null +++ b/cmake/projects/cmcstl2/hunter.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + cmcstl2 + VERSION + 0.0.0-bee0705e99 + URL + "https://github.com/CaseyCarter/cmcstl2/archive/bee0705e9925dfac430cbf3097f82cca2a7de659.zip" + SHA1 + db38fedd3380137284c4d3570e65f1984597628e +) + +hunter_cmake_args( + cmcstl2 + CMAKE_ARGS + STL2_BUILD_EXAMPLES=OFF + STL2_BUILD_TESTING=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(cmcstl2) +hunter_download(PACKAGE_NAME cmcstl2) + diff --git a/cmake/projects/corrade/hunter.cmake b/cmake/projects/corrade/hunter.cmake new file mode 100644 index 000000000..e45a4f838 --- /dev/null +++ b/cmake/projects/corrade/hunter.cmake @@ -0,0 +1,61 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + corrade + VERSION + 2019.01 + URL + "https://github.com/mosra/corrade/archive/v2019.01.tar.gz" + SHA1 + 3be8da37331e3dd6a2fa0753a49a1c305f4b5b6a +) + +hunter_add_version( + PACKAGE_NAME + corrade + VERSION + 2018.10 + URL + "https://github.com/mosra/corrade/archive/v2018.10.tar.gz" + SHA1 + 240c68bfe89a0cc86411b6854358b1607c06d90d +) + +hunter_add_version( + PACKAGE_NAME + corrade + VERSION + v2018.10 + URL + "https://github.com/mosra/corrade/archive/v2018.10.tar.gz" + SHA1 + 240c68bfe89a0cc86411b6854358b1607c06d90d +) + +hunter_cmake_args( + corrade + CMAKE_ARGS + # Build TestSuite library (these are not tests, but a test library) + WITH_TESTSUITE=ON + # Build PluginManager library + WITH_PLUGINMANAGER=ON + # Build Interconnect library + WITH_INTERCONNECT=ON + # Enable compatibility mode for MSVC 2015 (might disable some features) + MSVC2015_COMPATIBILITY=OFF + # Enable compatibility mode for GCC 4.7 (might disable some features) + GCC47_COMPATIBILITY:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(corrade) +hunter_download(PACKAGE_NAME corrade) diff --git a/cmake/projects/cpp_redis/hunter.cmake b/cmake/projects/cpp_redis/hunter.cmake new file mode 100644 index 000000000..86d65b21a --- /dev/null +++ b/cmake/projects/cpp_redis/hunter.cmake @@ -0,0 +1,31 @@ +# cmake/projects/cpp_redis/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + cpp_redis + VERSION + "3.5.0-h1" + URL + "https://github.com/hunter-packages/cpp_redis/archive/3.5.0-h1.tar.gz" + SHA1 + b88a7f6c303122f4f62f0c37cce8625a592b51d1 +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +# Download package. +# Two versions of library will be build by default: +# * libcpp_redis.a +# * libcpp_redisd.a +hunter_cacheable(cpp_redis) +hunter_download(PACKAGE_NAME cpp_redis) diff --git a/cmake/projects/cppcodec/hunter.cmake b/cmake/projects/cppcodec/hunter.cmake new file mode 100644 index 000000000..28dbbcbd6 --- /dev/null +++ b/cmake/projects/cppcodec/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + cppcodec + VERSION + 0.2-p0 + URL + "https://github.com/hunter-packages/cppcodec/archive/v0.2-p0.tar.gz" + SHA1 + 9c52a769670a0fec4fc524fc036fa792fbb3e22e +) + +hunter_cmake_args( + cppcodec + CMAKE_ARGS + BUILD_TESTING=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(cppcodec) +hunter_download(PACKAGE_NAME cppcodec) diff --git a/cmake/projects/cpr/hunter.cmake b/cmake/projects/cpr/hunter.cmake new file mode 100644 index 000000000..f7d0764f1 --- /dev/null +++ b/cmake/projects/cpr/hunter.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + cpr + VERSION + 1.3.0 + URL + https://github.com/hunter-packages/cpr/archive/1.3.0-p.tar.gz + SHA1 + 6a44d4ed75cc75b21ff7612c319a0d9587fcf18d +) + +hunter_cmake_args(cpr CMAKE_ARGS + BUILD_CPR_TESTS=OFF + CMAKE_USE_OPENSSL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(cpr) +hunter_download(PACKAGE_NAME cpr) diff --git a/cmake/projects/cpuinfo/hunter.cmake b/cmake/projects/cpuinfo/hunter.cmake new file mode 100644 index 000000000..a5fe3c932 --- /dev/null +++ b/cmake/projects/cpuinfo/hunter.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + cpuinfo + VERSION + 0.0.0-d5e37ad-p0 + URL + https://github.com/hunter-packages/cpuinfo/archive/v0.0.0-d5e37ad-p0.tar.gz + SHA1 + 211cc7d1d630e56ee22770f0a9d35c4774d7e671 +) + +hunter_cmake_args(cpuinfo CMAKE_ARGS + CPUINFO_BUILD_TOOLS=OFF + CPUINFO_BUILD_UNIT_TESTS=OFF + CPUINFO_BUILD_MOCK_TESTS=OFF + CPUINFO_BUILD_BENCHMARKS=OFF + CLOG_BUILD_TESTS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(cpuinfo) +hunter_download(PACKAGE_NAME cpuinfo) diff --git a/cmake/projects/crc32c/hunter.cmake b/cmake/projects/crc32c/hunter.cmake new file mode 100644 index 000000000..9237ca9e4 --- /dev/null +++ b/cmake/projects/crc32c/hunter.cmake @@ -0,0 +1,22 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME crc32c + VERSION "1.0.5" + URL "https://github.com/hunter-packages/crc32c/archive/hunter-1.0.5.tar.gz" + SHA1 "dc7fa8cb877b9cb12a4e22e553087fdd6ce28cce") + +hunter_cmake_args(crc32c CMAKE_ARGS + CRC32C_BUILD_TESTS=OFF + CRC32C_BUILD_BENCHMARKS=OFF + CRC32C_USE_GLOG=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(crc32c) +hunter_download(PACKAGE_NAME crc32c) diff --git a/cmake/projects/cryptopp/hunter.cmake b/cmake/projects/cryptopp/hunter.cmake new file mode 100644 index 000000000..f878c4936 --- /dev/null +++ b/cmake/projects/cryptopp/hunter.cmake @@ -0,0 +1,63 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + cryptopp + VERSION + "8.2.0-p0" + URL + "https://github.com/hunter-packages/cryptopp/archive/v8.2.0-p0.tar.gz" + SHA1 + 38a70c9ba970cc862b5cca0010fffdd4e56afcae +) + +hunter_add_version( + PACKAGE_NAME + cryptopp + VERSION + "5.6.5-p0" + URL + "https://github.com/hunter-packages/cryptopp/archive/v5.6.5-p0.tar.gz" + SHA1 + 4258c9b49c48c433c4aa63629bc896ac9a3902e3 +) + +hunter_add_version( + PACKAGE_NAME + cryptopp + VERSION + "5.6.5" + URL + "https://github.com/weidai11/cryptopp/archive/CRYPTOPP_5_6_5.tar.gz" + SHA1 + 3aa4f2fcfee05ed304c6614325c90eba0dc75f16 +) + +hunter_add_version( + PACKAGE_NAME + cryptopp + VERSION + "5.6.4" + URL + "https://github.com/weidai11/cryptopp/archive/CRYPTOPP_5_6_4.tar.gz" + SHA1 + 066e01e704bbdc0f4f785f344c05c8259078a020 +) + +hunter_cmake_args( + cryptopp + CMAKE_ARGS + BUILD_SHARED=OFF + BUILD_TESTING=OFF + USE_INTERMEDIATE_OBJECTS_TARGET=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects +hunter_cacheable(cryptopp) +hunter_download(PACKAGE_NAME cryptopp) diff --git a/cmake/projects/ctti/hunter.cmake b/cmake/projects/ctti/hunter.cmake new file mode 100644 index 000000000..14218c605 --- /dev/null +++ b/cmake/projects/ctti/hunter.cmake @@ -0,0 +1,32 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + ctti + VERSION + "0.0.2" + URL + "https://github.com/hunter-packages/ctti/archive/0.0.2.tar.gz" + SHA1 + 20858e749b12505863f57e4b5c2e7852b3ea9027 +) + +hunter_cmake_args( + ctti + CMAKE_ARGS + CTTI_BUILD_TESTS=OFF + CTTI_BUILD_EXAMPLES=OFF +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ctti) +hunter_download(PACKAGE_NAME ctti) diff --git a/cmake/projects/cub/hunter.cmake b/cmake/projects/cub/hunter.cmake new file mode 100644 index 000000000..0e7d1a61d --- /dev/null +++ b/cmake/projects/cub/hunter.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + cub + VERSION + 1.7.4-p0 + URL + "https://github.com/hunter-packages/cub/archive/v1.7.4-p0.tar.gz" + SHA1 + c90ecb5fd3c393371abb9cfbf61d4fd5e36564f1 + ) + +hunter_add_version( + PACKAGE_NAME + cub + VERSION + 1.8.0-p0 + URL + "https://github.com/hunter-packages/cub/archive/v1.8.0-p0.tar.gz" + SHA1 + 99bbf25d1052f9668c3f7ea140971513e6b661c0 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(cub) +hunter_download(PACKAGE_NAME cub) diff --git a/cmake/projects/cvsteer/hunter.cmake b/cmake/projects/cvsteer/hunter.cmake new file mode 100644 index 000000000..492ac09ba --- /dev/null +++ b/cmake/projects/cvsteer/hunter.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + cvsteer + VERSION + 0.1.1 + URL + "https://github.com/headupinclouds/cvsteer/archive/v0.1.1.tar.gz" + SHA1 + b54b096910c0947e1af125e134b2511b25dc847d + ) + +hunter_add_version( + PACKAGE_NAME + cvsteer + VERSION + 0.1.2 + URL + "https://github.com/headupinclouds/cvsteer/archive/v0.1.2.tar.gz" + SHA1 + a61ae7e1b965d47bca449721150576711f3f7f67 + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(cvsteer) +hunter_download(PACKAGE_NAME cvsteer) diff --git a/cmake/projects/cxxopts/hunter.cmake b/cmake/projects/cxxopts/hunter.cmake new file mode 100644 index 000000000..075e0bbf1 --- /dev/null +++ b/cmake/projects/cxxopts/hunter.cmake @@ -0,0 +1,122 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 1.3.0 + URL + "https://github.com/jarro2783/cxxopts/archive/v1.3.0.tar.gz" + SHA1 + 860dac4282e02d02ec5dde49af8317cd0a959e04 +) + +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 1.4.0 + URL + "https://github.com/jarro2783/cxxopts/archive/v1.4.0.tar.gz" + SHA1 + c5efdf5ea875329e6376622c696378e3778111c3 +) + +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 1.4.1 + URL + "https://github.com/jarro2783/cxxopts/archive/v1.4.1.tar.gz" + SHA1 + 330c8ab0d3eab18429a4d903b640ec26fe1bece1 +) + +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 1.4.2 + URL + "https://github.com/jarro2783/cxxopts/archive/v1.4.2.tar.gz" + SHA1 + 3f2544aeb082a82409ba9bd93f93f37bbd8b0269 +) + +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 1.4.3 + URL + "https://github.com/jarro2783/cxxopts/archive/v1.4.3.tar.gz" + SHA1 + bc9a333a56c0a3d90bcab72ea8ecebed9d66da58 +) + +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 1.4.4 + URL + "https://github.com/jarro2783/cxxopts/archive/v1.4.4.tar.gz" + SHA1 + aa9b63a74a38d90c93cd16f9d091afa7361e2083 +) + +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 2.0.0 + URL + "https://github.com/jarro2783/cxxopts/archive/v2.0.0.tar.gz" + SHA1 + 0466413a55646b7e7947bd0b8f602cb22f17dd23 +) + +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 2.1.0 + URL + "https://github.com/jarro2783/cxxopts/archive/v2.1.0.tar.gz" + SHA1 + eb11b3f56444a70225237eb008d930ae758a0f24 +) + +# FIXME, waiting for release: +# * https://github.com/jarro2783/cxxopts/issues/110#issuecomment-394909564 +hunter_add_version( + PACKAGE_NAME + cxxopts + VERSION + 2.1.1-pre + URL + "https://github.com/jarro2783/cxxopts/archive/e725ea308468ab50751ba7f930842a4c061226e9.zip" + SHA1 + cbeec5576599d031f6f992d987e1f3575b3afee3 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(cxxopts) +hunter_cmake_args( + cxxopts + CMAKE_ARGS + CXXOPTS_BUILD_EXAMPLES=OFF + CXXOPTS_BUILD_TESTS=OFF + CXXOPTS_USE_UNICODE_HELP=OFF +) +hunter_download(PACKAGE_NAME cxxopts) diff --git a/cmake/projects/czmq/hunter.cmake b/cmake/projects/czmq/hunter.cmake new file mode 100644 index 000000000..81bfcbc4b --- /dev/null +++ b/cmake/projects/czmq/hunter.cmake @@ -0,0 +1,65 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + czmq + VERSION + "4.0.2-p1" + URL + "https://github.com/hunter-packages/czmq/archive/v4.0.2-p1.tar.gz" + SHA1 + 6f0a60bdcccd8cadd8de14eb9562cda4e6b0e0b3 +) + +hunter_add_version( + PACKAGE_NAME + czmq + VERSION + "4.0.1-p2" + URL + "https://github.com/hunter-packages/czmq/archive/v4.0.1-p2.tar.gz" + SHA1 + aa52f864ac9f963634bfa46e48e2372b968cb8ef +) + +hunter_add_version( + PACKAGE_NAME + czmq + VERSION + "4.0.0-p2" + URL + "https://github.com/hunter-packages/czmq/archive/v4.0.0-p2.tar.gz" + SHA1 + 5644fc0cb17a57431d1fda541cf76cd0a70ab536 +) + +hunter_add_version( + PACKAGE_NAME + czmq + VERSION + "3.0.2-p1" + URL + "https://github.com/hunter-packages/czmq/archive/v3.0.2-p1.tar.gz" + SHA1 + 1824ab64761a09eb9047660afab2eccca4809fa8 +) + +hunter_add_version( + PACKAGE_NAME + czmq + VERSION + "3.0.1-p1" + URL + "https://github.com/hunter-packages/czmq/archive/v3.0.1-p1.tar.gz" + SHA1 + a0f85e5a746b9b31204e16f952760bc3f054a433 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(czmq) +hunter_download(PACKAGE_NAME czmq) diff --git a/cmake/projects/date/hunter.cmake b/cmake/projects/date/hunter.cmake new file mode 100644 index 000000000..f5cb21b85 --- /dev/null +++ b/cmake/projects/date/hunter.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + date + VERSION + 2.4.1 + URL + "https://github.com/HowardHinnant/date/archive/v2.4.1.tar.gz" + SHA1 + 4ed983e1d19ee28bc565bd62907d203304b38cf7 +) + +hunter_cmake_args(date CMAKE_ARGS USE_SYSTEM_TZ_DB=ON) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(date) +hunter_download(PACKAGE_NAME date) diff --git a/cmake/projects/debug_assert/hunter.cmake b/cmake/projects/debug_assert/hunter.cmake new file mode 100644 index 000000000..8499eaee9 --- /dev/null +++ b/cmake/projects/debug_assert/hunter.cmake @@ -0,0 +1,48 @@ +# cmake/projects/Example/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + debug_assert + VERSION + "1.3.2" + URL + "https://github.com/foonathan/debug_assert/archive/v1.3.2.tar.gz" + SHA1 + f833029bd2bb2af1d7c93d3faf84898722b00bc2 +) + +hunter_add_version( + PACKAGE_NAME + debug_assert + VERSION + "1.3" + URL + "https://github.com/foonathan/debug_assert/archive/v1.3.tar.gz" + SHA1 + 0dd6930196488741ebb79680b261694a8141bf9c +) + +hunter_add_version( + PACKAGE_NAME + debug_assert + VERSION + "1.2" + URL + "https://github.com/foonathan/debug_assert/archive/v1.2.tar.gz" + SHA1 + 0cc89e62d79198fe5df4fda9337bb3e44a0d58c3 +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects +hunter_cacheable(debug_assert) +hunter_download(PACKAGE_NAME debug_assert) diff --git a/cmake/projects/dlpack/hunter.cmake b/cmake/projects/dlpack/hunter.cmake new file mode 100644 index 000000000..2b8cdcfa3 --- /dev/null +++ b/cmake/projects/dlpack/hunter.cmake @@ -0,0 +1,82 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + dlpack + VERSION + "0.2-p0" + URL + "https://github.com/hunter-packages/dlpack/archive/v0.2-p0.tar.gz" + SHA1 + 0ecb2a1bbf1f5578e92c11f1deda96cf625eb401 +) + +hunter_add_version( + PACKAGE_NAME + dlpack + VERSION + "0.2-bee4d1d-p0" + URL + "https://github.com/hunter-packages/dlpack/archive/v0.2-bee4d1d-p0.tar.gz" + SHA1 + 86a28f7458fc029dea30a096e2e0f4b78c7719be +) + +hunter_add_version( + PACKAGE_NAME + dlpack + VERSION + 0.2-5c792ce + URL + "https://github.com/dmlc/dlpack/archive/5c792cef3aee54ad8b7000111c9dc1797f327b59.zip" + SHA1 + 315b8c46ff85ec777fa3e5db06213710f62e1116 +) + +hunter_add_version( + PACKAGE_NAME + dlpack + VERSION + "0.2-5c792ce-p0" + URL + "https://github.com/hunter-packages/dlpack/archive/v0.2-5c792ce-p0.tar.gz" + SHA1 + 0be27ccdaf2142517e21b62cb3629c363ccebbf2 +) + +hunter_add_version( + PACKAGE_NAME + dlpack + VERSION + "0.2-a4aa2f5" + URL + "https://github.com/dmlc/dlpack/archive/a4aa2f516b995e5241331db128bec527d24f4cb6.zip" + SHA1 + 387656143ea23920551a881b157e59cffb91ef71 +) + +hunter_add_version( + PACKAGE_NAME + dlpack + VERSION + "0.2-0acb731" + URL + "https://github.com/dmlc/dlpack/archive/0acb731e0e43d15deee27b66f10e4c5b4e667913.zip" + SHA1 + 4fa2048869dbbc589c05eac3295002b866ee456a +) + +hunter_cmake_args(dlpack CMAKE_ARGS BUILD_MOCK=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(dlpack) +hunter_download(PACKAGE_NAME dlpack) diff --git a/cmake/projects/dmlc-core/hunter.cmake b/cmake/projects/dmlc-core/hunter.cmake new file mode 100644 index 000000000..50e11e2a4 --- /dev/null +++ b/cmake/projects/dmlc-core/hunter.cmake @@ -0,0 +1,114 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + dmlc-core + VERSION + 0.0.0-p1 + URL + https://github.com/hunter-packages/dmlc-core/archive/v0.0.0-p1.tar.gz + SHA1 + ba306bb39910c2bb635fb034150b1afde0a6660c + ) + +hunter_add_version( + PACKAGE_NAME + dmlc-core + VERSION + 0.0.0-p0 + URL + https://github.com/hunter-packages/dmlc-core/archive/v0.0.0-p0.tar.gz + SHA1 + f2fbfca630b897e75507e8d3e9e05cc00eee6e8e + ) + +hunter_add_version( + PACKAGE_NAME + dmlc-core + VERSION + 0.0.0-mxnet-0a0e8ad-p0 + URL + https://github.com/hunter-packages/dmlc-core/archive/0.0.0-mxnet-0a0e8ad-p0.tar.gz + SHA1 + 551ef4e0e51dfd6cdf79d766fe37e64a3a90d3e0 + ) + +hunter_add_version( + PACKAGE_NAME + dmlc-core + VERSION + 0.0.0-946a540-p0 + URL + https://github.com/hunter-packages/dmlc-core/archive/v0.0.0-946a540-p0.tar.gz + SHA1 + e31258568ec9951272fd1a6a25a04e166931ebbd + ) + +hunter_add_version( + PACKAGE_NAME + dmlc-core + VERSION + 0.3-d07fb7a-p0 + URL + "https://github.com/hunter-packages/dmlc-core/archive/v0.3-d07fb7a-p0.tar.gz" + SHA1 + 4f0abf7a0a06091d2c26de073d992e239fd6e63f + ) + +hunter_add_version( + PACKAGE_NAME + dmlc-core + VERSION + 0.3-d07fb7a-p1 + URL + "https://github.com/hunter-packages/dmlc-core/archive/v0.3-d07fb7a-p1.tar.gz" + SHA1 + 3185100daf1942e7fdd7707fa71a3e8598232913 + ) + +hunter_add_version( + PACKAGE_NAME + dmlc-core + VERSION + 0.3-d07fb7a-p2 + URL + "https://github.com/hunter-packages/dmlc-core/archive/v0.3-d07fb7a-p2.tar.gz" + SHA1 + 027989d7f4e4c2bc805ebee08a405e4236e39b73 + ) + +hunter_add_version( + PACKAGE_NAME + dmlc-core + VERSION + 0.3-3943914-p0 + URL + "https://github.com/hunter-packages/dmlc-core/archive/v0.3-3943914-p0.tar.gz" + SHA1 + b81c6bc89f4887971c472bfeefdc756083d13966 + ) + +hunter_cmake_args( + dmlc-core + CMAKE_ARGS + USE_OPENMP=OFF # since not all compilers support this + + # '/usr/include' leaking into compilation will ruine everything + # - https://travis-ci.org/ingenue/hunter/jobs/510403904 + # -- Found Backtrace: /usr/include + CMAKE_DISABLE_FIND_PACKAGE_Backtrace=ON + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(dmlc-core) +hunter_download(PACKAGE_NAME dmlc-core) diff --git a/cmake/projects/doctest/hunter.cmake b/cmake/projects/doctest/hunter.cmake new file mode 100644 index 000000000..4b9a6da71 --- /dev/null +++ b/cmake/projects/doctest/hunter.cmake @@ -0,0 +1,56 @@ +# cmake/projects/Example/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + doctest + VERSION + "1.1.4-hunter-1" + URL + "https://github.com/piribes/doctest/archive/1.1.4-hunter-1.tar.gz" + SHA1 + 684580f4cf1f40ca7750bea90facc4564a807c2a +) + +hunter_add_version( + PACKAGE_NAME + doctest + VERSION + "1.2.0" + URL + "https://github.com/onqtam/doctest/archive/1.2.0.tar.gz" + SHA1 + 53f87a422c7cc842d9b3e06d5a7eb7e35307e6ac +) + +hunter_add_version( + PACKAGE_NAME + doctest + VERSION + "2.2.0" + URL + "https://github.com/onqtam/doctest/archive/2.2.0.tar.gz" + SHA1 + b8a16ca63ce7f263b84f3404db1500fcf2295488 +) + +hunter_cmake_args(doctest CMAKE_ARGS + DOCTEST_SKIP_EXAMPLES=ON + DOCTEST_SKIP_COVERAGE=ON + DOCTEST_WITH_TESTS=OFF +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +hunter_cacheable(doctest) +hunter_download(PACKAGE_NAME doctest) diff --git a/cmake/projects/double-conversion/hunter.cmake b/cmake/projects/double-conversion/hunter.cmake new file mode 100644 index 000000000..fb6060f15 --- /dev/null +++ b/cmake/projects/double-conversion/hunter.cmake @@ -0,0 +1,33 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + double-conversion + VERSION + "3.0.0" + URL + "https://github.com/hunter-packages/double-conversion/archive/v3.0.0-p0.tar.gz" + SHA1 + 8cef7eff66b8488f996fb091f036eb6dc82f92d5 +) + +hunter_add_version( + PACKAGE_NAME + double-conversion + VERSION + "3.1.4" + URL + "https://github.com/google/double-conversion/archive/v3.1.4.tar.gz" + SHA1 + 26a0ddaf0abb7e53c67f2abfac95b1e009c2a002 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(double-conversion) +hunter_download(PACKAGE_NAME double-conversion) diff --git a/cmake/projects/draco/hunter.cmake b/cmake/projects/draco/hunter.cmake new file mode 100644 index 000000000..c91718233 --- /dev/null +++ b/cmake/projects/draco/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + draco + VERSION + 1.3.4-p0 + URL + "https://github.com/hunter-packages/draco/archive/v1.3.4-p0.tar.gz" + SHA1 + 64cd8ac43fc213ad4cb088aa7bba190adb87bb5d +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(draco) +hunter_download(PACKAGE_NAME draco) diff --git a/cmake/projects/drishti/hunter.cmake b/cmake/projects/drishti/hunter.cmake new file mode 100644 index 000000000..36ee80e86 --- /dev/null +++ b/cmake/projects/drishti/hunter.cmake @@ -0,0 +1,54 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + drishti + VERSION + 0.8.4 + URL + "https://github.com/elucideye/drishti/archive/v0.8.4.tar.gz" + SHA1 + 8d3bdc346073c0a1449b213fe374f6baf7589af1 +) + +hunter_add_version( + PACKAGE_NAME + drishti + VERSION + 0.8.6 + URL + "https://github.com/elucideye/drishti/archive/v0.8.6.tar.gz" + SHA1 + 180161389f017719380f344e09f76fd1cdae609d +) + +hunter_add_version( + PACKAGE_NAME + drishti + VERSION + 0.8.9 + URL + "https://github.com/elucideye/drishti/archive/v0.8.9.tar.gz" + SHA1 + b53bd5e779c2f1cca85c74d0c9dce7dd5c2b92f1 + ) + +hunter_cmake_args( + drishti + CMAKE_ARGS + DRISHTI_BUILD_EXAMPLES=NO + DRISHTI_BUILD_OGLES_GPGPU=ON +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(drishti) +hunter_download(PACKAGE_NAME drishti) diff --git a/cmake/projects/drishti_assets/hunter.cmake b/cmake/projects/drishti_assets/hunter.cmake new file mode 100644 index 000000000..9898ea7dd --- /dev/null +++ b/cmake/projects/drishti_assets/hunter.cmake @@ -0,0 +1,47 @@ +# Copyright (c) 2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + drishti_assets + VERSION + 1.6 + URL + "https://github.com/elucideye/drishti-assets/archive/v1.6.tar.gz" + SHA1 + 7787ba57e30146c979780c79ae62e8299cfe3cfd +) + +hunter_add_version( + PACKAGE_NAME + drishti_assets + VERSION + 1.7 + URL + "https://github.com/elucideye/drishti-assets/archive/v1.7.tar.gz" + SHA1 + 1c35ca176e4b30111eed44fd607d8a5ac0c71585 +) + +hunter_add_version( + PACKAGE_NAME + drishti_assets + VERSION + 1.8 + URL + "https://github.com/elucideye/drishti-assets/archive/v1.8.tar.gz" + SHA1 + 1667a5209e83902a46251632dab25cf114d75c96 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(drishti_assets) +hunter_download(PACKAGE_NAME drishti_assets) diff --git a/cmake/projects/drishti_faces/hunter.cmake b/cmake/projects/drishti_faces/hunter.cmake new file mode 100644 index 000000000..a17f47f7e --- /dev/null +++ b/cmake/projects/drishti_faces/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + drishti_faces + VERSION + 1.1 + URL + "https://github.com/elucideye/drishti-faces/archive/v1.1.tar.gz" + SHA1 + 2518ff034bd4c2967cbab4fc7a69d30cf0de057a +) + +hunter_add_version( + PACKAGE_NAME + drishti_faces + VERSION + 1.2 + URL + "https://github.com/elucideye/drishti-faces/archive/v1.2.tar.gz" + SHA1 + 61cf9e459856a06d2da83f84f43f1a0e43955d7a +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(drishti_faces) +hunter_download(PACKAGE_NAME drishti_faces) diff --git a/cmake/projects/duktape/hunter.cmake b/cmake/projects/duktape/hunter.cmake new file mode 100644 index 000000000..1266c0f84 --- /dev/null +++ b/cmake/projects/duktape/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + duktape + VERSION + 1.5.2-p0 + URL + "https://github.com/hunter-packages/duktape/archive/v1.5.2-p0.tar.gz" + SHA1 + d5e271aecae4fd6da5d3526783f4278e83c2853a +) + +hunter_add_version( + PACKAGE_NAME + duktape + VERSION + 2.2.1-p0 + URL + "https://github.com/hunter-packages/duktape/archive/v2.2.1-p0.tar.gz" + SHA1 + 7482a0870d9dd1908384fdc465e1f31fc0ae04ca +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(duktape) +hunter_download(PACKAGE_NAME duktape) diff --git a/cmake/projects/dynalo/hunter.cmake b/cmake/projects/dynalo/hunter.cmake new file mode 100644 index 000000000..fe3438087 --- /dev/null +++ b/cmake/projects/dynalo/hunter.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, Yassine Maddouri +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME dynalo + VERSION 1.0.3 + URL "https://github.com/maddouri/dynalo/archive/1.0.3.tar.gz" + SHA1 b79a1d10c166eea483d0911f849168ceecf8cdbc +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(dynalo) +hunter_download(PACKAGE_NAME dynalo) diff --git a/cmake/projects/eigen3-nnls/hunter.cmake b/cmake/projects/eigen3-nnls/hunter.cmake new file mode 100644 index 000000000..09e9a44a3 --- /dev/null +++ b/cmake/projects/eigen3-nnls/hunter.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + eigen3-nnls + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/eigen3-nnls/archive/v1.0.0.tar.gz" + SHA1 + 0bc34af72ace36e14dc8387e292e338ee30f620d + ) + +hunter_add_version( + PACKAGE_NAME + eigen3-nnls + VERSION + 1.0.1 + URL + "https://github.com/hunter-packages/eigen3-nnls/archive/v1.0.1.tar.gz" + SHA1 + c324595a32b51476eb5e26ce70616709e97b2ec3 + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(eigen3-nnls) +hunter_download(PACKAGE_NAME eigen3-nnls) diff --git a/cmake/projects/enet/hunter.cmake b/cmake/projects/enet/hunter.cmake new file mode 100644 index 000000000..962d789d8 --- /dev/null +++ b/cmake/projects/enet/hunter.cmake @@ -0,0 +1,27 @@ +# cmake/projects/Example/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + enet + VERSION + "1.3.13-p1" + URL + "https://github.com/hunter-packages/enet/archive/v1.3.13-p1.tar.gz" + SHA1 + 40f97cc8d5e41f36fab05c9170836fb55d64191e +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +hunter_cacheable(enet) +hunter_download(PACKAGE_NAME enet) diff --git a/cmake/projects/entityx/hunter.cmake b/cmake/projects/entityx/hunter.cmake new file mode 100644 index 000000000..136c9d317 --- /dev/null +++ b/cmake/projects/entityx/hunter.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + entityx + VERSION + 1.3.0-p1 + URL + "https://github.com/hunter-packages/entityx/archive/v1.3.0-p1.tar.gz" + SHA1 + 8df57150ba8a850ed7250fbd7fd4396a0fa05c22 +) + +hunter_cmake_args( + entityx + CMAKE_ARGS + ENTITYX_BUILD_TESTING=0 + ENTITYX_RUN_BENCHMARKS=0 + ENTITYX_BUILD_SHARED=0 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(entityx) +hunter_download(PACKAGE_NAME entityx) diff --git a/cmake/projects/ethash/hunter.cmake b/cmake/projects/ethash/hunter.cmake new file mode 100644 index 000000000..fb93b0544 --- /dev/null +++ b/cmake/projects/ethash/hunter.cmake @@ -0,0 +1,85 @@ +# Copyright (c) 2018, Pawel Bylica + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ethash + VERSION + 0.1.0 + URL + https://github.com/chfast/ethash/archive/v0.1.0.tar.gz + SHA1 + bc97f901164e04a53c67b536cc9b58fae6ed9bb5 +) + +hunter_add_version( + PACKAGE_NAME + ethash + VERSION + 0.2.0 + URL + https://github.com/chfast/ethash/archive/v0.2.0.tar.gz + SHA1 + 262f0926ccd2f1dc09541c013f257248da976e14 +) + +hunter_add_version( + PACKAGE_NAME + ethash + VERSION + 0.3.0 + URL + https://github.com/chfast/ethash/archive/v0.3.0.tar.gz + SHA1 + 42597f359c25018e058289652caed8475b6fc1e5 +) + +hunter_add_version( + PACKAGE_NAME + ethash + VERSION + 0.4.3 + URL + https://github.com/chfast/ethash/archive/v0.4.3.tar.gz + SHA1 + ec5a7a54c508cc5f2c11d175b68f3ac3db2200ed +) + +hunter_add_version( + PACKAGE_NAME + ethash + VERSION + 0.4.4 + URL + https://github.com/chfast/ethash/archive/v0.4.4.tar.gz + SHA1 + d09e4560cf7e5ea9ce9e3c1f35a98edeb46e6bb6 +) + +hunter_add_version( + PACKAGE_NAME + ethash + VERSION + 0.5.0 + URL + https://github.com/chfast/ethash/archive/v0.5.0.tar.gz + SHA1 + 674af68ac051e46895ad74f68c9378311fe89b2b +) + +hunter_cmake_args( + ethash + CMAKE_ARGS + ETHASH_BUILD_TESTS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ethash) +hunter_download(PACKAGE_NAME ethash) diff --git a/cmake/projects/farmhash/hunter.cmake b/cmake/projects/farmhash/hunter.cmake new file mode 100644 index 000000000..a53ba2dc2 --- /dev/null +++ b/cmake/projects/farmhash/hunter.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + farmhash + VERSION + 1.1 + URL + https://github.com/hunter-packages/farmhash/archive/v1.1.tar.gz + SHA1 + d2f911dc4fa72af2a6ff82c2ca372c7b0f05493d + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(farmhash) +hunter_download(PACKAGE_NAME farmhash) diff --git a/cmake/projects/ffmpeg/hunter.cmake b/cmake/projects/ffmpeg/hunter.cmake new file mode 100644 index 000000000..49dd17f5a --- /dev/null +++ b/cmake/projects/ffmpeg/hunter.cmake @@ -0,0 +1,83 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ffmpeg + VERSION + n4.1-dev-45499e557c-p1 + URL + "https://github.com/hunter-packages/FFmpeg/archive/n4.1-dev-45499e557c-p1.tar.gz" + SHA1 + cc130bde82f4f71fed00496a5a9b9348f427536e +) + +hunter_add_version( + PACKAGE_NAME + ffmpeg + VERSION + n4.1-dev-45499e557c-p2 + URL + "https://github.com/hunter-packages/FFmpeg/archive/n4.1-dev-45499e557c-p2.tar.gz" + SHA1 + 41935479eda43783440d220bb9da04f4dae5ceaa +) + +hunter_add_version( + PACKAGE_NAME + ffmpeg + VERSION + n4.1-dev-45499e557c-p3 + URL + "https://github.com/hunter-packages/FFmpeg/archive/n4.1-dev-45499e557c-p3.tar.gz" + SHA1 + 4f14e0ffd920f8cd5e17496189166ce5b6a5983b +) + +hunter_add_version( + PACKAGE_NAME + ffmpeg + VERSION + n4.1-dev-45499e557c-p4 + URL + "https://github.com/hunter-packages/FFmpeg/archive/n4.1-dev-45499e557c-p4.tar.gz" + SHA1 + e54bfe17b6e6d46de28ee79599e691b318ea50e4 +) + +hunter_add_version( + PACKAGE_NAME + ffmpeg + VERSION + n4.1-dev-45499e557c-p6 + URL + "https://github.com/hunter-packages/FFmpeg/archive/n4.1-dev-45499e557c-p6.tar.gz" + SHA1 + a6b9a15d56a652ca151d2cf4b1686a2da3f1545c +) + +hunter_add_version( + PACKAGE_NAME + ffmpeg + VERSION + n4.1-dev-45499e557c-p7 + URL + "https://github.com/hunter-packages/FFmpeg/archive/n4.1-dev-45499e557c-p7.tar.gz" + SHA1 + 477525bae6a5395f61b470d25b47163a4048dab6 +) + +# GCC 4.8 + examples/OpenCV-ffmpeg link error +hunter_configuration_types(ffmpeg CONFIGURATION_TYPES Release) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ffmpeg) +hunter_download(PACKAGE_NAME ffmpeg) diff --git a/cmake/projects/fft2d/hunter.cmake b/cmake/projects/fft2d/hunter.cmake new file mode 100644 index 000000000..3795b5073 --- /dev/null +++ b/cmake/projects/fft2d/hunter.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + fft2d + VERSION + 1.0.0-p0 + URL + "https://github.com/hunter-packages/fft2d/archive/v1.0.0-p0.tar.gz" + SHA1 + 080f5415229653fe032e981e4ce65a05a6967bbe + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(fft2d) +hunter_download(PACKAGE_NAME fft2d) diff --git a/cmake/projects/flex/hunter.cmake b/cmake/projects/flex/hunter.cmake new file mode 100644 index 000000000..836157335 --- /dev/null +++ b/cmake/projects/flex/hunter.cmake @@ -0,0 +1,25 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + flex + VERSION + "2.6.4" + URL + "https://github.com/westes/flex/files/981163/flex-2.6.4.tar.gz" + SHA1 + fafece095a0d9890ebd618adb1f242d8908076e1 +) + +hunter_configuration_types(flex CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_flex_autotools) +hunter_cacheable(flex) +hunter_download(PACKAGE_NAME flex + PACKAGE_INTERNAL_DEPS_ID "1") diff --git a/cmake/projects/flex/schemes/url_sha1_flex_autotools.cmake.in b/cmake/projects/flex/schemes/url_sha1_flex_autotools.cmake.in new file mode 100644 index 000000000..e5dc8699f --- /dev/null +++ b/cmake/projects/flex/schemes/url_sha1_flex_autotools.cmake.in @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.0) +project(Hunter) + +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_autotools_project) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_user_error) + +hunter_status_debug("Scheme: url_sha1_flex_autotools") + +if("@MSVC@") + hunter_user_error("Autotools scheme not supported with Visual Studio") +endif() + +# Check preconditions +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") + +hunter_autotools_project("@HUNTER_EP_NAME@" + HUNTER_SELF + "@HUNTER_SELF@" + URL + @HUNTER_PACKAGE_URL@ + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" + BUILD_DIR + "@HUNTER_PACKAGE_BUILD_DIR@" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + GLOBAL_INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" + PARALLEL_JOBS + "@HUNTER_JOBS_OPTION@" + PACKAGE_CONFIGURATION_TYPES + "@HUNTER_PACKAGE_CONFIGURATION_TYPES@" + CPPFLAGS + "-D_GNU_SOURCE" +) diff --git a/cmake/projects/folly/hunter.cmake b/cmake/projects/folly/hunter.cmake new file mode 100644 index 000000000..e6f02f87b --- /dev/null +++ b/cmake/projects/folly/hunter.cmake @@ -0,0 +1,90 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + folly + VERSION + 2017.11.13.00-p0 + URL + "https://github.com/hunter-packages/folly/archive/v2017.11.13.00-p0.tar.gz" + SHA1 + cb7592adcda706df5f558466b96b1ab4c6bc751a +) + +hunter_add_version( + PACKAGE_NAME + folly + VERSION + 2018.10.22.00-p2 + URL + "https://github.com/hunter-packages/folly/archive/v2018.10.22.00-p2.tar.gz" + SHA1 + 5cd5d03bbddd3ad047afc0e402bd3ee3af2888f4 +) + +hunter_add_version( + PACKAGE_NAME + folly + VERSION + 2018.10.22.00-p3 + URL + "https://github.com/hunter-packages/folly/archive/v2018.10.22.00-p3.tar.gz" + SHA1 + 74487a7393a9cac9c8b49581b3fe965c129d28f3 +) + +hunter_add_version( + PACKAGE_NAME + folly + VERSION + 2018.10.22.00-p4 + URL + "https://github.com/hunter-packages/folly/archive/v2018.10.22.00-p4.tar.gz" + SHA1 + aeb254f1010cff1857e5fff897ebbc20e710b410 +) + +set(__hunter_folly_args FOLLY_POD_CONFIGURATION=ON) + +if("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + set(__hunter_folly_windows_store TRUE) +else() + set(__hunter_folly_windows_store FALSE) +endif() + +if(__hunter_folly_windows_store) + list(APPEND __hunter_folly_args FOLLY_USE_GLOG=OFF) +endif() + +if(IOS OR ANDROID OR __hunter_folly_windows_store) + # Fix 'try_run' + list( + APPEND + __hunter_folly_args + FOLLY_HAVE_UNALIGNED_ACCESS_EXITCODE="" + FOLLY_HAVE_UNALIGNED_ACCESS_EXITCODE__TRYRUN_OUTPUT="" + FOLLY_HAVE_LINUX_VDSO_EXITCODE="" + FOLLY_HAVE_LINUX_VDSO_EXITCODE__TRYRUN_OUTPUT="" + FOLLY_HAVE_WCHAR_SUPPORT_EXITCODE="" + FOLLY_HAVE_WCHAR_SUPPORT_EXITCODE__TRYRUN_OUTPUT="" + HAVE_VSNPRINTF_ERRORS_EXITCODE="" + HAVE_VSNPRINTF_ERRORS_EXITCODE__TRYRUN_OUTPUT="" + FOLLY_HAVE_XSI_STRERROR_R_EXITCODE="" + FOLLY_HAVE_XSI_STRERROR_R_EXITCODE__TRYRUN_OUTPUT="" + ) +endif() + +hunter_cmake_args(folly CMAKE_ARGS ${__hunter_folly_args}) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(folly) +hunter_download(PACKAGE_NAME folly) diff --git a/cmake/projects/foo/hunter.cmake b/cmake/projects/foo/hunter.cmake new file mode 100644 index 000000000..478a1557a --- /dev/null +++ b/cmake/projects/foo/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + foo + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/foo/archive/v1.0.0.tar.gz" + SHA1 + 1111111111111111111111111111111111111111 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(foo) +hunter_download(PACKAGE_NAME foo) diff --git a/cmake/projects/frugally-deep/hunter.cmake b/cmake/projects/frugally-deep/hunter.cmake new file mode 100644 index 000000000..df2d61d21 --- /dev/null +++ b/cmake/projects/frugally-deep/hunter.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2013-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +hunter_cacheable(frugally-deep) + +hunter_add_version( + PACKAGE_NAME frugally-deep + VERSION 0.2.2-p0 + URL "https://github.com/Dobiasd/frugally-deep/archive/v0.2.2-p0.tar.gz" + SHA1 330fd9d2177c4b2ac5ebb9ef17bf358a8dfbd62b +) + +hunter_add_version( + PACKAGE_NAME frugally-deep + VERSION 0.2.1-p0 + URL "https://github.com/Dobiasd/frugally-deep/archive/v0.2.1-p0.tar.gz" + SHA1 9a9287e059cc25c1ffc938c1815b9d4c323683be +) + +hunter_cmake_args( + frugally-deep + CMAKE_ARGS + FDEEP_USE_TOOLCHAIN=ON + FDEEP_BUILD_UNITTEST=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(frugally-deep) +hunter_download(PACKAGE_NAME frugally-deep) diff --git a/cmake/projects/gRPC/hunter.cmake b/cmake/projects/gRPC/hunter.cmake new file mode 100644 index 000000000..682c6197c --- /dev/null +++ b/cmake/projects/gRPC/hunter.cmake @@ -0,0 +1,40 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME gRPC + VERSION "1.6.6" + URL "https://github.com/hunter-packages/grpc/archive/v1.6.6-p7.tar.gz" + SHA1 "4658a5f88aad19dc8105a8662db616837bacb6cd") + +hunter_add_version( + PACKAGE_NAME gRPC + VERSION "1.8.1" + URL "https://github.com/hunter-packages/grpc/archive/v1.8.1-p0.tar.gz" + SHA1 "d38c4895a689b394bebdb8a4960a616d850b62b8") + +hunter_add_version( + PACKAGE_NAME gRPC + VERSION "1.9.1-p0" + URL "https://github.com/hunter-packages/grpc/archive/v1.9.1-p0.tar.gz" + SHA1 "ecde82be350f51b2f41bdd5378f92513b3ebccc1") + +hunter_add_version( + PACKAGE_NAME gRPC + VERSION "1.12.1-p0" + URL "https://github.com/hunter-packages/grpc/archive/v1.12.1-p0.tar.gz" + SHA1 "cee253f1a9075afe7eb8061a2783f50368ff3495") + +hunter_add_version( + PACKAGE_NAME gRPC + VERSION "1.17.2-p0" + URL "https://github.com/hunter-packages/grpc/archive/v1.17.2-p0.tar.gz" + SHA1 "7eb5711cc4fbc7a33563121b1a6921eac0a863ef") + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(gRPC) +hunter_download(PACKAGE_NAME gRPC) diff --git a/cmake/projects/gauze/hunter.cmake b/cmake/projects/gauze/hunter.cmake new file mode 100644 index 000000000..784ad0817 --- /dev/null +++ b/cmake/projects/gauze/hunter.cmake @@ -0,0 +1,158 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.1.0 + URL + "https://github.com/hunter-packages/gauze/archive/v0.1.0.tar.gz" + SHA1 + 6944f77d5eb61c067acebf06231a29b90963b7c0 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.1.1 + URL + "https://github.com/hunter-packages/gauze/archive/v0.1.1.tar.gz" + SHA1 + 4993b09855e51047ea51136a05fcd6d0216f2716 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.1.2 + URL + "https://github.com/hunter-packages/gauze/archive/v0.1.2.tar.gz" + SHA1 + 43e56210b7f42bd83bb15a91acb1f940037da329 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.2.0 + URL + "https://github.com/hunter-packages/gauze/archive/v0.2.0.tar.gz" + SHA1 + 1e5705ce502b2794a5bc13bbd7964e9c0010fa25 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.3.0 + URL + "https://github.com/hunter-packages/gauze/archive/v0.3.0.tar.gz" + SHA1 + 7d2fd034f49e679f114e620d0bd1ade0c4f59df9 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.3.1 + URL + "https://github.com/hunter-packages/gauze/archive/v0.3.1.tar.gz" + SHA1 + 60a1c9eafe02259d262a2d44ad784878db9de740 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.3.2 + URL + "https://github.com/hunter-packages/gauze/archive/v0.3.2.tar.gz" + SHA1 + 8994a92cc42a099bd3e19656acb939d9a53fd926 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.3.3 + URL + "https://github.com/hunter-packages/gauze/archive/v0.3.3.tar.gz" + SHA1 + b9e047217b27b4e5ee9e85e51a13ef391550e8eb +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.4.0 + URL + "https://github.com/hunter-packages/gauze/archive/v0.4.0.tar.gz" + SHA1 + 5b8da33fed8f5eacbc884318c88f3f50a7a59bb6 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.5.0 + URL + "https://github.com/hunter-packages/gauze/archive/v0.5.0.tar.gz" + SHA1 + 3fff909740e22ce789c57eba7eb35dce916957b3 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.6.0 + URL + "https://github.com/hunter-packages/gauze/archive/v0.6.0.tar.gz" + SHA1 + be82af13be82d92809fb0d132b9d7e554d06c07b +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.7.0 + URL + "https://github.com/hunter-packages/gauze/archive/v0.7.0.tar.gz" + SHA1 + 88261e2d68654659323ef452bccdad10766575d4 +) + +hunter_add_version( + PACKAGE_NAME + gauze + VERSION + 0.7.1 + URL + "https://github.com/hunter-packages/gauze/archive/v0.7.1.tar.gz" + SHA1 + 858ccd32c2e9901df7c19757aa3f742b49b78ed2 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(gauze) +hunter_cmake_args(gauze CMAKE_ARGS GAUZE_BUILD_TESTS=OFF) +hunter_download(PACKAGE_NAME gauze) diff --git a/cmake/projects/gemmlowp/hunter.cmake b/cmake/projects/gemmlowp/hunter.cmake new file mode 100644 index 000000000..32171006b --- /dev/null +++ b/cmake/projects/gemmlowp/hunter.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + gemmlowp + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/gemmlowp/archive/v1.0.0.tar.gz" + SHA1 + 2da3f6f97b9e3368a3afd5d002334248b79cf6c3 + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(gemmlowp) +hunter_download(PACKAGE_NAME gemmlowp) diff --git a/cmake/projects/getopt/hunter.cmake b/cmake/projects/getopt/hunter.cmake new file mode 100644 index 000000000..ef9a8b9e5 --- /dev/null +++ b/cmake/projects/getopt/hunter.cmake @@ -0,0 +1,26 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + getopt + VERSION + "1.0.0-p0" + URL + "https://github.com/caseymcc/getopt/archive/1.0.0-p0.tar.gz" + SHA1 + 4e9a11b5dad6ff849fbb775556df02251198c249 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(getopt) + +if(NOT MSVC) #only for Visual Studios, all other posix compiliers should have getopt + hunter_user_error("Only for MSVC") +endif() + +hunter_download(PACKAGE_NAME getopt) diff --git a/cmake/projects/giflib/hunter.cmake b/cmake/projects/giflib/hunter.cmake new file mode 100644 index 000000000..7d5eadb57 --- /dev/null +++ b/cmake/projects/giflib/hunter.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + giflib + VERSION + 5.1.4-p0 + URL + "https://github.com/hunter-packages/giflib/archive/v5.1.4-p0.tar.gz" + SHA1 + d93b71a805de3c24316e55164828fe687527a8f4 + ) + +hunter_add_version( + PACKAGE_NAME + giflib + VERSION + 5.1.4-p1 + URL + "https://github.com/hunter-packages/giflib/archive/v5.1.4-p1.tar.gz" + SHA1 + 886897af5b36a5d3179e31cf2c1f2d83170eae52 + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(giflib) +hunter_download(PACKAGE_NAME giflib) diff --git a/cmake/projects/glbinding/hunter.cmake b/cmake/projects/glbinding/hunter.cmake new file mode 100644 index 000000000..38cfec3d4 --- /dev/null +++ b/cmake/projects/glbinding/hunter.cmake @@ -0,0 +1,54 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +# List of versions here... + +hunter_add_version( + PACKAGE_NAME + glbinding + VERSION + "3.0.2-p0" + URL + "https://github.com/hunter-packages/glbinding/archive/v3.0.2-p0.tar.gz" + SHA1 + ef0a1585db171f8321aa620699391d1641443989 +) + + +hunter_add_version( + PACKAGE_NAME + glbinding + VERSION + "2.1.3-p0" + URL + "https://github.com/hunter-packages/glbinding/archive/v2.1.3-p0.tar.gz" + SHA1 + 7bb774ee35f63e7f769d4f4ae6194cbc3f8afe16 +) + +hunter_cmake_args( + glbinding + CMAKE_ARGS + BUILD_SHARED_LIBS=OFF + OPTION_BUILD_TESTS=OFF + OPTION_BUILD_GPU_TESTS=OFF + OPTION_BUILD_EXAMPLES=OFF + OPTION_BUILD_TOOLS=OFF + OPTION_BUILD_DOCS=OFF + HUNTER_INSTALL_LICENSE_FILES=LICENSE +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects +hunter_cacheable(glbinding) + +# Download package. +# Two versions of library will be build by default: +hunter_download(PACKAGE_NAME glbinding) + diff --git a/cmake/projects/glib/hunter.cmake b/cmake/projects/glib/hunter.cmake new file mode 100644 index 000000000..280ad52c8 --- /dev/null +++ b/cmake/projects/glib/hunter.cmake @@ -0,0 +1,54 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + glib + VERSION + 2.54.0 + URL + "https://download.gnome.org/sources/glib/2.54/glib-2.54.0.tar.xz" + SHA1 + 96b434a9ca142344b93f38ed0cd88d36196b68ae +) + +hunter_configuration_types(glib CONFIGURATION_TYPES Release) + +hunter_cmake_args( + glib + CMAKE_ARGS + DEPENDS_ON_PACKAGES=libffi;util_linux;libpcre;ZLIB + DEPENDS_ON_PKGCONFIGS=libffi;blkid;fdisk;mount;smartcols;uuid;libpcre;libpcrecpp;libpcreposix + PKGCONFIG_EXPORT_TARGETS=glib-2.0 +) + +hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cacheable(glib) +hunter_download( + PACKAGE_NAME glib + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "bin/glib-gettextize" + "lib/libgio-2.0.la" + "lib/libglib-2.0.la" + "lib/libgmodule-2.0.la" + "lib/libgobject-2.0.la" + "lib/libgthread-2.0.la" + "lib/pkgconfig/gio-2.0.pc" + "lib/pkgconfig/gio-unix-2.0.pc" + "lib/pkgconfig/glib-2.0.pc" + "lib/pkgconfig/gmodule-2.0.pc" + "lib/pkgconfig/gmodule-export-2.0.pc" + "lib/pkgconfig/gmodule-no-export-2.0.pc" + "lib/pkgconfig/gobject-2.0.pc" + "lib/pkgconfig/gthread-2.0.pc" +) diff --git a/cmake/projects/globjects/hunter.cmake b/cmake/projects/globjects/hunter.cmake new file mode 100644 index 000000000..e925f3070 --- /dev/null +++ b/cmake/projects/globjects/hunter.cmake @@ -0,0 +1,41 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +# List of versions here... + +hunter_add_version( + PACKAGE_NAME + globjects + VERSION + "1.1.0-p0" + URL + "https://github.com/hunter-packages/globjects/archive/v1.1.0-p0.tar.gz" + SHA1 + c20c8f9c384802be99b8449b447c0620c603b027 +) + +hunter_cmake_args( + globjects + CMAKE_ARGS + BUILD_SHARED_LIBS=OFF + OPTION_BUILD_TESTS=OFF + OPTION_BUILD_EXAMPLES=OFF + OPTION_BUILD_TOOLS=OFF + OPTION_BUILD_DOCS=OFF + HUNTER_INSTALL_LICENSE_FILES=LICENSE +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects +hunter_cacheable(globjects) + +# Download package. +# Two versions of library will be build by default: +hunter_download(PACKAGE_NAME globjects) + diff --git a/cmake/projects/glslang/hunter.cmake b/cmake/projects/glslang/hunter.cmake new file mode 100644 index 000000000..26d2ddf69 --- /dev/null +++ b/cmake/projects/glslang/hunter.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + glslang + VERSION + 7.7.2767-p0 + URL + "https://github.com/hunter-packages/glslang/archive/v7.7.2767-p0.tar.gz" + SHA1 + 44d6157e5bf6005f1f611bcea323488e6268d9c9 +) + +if(IOS) +hunter_cmake_args( + glslang + CMAKE_ARGS + ENABLE_HLSL=OFF + ENABLE_GLSLANG_BINARIES=OFF +) +else() +hunter_cmake_args( + glslang + CMAKE_ARGS + ENABLE_HLSL=OFF +) +endif() + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(glslang) +hunter_download(PACKAGE_NAME glslang) diff --git a/cmake/projects/gst_plugins_bad/hunter.cmake b/cmake/projects/gst_plugins_bad/hunter.cmake new file mode 100644 index 000000000..e01945455 --- /dev/null +++ b/cmake/projects/gst_plugins_bad/hunter.cmake @@ -0,0 +1,143 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + gst_plugins_bad + VERSION + 1.10.4 + URL + "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.10.4.tar.xz" + SHA1 + 97ac75ee92e37cdff75298cd98ce29b8b0c2b5c7 +) + +set( + _gstreamer_components + bad-audio + bad-base + bad-video + codecparsers + insertbin + mpegts + player + plugins-bad +) + +set(_gstreamer_pkg "") +foreach(_x ${_gstreamer_components}) + list(APPEND _gstreamer_pkg gstreamer-${_x}-1.0) +endforeach() + +hunter_cmake_args( + gst_plugins_bad + CMAKE_ARGS + DEPENDS_ON_PACKAGES=gst_plugins_base + DEPENDS_ON_PKGCONFIGS=gstreamer-plugins-base-1.0 # ??? + PKGCONFIG_EXPORT_TARGETS=${_gstreamer_pkg} +) + +hunter_configuration_types(gst_plugins_bad CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cacheable(gst_plugins_bad) + +hunter_download( + PACKAGE_NAME + gst_plugins_bad + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/gstreamer-1.0/libgstaccurip.la" + "lib/gstreamer-1.0/libgstadpcmdec.la" + "lib/gstreamer-1.0/libgstadpcmenc.la" + "lib/gstreamer-1.0/libgstaiff.la" + "lib/gstreamer-1.0/libgstasfmux.la" + "lib/gstreamer-1.0/libgstaudiofxbad.la" + "lib/gstreamer-1.0/libgstaudiomixer.la" + "lib/gstreamer-1.0/libgstaudiovisualizers.la" + "lib/gstreamer-1.0/libgstautoconvert.la" + "lib/gstreamer-1.0/libgstbayer.la" + "lib/gstreamer-1.0/libgstbz2.la" + "lib/gstreamer-1.0/libgstcamerabin2.la" + "lib/gstreamer-1.0/libgstcoloreffects.la" + "lib/gstreamer-1.0/libgstcompositor.la" + "lib/gstreamer-1.0/libgstdataurisrc.la" + "lib/gstreamer-1.0/libgstdebugutilsbad.la" + "lib/gstreamer-1.0/libgstdecklink.la" + "lib/gstreamer-1.0/libgstdvb.la" + "lib/gstreamer-1.0/libgstdvbsuboverlay.la" + "lib/gstreamer-1.0/libgstdvdspu.la" + "lib/gstreamer-1.0/libgstfbdevsink.la" + "lib/gstreamer-1.0/libgstfestival.la" + "lib/gstreamer-1.0/libgstfieldanalysis.la" + "lib/gstreamer-1.0/libgstfreeverb.la" + "lib/gstreamer-1.0/libgstfrei0r.la" + "lib/gstreamer-1.0/libgstgaudieffects.la" + "lib/gstreamer-1.0/libgstgdp.la" + "lib/gstreamer-1.0/libgstgeometrictransform.la" + "lib/gstreamer-1.0/libgsthls.la" + "lib/gstreamer-1.0/libgstid3tag.la" + "lib/gstreamer-1.0/libgstinter.la" + "lib/gstreamer-1.0/libgstinterlace.la" + "lib/gstreamer-1.0/libgstivfparse.la" + "lib/gstreamer-1.0/libgstivtc.la" + "lib/gstreamer-1.0/libgstjp2kdecimator.la" + "lib/gstreamer-1.0/libgstjpegformat.la" + "lib/gstreamer-1.0/libgstmidi.la" + "lib/gstreamer-1.0/libgstmpegpsdemux.la" + "lib/gstreamer-1.0/libgstmpegpsmux.la" + "lib/gstreamer-1.0/libgstmpegtsdemux.la" + "lib/gstreamer-1.0/libgstmpegtsmux.la" + "lib/gstreamer-1.0/libgstmxf.la" + "lib/gstreamer-1.0/libgstnetsim.la" + "lib/gstreamer-1.0/libgstpcapparse.la" + "lib/gstreamer-1.0/libgstpnm.la" + "lib/gstreamer-1.0/libgstrawparse.la" + "lib/gstreamer-1.0/libgstremovesilence.la" + "lib/gstreamer-1.0/libgstrfbsrc.la" + "lib/gstreamer-1.0/libgstrtponvif.la" + "lib/gstreamer-1.0/libgstsdpelem.la" + "lib/gstreamer-1.0/libgstsegmentclip.la" + "lib/gstreamer-1.0/libgstshm.la" + "lib/gstreamer-1.0/libgstsiren.la" + "lib/gstreamer-1.0/libgstsmooth.la" + "lib/gstreamer-1.0/libgstspeed.la" + "lib/gstreamer-1.0/libgststereo.la" + "lib/gstreamer-1.0/libgstsubenc.la" + "lib/gstreamer-1.0/libgsttimecode.la" + "lib/gstreamer-1.0/libgstvcdsrc.la" + "lib/gstreamer-1.0/libgstvideofiltersbad.la" + "lib/gstreamer-1.0/libgstvideoframe_audiolevel.la" + "lib/gstreamer-1.0/libgstvideoparsersbad.la" + "lib/gstreamer-1.0/libgstvideosignal.la" + "lib/gstreamer-1.0/libgstvmnc.la" + "lib/gstreamer-1.0/libgsty4mdec.la" + "lib/gstreamer-1.0/libgstyadif.la" + "lib/libgstadaptivedemux-1.0.la" + "lib/libgstbadaudio-1.0.la" + "lib/libgstbadbase-1.0.la" + "lib/libgstbadvideo-1.0.la" + "lib/libgstbasecamerabinsrc-1.0.la" + "lib/libgstcodecparsers-1.0.la" + "lib/libgstinsertbin-1.0.la" + "lib/libgstmpegts-1.0.la" + "lib/libgstphotography-1.0.la" + "lib/libgstplayer-1.0.la" + "lib/libgsturidownloader-1.0.la" + "lib/pkgconfig/gstreamer-bad-audio-1.0.pc" + "lib/pkgconfig/gstreamer-bad-base-1.0.pc" + "lib/pkgconfig/gstreamer-bad-video-1.0.pc" + "lib/pkgconfig/gstreamer-codecparsers-1.0.pc" + "lib/pkgconfig/gstreamer-insertbin-1.0.pc" + "lib/pkgconfig/gstreamer-mpegts-1.0.pc" + "lib/pkgconfig/gstreamer-player-1.0.pc" + "lib/pkgconfig/gstreamer-plugins-bad-1.0.pc" +) diff --git a/cmake/projects/gst_plugins_base/hunter.cmake b/cmake/projects/gst_plugins_base/hunter.cmake new file mode 100644 index 000000000..a11d68e72 --- /dev/null +++ b/cmake/projects/gst_plugins_base/hunter.cmake @@ -0,0 +1,104 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + gst_plugins_base + VERSION + 1.10.4 + URL + "https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.10.4.tar.xz" + SHA1 + c6749d515d49373f2e04e7a87f5fc5bcfa16d7ef +) + +set( + _gst_export_components + allocators + app + audio + fft + pbutils + plugins-base + riff + rtp + rtsp + sdp + tag + video +) + +set(_gst_export_targets "") +foreach(_x ${_gst_export_components}) + list(APPEND _gst_export_targets gstreamer-${_x}-1.0) +endforeach() + +hunter_cmake_args( + gst_plugins_base + CMAKE_ARGS + DEPENDS_ON_PACKAGES=gstreamer;libogg;x11 + DEPENDS_ON_PKGCONFIGS=gstreamer-1.0 + PKGCONFIG_EXPORT_TARGETS=${_gst_export_targets} +) + +hunter_configuration_types(gst_plugins_base CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cacheable(gst_plugins_base) + +hunter_download( + PACKAGE_NAME + gst_plugins_base + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/gstreamer-1.0/libgstadder.la" + "lib/gstreamer-1.0/libgstapp.la" + "lib/gstreamer-1.0/libgstaudioconvert.la" + "lib/gstreamer-1.0/libgstaudiorate.la" + "lib/gstreamer-1.0/libgstaudioresample.la" + "lib/gstreamer-1.0/libgstaudiotestsrc.la" + "lib/gstreamer-1.0/libgstencodebin.la" + "lib/gstreamer-1.0/libgstgio.la" + "lib/gstreamer-1.0/libgstogg.la" + "lib/gstreamer-1.0/libgstplayback.la" + "lib/gstreamer-1.0/libgstsubparse.la" + "lib/gstreamer-1.0/libgsttcp.la" + "lib/gstreamer-1.0/libgsttypefindfunctions.la" + "lib/gstreamer-1.0/libgstvideoconvert.la" + "lib/gstreamer-1.0/libgstvideorate.la" + "lib/gstreamer-1.0/libgstvideoscale.la" + "lib/gstreamer-1.0/libgstvideotestsrc.la" + "lib/gstreamer-1.0/libgstvolume.la" + "lib/gstreamer-1.0/libgstximagesink.la" + "lib/libgstallocators-1.0.la" + "lib/libgstapp-1.0.la" + "lib/libgstaudio-1.0.la" + "lib/libgstfft-1.0.la" + "lib/libgstpbutils-1.0.la" + "lib/libgstriff-1.0.la" + "lib/libgstrtp-1.0.la" + "lib/libgstrtsp-1.0.la" + "lib/libgstsdp-1.0.la" + "lib/libgsttag-1.0.la" + "lib/libgstvideo-1.0.la" + "lib/pkgconfig/gstreamer-allocators-1.0.pc" + "lib/pkgconfig/gstreamer-app-1.0.pc" + "lib/pkgconfig/gstreamer-audio-1.0.pc" + "lib/pkgconfig/gstreamer-fft-1.0.pc" + "lib/pkgconfig/gstreamer-pbutils-1.0.pc" + "lib/pkgconfig/gstreamer-plugins-base-1.0.pc" + "lib/pkgconfig/gstreamer-riff-1.0.pc" + "lib/pkgconfig/gstreamer-rtp-1.0.pc" + "lib/pkgconfig/gstreamer-rtsp-1.0.pc" + "lib/pkgconfig/gstreamer-sdp-1.0.pc" + "lib/pkgconfig/gstreamer-tag-1.0.pc" + "lib/pkgconfig/gstreamer-video-1.0.pc" +) diff --git a/cmake/projects/gst_plugins_good/hunter.cmake b/cmake/projects/gst_plugins_good/hunter.cmake new file mode 100644 index 000000000..13a755e93 --- /dev/null +++ b/cmake/projects/gst_plugins_good/hunter.cmake @@ -0,0 +1,89 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + gst_plugins_good + VERSION + 1.10.4 + URL + "https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.10.4.tar.xz" + SHA1 + 6ff3f3a7facae861c7687f27055fd9ced7c7fe10 +) + +hunter_cmake_args( + gst_plugins_good + CMAKE_ARGS + DEPENDS_ON_PACKAGES=gst_plugins_base;xext;Jpeg + DEPENDS_ON_PKGCONFIGS=gstreamer-plugins-base-1.0 # ??? +) + +hunter_configuration_types(gst_plugins_good CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cacheable(gst_plugins_good) + +hunter_download( + PACKAGE_NAME + gst_plugins_good + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/gstreamer-1.0/libgstalaw.la" + "lib/gstreamer-1.0/libgstalpha.la" + "lib/gstreamer-1.0/libgstalphacolor.la" + "lib/gstreamer-1.0/libgstapetag.la" + "lib/gstreamer-1.0/libgstaudiofx.la" + "lib/gstreamer-1.0/libgstaudioparsers.la" + "lib/gstreamer-1.0/libgstauparse.la" + "lib/gstreamer-1.0/libgstautodetect.la" + "lib/gstreamer-1.0/libgstavi.la" + "lib/gstreamer-1.0/libgstcutter.la" + "lib/gstreamer-1.0/libgstdebug.la" + "lib/gstreamer-1.0/libgstdeinterlace.la" + "lib/gstreamer-1.0/libgstdtmf.la" + "lib/gstreamer-1.0/libgsteffectv.la" + "lib/gstreamer-1.0/libgstequalizer.la" + "lib/gstreamer-1.0/libgstflv.la" + "lib/gstreamer-1.0/libgstflxdec.la" + "lib/gstreamer-1.0/libgstgoom.la" + "lib/gstreamer-1.0/libgstgoom2k1.la" + "lib/gstreamer-1.0/libgsticydemux.la" + "lib/gstreamer-1.0/libgstid3demux.la" + "lib/gstreamer-1.0/libgstimagefreeze.la" + "lib/gstreamer-1.0/libgstinterleave.la" + "lib/gstreamer-1.0/libgstisomp4.la" + "lib/gstreamer-1.0/libgstjpeg.la" + "lib/gstreamer-1.0/libgstlevel.la" + "lib/gstreamer-1.0/libgstmatroska.la" + "lib/gstreamer-1.0/libgstmulaw.la" + "lib/gstreamer-1.0/libgstmultifile.la" + "lib/gstreamer-1.0/libgstmultipart.la" + "lib/gstreamer-1.0/libgstnavigationtest.la" + "lib/gstreamer-1.0/libgstoss4audio.la" + "lib/gstreamer-1.0/libgstossaudio.la" + "lib/gstreamer-1.0/libgstreplaygain.la" + "lib/gstreamer-1.0/libgstrtp.la" + "lib/gstreamer-1.0/libgstrtpmanager.la" + "lib/gstreamer-1.0/libgstrtsp.la" + "lib/gstreamer-1.0/libgstshapewipe.la" + "lib/gstreamer-1.0/libgstsmpte.la" + "lib/gstreamer-1.0/libgstspectrum.la" + "lib/gstreamer-1.0/libgstudp.la" + "lib/gstreamer-1.0/libgstvideo4linux2.la" + "lib/gstreamer-1.0/libgstvideobox.la" + "lib/gstreamer-1.0/libgstvideocrop.la" + "lib/gstreamer-1.0/libgstvideofilter.la" + "lib/gstreamer-1.0/libgstvideomixer.la" + "lib/gstreamer-1.0/libgstwavenc.la" + "lib/gstreamer-1.0/libgstwavparse.la" + "lib/gstreamer-1.0/libgsty4menc.la" +) diff --git a/cmake/projects/gst_plugins_ugly/hunter.cmake b/cmake/projects/gst_plugins_ugly/hunter.cmake new file mode 100644 index 000000000..95c598cd8 --- /dev/null +++ b/cmake/projects/gst_plugins_ugly/hunter.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + gst_plugins_ugly + VERSION + 1.10.4 + URL + "https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.10.4.tar.xz" + SHA1 + a01ab3ac71bdd0d52e4a120349a8f26fde48f317 +) + +hunter_cmake_args( + gst_plugins_ugly + CMAKE_ARGS + DEPENDS_ON_PACKAGES=gst_plugins_base + DEPENDS_ON_PKGCONFIGS=gstreamer-plugins-base-1.0 # ??? +) + +hunter_configuration_types(gst_plugins_ugly CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cacheable(gst_plugins_ugly) + +hunter_download( + PACKAGE_NAME + gst_plugins_ugly + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/gstreamer-1.0/libgstasf.la" + "lib/gstreamer-1.0/libgstdvdlpcmdec.la" + "lib/gstreamer-1.0/libgstdvdsub.la" + "lib/gstreamer-1.0/libgstrmdemux.la" + "lib/gstreamer-1.0/libgstxingmux.la" +) diff --git a/cmake/projects/gstreamer/hunter.cmake b/cmake/projects/gstreamer/hunter.cmake new file mode 100644 index 000000000..582a900e6 --- /dev/null +++ b/cmake/projects/gstreamer/hunter.cmake @@ -0,0 +1,52 @@ +# Copyright (c) 2017 Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + gstreamer + VERSION + "1.10.4" + URL + "https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.10.4.tar.xz" + SHA1 + 217f56f474b1a89fdd27c8025a3eee7a7cd13559 +) + +hunter_configuration_types(gstreamer CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) + +hunter_cmake_args( + gstreamer + CMAKE_ARGS + DEPENDS_ON_PACKAGES=glib + DEPENDS_ON_PKGCONFIGS=glib-2.0 + PKGCONFIG_EXPORT_TARGETS=gstreamer-1.0 +) + +hunter_cacheable(gstreamer) +hunter_download( + PACKAGE_NAME gstreamer + PACKAGE_INTERNAL_DEPS_ID "5" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/gstreamer-1.0/libgstcoreelements.la" + "lib/gstreamer-1.0/libgstcoretracers.la" + "lib/libgstbase-1.0.la" + "lib/libgstcheck-1.0.la" + "lib/libgstcontroller-1.0.la" + "lib/libgstnet-1.0.la" + "lib/libgstreamer-1.0.la" + "lib/pkgconfig/gstreamer-1.0.pc" + "lib/pkgconfig/gstreamer-base-1.0.pc" + "lib/pkgconfig/gstreamer-check-1.0.pc" + "lib/pkgconfig/gstreamer-controller-1.0.pc" + "lib/pkgconfig/gstreamer-net-1.0.pc" +) diff --git a/cmake/projects/gumbo/hunter.cmake b/cmake/projects/gumbo/hunter.cmake new file mode 100644 index 000000000..dfa647ccc --- /dev/null +++ b/cmake/projects/gumbo/hunter.cmake @@ -0,0 +1,19 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME gumbo + VERSION "0.10.1" + URL "https://github.com/hunter-packages/gumbo-parser/archive/hunter-0.10.1.tar.gz" + SHA1 "0b060d7b67f605fc2c06a2c474fbd00ad5c48b18") + +hunter_cmake_args(gumbo CMAKE_ARGS BUILD_TESTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(gumbo) +hunter_download(PACKAGE_NAME gumbo) diff --git a/cmake/projects/h3/hunter.cmake b/cmake/projects/h3/hunter.cmake new file mode 100644 index 000000000..c68eb3522 --- /dev/null +++ b/cmake/projects/h3/hunter.cmake @@ -0,0 +1,40 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME h3 + VERSION "3.0.4" + URL "https://github.com/uber/h3/archive/v3.0.4.tar.gz" + SHA1 "e09d18583e3da9d03d718fba482d2281eff011d1") + +hunter_add_version( + PACKAGE_NAME h3 + VERSION "3.0.5" + URL "https://github.com/uber/h3/archive/v3.0.5.tar.gz" + SHA1 "ff4bc3c066dbfcb2ee1aa6474f63c934b0dfe4ee") + +hunter_add_version( + PACKAGE_NAME h3 + VERSION "3.0.6" + URL "https://github.com/uber/h3/archive/v3.0.6.tar.gz" + SHA1 "bb8502a7e7b6c2e367874dcd55677c6d288e6cc7") + +hunter_add_version( + PACKAGE_NAME h3 + VERSION "3.0.7" + URL "https://github.com/uber/h3/archive/v3.0.7.tar.gz" + SHA1 "062dbe6f17a19d5734a7d538fcfade2ae8949b04") + +hunter_cmake_args(h3 CMAKE_ARGS + BUILD_TESTING=OFF + ENABLE_DOCS=OFF + ENABLE_LINTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(h3) +hunter_download(PACKAGE_NAME h3) diff --git a/cmake/projects/harfbuzz/hunter.cmake b/cmake/projects/harfbuzz/hunter.cmake new file mode 100644 index 000000000..aff7aab3a --- /dev/null +++ b/cmake/projects/harfbuzz/hunter.cmake @@ -0,0 +1,64 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + harfbuzz + VERSION + 1.7.6-p0 + URL + "https://github.com/hunter-packages/harfbuzz/archive/v1.7.6-p0.tar.gz" + SHA1 + 11102ba60b34a12e1fd31b3bbd18e0a61f5f6ba1 +) + +hunter_add_version( + PACKAGE_NAME + harfbuzz + VERSION + 1.7.6-p1 + URL + "https://github.com/hunter-packages/harfbuzz/archive/v1.7.6-p1.tar.gz" + SHA1 + adec471f56a305970a071f7ab10803012660cf79 +) + +hunter_add_version( + PACKAGE_NAME + harfbuzz + VERSION + 1.7.6-p2 + URL + "https://github.com/hunter-packages/harfbuzz/archive/v1.7.6-p2.tar.gz" + SHA1 + 105c15b2c0c56e6dc13b0dda0915f759231dfb0c +) + +set( + _hunter_hb_cmake_args + HB_HAVE_FREETYPE=ON + HB_HAVE_ICU=ON +) + +if(RASPBERRY_PI) + # sysroot xlocale.h issue + list( + APPEND + _hunter_hb_cmake_args + HAVE_XLOCALE_H=OFF + ) +endif() + +hunter_cmake_args(harfbuzz CMAKE_ARGS ${_hunter_hb_cmake_args}) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(harfbuzz) +hunter_download(PACKAGE_NAME harfbuzz) diff --git a/cmake/projects/highwayhash/hunter.cmake b/cmake/projects/highwayhash/hunter.cmake new file mode 100644 index 000000000..6f5e645cd --- /dev/null +++ b/cmake/projects/highwayhash/hunter.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + highwayhash + VERSION + 0.0.0 + URL + "https://github.com/hunter-packages/highwayhash/archive/v0.0.0.tar.gz" + SHA1 + d62b32d5c8b6e63f6d4f8e72cfb495572b4f5386 + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(highwayhash) +hunter_download(PACKAGE_NAME highwayhash) diff --git a/cmake/projects/http-parser/hunter.cmake b/cmake/projects/http-parser/hunter.cmake new file mode 100644 index 000000000..d4e1f6832 --- /dev/null +++ b/cmake/projects/http-parser/hunter.cmake @@ -0,0 +1,17 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME http-parser + VERSION "2.8.0" + URL "https://github.com/hunter-packages/http-parser/archive/v2.8.0-p0.tar.gz" + SHA1 "3ef5048ecc6625f75a8c756026f501ebd5f3f388") + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(http-parser) +hunter_download(PACKAGE_NAME http-parser) diff --git a/cmake/projects/hunter_venv/hunter.cmake b/cmake/projects/hunter_venv/hunter.cmake new file mode 100644 index 000000000..e4688f811 --- /dev/null +++ b/cmake/projects/hunter_venv/hunter.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + hunter_venv + VERSION + 1.0.1 + URL + "https://github.com/hunter-packages/hunter_venv/archive/v1.0.1.tar.gz" + SHA1 + e15dd948ab070960538ec6918bb4c64296174f14 +) + +# DOCUMENTATION_START { +if(APPLE) + set(__hunter_venv_default_python "3.6.5") +elseif(WIN32) + set(__hunter_venv_default_python "3.6.8") +else() + set(__hunter_venv_default_python "3.5.2") +endif() + +hunter_cmake_args( + hunter_venv + CMAKE_ARGS + HUNTER_VENV_PYTHON_VERSION=${__hunter_venv_default_python} +) +# DOCUMENTATION_END } + +# No real build +hunter_configuration_types(hunter_venv CONFIGURATION_TYPES Release) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(hunter_venv) +hunter_download(PACKAGE_NAME hunter_venv) diff --git a/cmake/projects/icu-le-hb/hunter.cmake b/cmake/projects/icu-le-hb/hunter.cmake new file mode 100644 index 000000000..77e69b8f8 --- /dev/null +++ b/cmake/projects/icu-le-hb/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + icu-le-hb + VERSION + 1.0.3-231788a-p0 + URL + "https://github.com/hunter-packages/icu-le-hb/archive/v1.0.3-231788a-p0.tar.gz" + SHA1 + 0ce9cabd279e690773c044063d75f9c5d6e229bb +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(icu-le-hb) +hunter_download(PACKAGE_NAME icu-le-hb) diff --git a/cmake/projects/icu-lx/hunter.cmake b/cmake/projects/icu-lx/hunter.cmake new file mode 100644 index 000000000..7d4ff4e31 --- /dev/null +++ b/cmake/projects/icu-lx/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + icu-lx + VERSION + 63.1-p0 + URL + "https://github.com/hunter-packages/icu-lx/archive/v63.1-p0.tar.gz" + SHA1 + 264075debfe574ff5dc963b04375b262b6f8199f +) + +hunter_add_version( + PACKAGE_NAME + icu-lx + VERSION + 63.1-p1 + URL + "https://github.com/hunter-packages/icu-lx/archive/v63.1-p1.tar.gz" + SHA1 + cabcef58770922c9b0695663445f57c3f66750dd +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(icu-lx) +hunter_download(PACKAGE_NAME icu-lx) diff --git a/cmake/projects/imagequant/hunter.cmake b/cmake/projects/imagequant/hunter.cmake new file mode 100644 index 000000000..34eb7eacd --- /dev/null +++ b/cmake/projects/imagequant/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + imagequant + VERSION + 2.12.2-p0 + URL + "https://github.com/hunter-packages/libimagequant/archive/v2.12.2-p0.tar.gz" + SHA1 + 95960f65c1e103cc87a2b07e656ce247188ee082 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(imagequant) +hunter_download(PACKAGE_NAME imagequant) diff --git a/cmake/projects/imgui/hunter.cmake b/cmake/projects/imgui/hunter.cmake new file mode 100644 index 000000000..26baa7c70 --- /dev/null +++ b/cmake/projects/imgui/hunter.cmake @@ -0,0 +1,43 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + imgui + VERSION + "1.70.p0" + URL + "https://github.com/hunter-packages/imgui/archive/v1.70.p0.tar.gz" + SHA1 + 36a806ecc3b43204e4a895d6842f88519d3d4b98 +) + +hunter_add_version( + PACKAGE_NAME + imgui + VERSION + "1.62" + URL + "https://github.com/hunter-packages/imgui/archive/v1.62.p0.tar.gz" + SHA1 + 0e1fb683036a45372bc34d39c29068443b6d97e6 +) + +hunter_cmake_args( + imgui + CMAKE_ARGS + IMGUI_BUILD_EXAMPLES=OFF + IMGUI_ENABLE_TEST_ENGINE=OFF +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(imgui) +hunter_download(PACKAGE_NAME imgui) diff --git a/cmake/projects/imshow/hunter.cmake b/cmake/projects/imshow/hunter.cmake new file mode 100644 index 000000000..3997f1b96 --- /dev/null +++ b/cmake/projects/imshow/hunter.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_package) +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + imshow + VERSION + "1.0.0" + URL + "https://github.com/hunter-packages/imshow/archive/v1.0.0.tar.gz" + SHA1 + 3b01b2cdd59d8a90da0df45888e96175da009ef5 +) + +hunter_add_version( + PACKAGE_NAME + imshow + VERSION + "1.0.0-p0" + URL + "https://github.com/hunter-packages/imshow/archive/v1.0.0-p0.tar.gz" + SHA1 + 196be66bb2bf62747e638b87444b88824ca51a18 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(imshow) +hunter_download(PACKAGE_NAME imshow) diff --git a/cmake/projects/inja/hunter.cmake b/cmake/projects/inja/hunter.cmake new file mode 100644 index 000000000..08caabfd3 --- /dev/null +++ b/cmake/projects/inja/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cmake_args) +include(hunter_pick_scheme) +include(hunter_cacheable) +include(hunter_download) + +hunter_add_version( + PACKAGE_NAME + inja + VERSION + 0.1.1 + URL + "https://github.com/pantor/inja/archive/v0.1.1.tar.gz" + SHA1 + fdf2af404917350a7d9c4f263ddf020130088444 +) + +hunter_cmake_args( + inja + CMAKE_ARGS + BUILD_UNIT_TESTS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(inja) +hunter_download(PACKAGE_NAME inja) diff --git a/cmake/projects/intsizeof/hunter.cmake b/cmake/projects/intsizeof/hunter.cmake new file mode 100644 index 000000000..5461d3ba5 --- /dev/null +++ b/cmake/projects/intsizeof/hunter.cmake @@ -0,0 +1,57 @@ +# Copyright (c) 2014-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + intsizeof + VERSION + "1.0.0" + URL + "https://github.com/ruslo/intsizeof/archive/v1.0.0.tar.gz" + SHA1 + 9959e0e29c88fe414ba082fb28a722e411682bb3 +) + +hunter_add_version( + PACKAGE_NAME + intsizeof + VERSION + "2.0.0" + URL + "https://github.com/ruslo/intsizeof/archive/v2.0.0.tar.gz" + SHA1 + 35b954c7180bce95f491951a87a49098bb074595 +) + +hunter_add_version( + PACKAGE_NAME + intsizeof + VERSION + "2.0.1" + URL + "https://github.com/ruslo/intsizeof/archive/v2.0.1.tar.gz" + SHA1 + e897f9c32cbd87130ac6b0e88106d06a8b0ada42 +) + +hunter_add_version( + PACKAGE_NAME + intsizeof + VERSION + "2.0.2" + URL + "https://github.com/ruslo/intsizeof/archive/v2.0.2.tar.gz" + SHA1 + 729d72510beea3fb23f74fc08899b8c1c4f726d2 +) + +hunter_cacheable(intsizeof) +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_download(PACKAGE_NAME intsizeof) diff --git a/cmake/projects/intx/hunter.cmake b/cmake/projects/intx/hunter.cmake new file mode 100644 index 000000000..f1e4543b3 --- /dev/null +++ b/cmake/projects/intx/hunter.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2019, Pawel Bylica + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + intx + VERSION + 0.1.0 + URL + https://github.com/chfast/intx/archive/v0.1.0.tar.gz + SHA1 + a70da498a9868e9484e01530c22690910d7222e6 +) + +hunter_add_version( + PACKAGE_NAME + intx + VERSION + 0.2.0 + URL + https://github.com/chfast/intx/archive/v0.2.0.tar.gz + SHA1 + 50c4d8ec601114755be9fd5bf5b288ee4eeacd54 +) + +hunter_cmake_args( + intx + CMAKE_ARGS + INTX_TESTING=OFF + INTX_BENCHMARKING=OFF + INTX_FUZZING=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(intx) +hunter_download(PACKAGE_NAME intx) diff --git a/cmake/projects/iroha-ed25519/hunter.cmake b/cmake/projects/iroha-ed25519/hunter.cmake new file mode 100644 index 000000000..5a7d08e0f --- /dev/null +++ b/cmake/projects/iroha-ed25519/hunter.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + iroha-ed25519 + VERSION + 2.0.0 + URL + "https://github.com/hyperledger/iroha-ed25519/archive/2.0.0.tar.gz" + SHA1 + fde00802a907081cf1ce6d54158108e81511b285 +) + +# let iroha-ed25519 automatically select ED and RNG implementations, they +# will depend on OS. +# explicitly set usage of sha2 (as for default in ed25519 spec) +hunter_cmake_args( + iroha-ed25519 + CMAKE_ARGS + BUILD=STATIC # build static library + TESTING=OFF # disable tests + HASH=sha2_sphlib # use sha2_sphlib impl for hash +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(iroha-ed25519) +hunter_download(PACKAGE_NAME iroha-ed25519) diff --git a/cmake/projects/jaegertracing/hunter.cmake b/cmake/projects/jaegertracing/hunter.cmake new file mode 100644 index 000000000..96b0d2b63 --- /dev/null +++ b/cmake/projects/jaegertracing/hunter.cmake @@ -0,0 +1,20 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME jaegertracing + VERSION "0.4.1" + URL "https://github.com/jaegertracing/jaeger-client-cpp/archive/v0.4.1.tar.gz" + SHA1 "b398a8174cad9d2e815e2bc9910f75c89e35a46a") + +hunter_cmake_args(jaegertracing CMAKE_ARGS + BUILD_TESTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(jaegertracing) +hunter_download(PACKAGE_NAME jaegertracing) diff --git a/cmake/projects/jansson/hunter.cmake b/cmake/projects/jansson/hunter.cmake new file mode 100644 index 000000000..7b5cf111a --- /dev/null +++ b/cmake/projects/jansson/hunter.cmake @@ -0,0 +1,21 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME jansson + VERSION "2.11.0" + URL "https://github.com/hunter-packages/jansson/archive/v2.11-p0.tar.gz" + SHA1 "4f5855dac698e9658fd94620b64f8430f265be1d") + +hunter_cmake_args(jansson CMAKE_ARGS + JANSSON_BUILD_DOCS=OFF + JANSSON_EXAMPLES=OFF + JANSSON_WITHOUT_TESTS=ON) +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(jansson) +hunter_download(PACKAGE_NAME jansson) diff --git a/cmake/projects/jasper/hunter.cmake b/cmake/projects/jasper/hunter.cmake new file mode 100644 index 000000000..cdf010d11 --- /dev/null +++ b/cmake/projects/jasper/hunter.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + jasper + VERSION + 2.0.14-p0 + URL + "https://github.com/hunter-packages/jasper/archive/v2.0.14-p0.tar.gz" + SHA1 + e443966cfacdad2e3f975ba31d72333e06b433b4 +) + +hunter_add_version( + PACKAGE_NAME + jasper + VERSION + 2.0.14-p1 + URL + "https://github.com/hunter-packages/jasper/archive/v2.0.14-p1.tar.gz" + SHA1 + 0ff33939db0b90d8666755a87d692182916c9774 +) + +hunter_add_version( + PACKAGE_NAME + jasper + VERSION + 2.0.14-p2 + URL + "https://github.com/hunter-packages/jasper/archive/v2.0.14-p2.tar.gz" + SHA1 + 97ef42fa8b82d27fc5db5007e0d7179b02315b1d +) + +hunter_add_version( + PACKAGE_NAME + jasper + VERSION + 2.0.14-p3 + URL + "https://github.com/hunter-packages/jasper/archive/v2.0.14-p3.tar.gz" + SHA1 + 3ce4f2b8fe7471badbb1827c733fcfff64cae08c +) + +hunter_cmake_args( + jasper + CMAKE_ARGS + JAS_ENABLE_AUTOMATIC_DEPENDENCIES=OFF + JAS_ENABLE_OPENGL=OFF + JAS_ENABLE_PROGRAMS=OFF + JAS_ENABLE_DOC=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(jasper) +hunter_download(PACKAGE_NAME jasper) diff --git a/cmake/projects/jo_jpeg/hunter.cmake b/cmake/projects/jo_jpeg/hunter.cmake new file mode 100644 index 000000000..7c145aa1d --- /dev/null +++ b/cmake/projects/jo_jpeg/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + jo_jpeg + VERSION + 0.0.1 + URL + "https://github.com/hunter-packages/jo_jpeg/archive/v0.0.1.tar.gz" + SHA1 + 1fdfa0b7f1e0c958f692dea080b8fbee6fca25e9 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(jo_jpeg) +hunter_download(PACKAGE_NAME jo_jpeg) diff --git a/cmake/projects/jsoncpp/hunter.cmake b/cmake/projects/jsoncpp/hunter.cmake new file mode 100644 index 000000000..2d41addba --- /dev/null +++ b/cmake/projects/jsoncpp/hunter.cmake @@ -0,0 +1,59 @@ +# cmake/projects/jsoncpp/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +# List of versions: + +hunter_add_version( + PACKAGE_NAME + jsoncpp + VERSION + "1.8.0" + URL + "https://github.com/open-source-parsers/jsoncpp/archive/1.8.0.tar.gz" + SHA1 + 40f7f34551012f68e822664a0b179e7e6cac5a97 +) + +hunter_add_version( + PACKAGE_NAME + jsoncpp + VERSION + "1.7.7" + URL + "https://github.com/open-source-parsers/jsoncpp/archive/1.7.7.tar.gz" + SHA1 + 7bbb47e25b3aa7c4c8b579ca46b32d55f32cb46e +) + +hunter_add_version( + PACKAGE_NAME + jsoncpp + VERSION + "0.7.0" + URL + "https://github.com/open-source-parsers/jsoncpp/archive/0.7.0.tar.gz" + SHA1 + 4fcb0e3275a1391856fc6ae21e36dce866b19393 +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +hunter_cmake_args( + jsoncpp + CMAKE_ARGS + JSONCPP_WITH_TESTS=OFF + JSONCPP_WITH_PKGCONFIG_SUPPORT=OFF + JSONCPP_WITH_CMAKE_PACKAGE=ON +) + +hunter_cacheable(jsoncpp) +hunter_download(PACKAGE_NAME jsoncpp) diff --git a/cmake/projects/kNet/hunter.cmake b/cmake/projects/kNet/hunter.cmake new file mode 100644 index 000000000..be53f78c0 --- /dev/null +++ b/cmake/projects/kNet/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + kNet + VERSION + 2.7-p1 + URL + "https://github.com/hunter-packages/kNet/archive/v2.7-p1.tar.gz" + SHA1 + 3a7bc8c9f9f14ffbfac4ce5328fa6735544b51c8 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(kNet) +hunter_download(PACKAGE_NAME kNet) diff --git a/cmake/projects/lcms/hunter.cmake b/cmake/projects/lcms/hunter.cmake new file mode 100644 index 000000000..b49e743fd --- /dev/null +++ b/cmake/projects/lcms/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + lcms + VERSION + 2.9-p0 + URL + "https://github.com/hunter-packages/Little-CMS/archive/v2.9-p0.tar.gz" + SHA1 + 5bea20d0e6e98b743e5e72ba1c130e13b9b73584 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(lcms) +hunter_download(PACKAGE_NAME lcms) diff --git a/cmake/projects/lehrfempp/hunter.cmake b/cmake/projects/lehrfempp/hunter.cmake new file mode 100644 index 000000000..2f190053d --- /dev/null +++ b/cmake/projects/lehrfempp/hunter.cmake @@ -0,0 +1,164 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.3 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.3.tar.gz" + SHA1 + 228512a28abe9e49484d1794a20657a47fbf5a1d +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.6 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.6.tar.gz" + SHA1 + c5ed5b1262a46dad28ac2d558781f08cffbd4993 +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.8 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.8.tar.gz" + SHA1 + ddb39d94039000686d5acd5e7e1cfa464c15dacb +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.9 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.9.tar.gz" + SHA1 + 9ed490443ce93612ee64435fe87c9af4735bbfed +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.10 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.10.tar.gz" + SHA1 + 1cc185cb5e148fb53d5fa3cd595e3e071cfd435f +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.11 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.11.tar.gz" + SHA1 + b1352d52e4cd5518d6bc867ef8a9082c8f22569d +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.12 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.12.tar.gz" + SHA1 + b8ecd27061fa0f393509b935a5802e41f0dc8e7a +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.13 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.13.tar.gz" + SHA1 + 9ac01bb0384be64a68f36b50bad8c07a92dae519 +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.15 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.15.tar.gz" + SHA1 + d9361b0a227ce397670d23cac294d9f27504e092 +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.16 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.16.tar.gz" + SHA1 + cef45f47892c864659ae8941b87f79ebbbf8041f +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.18 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.18.tar.gz" + SHA1 + ff088d2c7164d3cabb591f4e2aa29981f1f99540 +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.19 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.19.tar.gz" + SHA1 + 9b1233b42e73eae59b7f6cbb0792c07f85eabd51 +) + +hunter_add_version( + PACKAGE_NAME + lehrfempp + VERSION + 0.7.20 + URL + "https://github.com/craffael/lehrfempp/archive/release-0.7.20.tar.gz" + SHA1 + 65ed75a901f700e8f61a1272ad15423223bfe932 +) + +hunter_cmake_args( + lehrfempp + CMAKE_ARGS + LF_ENABLE_TESTING=OFF + LF_BUILD_EXAMPLES=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(lehrfempp) +hunter_download(PACKAGE_NAME lehrfempp) diff --git a/cmake/projects/leveldb/hunter.cmake b/cmake/projects/leveldb/hunter.cmake new file mode 100644 index 000000000..63b2972ff --- /dev/null +++ b/cmake/projects/leveldb/hunter.cmake @@ -0,0 +1,27 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME leveldb + VERSION "1.20" + URL "https://github.com/hunter-packages/leveldb/archive/v1.20-p3.tar.gz" + SHA1 "e843a3321605bd818628509c669d6dae65854657") + +hunter_add_version( + PACKAGE_NAME leveldb + VERSION "1.22" + URL "https://github.com/hunter-packages/leveldb/archive/v1.22-p0.tar.gz" + SHA1 "616e3816c0f44423136dcf286ae51417f0d75198") + +hunter_cmake_args(leveldb CMAKE_ARGS + LEVELDB_BUILD_TESTS=OFF + LEVELDB_BUILD_BENCHMARKS=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(leveldb) +hunter_download(PACKAGE_NAME leveldb) diff --git a/cmake/projects/libcpuid/hunter.cmake b/cmake/projects/libcpuid/hunter.cmake new file mode 100644 index 000000000..6b0fa1b24 --- /dev/null +++ b/cmake/projects/libcpuid/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + libcpuid + VERSION + 0.4.0 + URL + "https://github.com/hunter-packages/libcpuid/archive/v0.4.0-p0.tar.gz" + SHA1 + dd8255b9a6e84f0d4c81f26b4a32c9af9b2a4e03 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(libcpuid) +hunter_download(PACKAGE_NAME libcpuid) diff --git a/cmake/projects/libdill/hunter.cmake b/cmake/projects/libdill/hunter.cmake new file mode 100644 index 000000000..928731852 --- /dev/null +++ b/cmake/projects/libdill/hunter.cmake @@ -0,0 +1,20 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME libdill + VERSION "1.6" + URL "https://github.com/hunter-packages/libdill/archive/hunter-1.6.tar.gz" + SHA1 "603ca85ac4b0d9f0ab4f5db57281127370c5cacc") +hunter_cmake_args(libdill CMAKE_ARGS + BUILD_TESTING=OFF + BUILD_PERF=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(libdill) +hunter_download(PACKAGE_NAME libdill) diff --git a/cmake/projects/libevhtp/hunter.cmake b/cmake/projects/libevhtp/hunter.cmake new file mode 100644 index 000000000..98b9a5aae --- /dev/null +++ b/cmake/projects/libevhtp/hunter.cmake @@ -0,0 +1,17 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME libevhtp + VERSION "1.2.16-p4" + URL "https://github.com/hunter-packages/libevhtp/archive/v1.2.16-p4.tar.gz" + SHA1 "c6d7b4b4e27de15670f72e36b127613a707164ee") + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(libevhtp) +hunter_download(PACKAGE_NAME libevhtp) diff --git a/cmake/projects/libffi/hunter.cmake b/cmake/projects/libffi/hunter.cmake new file mode 100644 index 000000000..8ae800021 --- /dev/null +++ b/cmake/projects/libffi/hunter.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2016-2017 Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + libffi + VERSION + "3.2.1" + URL + "https://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz" + SHA1 + 280c265b789e041c02e5c97815793dfc283fb1e6 +) + +hunter_configuration_types(libffi CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) + +hunter_cmake_args( + libffi + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=libffi +) + +hunter_cacheable(libffi) +hunter_download( + PACKAGE_NAME libffi + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/libffi.la" + "lib/pkgconfig/libffi.pc" +) diff --git a/cmake/projects/libigl/hunter.cmake b/cmake/projects/libigl/hunter.cmake new file mode 100644 index 000000000..2bde5209e --- /dev/null +++ b/cmake/projects/libigl/hunter.cmake @@ -0,0 +1,57 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +# Tags v1.3.3 and v2.0.0 are the same: +# - https://github.com/hunter-packages/libigl/pull/1#issuecomment-495176368 +hunter_add_version( + PACKAGE_NAME + libigl + VERSION + 2.0.0-e33f534-p0 + URL + "https://github.com/hunter-packages/libigl/archive/v1.3.3-e33f534-p0.tar.gz" + SHA1 + b94120a61fd5c6320edc7a79f14a37877527767d +) + +hunter_add_version( + PACKAGE_NAME + libigl + VERSION + 2.0.0-e33f534-p1 + URL + "https://github.com/hunter-packages/libigl/archive/v1.3.3-e33f534-p1.tar.gz" + SHA1 + 24637b17fb4700db898099fb6f21e8425ea08a30 +) + +hunter_cmake_args( + libigl + CMAKE_ARGS + # LIBIGL_USE_STATIC_LIBRARY=OFF means make it an INTERFACE library + LIBIGL_USE_STATIC_LIBRARY=ON + LIBIGL_BUILD_TESTS=OFF + LIBIGL_BUILD_TUTORIALS=OFF + LIBIGL_BUILD_PYTHON=OFF + LIBIGL_WITH_COMISO=OFF + LIBIGL_WITH_EMBREE=OFF + LIBIGL_WITH_OPENGL=OFF + LIBIGL_WITH_OPENGL_GLFW=OFF + LIBIGL_WITH_OPENGL_GLFW_IMGUI=OFF + LIBIGL_WITH_PNG=OFF + LIBIGL_WITH_TETGEN=OFF + LIBIGL_WITH_TRIANGLE=OFF + LIBIGL_WITH_XML=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(libigl) +hunter_download(PACKAGE_NAME libigl) diff --git a/cmake/projects/libjson-rpc-cpp/hunter.cmake b/cmake/projects/libjson-rpc-cpp/hunter.cmake new file mode 100644 index 000000000..12c19f7aa --- /dev/null +++ b/cmake/projects/libjson-rpc-cpp/hunter.cmake @@ -0,0 +1,61 @@ +# cmake/projects/libjson-rpc-cpp/hunter.cmake + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +# List of versions: + +hunter_add_version( + PACKAGE_NAME + libjson-rpc-cpp + VERSION + "0.7.0-p0" + URL + "https://github.com/hunter-packages/libjson-rpc-cpp/archive/v0.7.0-p0.tar.gz" + SHA1 + ddd5f12dfde6f7072d271071bd2c7b0a487de97f +) + +hunter_add_version( + PACKAGE_NAME + libjson-rpc-cpp + VERSION + "0.7.0-p3" + URL + "https://github.com/hunter-packages/libjson-rpc-cpp/archive/v0.7.0-p3.tar.gz" + SHA1 + f2c7e2fd73c1ad3662d275c2b2e515b2ddf02a72 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) + +set(_hunter_unix_cmake_args "") +if(UNIX) + # UNIX options. Disable all as they don't compile on macOS. + set( + _hunter_unix_cmake_args + UNIX_DOMAIN_SOCKET_SERVER=OFF + UNIX_DOMAIN_SOCKET_CLIENT=OFF + FILE_DESCRIPTOR_SERVER=OFF + FILE_DESCRIPTOR_CLIENT=OFF + ) +endif() + +hunter_cmake_args( + libjson-rpc-cpp + CMAKE_ARGS + BUILD_STATIC_LIBS=ON + WITH_COVERAGE=OFF + COMPILE_STUBGEN=OFF + COMPILE_EXAMPLES=OFF + COMPILE_TESTS=OFF + HTTP_CLIENT=ON + HTTP_SERVER=OFF # Requires microhttpd library. + ${_hunter_unix_cmake_args} +) + +hunter_cacheable(libjson-rpc-cpp) +hunter_download(PACKAGE_NAME libjson-rpc-cpp) diff --git a/cmake/projects/libmill/hunter.cmake b/cmake/projects/libmill/hunter.cmake new file mode 100644 index 000000000..d66b2290f --- /dev/null +++ b/cmake/projects/libmill/hunter.cmake @@ -0,0 +1,20 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME libmill + VERSION "1.18" + URL "https://github.com/hunter-packages/libmill/archive/hunter-1.18.tar.gz" + SHA1 "447807f84cbd3369d3031b394e0941574e01b08a") +hunter_cmake_args(libmill CMAKE_ARGS + BUILD_TESTING=OFF + BUILD_PERF=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(libmill) +hunter_download(PACKAGE_NAME libmill) diff --git a/cmake/projects/libpcre/hunter.cmake b/cmake/projects/libpcre/hunter.cmake new file mode 100644 index 000000000..09c166b3c --- /dev/null +++ b/cmake/projects/libpcre/hunter.cmake @@ -0,0 +1,46 @@ +# Copyright (c) 2016 Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + libpcre + VERSION + "8.41" + URL + "https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.bz2" + SHA1 + 7d1f4aae4191512744a718cc2b81bcf995ec1437 +) + +hunter_configuration_types(libpcre CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) + +hunter_cmake_args( + libpcre + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=libpcre;libpcrecpp;libpcreposix + EXTRA_FLAGS=--enable-unicode-properties +) + +hunter_cacheable(libpcre) +hunter_download( + PACKAGE_NAME libpcre + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/libpcre.la" + "lib/libpcrecpp.la" + "lib/libpcreposix.la" + "lib/pkgconfig/libpcre.pc" + "lib/pkgconfig/libpcrecpp.pc" + "lib/pkgconfig/libpcreposix.pc" + "bin/pcre-config" +) diff --git a/cmake/projects/librtmp/hunter.cmake b/cmake/projects/librtmp/hunter.cmake new file mode 100644 index 000000000..abd2e4466 --- /dev/null +++ b/cmake/projects/librtmp/hunter.cmake @@ -0,0 +1,27 @@ +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +# List of versions here... + +hunter_add_version( + PACKAGE_NAME + librtmp + VERSION + "2.4.0-p0" + URL + "https://github.com/hunter-packages/rtmpdump/archive/2.4.0-p0.tar.gz" + SHA1 + 14e8ceedd20423e7a60c6040765fd7d10a379ddd +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(librtmp) +hunter_download(PACKAGE_NAME librtmp) diff --git a/cmake/projects/libscrypt/hunter.cmake b/cmake/projects/libscrypt/hunter.cmake new file mode 100644 index 000000000..c332e99ab --- /dev/null +++ b/cmake/projects/libscrypt/hunter.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2017, Pawel Bylica + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + libscrypt + VERSION + 1.21-p0 + URL + "https://github.com/hunter-packages/libscrypt/archive/v1.21-p0.tar.gz" + SHA1 + 2910558f6275fe4ce077038fcb96f7e0ba9521a3 +) + +hunter_add_version( + PACKAGE_NAME + libscrypt + VERSION + 1.21-p1 + URL + "https://github.com/hunter-packages/libscrypt/archive/v1.21-p1.tar.gz" + SHA1 + 2c70238da6471224c9b37d7e328e5955f0fb42f3 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(libscrypt) +hunter_download(PACKAGE_NAME libscrypt) diff --git a/cmake/projects/libunibreak/hunter.cmake b/cmake/projects/libunibreak/hunter.cmake new file mode 100644 index 000000000..e9aea174e --- /dev/null +++ b/cmake/projects/libunibreak/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) +include(hunter_configuration_types) + +hunter_add_version( + PACKAGE_NAME + libunibreak + VERSION + 4.0 + URL + "https://github.com/adah1972/libunibreak/releases/download/libunibreak_4_0/libunibreak-4.0.tar.gz" + SHA1 + 44c3294546c56c592d918dcaff14b3b5f96ca627 +) + +hunter_cmake_args( + libunibreak + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=libunibreak +) + +hunter_configuration_types(libunibreak CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_download(PACKAGE_NAME libunibreak) diff --git a/cmake/projects/libusb/hunter.cmake b/cmake/projects/libusb/hunter.cmake new file mode 100644 index 000000000..f312afb5f --- /dev/null +++ b/cmake/projects/libusb/hunter.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + libusb + VERSION + 1.0.22 + URL + "https://github.com/libusb/libusb/archive/v1.0.22.tar.gz" + SHA1 + cdb45a2d679e2ccbc3a8193f843e3f0c7187f74c +) + +hunter_cmake_args( + libusb + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=libusb-1.0 +) + +hunter_configuration_types(libusb CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autogen_autotools) +hunter_cacheable(libusb) +hunter_download(PACKAGE_NAME libusb + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + lib/pkgconfig/libusb-1.0.pc +) diff --git a/cmake/projects/libuv/hunter.cmake b/cmake/projects/libuv/hunter.cmake new file mode 100644 index 000000000..7cfc876ca --- /dev/null +++ b/cmake/projects/libuv/hunter.cmake @@ -0,0 +1,93 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_report_broken_package) + +hunter_add_version( + PACKAGE_NAME + libuv + VERSION + 1.24.0-p1 + URL + "https://github.com/hunter-packages/libuv/archive/v1.24.0-p1.tar.gz" + SHA1 + cfcb32493c2f9d14014865aa6db7af16b358e852 + ) + +hunter_add_version( + PACKAGE_NAME + libuv + VERSION + 1.24.0-p0 + URL + "https://github.com/hunter-packages/libuv/archive/v1.24.0-p0.tar.gz" + SHA1 + fe7a1a5aede28e1f5c6f4d62aa267d5fdc16b5f7 + ) + +hunter_add_version( + PACKAGE_NAME + libuv + VERSION + 1.21.0-p0 + URL + "https://github.com/hunter-packages/libuv/archive/v1.21.0-p0.tar.gz" + SHA1 + c5fbbe3cfd17c7816d0d063e090c33fae9e1cb32 + ) + +# 2.0.0 is not an upstream tag +hunter_add_version( + PACKAGE_NAME + libuv + VERSION + 2.0.0 + URL + https://github.com/hunter-packages/libuv/archive/v2.0.0-hunter-release.tar.gz + SHA1 + 60dee8435f4c4136a2ecb6814a2f302641ef1093 + ) + +hunter_add_version( + PACKAGE_NAME + libuv + VERSION + 2.0.0-p0 + URL + "https://github.com/hunter-packages/libuv/archive/v2.0.0-p0.tar.gz" + SHA1 + 65a011219de5ad16e2de2df4b07b945a9e67035d + ) + +hunter_add_version( + PACKAGE_NAME + libuv + VERSION + 1.14.0-p0 + URL + "https://github.com/hunter-packages/libuv/archive/v1.14.0-p0.tar.gz" + SHA1 + b570a0b45a631b1955e7c58a3f35dcbf19c522d6 +) + +hunter_add_version( + PACKAGE_NAME + libuv + VERSION + 1.14.0-p1 + URL + "https://github.com/hunter-packages/libuv/archive/v1.14.0-p1.tar.gz" + SHA1 + 4b334b174f4abf4a7f41656e1cfe3c60ad9382ca +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) + +hunter_cmake_args(libuv CMAKE_ARGS BUILD_TESTING=OFF) + +hunter_cacheable(libuv) +hunter_download(PACKAGE_NAME libuv) diff --git a/cmake/projects/libxdg-basedir/hunter.cmake b/cmake/projects/libxdg-basedir/hunter.cmake new file mode 100644 index 000000000..a90f62ae9 --- /dev/null +++ b/cmake/projects/libxdg-basedir/hunter.cmake @@ -0,0 +1,27 @@ +include(hunter_add_version) +include(hunter_configuration_types) +include(hunter_pick_scheme) +include(hunter_download) +include(hunter_cacheable) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME libxdg-basedir + VERSION "1.2.0" + URL "https://github.com/devnev/libxdg-basedir/archive/libxdg-basedir-1.2.0.tar.gz" + SHA1 e671b01b17c8cf785d95dd3aefa93e7cf31e56a5 + ) + +hunter_configuration_types(libxdg-basedir CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autogen_autotools) +hunter_cacheable(libxdg-basedir) + +hunter_cmake_args( + libxdg-basedir + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=libxdg-basedir + ) + +hunter_download(PACKAGE_NAME libxdg-basedir + PACKAGE_INTERNAL_DEPS_ID "1" # Increment for each new pull request + PACKAGE_UNRELOCATABLE_TEXT_FILES lib/pkgconfig/libxdg-basedir.pc) diff --git a/cmake/projects/libxml2/hunter.cmake b/cmake/projects/libxml2/hunter.cmake new file mode 100644 index 000000000..8c35c8825 --- /dev/null +++ b/cmake/projects/libxml2/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016, Ruslan Baratov, Alexandre Pretyman +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + libxml2 + VERSION + "2.9.7-p0" + URL + "https://github.com/hunter-packages/libxml2/archive/v2.9.7-p0.tar.gz" + SHA1 + 5d5d6da2a87267f160f76a26c5637cbc48b28784 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(libxml2) +hunter_download(PACKAGE_NAME libxml2) diff --git a/cmake/projects/libxml2/schemes/url_sha1_libxml2_msvc.cmake.in b/cmake/projects/libxml2/schemes/url_sha1_libxml2_msvc.cmake.in new file mode 100644 index 000000000..04aa86b34 --- /dev/null +++ b/cmake/projects/libxml2/schemes/url_sha1_libxml2_msvc.cmake.in @@ -0,0 +1,140 @@ +# Copyright (c) 2016, Ruslan Baratov +# Copyright (c) 2017, Sacha Refshauge +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +project(Hunter) + +include(ExternalProject) # ExternalProject_Add + +# Scheme for download and install LibXML2 library for Windows + +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") +include(hunter_libxml2_install_tools) +include(hunter_fatal_error) +include(hunter_internal_error) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) + +hunter_status_debug("Scheme: url_sha1_libxml2_msvc") + +# Check preconditions +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_MSVC_ARCH@") +hunter_assert_not_empty_string("@HUNTER_MSVC_VCVARSALL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +if (BUILD_SHARED_LIBS) + set(shared "static=no") +else() + set(shared "static=yes") +endif() + +# Use native slashes to help nmake if statements work +file(TO_NATIVE_PATH "@HUNTER_PACKAGE_INSTALL_PREFIX@" LIBXML2_INSTALL_DIR) + +set(HUNTER_MSVC_VCVARSALL "@HUNTER_MSVC_VCVARSALL@") +set(HUNTER_MSVC_ARCH "@HUNTER_MSVC_ARCH@") +set(HUNTER_PACKAGE_SOURCE_DIR "@HUNTER_PACKAGE_SOURCE_DIR@") +set(patch_cmd "@CMAKE_COMMAND@" -E copy "@HUNTER_PACKAGE_DOWNLOAD_DIR@/patched_bootstrap.bat" "@HUNTER_PACKAGE_SOURCE_DIR@/patched_bootstrap.bat") +set(bootstrap_cmd "patched_bootstrap.bat") + +set(previous_project "") +foreach(build_config_type @HUNTER_PACKAGE_CONFIGURATION_TYPES@) + + # Check for valid configuration (exact capitalization required) + string(COMPARE EQUAL "${build_config_type}" "Release" is_release) + string(COMPARE EQUAL "${build_config_type}" "Debug" is_debug) + if(NOT (is_release OR is_debug)) + hunter_user_error("libxml2: Invalid build configuration type provided. Valid values are: \"Release\", \"Debug\", \"Release\;Debug\" (HUNTER_PACKAGE_CONFIGURATION_TYPES)") + endif() + + if(@BUILD_SHARED_LIBS@) + set(LIB_EXT "") + else() + set(LIB_EXT "_a") + endif() + + # Configure bootstrap with different MSVC runtime + if (LIBXML2_BUILD_DYNAMIC_VSRUNTIME) + set(LIBXML2_RUNTIME "/MD") + else() + set(LIBXML2_RUNTIME "/MT") + endif() + if (is_debug) + set(LIBXML2_RUNTIME "${LIBXML2_RUNTIME}d") + endif() + configure_file("@HUNTER_PACKAGE_SCRIPT_DIR@/patched_bootstrap.bat.in" "@HUNTER_PACKAGE_DOWNLOAD_DIR@/patched_bootstrap.bat") + + set(current_project "@HUNTER_EP_NAME@${build_config_type}") + + ExternalProject_Add( + ${current_project} + URL + "@HUNTER_PACKAGE_URL@" + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + ${patch_cmd} + COMMAND + ${bootstrap_cmd} + BUILD_COMMAND + "@CMAKE_COMMAND@" -E echo "Dummy build step" + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" + LOG_CONFIGURE 1 + ) + + # Each external project must depends on previous one since they all use + # the same building directory + string(COMPARE EQUAL "${previous_project}" "" is_empty) + if(NOT is_empty) + add_dependencies( + "${current_project}" + "${previous_project}" + ) + endif() + set(previous_project "${current_project}") + + # Install target file + # Required: lib file name, BUILD_SHARED_LIBS, install prefix, hunter_self + string(TOUPPER ${build_config_type} TARGET_CONFIGURATION) + set(HUNTER_PACKAGE_INSTALL_PREFIX "@HUNTER_PACKAGE_INSTALL_PREFIX@") + set(TARGET_LIB_FILE "libxml2${LIB_EXT}.lib") + set(HUNTER_SELF "@HUNTER_SELF@") + + hunter_install_libxml2_targets() +endforeach() + +# Forward some variables +set(BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@") +set(HUNTER_libxml2_VERSION "@HUNTER_libxml2_VERSION@") +set(HUNTER_PACKAGE_CONFIGURATION_TYPES "@HUNTER_PACKAGE_CONFIGURATION_TYPES@") +set(HUNTER_PACKAGE_INSTALL_PREFIX "@HUNTER_PACKAGE_INSTALL_PREFIX@") + +hunter_install_libxml2_config() diff --git a/cmake/projects/libxml2/scripts/patched_bootstrap.bat.in b/cmake/projects/libxml2/scripts/patched_bootstrap.bat.in new file mode 100644 index 000000000..000e09d45 --- /dev/null +++ b/cmake/projects/libxml2/scripts/patched_bootstrap.bat.in @@ -0,0 +1,7 @@ +call "@HUNTER_MSVC_VCVARSALL@" @HUNTER_MSVC_ARCH@ +REM The /d flag is required because vcvarsall.bat changes the current drive +REM If the hunter cache is located on a different drive to vcvarsall.bat the +REM cd command will fail. https://technet.microsoft.com/en-gb/library/bb490875.aspx +cd /d @HUNTER_PACKAGE_SOURCE_DIR@/win32 +cscript //B configure.js @shared@ compiler=msvc "cruntime=@LIBXML2_RUNTIME@" "prefix=@LIBXML2_INSTALL_DIR@" iconv=no debug=no zlib=no ftp=no +nmake /f Makefile.msvc libxml install-libs diff --git a/cmake/projects/libzip/hunter.cmake b/cmake/projects/libzip/hunter.cmake new file mode 100644 index 000000000..e247aa6a6 --- /dev/null +++ b/cmake/projects/libzip/hunter.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + libzip + VERSION + 1.5.2-d68a667-p0 + URL + "https://github.com/hunter-packages/libzip/archive/v1.5.2-d68a667-p0.tar.gz" + SHA1 + c3fce63f125fe5a50103d9f20846ca2a269439b7 +) + +hunter_cmake_args( + libzip + CMAKE_ARGS + ENABLE_COMMONCRYPTO=OFF + ENABLE_GNUTLS=OFF + ENABLE_MBEDTLS=OFF + ENABLE_WINDOWS_CRYPTO=OFF + BUILD_TOOLS=OFF + BUILD_REGRESS=OFF + BUILD_EXAMPLES=OFF + BUILD_DOC=OFF + BUILD_SHARED_LIBS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(libzip) +hunter_download(PACKAGE_NAME libzip) diff --git a/cmake/projects/lmdb/hunter.cmake b/cmake/projects/lmdb/hunter.cmake new file mode 100644 index 000000000..a010d2211 --- /dev/null +++ b/cmake/projects/lmdb/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + lmdb + VERSION + 0.9.21-p1 + URL + "https://github.com/hunter-packages/lmdb/archive/v0.9.21-p1.tar.gz" + SHA1 + 4218e126cbc18756d93a798f56e5e6dd10803aae + ) + +hunter_add_version( + PACKAGE_NAME + lmdb + VERSION + 0.9.21-p2 + URL "https://github.com/hunter-packages/lmdb/archive/v0.9.21-p2.tar.gz" + SHA1 "ae88e15f646d26ca0a4a4b0d05041460bd509736" + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(lmdb) +hunter_download(PACKAGE_NAME lmdb) diff --git a/cmake/projects/lmdbxx/hunter.cmake b/cmake/projects/lmdbxx/hunter.cmake new file mode 100644 index 000000000..2d5d2f4f1 --- /dev/null +++ b/cmake/projects/lmdbxx/hunter.cmake @@ -0,0 +1,16 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME lmdbxx + VERSION "0.9.14.0" + URL "https://github.com/isaachier/lmdbxx/archive/hunter-0.9.14.0-p1.tar.gz" + SHA1 "1e6120db2f563f81ebe4160829b644d919dc574b") + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(lmdbxx) +hunter_download(PACKAGE_NAME lmdbxx) diff --git a/cmake/projects/lz4/hunter.cmake b/cmake/projects/lz4/hunter.cmake new file mode 100644 index 000000000..5a7467c72 --- /dev/null +++ b/cmake/projects/lz4/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + lz4 + VERSION + 1.8.0-p1 + URL + "https://github.com/hunter-packages/lz4/archive/v1.8.0-p1.tar.gz" + SHA1 + 00b58d5f28404ed1fdd3410468ebaa44c2ad8a16 +) + +hunter_add_version( + PACKAGE_NAME + lz4 + VERSION + 1.8.0-p2 + URL + "https://github.com/hunter-packages/lz4/archive/v1.8.0-p2.tar.gz" + SHA1 + e96abaedd5d8a5a61c21316c8bb173b1954c7c6b +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(lz4) +hunter_download(PACKAGE_NAME lz4) diff --git a/cmake/projects/lzma/hunter.cmake b/cmake/projects/lzma/hunter.cmake new file mode 100644 index 000000000..4e94d5ede --- /dev/null +++ b/cmake/projects/lzma/hunter.cmake @@ -0,0 +1,57 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + lzma + VERSION + 5.2.3-p0 + URL + "https://github.com/hunter-packages/lzma/archive/v5.2.3-p0.tar.gz" + SHA1 + 98de5eb2f3bf361a836ee78509f311db1c54494b +) + +hunter_add_version( + PACKAGE_NAME + lzma + VERSION + 5.2.3-p1 + URL + "https://github.com/hunter-packages/lzma/archive/v5.2.3-p1.tar.gz" + SHA1 + 391ace8ca1ae84d3b4fb9750943749bc6b589e87 +) + +hunter_add_version( + PACKAGE_NAME + lzma + VERSION + 5.2.3-p2 + URL + "https://github.com/hunter-packages/lzma/archive/v5.2.3-p2.tar.gz" + SHA1 + 758b108c2acb060ff4ddd9118d71809b3dd60427 +) + +hunter_add_version( + PACKAGE_NAME + lzma + VERSION + 5.2.3-p4 + URL + "https://github.com/hunter-packages/lzma/archive/v5.2.3-p4.tar.gz" + SHA1 + 09d7d8c8c8f1f488b3ccb739760c2092aae62441 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(lzma) +hunter_download(PACKAGE_NAME lzma) diff --git a/cmake/projects/magnum/hunter.cmake b/cmake/projects/magnum/hunter.cmake new file mode 100644 index 000000000..5af263d07 --- /dev/null +++ b/cmake/projects/magnum/hunter.cmake @@ -0,0 +1,116 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + magnum + VERSION + 2019.01 + URL + "https://github.com/mosra/magnum/archive/v2019.01.tar.gz" + SHA1 + af356adc9e83826d55bd7f438c29f98104f95fd0 +) + +# CMAKE_SYSTEM_NAME dependant default options below + +# Take all the plugins +set(_hunter_magnum_cmake_args + WITH_ANYIMAGECONVERTER=ON + WITH_ANYIMAGEIMPORTER=ON + WITH_ANYSCENEIMPORTER=ON + WITH_MAGNUMFONT=ON + WITH_MAGNUMFONTCONVERTER=ON + WITH_OBJIMPORTER=ON + WITH_TGAIMAGECONVERTER=ON + WITH_TGAIMPORTER=ON) + +# Default application implementation +if(ANDROID) + list(APPEND _hunter_magnum_cmake_args WITH_ANDROIDAPPLICATION=ON) +elseif(NOT IOS) + # TODO: There's no SDL2 for iOS? + list(APPEND _hunter_magnum_cmake_args WITH_SDL2APPLICATION=ON) +endif() + +# Command-line utilities for desktop platforms +if(WIN32 OR UNIX) + list(APPEND _hunter_magnum_cmake_args + WITH_GL_INFO=ON + WITH_DISTANCEFIELDCONVERTER=ON + WITH_FONTCONVERTER=ON + WITH_IMAGECONVERTER=ON + WITH_OPENGLTESTER=ON) +endif() + +# Windows-specific +if(WIN32) + list(APPEND _hunter_magnum_cmake_args + WITH_WINDOWLESSWGLAPPLICATION=ON + WITH_WGLCONTEXT=ON) +endif() + +# Linux-specific +if(UNIX AND NOT APPLE) + list(APPEND _hunter_magnum_cmake_args + WITH_WINDOWLESSGLXAPPLICATION=ON + WITH_GLXCONTEXT=ON) +endif() + +# macOS-specific +if(APPLE AND NOT IOS) + list(APPEND _hunter_magnum_cmake_args + WITH_WINDOWLESSCGLAPPLICATION=ON + WITH_CGLCONTEXT=ON) +endif() + +# iOS-specific +if(IOS) + list(APPEND _hunter_magnum_cmake_args + WITH_WINDOWLESSIOSAPPLICATION=ON + WITH_EGLCONTEXT=ON) +endif() + +# Emscripten-specific. No EglContext here. +if(EMSCRIPTEN) + list(APPEND _hunter_magnum_cmake_args + WITH_WINDOWLESSEGLAPPLICATION=ON) +endif() + +# Audio, where supported. +# - Linux and macOS has it +# - OpenAL hunter package fails to build under windows +# See https://ci.appveyor.com/project/pthom/hunter/builds/20697140/job/03xop04ea11c47vf +# CMake Error at C:/projects/hunter/_ci/cmake/share/cmake-3.13/Modules/CheckIncludeFiles.cmake:63 (message): +# Unknown arguments: +# -D_WIN32_WINNT=0x0502 +# - Audio / OpenAL not ported to Android yet +if((UNIX OR EMSCRIPTEN) AND NOT IOS) + list(APPEND _hunter_magnum_cmake_args + WITH_AUDIO=ON + WITH_WAVAUDIOIMPORTER=ON + WITH_ANYAUDIOIMPORTER=ON) + + # Also the magnum-al-info for desktop platforms + if(UNIX) + list(APPEND _hunter_magnum_cmake_args WITH_AL_INFO=ON) + endif() +endif() + +hunter_cmake_args( + magnum + CMAKE_ARGS + ${_hunter_magnum_cmake_args} + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(magnum) +hunter_download(PACKAGE_NAME magnum) diff --git a/cmake/projects/md5/hunter.cmake b/cmake/projects/md5/hunter.cmake new file mode 100644 index 000000000..3642e33de --- /dev/null +++ b/cmake/projects/md5/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + md5 + VERSION + 1.6 + URL + "https://github.com/hunter-packages/md5/archive/v1.6.tar.gz" + SHA1 + e693ece280ba161001c6024baac3146b2b8778dc +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(md5) +hunter_download(PACKAGE_NAME md5) diff --git a/cmake/projects/mkl/hunter.cmake b/cmake/projects/mkl/hunter.cmake new file mode 100644 index 000000000..b6802d126 --- /dev/null +++ b/cmake/projects/mkl/hunter.cmake @@ -0,0 +1,82 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_user_error) + +if(WIN32) + hunter_add_version( + PACKAGE_NAME + mkl + VERSION + 20180406 + URL + "https://github.com/intel/mkl-dnn/releases/download/v0.14/mklml_win_2018.0.3.20180406.zip" + SHA1 + d607ca92d7bfc101f0828c0b005098b75531669b + ) + + hunter_add_version( + PACKAGE_NAME + mkl + VERSION + 20190502 + URL + "https://github.com/intel/mkl-dnn/releases/download/v0.19/mklml_win_2019.0.5.20190502.zip" + SHA1 + 9d6ff4d5a486689338158093e96c43ee442b65f0 + ) +elseif(APPLE) + hunter_add_version( + PACKAGE_NAME + mkl + VERSION + 20180406 + URL + "https://github.com/intel/mkl-dnn/releases/download/v0.14/mklml_mac_2018.0.3.20180406.tgz" + SHA1 + d76083fd5a79767a96572ad0e23e7f4c892818f2 + ) + + hunter_add_version( + PACKAGE_NAME + mkl + VERSION + 20190502 + URL + "https://github.com/intel/mkl-dnn/releases/download/v0.19/mklml_mac_2019.0.5.20190502.tgz" + SHA1 + a1c42af04f990b0e515a1c31946424b2e68fccc9 + ) +elseif(UNIX) + hunter_add_version( + PACKAGE_NAME + mkl + VERSION + 20180406 + URL + "https://github.com/intel/mkl-dnn/releases/download/v0.14/mklml_lnx_2018.0.3.20180406.tgz" + SHA1 + aea0d9ce65773cfcf5d8292b8db553bde965fc8f + ) + + hunter_add_version( + PACKAGE_NAME + mkl + VERSION + 20190502 + URL + "https://github.com/intel/mkl-dnn/releases/download/v0.19/mklml_lnx_2019.0.5.20190502.tgz" + SHA1 + 6ab490f0b358124338d04ee9383c3cbc536969d8 + ) +else() + hunter_user_error("Platform not supported") +endif() + +hunter_pick_scheme(DEFAULT url_sha1_unpack_install) +hunter_download(PACKAGE_NAME mkl) diff --git a/cmake/projects/mkldnn/hunter.cmake b/cmake/projects/mkldnn/hunter.cmake new file mode 100644 index 000000000..73e7e234b --- /dev/null +++ b/cmake/projects/mkldnn/hunter.cmake @@ -0,0 +1,66 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + mkldnn + VERSION + 0.14-p0 + URL + "https://github.com/hunter-packages/mkldnn/archive/v0.14-p0.tar.gz" + SHA1 + 374092d906d8163491d96907095727429fed776e +) + +hunter_add_version( + PACKAGE_NAME + mkldnn + VERSION + 0.17.4-p0 + URL + "https://github.com/hunter-packages/mkldnn/archive/v0.17.4-p0.tar.gz" + SHA1 + 73a88f93c27e372c901608a399be54c7f21c4daa +) + +hunter_add_version( + PACKAGE_NAME + mkldnn + VERSION + 0.17.4-p1 + URL + "https://github.com/hunter-packages/mkldnn/archive/v0.17.4-p1.tar.gz" + SHA1 + ee1cdb9a1a3359af85e4a0c6274292b2a0873a8f +) + +hunter_add_version( + PACKAGE_NAME + mkldnn + VERSION + 0.19-p0 + URL + "https://github.com/hunter-packages/mkldnn/archive/v0.19-p0.tar.gz" + SHA1 + 50b706789a891f0af17b0e8732a7c1954683403e +) + +hunter_cmake_args( + mkldnn + CMAKE_ARGS + FAIL_WITHOUT_MKL=ON + WITH_EXAMPLE=OFF + WITH_TEST=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(mkldnn) +hunter_download(PACKAGE_NAME mkldnn) diff --git a/cmake/projects/mng/hunter.cmake b/cmake/projects/mng/hunter.cmake new file mode 100644 index 000000000..e86fef868 --- /dev/null +++ b/cmake/projects/mng/hunter.cmake @@ -0,0 +1,49 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + mng + VERSION + 2.0.3-p0 + URL + https://github.com/hunter-packages/mng/archive/v2.0.3-p0.tar.gz + SHA1 + d0f3f21b816785841f27f704a69436cc261364bc +) + +hunter_add_version( + PACKAGE_NAME + mng + VERSION + 2.0.3-p1 + URL + https://github.com/hunter-packages/mng/archive/v2.0.3-p1.tar.gz + SHA1 + 7093e4ea2701834ff858aa3441294edbbf83c4b1 +) + +hunter_add_version( + PACKAGE_NAME + mng + VERSION + 2.0.3-p2 + URL + https://github.com/hunter-packages/mng/archive/v2.0.3-p2.tar.gz + SHA1 + 54d8034ced87b6411df40d0f3cfd5724257e9b00 +) + +hunter_cmake_args(mng CMAKE_ARGS MNG_INSTALL_LIB_DIR=lib) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(mng) +hunter_download(PACKAGE_NAME mng) diff --git a/cmake/projects/mojoshader/hunter.cmake b/cmake/projects/mojoshader/hunter.cmake new file mode 100644 index 000000000..0babda401 --- /dev/null +++ b/cmake/projects/mojoshader/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + mojoshader + VERSION + 0.0.1 + URL + "https://github.com/hunter-packages/mojoshader/archive/v0.0.1.tar.gz" + SHA1 + 177e1a81bf0fe0253ee111ca679b69c61685e79c +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(mojoshader) +hunter_download(PACKAGE_NAME mojoshader) diff --git a/cmake/projects/mongoose/hunter.cmake b/cmake/projects/mongoose/hunter.cmake new file mode 100644 index 000000000..f6a192827 --- /dev/null +++ b/cmake/projects/mongoose/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + mongoose + VERSION + 6.10 + URL + https://github.com/hunter-packages/mongoose/archive/6.10-p.tar.gz + SHA1 + 7f2af8da196c29a60f597b67cde5706d0acb20a0 +) + +hunter_add_version( + PACKAGE_NAME + mongoose + VERSION + 5.6 + URL + https://github.com/hunter-packages/mongoose/archive/5.6-p.tar.gz + SHA1 + cbb313403e742f09cbbcf1c1a62c13e156c6b803 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(mongoose) +hunter_download(PACKAGE_NAME mongoose) diff --git a/cmake/projects/mpark_variant/hunter.cmake b/cmake/projects/mpark_variant/hunter.cmake new file mode 100644 index 000000000..e64bfd0b8 --- /dev/null +++ b/cmake/projects/mpark_variant/hunter.cmake @@ -0,0 +1,29 @@ +# cmake/projects/mpark_variant/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + mpark_variant + VERSION + "1.0.0" + URL + "https://github.com/mpark/variant/archive/v1.0.0.tar.gz" + SHA1 + 59ab98b61daa335ba1fa613e591de743f72d24b4 +) + +# Probably more versions for real packages... + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +hunter_cacheable(mpark_variant) +hunter_download(PACKAGE_NAME mpark_variant) diff --git a/cmake/projects/mshadow/hunter.cmake b/cmake/projects/mshadow/hunter.cmake new file mode 100644 index 000000000..9a0be1de3 --- /dev/null +++ b/cmake/projects/mshadow/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + mshadow + VERSION + 1.1-696803b-p0 + URL + "https://github.com/hunter-packages/mshadow/archive/v1.1-696803b-p0.tar.gz" + SHA1 + 34429211cc841afbde7f8f36994501836a36eb6f +) + +hunter_add_version( + PACKAGE_NAME + mshadow + VERSION + 1.1-1d79ecf-p0 + URL + "https://github.com/hunter-packages/mshadow/archive/v1.1-1d79ecf-p0.tar.gz" + SHA1 + 45e424dc081ccd02f61ab58b59030e3da3890a8a +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(mshadow) +hunter_download(PACKAGE_NAME mshadow) diff --git a/cmake/projects/mtplz/hunter.cmake b/cmake/projects/mtplz/hunter.cmake new file mode 100644 index 000000000..b12f07784 --- /dev/null +++ b/cmake/projects/mtplz/hunter.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + mtplz + VERSION + 0.1-p1 + URL + "https://github.com/hunter-packages/mtplz/archive/v0.1-p1.tar.gz" + SHA1 + 3323b6a97afefa0cc008785caa37b43681c9589e +) + +hunter_add_version( + PACKAGE_NAME + mtplz + VERSION + 0.1-p3 + URL + "https://github.com/hunter-packages/mtplz/archive/v0.1-p3.tar.gz" + SHA1 + 22a29dbe58a86e4e91e1abeb1ab4c67cf3ceca79 +) + +hunter_cmake_args( + mtplz + CMAKE_ARGS + BUILD_TESTING=OFF + MTPLZ_BUILD_EXE=OFF + MTPLZ_BUILD_KENLM_INTERPOLATE=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(mtplz) +hunter_download(PACKAGE_NAME mtplz) diff --git a/cmake/projects/mxnet/hunter.cmake b/cmake/projects/mxnet/hunter.cmake new file mode 100644 index 000000000..0a65d832f --- /dev/null +++ b/cmake/projects/mxnet/hunter.cmake @@ -0,0 +1,108 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + mxnet + VERSION + 0.0.0-5b86701f2-p0 + URL + "https://github.com/hunter-packages/mxnet/archive/0.0.0-5b86701f2-p0.tar.gz" + SHA1 + 8b7d898d2f474bef2ca436cca2c2ab15483535cd +) + +hunter_add_version( + PACKAGE_NAME + mxnet + VERSION + 0.0.0-5b86701f2-p1 + URL + "https://github.com/hunter-packages/mxnet/archive/0.0.0-5b86701f2-p1.tar.gz" + SHA1 + 71c01aaa65448f4826e2ec4cadb44987370d664f +) + +hunter_add_version( + PACKAGE_NAME + mxnet + VERSION + 0.0.0-5b86701f2-p2 + URL + "https://github.com/hunter-packages/mxnet/archive/0.0.0-5b86701f2-p2.tar.gz" + SHA1 + 60c4d0ef4b9ac35e6a23c5482a1702da7e377d5c +) + +hunter_add_version( + PACKAGE_NAME + mxnet + VERSION + 1.4.0-p2 + URL + "https://github.com/hunter-packages/mxnet/archive/v1.4.0-p2.tar.gz" + SHA1 + bb80e4b173d2630313195f38d528f2d2d42455c3 +) + +hunter_add_version( + PACKAGE_NAME + mxnet + VERSION + 1.4.0-p3 + URL + "https://github.com/hunter-packages/mxnet/archive/v1.4.0-p3.tar.gz" + SHA1 + aa01fea9b74bd4a10f5a1d028e61be62c4536bd0 +) + +hunter_add_version( + PACKAGE_NAME + mxnet + VERSION + 1.5.0.rc1-b64e00a-p0 + URL + "https://github.com/hunter-packages/mxnet/archive/v1.5.0.rc1-b64e00a-p0.tar.gz" + SHA1 + 01c400835d280a7ffec86361d17a2a10b3851998 +) + +set( + __hunter_mxnet_args + BUILD_CPP_EXAMPLES=OFF + BUILD_TESTS=OFF + USE_CPP_PACKAGE=ON + USE_GPERFTOOLS=OFF + USE_JEMALLOC=OFF + USE_OPENMP=OFF +) + +if(APPLE) + list( + APPEND + __hunter_mxnet_args + BLAS=apple + USE_CUDA=OFF + USE_LAPACK=OFF + ) +else() + list( + APPEND + __hunter_mxnet_args + USE_LAPACK=OFF + ) +endif() + +hunter_cmake_args(mxnet CMAKE_ARGS ${__hunter_mxnet_args}) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(mxnet) +hunter_download(PACKAGE_NAME mxnet) diff --git a/cmake/projects/nanoflann/hunter.cmake b/cmake/projects/nanoflann/hunter.cmake new file mode 100644 index 000000000..47a4d38b3 --- /dev/null +++ b/cmake/projects/nanoflann/hunter.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + nanoflann + VERSION + 1.2.3-p0 + URL + "https://github.com/hunter-packages/nanoflann/archive/v1.2.3-p0.tar.gz" + SHA1 + 72a42a31056aab380eac09b9f00dab18e91235b8 + ) + +hunter_cmake_args( + nanoflann + CMAKE_ARGS + NANOFLANN_BUILD_EXAMPLES=OFF + NANOFLANN_BUILD_TESTS=OFF + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(nanoflann) +hunter_download(PACKAGE_NAME nanoflann) diff --git a/cmake/projects/nanosvg/hunter.cmake b/cmake/projects/nanosvg/hunter.cmake new file mode 100644 index 000000000..543e751c6 --- /dev/null +++ b/cmake/projects/nanosvg/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + + # !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + + hunter_add_version( + PACKAGE_NAME + nanosvg + VERSION + "0.0.0-2b08dee-p0" + URL + "https://github.com/hunter-packages/nanosvg/archive/v0.0.0-2b08dee-p0.tar.gz" + SHA1 + ee4b86de4478fc912510bada2341d4f8faa8feaf +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(nanosvg) +hunter_download(PACKAGE_NAME nanosvg) diff --git a/cmake/projects/ncnn/hunter.cmake b/cmake/projects/ncnn/hunter.cmake new file mode 100644 index 000000000..cc34d982c --- /dev/null +++ b/cmake/projects/ncnn/hunter.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ncnn + VERSION + 20180314-p2 + URL + "https://github.com/hunter-packages/ncnn/archive/20180314-p2.tar.gz" + SHA1 + 7ae8c7e168206885d18eee3068dee96705841bf7 +) + +hunter_cmake_args( + ncnn + CMAKE_ARGS + NCNN_LOCAL_TOOLCHAIN=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ncnn) +hunter_download(PACKAGE_NAME ncnn) diff --git a/cmake/projects/ncursesw/hunter.cmake b/cmake/projects/ncursesw/hunter.cmake new file mode 100644 index 000000000..19ffcb196 --- /dev/null +++ b/cmake/projects/ncursesw/hunter.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ncursesw + VERSION + 6.1 + URL + "https://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz" + SHA1 + 57acf6bc24cacd651d82541929f726f4def780cc +) + +hunter_configuration_types(ncursesw CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cmake_args( + ncursesw + CMAKE_ARGS + EXTRA_FLAGS=--enable-ext-mouse --enable-sigwinch --enable-ext-colors --enable-widec --enable-pc-files + PKGCONFIG_EXPORT_TARGETS=ncursesw;formw;ncurses++w;menuw;panelw +) +hunter_cacheable(ncursesw) +hunter_download( + PACKAGE_NAME ncursesw + PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_UNRELOCATABLE_TEXT_FILES + lib/pkgconfig/ncursesw.pc + lib/pkgconfig/formw.pc + lib/pkgconfig/ncurses++w.pc + lib/pkgconfig/menuw.pc + lib/pkgconfig/panelw.pc + bin/ncursesw6-config +) diff --git a/cmake/projects/nlohmann_fifo_map/hunter.cmake b/cmake/projects/nlohmann_fifo_map/hunter.cmake new file mode 100644 index 000000000..a0314eca8 --- /dev/null +++ b/cmake/projects/nlohmann_fifo_map/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + nlohmann_fifo_map + VERSION + "0.0.0-0dfbf5d-p1" + URL + "https://github.com/hunter-packages/fifo_map/archive/v0.0.0-0dfbf5d-p1.tar.gz" + SHA1 + 5361545721631631fd0cb4112f888cba8a2ef7ef +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(nlohmann_fifo_map) +hunter_download(PACKAGE_NAME nlohmann_fifo_map) diff --git a/cmake/projects/nlohmann_json/hunter.cmake b/cmake/projects/nlohmann_json/hunter.cmake new file mode 100644 index 000000000..a26c6f151 --- /dev/null +++ b/cmake/projects/nlohmann_json/hunter.cmake @@ -0,0 +1,127 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_report_broken_package) +include(hunter_status_debug) + +# See https://github.com/nlohmann/json#supported-compilers +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8") + hunter_report_broken_package("The nlohmann_json package requires GCC 4.8 or newer.") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.4") + hunter_report_broken_package("The nlohmann_json package requires Clang 3.4 or newer.") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.0") + hunter_report_broken_package("The nlohmann_json package requires Visual Studio 2015 or newer.") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "17.0.2") + hunter_report_broken_package("The nlohmann_json package requires Intel compiler 17.0.2 or newer.") + endif() +else() + hunter_status_debug("You are using an untested compiler for the nlohmann_json package.") +endif() + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "2.1.1-p0" + URL "https://github.com/hunter-packages/json/archive/v2.1.1-p0.tar.gz" + SHA1 baf11b83387a7c4b2b6eb1e280f69084185813c0 +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "2.1.1-p1" + URL "https://github.com/hunter-packages/json/archive/v2.1.1-p1.tar.gz" + SHA1 28ec11ef2596d38a11a2f4b3dfd63c3255c76f57 +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.0.0" + URL "https://github.com/nlohmann/json/archive/v3.0.0.tar.gz" + SHA1 dbc3bb35d0bf9e21e5348291caa4142ab3ad418b +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.0.1" + URL "https://github.com/nlohmann/json/archive/v3.0.1.tar.gz" + SHA1 56d0b45d94b78b9bee73e8457d222457952d9270 +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.1.0" + URL "https://github.com/nlohmann/json/archive/v3.1.0.tar.gz" + SHA1 d59929f5796e92c70dfc0fd9d37bf9b90265bfd3 +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.1.1" + URL "https://github.com/nlohmann/json/archive/v3.1.1.tar.gz" + SHA1 3bdcd9dd6b3c5a0f376ac9c77020f3b9676d3e62 +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.1.2" + URL "https://github.com/nlohmann/json/archive/v3.1.2.tar.gz" + SHA1 7b668b6af9839c7a46449a0d7f3389982c21ccbb +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.2.0" + URL "https://github.com/nlohmann/json/archive/v3.2.0.tar.gz" + SHA1 d14cd77f0badfdacd867861633d5a8ab45d7b9df +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.3.0" + URL "https://github.com/nlohmann/json/archive/v3.3.0.tar.gz" + SHA1 90842f04aadc1af1af600ce84c7fbe0d1dfc3d3c +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.4.0" + URL "https://github.com/nlohmann/json/archive/v3.4.0.tar.gz" + SHA1 eb8cedccbe5868cbd963bf72f5c27f4ebea51423 +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.5.0" + URL "https://github.com/nlohmann/json/archive/v3.5.0.tar.gz" + SHA1 d5fb01debe55c2f56ef44dabb0539947434e815d +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.6.0" + URL "https://github.com/nlohmann/json/archive/v3.6.0.tar.gz" + SHA1 2848ddd69a5ddc6b48d134e9c7ad2f0896c67f9c +) + +hunter_add_version( + PACKAGE_NAME nlohmann_json + VERSION "3.6.1" + URL "https://github.com/nlohmann/json/archive/v3.6.1.tar.gz" + SHA1 581e1d1c89c65670fb5212d74493a4545d9ab91c +) + +hunter_cmake_args(nlohmann_json CMAKE_ARGS JSON_BuildTests=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(nlohmann_json) +hunter_download(PACKAGE_NAME nlohmann_json) diff --git a/cmake/projects/nsync/hunter.cmake b/cmake/projects/nsync/hunter.cmake new file mode 100644 index 000000000..dd4d7de08 --- /dev/null +++ b/cmake/projects/nsync/hunter.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + nsync + VERSION + 1.14-p1 + URL + "https://github.com/hunter-packages/nsync/archive/v1.14-p1.tar.gz" + SHA1 + ba52dbd178fc5162aac4469b67c0b5a684e37075 + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(nsync) +hunter_download(PACKAGE_NAME nsync) diff --git a/cmake/projects/oniguruma/hunter.cmake b/cmake/projects/oniguruma/hunter.cmake new file mode 100644 index 000000000..8c2043c5e --- /dev/null +++ b/cmake/projects/oniguruma/hunter.cmake @@ -0,0 +1,17 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME oniguruma + VERSION "6.8.1-p0" + URL "https://github.com/hunter-packages/oniguruma/archive/v6.8.1-p0.tar.gz" + SHA1 "6d82ba6bf7a7313b64ba9772622eeeb964e951fb") + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(oniguruma) +hunter_download(PACKAGE_NAME oniguruma) diff --git a/cmake/projects/onmt/hunter.cmake b/cmake/projects/onmt/hunter.cmake new file mode 100644 index 000000000..d32e4122e --- /dev/null +++ b/cmake/projects/onmt/hunter.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + onmt + VERSION + 0.4.1-p0 + URL + "https://github.com/hunter-packages/onmt/archive/v0.4.1-p0.tar.gz" + SHA1 + a691a53a695135cd38d85042bafacf734b3e6a5a +) + +hunter_add_version( + PACKAGE_NAME + onmt + VERSION + 0.4.1-p2 + URL + "https://github.com/hunter-packages/onmt/archive/v0.4.1-p2.tar.gz" + SHA1 + a0b6cf26304e8049d7e8d68b0c80fc757fc0504a +) + +hunter_cmake_args(onmt CMAKE_ARGS LIB_ONLY=YES WITH_OPENMP=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(onmt) +hunter_download(PACKAGE_NAME onmt) diff --git a/cmake/projects/opentracing-cpp/hunter.cmake b/cmake/projects/opentracing-cpp/hunter.cmake new file mode 100644 index 000000000..618f1d862 --- /dev/null +++ b/cmake/projects/opentracing-cpp/hunter.cmake @@ -0,0 +1,56 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME opentracing-cpp + VERSION "1.0.0" + URL "https://github.com/hunter-packages/opentracing-cpp/archive/hunter-v1.0.0.tar.gz" + SHA1 "881faab1353be98f605534d2777349eb5cbbe6be") + +hunter_add_version( + PACKAGE_NAME opentracing-cpp + VERSION "1.1.0" + URL "https://github.com/opentracing/opentracing-cpp/archive/v1.1.0.tar.gz" + SHA1 "800c98b4b049a89e9e38a34d797b42d470476e1d") + +hunter_add_version( + PACKAGE_NAME opentracing-cpp + VERSION "1.2.0" + URL "https://github.com/opentracing/opentracing-cpp/archive/v1.2.0.tar.gz" + SHA1 "5f95ff287a03948c48a572de1d11d5cb0d055662") + +hunter_add_version( + PACKAGE_NAME opentracing-cpp + VERSION "1.3.0" + URL "https://github.com/opentracing/opentracing-cpp/archive/v1.3.0.tar.gz" + SHA1 "7329f65e48e3c2e7c1bdd95683f4433c34649bfc") + +hunter_add_version( + PACKAGE_NAME opentracing-cpp + VERSION "1.4.0" + URL "https://github.com/opentracing/opentracing-cpp/archive/v1.4.0.tar.gz" + SHA1 "cddf6a6c13a9167cd05715a07e14e9bcff71e11b") + +hunter_add_version( + PACKAGE_NAME opentracing-cpp + VERSION "1.4.2" + URL "https://github.com/opentracing/opentracing-cpp/archive/v1.4.2.tar.gz" + SHA1 "2785569bda67f654ff9cacc97124fd59f3161fb4") + +hunter_add_version( + PACKAGE_NAME opentracing-cpp + VERSION "1.5.0" + URL "https://github.com/opentracing/opentracing-cpp/archive/v1.5.0.tar.gz" + SHA1 "8aa1d0251274749d2f0604b56fb215431529387b") + +hunter_cmake_args(opentracing-cpp CMAKE_ARGS + BUILD_TESTING=OFF ENABLE_LINTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(opentracing-cpp) +hunter_download(PACKAGE_NAME opentracing-cpp) diff --git a/cmake/projects/pcg/hunter.cmake b/cmake/projects/pcg/hunter.cmake new file mode 100644 index 000000000..e19959935 --- /dev/null +++ b/cmake/projects/pcg/hunter.cmake @@ -0,0 +1,19 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME pcg + VERSION "0.0.0-p1" + URL "https://github.com/hunter-packages/pcg-c/archive/v0.0.0-p1.tar.gz" + SHA1 "5036df47f4b4c62e6a2e267abc1ca2f7a657d62c") + +hunter_cmake_args(pcg CMAKE_ARGS BUILD_TESTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(pcg) +hunter_download(PACKAGE_NAME pcg) diff --git a/cmake/projects/pcre2/hunter.cmake b/cmake/projects/pcre2/hunter.cmake new file mode 100644 index 000000000..5a62ea4cf --- /dev/null +++ b/cmake/projects/pcre2/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pcre2 + VERSION + 10.13-p0 + URL + "https://github.com/hunter-packages/pcre2/archive/v10.33-p0.tar.gz" + SHA1 + 7fa03a8b27230770f6d8fa09885825dd95483405 +) + +hunter_cmake_args( + pcre2 + CMAKE_ARGS + PCRE2_BUILD_TESTS=OFF + PCRE2_BUILD_PCRE2_16=ON + PCRE2_BUILD_PCRE2_32=ON + PCRE2_SUPPORT_JIT=ON + PCRE2_BUILD_PCRE2GREP=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(pcre2) +hunter_download(PACKAGE_NAME pcre2) diff --git a/cmake/projects/pegtl/hunter.cmake b/cmake/projects/pegtl/hunter.cmake new file mode 100644 index 000000000..e8c1e43fd --- /dev/null +++ b/cmake/projects/pegtl/hunter.cmake @@ -0,0 +1,66 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + + +# master branch will be the next 3.x.x release in pegtl +hunter_add_version( + PACKAGE_NAME + pegtl + VERSION + 3.0.0-697aaa06 + URL + "https://github.com/taocpp/PEGTL/archive/697aaa06564c6ea9d13f95de081a2d2d46b39160.zip" + SHA1 + 3b441aee41d1932809807ba27f30ca95602e322c +) + +hunter_add_version( + PACKAGE_NAME + pegtl + VERSION + 2.8.1 + URL + "https://github.com/taocpp/PEGTL/archive/2.8.1.tar.gz" + SHA1 + 50a8f7a24062794fb7caccc45ca7c635258595e3 +) + +hunter_add_version( + PACKAGE_NAME + pegtl + VERSION + 2.8.0 + URL + "https://github.com/taocpp/PEGTL/archive/2.8.0.tar.gz" + SHA1 + 57457c00d90b1c33d50afbb2956cbf2b2533ce6e +) + +hunter_add_version( + PACKAGE_NAME + pegtl + VERSION + 2.5.1 + URL + "https://github.com/taocpp/PEGTL/archive/2.5.1.zip" + SHA1 + 3d2a2a0eb1b928882f4d827c75c5d4290cd58082 +) + +hunter_cmake_args( + pegtl + CMAKE_ARGS + PEGTL_BUILD_TESTS=OFF + PEGTL_BUILD_EXAMPLES=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(pegtl) +hunter_download( + PACKAGE_NAME pegtl +) diff --git a/cmake/projects/pip_GitPython/hunter.cmake b/cmake/projects/pip_GitPython/hunter.cmake new file mode 100644 index 000000000..1a841cb77 --- /dev/null +++ b/cmake/projects/pip_GitPython/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_GitPython + VERSION + 2.1.11 + URL + "https://github.com/gitpython-developers/GitPython/archive/2.1.11.tar.gz" + SHA1 + c0a1515a29b3f64c6745ea2d2dedd3a43ac19678 +) + +hunter_cmake_args( + pip_GitPython + CMAKE_ARGS + DEPENDS_ON_PACKAGES=pip_gitdb +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_GitPython) +hunter_download(PACKAGE_NAME pip_GitPython) diff --git a/cmake/projects/pip_astroid/hunter.cmake b/cmake/projects/pip_astroid/hunter.cmake new file mode 100644 index 000000000..69b7cb5ce --- /dev/null +++ b/cmake/projects/pip_astroid/hunter.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_astroid + VERSION + 2.2.5 + URL + "https://github.com/PyCQA/astroid/archive/astroid-2.2.5.tar.gz" + SHA1 + d6316f6e6363305aae4643679cb8b07ef9c94451 +) + +set( + __hunter_astroid_deps + pip_lazy-object-proxy + pip_wrapt + pip_six +) + +hunter_cmake_args( + pip_astroid + CMAKE_ARGS + DEPENDS_ON_PACKAGES=${__hunter_astroid_deps} +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_astroid) +hunter_download(PACKAGE_NAME pip_astroid) diff --git a/cmake/projects/pip_boto3/hunter.cmake b/cmake/projects/pip_boto3/hunter.cmake new file mode 100644 index 000000000..a40cb4cfd --- /dev/null +++ b/cmake/projects/pip_boto3/hunter.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_boto3 + VERSION + 1.9.130 + URL + "https://github.com/boto/boto3/archive/1.9.130.tar.gz" + SHA1 + 8a10d9204be8d3903ccf62b5a1db6204336a52d4 +) + +set( + __hunter_boto3_deps + pip_botocore + pip_jmespath + pip_python-dateutil + pip_six + pip_urllib3 +) + +hunter_cmake_args( + pip_boto3 + CMAKE_ARGS + DEPENDS_ON_PACKAGES=${__hunter_boto3_deps} +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_boto3) +hunter_download(PACKAGE_NAME pip_boto3) diff --git a/cmake/projects/pip_botocore/hunter.cmake b/cmake/projects/pip_botocore/hunter.cmake new file mode 100644 index 000000000..3102caf02 --- /dev/null +++ b/cmake/projects/pip_botocore/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_botocore + VERSION + 1.12.130 + URL + "https://github.com/boto/botocore/archive/1.12.130.tar.gz" + SHA1 + 6c4d82b257c31606fb7e3af1f6d0d89bac30325d +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_botocore) +hunter_download(PACKAGE_NAME pip_botocore) diff --git a/cmake/projects/pip_certifi/hunter.cmake b/cmake/projects/pip_certifi/hunter.cmake new file mode 100644 index 000000000..e7c270566 --- /dev/null +++ b/cmake/projects/pip_certifi/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_certifi + VERSION + 2019.3.9 + URL + "https://files.pythonhosted.org/packages/06/b8/d1ea38513c22e8c906275d135818fee16ad8495985956a9b7e2bb21942a1/certifi-2019.3.9.tar.gz" + SHA1 + f3873edcfc60c52e97e6601b2576ccdac419281a +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_certifi) +hunter_download(PACKAGE_NAME pip_certifi) diff --git a/cmake/projects/pip_chardet/hunter.cmake b/cmake/projects/pip_chardet/hunter.cmake new file mode 100644 index 000000000..5d0bc69fa --- /dev/null +++ b/cmake/projects/pip_chardet/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_chardet + VERSION + 3.0.4 + URL + "https://github.com/chardet/chardet/archive/3.0.4.tar.gz" + SHA1 + bf740348e002581b026dc4af47d56479097c1fcd +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_chardet) +hunter_download(PACKAGE_NAME pip_chardet) diff --git a/cmake/projects/pip_cpplint/hunter.cmake b/cmake/projects/pip_cpplint/hunter.cmake new file mode 100644 index 000000000..3ed1b737a --- /dev/null +++ b/cmake/projects/pip_cpplint/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_cpplint + VERSION + 1.4.4 + URL + "https://github.com/cpplint/cpplint/archive/1.4.4.tar.gz" + SHA1 + 9ca2b8fc3992130a62f4dc3708a67b10eb1baec7 +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_cpplint) +hunter_download(PACKAGE_NAME pip_cpplint) diff --git a/cmake/projects/pip_decorator/hunter.cmake b/cmake/projects/pip_decorator/hunter.cmake new file mode 100644 index 000000000..efb4eb137 --- /dev/null +++ b/cmake/projects/pip_decorator/hunter.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_decorator + VERSION + 4.4.0 + URL + # GitHub is missing 4.4.0 release: https://github.com/micheles/decorator/releases + "https://files.pythonhosted.org/packages/ba/19/1119fe7b1e49b9c8a9f154c930060f37074ea2e8f9f6558efc2eeaa417a2/decorator-4.4.0.tar.gz" + SHA1 + de59d002bcf83b16421e6ea6fe40256b5fccedad +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_decorator) +hunter_download(PACKAGE_NAME pip_decorator) diff --git a/cmake/projects/pip_gitdb/hunter.cmake b/cmake/projects/pip_gitdb/hunter.cmake new file mode 100644 index 000000000..f581f433f --- /dev/null +++ b/cmake/projects/pip_gitdb/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_gitdb + VERSION + 2.0.5 + URL + "https://github.com/gitpython-developers/gitdb/archive/2.0.5.tar.gz" + SHA1 + e4d8f36d4d3c8c57d2decb05909ebea8e53c807f +) + +hunter_cmake_args( + pip_gitdb + CMAKE_ARGS + DEPENDS_ON_PACKAGES=pip_smmap +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_gitdb) +hunter_download(PACKAGE_NAME pip_gitdb) diff --git a/cmake/projects/pip_idna/hunter.cmake b/cmake/projects/pip_idna/hunter.cmake new file mode 100644 index 000000000..ee91b8699 --- /dev/null +++ b/cmake/projects/pip_idna/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_idna + VERSION + 2.8 + URL + "https://github.com/kjd/idna/archive/v2.8.tar.gz" + SHA1 + 7ca7e073f13574f51ddcfa3cc1a2e5789e895d9b +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_idna) +hunter_download(PACKAGE_NAME pip_idna) diff --git a/cmake/projects/pip_jmespath/hunter.cmake b/cmake/projects/pip_jmespath/hunter.cmake new file mode 100644 index 000000000..41bb8bd0c --- /dev/null +++ b/cmake/projects/pip_jmespath/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_jmespath + VERSION + 0.9.4 + URL + "https://github.com/jmespath/jmespath.py/archive/0.9.4.tar.gz" + SHA1 + 203f430114ffc35a86e8070c434367f2e080f7ea +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_jmespath) +hunter_download(PACKAGE_NAME pip_jmespath) diff --git a/cmake/projects/pip_lazy-object-proxy/hunter.cmake b/cmake/projects/pip_lazy-object-proxy/hunter.cmake new file mode 100644 index 000000000..31b86f7f3 --- /dev/null +++ b/cmake/projects/pip_lazy-object-proxy/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_lazy-object-proxy + VERSION + 1.3.1 + URL + "https://github.com/ionelmc/python-lazy-object-proxy/archive/v1.3.1.tar.gz" + SHA1 + ce01a65239f634c64b72a4dc9054026872fafd64 +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_lazy-object-proxy) +hunter_download(PACKAGE_NAME pip_lazy-object-proxy) diff --git a/cmake/projects/pip_nose-timer/hunter.cmake b/cmake/projects/pip_nose-timer/hunter.cmake new file mode 100644 index 000000000..b3b818d8c --- /dev/null +++ b/cmake/projects/pip_nose-timer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_nose-timer + VERSION + 0.7.5 + URL + "https://github.com/mahmoudimus/nose-timer/archive/v0.7.5.tar.gz" + SHA1 + ac66d620dcb3b06eee43e0c6955bc4c56852ad89 +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_nose-timer) +hunter_download(PACKAGE_NAME pip_nose-timer) diff --git a/cmake/projects/pip_nose/hunter.cmake b/cmake/projects/pip_nose/hunter.cmake new file mode 100644 index 000000000..07f365d88 --- /dev/null +++ b/cmake/projects/pip_nose/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_nose + VERSION + 1.3.7 + URL + "https://github.com/nose-devs/nose/archive/release_1.3.7.tar.gz" + SHA1 + 19ed6623b0c41dee05e07fae08faaff960c3307a +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_nose) +hunter_download(PACKAGE_NAME pip_nose) diff --git a/cmake/projects/pip_numpy/hunter.cmake b/cmake/projects/pip_numpy/hunter.cmake new file mode 100644 index 000000000..a047e556c --- /dev/null +++ b/cmake/projects/pip_numpy/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_numpy + VERSION + 1.16.2 + URL + "https://github.com/numpy/numpy/releases/download/v1.16.2/numpy-1.16.2.tar.gz" + SHA1 + 2a5a60f2b49befaf01a12dc66bab33d519af0cba +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_numpy) +hunter_download(PACKAGE_NAME pip_numpy) diff --git a/cmake/projects/pip_pylint/hunter.cmake b/cmake/projects/pip_pylint/hunter.cmake new file mode 100644 index 000000000..0d4f237fb --- /dev/null +++ b/cmake/projects/pip_pylint/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_pylint + VERSION + 2.3.1 + URL + "https://github.com/PyCQA/pylint/archive/pylint-2.3.1.tar.gz" + SHA1 + 9dc2b3825611baeca43d3601f36841aa8cb7ef60 +) + +hunter_cmake_args( + pip_pylint + CMAKE_ARGS + DEPENDS_ON_PACKAGES=pip_astroid +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_pylint) +hunter_download(PACKAGE_NAME pip_pylint) diff --git a/cmake/projects/pip_python-dateutil/hunter.cmake b/cmake/projects/pip_python-dateutil/hunter.cmake new file mode 100644 index 000000000..e806b9c15 --- /dev/null +++ b/cmake/projects/pip_python-dateutil/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +# Error while using GitHub release: +# +# Make sure you're either building from a fully intact git repository or +# PyPI tarballs. Most other sources (such as GitHub's tarballs, a git +# checkout without the .git folder) don't contain the necessary metadata +# and will not work. + +hunter_add_version( + PACKAGE_NAME + pip_python-dateutil + VERSION + 2.8.0 + URL + "https://files.pythonhosted.org/packages/ad/99/5b2e99737edeb28c71bcbec5b5dda19d0d9ef3ca3e92e3e925e7c0bb364c/python-dateutil-2.8.0.tar.gz" + SHA1 + 140cbe261ba86ff30970bd8ca3326f543de91e4d +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_python-dateutil) +hunter_download(PACKAGE_NAME pip_python-dateutil) diff --git a/cmake/projects/pip_requests/hunter.cmake b/cmake/projects/pip_requests/hunter.cmake new file mode 100644 index 000000000..6c3aabb77 --- /dev/null +++ b/cmake/projects/pip_requests/hunter.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_requests + VERSION + 2.21.0 + URL + "https://github.com/kennethreitz/requests/archive/v2.21.0.tar.gz" + SHA1 + 03f02f356fc00936c492f54f4d4a403598e47333 +) + +set( + __hunter_requests_deps + pip_certifi + pip_chardet + pip_idna + pip_urllib3 +) + +hunter_cmake_args( + pip_requests + CMAKE_ARGS + DEPENDS_ON_PACKAGES=${__hunter_requests_deps} +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_requests) +hunter_download(PACKAGE_NAME pip_requests) diff --git a/cmake/projects/pip_six/hunter.cmake b/cmake/projects/pip_six/hunter.cmake new file mode 100644 index 000000000..2b7a69816 --- /dev/null +++ b/cmake/projects/pip_six/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_six + VERSION + 1.12.0 + URL + "https://github.com/benjaminp/six/archive/1.12.0.tar.gz" + SHA1 + eb86fb797c4be6069ed821113cc908bc02774175 +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_six) +hunter_download(PACKAGE_NAME pip_six) diff --git a/cmake/projects/pip_smmap/hunter.cmake b/cmake/projects/pip_smmap/hunter.cmake new file mode 100644 index 000000000..d763e6938 --- /dev/null +++ b/cmake/projects/pip_smmap/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_smmap + VERSION + 2.0.5 + URL + "https://github.com/gitpython-developers/smmap/archive/v2.0.5.tar.gz" + SHA1 + ea9a04d7ab8e32f4d458da84906a7cd2ba94f97c +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_smmap) +hunter_download(PACKAGE_NAME pip_smmap) diff --git a/cmake/projects/pip_urllib3/hunter.cmake b/cmake/projects/pip_urllib3/hunter.cmake new file mode 100644 index 000000000..7e85fc324 --- /dev/null +++ b/cmake/projects/pip_urllib3/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_urllib3 + VERSION + 1.24.1 + URL + "https://github.com/urllib3/urllib3/archive/1.24.1.tar.gz" + SHA1 + 67cf61811cf7356be5fe60a5ff8dacbb74e54dcf +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_urllib3) +hunter_download(PACKAGE_NAME pip_urllib3) diff --git a/cmake/projects/pip_wrapt/hunter.cmake b/cmake/projects/pip_wrapt/hunter.cmake new file mode 100644 index 000000000..c182e9bc0 --- /dev/null +++ b/cmake/projects/pip_wrapt/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + pip_wrapt + VERSION + 1.11.1 + URL + "https://github.com/GrahamDumpleton/wrapt/archive/1.11.1.tar.gz" + SHA1 + 20677372a74167bd9a7eb312996a0cca90db593e +) + +hunter_pick_scheme(DEFAULT url_sha1_pip) +hunter_cacheable(pip_wrapt) +hunter_download(PACKAGE_NAME pip_wrapt) diff --git a/cmake/projects/pluginlib/hunter.cmake b/cmake/projects/pluginlib/hunter.cmake new file mode 100644 index 000000000..f85ac1099 --- /dev/null +++ b/cmake/projects/pluginlib/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + pluginlib + VERSION + 1.12.1-p0 + URL + "https://github.com/hunter-packages/pluginlib/archive/v1.12.1-p0.tar.gz" + SHA1 + 602a153b9d4bde918e7a4090f38eed60b64f8547 +) + +hunter_cmake_args( + pluginlib + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(pluginlib) +hunter_download(PACKAGE_NAME pluginlib) diff --git a/cmake/projects/prometheus-cpp/hunter.cmake b/cmake/projects/prometheus-cpp/hunter.cmake new file mode 100644 index 000000000..5671d1b56 --- /dev/null +++ b/cmake/projects/prometheus-cpp/hunter.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + prometheus-cpp + VERSION + 0.6.0-p2 + URL + "https://github.com/hunter-packages/prometheus-cpp/archive/v0.6.0-p2.tar.gz" + SHA1 + 43ef1b4c9e0867f979a5579ee9b5fd80652d7919 +) + +hunter_cmake_args( + prometheus-cpp + CMAKE_ARGS + ENABLE_TESTING=OFF + USE_THIRDPARTY_LIBRARIES=OFF + OVERRIDE_CXX_STANDARD_FLAGS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(prometheus-cpp) +hunter_download(PACKAGE_NAME prometheus-cpp) diff --git a/cmake/projects/protobuf-c/hunter.cmake b/cmake/projects/protobuf-c/hunter.cmake new file mode 100644 index 000000000..7e81b6c57 --- /dev/null +++ b/cmake/projects/protobuf-c/hunter.cmake @@ -0,0 +1,25 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME protobuf-c + VERSION "1.3.0-p0" + URL "https://github.com/hunter-packages/protobuf-c/archive/v1.3.0-p0.tar.gz" + SHA1 "e106e376b95650521e860642cd660e503a2d4f5c") + +hunter_add_version( + PACKAGE_NAME protobuf-c + VERSION "1.3.0-p1" + URL "https://github.com/hunter-packages/protobuf-c/archive/v1.3.0-p1.tar.gz" + SHA1 "d93fc3f0f422f62a5c0454981f73a5acdbf8b078") + +hunter_cmake_args(protobuf-c CMAKE_ARGS BUILD_TESTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(protobuf-c) +hunter_download(PACKAGE_NAME protobuf-c) diff --git a/cmake/projects/pugixml/hunter.cmake b/cmake/projects/pugixml/hunter.cmake new file mode 100644 index 000000000..913d04a49 --- /dev/null +++ b/cmake/projects/pugixml/hunter.cmake @@ -0,0 +1,18 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME pugixml + VERSION "1.8.1" + URL "https://github.com/rusdevops/pugixml/archive/v1.8.1-hunter.tar.gz" + SHA1 005b1c8830e6f81f559d0b72f9f7ff320895847f +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(pugixml) +hunter_download(PACKAGE_NAME pugixml) diff --git a/cmake/projects/pybind11/hunter.cmake b/cmake/projects/pybind11/hunter.cmake new file mode 100644 index 000000000..adb1f11a4 --- /dev/null +++ b/cmake/projects/pybind11/hunter.cmake @@ -0,0 +1,25 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME pybind11 + VERSION "2.2.1" + URL "https://github.com/pybind/pybind11/archive/v2.2.1.tar.gz" + SHA1 "a2bfabe5ae736c3fc3408b5401a656c1f584b511") + +hunter_add_version( + PACKAGE_NAME pybind11 + VERSION "2.2.4" + URL "https://github.com/pybind/pybind11/archive/v2.2.4.tar.gz" + SHA1 "488971990bbd3828311356faaa30f4b0d7575dad") + +hunter_cmake_args(pybind11 CMAKE_ARGS PYBIND11_TEST=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(pybind11) +hunter_download(PACKAGE_NAME pybind11) diff --git a/cmake/projects/qhull/hunter.cmake b/cmake/projects/qhull/hunter.cmake new file mode 100644 index 000000000..226f8796b --- /dev/null +++ b/cmake/projects/qhull/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. +#ok +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + qhull + VERSION + 7.2.0-p0 + URL + "https://github.com/hunter-packages/qhull/archive/v7.2.0-p0.tar.gz" + SHA1 + 17ee22ce8b2814aecb300f31cecf3fb4971b2f1f +) + +hunter_add_version( + PACKAGE_NAME + qhull + VERSION + 7.2.0-p1 + URL + "https://github.com/hunter-packages/qhull/archive/v7.2.0-p1.tar.gz" + SHA1 + 48e45eab0d6331403539bd2f3408e02eba7a0256 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(qhull) +hunter_download(PACKAGE_NAME qhull) diff --git a/cmake/projects/quickjs/hunter.cmake b/cmake/projects/quickjs/hunter.cmake new file mode 100644 index 000000000..239d0df2c --- /dev/null +++ b/cmake/projects/quickjs/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + quickjs + VERSION + 2019-07-21-p0 + URL + "https://github.com/hunter-packages/quickjs/archive/2019-07-21-p0.tar.gz" + SHA1 + def3915206ca673831601adf4efbe0f8264806e5 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(quickjs) +hunter_download(PACKAGE_NAME quickjs) diff --git a/cmake/projects/rabit/hunter.cmake b/cmake/projects/rabit/hunter.cmake new file mode 100644 index 000000000..179d1ddfb --- /dev/null +++ b/cmake/projects/rabit/hunter.cmake @@ -0,0 +1,48 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + rabit + VERSION + 0.0.0-p2 + URL + https://github.com/hunter-packages/rabit/archive/v0.0.0-p2.tar.gz + SHA1 + bdb425ca303e1b09bdf8245eed419834bc9b4752 + ) + +hunter_add_version( + PACKAGE_NAME + rabit + VERSION + 0.0.0-p1 + URL + https://github.com/hunter-packages/rabit/archive/v0.0.0-p1.tar.gz + SHA1 + f2bb803b381bebe42089acf9946848dd580d9470 + ) + +hunter_add_version( + PACKAGE_NAME + rabit + VERSION + 0.0.0-p0 + URL + https://github.com/hunter-packages/rabit/archive/v0.0.0-p0.tar.gz + SHA1 + 4f0a65c6f1fcd6b7cce1618aa49faf25e8a8a337 + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(rabit) +hunter_download(PACKAGE_NAME rabit) diff --git a/cmake/projects/rang/hunter.cmake b/cmake/projects/rang/hunter.cmake new file mode 100644 index 000000000..fdc86bb25 --- /dev/null +++ b/cmake/projects/rang/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + rang + VERSION + 3.1.0-p0 + URL + "https://github.com/hunter-packages/rang/archive/v3.1.0-p0.tar.gz" + SHA1 + 6a49f08c81009e2ab513b3d62e3c5fbc7efab882 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(rang) +hunter_download(PACKAGE_NAME rang) diff --git a/cmake/projects/range-v3/hunter.cmake b/cmake/projects/range-v3/hunter.cmake new file mode 100644 index 000000000..4515cd3b9 --- /dev/null +++ b/cmake/projects/range-v3/hunter.cmake @@ -0,0 +1,72 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + range-v3 + VERSION + vcpkg5-p + URL + "https://github.com/hunter-packages/range-v3/archive/vcpkg5-p.tar.gz" + SHA1 + d8b723b955d7c92d3734fead371538d11cf73452 +) + +hunter_add_version( + PACKAGE_NAME + range-v3 + VERSION + 0.3.0-p + URL + "https://github.com/hunter-packages/range-v3/archive/0.3.0-p.tar.gz" + SHA1 + d2b3c31c66c4c7d0b11798e370af4e1e372a307b +) + +hunter_add_version( + PACKAGE_NAME + range-v3 + VERSION + 0.4.0-01ccd0e5-p0 + URL + "https://github.com/hunter-packages/range-v3/archive/0.4.0-01ccd0e5-p0.tar.gz" + SHA1 + 7ae50752d40beb489935b73d521c14b4c147cfd5 +) + +hunter_add_version( + PACKAGE_NAME + range-v3 + VERSION + 0.5.0 + URL + "https://github.com/ericniebler/range-v3/archive/0.5.0.tar.gz" + SHA1 + 5c0eac44a710f85cae6dc11aa7577ec90f30c5a8 +) + +hunter_cmake_args( + range-v3 + CMAKE_ARGS + BUILD_DOCS=FALSE + BUILD_TESTS=FALSE + BUILD_TESTING=FALSE + RANGE_V3_EXAMPLES=FALSE + RANGE_V3_PERF=FALSE + RANGE_V3_DOCS=FALSE + RANGE_V3_TESTS=FALSE + RANGE_V3_HEADER_CHECKS=FALSE +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(range-v3) +hunter_download(PACKAGE_NAME range-v3) + diff --git a/cmake/projects/re2/hunter.cmake b/cmake/projects/re2/hunter.cmake new file mode 100644 index 000000000..9b7b0b7fe --- /dev/null +++ b/cmake/projects/re2/hunter.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + re2 + VERSION + 2017.11.01-p0 + URL + https://github.com/hunter-packages/re2/archive/2017.11.01-p0.tar.gz + SHA1 + 78ed8b27fe1499a30281f3763bb282ea47636b1a + ) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(re2) +hunter_download(PACKAGE_NAME re2) diff --git a/cmake/projects/readline/hunter.cmake b/cmake/projects/readline/hunter.cmake new file mode 100644 index 000000000..49054c111 --- /dev/null +++ b/cmake/projects/readline/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + readline + VERSION + "6.3" + URL + "https://ftp.gnu.org/gnu/readline/readline-6.3.tar.gz" + SHA1 + 017b92dc7fd4e636a2b5c9265a77ccc05798c9e1 +) + +hunter_configuration_types(readline CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) +hunter_cmake_args( + readline + CMAKE_ARGS + DEPENDS_ON_PACKAGES=ncursesw +) +hunter_cacheable(readline) +hunter_download( + PACKAGE_NAME readline +) + diff --git a/cmake/projects/recastnavigation/hunter.cmake b/cmake/projects/recastnavigation/hunter.cmake new file mode 100644 index 000000000..5b0ac76c1 --- /dev/null +++ b/cmake/projects/recastnavigation/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + recastnavigation + VERSION + 1.4-p0 + URL + "https://github.com/hunter-packages/recastnavigation/archive/v1.4-p0.tar.gz" + SHA1 + fbbd0387e3e46e4486c8848b9582915eb4cf1084 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(recastnavigation) +hunter_download(PACKAGE_NAME recastnavigation) diff --git a/cmake/projects/rocksdb/hunter.cmake b/cmake/projects/rocksdb/hunter.cmake new file mode 100644 index 000000000..23f43c8f1 --- /dev/null +++ b/cmake/projects/rocksdb/hunter.cmake @@ -0,0 +1,47 @@ +# Copyright (c) 2017, Pawel Bylica +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME rocksdb + VERSION 5.7.2 + URL "https://github.com/facebook/rocksdb/archive/v5.7.2.tar.gz" + SHA1 "f14feee1348bc62b733c6db620a02979477e234f" +) + +hunter_add_version( + PACKAGE_NAME rocksdb + VERSION 5.8.6 + URL "https://github.com/facebook/rocksdb/archive/v5.8.6.tar.gz" + SHA1 "0610c260676e78b03ba48b2d671ba92bdcff2641") + +hunter_add_version( + PACKAGE_NAME rocksdb + VERSION 5.14.2 + URL "https://github.com/facebook/rocksdb/archive/v5.14.2.tar.gz" + SHA1 "376bc537e8c716111214274755f5fe4026e5a354") + + +if(MSVC) + hunter_cmake_args(rocksdb CMAKE_ARGS + WITH_TESTS=OFF + PORTABLE=ON + ROCKSDB_INSTALL_ON_WINDOWS=ON + FAIL_ON_WARNINGS=OFF) +else() + hunter_cmake_args(rocksdb CMAKE_ARGS + WITH_TESTS=OFF + PORTABLE=ON + FAIL_ON_WARNINGS=OFF) +endif() + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(rocksdb) +hunter_download(PACKAGE_NAME rocksdb) diff --git a/cmake/projects/ros/hunter.cmake b/cmake/projects/ros/hunter.cmake new file mode 100644 index 000000000..f188023c5 --- /dev/null +++ b/cmake/projects/ros/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros + VERSION + 1.14.4-p0 + URL + "https://github.com/hunter-packages/ros/archive/v1.14.4-p0.tar.gz" + SHA1 + "9ca792b460313dbe161760713abb24dd28d3b35d" +) + +hunter_add_version( + PACKAGE_NAME + ros + VERSION + 1.14.6-p0 + URL + "https://github.com/hunter-packages/ros/archive/v1.14.6-p0.tar.gz" + SHA1 + "fb44ebcebcc17664ddd6324366beee9ee90d2a2d" +) + +hunter_cmake_args( + ros_message_generation + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros) +hunter_download(PACKAGE_NAME ros) diff --git a/cmake/projects/ros_comm/hunter.cmake b/cmake/projects/ros_comm/hunter.cmake new file mode 100644 index 000000000..c679dfab3 --- /dev/null +++ b/cmake/projects/ros_comm/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + ros_comm + VERSION + 1.14.3-p1 + URL + "https://github.com/hunter-packages/ros_comm/archive/v1.14.3-p1.tar.gz" + SHA1 + 132f614a7ce4d5765ecdba8cc31c7f3504ef046f +) + +hunter_cmake_args( + ros_comm + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_comm) +hunter_download(PACKAGE_NAME ros_comm) diff --git a/cmake/projects/ros_comm_msgs/hunter.cmake b/cmake/projects/ros_comm_msgs/hunter.cmake new file mode 100644 index 000000000..17e47056c --- /dev/null +++ b/cmake/projects/ros_comm_msgs/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_comm_msgs + VERSION + 1.11.2-p0 + URL + "https://github.com/hunter-packages/ros_comm_msgs/archive/v1.11.2-p0.tar.gz" + SHA1 + "e2fdd9878eb68b16672b57e46f4fc1103f84844a" +) + +hunter_cmake_args( + ros_comm_msgs + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_comm_msgs) +hunter_download(PACKAGE_NAME ros_comm_msgs) diff --git a/cmake/projects/ros_common_msgs/hunter.cmake b/cmake/projects/ros_common_msgs/hunter.cmake new file mode 100644 index 000000000..23f563355 --- /dev/null +++ b/cmake/projects/ros_common_msgs/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_common_msgs + VERSION + 1.12.6-p0 + URL + "https://github.com/hunter-packages/ros_common_msgs/archive/v1.12.6-p0.tar.gz" + SHA1 + "9ebf01d2b3e146121c42314acb9629e2322737ae" +) + +hunter_add_version( + PACKAGE_NAME + ros_common_msgs + VERSION + 1.12.7-p0 + URL + "https://github.com/hunter-packages/ros_common_msgs/archive/v1.12.7-p0.tar.gz" + SHA1 + "353c4058cf50d4359a068109dc91a91076b29053" +) + +hunter_cmake_args( + ros_common_msgs + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_common_msgs) +hunter_download(PACKAGE_NAME ros_common_msgs) diff --git a/cmake/projects/ros_console_bridge/hunter.cmake b/cmake/projects/ros_console_bridge/hunter.cmake new file mode 100644 index 000000000..2345f1751 --- /dev/null +++ b/cmake/projects/ros_console_bridge/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_console_bridge + VERSION + 0.4.0-p0 + URL + "https://github.com/hunter-packages/ros_console_bridge/archive/v0.4.0-p0.tar.gz" + SHA1 + "0ed03b76b1289b5399b5dfdd4a4002596239a06f" +) + +hunter_add_version( + PACKAGE_NAME + ros_console_bridge + VERSION + 0.4.3-p0 + URL + "https://github.com/hunter-packages/ros_console_bridge/archive/v0.4.3-p0.tar.gz" + SHA1 + "9c1827626891522b626059d66cd3f32d9e99c931" +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_console_bridge) +hunter_download(PACKAGE_NAME ros_console_bridge) diff --git a/cmake/projects/ros_environment/hunter.cmake b/cmake/projects/ros_environment/hunter.cmake new file mode 100644 index 000000000..bbc606512 --- /dev/null +++ b/cmake/projects/ros_environment/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_environment + VERSION + 1.2.0-p0 + URL + "https://github.com/hunter-packages/ros_environment/archive/v1.2.0-p0.tar.gz" + SHA1 + "01068d113b6517496027a01ca91c85030ae8638f" +) + +hunter_add_version( + PACKAGE_NAME + ros_environment + VERSION + 1.2.1-p0 + URL + "https://github.com/hunter-packages/ros_environment/archive/v1.2.1-p0.tar.gz" + SHA1 + "bbc8d15550fce1478748fadb9170d3a3e5e49460" +) + +hunter_cmake_args( + ros_environment + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_environment) +hunter_download(PACKAGE_NAME ros_environment) diff --git a/cmake/projects/ros_gencpp/hunter.cmake b/cmake/projects/ros_gencpp/hunter.cmake new file mode 100644 index 000000000..1611699ab --- /dev/null +++ b/cmake/projects/ros_gencpp/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_gencpp + VERSION + 0.6.0-p0 + URL + "https://github.com/hunter-packages/ros_gencpp/archive/v0.6.0-p0.tar.gz" + SHA1 + "90c7728fae3f69c8072a9611b9ec1f92b3254bd1" +) + +hunter_add_version( + PACKAGE_NAME + ros_gencpp + VERSION + 0.6.2-p0 + URL + "https://github.com/hunter-packages/ros_gencpp/archive/v0.6.2-p0.tar.gz" + SHA1 + "be49ad6ad32cd8879fdd418fe2cc0c10db9a7d45" +) + +hunter_cmake_args( + ros_gencpp + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_gencpp) +hunter_download(PACKAGE_NAME ros_gencpp) diff --git a/cmake/projects/ros_geneus/hunter.cmake b/cmake/projects/ros_geneus/hunter.cmake new file mode 100644 index 000000000..d22717ac5 --- /dev/null +++ b/cmake/projects/ros_geneus/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_geneus + VERSION + 2.2.6-p0 + URL + "https://github.com/hunter-packages/ros_geneus/archive/v2.2.6-p0.tar.gz" + SHA1 + "938a53b42aefca1a1d80384bc5f43ba83e4eed88" +) + +hunter_cmake_args( + ros_geneus + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_geneus) +hunter_download(PACKAGE_NAME ros_geneus) diff --git a/cmake/projects/ros_genlisp/hunter.cmake b/cmake/projects/ros_genlisp/hunter.cmake new file mode 100644 index 000000000..d77c84090 --- /dev/null +++ b/cmake/projects/ros_genlisp/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_genlisp + VERSION + 0.4.16-p0 + URL + "https://github.com/hunter-packages/ros_genlisp/archive/v0.4.16-p0.tar.gz" + SHA1 + "5077d8b5cf48f4224fc13659eccd5d7b89062609" +) + +hunter_cmake_args( + ros_genlisp + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_genlisp) +hunter_download(PACKAGE_NAME ros_genlisp) diff --git a/cmake/projects/ros_genmsg/hunter.cmake b/cmake/projects/ros_genmsg/hunter.cmake new file mode 100644 index 000000000..d86145c8d --- /dev/null +++ b/cmake/projects/ros_genmsg/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_genmsg + VERSION + 0.5.10-p0 + URL + "https://github.com/hunter-packages/ros_genmsg/archive/v0.5.10-p0.tar.gz" + SHA1 + "3003f752c6b9d5a6c5771dd1448b61011cfcc63d" +) + +hunter_add_version( + PACKAGE_NAME + ros_genmsg + VERSION + 0.5.12-p0 + URL + "https://github.com/hunter-packages/ros_genmsg/archive/v0.5.12-p0.tar.gz" + SHA1 + "e4009ea247bfb3683700f0e3097fc1b9a884a378" +) + +hunter_cmake_args( + ros_genmsg + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_genmsg) +hunter_download(PACKAGE_NAME ros_genmsg) diff --git a/cmake/projects/ros_gennodejs/hunter.cmake b/cmake/projects/ros_gennodejs/hunter.cmake new file mode 100644 index 000000000..1c0e33abc --- /dev/null +++ b/cmake/projects/ros_gennodejs/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_gennodejs + VERSION + 2.0.1-p0 + URL + "https://github.com/hunter-packages/ros_gennodejs/archive/v2.0.1-p0.tar.gz" + SHA1 + "b8e6744d0aabd8422d4e367044093d8a3c122c50" +) + +hunter_cmake_args( + ros_gennodejs + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_gennodejs) +hunter_download(PACKAGE_NAME ros_gennodejs) diff --git a/cmake/projects/ros_genpy/hunter.cmake b/cmake/projects/ros_genpy/hunter.cmake new file mode 100644 index 000000000..1fc530f81 --- /dev/null +++ b/cmake/projects/ros_genpy/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_genpy + VERSION + 0.6.7-p0 + URL + "https://github.com/hunter-packages/ros_genpy/archive/v0.6.7-p0.tar.gz" + SHA1 + "338e73155207774e6775cb6ed233cdced1606c16" +) + +hunter_add_version( + PACKAGE_NAME + ros_genpy + VERSION + 0.6.8-p0 + URL + "https://github.com/hunter-packages/ros_genpy/archive/v0.6.8-p0.tar.gz" + SHA1 + "a3bdd772aea7e621ff72ad0d1e4400eb46e03f39" +) + +hunter_cmake_args( + ros_genpy + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_genpy) +hunter_download(PACKAGE_NAME ros_genpy) diff --git a/cmake/projects/ros_message_generation/hunter.cmake b/cmake/projects/ros_message_generation/hunter.cmake new file mode 100644 index 000000000..86d4d97a0 --- /dev/null +++ b/cmake/projects/ros_message_generation/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_message_generation + VERSION + 0.4.0-p0 + URL + "https://github.com/hunter-packages/ros_message_generation/archive/v0.4.0-p0.tar.gz" + SHA1 + "39b034628b13dbf1c7b601a9b2f8d768f776bf65" +) + +hunter_cmake_args( + ros_message_generation + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_message_generation) +hunter_download(PACKAGE_NAME ros_message_generation) diff --git a/cmake/projects/ros_message_runtime/hunter.cmake b/cmake/projects/ros_message_runtime/hunter.cmake new file mode 100644 index 000000000..92af1f060 --- /dev/null +++ b/cmake/projects/ros_message_runtime/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_message_runtime + VERSION + 0.4.12-p0 + URL + "https://github.com/hunter-packages/ros_message_runtime/archive/v0.4.12-p0.tar.gz" + SHA1 + "54be9c1294b298388fc975fae73d5d155ca7e290" +) + +hunter_cmake_args( + ros_message_runtime + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_message_runtime) +hunter_download(PACKAGE_NAME ros_message_runtime) diff --git a/cmake/projects/ros_std_msgs/hunter.cmake b/cmake/projects/ros_std_msgs/hunter.cmake new file mode 100644 index 000000000..e73b66633 --- /dev/null +++ b/cmake/projects/ros_std_msgs/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ros_std_msgs + VERSION + 0.5.11-p1 + URL + "https://github.com/hunter-packages/ros_std_msgs/archive/v0.5.11-p1.tar.gz" + SHA1 + "04ad9f0e155b27870c7ad2293ace496523f2e960" +) + +hunter_add_version( + PACKAGE_NAME + ros_std_msgs + VERSION + 0.5.12-p0 + URL + "https://github.com/hunter-packages/ros_std_msgs/archive/v0.5.12-p0.tar.gz" + SHA1 + "68f90e7d9611da0d18f3aab520d76b03e685e5a0" +) + +hunter_cmake_args( + ros_std_msgs + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(ros_std_msgs) +hunter_download(PACKAGE_NAME ros_std_msgs) diff --git a/cmake/projects/rosconsole/hunter.cmake b/cmake/projects/rosconsole/hunter.cmake new file mode 100644 index 000000000..90484d075 --- /dev/null +++ b/cmake/projects/rosconsole/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + rosconsole + VERSION + 1.13.10-p0 + URL + "https://github.com/hunter-packages/rosconsole/archive/v1.13.10-p0.tar.gz" + SHA1 + 293826e85d2f22677ea3a738c0d1d28ca18334ca +) + +hunter_cmake_args( + rosconsole + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(rosconsole) +hunter_download(PACKAGE_NAME rosconsole) diff --git a/cmake/projects/roscpp_core/hunter.cmake b/cmake/projects/roscpp_core/hunter.cmake new file mode 100644 index 000000000..3548acb2e --- /dev/null +++ b/cmake/projects/roscpp_core/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + roscpp_core + VERSION + 0.6.9-p0 + URL + "https://github.com/hunter-packages/roscpp_core/archive/v0.6.9-p0.tar.gz" + SHA1 + "22a95f07bc397c188eba1b578ddbbe5ae114c82c" +) + +hunter_add_version( + PACKAGE_NAME + roscpp_core + VERSION + 0.6.12-p0 + URL + "https://github.com/hunter-packages/roscpp_core/archive/v0.6.12-p0.tar.gz" + SHA1 + "1d45d6ddc003f81a8390d618a471842383fd2047" +) + +hunter_cmake_args( + roscpp_core + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(roscpp_core) +hunter_download(PACKAGE_NAME roscpp_core) diff --git a/cmake/projects/rospack/hunter.cmake b/cmake/projects/rospack/hunter.cmake new file mode 100644 index 000000000..7a3098c3d --- /dev/null +++ b/cmake/projects/rospack/hunter.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Lukas Solanka +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + rospack + VERSION + 2.5.0-p0 + URL + "https://github.com/hunter-packages/rospack/archive/v2.5.0-p0.tar.gz" + SHA1 + "3ed739a889b0a17f3ece52b7910e221c1f002de9" +) + +hunter_add_version( + PACKAGE_NAME + rospack + VERSION + 2.5.3-p0 + URL + "https://github.com/hunter-packages/rospack/archive/v2.5.3-p0.tar.gz" + SHA1 + "6f233779d0540a45dfe6f88b25fd740d03db9ade" +) + +hunter_cmake_args( + rospack + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(rospack) +hunter_download(PACKAGE_NAME rospack) diff --git a/cmake/projects/s3/hunter.cmake b/cmake/projects/s3/hunter.cmake new file mode 100644 index 000000000..0efd7b2a0 --- /dev/null +++ b/cmake/projects/s3/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + s3 + VERSION + 0.0.0-287e4be-p0 + URL + "https://github.com/hunter-packages/libs3/archive/v0.0.0-287e4be-p0.tar.gz" + SHA1 + da8fae10bcda3126b0847b2a255e62435afc313e +) + +hunter_add_version( + PACKAGE_NAME + s3 + VERSION + 0.0.0-287e4be-p1 + URL + "https://github.com/hunter-packages/libs3/archive/v0.0.0-287e4be-p1.tar.gz" + SHA1 + 908d859fcde3424ee5e3226288d2604c2419d996 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(s3) +hunter_download(PACKAGE_NAME s3) diff --git a/cmake/projects/sds/hunter.cmake b/cmake/projects/sds/hunter.cmake new file mode 100644 index 000000000..f027d783c --- /dev/null +++ b/cmake/projects/sds/hunter.cmake @@ -0,0 +1,19 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME sds + VERSION "2.0.0" + URL "https://github.com/hunter-packages/sds/archive/v2.0.0.tar.gz" + SHA1 "afbfd0c74a4130166e7b18d3f088e38bed7583d3") + +hunter_cmake_args(sds CMAKE_ARGS BUILD_TESTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(sds) +hunter_download(PACKAGE_NAME sds) diff --git a/cmake/projects/sentencepiece/hunter.cmake b/cmake/projects/sentencepiece/hunter.cmake new file mode 100644 index 000000000..6cc74fe08 --- /dev/null +++ b/cmake/projects/sentencepiece/hunter.cmake @@ -0,0 +1,47 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + sentencepiece + VERSION + 0.1.8-p1 + URL + "https://github.com/hunter-packages/sentencepiece/archive/v0.1.8-p1.tar.gz" + SHA1 + 00e5a16ce6af6a4148cd9541c7ff26b9d5e58972 +) + +set(_hunter_spm_cmake_args "") +if(IOS) + list( + APPEND + _hunter_spm_cmake_args + SPM_NO_THREADLOCAL=YES + ) +endif() + +list( + APPEND + _hunter_spm_cmake_args + SPM_USE_BUILTIN_PROTOBUF=OFF + SPM_ENABLE_SHARED=OFF +) + +hunter_cmake_args( + sentencepiece + CMAKE_ARGS + ${_hunter_spm_cmake_args} +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(sentencepiece) +hunter_download(PACKAGE_NAME sentencepiece) diff --git a/cmake/projects/shaka_player_embedded/hunter.cmake b/cmake/projects/shaka_player_embedded/hunter.cmake new file mode 100644 index 000000000..94af01409 --- /dev/null +++ b/cmake/projects/shaka_player_embedded/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + shaka_player_embedded + VERSION + 0.1.0-beta-p0 + URL + "https://github.com/hunter-packages/shaka-player-embedded/archive/v0.1.0-beta-p0.tar.gz" + SHA1 + a0d991550e12ba8e55c3731b250d7100e637b39f +) + +hunter_add_version( + PACKAGE_NAME + shaka_player_embedded + VERSION + 0.1.0-beta-p1 + URL + "https://github.com/hunter-packages/shaka-player-embedded/archive/v0.1.0-beta-p1.tar.gz" + SHA1 + 012e02170e2ce43165909de0ee4b264fd72d6727 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(shaka_player_embedded) +hunter_download(PACKAGE_NAME shaka_player_embedded) diff --git a/cmake/projects/sleef/hunter.cmake b/cmake/projects/sleef/hunter.cmake new file mode 100644 index 000000000..b68d75d46 --- /dev/null +++ b/cmake/projects/sleef/hunter.cmake @@ -0,0 +1,27 @@ +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + sleef + VERSION + "3.3.1-p1" + URL + "https://github.com/hunter-packages/sleef/archive/v3.3.1-p1.tar.gz" + SHA1 + f6b40d51d72dc32ef7124b3564c334da5122d9c4 +) + +hunter_cmake_args( + sleef + CMAKE_ARGS + BUILD_GNUABI_LIBS=OFF + BUILD_TESTS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(sleef) +hunter_download(PACKAGE_NAME sleef) diff --git a/cmake/projects/soil/hunter.cmake b/cmake/projects/soil/hunter.cmake new file mode 100644 index 000000000..347412da4 --- /dev/null +++ b/cmake/projects/soil/hunter.cmake @@ -0,0 +1,19 @@ +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + soil + VERSION + 1.0.4 + URL + "https://github.com/frequem/Simple-OpenGL-Image-Library/archive/v1.0.4.tar.gz" + SHA1 + b973e0c0ebf461abd897eb2c2dbf5590a01ef7a4 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(soil) +hunter_download(PACKAGE_NAME soil) diff --git a/cmake/projects/sources_for_android_sdk_packer/hunter.cmake b/cmake/projects/sources_for_android_sdk_packer/hunter.cmake new file mode 100644 index 000000000..c28ad5780 --- /dev/null +++ b/cmake/projects/sources_for_android_sdk_packer/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + sources_for_android_sdk_packer + VERSION + 1.0.0 + URL + "https://github.com/hunter-packages/sources_for_android_sdk_packer/archive/v1.0.0.tar.gz" + SHA1 + 161c2f0952874f6850478446660990d8ca33f667 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(sources_for_android_sdk_packer) +hunter_download(PACKAGE_NAME sources_for_android_sdk_packer) diff --git a/cmake/projects/spirv-cross/hunter.cmake b/cmake/projects/spirv-cross/hunter.cmake new file mode 100644 index 000000000..fefb2bfac --- /dev/null +++ b/cmake/projects/spirv-cross/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + spirv-cross + VERSION + 20190220 + URL + "https://github.com/KhronosGroup/SPIRV-Cross/archive/2019-02-20.tar.gz" + SHA1 + 16a27e770f5774e2c354b182af928d876161cae7 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(spirv-cross) +hunter_download(PACKAGE_NAME spirv-cross) diff --git a/cmake/projects/sqlite3/hunter.cmake b/cmake/projects/sqlite3/hunter.cmake new file mode 100644 index 000000000..b1915f188 --- /dev/null +++ b/cmake/projects/sqlite3/hunter.cmake @@ -0,0 +1,73 @@ +# Copyright (c) 2015, Ruslan Baratov, Alexandre Pretyman +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + sqlite3 + VERSION + 3.21.0-p1 + URL + "https://github.com/hunter-packages/sqlite3/archive/v3.21.0-p1.tar.gz" + SHA1 + 5e2761ac6f94410da58d2cd00e64bda84f1a01aa +) + +hunter_add_version( + PACKAGE_NAME + sqlite3 + VERSION + 3.21.0-p2 + URL + "https://github.com/hunter-packages/sqlite3/archive/v3.21.0-p2.tar.gz" + SHA1 + 5742f5fcc0f84d87fcde746f66eadbbfd0dd0e15 +) + +hunter_add_version( + PACKAGE_NAME + sqlite3 + VERSION + 3.24.0-p0 + URL + "https://github.com/hunter-packages/sqlite3/archive/v3.24.0-p0.tar.gz" + SHA1 + e3f5b35543ee42afe2f89d0e1706d1b0ab66369e +) + +hunter_add_version( + PACKAGE_NAME + sqlite3 + VERSION + 3.24.0-p1 + URL + "https://github.com/hunter-packages/sqlite3/archive/v3.24.0-p1.tar.gz" + SHA1 + 126fa0efc44bd6aa1fe195fb00644b83ec91e5ac +) + +hunter_add_version( + PACKAGE_NAME + sqlite3 + VERSION + 3.27.2-p0 + URL + "https://github.com/hunter-packages/sqlite3/archive/v3.27.2-p0.tar.gz" + SHA1 + e4f2b69b5b9e5fe9797909abb51c1acaba25e4f2 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(sqlite3) +hunter_download( + PACKAGE_NAME sqlite3 + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/pkgconfig/sqlite3.pc" + "lib/libsqlite3.la" +) diff --git a/cmake/projects/sse2neon/hunter.cmake b/cmake/projects/sse2neon/hunter.cmake new file mode 100644 index 000000000..1c872fab3 --- /dev/null +++ b/cmake/projects/sse2neon/hunter.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + sse2neon + VERSION + 1.0.0-p0 + URL + "https://github.com/hunter-packages/sse2neon/archive/v1.0.0-p0.tar.gz" + SHA1 + 1a3104782526ea6aba9e5429dc64414e91b4cf1c +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(sse2neon) +hunter_download(PACKAGE_NAME sse2neon) diff --git a/cmake/projects/stanhull/hunter.cmake b/cmake/projects/stanhull/hunter.cmake new file mode 100644 index 000000000..ac38ec8da --- /dev/null +++ b/cmake/projects/stanhull/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + stanhull + VERSION + 0.0.1 + URL + "https://github.com/hunter-packages/stanhull/archive/v0.0.1.tar.gz" + SHA1 + df0a99f598ba46f7dfa9e017bc043d62828ebc55 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(stanhull) +hunter_download(PACKAGE_NAME stanhull) diff --git a/cmake/projects/state_machine/hunter.cmake b/cmake/projects/state_machine/hunter.cmake new file mode 100644 index 000000000..446a85276 --- /dev/null +++ b/cmake/projects/state_machine/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + state_machine + VERSION + 1.1 + URL + "https://github.com/NukeBird/state_machine/archive/1.1.tar.gz" + SHA1 + 43F37F8D0EF067ED6F853D11F5875A4D83A06756 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(state_machine) +hunter_download(PACKAGE_NAME state_machine) diff --git a/cmake/projects/stb/hunter.cmake b/cmake/projects/stb/hunter.cmake new file mode 100644 index 000000000..90e6b7fa9 --- /dev/null +++ b/cmake/projects/stb/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + stb + VERSION + 0.0.1 + URL + "https://github.com/hunter-packages/stb/archive/v0.0.1.tar.gz" + SHA1 + 270aefc345550c229507b37c35b9d5de7ba3a052 +) + +hunter_add_version( + PACKAGE_NAME + stb + VERSION + 0.0.0-e6afb9c-p0 + URL + "https://github.com/hunter-packages/stb/archive/v0.0.0-e6afb9c-p0.tar.gz" + SHA1 + abc0d6a68c5bfb1efdf40a76c6c9f646e4f722ef +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(stb) +hunter_download(PACKAGE_NAME stb) diff --git a/cmake/projects/stdext-path/hunter.cmake b/cmake/projects/stdext-path/hunter.cmake new file mode 100644 index 000000000..067c88ad7 --- /dev/null +++ b/cmake/projects/stdext-path/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + stdext-path + VERSION + 0.0.1-p0 + URL + "https://github.com/hunter-packages/stdext-path/archive/v0.0.1-p0.tar.gz" + SHA1 + 154e7497854fc8fa6e604d4b351902f69824e110 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(stdext-path) +hunter_download(PACKAGE_NAME stdext-path) diff --git a/cmake/projects/stormlib/hunter.cmake b/cmake/projects/stormlib/hunter.cmake new file mode 100644 index 000000000..cb96b0794 --- /dev/null +++ b/cmake/projects/stormlib/hunter.cmake @@ -0,0 +1,27 @@ +# cmake/projects/Example/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + stormlib + VERSION + "9.21-p1" + URL + "https://github.com/hunter-packages/StormLib/archive/v9.21-p1.tar.gz" + SHA1 + db5b811ef5171b163e9abc4d41f1323fb43882a2 +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +hunter_cacheable(stormlib) +hunter_download(PACKAGE_NAME stormlib) diff --git a/cmake/projects/sugar/hunter.cmake b/cmake/projects/sugar/hunter.cmake new file mode 100644 index 000000000..052da4dfa --- /dev/null +++ b/cmake/projects/sugar/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + sugar + VERSION + "1.3.0" + URL + "https://github.com/ruslo/sugar/archive/v1.3.0.tar.gz" + SHA1 + 155a48bbb588c34afc73dbc6ee87737b8f53f749 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(sugar) +hunter_download(PACKAGE_NAME sugar) diff --git a/cmake/projects/tacopie/hunter.cmake b/cmake/projects/tacopie/hunter.cmake new file mode 100644 index 000000000..944b0f107 --- /dev/null +++ b/cmake/projects/tacopie/hunter.cmake @@ -0,0 +1,42 @@ +# cmake/projects/tacopie/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + tacopie + VERSION + "2.4.0-h1" + URL + "https://github.com/hunter-packages/tacopie/archive/2.4.0-h1.tar.gz" + SHA1 + 5b326dd4e4792e63d9261682205f32944719bed0 +) + +hunter_add_version( + PACKAGE_NAME + tacopie + VERSION + "3.2.0-h1" + URL + "https://github.com/hunter-packages/tacopie/archive/3.2.0-h1.tar.gz" + SHA1 + 04a8953bf69f1fa26b68dd76df4b4baea291ab34 +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +# Download package. +# Two versions of library will be build by default: +# * libtacopie.a +# * libtacopied.a +hunter_cacheable(tacopie) +hunter_download(PACKAGE_NAME tacopie) diff --git a/cmake/projects/taocpp-json/hunter.cmake b/cmake/projects/taocpp-json/hunter.cmake new file mode 100644 index 000000000..c9619c336 --- /dev/null +++ b/cmake/projects/taocpp-json/hunter.cmake @@ -0,0 +1,31 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + taocpp-json + VERSION + 1.0.0-beta.11-e0895587 + URL + "https://github.com/taocpp/json/archive/e08955875acc5853d31aa5ccd4b918726d20847f.zip" + SHA1 + 916357f4325fa15de32ba15f3b78e89d6308b920 +) + +hunter_cmake_args( + taocpp-json + CMAKE_ARGS + TAOCPP_JSON_BUILD_TESTS=OFF + TAOCPP_JSON_BUILD_EXAMPLES=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(taocpp-json) +hunter_download( + PACKAGE_NAME taocpp-json +) diff --git a/cmake/projects/tcl/hunter.cmake b/cmake/projects/tcl/hunter.cmake new file mode 100644 index 000000000..7914652b6 --- /dev/null +++ b/cmake/projects/tcl/hunter.cmake @@ -0,0 +1,23 @@ +include(hunter_add_version) +include(hunter_configuration_types) +include(hunter_pick_scheme) +include(hunter_cacheable) +include(hunter_download) + +hunter_add_version( + PACKAGE_NAME + tcl + VERSION + "core8.6.8" + URL + "https://downloads.sourceforge.net/project/tcl/Tcl/8.6.8/tcl-core8.6.8-src.tar.gz" + SHA1 + e13199c76a7d1eae02f35cc9a20fabded6f815f5 +) + +hunter_configuration_types(tcl CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_tcl_autotools) +hunter_cacheable(tcl) +hunter_download(PACKAGE_NAME tcl + PACKAGE_INTERNAL_DEPS_ID "1" +) diff --git a/cmake/projects/tcl/schemes/url_sha1_tcl_autotools.cmake.in b/cmake/projects/tcl/schemes/url_sha1_tcl_autotools.cmake.in new file mode 100644 index 000000000..8aebfdd68 --- /dev/null +++ b/cmake/projects/tcl/schemes/url_sha1_tcl_autotools.cmake.in @@ -0,0 +1,103 @@ +# Copyright (c) 2013, 2015 Ruslan Baratov, Alexandre Pretyman +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +project(Hunter) + +include("@HUNTER_SELF@/cmake/Hunter") + +include(hunter_user_error) +include(hunter_status_debug) +include(hunter_assert_not_empty_string) +include(hunter_autotools_project) + +hunter_status_debug("Scheme: url_sha1_autotools") + +if("@MSVC@") + hunter_user_error("Autotools scheme not supported with Visual Studio") +endif() + +foreach(dependency ${DEPENDS_ON_PACKAGES}) + hunter_add_package(${dependency}) +endforeach() + +# Check preconditions +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_BUILD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") + +set(cflags) +set(extra_flags) +set(patch_command + ${CMAKE_COMMAND} -E copy "@HUNTER_PACKAGE_SCRIPT_DIR@/configure" "@HUNTER_PACKAGE_SOURCE_DIR@" +) + +if(ANDROID) + set(KERNEL_VERSION 3) # API 14-23 + if (${CMAKE_SYSTEM_VERSION} GREATER_EQUAL "24") + set(KERNEL_VERSION 4) # API 24-x + endif() + configure_file("@HUNTER_PACKAGE_SCRIPT_DIR@/android_uname.in" "@HUNTER_PACKAGE_DOWNLOAD_DIR@/uname" @ONLY) + + list(APPEND cflags "--include android_def.h") + list(APPEND extra_flags "--enable-langinfo=no") + list(APPEND patch_command + COMMAND ${CMAKE_COMMAND} -E copy "@HUNTER_PACKAGE_SCRIPT_DIR@/android_def.h" "@HUNTER_PACKAGE_SOURCE_DIR@" + COMMAND ${CMAKE_COMMAND} -E copy "@HUNTER_PACKAGE_DOWNLOAD_DIR@/uname" "@HUNTER_PACKAGE_SOURCE_DIR@" + ) +elseif(APPLE) + list(APPEND extra_flags "--enable-corefoundation=no") +endif() + +hunter_autotools_project("@HUNTER_EP_NAME@" + HUNTER_SELF + "@HUNTER_SELF@" + URL + @HUNTER_PACKAGE_URL@ + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" + BUILD_DIR + "@HUNTER_PACKAGE_BUILD_DIR@" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + GLOBAL_INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" + PARALLEL_JOBS + "@HUNTER_JOBS_OPTION@" + PACKAGE_CONFIGURATION_TYPES + "@HUNTER_PACKAGE_CONFIGURATION_TYPES@" + CFLAGS + ${cflags} + EXTRA_FLAGS + ${extra_flags} + PATCH_COMMAND + ${patch_command} +) + +string(COMPARE EQUAL "${DEPENDS_ON_PKGCONFIGS}" "" default_pkgconfig) +if(NOT default_pkgconfig) + set(DEPENDS_ON_PACKAGES ${DEPENDS_ON_PKGCONFIGS}) +endif() + +set(PKG_GENERATE_SHARED "${BUILD_SHARED_LIBS}") + +foreach(PKG_CONFIG_MODULE ${PKGCONFIG_EXPORT_TARGETS}) + # Use: + # * DEPENDS_ON_PACKAGES + # * PKG_GENERATE_SHARED + configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/pkgconfig-export-targets.cmake.in" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/cmake/${PKG_CONFIG_MODULE}/${PKG_CONFIG_MODULE}Config.cmake" + @ONLY + ) +endforeach() diff --git a/cmake/projects/tcl/scripts/android_def.h b/cmake/projects/tcl/scripts/android_def.h new file mode 100644 index 000000000..6d5a8e26e --- /dev/null +++ b/cmake/projects/tcl/scripts/android_def.h @@ -0,0 +1,3 @@ +#if __ANDROID_API__ < 21 +#undef HAVE_STRUCT_DIRENT64 +#endif diff --git a/cmake/projects/tcl/scripts/android_uname.in b/cmake/projects/tcl/scripts/android_uname.in new file mode 100755 index 000000000..24b6cc2d3 --- /dev/null +++ b/cmake/projects/tcl/scripts/android_uname.in @@ -0,0 +1,20 @@ +#!/bin/sh + +case $1 in + -m) + echo "@ANDROID_ABI@" + ;; + -n) + echo "@ANDROID_PLATFORM@" + ;; + -p) + echo "@CMAKE_SYSTEM_PROCESSOR@" + ;; + -r) + echo "@KERNEL_VERSION@" + ;; + *) + echo "Linux" + ;; +esac + diff --git a/cmake/projects/tcl/scripts/configure b/cmake/projects/tcl/scripts/configure new file mode 100755 index 000000000..a13732eae --- /dev/null +++ b/cmake/projects/tcl/scripts/configure @@ -0,0 +1,3 @@ +#!/bin/sh + +PATH=".:$PATH" unix/configure "$@" diff --git a/cmake/projects/termcolor/hunter.cmake b/cmake/projects/termcolor/hunter.cmake new file mode 100644 index 000000000..345d11500 --- /dev/null +++ b/cmake/projects/termcolor/hunter.cmake @@ -0,0 +1,26 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_report_broken_package) +include(hunter_status_debug) + +hunter_add_version( + PACKAGE_NAME + termcolor + VERSION + "1.0.0" + URL + "https://github.com/ikalnytskyi/termcolor/archive/v1.0.0.tar.gz" + SHA1 + 3ecab2daf39f118bff2244f51760dfd32ab7a3d1 +) + +hunter_cmake_args(termcolor CMAKE_ARGS ENABLE_TESTING=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(termcolor) +hunter_download(PACKAGE_NAME termcolor) diff --git a/cmake/projects/tf/hunter.cmake b/cmake/projects/tf/hunter.cmake new file mode 100644 index 000000000..0588c5928 --- /dev/null +++ b/cmake/projects/tf/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + tf + VERSION + 1.12.0-p0 + URL + "https://github.com/hunter-packages/tf/archive/v1.12.0-p0.tar.gz" + SHA1 + 349b34bc9fe31e2f372d52e8b0b03002e229cc2c +) + +hunter_cmake_args( + tf + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(tf) +hunter_download(PACKAGE_NAME tf) diff --git a/cmake/projects/tf2/hunter.cmake b/cmake/projects/tf2/hunter.cmake new file mode 100644 index 000000000..a703fb002 --- /dev/null +++ b/cmake/projects/tf2/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + tf2 + VERSION + 0.6.5-p0 + URL + "https://github.com/hunter-packages/tf2/archive/v0.6.5-p0.tar.gz" + SHA1 + ac8e28968074c6c386be8ecd2ac5ece29f5b0e06 +) + +hunter_cmake_args( + tf2 + CMAKE_ARGS + CATKIN_ENABLE_TESTING:BOOL=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(tf2) +hunter_download(PACKAGE_NAME tf2) diff --git a/cmake/projects/thrift/hunter.cmake b/cmake/projects/thrift/hunter.cmake new file mode 100644 index 000000000..d7f82a0fd --- /dev/null +++ b/cmake/projects/thrift/hunter.cmake @@ -0,0 +1,76 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME thrift + VERSION "0.12.0-p0" + URL "https://github.com/hunter-packages/thrift/archive/v0.12.0-p0.tar.gz" + SHA1 "dafb78da4a6f711819a1962c883b64272a34364c") + +hunter_add_version( + PACKAGE_NAME thrift + VERSION "0.11.0-p0" + URL "https://github.com/hunter-packages/thrift/archive/v0.11.0-p0.tar.gz" + SHA1 "1dff5a2a26de3bd9d4bc8c68db09215c95874001") + +hunter_add_version( + PACKAGE_NAME thrift + VERSION "0.10.0" + URL "https://github.com/hunter-packages/thrift/archive/v0.10.0-p0.tar.gz" + SHA1 "e346fd04d2228e4d08df363b4f260d92d12e7b67") + +hunter_add_version( + PACKAGE_NAME thrift + VERSION "0.10.0-p1" + URL "https://github.com/hunter-packages/thrift/archive/v0.10.0-p1.tar.gz" + SHA1 "7ac349820b9abe5d613f32474e4e1efb41d2b536") + +hunter_add_version( + PACKAGE_NAME thrift + VERSION "0.10.0-p2" + URL "https://github.com/hunter-packages/thrift/archive/v0.10.0-p2.tar.gz" + SHA1 "9060fe039f57ea11d1143299b456ff98d4cc56c2") + +hunter_add_version( + PACKAGE_NAME thrift + VERSION "0.9.2" + URL "https://github.com/hunter-packages/thrift/archive/v0.9.2-p0.tar.gz" + SHA1 "a53f54ca03e4535b45f74bb71b07f82e0dda6640") + +hunter_add_version( + PACKAGE_NAME thrift + VERSION "0.9.2-p1" + URL "https://github.com/hunter-packages/thrift/archive/v0.9.2-p1.tar.gz" + SHA1 "b097d5df29681d57c2b75ecfc4400b5ab28252ba") + +hunter_add_version( + PACKAGE_NAME thrift + VERSION "0.9.2-p2" + URL "https://github.com/hunter-packages/thrift/archive/v0.9.2-p2.tar.gz" + SHA1 "0dba938473a718a547b0f21ad3bd6eda2a2574ac") + +hunter_cmake_args(thrift CMAKE_ARGS + BUILD_TESTING=OFF + BUILD_TUTORIALS=OFF + BUILD_COMPILER=OFF + BUILD_C_GLIB=OFF + BUILD_CPP=ON + BUILD_HASKELL=OFF + BUILD_JAVA=OFF + BUILD_PYTHON=OFF + WITH_QT4=OFF + WITH_QT5=OFF + WITH_SHARED_LIB=OFF + WITH_PLUGIN=OFF + WITH_LIBEVENT=OFF + WITH_OPENSSL=OFF + WITH_ZLIB=OFF) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(thrift) +hunter_download(PACKAGE_NAME thrift) diff --git a/cmake/projects/tinyxml2/hunter.cmake b/cmake/projects/tinyxml2/hunter.cmake new file mode 100755 index 000000000..26fa16f1d --- /dev/null +++ b/cmake/projects/tinyxml2/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2014-2015, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + tinyxml2 + VERSION + "6.2.0-p1" + URL + "https://github.com/hunter-packages/tinyxml2/archive/v6.2.0-p1.tar.gz" + SHA1 + "a457140cf6d889d71280433127eaac89cf04c94a" +) + +hunter_cmake_args( + tinyxml2 + CMAKE_ARGS + BUILD_TESTING:BOOL=false +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(tinyxml2) +hunter_download(PACKAGE_NAME tinyxml2) diff --git a/cmake/projects/tmxparser/hunter.cmake b/cmake/projects/tmxparser/hunter.cmake new file mode 100644 index 000000000..16fea83fe --- /dev/null +++ b/cmake/projects/tmxparser/hunter.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + tmxparser + VERSION + 2.1.0-ab4125b-p1 + URL + "https://github.com/hunter-packages/tmxparser/archive/v2.1.0-ab4125b-p1.tar.gz" + SHA1 + 2f8cb2fba7b4241fbadc54f2f1928f72fb84cade +) + +hunter_cmake_args( + tmxparser + CMAKE_ARGS + USE_MINIZ=OFF + BUILD_TINYXML2=OFF + BUILD_TESTS=OFF + BUILD_DOCS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(tmxparser) +hunter_download(PACKAGE_NAME tmxparser) diff --git a/cmake/projects/toluapp/hunter.cmake b/cmake/projects/toluapp/hunter.cmake new file mode 100644 index 000000000..8f4724f02 --- /dev/null +++ b/cmake/projects/toluapp/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + toluapp + VERSION + 1.0.93-p0 + URL + "https://github.com/hunter-packages/toluapp/archive/v1.0.93-p0.tar.gz" + SHA1 + 851dabf207286e232c7e9eb1c92c7e62314c0202 +) + +hunter_add_version( + PACKAGE_NAME + toluapp + VERSION + 1.0.93-p1 + URL + "https://github.com/hunter-packages/toluapp/archive/v1.0.93-p1.tar.gz" + SHA1 + 39429ce1b90ad12ed34aa366db587514a96c0c9d +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(toluapp) +hunter_download(PACKAGE_NAME toluapp) diff --git a/cmake/projects/tomcrypt/hunter.cmake b/cmake/projects/tomcrypt/hunter.cmake new file mode 100644 index 000000000..8b29b7f1f --- /dev/null +++ b/cmake/projects/tomcrypt/hunter.cmake @@ -0,0 +1,58 @@ +# cmake/projects/Example/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + tomcrypt + VERSION + "1.17-p1" + URL + "https://github.com/hunter-packages/libtomcrypt/archive/1.17-p1.tar.gz" + SHA1 + 3c9c61ee441b77517525528f5c191fa19801fd30 +) + +hunter_add_version( + PACKAGE_NAME + tomcrypt + VERSION + "1.17-p2" + URL + "https://github.com/hunter-packages/libtomcrypt/archive/1.17-p2.tar.gz" + SHA1 + 90a3796bddd319fe12529d4b58e2ab23c15b7f1b +) + +hunter_add_version( + PACKAGE_NAME + tomcrypt + VERSION + "1.17-p3" + URL + "https://github.com/hunter-packages/libtomcrypt/archive/1.17-p3.tar.gz" + SHA1 + 69b882eff5bf69a5a4e0e9169cc9b9c0ea5b9d71 +) +hunter_add_version( + PACKAGE_NAME + tomcrypt + VERSION + "1.18.2-p1" + URL + "https://github.com/hunter-packages/libtomcrypt/archive/v1.18.2-p1.tar.gz" + SHA1 + 15a37f1bb33b8dd0d2c568c2cec32966def681ef +) +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +hunter_cacheable(tomcrypt) +hunter_download(PACKAGE_NAME tomcrypt) diff --git a/cmake/projects/tommath/hunter.cmake b/cmake/projects/tommath/hunter.cmake new file mode 100644 index 000000000..ddbd04d61 --- /dev/null +++ b/cmake/projects/tommath/hunter.cmake @@ -0,0 +1,36 @@ +# cmake/projects/Example/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + tommath + VERSION + "1.0-p2" + URL + "https://github.com/hunter-packages/libtommath/archive/v1.0-p2.tar.gz" + SHA1 + 733e4644a0b01260830a402b457ca82064fe30cd +) +hunter_add_version( + PACKAGE_NAME + tommath + VERSION + "1.0.1-p0" + URL + "https://github.com/hunter-packages/libtommath/archive/v1.0.1-p0.tar.gz" + SHA1 + 6270ff3c125d0c513aeb10f62ef25d4eb341af37 +) +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +hunter_cacheable(tommath) +hunter_download(PACKAGE_NAME tommath) diff --git a/cmake/projects/tvm/hunter.cmake b/cmake/projects/tvm/hunter.cmake new file mode 100644 index 000000000..0846afbec --- /dev/null +++ b/cmake/projects/tvm/hunter.cmake @@ -0,0 +1,124 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + tvm + VERSION + 0.4-0f053c8-p0 + URL + "https://github.com/hunter-packages/tvm/archive/v0.4-0f053c8-p0.tar.gz" + SHA1 + 1c28b3246e3f5ecb6f985899a5b078a1cb81f85b +) + +hunter_add_version( + PACKAGE_NAME + tvm + VERSION + 0.4-0f053c8-p3 + URL + "https://github.com/hunter-packages/tvm/archive/v0.4-0f053c8-p3.tar.gz" + SHA1 + 7c721091b437ccbe20c706f194b68dbff3acd712 +) + +hunter_add_version( + PACKAGE_NAME + tvm + VERSION + 0.4-0f053c8-p4 + URL + "https://github.com/hunter-packages/tvm/archive/v0.4-0f053c8-p4.tar.gz" + SHA1 + 3cdbec21b8766f7f51abc78d957fe398c70470a5 +) + +hunter_add_version( + PACKAGE_NAME + tvm + VERSION + 0.5-p2 + URL + "https://github.com/hunter-packages/tvm/archive/v0.5-p2.tar.gz" + SHA1 + f050a50ade4e1508621d5138b6edf8b09d9bbcc5 +) + +hunter_add_version( + PACKAGE_NAME + tvm + VERSION + 0.5-p3 + URL + "https://github.com/hunter-packages/tvm/archive/v0.5-p3.tar.gz" + SHA1 + ddc16b4125b7eafbe34b63da50e7622fe961787e +) + +hunter_add_version( + PACKAGE_NAME + tvm + VERSION + 0.5-p4 + URL + "https://github.com/hunter-packages/tvm/archive/v0.5-p4.tar.gz" + SHA1 + f62ace1e9515799de83b29c6325588e48fc76479 +) + +hunter_add_version( + PACKAGE_NAME + tvm + VERSION + 0.5-p5 + URL + "https://github.com/hunter-packages/tvm/archive/v0.5-p5.tar.gz" + SHA1 + bd53c022d5c39f93ad696828479f463cf39706ba +) + +hunter_add_version( + PACKAGE_NAME + tvm + VERSION + 0.5-a4bc50e-p0 + URL + "https://github.com/hunter-packages/tvm/archive/v0.5-a4bc50e-p0.tar.gz" + SHA1 + 0ccc5ef771fcddf8e3ce4534f60917a3c8838fb2 +) + +set( + __hunter_tvm_cmake_args + INSTALL_DEV=ON + INSTALL_NNVM_SOURCES=ON +) + +if(IOS OR ANDROID OR WIN32) + list(APPEND __hunter_tvm_cmake_args TVM_BUILD_RUNTIME_ONLY=ON) +else() + list(APPEND __hunter_tvm_cmake_args USE_GRAPH_RUNTIME_DEBUG=ON USE_LLVM=ON) + + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + list(APPEND __hunter_tvm_cmake_args USE_CUDA=ON) + endif() + + if(APPLE) + list(APPEND __hunter_tvm_cmake_args USE_METAL=ON) + endif() +endif() + +hunter_cmake_args(tvm CMAKE_ARGS ${__hunter_tvm_cmake_args}) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(tvm) +hunter_download(PACKAGE_NAME tvm) diff --git a/cmake/projects/type_safe/hunter.cmake b/cmake/projects/type_safe/hunter.cmake new file mode 100644 index 000000000..375324cd0 --- /dev/null +++ b/cmake/projects/type_safe/hunter.cmake @@ -0,0 +1,81 @@ +# cmake/projects/Example/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + type_safe + VERSION + "0.1" + URL + "https://github.com/hunter-packages/type_safe/archive/v0.1-p.tar.gz" + SHA1 + 57e426af70791485e2a209c602ce9d71e9d52ab7 +) + +hunter_add_version( + PACKAGE_NAME + type_safe + VERSION + "0.1-p2" + URL + "https://github.com/hunter-packages/type_safe/archive/0.1-p2.tar.gz" + SHA1 + 6a1fa6f3926a5d0175890647ff0f419ba4c562f4 +) + +hunter_add_version( + PACKAGE_NAME + type_safe + VERSION + "0.2" + URL + "https://github.com/hunter-packages/type_safe/archive/v0.2-p.tar.gz" + SHA1 + 7f8ba49a04f04d7f121ec358521a5d7a8f5039dd +) + +hunter_add_version( + PACKAGE_NAME + type_safe + VERSION + "0.2-p1" + URL + "https://github.com/hunter-packages/type_safe/archive/v0.2-p1.tar.gz" + SHA1 + d051bec1db05d0623b6e8a6fd2805e70ba914713 +) + +hunter_add_version( + PACKAGE_NAME + type_safe + VERSION + "0.2.1-p1" + URL + "https://github.com/hunter-packages/type_safe/archive/v0.2.1-p1.zip" + SHA1 + 6d583f877cce781ff472f1a0a2d56af68afa5ff1 +) + +hunter_add_version( + PACKAGE_NAME + type_safe + VERSION + "0.2.1-p2" + URL + "https://github.com/hunter-packages/type_safe/archive/v0.2.1-p2.zip" + SHA1 + 09a76b0668cd7bf6c6b590c80e64cb2745a32bb9 +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects +hunter_cacheable(type_safe) +hunter_download(PACKAGE_NAME type_safe) diff --git a/cmake/projects/units/hunter.cmake b/cmake/projects/units/hunter.cmake new file mode 100644 index 000000000..8e06558d1 --- /dev/null +++ b/cmake/projects/units/hunter.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + units + VERSION + 3.0.0.alpha-2 + URL + "https://github.com/nholthaus/units/archive/v3.0.0.alpha-2.tar.gz" + SHA1 + 7e0835b63683836249d533820f59c6c6b36a3230 +) + +hunter_add_version( + PACKAGE_NAME + units + VERSION + 2.3.1 + URL + "https://github.com/nholthaus/units/archive/v2.3.1.tar.gz" + SHA1 + bfb1ee5ba349ec53fc6d664b887d5beb111e938e +) + +hunter_cmake_args( + units + CMAKE_ARGS + BUILD_TESTS=OFF + BUILD_DOCS=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(units) +hunter_download(PACKAGE_NAME units) diff --git a/cmake/projects/utf8/hunter.cmake b/cmake/projects/utf8/hunter.cmake new file mode 100644 index 000000000..3d06c4837 --- /dev/null +++ b/cmake/projects/utf8/hunter.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + utf8 + VERSION + 2.3.4-p1 + URL + "https://github.com/hunter-packages/utf8/archive/v2.3.4-p1.tar.gz" + SHA1 + 438b70b0c6ee3f674e068ebbc19a4d04a5a4ca56 +) + +hunter_add_version( + PACKAGE_NAME + utf8 + VERSION + 2.3.4-p0 + URL + "https://github.com/hunter-packages/utf8/archive/v2.3.4-p0.tar.gz" + SHA1 + 73116d453d4fb2ab4b46159095baeeb319f1ae28 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(utf8) +hunter_download(PACKAGE_NAME utf8) diff --git a/cmake/projects/util_linux/hunter.cmake b/cmake/projects/util_linux/hunter.cmake new file mode 100644 index 000000000..8b239356a --- /dev/null +++ b/cmake/projects/util_linux/hunter.cmake @@ -0,0 +1,49 @@ +# Copyright (c) 2016 Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + util_linux + VERSION + "2.30.1" + URL + "https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-2.30.1.tar.xz" + SHA1 + 030b92cede3d68816d3206645c4262599175ec8a +) + +hunter_configuration_types(util_linux CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) + +hunter_cmake_args( + util_linux + CMAKE_ARGS + EXTRA_FLAGS=--disable-makeinstall-chown + PKGCONFIG_EXPORT_TARGETS=blkid;fdisk;mount;smartcols;uuid +) + +hunter_cacheable(util_linux) +hunter_download( + PACKAGE_NAME util_linux + PACKAGE_INTERNAL_DEPS_ID "2" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/libblkid.la" + "lib/libfdisk.la" + "lib/libmount.la" + "lib/libsmartcols.la" + "lib/libuuid.la" + "lib/pkgconfig/blkid.pc" + "lib/pkgconfig/fdisk.pc" + "lib/pkgconfig/mount.pc" + "lib/pkgconfig/smartcols.pc" + "lib/pkgconfig/uuid.pc" +) diff --git a/cmake/projects/v8/hunter.cmake b/cmake/projects/v8/hunter.cmake new file mode 100644 index 000000000..702421cf3 --- /dev/null +++ b/cmake/projects/v8/hunter.cmake @@ -0,0 +1,57 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + v8 + VERSION + 7.4.98-p1 + URL + "https://github.com/hunter-packages/v8/archive/v7.4.98-p1.tar.gz" + SHA1 + 44805a2abbfc65fa73dbbfaa0383135dae9d05af +) + +hunter_add_version( + PACKAGE_NAME + v8 + VERSION + 7.4.98-p2 + URL + "https://github.com/hunter-packages/v8/archive/v7.4.98-p2.tar.gz" + SHA1 + 7b165ee53bf804ce543880e21954b6d000053571 +) + +hunter_add_version( + PACKAGE_NAME + v8 + VERSION + 7.4.98-p3 + URL + "https://github.com/hunter-packages/v8/archive/v7.4.98-p3.tar.gz" + SHA1 + 397f1fcc8a65c278ac118e1f34e16f8347fb2be5 +) + +hunter_add_version( + PACKAGE_NAME + v8 + VERSION + 3.29.86-90da229-p0 + URL + "https://github.com/hunter-packages/v8/archive/v3.29.86-90da229-p0.tar.gz" + SHA1 + 57efac9bc2e7a774fdf2437c403c8ed9642ec5b7 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(v8) +hunter_download(PACKAGE_NAME v8) diff --git a/cmake/projects/vectorial/hunter.cmake b/cmake/projects/vectorial/hunter.cmake new file mode 100644 index 000000000..2db6d4b7c --- /dev/null +++ b/cmake/projects/vectorial/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + vectorial + VERSION + 0.0.0-ae7dc88-p0 + URL + "https://github.com/hunter-packages/vectorial/archive/v0.0.0-ae7dc88-p0.tar.gz" + SHA1 + e48cfd17f5cfad979b1d0272d3f7012b3ea5dbf2 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(vectorial) +hunter_download(PACKAGE_NAME vectorial) diff --git a/cmake/projects/vorbis/hunter.cmake b/cmake/projects/vorbis/hunter.cmake new file mode 100644 index 000000000..42a0a1314 --- /dev/null +++ b/cmake/projects/vorbis/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + vorbis + VERSION + 1.3.6-p1 + URL + "https://github.com/hunter-packages/vorbis/archive/v1.3.6-p1.tar.gz" + SHA1 + 51cdcdbd872d85f3cf2d5515baf9ccaa13690d1a +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(vorbis) +hunter_download(PACKAGE_NAME vorbis) diff --git a/cmake/projects/wt/hunter.cmake b/cmake/projects/wt/hunter.cmake new file mode 100644 index 000000000..06ef25ab8 --- /dev/null +++ b/cmake/projects/wt/hunter.cmake @@ -0,0 +1,39 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + wt + VERSION + "4.0.4-p0" + URL + "https://github.com/hunter-packages/wt/archive/v4.0.4-p0.tar.gz" + SHA1 + 5bdfd4787fc1733d2696e9dd17d334270941a91f +) + +hunter_cmake_args( + wt + CMAKE_ARGS + BUILD_EXAMPLES=OFF + ENABLE_HARU=OFF + ENABLE_PANGO=OFF + ENABLE_POSTGRES=OFF + ENABLE_FIREBIRD=OFF + ENABLE_QT4=OFF + ENABLE_LIBWTTEST=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) + +# FIXME: https://github.com/ruslo/hunter/pull/1655#issuecomment-446963534 +# hunter_cacheable(wt) + +hunter_download(PACKAGE_NAME wt) diff --git a/cmake/projects/wyrm/hunter.cmake b/cmake/projects/wyrm/hunter.cmake new file mode 100644 index 000000000..d2faeac95 --- /dev/null +++ b/cmake/projects/wyrm/hunter.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cmake_args) + +hunter_add_version( + PACKAGE_NAME + wyrm + VERSION + 0.1.0 + URL + "https://gitlab.obspm.fr/greenflash/wyrm/-/archive/v0.1.0/wyrm-v0.1.0.tar.gz" + SHA1 + 2d2c6b23b3b78f289ff515d76a99bcc8a773213e +) + +hunter_cmake_args( + wyrm + CMAKE_ARGS + WYRM_BUILD_EXAMPLES=OFF + WYRM_BUILD_TESTS=OFF + WYRM_BUILD_DOCUMENTATION=OFF +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(wyrm) +hunter_download(PACKAGE_NAME wyrm) diff --git a/cmake/projects/x264/hunter.cmake b/cmake/projects/x264/hunter.cmake new file mode 100644 index 000000000..bba098573 --- /dev/null +++ b/cmake/projects/x264/hunter.cmake @@ -0,0 +1,41 @@ +# Copyright (c) 2017 Alexandre Pretyman +# All rights reserved. + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + x264 + VERSION + "snapshot-20170420-2245" + URL + "ftp://ftp.videolan.org/pub/x264/snapshots/x264-snapshot-20170420-2245.tar.bz2" + SHA1 + 679b8c4f39f375090bf64e5c80c83303e4ddc37c +) + +hunter_add_version( + PACKAGE_NAME + x264 + VERSION + "snapshot-20190513-2245" + URL + "https://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20190513-2245-stable.tar.bz2" + SHA1 + 2e6faf305fb48a1449bdb61fe219b0c4d9501c36 +) + +hunter_configuration_types(x264 CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_x264) +hunter_cmake_args(x264 CMAKE_ARGS PKGCONFIG_EXPORT_TARGETS=x264) +hunter_cacheable(x264) +hunter_download( + PACKAGE_NAME x264 + PACKAGE_INTERNAL_DEPS_ID "3" + PACKAGE_UNRELOCATABLE_TEXT_FILES "lib/pkgconfig/x264.pc" +) diff --git a/cmake/projects/x264/schemes/url_sha1_x264.cmake.in b/cmake/projects/x264/schemes/url_sha1_x264.cmake.in new file mode 100644 index 000000000..eaba4f6f4 --- /dev/null +++ b/cmake/projects/x264/schemes/url_sha1_x264.cmake.in @@ -0,0 +1,351 @@ +# Copyright (c) 2017 Alexandre Pretyman +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +project(Hunter) + +include(ExternalProject) # ExternalProject_Add + +# Scheme for building x264 libraries only (no programs) + +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_fatal_error) +include(hunter_get_build_flags) +include(hunter_get_toolchain_binaries) +include(hunter_report_broken_package) +include(hunter_status_debug) +include(hunter_status_print) +include(hunter_assert_not_empty_string) + +hunter_status_debug("Scheme: url_sha1_x264") + +# Check preconditions +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_CONFIGURATION_TYPES@") +hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_GLOBAL_SCRIPT_DIR@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +if("@MSVC@") + hunter_user_error("x264 building under MSVC needs to be implemented") +endif() + +# Ideally the running of commands below should be changed in the future to, +# instead of using the shell variables, control the environment through CMake's +# ENV{var} and run the commands through execute_process(...) + +set(default_path "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin") +set(shell_env_path "PATH=@HUNTER_PACKAGE_INSTALL_PREFIX@/bin:${default_path}") + +set(d1 "${root_id}/lib/pkgconfig") +set(d2 "${root_id}/share/pkgconfig") +set(shell_pkg_config_libdir "PKG_CONFIG_LIBDIR=${d1}:${d2}") + +set(clear_vars_shell_script "@HUNTER_GLOBAL_SCRIPT_DIR@/clear-all.sh") + + +hunter_get_toolchain_binaries( + OUT_AR + ar + OUT_AS + as + OUT_LD + ld + OUT_NM + nm + OUT_OBJCOPY + objcopy + OUT_OBJDUMP + objdump + OUT_RANLIB + ranlib + OUT_STRIP + strip + OUT_CPP + cpp + OUT_CC + cc + OUT_CXX + cxx +) + +set(toolchain_binaries) +if(ar) + list(APPEND toolchain_binaries "AR=${ar}") +endif() +if(as) + list(APPEND toolchain_binaries "AS=${as}") +endif() +if(ld) + list(APPEND toolchain_binaries "LD=${ld}") +endif() +if(nm) + list(APPEND toolchain_binaries "NM=${nm}") +endif() +if(objcopy) + list(APPEND toolchain_binaries "OBJCOPY=${objcopy}") +endif() +if(objdump) + list(APPEND toolchain_binaries "OBJDUMP=${objdump}") +endif() +if(ranlib) + list(APPEND toolchain_binaries "RANLIB=${ranlib}") +endif() +if(strip) + list(APPEND toolchain_binaries "STRIP=${strip}") +endif() +if(cpp) + list(APPEND toolchain_binaries "CPP=${cpp}") +endif() +if(cc) + list(APPEND toolchain_binaries "CC=${cc}") +endif() +if(cxx) + list(APPEND toolchain_binaries "CXX=${cxx}") +endif() + +set(shell_env + . + ${clear_vars_shell_script} + && + ${shell_env_path} + ${shell_pkg_config_libdir} +) + +if(toolchain_binaries) + list(APPEND shell_env ${toolchain_binaries}) +endif() + +hunter_get_build_flags( + INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" + PACKAGE_CONFIGURATION_TYPES + "@HUNTER_PACKAGE_CONFIGURATION_TYPES@" + OUT_CPPFLAGS + cppflags + OUT_CFLAGS + cflags + OUT_LDFLAGS + ldflags +) + +set(x264_configure_command "./configure") + +if(CMAKE_CROSSCOMPILING) + set(configure_host) + string(COMPARE NOTEQUAL "${ANDROID}" "" is_android) + string(COMPARE NOTEQUAL "${IPHONEOS_ARCHS}${IPHONESIMULATOR_ARCHS}" "" is_ios) + string(COMPARE NOTEQUAL "${CROSS_COMPILE_TOOLCHAIN_PREFIX}" "" is_cross_compile) + if(is_android) + set(configure_host --host=${CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE}) + elseif(is_ios) + # for iOS the host setting is done below + elseif(is_cross_compile) + set(configure_host --host=${CROSS_COMPILE_TOOLCHAIN_PREFIX}) + endif() + + string(COMPARE NOTEQUAL "${configure_host}" "" has_configure_host) + if(has_configure_host) + list(APPEND x264_configure_command ${configure_host}) + endif() +endif() + + +list(APPEND x264_configure_command "--disable-cli") # build only libs + +if(NOT CMAKE_ASM_COMPILER OR DISABLE_ASM) + list(APPEND x264_configure_command "--disable-asm") +endif() + +set(cflags "${cppflags} ${cflags}") +string(STRIP "${cflags}" cflags) + +# Hunter builds static libraries by default +if(BUILD_SHARED_LIBS) + list(APPEND x264_configure_command --enable-shared --disable-static) +else() + list(APPEND x264_configure_command --disable-shared --enable-static) +endif() + + +set(x264_make_command "make") +if("@HUNTER_JOBS_OPTION@") + list(APPEND x264_make_command "-j" "@HUNTER_JOBS_OPTION@") +endif() + +#configure_command set below +set(build_command ${shell_env} ${x264_make_command}) +set(install_command ${shell_env} make install) + +string(COMPARE NOTEQUAL "${IPHONEOS_ARCHS}${IPHONESIMULATOR_ARCHS}" "" is_ios) +if(is_ios) + hunter_status_debug("x264 iOS IPHONEOS_ARCHS: ${IPHONEOS_ARCHS} IPHONESIMULATOR_ARCHS: ${IPHONESIMULATOR_ARCHS}") + if(BUILD_SHARED_LIBS) + hunter_fatal_error("x264: building iOS libraries as shared is not supported") + endif() + set(ios_architectures) + list(APPEND ios_architectures ${IPHONEOS_ARCHS} ${IPHONESIMULATOR_ARCHS}) +endif() + +if(NOT is_ios) + # The code below should be changed to set these flags as ENV{CFLAGS} and + # ENV{LDFLAGS} instead of --extra-* parameters below + # When the are spaces in ${cflags} and ${ldflags}, CMake puts the value + # inside double quotes, and the shell interprets it as a command instead of + # env var, returning error of CFLAGS=... command not found + list(APPEND x264_configure_command "--extra-cflags=${cflags}") + list(APPEND x264_configure_command "--extra-ldflags=${ldflags}") + list(APPEND x264_configure_command "--prefix=@HUNTER_PACKAGE_INSTALL_PREFIX@") + + set(configure_command ${shell_env} ${x264_configure_command}) + ExternalProject_Add( + "@HUNTER_EP_NAME@" + URL + @HUNTER_PACKAGE_URL@ + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + ${configure_command} + BUILD_COMMAND + ${build_command} + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + ${install_command} + ) +else() + set(ios_universal_target "@HUNTER_EP_NAME@-universal") + set(merge_lipo_script "autotools-merge-lipo.cmake") + ExternalProject_Add(${ios_universal_target} + DOWNLOAD_COMMAND + "" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@/universal" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + "" + BUILD_COMMAND + "" + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + ${CMAKE_COMMAND} + -P + "@HUNTER_PACKAGE_SOURCE_DIR@/universal/${merge_lipo_script}" + ) + set(ios_built_arch_roots) + set(multi_arch_install_root "@HUNTER_PACKAGE_BUILD_DIR@/multi-arch") + foreach(ios_architecture ${ios_architectures}) + hunter_status_debug("Autotools: building for iOS architecture ${ios_architecture}") + #clear the conf options + set(is_simulator FALSE) + if(${ios_architecture} STREQUAL "armv7" + OR ${ios_architecture} STREQUAL "armv7s") + set(configure_host "arm-apple-darwin") + elseif(${ios_architecture} STREQUAL "arm64") + set(configure_host "aarch64-apple-darwin") + elseif(${ios_architecture} STREQUAL "i386") + set(configure_host "i386-apple-darwin") + set(is_simulator TRUE) + elseif(${ios_architecture} STREQUAL "x86_64") + set(configure_host "x86_64-apple-darwin") + set(is_simulator TRUE) + else() + hunter_fatal_error("iOS architecture: ${ios_architecture} not supported") + endif() + + set(arch_flags) + # Extra space at the end of the arch_flags is needed below when appending + # to configure_opts, please do not remove! + if(is_simulator) + set(arch_flags "-arch ${ios_architecture} -isysroot ${IPHONESIMULATOR_SDK_ROOT} ") + else() + set(arch_flags "-arch ${ios_architecture} -isysroot ${IPHONEOS_SDK_ROOT} ") + endif() + + # architecture specific source dir + set(arch_source_dir + "@HUNTER_PACKAGE_SOURCE_DIR@/multi-arch-build/${ios_architecture}" + ) + set(arch_target + "${target_name}-${ios_architecture}" + ) + set(arch_install_dir + "${multi_arch_install_root}/${ios_architecture}" + ) + + set(configure_command + ${shell_env} + ${x264_configure_command} + "--host=${configure_host}" + "--extra-cflags=${arch_flags}${cflags}" + "--extra-ldflags=${arch_flags}${ldflags}" + "--prefix=${arch_install_dir}" + ) + ExternalProject_Add(${arch_target} + URL + @HUNTER_PACKAGE_URL@ + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + ${arch_source_dir} + INSTALL_DIR + ${arch_install_dir} + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + ${configure_command} + BUILD_COMMAND + ${build_command} + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + ${install_command} + ) + + list(APPEND ios_built_arch_roots ${arch_install_dir}) + add_dependencies( + "${ios_universal_target}" + "${arch_target}" + ) + endforeach() + + set(HUNTER_PACKAGE_INSTALL_PREFIX "@HUNTER_PACKAGE_INSTALL_PREFIX@") + configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/${merge_lipo_script}.in" + "@HUNTER_PACKAGE_SOURCE_DIR@/universal/${merge_lipo_script}" + @ONLY + ) +endif() + +set(PKG_GENERATE_SHARED "${BUILD_SHARED_LIBS}") + +foreach(PKG_CONFIG_MODULE ${PKGCONFIG_EXPORT_TARGETS}) + configure_file( + "@HUNTER_GLOBAL_SCRIPT_DIR@/pkgconfig-export-targets.cmake.in" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/lib/cmake/${PKG_CONFIG_MODULE}/${PKG_CONFIG_MODULE}Config.cmake" + ) +endforeach() diff --git a/cmake/projects/xi/hunter.cmake b/cmake/projects/xi/hunter.cmake new file mode 100644 index 000000000..98f81f5c4 --- /dev/null +++ b/cmake/projects/xi/hunter.cmake @@ -0,0 +1,52 @@ +# Copyright (c) 2016, Alexandre Pretyman +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_configuration_types) +include(hunter_download) +include(hunter_pick_scheme) + +# http://www.x.org/releases/X11R7.7/src/lib +hunter_add_version( + PACKAGE_NAME + xi + VERSION + "1.6.1" + URL + "https://www.x.org/releases/X11R7.7/src/lib/libXi-1.6.1.tar.bz2" + SHA1 + 4b53b41fdaa3acc86606c696c68d5eed11454612 +) + +hunter_configuration_types(xi CONFIGURATION_TYPES Release) +hunter_pick_scheme(DEFAULT url_sha1_autotools) + +set( + _dependencies + xproto + x11 + xextproto + xext + inputproto +) + +hunter_cmake_args( + xi + CMAKE_ARGS + DEPENDS_ON_PACKAGES=${_dependencies} + PKGCONFIG_EXPORT_TARGETS=xi +) + +hunter_cacheable(xi) +hunter_download( + PACKAGE_NAME xi + PACKAGE_INTERNAL_DEPS_ID "1" + PACKAGE_UNRELOCATABLE_TEXT_FILES + "lib/libXi.la" + "lib/pkgconfig/xi.pc" +) diff --git a/cmake/projects/xxhash/hunter.cmake b/cmake/projects/xxhash/hunter.cmake new file mode 100644 index 000000000..aba3e9fc6 --- /dev/null +++ b/cmake/projects/xxhash/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + xxhash + VERSION + 0.6.5-p0 + URL + "https://github.com/hunter-packages/xxHash/archive/0.6.5-p0.tar.gz" + SHA1 + 7d84575a45360d5c5c075ceb3fc1eb6b334aa5a4 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(xxhash) +hunter_download(PACKAGE_NAME xxhash) diff --git a/cmake/projects/yaml-cpp/hunter.cmake b/cmake/projects/yaml-cpp/hunter.cmake new file mode 100644 index 000000000..47d6aa71a --- /dev/null +++ b/cmake/projects/yaml-cpp/hunter.cmake @@ -0,0 +1,72 @@ +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + yaml-cpp + VERSION + "0.5.3" + URL + "https://github.com/hunter-packages/yaml-cpp/releases/download/release-0.5.3-hunter-p2/release-0.5.3-hunter-p2.tar.gz" + SHA1 + ee1fe3713409de48b203f6b631c1284190d95671 + ) + +hunter_add_version( + PACKAGE_NAME + yaml-cpp + VERSION + "0.5.3-plus-p0" + URL + "https://github.com/hunter-packages/yaml-cpp/archive/release-0.5.3-plus-p0.zip" + SHA1 + 3f612ceea5c983748368b6a543678f3d77e5ecc8 + ) + +hunter_add_version( + PACKAGE_NAME + yaml-cpp + VERSION + "0.5.3-p4" + URL + "https://github.com/hunter-packages/yaml-cpp/archive/v0.5.3-p4.zip" + SHA1 + b8de7495113c6462216ebb6b123f1b71ea761bc9 + ) + +hunter_add_version( + PACKAGE_NAME + yaml-cpp + VERSION + "0.6.2-p0" + URL + "https://github.com/hunter-packages/yaml-cpp/archive/v0.6.2-p0.zip" + SHA1 + d024c6ecd7b2466f134353d99e9a1e08eb9f95c4 + ) + +hunter_add_version( + PACKAGE_NAME + yaml-cpp + VERSION + "0.6.2-0f9a586-p1" + URL + "https://github.com/hunter-packages/yaml-cpp/archive/v0.6.2-0f9a586-p1.zip" + SHA1 + 956C2B5FBF5AA0EB8EF5EF890C0328B3AA357A13 + ) + +hunter_cmake_args( + yaml-cpp + CMAKE_ARGS + YAML_CPP_BUILD_TESTS=OFF + YAML_CPP_BUILD_TOOLS=OFF + ) +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(yaml-cpp) +hunter_download(PACKAGE_NAME yaml-cpp) diff --git a/cmake/projects/zip/hunter.cmake b/cmake/projects/zip/hunter.cmake new file mode 100644 index 000000000..b85535811 --- /dev/null +++ b/cmake/projects/zip/hunter.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_cmake_args) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + zip + VERSION + 0.1.15 + URL + "https://github.com/kuba--/zip/archive/v0.1.15.tar.gz" + SHA1 + f65b4fde71963de6c019413628022d316098c8d1 +) + +hunter_cmake_args( + zip + CMAKE_ARGS + CMAKE_DISABLE_TESTING=ON +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(zip) +hunter_download(PACKAGE_NAME zip) diff --git a/cmake/projects/zookeeper/hunter.cmake b/cmake/projects/zookeeper/hunter.cmake new file mode 100644 index 000000000..fdf935e2e --- /dev/null +++ b/cmake/projects/zookeeper/hunter.cmake @@ -0,0 +1,27 @@ +# cmake/projects/Example/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +# Load used modules +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) +include(hunter_cacheable) + +# List of versions here... +hunter_add_version( + PACKAGE_NAME + zookeeper + VERSION + "3.4.9-p2" + URL + "https://github.com/hunter-packages/zookeeper/archive/3.4.9-p2.tar.gz" + SHA1 + ed8167bdc0eb08b967e091a4503f3373aad5dddc +) + +# Pick a download scheme +hunter_pick_scheme(DEFAULT url_sha1_cmake) # use scheme for cmake projects + +hunter_cacheable(zookeeper) +hunter_download(PACKAGE_NAME zookeeper) diff --git a/cmake/schemes/url_sha1_pip.cmake.in b/cmake/schemes/url_sha1_pip.cmake.in new file mode 100644 index 000000000..4b1028f44 --- /dev/null +++ b/cmake/schemes/url_sha1_pip.cmake.in @@ -0,0 +1,147 @@ +# Copyright (c) 2019 Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) +project(Hunter) + +include(ExternalProject) + +include("@HUNTER_SELF@/cmake/Hunter") + +include(hunter_add_package) +include(hunter_assert_not_empty_string) +include(hunter_status_debug) + +hunter_status_debug("Scheme: url_sha1_pip") + +foreach(dependency ${DEPENDS_ON_PACKAGES}) + hunter_add_package(${dependency}) +endforeach() + +hunter_add_package(hunter_venv) +find_package(hunter_venv CONFIG REQUIRED) + +find_package(Python REQUIRED) +hunter_status_debug("Using Python: ${Python_EXECUTABLE}") +hunter_status_debug("Python_SITELIB: ${Python_SITELIB}") +hunter_status_debug("Root: ${HUNTER_VENV_ROOT}") + +hunter_status_debug("'pip' install suffix: ${HUNTER_VENV_INSTALL_SUFFIX}") + +# Check preconditions +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_LICENSE_DIR@") + +string(COMPARE EQUAL "@HUNTER_PACKAGE_PROTECTED_SOURCES@" "" is_empty) +if(is_empty) + set(http_credentials "") +else() + set( + http_credentials + HTTP_USERNAME "@HUNTER_PACKAGE_HTTP_USERNAME@" + HTTP_PASSWORD "@HUNTER_PACKAGE_HTTP_PASSWORD@" + ) +endif() + +if("@HUNTER_PACKAGE_LOG_BUILD@") + set(log_build 1) +else() + set(log_build 0) +endif() + +if("@HUNTER_PACKAGE_LOG_INSTALL@" OR "@HUNTER_SUPPRESS_LIST_OF_FILES@") + set(log_install 1) +else() + set(log_install 0) +endif() + +# Introduce variables: +# * CMAKE_INSTALL_LIBDIR +# * CMAKE_INSTALL_BINDIR +# * CMAKE_INSTALL_INCLUDEDIR +include(GNUInstallDirs) + +include(CMakePackageConfigHelpers) + +set(PROJECT_NAME "@HUNTER_EP_NAME@") +set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + +set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") +set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") + +# Use variables: +# - PROJECT_NAME +configure_package_config_file( + "@HUNTER_SELF@/cmake/templates/pip_config.cmake.in" + "${project_config}" + INSTALL_DESTINATION "${config_install_dir}" +) + +if(HUNTER_STATUS_DEBUG) + set(pip_verbose "-vvv") +else() + set(pip_verbose "") +endif() + +ExternalProject_Add( + "@HUNTER_EP_NAME@" + URL + @HUNTER_PACKAGE_URL@ + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + ${http_credentials} + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + "@CMAKE_COMMAND@" -E echo "Dummy configure step" + BUILD_COMMAND + "@CMAKE_COMMAND@" + -E + env + --unset=__PYVENV_LAUNCHER__ # macOS problems + ${Python_EXECUTABLE} + -m + pip + install + ${pip_verbose} + --target + "@HUNTER_PACKAGE_INSTALL_PREFIX@/${HUNTER_VENV_INSTALL_SUFFIX}" + --no-cache-dir # Do not touch user's '~/.cache/pip' + --no-deps # Dependencies managed by Hunter + --isolated # Run pip in an isolated mode, ignoring environment variables and user configuration. + "@HUNTER_PACKAGE_SOURCE_DIR@" + INSTALL_COMMAND + "@CMAKE_COMMAND@" + -E + make_directory + "@HUNTER_PACKAGE_INSTALL_PREFIX@/${config_install_dir}" + COMMAND + "@CMAKE_COMMAND@" + -E + copy + "${project_config}" + "@HUNTER_PACKAGE_INSTALL_PREFIX@/${config_install_dir}" + COMMAND + # Copy license files + "@CMAKE_COMMAND@" + "-C@HUNTER_ARGS_FILE@" # for 'HUNTER_INSTALL_LICENSE_FILES' + "-Dsrcdir=@HUNTER_PACKAGE_SOURCE_DIR@" + "-Ddstdir=@HUNTER_PACKAGE_LICENSE_DIR@" + -P + "@HUNTER_SELF@/scripts/try-copy-license.cmake" + LOG_BUILD ${log_build} + LOG_INSTALL ${log_install} +) diff --git a/cmake/schemes/url_sha1_unpack_bin_install.cmake.in b/cmake/schemes/url_sha1_unpack_bin_install.cmake.in new file mode 100644 index 000000000..a80cbe576 --- /dev/null +++ b/cmake/schemes/url_sha1_unpack_bin_install.cmake.in @@ -0,0 +1,50 @@ +# Copyright (c) 2017, Zhuhao Wang +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +project(Hunter) + +include(ExternalProject) # ExternalProject_Add + +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_status_debug) +include(hunter_assert_not_empty_string) + +hunter_status_debug("Scheme: url_sha1_unpack_bin_install") + +# Check preconditions +hunter_assert_not_empty_string("@HUNTER_SELF@") +hunter_assert_not_empty_string("@HUNTER_EP_NAME@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_assert_not_empty_string("@HUNTER_PACKAGE_INSTALL_PREFIX@") +hunter_assert_not_empty_string("@HUNTER_TLS_VERIFY@") + +ExternalProject_Add( + "@HUNTER_EP_NAME@" + URL + "@HUNTER_PACKAGE_URL@" + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" + TLS_VERIFY + "@HUNTER_TLS_VERIFY@" + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" + INSTALL_DIR + "@HUNTER_PACKAGE_INSTALL_PREFIX@" + # not used, just avoid creating Install/ empty directory + CONFIGURE_COMMAND + "" + BUILD_COMMAND + "" + INSTALL_COMMAND + "@CMAKE_COMMAND@" + "-Dfrom=@HUNTER_PACKAGE_SOURCE_DIR@" + "-Dto=@HUNTER_PACKAGE_INSTALL_PREFIX@/bin" + -P "@HUNTER_SELF@/scripts/copy-files.cmake" +) diff --git a/cmake/templates/libxml2Config.cmake.in b/cmake/templates/libxml2Config.cmake.in new file mode 100644 index 000000000..cda4229ea --- /dev/null +++ b/cmake/templates/libxml2Config.cmake.in @@ -0,0 +1,29 @@ +if(HUNTER_ENABLED) + include(hunter_internal_error) + include(hunter_status_debug) +else() + function(hunter_internal_error) + message(FATAL_ERROR ${ARGV}) + endfunction() + + function(hunter_status_debug) + message(${ARGV}) + endfunction() +endif() + +get_filename_component(_install_dir "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE) + +add_library("libxml2::libxml2" STATIC IMPORTED) +set_target_properties(libxml2::libxml2 PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_install_dir}/include/libxml2" + @TARGET_INTERFACE_COMPILE_DEFINITIONS@ +) + +# Get all libxml2Targets-*.cmake files +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(GLOB TARGET_FILES "${_DIR}/libxml2Targets-*.cmake") +foreach(file ${TARGET_FILES}) + include(${file}) +endforeach() + +set(LIBXML2_LIBRARIES libxml2::libxml2) diff --git a/cmake/templates/libxml2Targets.cmake.in b/cmake/templates/libxml2Targets.cmake.in new file mode 100644 index 000000000..6f2bb1f96 --- /dev/null +++ b/cmake/templates/libxml2Targets.cmake.in @@ -0,0 +1,15 @@ +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +get_filename_component(_install_dir "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE) + +set_property(TARGET libxml2::libxml2 APPEND PROPERTY IMPORTED_CONFIGURATIONS @TARGET_CONFIGURATION@) +set_target_properties(libxml2::libxml2 PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_@TARGET_CONFIGURATION@ "C" + IMPORTED_LOCATION_@TARGET_CONFIGURATION@ "${_install_dir}/lib/@TARGET_LIB_FILE@" +) + +set(LIBXML2_LIBRARY_@TARGET_CONFIGURATION@ "${_install_dir}/lib/@TARGET_LIB_FILE@") + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/cmake/templates/pip_config.cmake.in b/cmake/templates/pip_config.cmake.in new file mode 100644 index 000000000..8feb3234e --- /dev/null +++ b/cmake/templates/pip_config.cmake.in @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +find_package(hunter_venv CONFIG REQUIRED) + +check_required_components("@PROJECT_NAME@") diff --git a/docs/creating-new/create.rst b/docs/creating-new/create.rst new file mode 100644 index 000000000..b946279a8 --- /dev/null +++ b/docs/creating-new/create.rst @@ -0,0 +1,18 @@ +.. Copyright (c) 2017, Ruslan Baratov +.. All rights reserved. + +Create package +-------------- + +This is a guide for adding new package to Hunter. We start with the simple +one (CMake based, no dependencies), then cover "hunterization" (CMake based, +depends on other packages). Final is a most complex one (non-CMake packages, +creating custom build scheme). + +.. toctree:: + :maxdepth: 1 + + /creating-new/create/cmake + /creating-new/create/cmake-dependencies + /creating-new/create/autotools + /creating-new/create/custom diff --git a/docs/creating-new/create/autotools.rst b/docs/creating-new/create/autotools.rst new file mode 100644 index 000000000..71c3a9d8f --- /dev/null +++ b/docs/creating-new/create/autotools.rst @@ -0,0 +1,146 @@ +.. spelling:: + + Autotools + autotools + foo + + +Autotools +========= + +Very often, you will come across a package that uses autotools as its build +system and does not support CMake builds. Although Hunter prefers CMake builds +when possible, it does support autotools projects when no CMake build is +available. Here is how to do it. + +.. code-block:: cmake + + # !!! DO NOT PLACE HEADER GUARDS HERE !!! + + include(hunter_add_version) + include(hunter_configuration_types) + include(hunter_pick_scheme) + include(hunter_download) + include(hunter_cacheable) + include(hunter_cmake_args) + + hunter_add_version( + PACKAGE_NAME + foo + VERSION + "1.2.3" + URL + "https://example.com/foo-1.2.3.tar.gz" + SHA1 + da39a3ee5e6b4b0d3255bfef95601890afd80709 + ) + + # More versions... + + # Optional platform customization. + if (ANDROID OR IOS) + hunter_cmake_args( + foo + CMAKE_ARGS + EXTRA_FLAGS=--enable-x + ) + endif() + + hunter_configuration_types(foo CONFIGURATION_TYPES Release) + hunter_pick_scheme(DEFAULT url_sha1_autotools) + hunter_cacheable(foo) + hunter_download(PACKAGE_NAME foo) + +Note that the build may not be cacheable if autotools generation expands +absolute paths. Try using ``hunter_cacheable`` and see if it works. + +Many autotools projects generate pkg-config files. These can be used +to generate a CMake config. For example, consider using the following in your +package's ``hunter.cmake`` file: + +.. code-block:: cmake + + hunter_cmake_args( + foo + CMAKE_ARGS + PKGCONFIG_EXPORT_TARGETS=foo + ) + +In the above example, package ``foo`` generates a file ``foo.pc`` in the +autotools build. Hunter then uses ``foo.pc`` to generate a CMake config file +``fooConfig.cmake``. Now, our dependent project ``Bar`` has a much simpler +``CMakeLists.txt``: + +.. code-block:: cmake + + hunter_add_package(foo) + find_package(foo CONFIG REQUIRED) + add_executable(bar ${BAR_SOURCES}) + target_link_libraries(bar PUBLIC PkgConfig::foo) + +When following this pkg-config practice and attempting to keep ``foo`` +cacheable, you must add this piece of code to your package's ``hunter.cmake``: + +.. code-block:: cmake + + hunter_download(PACKAGE_NAME foo + PACKAGE_INTERNAL_DEPS_ID "1" # Increment for each new pull request + PACKAGE_UNRELOCATABLE_TEXT_FILES + lib/pkgconfig/foo.pc) + +The pkg-config files will probably need to be patched so that they do not point +to the directory they are initially installed into. +``PACKAGE_UNRELOCATABLE_TEXT_FILES`` identifies these files for Hunter to patch. + +If the autotools build does not produce a pkg-config output file, you must +add ``Findfoo.cmake`` place it in the ``cmake/find`` directory so Hunter can +find the package. This script should also provide import targets for dependent +builds, such that linking against ``foo::foo`` pulls in the foo includes and +libraries. In this case, dependent projects will use code similar to the following: + +.. code-block:: cmake + + hunter_add_package(foo) + find_package(foo REQUIRED) + add_executable(bar ${BAR_SOURCES}) + target_link_libraries(bar PUBLIC foo::foo) + +Extra flags for configure +------------------------- + +It is possible to add extra flags for ``./configure`` step both globally +in ``cmake/projects//hunter.cmake``: + +.. code-block:: cmake + + hunter_cmake_args( + foo + CMAKE_ARGS + EXTRA_FLAGS=--enable-x + ) + +and locally in ``cmake/Hunter/config.cmake``: + +.. code-block:: cmake + + hunter_config( + foo + VERSION + ${HUNTER_foo_VERSION} + CMAKE_ARGS + EXTRA_FLAGS=--enable-y + ) + +If you use local approach then any flags from global configuration will be +ignored, i.e. if you want to have both global ``--enable-x`` and local +``--enable-y`` then you have to set them explicitly: + +.. code-block:: cmake + + hunter_config( + foo + VERSION + ${HUNTER_foo_VERSION} + CMAKE_ARGS + EXTRA_FLAGS=--enable-x --enable-y + ) diff --git a/docs/creating-new/create/ci/.travis-NEW.yml b/docs/creating-new/create/ci/.travis-NEW.yml new file mode 100644 index 000000000..4c8bef587 --- /dev/null +++ b/docs/creating-new/create/ci/.travis-NEW.yml @@ -0,0 +1,107 @@ +# OSX/Linux (https://github.com/travis-ci-tester/toolchain-table) + +# Workaround for https://github.com/travis-ci/travis-ci/issues/8363 +language: + - minimal + +# Container-based infrastructure (Linux) +# * https://docs.travis-ci.com/user/migrating-from-legacy/#How-can-I-use-container-based-infrastructure%3F +sudo: + - false + +# Install packages differs for container-based infrastructure +# * https://docs.travis-ci.com/user/migrating-from-legacy/#How-do-I-install-APT-sources-and-packages%3F +addons: + apt: + packages: + - python3-pip + +dist: + - trusty + +env: + global: + - secure: "RXl1cmKQUgB/Lr6CFW82nYDFSyF5tYjG5N3+ZpZZWDbmVvm8Wj634GR1B5JVcLzoWLearGYtqOA2mQcK+vcp04/KMQC7mEEtUWix74wXz9djzUZMYuMz0VvImpqyE8KF8ZVgbQL5XFP1u+nRahLT9qtNX7VFTqgSB2PJ/kDEQQPV+H4lv/tVBv9ptMC4q9Nwev8qFzEPLqQgp6mqb05BBsgrExEbzVrX5kywb23TGcxMe3c6IHf63vCmr8aHAJFVsHHGkV2QhOoJKeMNa1xPJXGE+yf1rAACglTru7IXOlsZ4bym2qLtQRHz+2jHn1i+qQf0V5M+4H/OBkqOpU9AJ/ylF/WK2eBZedxC+4WPvuO/iDnrtNxikzS5avdFS7IMUJrIm9fP0B8efLovEiJaKwo5k1Yj0uw07b1PoyRE5x+ozRzSLzvWXgOIXbZjOM9BzYFfoNJ+dpjilELuxGn85HljeniK89H/d5gtEUPvSMQC/+RuMo420qaGGhy/lR4ivPTZwCqT7VPQ6+2HLz/wAF5S2jFLGjSZIbb/NMmrV6+puIEEicx0mj2eSpgt7cn9UguevnwtT5UoN2G+dZrI6RfUp0CSH8UHdcJtoSCmYVxO5LsRPXyCEFFF54EsfhqjWegYcxLmHqQQUKlJ8lX9dXMRftW7bIldb98PQGud6Fg=" + +matrix: + include: + # Linux { + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=default + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=clang-libstdcxx + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=gcc + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=analyze + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=sanitize-address + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=sanitize-leak + + # FIXME: https://github.com/ruslo/hunter/issues/718#issuecomment-290610583 + # - os: linux + # env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=sanitize-thread + + # } + + # OSX { + - os: osx + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=libcxx + - os: osx + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=osx-10-11 + + # FIXME: iOS is not supported by this package + # * https://travis-ci.org/hunterbox/hunter/jobs/276514722 + # - os: osx + # env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=ios-nocodesign-9-3 + + # } + +install: + # Info about OS + - uname -a + + # Disable autoupdate + # * https://github.com/Homebrew/brew/blob/7d31a70373edae4d8e78d91a4cbc05324bebc3ba/Library/Homebrew/manpages/brew.1.md.erb#L202 + - export HOMEBREW_NO_AUTO_UPDATE=1 + + # Install Python 3 + - if [[ "`uname`" == "Darwin" ]]; then travis_retry brew install python3; fi + + # Install Python package 'requests' + # 'easy_install3' is not installed by 'brew install python3' on OS X 10.9 Maverick + - if [[ "`uname`" == "Darwin" ]]; then pip3 install requests; fi + - if [[ "`uname`" == "Linux" ]]; then travis_retry pip3 install --user requests; fi + + # Install latest Polly toolchains and scripts + - wget https://github.com/ruslo/polly/archive/master.zip + - unzip master.zip + - POLLY_ROOT="`pwd`/polly-master" + - export PATH="${POLLY_ROOT}/bin:${PATH}" + + # Install dependencies (CMake, Android NDK) + - install-ci-dependencies.py + + # Tune locations + - export PATH="`pwd`/_ci/cmake/bin:${PATH}" + + # Installed if toolchain is Android (otherwise directory doesn't exist) + - export ANDROID_NDK_r10e="`pwd`/_ci/android-ndk-r10e" + - export ANDROID_NDK_r11c="`pwd`/_ci/android-ndk-r11c" + - export ANDROID_NDK_r15c="`pwd`/_ci/android-ndk-r15c" + +script: + - python3 ./jenkins.py + +# https://docs.travis-ci.com/user/customizing-the-build/#Whitelisting-or-blacklisting-branches +# Exclude branch 'pkg.template'. Nothing to build there. +branches: + except: + - pkg.template + - /^pr\..*/ + - /^v[0-9]+\.[0-9]+\.[0-9]+$/ diff --git a/docs/creating-new/create/ci/.travis-OLD.yml b/docs/creating-new/create/ci/.travis-OLD.yml new file mode 100644 index 000000000..b63a034e5 --- /dev/null +++ b/docs/creating-new/create/ci/.travis-OLD.yml @@ -0,0 +1,103 @@ +# OSX/Linux (https://github.com/travis-ci-tester/toolchain-table) + +# Workaround for https://github.com/travis-ci/travis-ci/issues/8363 +language: + - minimal + +# Container-based infrastructure (Linux) +# * https://docs.travis-ci.com/user/migrating-from-legacy/#How-can-I-use-container-based-infrastructure%3F +sudo: + - false + +# Install packages differs for container-based infrastructure +# * https://docs.travis-ci.com/user/migrating-from-legacy/#How-do-I-install-APT-sources-and-packages%3F +addons: + apt: + packages: + - python3-pip + +dist: + - trusty + +env: + global: + - secure: "RXl1cmKQUgB/Lr6CFW82nYDFSyF5tYjG5N3+ZpZZWDbmVvm8Wj634GR1B5JVcLzoWLearGYtqOA2mQcK+vcp04/KMQC7mEEtUWix74wXz9djzUZMYuMz0VvImpqyE8KF8ZVgbQL5XFP1u+nRahLT9qtNX7VFTqgSB2PJ/kDEQQPV+H4lv/tVBv9ptMC4q9Nwev8qFzEPLqQgp6mqb05BBsgrExEbzVrX5kywb23TGcxMe3c6IHf63vCmr8aHAJFVsHHGkV2QhOoJKeMNa1xPJXGE+yf1rAACglTru7IXOlsZ4bym2qLtQRHz+2jHn1i+qQf0V5M+4H/OBkqOpU9AJ/ylF/WK2eBZedxC+4WPvuO/iDnrtNxikzS5avdFS7IMUJrIm9fP0B8efLovEiJaKwo5k1Yj0uw07b1PoyRE5x+ozRzSLzvWXgOIXbZjOM9BzYFfoNJ+dpjilELuxGn85HljeniK89H/d5gtEUPvSMQC/+RuMo420qaGGhy/lR4ivPTZwCqT7VPQ6+2HLz/wAF5S2jFLGjSZIbb/NMmrV6+puIEEicx0mj2eSpgt7cn9UguevnwtT5UoN2G+dZrI6RfUp0CSH8UHdcJtoSCmYVxO5LsRPXyCEFFF54EsfhqjWegYcxLmHqQQUKlJ8lX9dXMRftW7bIldb98PQGud6Fg=" + +matrix: + include: + # Linux { + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=default + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=clang-libstdcxx + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=gcc + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=analyze + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=sanitize-address + - os: linux + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=sanitize-leak + + # FIXME: https://github.com/ruslo/hunter/issues/718#issuecomment-290610583 + # - os: linux + # env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=sanitize-thread + + # } + + # OSX { + - os: osx + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=libcxx + - os: osx + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=osx-10-11 + - os: osx + env: PROJECT_DIR=examples/hunter_box_1 TOOLCHAIN=ios-nocodesign-9-3 + # } + +install: + # Info about OS + - uname -a + + # Disable autoupdate + # * https://github.com/Homebrew/brew/blob/7d31a70373edae4d8e78d91a4cbc05324bebc3ba/Library/Homebrew/manpages/brew.1.md.erb#L202 + - export HOMEBREW_NO_AUTO_UPDATE=1 + + # Install Python 3 + - if [[ "`uname`" == "Darwin" ]]; then travis_retry brew install python3; fi + + # Install Python package 'requests' + # 'easy_install3' is not installed by 'brew install python3' on OS X 10.9 Maverick + - if [[ "`uname`" == "Darwin" ]]; then pip3 install requests; fi + - if [[ "`uname`" == "Linux" ]]; then travis_retry pip3 install --user requests; fi + + # Install latest Polly toolchains and scripts + - wget https://github.com/ruslo/polly/archive/master.zip + - unzip master.zip + - POLLY_ROOT="`pwd`/polly-master" + - export PATH="${POLLY_ROOT}/bin:${PATH}" + + # Install dependencies (CMake, Android NDK) + - install-ci-dependencies.py + + # Tune locations + - export PATH="`pwd`/_ci/cmake/bin:${PATH}" + + # Installed if toolchain is Android (otherwise directory doesn't exist) + - export ANDROID_NDK_r10e="`pwd`/_ci/android-ndk-r10e" + - export ANDROID_NDK_r11c="`pwd`/_ci/android-ndk-r11c" + - export ANDROID_NDK_r15c="`pwd`/_ci/android-ndk-r15c" + +script: + - python3 ./jenkins.py + +# https://docs.travis-ci.com/user/customizing-the-build/#Whitelisting-or-blacklisting-branches +# Exclude branch 'pkg.template'. Nothing to build there. +branches: + except: + - pkg.template + - /^pr\..*/ + - /^v[0-9]+\.[0-9]+\.[0-9]+$/ diff --git a/docs/creating-new/create/cmake-dependencies.rst b/docs/creating-new/create/cmake-dependencies.rst new file mode 100644 index 000000000..ed6a98fc7 --- /dev/null +++ b/docs/creating-new/create/cmake-dependencies.rst @@ -0,0 +1,82 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +.. _cmake-with-deps: + +CMake (with dependencies) +------------------------- + +If your project uses external packages (i.e. has command ``find_package(Foo)``) +you need to patch it first so these packages can be found in the Hunter root +directory instead of the standard one: + +.. code-block:: cmake + :emphasize-lines: 1 + + hunter_add_package(Foo) + find_package(Foo) + +.. note:: + + * :doc:`Patching sources (hunter-packages) ` + +.. _dependencies conflict: + +Conflict +======== + +Without the ``hunter_add_package(Foo)`` call one package will be found in the +standard location and another one in the Hunter root directory. The found +packages may conflict with each other. + +Consider the next example: Project ``Roo`` is not aware about Hunter custom +locations. It's just using regular ``find_package``: + +.. code-block:: cmake + + # Roo/CMakeLists.txt + + find_package(ZLIB) + +Project ``Bar`` depends on ``ZLIB`` and ``Roo``. Both packages are downloaded by +``hunter_add_package`` commands: + +.. code-block:: cmake + :emphasize-lines: 3, 6 + + # Bar/CMakeLists.txt + + hunter_add_package(Roo) + find_package(Roo) + + hunter_add_package(ZLIB) + find_package(ZLIB) + +.. image:: /images/package-conflict.png + :align: center + +Fix +=== + +To fix this issue you need to patch project ``Roo`` so it will use ``ZLIB`` from Hunter. +In terms of CMake code it means adding ``HunterGate`` and ``hunter_add_package`` +(see :doc:`First Step `): + +.. code-block:: cmake + :emphasize-lines: 4-5 + + # Roo/CMakeLists.txt + + include("cmake/HunterGate.cmake") + HunterGate(...) + hunter_add_package(ZLIB) + find_package(ZLIB CONFIG REQUIRED) + +.. image:: /images/package-conflict-resolved.png + :align: center + +Note that now the main project ``Bar`` and the hunter dependency ``Roo`` contain +a ``HunterGate`` command. The URL and SHA1 of the ``HunterGate`` command my not match. +In this case the URL and SHA1 of the main project ``Bar`` are used for both +``HunterGate`` commands. The user does not need to manage them manually. +The same is true for sub-projects added by ``add_subdirectory`` calls. diff --git a/docs/creating-new/create/cmake.rst b/docs/creating-new/create/cmake.rst new file mode 100644 index 000000000..f5c43b4f5 --- /dev/null +++ b/docs/creating-new/create/cmake.rst @@ -0,0 +1,982 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +.. _cmake-simple: + +CMake (no dependencies) +----------------------- + +If your CMake code is correctly written and has no dependencies then release +with sources can be used **as is** in Hunter. There is no need to have +``HunterGate``/``hunter_add_package`` calls and no need to have a maintenance fork. + +Examples of such packages: + +* :ref:`pkg.flatbuffers` + + * https://github.com/google/flatbuffers + * See `flatbuffers/hunter.cmake `__ + * Testing table: `AppVeyor `__, `Travis `__ + +* :ref:`pkg.rocksdb` + + * https://github.com/facebook/rocksdb + * See `rocksdb/hunter.cmake `__ + * Testing table: `Travis `__ + +* :ref:`pkg.nlohmann_json` + + * https://github.com/nlohmann/json + * See `nlohmann_json/hunter.cmake `__ + * Testing table: `AppVeyor `__, `Travis `__ + +Default behavior +================ + +Please check that your package respect (i.e. does not rewrite) such CMake +variables like: + +* `CMAKE_INSTALL_PREFIX `__ (**critical**) +* `CMAKE_{C,CXX}_FLAGS + variations `__ (**critical**) +* `CMAKE_{C,CXX}_COMPILER + friends `__ (**critical**) +* `CMAKE_BUILD_TYPE `__ (not critical, but recommended) +* `CMAKE_CONFIGURATION_TYPES `__ (not critical, but recommended) +* `BUILD_SHARED_LIBS `__ (not critical, but may result some errors) + +Environment +=========== + +Configuration of the package should be predictable. + +For example it should not depend on the fact that some package already installed +or not: + +.. code-block:: cmake + :emphasize-lines: 2 + + find_package(OpenSSL) + if(OPENSSL_FOUND) + target_compile_definitions(... PUBLIC FOO_WITH_OPENSSL=1) + endif() + +If package is optional then control behavior explicitly: + +.. code-block:: cmake + :emphasize-lines: 1, 5 + + option(FOO_WITH_OPENSSL "Build with OpenSSL" ON) + + if(FOO_WITH_OPENSSL) + find_package(OpenSSL REQUIRED) # fatal error if not found! + target_compile_definitions(... PUBLIC FOO_WITH_OPENSSL=1) + endif() + +Same with the programs: + +.. code-block:: cmake + :emphasize-lines: 2 + + find_program(PYTHON_EXE python) # Use 'find_package(PythonInterp)' in real code + if(PYTHON_EXE) + # generate some extra code + endif() + +Use this code instead: + +.. code-block:: cmake + :emphasize-lines: 1, 4, 6 + + option(FOO_WITH_PYTHON "Build with Python" ON) + + if(FOO_WITH_PYTHON) + find_program(PYTHON_EXE python) + if(NOT PYTHON_EXE) + message(FATAL_ERROR "Python not found") + endif() + endif() + +Environment variable example: + +.. code-block:: cmake + :emphasize-lines: 1 + + if(EXISTS "$ENV{FOO_EXTRA_CODE}") + # add some code + endif() + +Solution: + +.. code-block:: cmake + :emphasize-lines: 1, 4 + + option(FOO_WITH_EXTRA_CODE "Use extra code" ON) + + if(FOO_WITH_EXTRA_CODE) + if(NOT EXISTS "$ENV{FOO_EXTRA_CODE}") + message(FATAL_ERROR "...") + endif() + endif() + +Note that this is kind of a natural limitation because otherwise Hunter have +to save the whole outside environment like default paths, environment +variables, etc. This is not doable on practice. + +Exception is the variables related to compiler/toolchain like compiler version, +compiler id, platforms, generators, architectures: ``WIN32``, ``IOS``, +``ANDROID``, etc. Number of such traits is limited and forms +:doc:`toolchain-id `. + +.. admonition:: CGold + + * `Depending on environment variable `__ + +.. _create new install xxxconfig: + +Install XXXConfig.cmake +======================= + +The easiest way to integrate installed libraries into other project is to use +`find_package `__ +command. Project should generate and install ``*Config.cmake`` files instead +of using ``Find*.cmake`` modules. It's the one of the painless ways to support +relocation - imported targets can be cached and downloaded as prebuilt binary +archive from build servers. Plus only imported targets works nicely with non +standard build types like ``MinSizeRel`` or ``RelWithDebInfo``. + +To check this feature you can try to install files to local directory. +If result of installation looks like this: + +.. code-block:: none + :emphasize-lines: 4-5 + + Install the project... + /.../cmake -P cmake_install.cmake + -- Install configuration: "Release" + -- Installing: /.../lib/libhunter_box_1.a + -- Installing: /.../include/hunter_box_1.hpp + +It means that this feature is missing and you need to +:doc:`patch CMake code ` to introduce it. +Details can be found +`here `__. + +Installation after fix: + +.. code-block:: none + :emphasize-lines: 6-9 + + Install the project... + /.../cmake -P cmake_install.cmake + -- Install configuration: "Release" + -- Installing: /.../lib/libhunter_box_1.a + -- Installing: /.../include/hunter_box_1.hpp + -- Installing: /.../lib/cmake/hunter_box_1/hunter_box_1Config.cmake + -- Installing: /.../lib/cmake/hunter_box_1/hunter_box_1ConfigVersion.cmake + -- Installing: /.../lib/cmake/hunter_box_1/hunter_box_1Targets.cmake + -- Installing: /.../lib/cmake/hunter_box_1/hunter_box_1Targets-release.cmake + +.. admonition:: CGold + + * `Rejected: FindXXX.cmake `__ + * `Install layout `__ + +.. admonition:: CMake documentation + + * `find_package `__ + * `cmake-packages `__ + +Add package to Hunter +===================== + +Next let's assume user `hunterbox `__ is +trying to add `hunter_box_1 `__ +project to Hunter. + +.. admonition:: Examples on GitHub + + * `Example: hunterbox/hunter_box_1 `__ + +Recommended name for the package is lowercase separated with underscore. + +C++: + +.. code-block:: cpp + + #include + + int main() { + hunter_box_1::foo(); + } + +.. code-block:: cpp + + // file hunter_box_1.hpp + + namespace hunter_box_1 { + } // namespace hunter_box_1 + +CMake with Hunter: + +.. code-block:: cmake + + hunter_add_package(hunter_box_1) + find_package(hunter_box_1 CONFIG REQUIRED) + target_link_libraries(... hunter_box_1::hunter_box_1) + +In Hunter sources: + +* ``cmake/projects/hunter_box_1/hunter.cmake`` file with versions +* ``examples/hunter_box_1`` directory with example for testing +* ``docs/packages/pkg/hunter_box_1.rst`` documentation for package + +Git branches (will be covered in details later): + +* ``pkg.hunter_box_1`` branch for testing +* ``upload.hunter_box_1`` branch for uploading +* ``pr.hunter_box_1`` work-in-progress branch for adding/updating package + +Fork Hunter +=========== + +Hunter hosted on GitHub service where common way to add code is to fork +project and create pull request. + +Fork `ruslo/hunter `__, clone +`your fork `__ and initialize all +submodules: + +.. code-block:: none + + > git clone https://github.com/hunterbox/hunter + > cd hunter + [hunter]> git submodule update --init --recursive . + +Create branch to work on new package: + +.. code-block:: none + + [hunter]> git checkout -b pr.hunter_box_1 + +Add versions +============ + +Add one or several versions of ``hunter_box_1`` package to corresponding +``hunter.cmake`` file. + +Copy template and substitute all strings ``foo`` to ``hunter_box_1``: + +.. code-block:: none + + [hunter]> cp -r cmake/projects/foo cmake/projects/hunter_box_1 + [hunter]> sed -i 's,foo,hunter_box_1,g' cmake/projects/hunter_box_1/hunter.cmake + +Download release archive and calculate ``SHA1``: + +.. code-block:: none + + > wget https://github.com/hunterbox/hunter_box_1/archive/v1.0.0.tar.gz + > openssl sha1 v1.0.0.tar.gz + SHA1(v1.0.0.tar.gz)= c724e0f8a4ebc95cf7ba628b89b998b3b3c2697d + +Add this information to ``cmake/projects/hunter_box_1/hunter.cmake`` file: + +.. code-block:: cmake + :emphasize-lines: 10, 12, 14, 16 + + # !!! DO NOT PLACE HEADER GUARDS HERE !!! + + include(hunter_add_version) + include(hunter_cacheable) + include(hunter_download) + include(hunter_pick_scheme) + + hunter_add_version( + PACKAGE_NAME + hunter_box_1 + VERSION + 1.0.0 + URL + "https://github.com/hunterbox/hunter_box_1/archive/v1.0.0.tar.gz" + SHA1 + c724e0f8a4ebc95cf7ba628b89b998b3b3c2697d + ) + + hunter_pick_scheme(DEFAULT url_sha1_cmake) + hunter_cacheable(hunter_box_1) + hunter_download(PACKAGE_NAME hunter_box_1) + +Consistency +=========== + +Please keep Git tag and ``VERSION`` in consistent state. +For example if ``URL`` is: + +.. code-block:: cmake + :emphasize-lines: 3-4 + + hunter_add_version( + # ... + URL + "https://github.com/hunterbox/hunter_box_1/archive/v1.3.15-da39a3e-p6.tar.gz" + # ... + ) + +Then ``VERSION`` should be: + +.. code-block:: cmake + :emphasize-lines: 3-4 + + hunter_add_version( + # ... + VERSION + 1.3.15-da39a3e-p6 + URL + "https://github.com/hunterbox/hunter_box_1/archive/v1.3.15-da39a3e-p6.tar.gz" + # ... + ) + +CMake options +============= + +Note that it does not make sense to build and install stuff like examples, +tests or documentation. Please check that your package has CMake options to +disable those. If such an option is not disabled by default use +``hunter_cmake_args``: + +.. code-block:: cmake + :emphasize-lines: 1, 6, 9-11 + + include(hunter_cmake_args) + + # ... + + # bottom of cmake/projects/foo/hunter.cmake + hunter_cmake_args( + foo + CMAKE_ARGS + FOO_BUILD_EXAMPLES=OFF + FOO_BUILD_TESTS=OFF + FOO_BUILD_DOCUMENTATION=OFF + ) + + hunter_pick_scheme(DEFAULT url_sha1_cmake) + hunter_download(PACKAGE_NAME foo) + +Options set by ``hunter_cmake_args`` have lower precedence than options set +by ``hunter_config(... CMAKE_ARGS ...)`` (see +`order `__). + +Build types +=========== + +.. warning:: + + Usually there is no need to set a build type explicitly. If the package does not + work with default ``Debug`` + ``Release`` it means something is wrong with + the package itself. + +Default build type(s) can be set by ``hunter_configuration_types``: + +.. code-block:: cmake + + hunter_configuration_types(foo CONFIGURATION_TYPES Release) + hunter_download(PACKAGE_NAME foo) + +User can overwrite this default by using +`custom `__ +``hunter_config`` parameters. + +Set default version +=================== + +Add ``hunter_default_version`` directive with default version to +``cmake/configs/default.cmake``: + +.. code-block:: cmake + + hunter_default_version(hunter_box_1 VERSION 1.0.0) + +Create example +============== + + To test the integration of the package into another project a simple example will be used. + Copy the template example and substitute all strings ``foo`` with ``hunter_box_1``: + +.. code-block:: none + + [hunter]> cp -r examples/foo examples/hunter_box_1 + [hunter]> sed -i 's,foo,hunter_box_1,g' examples/hunter_box_1/* + +Tweak all files in ``examples/hunter_box_1`` directory to fit headers and +names of imported targets. + +Add documentation +================= + +Each package should have a +:doc:`page with information and usage example `. + +To create such a page copy the template file and substitute all strings ``foo`` with +the project name (for example ``hunter_box_1``): + +.. code-block:: none + + [hunter]> cp docs/packages/pkg/foo.rst docs/packages/pkg/hunter_box_1.rst + [hunter]> sed -i 's,foo,hunter_box_1,g' docs/packages/pkg/hunter_box_1.rst + +Open file ``docs/packages/pkg/hunter_box_1.rst`` and tweak all entries. + +Substitute ``unsorted`` with some tag in directive +``single: unsorted ; foo``. This tag will be used on +:ref:`this page `. + +If you want to have two tags add another line with ``single``: + +.. code-block:: none + + .. index:: + single: category_1 ; foo + single: category_2 ; foo + +.. seealso:: + + * `Gentoo packages `__ + * `Ubuntu packages `__ + +.. note:: + + Since you don't know the pull request number a priori leave it as ``N`` for now. + You can update it later. + +To locally check if the documentation is still building you can run: + +.. code-block:: none + + [hunter]> cd docs + [hunter/docs]> source ./jenkins.sh + (_venv) [hunter/docs]> ./make.sh + +If the documentation contains spelling errors or unrecognized names, the +documentation test build will fail and report the unrecognized strings. Fix +any spelling errors and test the build again. Any remaining errors can be +fixed by adding all correct but unrecognized names, string, or terms to the +``spelling`` header at the top of the document entry +``docs/packages/pkg/bar-baz.rst``. In this example, +``bar-baz`` would be a package name that is not in the dictionary. + +.. code-block:: none + :emphasize-lines: 1-4 + + .. spelling:: + + bar + baz + + .. index:: + single: unsorted ; bar-baz + + .. _pkg.bar-baz: + +Add entries for each term until the test build completes successfully. + +Common mistake +============== + +Please do not forget to substitute ``===``. + +Good: + +.. code-block:: none + + hunter_box_1 + ============ + +Bad: + +.. code-block:: none + + hunter_box_1 + === + +Commit +====== + +Now save all changes by doing a commit: + +.. code-block:: none + + [hunter]> git branch + master + * pr.hunter_box_1 + + [hunter]> git add cmake/configs/default.cmake + [hunter]> git add cmake/projects/hunter_box_1/ + [hunter]> git add docs/packages/pkg/hunter_box_1.rst + [hunter]> git add examples/hunter_box_1/ + + [hunter]> git commit -m "Add 'hunter_box_1' package" + +.. _testing locally: + +Testing locally +=============== + +This step is optional since we will run tests on the CI server. However it's the +fastest way to check that everything is ready and working correctly. + +Script ``jenkins.py`` will package a temporary Hunter archive based on current +state and build the specified example. This script uses +`Polly `__ toolchains. + +Check you have Python 3 installed, clone Polly, add its ``bin`` folder to +``PATH`` environment variable, go back to Hunter repository and run test. + +On Linux: + +.. code-block:: none + + > which python3 + /usr/bin/python3 + + > git clone https://github.com/ruslo/polly + > cd polly + [polly]> export PATH="`pwd`/bin:$PATH" + + > cd hunter + [hunter]> which polly.py + /.../bin/polly.py + + [hunter]> polly.py --help + Python version: 3.5 + usage: polly.py [-h] + ... + + [hunter]> TOOLCHAIN=gcc PROJECT_DIR=examples/hunter_box_1 ./jenkins.py + +On Windows: + +.. code-block:: none + + > git clone https://github.com/ruslo/polly + > cd polly + [polly]> set PATH=%CD%\bin;%PATH% + + > cd hunter + [hunter]> where polly.py + C:\...\bin\polly.py + + [hunter]> polly.py --help + Python version: 3.5 + usage: polly.py [-h] + ... + + [hunter]> set TOOLCHAIN=vs-12-2013 + [hunter]> set PROJECT_DIR=examples\hunter_box_1 + [hunter]> .\jenkins.py + +.. admonition:: Stackoverflow + + * `How to execute Python scripts in Windows? `__ + +.. _ci testing: + +CI testing +========== + +Now let's run tests on continuous integration servers with various toolchains +and platforms. Hunter uses `AppVeyor `__ to test for +Windows (Visual Studio, NMake, Ninja, MinGW, MSYS) and +`Travis `__ to test +for Linux (GCC, Clang, Android, Clang Analyzer, Sanitize Address, Sanitize Leak) +and for macOS (Clang + Makefile, Xcode, iOS). + +Register your Hunter fork: + +* `AppVeyor: Getting started `__ +* `Travis: Getting started `__ + +Branch master +============= + +To understand what should be done next you need to understand the structure +of branches. + +* Name: ``master`` +* Repository: https://github.com/ruslo/hunter +* Testing: Documentation on Linux + +In branch ``master`` there is only the ``.travis.yml`` file which will only check +if the documentation is building: + +* https://github.com/ruslo/hunter/blob/ea9de264d6c1b05484bdc16a9967c3cb8cca9048/.travis.yml#L57-L59 + +When you open a pull request to ``ruslo/hunter`` this test will automatically run. + +Branch pkg.template +=================== + +* Name: ``pkg.template`` +* Repository: https://github.com/ingenue/hunter +* Testing: *Nothing* + +In branch ``pkg.template`` of the repository ``ingenue/hunter`` there are +the **template** files ``.travis.yml`` and ``appveyor.yml``: + +* https://github.com/ingenue/hunter/blob/pkg.template/.travis.yml +* https://github.com/ingenue/hunter/blob/pkg.template/appveyor.yml + +All changes from ``master`` will go to ``pkg.template``. The only differences +between ``master`` and ``pkg.template`` are the files ``.travis.yml``/``appveyor.yml``. + +Branch pkg. +================= + +Branch for testing package ````. + +* Name: ``pkg.`` +* Repository: https://github.com/ingenue/hunter +* Testing: Package ```` on Windows/Linux/macOS hosts + +Real testing happens in ``pkg.`` branch of ``ingenue/hunter`` repository. +E.g. branch ``pkg.gtest``: + +* https://github.com/ingenue/hunter/tree/pkg.gtest +* AppVeyor https://ci.appveyor.com/project/ingenue/hunter/build/1.0.2352 +* Travis https://travis-ci.org/ingenue/hunter/builds/274507515 + +All changes from ``pkg.template`` will go to ``pkg.`` branch on updates. +The only differences between ``pkg.template`` and ``pkg.`` are +the files ``travis.yml``/``appveyor.yml``. + +Branch upload. +==================== + +Branch for uploads. + +* Name: ``upload.`` +* Repository: https://github.com/ingenue/hunter +* Testing: Upload archives with binaries to cache-server + +After successful tests on ``pkg.`` the branch ``upload.`` will do +uploads. E.g. branch ``upload.gtest``: + +* https://github.com/ingenue/hunter/tree/upload.gtest +* https://ci.appveyor.com/project/ingenue/hunter/build/1.0.2287 +* https://travis-ci.org/ingenue/hunter/builds/270324624 + +All changes from ``pkg.`` will go to ``upload.`` branch on updates. +The only difference between ``upload.`` and ``pkg.`` is +the build command: ``jenkins.py`` vs. ``jenkins.py --upload``. + +Branches structure +================== + +Here is an image showing the structure of the branches: + +.. image:: /creating-new/images/branches.png + :align: center + :alt: Branches + +Fetch CI configs +================ + +Since we are adding a new package we have to create new CI configs for it. +Fetch the branch ``pkg.template`` and substitute all ``foo`` strings with +``hunter_box_1``: + +.. code-block:: none + + [hunter]> git remote add ci https://github.com/ingenue/hunter + [hunter]> git fetch ci + [hunter]> git checkout pkg.template + [hunter]> git checkout -b pr.pkg.hunter_box_1 + + [hunter]> sed -i 's,foo,hunter_box_1,g' .travis.yml + [hunter]> sed -i 's,foo,hunter_box_1,g' appveyor.yml + + [hunter]> git add .travis.yml appveyor.yml + [hunter]> git commit -m "Test 'hunter_box_1' package" + +Run remote tests +================ + +Currently we have two new branches: + +* ``pr.hunter_box_1`` contains new package +* ``pr.pkg.hunter_box_1`` contains configs for testing + +.. code-block:: none + + [hunter]> git branch -vv + master + pkg.template + pr.hunter_box_1 9f60453 Add 'hunter_box_1' package + * pr.pkg.hunter_box_1 4a7626d Test 'hunter_box_1' package + +To run tests we need to merge both changes into ``test.hunter_box_1`` +and push ``test.hunter_box_1`` branch to remote: + +.. code-block:: none + + [hunter]> git checkout pr.hunter_box_1 + [hunter]> git checkout -b test.hunter_box_1 + [hunter]> git merge pr.pkg.hunter_box_1 + [hunter]> git push -u origin test.hunter_box_1 + +Example: + +* https://travis-ci.org/hunterbox/hunter/builds/276514711 + +.. image:: /creating-new/images/pull-request.png + :align: center + :alt: Pull request + +Fix AppVeyor path too long error +================================ + +If you see error + +.. code-block:: none + + -- The C compiler identification is unknown + -- The CXX compiler identification is unknown + +or + +.. code-block:: none + + ...: error MSB3491: Could not write lines to file "...". + The specified path, file name, or both are too long. The fully qualified file + name must be less than 260 characters, and the directory name must be less than + 248 characters + +on Windows build, adding :ref:`HUNTER_BINARY_DIR ` +environment variable should help: + +.. code-block:: yaml + :emphasize-lines: 4 + + - TOOLCHAIN: "vs-15-2017-win64-cxx17" + PROJECT_DIR: examples\SuiteSparse + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + HUNTER_BINARY_DIR: C:\__BIN + +Example: + +* https://github.com/ingenue/hunter/blob/05bd9cdbd03a5772302c65abb9119722b9b8e08c/appveyor.yml#L21-L24 + +Fix Travis log too long error +============================= + +If you see error + +.. code-block:: none + + The job exceeded the maximum log length, and has been terminated. + +Adding ``VERBOSE=0`` environment variable should help: + +.. code-block:: yaml + :emphasize-lines: 5 + + - os: linux + env: > + TOOLCHAIN=android-ndk-r17-api-24-arm64-v8a-clang-libcxx14 + PROJECT_DIR=examples/OpenCV + VERBOSE=0 + +Example: + +* https://github.com/ingenue/hunter/blob/92cb26bd0bc5eeb14525f56b3a068fb072e2e5a1/.travis.yml#L55-L59 + +Workaround for GCC internal error +================================= + +Travis machines have 32 logical cores and Hunter will use all of them by default +(e.g. build with ``make -j32``). Because of this system may run out of memory +and GCC may get killed: + +.. code-block:: none + + g++-7: internal compiler error: Killed (program cc1plus) + +As a workaround you can limit number of jobs explicitly by adding +the :ref:`HUNTER_JOBS_NUMBER ` environment variable: + +.. code-block:: yaml + :emphasize-lines: 5 + + - os: linux + env: > + TOOLCHAIN=gcc-7-cxx17 + PROJECT_DIR=examples/mkldnn + HUNTER_JOBS_NUMBER=4 + +Example: + +* https://github.com/ingenue/hunter/blob/c1e12ba21940b8418d1e3d596b653ad3bf588e11/.travis.yml#L41-L45 + +.. admonition:: Stackoverflow + + * https://stackoverflow.com/a/35011967 + +Excluding tests +=============== + +If all tests passed you can skip this section. + +If some toolchains are working and some toolchains failed it means the project +has platform-specific problems. Note that you don't have to have all +toolchains working and there is **no need to fix all issues you see**. +If at least *something* is working then you can exclude broken +toolchains and you or somebody else can apply fixes later. + +Please follow these guidelines when disabling toolchains: + +- **Do not remove** toolchains from ``.travis.yml``/``appveyor.yml`` configs. + Comment it out instead to simplify enabling it back. +- Do not change the order of toolchains since it will affect ``git merge``. +- Leave the link to broken job: + +.. literalinclude:: ci/.travis-NEW.yml + :diff: ci/.travis-OLD.yml + +If no working toolchain is left for ``.travis.yml`` or ``appveyor.yml`` then +comment out everything and add ``TOOLCHAIN=dummy`` test (see +`example `__). + +Go to branch ``pr.pkg.hunter_box_1`` with CI configs and commit this change +there: + +.. code-block:: none + + [hunter]> git checkout pr.pkg.hunter_box_1 + [hunter]> git add .travis.yml + [hunter]> git commit -m 'Exclude broken' + +Go to testing branch ``test.hunter_box_1``, merge updated CI configs and run +new CI tests by pushing commits to remote: + +.. code-block:: none + + [hunter]> git checkout test.hunter_box_1 + [hunter]> git merge pr.pkg.hunter_box_1 + [hunter]> git push + +Pull requests (tests) +===================== + +First push ``pr.pkg.hunter_box_1`` with CI configs: + +.. code-block:: none + + [hunter]> git checkout pr.pkg.hunter_box_1 + [hunter]> git push -u origin pr.pkg.hunter_box_1 + +Open pull request to ``ingenue/hunter`` repository, to ``pkg.template`` +branch: + +.. image:: /creating-new/images/pr-with-tests.png + :align: center + :alt: Pull request with tests + +I will create ``pkg.hunter_box_1`` and change branch before merging: + +.. image:: /creating-new/images/pr-change-branch.png + :align: center + :alt: Change branch + +Pull requests +============= + +After CI configs merged you can open pull request with package itself: + +.. code-block:: none + + [hunter]> git checkout pr.hunter_box_1 + [hunter]> git push -u origin pr.hunter_box_1 + +.. image:: /creating-new/images/pr-with-package.png + :align: center + :alt: PR with package + +At this moment you know the pull request number: + +.. image:: /creating-new/images/pr-number.png + :align: center + :alt: Pull request number + +Add it to documentation: + +.. code-block:: none + + [hunter]> git checkout pr.hunter_box_1 + [hunter]> vim docs/packages/pkg/hunter_box_1.rst + [hunter]> git add docs/packages/pkg/hunter_box_1.rst + [hunter]> git commit -m 'Pull request number' + [hunter]> git push + +Pull request will be approved and tests run on CI, documentation will be +tested automatically: + +.. image:: /creating-new/images/package-testing.png + :align: center + :alt: Package testing + +Branch ``pkg.hunter_box_1.pr-N`` will be created from ``pkg.hunter_box_1`` +to test package: + +.. image:: /creating-new/images/pull-request-testing.png + :align: center + :alt: Change branch + +Upload +====== + +After all tests pass the pull request will be merged and upload run. When upload +finished new release will be created: + +.. image:: /creating-new/images/upload.png + :align: center + :alt: Upload + +You can use new ``URL``/``SHA1``: + +.. image:: /creating-new/images/release.png + :align: center + :alt: Upload + +Clean +===== + +At this moment all branches can be removed: + +.. code-block:: none + + [hunter]> git checkout master + + [hunter]> git push origin :pr.hunter_box_1 + [hunter]> git push origin :pr.pkg.hunter_box_1 + [hunter]> git push origin :test.hunter_box_1 + + [hunter]> git branch -D pr.hunter_box_1 + [hunter]> git branch -D pr.pkg.hunter_box_1 + [hunter]> git branch -D test.hunter_box_1 + +Badge +===== + +Badge in ``README.rst`` can signal that package ``hunter_box_1`` is available +via Hunter: + +.. code-block:: none + + |hunter| + + .. |hunter| image:: https://img.shields.io/badge/hunter-hunter_box_1-blue.svg + :target: https://docs.hunter.sh/en/latest/packages/pkg/hunter_box_1.html + :alt: Hunter + +Example: + +* https://github.com/hunter-packages/gauze/blob/master/README.rst diff --git a/docs/creating-new/create/custom.rst b/docs/creating-new/create/custom.rst new file mode 100644 index 000000000..95fa7a6dd --- /dev/null +++ b/docs/creating-new/create/custom.rst @@ -0,0 +1,189 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +Non-CMake: custom scheme +------------------------ + +Non-CMake projects can be added too. But sometimes it's not a trivial task +(for example there are a 3 custom schemes for `OpenSSL `_. In general it's better to +apply a patch to an existing CMake build and use :ref:`cmake-simple` add +instruction. Anyway here is a guide how to add a project with custom build: + +Test it manually +================ + +.. code-block:: bash + + > wget https://github.com/phonegap/ios-sim/archive/1.8.2.tar.gz + > openssl sha1 1.8.2.tar.gz + SHA1(1.8.2.tar.gz)= 4328b3c8e6b455631d52b7ce5968170c9769eb1e + > tar xf 1.8.2.tar.gz + > cd ios-sim-1.8.2/ + > xcodebuild -target ios-sim -configuration Release + > ls build/Release/ios-sim + build/Release/ios-sim + +Test it using ``ExternalProject_Add`` +===================================== + +.. code-block:: bash + + > cat CMakeLists.txt + cmake_minimum_required(VERSION 3.0) + + include(ExternalProject) # ExternalProject_Add + + ExternalProject_Add( + ios_sim + URL + "https://github.com/phonegap/ios-sim/archive/1.8.2.tar.gz" + URL_HASH + SHA1=4328b3c8e6b455631d52b7ce5968170c9769eb1e + CONFIGURE_COMMAND + "" + BUILD_COMMAND + xcodebuild -target ios-sim -configuration Release + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + "${CMAKE_COMMAND}" -E make_directory "${CMAKE_INSTALL_PREFIX}" + COMMAND + "${CMAKE_COMMAND}" -E copy build/Release/ios-sim "${CMAKE_INSTALL_PREFIX}" + ) + > cmake -H. -B_builds -DCMAKE_INSTALL_PREFIX=`pwd`/_install + > cmake --build _builds/ + > ls _install/ + ios-sim + +Add new package +=============== + +First, custom build scheme need to be added to ``cmake/schemes`` directory: + +.. code-block:: bash + + > cd ${HUNTER_ROOT} + > cat cmake/schemes/url_sha1_ios_sim.cmake.in + # This is configuration file, variable @SOME_VARIABLE_NAME@ will be substituted during configure_file command + cmake_minimum_required(VERSION 3.0) + + # If such variables like `CMAKE_CXX_FLAGS` or `CMAKE_CXX_COMPILER` not used by scheme + # setting `LANGUAGES` to `NONE` will speed-up build a little bit. If you have any problems/glitches + # use regular `project(Hunter)` command + project(Hunter LANGUAGES NONE) + + include(ExternalProject) # ExternalProject_Add + + # some Hunter modules will be used + list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + + include(hunter_status_debug) + include(hunter_assert_not_empty_string) + + # print this message if HUNTER_STATUS_DEBUG option is ON + hunter_status_debug("Scheme: url_sha1_ios_sim") + + # Check variables is not empty + hunter_assert_not_empty_string("@HUNTER_SELF@") + hunter_assert_not_empty_string("@HUNTER_EP_NAME@") + hunter_assert_not_empty_string("@HUNTER_PACKAGE_URL@") + hunter_assert_not_empty_string("@HUNTER_PACKAGE_SHA1@") + hunter_assert_not_empty_string("@HUNTER_PACKAGE_DOWNLOAD_DIR@") + hunter_assert_not_empty_string("@HUNTER_PACKAGE_SOURCE_DIR@") + hunter_assert_not_empty_string("@HUNTER_INSTALL_PREFIX@") + + ExternalProject_Add( + @HUNTER_EP_NAME@ # Name of the external project. Actually not used set for beautify logging messages + URL + @HUNTER_PACKAGE_URL@ # URL of the package to download + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ # SHA1 hash + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" # Archive destination location + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" # Unpack directory + INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" # not used actually (see install command) + CONFIGURE_COMMAND + "" + BUILD_COMMAND + xcodebuild -target ios-sim -configuration Release + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + "@CMAKE_COMMAND@" -E copy build/Release/ios-sim "@HUNTER_INSTALL_PREFIX@" + ) + +Next steps are similar to :ref:`cmake-simple`. + +.. code-block:: bash + + > cat cmake/projects/ios_sim/hunter.cmake + + # !!! DO NOT PLACE HEADER GUARDS HERE !!! + + include(hunter_add_version) + include(hunter_download) + include(hunter_pick_scheme) + + hunter_add_version( + PACKAGE_NAME + ios_sim + VERSION + "1.8.2" + URL + "https://github.com/phonegap/ios-sim/archive/1.8.2.tar.gz" + SHA1 + 4328b3c8e6b455631d52b7ce5968170c9769eb1e + ) + + hunter_pick_scheme(DEFAULT url_sha1_ios_sim) # Use new custom scheme + hunter_download(PACKAGE_NAME ios_sim) + +.. code-block:: bash + + > grep ios_sim cmake/config/default.cmake + hunter_default_version(ios_sim VERSION 1.8.2) + +Using +===== + +Now package ready to be used: + +.. code-block:: bash + + > cat CMakeLists.txt + cmake_minimum_required(VERSION 2.8) + + include("cmake/HunterGate.cmake") + + HunterGate( + URL "https://url/to/your/hunter-archive.tar.gz" + SHA1 "put-archive-sha1-here" + ) + + hunter_add_package(ios_sim) + + find_program(IOS_SIM_EXECUTABLE ios-sim ${IOS_SIM_ROOT}) + message("ios_sim: ${IOS_SIM_EXECUTABLE}") + > cmake -H. -B_builds + -- [hunter] HUNTER_ROOT: /.../Hunter + -- [hunter] [ Hunter-ID: 7912489 | Config-ID: 9ec2ff8 | Toolchain-ID: c018e63 ] + -- [hunter] IOS_SIM_ROOT: /.../Hunter/_Base/7912489/9ec2ff8/c018e63/Install (ver.: 1.8.2) + ... + -- downloading... + src='https://github.com/phonegap/ios-sim/archive/1.8.2.tar.gz' + -- [download 100% complete] + ios_sim: /.../Hunter/_Base/7912489/9ec2ff8/c018e63/Install/ios-sim + +Default behavior +================ + +Note that such CMake variables like: + +* `CMAKE_{C,CXX}_FLAGS `_ +* `CMAKE_{C,CXX}_COMPILER `_ +* `CMAKE_CONFIGURATION_TYPES `_ +* `BUILD_SHARED_LIBS `_ + +must be checked manually for each custom build scheme (see :ref:`cmake-simple`). diff --git a/docs/creating-new/default-NEW.cmake b/docs/creating-new/default-NEW.cmake new file mode 100644 index 000000000..875c6d358 --- /dev/null +++ b/docs/creating-new/default-NEW.cmake @@ -0,0 +1,312 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +# Do not place header guards here + +# Unset: +# * ${PACKAGE_NAME}_ROOT (CMake variable) +# * ${PACKAGE_NAME}_ROOT (CMake cache variable) +# * ${PACKAGE_NAME}_ROOT (environment variable) + +# Set CMake variables: +# * HUNTER_${PACKAGE_NAME}_VERSION +# * HUNTER_${PACKAGE_NAME}_CMAKE_ARGS (optionally) + +# Usage: +# hunter_default_version(Foo VERSION 1.0.0) +# hunter_default_version(Boo VERSION 1.2.3z CMAKE_ARGS BOO_WITH_A=ON) + +# Wiki: +# * https://github.com/ruslo/hunter/wiki/dev.modules#hunter_default_version + +include(hunter_default_version) +include(hunter_user_error) + +# NOTE: no names with spaces! + +hunter_default_version(AllTheFlopsThreads VERSION 0.1-p0) +hunter_default_version(Android-Apk VERSION 1.1.13) +hunter_default_version(Android-Build-Tools VERSION 22.0.1) +hunter_default_version(Android-Google-Repository VERSION 47) +hunter_default_version(Android-Modules VERSION 1.0.0) +hunter_default_version(Android-SDK VERSION 0.0.5) +hunter_default_version(Android-SDK-Platform-tools VERSION r25.0.5) +hunter_default_version(Android-SDK-Tools VERSION 25.2.5) +hunter_default_version(Android-Support-Repository VERSION 47) +hunter_default_version(ARM_NEON_2_x86_SSE VERSION 1.0.0-p0) +hunter_default_version(ArrayFire VERSION 3.3.1-p0) +hunter_default_version(Assimp VERSION 3.2-p1) +hunter_default_version(Async++ VERSION 0.0.3-hunter) +hunter_default_version(Avahi VERSION 0.6.31) +hunter_default_version(Beast VERSION 1.0.0-b84-hunter-0) +hunter_default_version(BZip2 VERSION 1.0.6-p3) +if(MSVC OR MINGW) + # FIXME: https://ci.appveyor.com/project/ingenue/hunter/build/1.0.2229 + hunter_default_version(Boost VERSION 1.64.0) +else() + hunter_default_version(Boost VERSION 1.65.0) +endif() +hunter_default_version(BoostCompute VERSION 0.5-p0) +hunter_default_version(BoostProcess VERSION 0.5) +hunter_default_version(CapnProto VERSION 0.6.1) +hunter_default_version(CLAPACK VERSION 3.2.1) +hunter_default_version(CURL VERSION 7.49.1-DEV-v8) +hunter_default_version(Clang VERSION 4.0.1-p0) +hunter_default_version(ClangToolsExtra VERSION 4.0.1) # Clang +hunter_default_version(Comet VERSION 4.0.2) +hunter_default_version(CppNetlib VERSION 0.10.1-hunter-3) +hunter_default_version(CppNetlibUri VERSION 1.0.4-hunter) +hunter_default_version(CsvParserCPlusPlus VERSION 1.0.1) +hunter_default_version(Eigen VERSION 3.3.4-p0) +hunter_default_version(enet VERSION 1.3.13-p1) +hunter_default_version(Expat VERSION 2.1.1) +if(MSVC) + hunter_default_version(getopt VERSION 1.0.0-p0) +endif() +hunter_default_version(GPUImage VERSION 0.1.6-p6) +hunter_default_version(GSL VERSION 2.1.0-p2) +hunter_default_version(Igloo VERSION 1.1.1-hunter) +hunter_default_version(intsizeof VERSION 2.0.1) +hunter_default_version(Jpeg VERSION 9b-p3) +hunter_default_version(JsonSpirit VERSION 0.0.4-hunter) +if(MSVC_VERSION LESS 1600) + # for VS10 - version without support C++11 + hunter_default_version(jsoncpp VERSION 0.7.0) +else() + hunter_default_version(jsoncpp VERSION 1.8.0) +endif() +hunter_default_version(LAPACK VERSION 3.7.1) +hunter_default_version(LLVM VERSION 4.0.1-p0) # Clang +hunter_default_version(LLVMCompilerRT VERSION 4.0.1-patched) # Clang +hunter_default_version(Leathers VERSION 0.1.6) +hunter_default_version(Leptonica VERSION 1.74.2-p4) +hunter_default_version(Libcxx VERSION 3.6.2) # Clang +hunter_default_version(Libcxxabi VERSION 3.6.2) # Clang +hunter_default_version(librtmp VERSION 2.4.0-p0) +hunter_default_version(Libssh2 VERSION 1.7.0) +hunter_default_version(Lua VERSION 5.3.2) +hunter_default_version(MySQL-client VERSION 6.1.9-p0) +hunter_default_version(NASM VERSION 2.12.02) +hunter_default_version(OpenBLAS VERSION 0.2.20-p0) +hunter_default_version(OpenCL VERSION 2.1-p3) +hunter_default_version(OpenCL-cpp VERSION 2.0.10-p0) +hunter_default_version(OpenCV VERSION 3.3.0-p2) +hunter_default_version(OpenCV-Extra VERSION 3.3.0) +hunter_default_version(OpenNMTTokenizer VERSION 0.2.0-p1) +if(MSVC) + # FIXME: https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1470 + hunter_default_version(OpenSSL VERSION 1.0.2l) +else() + hunter_default_version(OpenSSL VERSION 1.1.0f) +endif() +hunter_default_version(PNG VERSION 1.6.26-p1) +hunter_default_version(PocoCpp VERSION 1.7.8-p0) +hunter_default_version(PostgreSQL VERSION 9.6.3) +hunter_default_version(Protobuf VERSION 3.0.0-p1) + +string(COMPARE EQUAL "${CMAKE_SYSTEM_NAME}" "Linux" _is_linux) +if(_is_linux OR MINGW) + # qt-qml example is broken on Linux + # qt-core example is broken on MinGW + hunter_default_version(Qt VERSION 5.5.1-cvpixelbuffer-2-p9) +else() + hunter_default_version(Qt VERSION 5.9.1-p0) +endif() + +hunter_default_version(QtAndroidCMake VERSION 1.0.9) +hunter_default_version(QtCMakeExtra VERSION 1.0.27) +hunter_default_version(QtQmlManager VERSION 1.0.0) +hunter_default_version(RapidJSON VERSION 1.0.2-p2) +hunter_default_version(RapidXML VERSION 1.13) +hunter_default_version(SDL2 VERSION 2.0.4-p4) +hunter_default_version(SDL_image VERSION 2.0.1-p1) +hunter_default_version(SDL_mixer VERSION 2.0.1-p1) +hunter_default_version(SQLite3 VERSION autoconf-3080803) #R-Tree enabled +hunter_default_version(Sober VERSION 0.1.3) +hunter_default_version(stormlib VERSION 9.21-p1) +hunter_default_version(Sugar VERSION 1.2.2) +hunter_default_version(SuiteSparse VERSION 4.5.1-p1) +hunter_default_version(TIFF VERSION 4.0.2-p3) +hunter_default_version(tommath VERSION 1.0-p2) +hunter_default_version(tomcrypt VERSION 1.17-p3) +hunter_default_version(WTL VERSION 9.1.5321) +hunter_default_version(WDC VERSION 1.1.1) +hunter_default_version(Washer VERSION 0.1.2) +hunter_default_version(WinSparkle VERSION 0.4.0) +hunter_default_version(ZLIB VERSION 1.2.8-p3) +hunter_default_version(ZMQPP VERSION 4.1.2) +hunter_default_version(ZeroMQ VERSION 4.1.4-p2) +hunter_default_version(caffe VERSION rc3-p2) +hunter_default_version(Catch VERSION 1.8.2-p0) +hunter_default_version(aes VERSION 0.0.1-p1) +hunter_default_version(aglet VERSION 1.2.0) +hunter_default_version(autobahn-cpp VERSION 0.2.0) +hunter_default_version(boost-pba VERSION 1.0.0-p0) +hunter_default_version(ccv VERSION 0.7-p6) +hunter_default_version(cereal VERSION 1.2.2-p0) +hunter_default_version(ceres-solver VERSION 1.12.0-p2) +hunter_default_version(clBLAS VERSION 2.10.0-p0) +hunter_default_version(convertutf VERSION 1.0.1) +hunter_default_version(crashpad VERSION v0.0.1-p0) +hunter_default_version(crashup VERSION 0.0.2) +hunter_default_version(cvmatio VERSION 1.0.27-p3) +hunter_default_version(cxxopts VERSION 1.0.0-p0) +hunter_default_version(czmq VERSION 4.0.2-p1) +hunter_default_version(damageproto VERSION 1.2.1) +hunter_default_version(dbus VERSION 1.10.0-hunter-4) +hunter_default_version(dest VERSION 0.8.0-p4) +hunter_default_version(dlib VERSION 19.6-p0) +hunter_default_version(doctest VERSION 1.2.0) +hunter_default_version(double-conversion VERSION 3.0.0) +hunter_default_version(dri2proto VERSION 2.8) +hunter_default_version(dri3proto VERSION 1.0) +hunter_default_version(drishti_assets VERSION 1.8) +hunter_default_version(drishti_faces VERSION 1.2) +hunter_default_version(drm VERSION 2.4.67) +hunter_default_version(eigen3-nnls VERSION 1.0.0) +hunter_default_version(eos VERSION 0.12.1) +hunter_default_version(FakeIt VERSION 2.0.3) +hunter_default_version(fixesproto VERSION 5.0) +hunter_default_version(flatbuffers VERSION 1.3.0-p3) +hunter_default_version(flex VERSION 2.6.4) +hunter_default_version(fmt VERSION 4.0.0) +hunter_default_version(freetype VERSION 2.6.2) +hunter_default_version(gauze VERSION 0.1.1) +hunter_default_version(geos VERSION 3.4.2) +hunter_default_version(gflags VERSION 2.2.1) +hunter_default_version(glew VERSION 2.0.0) +hunter_default_version(glfw VERSION 3.3.0-p4) +hunter_default_version(glm VERSION 0.9.8.5) +hunter_default_version(glog VERSION 0.3.5-p1) +hunter_default_version(glproto VERSION 1.4.17) +hunter_default_version(half VERSION 1.1.0-p1) +hunter_default_version(hdf5 VERSION 1.8.15-p1) +hunter_default_version(hunter_box_1 VERSION 1.0.1) +hunter_default_version(ice VERSION 1.0.8) +hunter_default_version(imshow VERSION 1.0.0-p0) +hunter_default_version(inputproto VERSION 2.2) +hunter_default_version(intltool VERSION 0.51.0) +hunter_default_version(ios_sim VERSION 3.1.1) +hunter_default_version(ippicv VERSION 20151201) +hunter_default_version(irrXML VERSION 1.2) +hunter_default_version(kbproto VERSION 1.0.6) +hunter_default_version(libdaemon VERSION 0.14) +hunter_default_version(libjson-rpc-cpp VERSION 0.7.0-p3) +hunter_default_version(libogg VERSION 1.3.2-cmake3) +hunter_default_version(libsodium VERSION 1.0.10) +hunter_default_version(libuv VERSION 1.14.0-p1) +hunter_default_version(libxml2 VERSION 2.9.4) +hunter_default_version(libyuv VERSION 1514-p3) +hunter_default_version(log4cplus VERSION 1.2.0-p0) +hunter_default_version(lzma VERSION 5.2.3-p4) +hunter_default_version(mini_chromium VERSION 0.0.1-p2) +hunter_default_version(minizip VERSION 1.0.1-p1) +hunter_default_version(mpark_variant VERSION 1.0.0) +hunter_default_version(msgpack VERSION 1.4.1-p2) +hunter_default_version(mtplz VERSION 0.1-p3) +hunter_default_version(nanoflann VERSION 1.2.3-p0) +hunter_default_version(nlohmann_json VERSION 2.1.1-p1) +hunter_default_version(odb VERSION 2.4.0) +hunter_default_version(odb-boost VERSION 2.4.0) +hunter_default_version(odb-compiler VERSION 2.4.0) +hunter_default_version(odb-mysql VERSION 2.4.0) +hunter_default_version(odb-pgsql VERSION 2.4.0) +hunter_default_version(odb-sqlite VERSION 2.4.0) +hunter_default_version(ogles_gpgpu VERSION 0.2.1) +hunter_default_version(onmt VERSION 0.4.1-p2) +hunter_default_version(openddlparser VERSION 0.1.0-p2) +hunter_default_version(pciaccess VERSION 0.13.4) +hunter_default_version(poly2tri VERSION 1.0.0) +hunter_default_version(polyclipping VERSION 4.8.8-p0) # for Assimp +hunter_default_version(presentproto VERSION 1.0) +hunter_default_version(pthread-stubs VERSION 0.3) +hunter_default_version(pugixml VERSION 1.8.1) +hunter_default_version(rabbitmq-c VERSION 0.7.0-p1) +hunter_default_version(randrproto VERSION 1.3.2) +hunter_default_version(renderproto VERSION 0.11.1) +hunter_default_version(sm VERSION 1.2.1) +hunter_default_version(Snappy VERSION 1.1.6-p0) +hunter_default_version(sse2neon VERSION 1.0.0-p0) +hunter_default_version(sparsehash VERSION 2.0.2) +if(MSVC_VERSION LESS 1800) + # for VS12 - version without support C++11 + hunter_default_version(spdlog VERSION 1.0.0-p0) +else() + hunter_default_version(spdlog VERSION 0.13.0-p1) +endif() +hunter_default_version(szip VERSION 2.1.0-p1) +hunter_default_version(Tesseract VERSION 3.05.01-hunter-3) +hunter_default_version(thread-pool-cpp VERSION 1.1.0) +hunter_default_version(tinydir VERSION 1.2-p0) +hunter_default_version(websocketpp VERSION 0.7.0-p2) +hunter_default_version(wxWidgets VERSION 3.0.2) +hunter_default_version(x11 VERSION 1.5.0) +hunter_default_version(x264 VERSION snapshot-20170420-2245) +hunter_default_version(xau VERSION 1.0.7) +hunter_default_version(xcb VERSION 1.11.1) +hunter_default_version(xcb-proto VERSION 1.11) +hunter_default_version(xcursor VERSION 1.1.13) +hunter_default_version(xdamage VERSION 1.1.4) +hunter_default_version(xext VERSION 1.3.1) +hunter_default_version(xextproto VERSION 7.2.1) +hunter_default_version(xf86vidmodeproto VERSION 2.3.1) +hunter_default_version(xfixes VERSION 5.0.1) +hunter_default_version(xgboost VERSION 0.40-p9) +hunter_default_version(xi VERSION 1.6.1) +hunter_default_version(xinerama VERSION 1.1.2) +hunter_default_version(xineramaproto VERSION 1.1.2) +hunter_default_version(xorg-macros VERSION 1.17) +hunter_default_version(xproto VERSION 7.0.23) +hunter_default_version(xrandr VERSION 1.3.2) +hunter_default_version(xrender VERSION 0.9.7) +hunter_default_version(xshmfence VERSION 1.2) +hunter_default_version(xtrans VERSION 1.2.7) +hunter_default_version(xxf86vm VERSION 1.1.2) +hunter_default_version(yaml-cpp VERSION 0.5.3) + +if(MSVC80) + hunter_default_version(GTest VERSION 1.7.0-hunter-6) +else() + hunter_default_version(GTest VERSION 1.8.0-hunter-p7) +endif() + +if(ANDROID) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "" _is_empty) + if(_is_empty) + hunter_user_error("CMAKE_SYSTEM_VERSION is empty") + endif() + + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "21" _is_api_21) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "19" _is_api_19) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "16" _is_api_16) + + if(_is_api_21) + hunter_default_version(Android-Google-APIs VERSION 21_r01) + hunter_default_version(Android-Google-APIs-Intel-x86-Atom-System-Image VERSION 21_r10) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 21) + hunter_default_version(Android-SDK-Platform VERSION 21_r02) + hunter_default_version(Sources-for-Android-SDK VERSION 21) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 21_r04) + elseif(_is_api_19) + hunter_default_version(Android-Google-APIs VERSION 19_r18) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 19) + hunter_default_version(Android-SDK-Platform VERSION 19_r04) + hunter_default_version(Sources-for-Android-SDK VERSION 19) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 19_r05) + elseif(_is_api_16) + hunter_default_version(Android-Google-APIs VERSION 16_r04) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 16) + hunter_default_version(Android-SDK-Platform VERSION 16_r05) + hunter_default_version(Sources-for-Android-SDK VERSION 16) + else() + hunter_user_error( + "Android API (CMAKE_SYSTEM_VERSION)" + " Expected: `21`, `19`, `16`" + " Got: `${CMAKE_SYSTEM_VERSION}`" + ) + endif() +endif() + +hunter_default_version(zookeeper VERSION 3.4.9-p2) +hunter_default_version(tacopie VERSION 2.4.0-h1) +hunter_default_version(cpp_redis VERSION 3.5.0-h1) diff --git a/docs/creating-new/default.cmake b/docs/creating-new/default.cmake new file mode 100644 index 000000000..c6451c76d --- /dev/null +++ b/docs/creating-new/default.cmake @@ -0,0 +1,312 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +# Do not place header guards here + +# Unset: +# * ${PACKAGE_NAME}_ROOT (CMake variable) +# * ${PACKAGE_NAME}_ROOT (CMake cache variable) +# * ${PACKAGE_NAME}_ROOT (environment variable) + +# Set CMake variables: +# * HUNTER_${PACKAGE_NAME}_VERSION +# * HUNTER_${PACKAGE_NAME}_CMAKE_ARGS (optionally) + +# Usage: +# hunter_default_version(Foo VERSION 1.0.0) +# hunter_default_version(Boo VERSION 1.2.3z CMAKE_ARGS BOO_WITH_A=ON) + +# Wiki: +# * https://github.com/ruslo/hunter/wiki/dev.modules#hunter_default_version + +include(hunter_default_version) +include(hunter_user_error) + +# NOTE: no names with spaces! + +hunter_default_version(AllTheFlopsThreads VERSION 0.1-p0) +hunter_default_version(Android-Apk VERSION 1.1.13) +hunter_default_version(Android-Build-Tools VERSION 22.0.1) +hunter_default_version(Android-Google-Repository VERSION 47) +hunter_default_version(Android-Modules VERSION 1.0.0) +hunter_default_version(Android-SDK VERSION 0.0.5) +hunter_default_version(Android-SDK-Platform-tools VERSION r25.0.5) +hunter_default_version(Android-SDK-Tools VERSION 25.2.5) +hunter_default_version(Android-Support-Repository VERSION 47) +hunter_default_version(ARM_NEON_2_x86_SSE VERSION 1.0.0-p0) +hunter_default_version(ArrayFire VERSION 3.3.1-p0) +hunter_default_version(Assimp VERSION 3.2-p1) +hunter_default_version(Async++ VERSION 0.0.3-hunter) +hunter_default_version(Avahi VERSION 0.6.31) +hunter_default_version(Beast VERSION 1.0.0-b84-hunter-0) +hunter_default_version(BZip2 VERSION 1.0.6-p3) +if(MSVC OR MINGW) + # FIXME: https://ci.appveyor.com/project/ingenue/hunter/build/1.0.2229 + hunter_default_version(Boost VERSION 1.64.0) +else() + hunter_default_version(Boost VERSION 1.65.0) +endif() +hunter_default_version(BoostCompute VERSION 0.5-p0) +hunter_default_version(BoostProcess VERSION 0.5) +hunter_default_version(CapnProto VERSION 0.6.1) +hunter_default_version(CLAPACK VERSION 3.2.1) +hunter_default_version(CURL VERSION 7.49.1-DEV-v8) +hunter_default_version(Clang VERSION 4.0.1-p0) +hunter_default_version(ClangToolsExtra VERSION 4.0.1) # Clang +hunter_default_version(Comet VERSION 4.0.2) +hunter_default_version(CppNetlib VERSION 0.10.1-hunter-3) +hunter_default_version(CppNetlibUri VERSION 1.0.4-hunter) +hunter_default_version(CsvParserCPlusPlus VERSION 1.0.1) +hunter_default_version(Eigen VERSION 3.3.4-p0) +hunter_default_version(enet VERSION 1.3.13-p1) +hunter_default_version(Expat VERSION 2.1.1) +if(MSVC) + hunter_default_version(getopt VERSION 1.0.0-p0) +endif() +hunter_default_version(GPUImage VERSION 0.1.6-p6) +hunter_default_version(GSL VERSION 2.1.0-p2) +hunter_default_version(Igloo VERSION 1.1.1-hunter) +hunter_default_version(intsizeof VERSION 2.0.1) +hunter_default_version(Jpeg VERSION 9b-p3) +hunter_default_version(JsonSpirit VERSION 0.0.4-hunter) +if(MSVC_VERSION LESS 1600) + # for VS10 - version without support C++11 + hunter_default_version(jsoncpp VERSION 0.7.0) +else() + hunter_default_version(jsoncpp VERSION 1.8.0) +endif() +hunter_default_version(LAPACK VERSION 3.7.1) +hunter_default_version(LLVM VERSION 4.0.1-p0) # Clang +hunter_default_version(LLVMCompilerRT VERSION 4.0.1-patched) # Clang +hunter_default_version(Leathers VERSION 0.1.6) +hunter_default_version(Leptonica VERSION 1.74.2-p4) +hunter_default_version(Libcxx VERSION 3.6.2) # Clang +hunter_default_version(Libcxxabi VERSION 3.6.2) # Clang +hunter_default_version(librtmp VERSION 2.4.0-p0) +hunter_default_version(Libssh2 VERSION 1.7.0) +hunter_default_version(Lua VERSION 5.3.2) +hunter_default_version(MySQL-client VERSION 6.1.9-p0) +hunter_default_version(NASM VERSION 2.12.02) +hunter_default_version(OpenBLAS VERSION 0.2.20-p0) +hunter_default_version(OpenCL VERSION 2.1-p3) +hunter_default_version(OpenCL-cpp VERSION 2.0.10-p0) +hunter_default_version(OpenCV VERSION 3.3.0-p2) +hunter_default_version(OpenCV-Extra VERSION 3.3.0) +hunter_default_version(OpenNMTTokenizer VERSION 0.2.0-p1) +if(MSVC) + # FIXME: https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1470 + hunter_default_version(OpenSSL VERSION 1.0.2l) +else() + hunter_default_version(OpenSSL VERSION 1.1.0f) +endif() +hunter_default_version(PNG VERSION 1.6.26-p1) +hunter_default_version(PocoCpp VERSION 1.7.8-p0) +hunter_default_version(PostgreSQL VERSION 9.6.3) +hunter_default_version(Protobuf VERSION 3.0.0-p1) + +string(COMPARE EQUAL "${CMAKE_SYSTEM_NAME}" "Linux" _is_linux) +if(_is_linux OR MINGW) + # qt-qml example is broken on Linux + # qt-core example is broken on MinGW + hunter_default_version(Qt VERSION 5.5.1-cvpixelbuffer-2-p9) +else() + hunter_default_version(Qt VERSION 5.9.1-p0) +endif() + +hunter_default_version(QtAndroidCMake VERSION 1.0.9) +hunter_default_version(QtCMakeExtra VERSION 1.0.27) +hunter_default_version(QtQmlManager VERSION 1.0.0) +hunter_default_version(RapidJSON VERSION 1.0.2-p2) +hunter_default_version(RapidXML VERSION 1.13) +hunter_default_version(SDL2 VERSION 2.0.4-p4) +hunter_default_version(SDL_image VERSION 2.0.1-p1) +hunter_default_version(SDL_mixer VERSION 2.0.1-p1) +hunter_default_version(SQLite3 VERSION autoconf-3080803) #R-Tree enabled +hunter_default_version(Sober VERSION 0.1.3) +hunter_default_version(stormlib VERSION 9.21-p1) +hunter_default_version(Sugar VERSION 1.2.2) +hunter_default_version(SuiteSparse VERSION 4.5.1-p1) +hunter_default_version(TIFF VERSION 4.0.2-p3) +hunter_default_version(tommath VERSION 1.0-p2) +hunter_default_version(tomcrypt VERSION 1.17-p3) +hunter_default_version(WTL VERSION 9.1.5321) +hunter_default_version(WDC VERSION 1.1.1) +hunter_default_version(Washer VERSION 0.1.2) +hunter_default_version(WinSparkle VERSION 0.4.0) +hunter_default_version(ZLIB VERSION 1.2.8-p3) +hunter_default_version(ZMQPP VERSION 4.1.2) +hunter_default_version(ZeroMQ VERSION 4.1.4-p2) +hunter_default_version(caffe VERSION rc3-p2) +hunter_default_version(Catch VERSION 1.8.2-p0) +hunter_default_version(aes VERSION 0.0.1-p1) +hunter_default_version(aglet VERSION 1.2.0) +hunter_default_version(autobahn-cpp VERSION 0.2.0) +hunter_default_version(boost-pba VERSION 1.0.0-p0) +hunter_default_version(ccv VERSION 0.7-p6) +hunter_default_version(cereal VERSION 1.2.2-p0) +hunter_default_version(ceres-solver VERSION 1.12.0-p2) +hunter_default_version(clBLAS VERSION 2.10.0-p0) +hunter_default_version(convertutf VERSION 1.0.1) +hunter_default_version(crashpad VERSION v0.0.1-p0) +hunter_default_version(crashup VERSION 0.0.2) +hunter_default_version(cvmatio VERSION 1.0.27-p3) +hunter_default_version(cxxopts VERSION 1.0.0-p0) +hunter_default_version(czmq VERSION 4.0.2-p1) +hunter_default_version(damageproto VERSION 1.2.1) +hunter_default_version(dbus VERSION 1.10.0-hunter-4) +hunter_default_version(dest VERSION 0.8.0-p4) +hunter_default_version(dlib VERSION 19.6-p0) +hunter_default_version(doctest VERSION 1.2.0) +hunter_default_version(double-conversion VERSION 3.0.0) +hunter_default_version(dri2proto VERSION 2.8) +hunter_default_version(dri3proto VERSION 1.0) +hunter_default_version(drishti_assets VERSION 1.8) +hunter_default_version(drishti_faces VERSION 1.2) +hunter_default_version(drm VERSION 2.4.67) +hunter_default_version(eigen3-nnls VERSION 1.0.0) +hunter_default_version(eos VERSION 0.12.1) +hunter_default_version(FakeIt VERSION 2.0.3) +hunter_default_version(fixesproto VERSION 5.0) +hunter_default_version(flatbuffers VERSION 1.3.0-p3) +hunter_default_version(flex VERSION 2.6.4) +hunter_default_version(fmt VERSION 4.0.0) +hunter_default_version(freetype VERSION 2.6.2) +hunter_default_version(gauze VERSION 0.1.1) +hunter_default_version(geos VERSION 3.4.2) +hunter_default_version(gflags VERSION 2.2.1) +hunter_default_version(glew VERSION 2.0.0) +hunter_default_version(glfw VERSION 3.3.0-p4) +hunter_default_version(glm VERSION 0.9.8.5) +hunter_default_version(glog VERSION 0.3.5-p1) +hunter_default_version(glproto VERSION 1.4.17) +hunter_default_version(half VERSION 1.1.0-p1) +hunter_default_version(hdf5 VERSION 1.8.15-p1) +hunter_default_version(hunter_box_1 VERSION 1.0.0) +hunter_default_version(ice VERSION 1.0.8) +hunter_default_version(imshow VERSION 1.0.0-p0) +hunter_default_version(inputproto VERSION 2.2) +hunter_default_version(intltool VERSION 0.51.0) +hunter_default_version(ios_sim VERSION 3.1.1) +hunter_default_version(ippicv VERSION 20151201) +hunter_default_version(irrXML VERSION 1.2) +hunter_default_version(kbproto VERSION 1.0.6) +hunter_default_version(libdaemon VERSION 0.14) +hunter_default_version(libjson-rpc-cpp VERSION 0.7.0-p3) +hunter_default_version(libogg VERSION 1.3.2-cmake3) +hunter_default_version(libsodium VERSION 1.0.10) +hunter_default_version(libuv VERSION 1.14.0-p1) +hunter_default_version(libxml2 VERSION 2.9.4) +hunter_default_version(libyuv VERSION 1514-p3) +hunter_default_version(log4cplus VERSION 1.2.0-p0) +hunter_default_version(lzma VERSION 5.2.3-p4) +hunter_default_version(mini_chromium VERSION 0.0.1-p2) +hunter_default_version(minizip VERSION 1.0.1-p1) +hunter_default_version(mpark_variant VERSION 1.0.0) +hunter_default_version(msgpack VERSION 1.4.1-p2) +hunter_default_version(mtplz VERSION 0.1-p3) +hunter_default_version(nanoflann VERSION 1.2.3-p0) +hunter_default_version(nlohmann_json VERSION 2.1.1-p1) +hunter_default_version(odb VERSION 2.4.0) +hunter_default_version(odb-boost VERSION 2.4.0) +hunter_default_version(odb-compiler VERSION 2.4.0) +hunter_default_version(odb-mysql VERSION 2.4.0) +hunter_default_version(odb-pgsql VERSION 2.4.0) +hunter_default_version(odb-sqlite VERSION 2.4.0) +hunter_default_version(ogles_gpgpu VERSION 0.2.1) +hunter_default_version(onmt VERSION 0.4.1-p2) +hunter_default_version(openddlparser VERSION 0.1.0-p2) +hunter_default_version(pciaccess VERSION 0.13.4) +hunter_default_version(poly2tri VERSION 1.0.0) +hunter_default_version(polyclipping VERSION 4.8.8-p0) # for Assimp +hunter_default_version(presentproto VERSION 1.0) +hunter_default_version(pthread-stubs VERSION 0.3) +hunter_default_version(pugixml VERSION 1.8.1) +hunter_default_version(rabbitmq-c VERSION 0.7.0-p1) +hunter_default_version(randrproto VERSION 1.3.2) +hunter_default_version(renderproto VERSION 0.11.1) +hunter_default_version(sm VERSION 1.2.1) +hunter_default_version(Snappy VERSION 1.1.6-p0) +hunter_default_version(sse2neon VERSION 1.0.0-p0) +hunter_default_version(sparsehash VERSION 2.0.2) +if(MSVC_VERSION LESS 1800) + # for VS12 - version without support C++11 + hunter_default_version(spdlog VERSION 1.0.0-p0) +else() + hunter_default_version(spdlog VERSION 0.13.0-p1) +endif() +hunter_default_version(szip VERSION 2.1.0-p1) +hunter_default_version(Tesseract VERSION 3.05.01-hunter-3) +hunter_default_version(thread-pool-cpp VERSION 1.1.0) +hunter_default_version(tinydir VERSION 1.2-p0) +hunter_default_version(websocketpp VERSION 0.7.0-p2) +hunter_default_version(wxWidgets VERSION 3.0.2) +hunter_default_version(x11 VERSION 1.5.0) +hunter_default_version(x264 VERSION snapshot-20170420-2245) +hunter_default_version(xau VERSION 1.0.7) +hunter_default_version(xcb VERSION 1.11.1) +hunter_default_version(xcb-proto VERSION 1.11) +hunter_default_version(xcursor VERSION 1.1.13) +hunter_default_version(xdamage VERSION 1.1.4) +hunter_default_version(xext VERSION 1.3.1) +hunter_default_version(xextproto VERSION 7.2.1) +hunter_default_version(xf86vidmodeproto VERSION 2.3.1) +hunter_default_version(xfixes VERSION 5.0.1) +hunter_default_version(xgboost VERSION 0.40-p9) +hunter_default_version(xi VERSION 1.6.1) +hunter_default_version(xinerama VERSION 1.1.2) +hunter_default_version(xineramaproto VERSION 1.1.2) +hunter_default_version(xorg-macros VERSION 1.17) +hunter_default_version(xproto VERSION 7.0.23) +hunter_default_version(xrandr VERSION 1.3.2) +hunter_default_version(xrender VERSION 0.9.7) +hunter_default_version(xshmfence VERSION 1.2) +hunter_default_version(xtrans VERSION 1.2.7) +hunter_default_version(xxf86vm VERSION 1.1.2) +hunter_default_version(yaml-cpp VERSION 0.5.3) + +if(MSVC80) + hunter_default_version(GTest VERSION 1.7.0-hunter-6) +else() + hunter_default_version(GTest VERSION 1.8.0-hunter-p7) +endif() + +if(ANDROID) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "" _is_empty) + if(_is_empty) + hunter_user_error("CMAKE_SYSTEM_VERSION is empty") + endif() + + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "21" _is_api_21) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "19" _is_api_19) + string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "16" _is_api_16) + + if(_is_api_21) + hunter_default_version(Android-Google-APIs VERSION 21_r01) + hunter_default_version(Android-Google-APIs-Intel-x86-Atom-System-Image VERSION 21_r10) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 21) + hunter_default_version(Android-SDK-Platform VERSION 21_r02) + hunter_default_version(Sources-for-Android-SDK VERSION 21) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 21_r04) + elseif(_is_api_19) + hunter_default_version(Android-Google-APIs VERSION 19_r18) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 19) + hunter_default_version(Android-SDK-Platform VERSION 19_r04) + hunter_default_version(Sources-for-Android-SDK VERSION 19) + hunter_default_version(Android-ARM-EABI-v7a-System-Image VERSION 19_r05) + elseif(_is_api_16) + hunter_default_version(Android-Google-APIs VERSION 16_r04) + hunter_default_version(Android-Intel-x86-Atom-System-Image VERSION 16) + hunter_default_version(Android-SDK-Platform VERSION 16_r05) + hunter_default_version(Sources-for-Android-SDK VERSION 16) + else() + hunter_user_error( + "Android API (CMAKE_SYSTEM_VERSION)" + " Expected: `21`, `19`, `16`" + " Got: `${CMAKE_SYSTEM_VERSION}`" + ) + endif() +endif() + +hunter_default_version(zookeeper VERSION 3.4.9-p2) +hunter_default_version(tacopie VERSION 2.4.0-h1) +hunter_default_version(cpp_redis VERSION 3.5.0-h1) diff --git a/docs/creating-new/hunter-NEW.cmake b/docs/creating-new/hunter-NEW.cmake new file mode 100644 index 000000000..05c7b14eb --- /dev/null +++ b/docs/creating-new/hunter-NEW.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + hunter_box_1 + VERSION + 1.0.0 + URL + "https://github.com/hunterbox/hunter_box_1/archive/v1.0.0.tar.gz" + SHA1 + 4fa7fe75629f148a61cedc6ba0bce74f177a6747 +) + +hunter_add_version( + PACKAGE_NAME + hunter_box_1 + VERSION + 1.0.1 + URL + "https://github.com/hunterbox/hunter_box_1/archive/v1.0.1.tar.gz" + SHA1 + 10d046eec6c8b0aabd28bd3d1b99faf6beeb226b +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(hunter_box_1) +hunter_download(PACKAGE_NAME hunter_box_1) diff --git a/docs/creating-new/hunter.cmake b/docs/creating-new/hunter.cmake new file mode 100644 index 000000000..3253e79fa --- /dev/null +++ b/docs/creating-new/hunter.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_cacheable) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + hunter_box_1 + VERSION + 1.0.0 + URL + "https://github.com/hunterbox/hunter_box_1/archive/v1.0.0.tar.gz" + SHA1 + 4fa7fe75629f148a61cedc6ba0bce74f177a6747 +) + +hunter_pick_scheme(DEFAULT url_sha1_cmake) +hunter_cacheable(hunter_box_1) +hunter_download(PACKAGE_NAME hunter_box_1) diff --git a/docs/creating-new/images/branches.png b/docs/creating-new/images/branches.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee14b802e0da1930bfd6abd5b1347ec311dc5d2 GIT binary patch literal 93738 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 literal 0 HcmV?d00001 diff --git a/docs/creating-new/images/pr-change-branch.png b/docs/creating-new/images/pr-change-branch.png new file mode 100644 index 0000000000000000000000000000000000000000..81aace052f22c7484de656ef10b2f35c73972732 GIT binary patch literal 35919 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 literal 0 HcmV?d00001 diff --git a/docs/creating-new/images/pr-number.png b/docs/creating-new/images/pr-number.png new file mode 100644 index 0000000000000000000000000000000000000000..9791ba5d7a9ca10af89042715f00be43a3efb9cc GIT binary patch literal 17239 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
  • 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 F{}&HU=%@ey literal 0 HcmV?d00001 diff --git a/docs/creating-new/images/pull-request.png b/docs/creating-new/images/pull-request.png new file mode 100644 index 0000000000000000000000000000000000000000..f7998e3c148ae47d7f359c22a2d06a32a206ff0a GIT binary patch literal 32520 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 E3s-BD_5c6? literal 0 HcmV?d00001 diff --git a/docs/creating-new/images/release.png b/docs/creating-new/images/release.png new file mode 100644 index 0000000000000000000000000000000000000000..7bf8332ad3b4f0985b4d27a9d7d89b0d9668ae2c GIT binary patch literal 20667 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

    ~< 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

    F!T!k+V{Zi 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≈GA?A3M*IHDy<>J20IW#==};5g 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 a1M^#LTg+OjDP;`wPhD9{saDY<` dependency. The project is a slight +modification of the +`HelloJni sample `__. + +.. admonition:: Examples on GitHub + + * `Android Studio with Hunter `__ + +.. note:: + + The code was tested with Android Studio: 3.3, 3.4.1, 3.5 beta 2 + +Check you have at least CMake 3.9.2. Such a requirement needed to work with +`Android NDK r16+ `__: + +.. code-block:: none + :emphasize-lines: 1, 3 + + > cmake --version + + cmake version 3.9.2 + + CMake suite maintained and supported by Kitware (kitware.com/cmake). + +Check you have Ninja build tool installed: + +.. code-block:: none + + > which ninja + /usr/bin/ninja + +You can use your system package manager +(e.g., on Ubuntu do ``sudo apt-get install ninja-build``) +or download it from GitHub releases, unpack and add to ``PATH``: + +* https://github.com/ninja-build/ninja/releases + +Get the sources: + +.. code-block:: none + :emphasize-lines: 1 + + > git clone https://github.com/forexample/android-studio-with-hunter + > cd android-studio-with-hunter + [android-studio-with-hunter]> + +Android Studio project configuration files reside in the ``android-studio`` +directory but before opening it you have to create the ``local.properties`` file +and add the ``cmake.dir`` entry there. + +.. seealso:: + + * `Android Studio: Use CMake 3.7 or higher `__ + +You may want to add the paths to Android NDK/SDK as well (if ``ndk.dir`` and +``sdk.dir`` not present in ``local.properties`` then they will be set by +Android Studio to default locations): + +.. code-block:: none + :emphasize-lines: 6 + + [android-studio-with-hunter]> cd android-studio + [android-studio-with-hunter/android-studio]> cat local.properties + + ndk.dir=/home/your/path/to/android-sdk/ndk-bundle + sdk.dir=/home/your/path/to/android-sdk + cmake.dir=/home/your/path/to/cmake + +.. hint:: + + Since ``local.properties`` contains information about a local machine + you should add it to + `.gitignore `__. + +.. warning:: + + Android NDK r19+ is :ref:`not supported `. You **have to** + switch to a lower version explicitly, e.g. to NDK r18b. + +Please check that ``cmake.dir`` has such value that ``/bin/cmake`` +executable exists. + +At this moment you can launch Android Studio and open your project but +note that Gradle will start configuring, it will trigger CMake configuration +which will trigger Hunter builds for 3 architectures: + +.. code-block:: none + :emphasize-lines: 11 + + [android-studio-with-hunter/android-studio]> cat app/build.gradle + + android { + ... + defaultConfig { + ... + abi { + enable true + + reset() + include 'x86_64', 'armeabi-v7a', 'arm64-v8a' + + universalApk false + } + } + ... + } + +As an alternative, you are able to build one architecture at a +time using ``-Parch=``: + +.. code-block:: none + :emphasize-lines: 1 + + [android-studio-with-hunter/android-studio]> ./gradlew asDebug -Parch=arm64-v8a + + > Task :app:externalNativeBuildDebug + Build hello-jni arm64-v8a + [1/2] Building CXX object CMakeFiles/hello-jni.dir/hello-jni.cpp.o + [2/2] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libhello-jni.so + + BUILD SUCCESSFUL in 4s + 30 actionable tasks: 2 executed, 28 up-to-date + +CMake binary directory will be set to +``app/.externalNativeBuild/cmake/debug/arm64-v8a/``, you can find CMake logs +there: + +.. code-block:: none + + [android-studio-with-hunter/android-studio]> grep 'Hunter-ID' app/.externalNativeBuild/cmake/debug/arm64-v8a/cmake_build_output.txt + + [hunter] [ Hunter-ID: 4959eb9 | Toolchain-ID: 8e0b164 | Config-ID: 48b836e ] + +Or even start CMake build without using Gradle: + +.. code-block:: none + :emphasize-lines: 2 + + [android-studio-with-hunter/android-studio]> touch ../CMakeLists.txt + [android-studio-with-hunter/android-studio]> cmake --build app/.externalNativeBuild/cmake/debug/arm64-v8a + [1/1] Re-running CMake... + -- [hunter *** DEBUG *** 2018-07-25T19:52:14] HUNTER_ROOT set using HOME environment variable + ... + -- [hunter] [ Hunter-ID: 4959eb9 | Toolchain-ID: 8e0b164 | Config-ID: 48b836e ] + ... + -- Configuring done + -- Generating done + -- Build files have been written to: /.../android-studio-with-hunter/android-studio/app/.externalNativeBuild/cmake/debug/arm64-v8a + [1/1] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libhello-jni.so + +Issues +====== + +Detached CMake +~~~~~~~~~~~~~~ + +If Gradle build fails the underlying CMake process will **keep running**. + +.. code-block:: none + + > ./gradlew assembleDebug -Parch=armeabi-v7a + ... + + * What went wrong: + Execution failed for task ':app:generateJsonModelDebug'. + > Format specifier '%s' + +CMake is active: + +.. code-block:: none + + > ps aux | grep cmake + + ... cmake -E server --experimental --debug + ... cmake --build /.../__HUNTER/_Base/87420eb/2e091e5/84f821a/Build/OpenCV/Build + ... cmake -E touch /.../__HUNTER/_Base/87420eb/2e091e5/84f821a/Build/OpenCV/Build/OpenCV-Release-prefix/src/OpenCV-Release-stamp/OpenCV-Release-download + ... cmake -P /.../__HUNTER/_Base/87420eb/2e091e5/84f821a/Build/OpenCV/Build/OpenCV-Release-prefix/src/OpenCV-Release-stamp/download-OpenCV-Release.cmake + +Internal files locked: + +.. code-block:: none + + > lslocks | grep cmake.lock + + cmake ... /.../__HUNTER/_Base/Download/OpenCV/4.0.0-p0/90680ea/cmake.lock + cmake ... /.../__HUNTER/_Base/87420eb/2e091e5/84f821a/cmake.lock + +You **should not** run Gradle build again, wait for CMake job to finish +or force it to stop (e.g., ``kill -9``). + +See issues: + +- https://issuetracker.google.com/issues/123895238 +- https://issuetracker.google.com/issues/75268076 + +No CMake files +~~~~~~~~~~~~~~ + +Not all CMake files necessary for the build will be created if the initial +configure step will fail. In this case, you can add ``return()`` command +right **after the first hunter_add_package** call (this is where initialization +is happening and all ``*-ID`` calculated) to mimic successful CMake +configure step: + +.. code-block:: cmake + :emphasize-lines: 3 + + # ... + hunter_add_package(md5) + return() # Early exit + +Run Gradle again: + +.. code-block:: none + + [android-studio-with-hunter/android-studio]> ./gradlew asDebug -Parch=arm64-v8a + +Remove ``return()`` from CMake code, now you will be able to run CMake: + +.. code-block:: none + + [android-studio-with-hunter/android-studio]> cmake --build app/.externalNativeBuild/cmake/debug/arm64-v8a + +Example of how it can be done in a continuous integration build: + +- `CMakeLists.txt `__ +- `Testing script `__ + +.. _android ndk r19: + +Android NDK r19+ +~~~~~~~~~~~~~~~~ + +Android NDK r19 is not supported by built-in CMake modules +(which is a requirement). The workaround is to download and use Android +NDK r18 or lower: + +- https://developer.android.com/ndk/downloads/older_releases.html + +and add path to NDK to ``local.properties``: + +.. code-block:: none + :emphasize-lines: 1 + + ndk.dir=/home/your/path/to/android-ndk-r18 + sdk.dir=/home/your/path/to/android-sdk + cmake.dir=/home/your/path/to/cmake + +.. seealso:: + + - https://gitlab.kitware.com/cmake/cmake/issues/18739 + - https://gitlab.kitware.com/cmake/cmake/issues/18787 + + +Project +======= + +Open Android Studio project, connect your device and click +``Run 'app' (Shift + F10)``. You should see ``HelloJni`` based application +started: + +.. image:: android-studio-hello-jni.png + :align: center + :alt: HelloJni screenshot + :width: 80% + +If you take a look at ``CMakeLists.txt`` of the project you will find +the option for keeping third party sources: + +.. code-block:: cmake + + option(HUNTER_KEEP_PACKAGE_SOURCES "Keep third party sources" ON) + +.. warning:: + + Please make sure to read documentation about + :ref:`HUNTER_KEEP_PACKAGE_SOURCES ` + before adding it to your project. + +It means that debugger can be used to step into md5 package source code. +Open ``hello-jni.cpp`` file and set the breakpoint to ``md5_append`` call: + +.. image:: android-studio-breakpoint.png + :align: center + :alt: HelloJni breakpoint + +Click ``Debug 'app' (Shift + F9)`` to run an application in Debug mode. +After the application started click ``CALCULATE`` button on the device. +When debugger will reach ``md5_append`` call click ``Step Into (F7)``. +As you can see debugger stepped into the ``md5.c`` source code of third party +md5 package and "data" with value "Some string" passed to "md5_append" function: + +.. image:: android-studio-debugger.png + :align: center + :alt: HelloJni debugger + +Integration +=========== + +Here is a description of the integration approach. + +:doc:`CMake toolchain file ` used to +customize third party packages builds in Hunter. And since Android Studio +provides it's own toolchain for a build such action do introduce a little quirk. +Some of the variables like ``ANDROID_ABI`` was read from a command line and is +not part of the toolchain, hence Hunter will not forward them to third parties. +A user also may want to add extra settings to the toolchain. And one more problem is +that variables provided by Android Studio toolchain little bit differ from +ones expected by a project that relies on ``CMAKE_ANDROID_*`` conventions +(introduced in CMake 3.7). + +As a workaround for all the issues above, we can inject our own toolchain with +``FORCE``. + +Add extra CMake argument to ``build.gradle`` configuration: + +.. code-block:: none + :emphasize-lines: 4-6 + + externalNativeBuild { + cmake { + arguments '-DANDROID_STL=c++_static', + // Extra custom variable to + // trigger workaround code. + '-DHELLOJNI_ANDROID_STUDIO=1' + } + } + +.. note:: + + Please name this variable next to your project to avoid clashes with + other projects that can be added by ``add_subdirectory``. + +Use this variable for triggering CMake workaround code, note that toolchain +should be set **before** first ``project`` command: + +.. code-block:: cmake + + if(HELLOJNI_ANDROID_STUDIO) + set(gen_toolchain "${CMAKE_CURRENT_BINARY_DIR}/generated/toolchain.cmake") + configure_file( + "${CMAKE_CURRENT_LIST_DIR}/cmake/template/toolchain.cmake.in" + "${gen_toolchain}" + @ONLY + ) + set(CMAKE_TOOLCHAIN_FILE "${gen_toolchain}" CACHE PATH "" FORCE) + endif() + + # ... + + project(...) + +The content of the latest ``toolchain.cmake.in`` template can be found here: + +* https://github.com/forexample/android-studio-with-hunter/blob/master/cmake/template/toolchain.cmake.in diff --git a/docs/faq/foo-v1.0-hunter.cmake b/docs/faq/foo-v1.0-hunter.cmake new file mode 100644 index 000000000..b121cfb8e --- /dev/null +++ b/docs/faq/foo-v1.0-hunter.cmake @@ -0,0 +1,7 @@ +if(WIN32) + hunter_add_package(boo) + find_package(boo CONFIG REQUIRED) +endif() + +hunter_add_package(bar) +find_package(bar CONFIG REQUIRED) diff --git a/docs/faq/foo-v1.0.cmake b/docs/faq/foo-v1.0.cmake new file mode 100644 index 000000000..f62469c72 --- /dev/null +++ b/docs/faq/foo-v1.0.cmake @@ -0,0 +1,5 @@ +if(WIN32) + find_package(boo CONFIG REQUIRED) +endif() + +find_package(bar CONFIG REQUIRED) diff --git a/docs/faq/foo-v2.0-hunter.cmake b/docs/faq/foo-v2.0-hunter.cmake new file mode 100644 index 000000000..f8d169025 --- /dev/null +++ b/docs/faq/foo-v2.0-hunter.cmake @@ -0,0 +1,7 @@ +if(FOO_WITH_BAZ) + hunter_add_package(baz) + find_package(baz CONFIG REQUIRED) +endif() + +hunter_add_package(bar) +find_package(bar CONFIG REQUIRED) diff --git a/docs/faq/foo-v2.0.cmake b/docs/faq/foo-v2.0.cmake new file mode 100644 index 000000000..1751d6206 --- /dev/null +++ b/docs/faq/foo-v2.0.cmake @@ -0,0 +1,5 @@ +if(FOO_WITH_BAZ) + find_package(baz CONFIG REQUIRED) +endif() + +find_package(bar CONFIG REQUIRED) diff --git a/docs/faq/how-to-download-private-github-asset.rst b/docs/faq/how-to-download-private-github-asset.rst new file mode 100644 index 000000000..bc6af24e9 --- /dev/null +++ b/docs/faq/how-to-download-private-github-asset.rst @@ -0,0 +1,67 @@ +.. Copyright (c) 2018, Ruslan Baratov +.. All rights reserved. + +How to download private GitHub asset? +------------------------------------- + +If you want to download private GitHub asset you have to use GitHub API. +First you have to find out URL with asset id. For example get info about tag +``v3.2.1`` using ``curl`` command: + +.. code-block:: none + + > curl -s -u \ + ${username}:${token} \ + https://api.github.com/repos/${orgname}/${reponame}/releases/tags/v3.2.1 + +Name, id and URL of asset: + +.. code-block:: none + :emphasize-lines: 6, 8 + + > curl -s -u \ + ${username}:${token} \ + https://api.github.com/repos/${orgname}/${reponame}/releases/tags/v3.2.1 \ + | grep -A3 '"url":.*assets' + + "url": "https://api.github.com/repos/.../.../releases/assets/7654321", + "id": 7654321, + "name": "hello.txt", + "label": null, + +Use asset URL in +:doc:`hunter_private_data ` and +add extra ``Accept:application/octet-stream`` header: + +.. code-block:: cmake + :emphasize-lines: 4, 7 + + # CMakeLists.txt + + hunter_private_data( + URL "https://api.github.com/repos/${orgname}/${reponame}/releases/assets/7654321" + SHA1 "..." + CREDENTIALS "github" + HTTPHEADER "Accept:application/octet-stream" + FILE hello.txt + LOCATION myfile + ) + +Add GitHub credentials using +:doc:`hunter_private_data_password `: + +.. code-block:: cmake + :emphasize-lines: 4 + + # ~/.config/Hunter/passwords.cmake + + hunter_private_data_password( + CREDENTIALS "github" + USERNAME "${username}" + PASSWORD "${github_token}" + ) + +.. seealso:: + + * `GitHub API: Get release by tag name `__ + * `GitHub API: Get a single release asset `__ diff --git a/docs/faq/how-to-fix-download-error.rst b/docs/faq/how-to-fix-download-error.rst new file mode 100644 index 000000000..5be86e81b --- /dev/null +++ b/docs/faq/how-to-fix-download-error.rst @@ -0,0 +1,57 @@ +.. Copyright (c) 2018, Ruslan Baratov +.. All rights reserved. + +How to fix download error? +-------------------------- + +Unsupported protocol +==================== + +Most sources downloaded by HTTPS protocol so CMake should be build with +CURL with enabled OpenSSL. Without HTTPS support you will see this error: + +.. code-block:: none + + error: downloading + 'https://...' failed + + status_code: 1 + status_string: "Unsupported protocol" + log: Protocol "https" not supported or disabled in libcurl + + Closing connection -1 + +.. note:: + + * `Example of building CMake with CURL + OpenSSL `__ + +You can check that everything is fine by invoking this script: + +.. code-block:: cmake + + # script.cmake + + cmake_minimum_required(VERSION 3.2) + + file( + DOWNLOAD + "https://github.com/ruslo/hunter/archive/v0.23.13.tar.gz" + "${CMAKE_CURRENT_LIST_DIR}/hunter-archive.tar.gz" + EXPECTED_HASH SHA1=ef7d6ac5a4ba88307b2bea3e6ed7206c69f542e8 + SHOW_PROGRESS + TLS_VERIFY ON + ) + +.. code-block:: none + + > cmake -P script.cmake + +TLS issues +========== + +.. admonition:: TODO + + Real fix instructions here + +If you have any problems with TLS verification you can suppress TLS checks +by setting :ref:`HUNTER_TLS_VERIFY ` to ``OFF``. diff --git a/docs/faq/how-to-fix-hash-mismatch-error.rst b/docs/faq/how-to-fix-hash-mismatch-error.rst new file mode 100644 index 000000000..882b4451a --- /dev/null +++ b/docs/faq/how-to-fix-hash-mismatch-error.rst @@ -0,0 +1,66 @@ +.. Copyright (c) 2018, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + da + ee + bfef + afd + +How to fix hash mismatch error? +------------------------------- + +da39a3ee5e6b4b0d3255bfef95601890afd80709 +======================================== + +If you see error like this: + +.. code-block:: none + + does not match expected value + expected: '...' + actual: 'da39a3ee5e6b4b0d3255bfef95601890afd80709' + +It means you're experiencing some +:doc:`download error `. + +``da39a3ee5e6b4b0d3255bfef95601890afd80709`` is a hash of an empty file: + +.. code-block:: none + + > echo -n "" | openssl sha1 + (stdin)= da39a3ee5e6b4b0d3255bfef95601890afd80709 + +Other +===== + +GitHub creates release archives on-the-fly and they are not guaranteed to be +stable. This fact was discovered after few years of relying on the assumption +of stability of such archives :) + +In most cases the problem can be solved just by updating Hunter to latest +version and using latest packages version in case you have saved non-default +versions in ``LOCAL``. + +There will be no automatic update of hashes introduced since it affects binary +cache, hence all the packages should be re-uploaded. And upload procedure is not +automatic yet. Instead update will be introduced on demand. + +The best solution is to find archive with old SHA1 in local +:ref:`Download directory `. Then upload it as asset +attached to the same release tag and add new URL to Hunter. In this case it +will fix new builds and keep old cache binaries, feel free to open new issue +and provide the link to old archive. + +.. seealso:: + + * https://github.com/ruslo/hunter/issues/1032 + +.. note:: + + It's not a Hunter specific issue. All tools that rely on the stability of + GitHub archives was affected, as an example: + + * https://github.com/Homebrew/homebrew-core/issues/18044 + * https://github.com/libgit2/libgit2/issues/4343 diff --git a/docs/faq/why-do-we-need-forks.rst b/docs/faq/why-do-we-need-forks.rst new file mode 100644 index 000000000..18e4df2e5 --- /dev/null +++ b/docs/faq/why-do-we-need-forks.rst @@ -0,0 +1,174 @@ +.. spelling:: + + rebase + +Why do we need forks? +--------------------- + +:doc:`Forks ` put the burden of pushing new +branches/releases from upstream, merging and resolving conflicts by maintainers +and at the first view look like a bad, aggressively intrusive choice. But in +practice it's the clearest, robust and universal solution for all the issues +related to integration of package into Hunter. + +.. note:: + + Forks are not requirement. Hunterization changes can be pushed upstream + without affecting main functionality, see + :doc:`compatibility ` for details. And if package + has no dependencies it **can be used as is** in Hunter, + see :doc:`examples `. + +.. note:: + + As already noted :doc:`here ` all the issues that are + not related to hunterization should be pushed upstream. Including most of + the issues described in this section. + +Solution for bundled sources +============================ + +Take a look at this example: + +* https://github.com/dmlc/rabit/tree/0759d5ed2bfa1ecfc8f00ab955d8618db474f280/include + +Here package ``rabit`` has bundled dependencies ``dmlc``. In fact ``dmlc`` +folder is a separated project and lives here: + +* https://github.com/dmlc/dmlc-core/tree/c0871823b518093a0d04d6cba0a3291bc7b31401/include + +Assuming that we can't change the order of include paths (local includes +should have higher priority than external because different version of same +package itself can be installed in system) there is no "soft" solution here +and the only way to integrate package is **to remove** ``dmlc`` folder from +sources. In practice it means forking the project and applying "remove folder" +patch. Note that it really doesn't depend on the package manager, build system +or C++ compiler. All C++ compilers works similar to + +.. code-block:: none + + > c++ -I/path/to/local -I/path/to/external ... + +Meaning ``#include `` will always fall to the choice of picking +local files. + +Set of patch files +================== + +Another way to avoid forks is to keep needed ``*.patch`` files in Hunter and +apply them to upstream releases before running build instructions. Such approach +used by `Homebrew `__ and `Gentoo `__ +for example. In practice such set of patches can be quite big, e.g. 19 commits +for package ``OpenCV`` (add ``HunterGate`` module, lock version in +``HunterGate``, adding ``hunter_add_package`` calls, applying ``ANDROID_*`` +variables introduced by new CMake version and general improvements): + +* https://github.com/hunter-packages/opencv/pull/21/commits + +Note that Hunter keep all available ``OpenCV`` versions in +``cmake/projects/OpenCV/hunter.cmake`` file: + +* https://github.com/ruslo/hunter/blob/e412a3a1e9d58056efb56cb75440aead83f2e9e5/cmake/projects/OpenCV/hunter.cmake + +At this moment there are 29 versions of ``OpenCV`` available for users, hence +it will be 19 x 29 = 551 ``*.patch`` files to maintain. Some of them can be +shared between versions, some of them can be fused with each other, etc. +If such approach will be chosen we will end up with system for maintaining +patches, but there is no need to reinvent the wheel, such system already +exist and called ``Git``. Assuming the fact that Hunter project hosted on +GitHub and GitHub offer free unlimited repositories for public projects there +are no real reasons to choose ``*.patch`` approach over forks. The use of +the forks allow us to rebase, merge, cherry-pick, discuss and review the patches +easily. + +High cohesion +============= + +High cohesion means that you should keep parts of a code base that are related +to each other in a single place [1]_. The fact that version ``v1.0`` of package +``Foo`` works fine with Hunter archive ``v0.10`` is perfectly expressed by +adding child commit ``Add Hunter v0.10`` to parent commit ``Foo v1.0``. Change +of dependencies from version to version is another example. + +``Foo`` version ``v1.0``: + +.. literalinclude:: foo-v1.0.cmake + :language: cmake + +``Foo`` version ``v2.0``: + +.. literalinclude:: foo-v2.0.cmake + :language: cmake + +It's hard to make a mistake in both cases: + +.. literalinclude:: foo-v1.0-hunter.cmake + :diff: foo-v1.0.cmake + +.. literalinclude:: foo-v2.0-hunter.cmake + :diff: foo-v2.0.cmake + +It will be much easier to miss something while trying to support any +fork-free approach: + +.. code-block:: cmake + + if(FOO_VERSION VERSION_EQUAL 1.0 AND WIN32) + magic_download(boo) + endif() + + if(FOO_VERSION VERSION_EQUAL 2.0 AND FOO_WITH_BAZ) + magic_download(baz) + endif() + + magic_download(bar) + +Any non-CMake custom build scheme suffers from this problem since build +instructions have to know everything about all versions available, +e.g. see +`Boost components `__ +. + +.. [1] http://enterprisecraftsmanship.com/2015/09/02/cohesion-coupling-difference/ + +Rejected/pending CMake patches +============================== + +Having CMake build instructions in package is the easiest way to integrate +package into Hunter (but not the only one) however +`not all developers of the upstream projects are ready to accept CMake code `__ +because it may put burden +on maintaining another build system (if CMake added as extra build system), +learning new build system (if you want to substitute existing system with CMake) +or increase CMake minimum version to introduce new code. +https://github.com/hunter-packages is a central place where CMake friendly code +can leave and shared with others. + +Removing usage of FindXXX.cmake +=============================== + +Overwhelming majority of projects use ``FindXXX.cmake`` (or even something like +``find_library``) instead of recommended ``XXXConfig.cmake`` approach, +effectively making project non-relocatable. It's not a problem for the package +managers that are using single-root directory (e.g. ``/usr/lib`` for +``apt-get`` on Ubuntu and ``/usr/local/lib`` for ``brew`` on OSX) but since +Hunter allow to have +:doc:`multiple custom configurations ` +it will not work. + +.. seealso:: + + * :ref:`Creating new package: Install XXXConfig.cmake ` + +.. admonition:: CGold + + * `Rejected: FindXXX.cmake `__ + +Lock URL/SHA1 in HunterGate +=========================== + +Even if all the issues will be resolved and +:doc:`'hunter_add_package' will be called by hook inside 'find_package' ` +it's still will be convenient to save latest successful 3rd parties +configuration for debugging purposes. In terms of Hunter it means attaching +URL/SHA1 arguments of ``HunterGate`` to some commit. diff --git a/docs/faq/why-do-we-need-hunter-add-package.rst b/docs/faq/why-do-we-need-hunter-add-package.rst new file mode 100644 index 000000000..096d7babf --- /dev/null +++ b/docs/faq/why-do-we-need-hunter-add-package.rst @@ -0,0 +1,89 @@ +Why do we need hunter_add_package? +---------------------------------- + +Usually ``hunter_add_package(foo)`` call placed right before similar +``find_package(foo ...)`` call, hence it raise the question: "If most of the +information is inside ``find_package`` already will it be possible to get rid +of the ``hunter_add_package``?". + +TL;DR It is possible but implementation will be tricky and usefulness of such +feature in practice is quite questionable. + +* Not all type of packages does found by ``find_package``. For example extra + sources or data for testing use ``*_ROOT`` variables which added to the + current scope by ``hunter_add_package``: + + .. code-block:: cmake + + hunter_add_package(foo_extra) + add_subdirectory(${FOO_EXTRA_ROOT}) + + hunter_add_package(foo_data) + add_test(NAME foo_test COMMAND foo --use-data "${FOO_DATA_ROOT}/pic.png") + + Meaning that ``hunter_add_package`` will still exist and user will have to + remember that sometimes magical download hook is inside ``find_package`` and + sometimes ``hunter_add_package`` have to be called explicitly. + +* Mixing unrelated functionality. ``hunter_add_package(foo)`` will download + and install ``foo`` package while ``find_package(foo)`` should only look up + for files in read-only mode. When user see the code like this: + + .. code-block:: cmake + + hunter_add_package(foo) + find_package(foo 1.22 CONFIG REQUIRED) + + It's clear here that version ``1.22`` will not be used while downloading + package since it goes **after** ``hunter_add_package`` call and result of + ``hunter_add_package`` call is an installed package. If package will be + installed by hook in ``find_package``: + + .. code-block:: cmake + + find_package(foo 1.22 CONFIG REQUIRED) + + User might got a feeling that version ``1.22`` is installed, which is not + guaranteed - version of the package locked before, after + first ``HunterGate`` call + (see :doc:`Config-ID `). + + +* The change of ``find_package`` behavior will have fragile implementation. As + an example: you can introduce custom macro ``find_package`` and call standard + CMake instructions by using ``_find_package``. It's undocumented CMake + feature of saving previous function under underscore starting name. + Overwriting standard CMake calls simply look like a hack in my opinion. I + think if you have an idea that can be solved this way, then it make sense to + either design and implement it in CMake itself or don't touch original code + and wrap your extra functionality in separate function. As you understand + Hunter pick the latter. Also this approach will not work if user will + introduce his own custom ``find_package`` hook, or will use + ``include(FindXXX)``/``find_library``. All this are errors that should be + fixed anyway but it just show an example that you will have to patch the + original code effectively nullifying the benefits of this hook. + +* As showed in :doc:`F.A.Q.: Why do we need forks? ` + the adding of ``hunter_add_package`` is a relatively quite small amount of + code comparing to the rest of the patch needed in practice. Such optimization + is only look useful at the first glance. If you try to do few practical + examples you will see that it's not a big deal and not worth optimization at + all, at least for now. + +So the choice here is between a clean, simple and universal solution introduced +by ``hunter_add_package`` and tricky, undocumented, surprising for user +implementation that will still not cover all the scenarios. + +Some important notes: + +- Adding the ``hunter_add_package`` to your project **do not force you** to + always use only Hunter for dependency management. + See :doc:`Backward compatibility ` for details. + +- Package with CMake and without dependencies can be used **as is** in Hunter. + See :ref:`examples `. + +- If you want to support ``DEB`` packaging in your project you have to modify + CMake code: + + - https://github.com/opencv/opencv/blob/4.0.1/cmake/OpenCVPackaging.cmake#L58-L116 diff --git a/docs/faq/why-hunter-is-slow.rst b/docs/faq/why-hunter-is-slow.rst new file mode 100644 index 000000000..84987ec8e --- /dev/null +++ b/docs/faq/why-hunter-is-slow.rst @@ -0,0 +1,305 @@ +.. Copyright (c) 2018, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + tl + dr + +Why Hunter is slow? +------------------- + +tl;dr It's not. + +General notes +============= + +If package is already installed then overhead for each ``hunter_add_package`` +call is a check of one ``DONE`` stamp file, +e.g. is equal to ``if(EXISTS "/path/to/DONE")``. Penalty for such action is +hardly measurable. + +If package is not installed then an archive with binaries can be +:ref:`downloaded from server `. There will be no source +download step performed for package or dependencies, and of course there will be +no configure/build/install steps. + +If binaries for the package are not available on server then we have to build +package from sources. Archive with sources will be downloaded once, +configure/build/install steps will be performed once too. Results will be +:doc:`shared between several local projects `. + +By default :ref:`HUNTER_STATUS_DEBUG ` option is ``OFF`` +and you may not see some Hunter activity. If you think that Hunter hangs at +some point then this option is probably need to be set to ``ON``. + +Variable :ref:`HUNTER_CONFIGURATION_TYPES ` by +default set to ``Release`` + ``Debug``, meaning that build time is longer about +twice compared to a single ``Release`` build. Final size of the package usually +will be more than twice. + +Use latest +========== + +Prefer latest Hunter version and default package version. E.g. Windows platform +is known to have performance issues while unpacking big archives. On Windows +with default anti-virus turned on Boost 1.66.0 archive took more than 4 minutes +to unpack, if anti-virus turned off it's about 30 (!) seconds (on Linux machine +with the weaker hardware it took less than 10 seconds). Hunter by default used +1.66.0-p0 patched archive with removed examples, tests and documentation. This +reduce the size from 70.7 MB to 17.7 MB, the unpack time dropped to 8 seconds. +As usual downloading from cache is the best option, e.g. Boost.system Release ++ Debug archive has 154 KB size: + +* https://github.com/ingenue/hunter-cache/releases/download/cache-234d975/234d9755a85b09bcd2f266d2620707ccd514020e.tar.bz2 + +.. _id calculation: + +\*-ID calculation +================= + +Each CMake configure step will trigger calculation of +``Hunter-ID``/``Config-ID``/``Toolchain-ID`` triple. While ``Hunter-ID`` and +``Config-ID`` have small overhead, the calculation of ``Toolchain-ID`` for +some generators can be noticeable. To calculate ``Toolchain-ID`` Hunter will +create isolated project with one C++ file, and for example with Xcode generator +it may take much longer then with Makefile generator: + +.. code-block:: none + + > rm -rf _builds + +.. code-block:: cmake + + # CMakeLists.txt + + cmake_minimum_required(VERSION 3.2) + project(foo) + +.. code-block:: none + :emphasize-lines: 1, 8 + + > time cmake -H. -B_builds -GXcode + -- The C compiler identification is AppleClang ... + -- The CXX compiler identification is AppleClang ... + ... + -- Configuring done + -- Generating done + -- Build files have been written to: /.../_builds + cmake -H. -B_builds -GXcode ... 18.305 total + +Same test but Makefile generator: + +.. code-block:: none + :emphasize-lines: 1, 8 + + > time cmake -H. -B_builds + -- The C compiler identification is AppleClang ... + -- The CXX compiler identification is AppleClang ... + ... + -- Configuring done + -- Generating done + -- Build files have been written to: /.../_builds + cmake -H. -B_builds ... 2.400 total + +To skip ``Toolchain-ID`` calculation each time CMake code changed user can add +:ref:`HUNTER_NO_TOOLCHAIN_ID_RECALCULATION=ON ` +option: + +.. code-block:: none + + > rm -rf _builds + +.. code-block:: cmake + :emphasize-lines: 5-9 + + # CMakeLists.txt + + cmake_minimum_required(VERSION 3.2) + + option( + HUNTER_NO_TOOLCHAIN_ID_RECALCULATION + "No Toolchain-ID recalculation" + ON + ) + + include("cmake/HunterGate.cmake") + HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.22.22.tar.gz" + SHA1 "83f7dd182930dee784fafd29745f55e7cd06ca34" + ) + project(foo) + + hunter_add_package(md5) + +Initial ``Toolchain-ID``: + +.. code-block:: none + :emphasize-lines: 3 + + > cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON + ... + -- [hunter] Calculating Toolchain-SHA1 + ... + +Reuse: + +.. code-block:: none + :emphasize-lines: 3 + + > cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON + ... + -- [hunter *** DEBUG *** ...] Toolchain-ID recalculation will be skipped + ... + +When this option is ``ON`` user is responsible for correctness of +``Toolchain-ID`` value on updates of compiler and compiler flags. E.g. you have +to set this option to ``OFF`` explicitly for every local project when you do +change ``CXX`` environment variable, upgrade compiler, update or switch Xcode +version, when you change ``CMAKE_TOOLCHAIN_FILE`` path or content of CMake +toolchain. Violation of this rule can lead to invalid unrecoverable cache state. +Because of this it's highly recommended not to use this option on machine +which can be used to build and upload binaries. Note that Hunter will upload +all archives from ``Cache`` directory, not only packages build by current +local project. + +As an example here are actions that can lead to incorrect cache state: + +.. code-block:: cmake + + # CMakeLists.txt + + cmake_minimum_required(VERSION 3.2) + + option( + HUNTER_NO_TOOLCHAIN_ID_RECALCULATION + "No Toolchain-ID recalculation" + ON + ) + + set( + CMAKE_TOOLCHAIN_FILE + "${CMAKE_CURRENT_LIST_DIR}/toolchain.cmake" + CACHE + FILEPATH + "Default toolchain" + ) + + include("cmake/HunterGate.cmake") + HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.22.22.tar.gz" + SHA1 "83f7dd182930dee784fafd29745f55e7cd06ca34" + ) + project(foo) + + hunter_add_package(gflags) + +.. code-block:: cmake + + # toolchain.cmake + + set(CMAKE_CXX_STANDARD 11) + +Run configure stage to build ``gflags``: + +.. code-block:: none + + > cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON + ... + -- [hunter] [ Hunter-ID: 83f7dd1 | Toolchain-ID: 385a6e9 | Config-ID: 2b427be ] + ... + /usr/bin/g++-7 ... -std=gnu++11 -c /.../gflags_completions.cc + +Toolchain with C++11 standard will have ID ``385a6e9``. + +Now set standard to 14: + +.. code-block:: cmake + + # toolchain.cmake + + set(CMAKE_CXX_STANDARD 14) + +And add "GTest" to CMakeLists.txt: + +.. code-block:: cmake + :emphasize-lines: 27 + + # CMakeLists.txt + + cmake_minimum_required(VERSION 3.2) + + option( + HUNTER_NO_TOOLCHAIN_ID_RECALCULATION + "No Toolchain-ID recalculation" + ON + ) + + set( + CMAKE_TOOLCHAIN_FILE + "${CMAKE_CURRENT_LIST_DIR}/toolchain.cmake" + CACHE + FILEPATH + "Default toolchain" + ) + + include("cmake/HunterGate.cmake") + HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.22.22.tar.gz" + SHA1 "83f7dd182930dee784fafd29745f55e7cd06ca34" + ) + project(foo) + + hunter_add_package(gflags) + hunter_add_package(GTest) + +Run build: + +.. code-block:: none + + > cmake --build _builds + ... + -- [hunter *** DEBUG *** ...] Toolchain-ID recalculation will be skipped + ... + -- [hunter] [ Hunter-ID: 83f7dd1 | Toolchain-ID: 385a6e9 | Config-ID: 2b427be ] + ... + /usr/bin/g++-7 ... -std=gnu++14 -c /.../gtest-all.cc + ... + +As you can see C++14 flag used while building new package however +``Toolchain-ID`` remains the same, archive with invalid information saved +in cache now! + +The real ``Toolchain-ID`` for C++14 flag is ``b92ba0d``: + +.. code-block:: none + + > cmake -H. -B_builds -DHUNTER_NO_TOOLCHAIN_ID_RECALCULATION=OFF + ... + -- [hunter] Calculating Toolchain-SHA1 + ... + -- [hunter] [ Hunter-ID: 83f7dd1 | Toolchain-ID: b92ba0d | Config-ID: 2b427be ] + ... + +Option can be limited only for problematic generators, e.g. apply it to +Xcode generator only: + +.. code-block:: cmake + :emphasize-lines: 3-9 + + cmake_minimum_required(VERSION 3.2) + + if(CMAKE_GENERATOR STREQUAL "Xcode") + option( + HUNTER_NO_TOOLCHAIN_ID_RECALCULATION + "No Toolchain-ID recalculation" + ON + ) + endif() + + include("cmake/HunterGate.cmake") + HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.22.22.tar.gz" + SHA1 "83f7dd182930dee784fafd29745f55e7cd06ca34" + ) + project(foo) diff --git a/docs/old-wiki/Home.md b/docs/old-wiki/Home.md new file mode 100644 index 000000000..63975e315 --- /dev/null +++ b/docs/old-wiki/Home.md @@ -0,0 +1,19 @@ +Cross-platform package manager for C++ (based on CMake ExternalProject). + +### Usage +* Package customization + * [Version and options](https://github.com/ruslo/hunter/wiki/example.custom.config.id) + * [Build type](https://github.com/ruslo/hunter/wiki/example.hunter_configuration_types) +* [Uploading binaries to server](https://docs.hunter.sh/en/latest/faq/why-binaries-from-server-not-used.html#uploading-to-server) +* [Multiple HunterGate commands (e.g. projects/subprojects)] +(https://github.com/ruslo/hunter/wiki/usr.multiple.huntergate) + +### Tutorials +* [Adding new package](https://docs.hunter.sh/en/latest/creating-new/cmake.html) +* [Adding new package (custom download scheme)] +(https://github.com/ruslo/hunter/wiki/usr.adding.new.package.custom.scheme) + +### Develop +* [Variables (Dev)](https://github.com/ruslo/hunter/wiki/dev.variables) +* [Build schemes](https://github.com/ruslo/hunter/wiki/dev.build.schemes) +* [Scheme variables](https://github.com/ruslo/hunter/wiki/dev.scheme_variables) diff --git a/docs/old-wiki/Pitfalls.md b/docs/old-wiki/Pitfalls.md new file mode 100644 index 000000000..ba5a9ae9c --- /dev/null +++ b/docs/old-wiki/Pitfalls.md @@ -0,0 +1,46 @@ +#### file DOWNLOAD HASH mismatch + +Build failed with next message: +``` + for file: [/.../_3rdParty/Download/OpenSSL_1_0_1e.tar.gz] + expected hash: [4e8e2b21899f0dab567def50680dfd02a7acbb1a] + actual hash: [da39a3ee5e6b4b0d3255bfef95601890afd80709] +``` + +Something went wrong. `da39...` is a hash of an empty file: +```bash +> touch x +> openssl sha1 x +SHA1(x)= da39a3ee5e6b4b0d3255bfef95601890afd80709 +``` + +If error is stable you can try to rebuild cmake with system curl: +``` +> cmake -H. -B_builds -DCMAKE_INSTALL_PREFIX=/path/to/install/cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_USE_SYSTEM_CURL=YES +``` + +If error is sporadic, well, C’est la vie, hit rebuild again (TODO retry parameter?) + +### *_ROOT modification + +`HunterGate` function (master file `/cmake/Hunter` to be precise) clears all `*_ROOT` variables of internal packages (i.e. packages that installed by hunter). So if you set `_ROOT` variable +between `HunterGate` and `hunter_add_package` calls hunter will not work correctly. + +### include priority + +If your package can be installed by hunter and use hunter, then you can be trapped by including +headers from hunter root instead of local path: + +``` +# hunter root +/include/some-dep # mypackage use it +/include/mypackage # ... and mypackage is in the hunter too (somebody already install it) + +# mypackage/CMakeLists.txt +find_package(some-dep) +include_directories(${SOME_DEP_DIRECTORIES}) # Surprise, now /include/mypackage has priority! +include_directories(sources/include) # and this will be ignored... +``` + +Rule: local directories has **higher** priority then a system. Use `BEFORE` and `AFTER` suboptions of [include_directories](http://www.cmake.org/cmake/help/v3.0/command/include_directories.html) command to +avoid such kind of situations. \ No newline at end of file diff --git a/docs/old-wiki/Rationale.md b/docs/old-wiki/Rationale.md new file mode 100644 index 000000000..fa20001fe --- /dev/null +++ b/docs/old-wiki/Rationale.md @@ -0,0 +1,11 @@ +* TODO +* [Toolchain verification](https://github.com/ruslo/hunter/wiki/Rationale-%28toolchain-verification%29) + +### X + +* download before first command parsed (need for proper `find_package` command work or external cmake libs) +* internal projects must see each other (forward `_ROOT` variable) + +### Synchronization + +* TODO \ No newline at end of file diff --git a/docs/old-wiki/Requirements.md b/docs/old-wiki/Requirements.md new file mode 100644 index 000000000..2698741a4 --- /dev/null +++ b/docs/old-wiki/Requirements.md @@ -0,0 +1,86 @@ +### CMake 3.0 + +* http://www.cmake.org/cmake/resources/software.html +* For iOS build download and install [patched](https://github.com/ruslo/CMake/releases/tag/v3.0.0-ios-universal) +cmake version + +### HUNTER_ROOT + +This environment variable will point to working directory of hunter package manager. This is where all +downloaded archives and installed libraries will reside. It's recommended to use environment variable, but +also see [alternatives](https://github.com/hunter-packages/gate#effects). +For UNIX-family (Linux, Mac, Cygwin) users it propably +will be `export HUNTER_ROOT=/path/to/hunter/root` in `.bashrc` file, for Windows users: +`Control Panel` -> `System` -> `Advanced System Settings` -> `Environment Variables`. Do not forget to restart +all terminals/CMake-GUIs to apply changes in both cases. Note that all libraries will be installed in +two variants: `Debug` and `Release`. Check that there are enough disk space available (directory can +easily exceed 1 GB). + +For example windows (VS 64/32 + cygwin): +* HUNTER_ROOT (> 5 GB) + * HUNTER_ROOT/Downloads (~ 100 MB) + * HUNTER_ROOT/Base/Build (~ 1 GB) + * HUNTER_ROOT/Base/Source/Boost (> 2 GB) # boost builds in-source + * HUNTER_ROOT/Base/Install (> 1 GB) + +### Toolchains + +Projects that uses different toolchains can be build in one HUNTER_ROOT directory if each toolchain +define `HUNTER_INSTALL_TAG` variable. +For example if [clang_libstdcxx](https://github.com/ruslo/polly/wiki/Toolchain-list#clang_libstdcxx) +and [gcc](https://github.com/ruslo/polly/wiki/Toolchain-list#gcc) toolchain used: + +* HUNTER_ROOT/Base/Install/clang_libstdcxx +* HUNTER_ROOT/Base/Install/gcc + +For each build `*_Dir` variables will be modified so standard `find_package` command will pick appropriate +include directories and libraries: + +```cmake +find_package(Boost REQUIRED ...) + +include_directories(${Boost_INCLUDE_DIR}) + # HUNTER_ROOT/Base/Install/clang_libstdcxx/include for clang_libstdcxx toolchain + # HUNTER_ROOT/Base/Install/gcc/include for gcc toolchain + +target_link_libraries(... PUBLIC ${Boost_LIBRARIES}) + # HUNTER_ROOT/Base/Install/clang_libstdcxx/lib/libboost_... for clang_libstdcxx toolchain + # HUNTER_ROOT/Base/Install/gcc/lib/libboost_... for gcc toolchain +``` + +### Toolchains example (polly) + +* Download archive, unpack it and set `POLLY_ROOT` environment variable. Unix-style: +``` +> POLLY_VERSION="0.4.4" +> wget "https://github.com/ruslo/polly/archive/v${POLLY_VERSION}.tar.gz" +> tar xf "v${POLLY_VERSION}.tar.gz" +> export POLLY_ROOT="`pwd`/polly-${POLLY_VERSION}" +> export PATH="${POLLY_ROOT}/bin:${PATH}" # If you want to use build.py script +``` + +Now toolchains can be used: + +``` +> cmake -H. -B_builds -DCMAKE_TOOLCHAIN_FILE=${POLLY_ROOT}/sanitize_address.cmake +... +-- [polly] Used toolchain: Clang address sanitizer / c++11 support +... +> cmake --build _builds +... +clang++ -std=c++11 -fsanitize=address ... +... +``` + +Or using `build.py` script (generate and build, see `build.py --help` for all options): +``` +> build.py --toolchain sanitize_address --verbose +... +-- [polly] Used toolchain: Clang address sanitizer / c++11 support +... +clang++ -std=c++11 -fsanitize=address ... +... +``` + +* https://github.com/ruslo/polly + diff --git a/docs/old-wiki/Used-variables.md b/docs/old-wiki/Used-variables.md new file mode 100644 index 000000000..e4cdbd32b --- /dev/null +++ b/docs/old-wiki/Used-variables.md @@ -0,0 +1,17 @@ +### HUNTER_STATUS_PRINT + +If this variable is set to `TRUE` process information will be printed + +### HUNTER_STATUS_DEBUG + +Like `HUNTER_STATUS_PRINT` (more verbose). Additionally set `CMAKE_VERBOSE_MAKEFILE=YES` for external projects. + +### HUNTER_ROOT + +This variable setted automatically after incuding master `Hunter` file. + +### HUNTER_BASE + +This variable setted automatically after including master `Hunter` file. This variable will set `EP_BASE` property for current directory. See [documentation][link_documentation]. + +[link_documentation]: http://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:ExternalProject \ No newline at end of file diff --git a/docs/old-wiki/dev.build.schemes.md b/docs/old-wiki/dev.build.schemes.md new file mode 100644 index 000000000..311765efb --- /dev/null +++ b/docs/old-wiki/dev.build.schemes.md @@ -0,0 +1,46 @@ +Since not every package use CMake as a build tool there are templates for [ExternalProject_Add][1] command. These templates called [build schemes][2] and allow usage of custom build tools. For example see [tutorial][3] how to trigger `xcodebuild` instead of CMake. Command [hunter_pick_scheme][6] will help you to choose appropriate scheme if there are several of them. + +## General + +#### url_sha1_download.cmake.in +* [Scheme][4] used for downloading only. I.e. when you need to download something that is not an unpackable archive or archive that you don't want to unpack for any reason + +#### url_sha1_unpack.cmake.in + +* [Scheme][5] download and unpack archive without triggering any build commands. Examples: [CMake modules][8], [Clang tools extra][9] which is used as a subdirectory to [LLVM][10] project. Note that a header library can be installed as a regular project even if it has no binaries. See [Interface Libraries][13] and [example][14]. + +#### url_sha1_cmake.cmake.in + +* [Scheme][7] used to build CMake projects. + +## Package special + +Also refer to [Useful variables while building schemes](https://github.com/ruslo/hunter/wiki/dev.scheme_variables) + +### Boost +* [url_sha1_boost.cmake.in](https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_boost.cmake.in) +* [url_sha1_boost_ios_library.cmake.in](https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_boost_ios_library.cmake.in) +* [url_sha1_boost_library.cmake.in](https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_boost_library.cmake.in) + +### OpenSSL +* [url_sha1_openssl.cmake.in](https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_openssl.cmake.in) +* [url_sha1_openssl_ios.cmake.in][12] +* [url_sha1_openssl_windows.cmake.in][11] + +### iOS-Sim +* [url_sha1_ios_sim.cmake.in](https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_ios_sim.cmake.in) + +[1]: http://www.cmake.org/cmake/help/v3.0/module/ExternalProject.html +[2]: https://github.com/ruslo/hunter/tree/master/cmake/schemes +[3]: https://github.com/ruslo/hunter/wiki/usr.adding.new.package.custom.scheme +[4]: https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_download.cmake.in +[5]: https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_unpack.cmake.in +[6]: https://github.com/ruslo/hunter/wiki/dev.modules#hunter_pick_scheme +[7]: https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_cmake.cmake.in +[8]: https://github.com/ruslo/hunter/wiki/pkg.sugar +[9]: https://github.com/ruslo/hunter/blob/develop/cmake/projects/ClangToolsExtra/hunter.cmake +[10]: https://github.com/ruslo/hunter/blob/23a5a8342a4bdd81da336bc449e7e8707d77df18/cmake/config.cmake#L36 +[11]: https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_openssl_windows.cmake.in +[12]: https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_openssl_ios.cmake.in +[13]: http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#interface-libraries +[14]: https://github.com/ruslo/hunter/wiki/pkg.leathers \ No newline at end of file diff --git a/docs/old-wiki/dev.hunter.root.md b/docs/old-wiki/dev.hunter.root.md new file mode 100644 index 000000000..2873a1464 --- /dev/null +++ b/docs/old-wiki/dev.hunter.root.md @@ -0,0 +1,91 @@ +### Automatic download + +As you probably have [noticed][1] there is no need to clone [this][3] repository to use Hunter since all packages will be downloaded automatically by [HunterGate][2] module. The fact that `URL`/`SHA1` arguments used by `HunterGate` can be checked by finding next lines in log: + +``` +-- [hunter] Initializing Hunter workspace (a98628627c4f4c3ce11ac250fde31a7dbd264a15) +-- [hunter] /.../hunter.tar.gz +-- [hunter] -> /.../_Base/Download/Hunter/.../a986286 +... +-- [hunter] [ Hunter-ID: a986286 | Config-ID: 496782c | Toolchain-ID: 5a219cb ] +``` + +Where `hunter-id` is the first 7 digits of `SHA1` of archive (i.e. first 7 digits of `SHA1` argument). + +### Git clone + +However for development purposes like [adding new package][4] there is git-based functionality in `HunterGate`. Do clone and set [HUNTER_ROOT][5] environment variable: +```bash +> git clone https://github.com/ruslo/hunter +> export HUNTER_ROOT="`pwd`/hunter" +``` + +In this case `URL`/`SHA1` of `HunterGate` **will not** be used! + +Check logs: +``` +-- [hunter] [ Hunter-ID: xxxxxxx | Config-ID: 496782c | Toolchain-ID: 5a219cb ] +``` + +Hence for example you need to do `git pull` to download new changes since modifying `HunterGate` arguments will not have any effects for you (but will have for non-git users, so may be needed too). There are other peculiarities with such approach so probably it make sense to not mix "user" and "development" versions of Hunter. You can achieve this by setting `HUNTER_ROOT` environment variable to an empty directory, do the clone to another one and use `jenkins.py` script for testing (see section below). + +### jenkins.py + +Using git-based version may be quite tricky for the beginners, have some pitfalls and require basic understanding of how Hunter works. Here are some scenarios: + +##### scenario 1 +1. Add package `Foo` with version `1.2.3` to Hunter modules +2. Build package `Foo` (`DONE` stamp saved in Hunter working directory `_Base`) +3. Change `URL` of `Foo` package but keep version the same (i.e. `1.2.3`) +4. Run build -> Hunter see `DONE` stamp for version `1.2.3` and doesn't run rebuild! +5. Change both `URL` and version of package Foo (e.g. `1.2.4`) +6. Run build -> Hunter don't see `DONE` stamp for version `1.2.4`, build Foo and save new `DONE` stamp + +##### scenario 2 +1. Build [cacheable][6] package `Foo` -> Hunter save `DONE` stamp and `*.tar.gz` archive with packed installated files +2. Change internal files like schemes or other CMake modules which should update build instructions of `Foo` +3. Run build -> Hunter see `DONE` stamp for `Foo` and will do nothing +4. Remove `DONE` stamp +5. Run build -> Hunter don't see `DONE` stamp but found `*.tar.gz` in cache so will just unpack archive without triggering build (your updates not applied!) +6. Remove `DONE` stamp and metadata from Cache +7. Run build -> Hunter will rebuild `Foo` with new instructions + +To avoid such problems script `jenkins.py` can be used. This script will pack current Hunter directory and run build instructions for project specified by `PROJECT_DIR` environment variable. Note that this script will create his own `HUNTER_ROOT` directory (i.e. environment variable `HUNTER_ROOT` will not be used): +```bash +# check you have python3 +> python3 --version +Python 3.4.3 + +# download build.py script +> git clone https://github.com/ruslo/polly +> export PATH="`pwd`/polly/bin:$PATH" +> which build.py +/.../polly/bin/build.py + +# clone Hunter repository +> git clone https://github.com/ruslo/hunter +> cd hunter + +# run build for some package, like GTest +# environment variable TOOLCHAIN will be used as an argument for `build.py --toolchain` +[hunter]> TOOLCHAIN=default PROJECT_DIR=examples/GTest ./jenkins.py --verbose + +# script will pack current archive in `_testing` directory +-- [hunter] Initializing Hunter workspace (f0550216489047a310a27c2b5ac95c70e7e878bf) +-- [hunter] /.../hunter/_testing/hunter.tar.gz +-- [hunter] -> /.../_testing/Hunter/_Base/Download/Hunter/unknown/f055021 +``` + +About `build.py` and toolchains: [link](https://github.com/ruslo/polly#buildpy) + +See `jenkins.py --help` for more options: +* `--nocreate` will not pack new Hunter archive but reuse old one (`_testing/hunter.tar.gz`). This may be useful for testing several packages one-by-one. Also it means that any new changes in Hunter internal modules will not be used. +* `--clear` remove **all** testing directories, i.e. `_testing` directory +* `--clear-except-download` remove `_Base/` and `_Base/Cache` directories but keep `_Base/Download`. This may be helpful for doing cleanup but will save archives with sources for future testing. Note that there is no need to enter full option name, i.e. `./jenkins.py --clear-except` will work fine too + +[1]: https://github.com/ruslo/hunter#first-step +[2]: https://github.com/hunter-packages/gate +[3]: https://github.com/ruslo/hunter +[4]: https://github.com/ruslo/hunter/wiki/usr.adding.new.package +[5]: https://github.com/hunter-packages/gate#effects +[6]: https://github.com/ruslo/hunter/wiki/dev.modules#hunter_cacheable \ No newline at end of file diff --git a/docs/old-wiki/dev.scheme_variables.md b/docs/old-wiki/dev.scheme_variables.md new file mode 100644 index 000000000..4ce272266 --- /dev/null +++ b/docs/old-wiki/dev.scheme_variables.md @@ -0,0 +1,48 @@ +# Global Variables + +### HUNTER_GATE_SHA1 +The SHA1 value of the downloaded tar of hunter + +### HUNTER_GATE_VERSION +Set to the used version of hunter. + +### HUNTER_SELF +To access the location of downloaded and extracted hunter package. For examples the projects folder can be accessed in the folder +`${HUNTER_SELF}/cmake/projects` +The Variable is set in module hunter_finalize and computed with HUNTER_GATE_VERSION and HUNTER_GATE_SHA1 + +### HUNTER_INSTALL_PREFIX +The default install location + +# Package Specific +Package specific variables are available in configuring schemes in the form of @variable_name@ + +### HUNTER_PACKAGE_NAME +Set to the package being installed without the version or component. For example, while installing component 'test' of Boost, HUNTER_PACKAGE_NAME will be set to 'Boost'. + +### HUNTER_PACKAGE_DOWNLOAD_DIR +Location where the package will be downloaded. + +### HUNTER_PACKAGE_HOME_DIR +Home directory for the package. This directory will contain the source, build and install directories. While installing component of the package HUNTER_PACKAGE_HOME_DIR will be set to HUNTER_PACKAGE_HOME_DIR(of parent)/_componentName + +### HUNTER_PACKAGE_SOURCE_DIR +Directory where the source of the package will be extracted. + +### HUNTER_PACKAGE_BUILD_DIR +Build directory of the package. + +### HUNTER_PACKAGE_VERSION +Set to the version of package being installed. + +### HUNTER_PACKAGE_COMPONENT +Set to the component being installed without the version. For example, while installing component 'test' of Boost, HUNTER_PACKAGE_COMPONENT is set to 'test'. + +### HUNTER_EP_NAME +Set to the project being installed. For example, while installing component 'test' of Boost, HUNTER_PACKAGE_COMPONENT will be set to 'Boost-test' and while installing the Boost as a parent package it will be set to 'Boost'. + +### HUNTER_[PACKAGE_NAME]_VERSION +Set to the version of package being installed. For example, while installing component 'test' of Boost with version 1.49.0, HUNTER_Boost_VERSION is set to '1.49.0'. + +### HUNTER_PACKAGE_INSTALL_PREFIX +The location where the current package will be installed. Based on the cacheable property this location may differ from the default HUNTER_INSTALL_PREFIX location. Always use the project specific HUNTER_PACKAGE_INSTALL_PREFIX in schemes. diff --git a/docs/old-wiki/dev.variables.md b/docs/old-wiki/dev.variables.md new file mode 100644 index 000000000..8a4e94404 --- /dev/null +++ b/docs/old-wiki/dev.variables.md @@ -0,0 +1,68 @@ +# HunterGate.cmake + +#### HUNTER_ROOT + +* Set by `hunter_gate_detect_root` function (if already defined by user, this variable leaved as is). See [layout of directories](https://github.com/ruslo/hunter/wiki/EP_BASE-layout). + +#### HUNTER_ROOT_INFO + +* Set by `hunter_gate_detect_root` function + +#### HUNTER_URL + +* Hunter archive download URL. Set by `HunterGate` macro to current scope and cache if not already set by other `HunterGate`. This variable defined once for the whole project. +See [example] +(https://github.com/ruslo/hunter/wiki/Multiple-HunterGate-commands-%28e.g.-projects-subprojects%29). + +#### HUNTER_SHA1 + +* Hunter archive SHA1. Set by `HunterGate`. Same behaviour as `HUNTER_URL`. + +#### HUNTER_BASE + +* Set by `HunterGate` (usually `${HUNTER_ROOT}/_Base/${HUNTER_SHA1}`). This is the directory where all packages that belongs to given SHA1 resides. See [layout] +(https://github.com/ruslo/hunter/wiki/EP_BASE-layout). +* This variable is customizable if used without gate, e.g. for testing hunter itself: +``` +cmake -H./examples/Sugar/ -B./_builds -DHUNTER_ROOT="`pwd`" -DHUNTER_BASE="`pwd`/_builds/_Base" +``` + +#### HUNTER_SELF + +* Set by `HunterGate` (usually `${HUNTER_BASE}/Self`). Directory with unpacked hunter archive sources. This is the place where master file, config, download schemes, recipies etc. lives. + +#### HUNTER_LOCK_PATH + +* Synchronization directory. Only one process that successfully create that directory allowed to init `HUNTER_BASE`. Usually `${HUNTER_BASE}/directory-lock`. + +#### HUNTER_LOCK_INFO + +* Information about locked directory. File with `PROJECT_BINARY_DIR` string. Created by `hunter_gate_try_lock` function. Set to `${HUNTER_LOCK_PATH}/info`. + +#### HUNTER_LOCK_FULL_INFO + +* Information about locked directory. File with `PROJECT_BINARY_DIR` and timestamp of creation. Created by `hunter_gate_try_lock` function. Set to `${HUNTER_LOCK_PATH}/fullinfo`. + +#### HUNTER_GATE_INSTALL_DONE + +* Synchronization file. If multiple processes simultaniously try to init `HUNTER_BASE` directory (by `HunterGate` command) only one of them will do it, other will wait until `HUNTER_GATE_INSTALL_DONE` file created. Usually `${HUNTER_BASE}/install-gate-done`. + +#### HUNTER_IGNORE_BROKEN_PACKAGE_ERROR + +* Ignore error [broken package](https://github.com/ruslo/hunter/wiki/Error-%28broken-package%29). Used to test fixes of broken packages. + +#### HUNTER_SKIP_LOCK + +* When `HUNTER_SKIP_LOCK` is `TRUE` the locking ignored. This variable is used as a workaround for error ["can't lock"](https://github.com/ruslo/hunter/wiki/error.can.not.lock). + +# cmake/Hunter + +#### HUNTER_PACKAGE_DOWNLOAD_DIR + +* Directory with downloaded archives. Usually `${HUNTER_BASE}/Download/`. Can be customized by user for testing purpose. + +# *External* + +#### HUNTER_CMAKE_GENERATOR + +* Set by [toolchain](https://github.com/ruslo/polly/blob/master/utilities/polly_init.cmake). This generator used for all the projects in superbuild (optimization possible, like `NMake` -> `Visual Studio`) \ No newline at end of file diff --git a/docs/old-wiki/example.custom.config.id.md b/docs/old-wiki/example.custom.config.id.md new file mode 100644 index 000000000..494500768 --- /dev/null +++ b/docs/old-wiki/example.custom.config.id.md @@ -0,0 +1,201 @@ +Package version and extra CMake options can be set in user's `config.cmake` file (see also [how to specify custom config location](https://github.com/hunter-packages/gate#usage-custom-config)). + +### Custom package version + +```cmake +# CMakeLists.txt +HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.8.10.tar.gz" + SHA1 "9308d01ea52c7b8cf1347073c982c679dbac3c09" + LOCAL # <----- Use local config.cmake +) +... +hunter_add_package(GTest) +``` + +```cmake +# cmake/Hunter/config.cmake +hunter_config(GTest VERSION 1.7.0-hunter-9) +hunter_config(ZLIB VERSION 1.2.8-hunter-1) +``` + +### Custom CMake options + +```cmake +# cmake/Hunter/config.cmake +hunter_config(GTest VERSION 1.7.0-hunter-9 CMAKE_ARGS GTEST_SUPER_MODE=ON) +hunter_config(ZLIB VERSION 1.2.8-hunter-1 CMAKE_ARGS ZLIB_FEATURES=FEATURE1;FEATURE2) +``` + +If you set [HUNTER_STATUS_DEBUG=ON](https://github.com/ruslo/hunter/wiki/usr.variables#hunter_status_debug) you can see that options added to build: +``` +-- [hunter *** DEBUG *** 2015-04-20T15:40:12] Add extra CMake args: 'GTEST_SUPER_MODE' = 'ON' +-- [hunter *** DEBUG *** 2015-04-20T15:40:12] Add package: GTest +-- [hunter *** DEBUG *** 2015-04-20T15:40:12] Download scheme: url_sha1_release_debug +-- [hunter *** DEBUG *** 2015-04-20T15:40:12] Url: https://github.com/hunter-packages/gtest/archive/v1.7.0-hunter-9.tar.gz +-- [hunter *** DEBUG *** 2015-04-20T15:40:12] SHA1: 8a47fe9c4e550f4ed0e2c05388dd291a059223d9 +``` + +``` +-- [hunter *** DEBUG *** 2015-04-20T15:40:54] Add extra CMake args: 'ZLIB_FEATURES' = 'FEATURE1' +-- [hunter *** DEBUG *** 2015-04-20T15:40:54] Add extra CMake args: 'ZLIB_FEATURES' += 'FEATURE2' +-- [hunter *** DEBUG *** 2015-04-20T15:40:54] Add package: ZLIB +-- [hunter *** DEBUG *** 2015-04-20T15:40:54] Download scheme: url_sha1_release_debug +-- [hunter *** DEBUG *** 2015-04-20T15:40:54] Url: https://github.com/hunter-packages/zlib/archive/v1.2.8-hunter-1.tar.gz +-- [hunter *** DEBUG *** 2015-04-20T15:40:54] SHA1: 24c89e4b193a56bb411fa9878968002ebe2c6209 +``` + +### Order + +There are several places where configuration of package can be modified : +* First default global config parsed: `${HUNTER_SELF}/cmake/config/default.cmake`. This file contains only `hunter_config` commands so it will set version, cmake arguments and configuration types of each package +* Then user's local config parsed (e.g. `${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake`). This file can make additional calls to `hunter_config` command and **rewrite** version, cmake arguments and configuration types of package. Note that there is no need to specify all packages that you're planning to use, only packages you want to customize +* Additional arguments can be added in `${HUNTER_SELF}/cmake/project//hunter.cmake` file using `hunter_cmake_args` and `hunter_configuration_types` command (see [package defaults](https://github.com/ruslo/hunter/wiki/usr.adding.new.package#defaults)). `hunter_cmake_args` will push arguments **to the front** (i.e. with **low** priority). `hunter_configuration_types` will set configuration types only if they are empty (i.e. not set by global default config or local user's config). + +Only version field in default global config is mandatory, other fields and user's local config are optional. + +#### Example + +##### Version + +```cmake +# global default ${HUNTER_SELF}/cmake/configs/default.cmake +hunter_package(Foo VERSION 1.2) + +# CMakeLists.txt +hunter_add_package(Foo) # default version 1.2 used +``` + +```cmake +# global default ${HUNTER_SELF}/cmake/configs/default.cmake +hunter_package(Foo VERSION 1.2) + +# user's local ${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake +hunter_package(Foo VERSION 2.0) + +# CMakeLists.txt +hunter_add_package(Foo) # user's custom version 2.0 used +``` + +##### Arguments + +```cmake +# global default ${HUNTER_SELF}/cmake/configs/default.cmake +hunter_package(Foo VERSION 1.2) # no additional arguments + +# user's local ${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake +hunter_package(Foo VERSION 2.0 CMAKE_ARGS FOO_FEATURE=ON) + +# CMakeLists.txt +hunter_add_package(Foo) # user's custom version 2.0 + additional FOO_FEATURE=ON used +``` + +```cmake +# global default ${HUNTER_SELF}/cmake/configs/default.cmake +hunter_package(Foo VERSION 1.2) # no additional arguments + +# user's local ${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake +hunter_package(Foo VERSION 2.0 CMAKE_ARGS FOO_FEATURE=ON) + +# global default additional cmake arguments from ${HUNTER_SELF}/cmake/projects/Foo/hunter.cmake +hunter_cmake_args(Foo CMAKE_ARGS FOO_WITH_BOO=ON) + +# CMakeLists.txt +hunter_add_package(Foo) # user's custom version 2.0 + arguments: +# * FOO_WITH_BOO=ON from default hunter.cmake +# * FOO_FEATURE=ON from user's config +``` + +```cmake +# global default ${HUNTER_SELF}/cmake/configs/default.cmake +hunter_package(Foo VERSION 1.2) # no additional arguments + +# user's local ${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake +hunter_package(Foo VERSION 2.0 CMAKE_ARGS FOO_WITH_BOO=OFF) + +# global default additional cmake arguments from ${HUNTER_SELF}/cmake/projects/Foo/hunter.cmake +hunter_cmake_args(Foo CMAKE_ARGS FOO_WITH_BOO=ON) + +# CMakeLists.txt +hunter_add_package(Foo) # user's custom version 2.0 + arguments: +# * FOO_WITH_BOO=ON from default hunter.cmake +# * FOO_WITH_BOO=OFF from user's config +# Since user's config has high priority effectively arguments will be: FOO_WITH_BOO=OFF +``` + +##### Configuration types + +```cmake +# global default ${HUNTER_SELF}/cmake/configs/default.cmake +hunter_package(Foo VERSION 1.2) # no configuration types + +# user's local ${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake +hunter_package(Foo VERSION 2.0) # no configuration types + +# global default additional cmake arguments from ${HUNTER_SELF}/cmake/projects/Foo/hunter.cmake +hunter_configuration_types(Foo CONFIGURATION_TYPES Debug) + +# CMakeLists.txt +hunter_add_package(Foo) # user's custom version 2.0 + default configuration type `Debug` from hunter.cmake +``` + +```cmake +# global default ${HUNTER_SELF}/cmake/configs/default.cmake +hunter_package(Foo VERSION 1.2) # no configuration types + +# user's local ${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake +hunter_package(Foo VERSION 2.0 CONFIGURATION_TYPES Release) + +# global default additional cmake arguments from ${HUNTER_SELF}/cmake/projects/Foo/hunter.cmake +hunter_configuration_types(Foo CONFIGURATION_TYPES Debug) + +# CMakeLists.txt +hunter_add_package(Foo) # user's custom version 2.0 + configuration type Release from user's config +``` + +##### Version inheriting + +Since default config parsed first you can use variable `HUNTER__VERSION` to inherit version: +```cmake +# default config from ${HUNTER_SELF}/cmake/config/default.cmake +hunter_config(Foo VERSION 1.2.3) + +# user's local ${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake +hunter_config(Foo VERSION ${HUNTER_Foo_VERSION} CMAKE_ARGS FOO_WITH_BOO=ON) +``` + +### No effects on CMakeLists.txt + +Note that this file configured internally in Hunter. E.g. variable from `config.cmake` will not be visible in CMakeLists.txt: +```cmake +# cmake/Hunter/config.cmake +hunter_config(GTest VERSION 1.7.0-hunter-9 CMAKE_ARGS GTEST_SUPER_MODE=ON) +set(HELLO_FROM_CONFIG "Hello") +``` + +```cmake +# CMakeLists.txt +HunterGate(...) +message("Config say: '${HELLO_FROM_CONFIG}'") +``` + +```bash +> cmake -H. -B_builds +Config say: '' +``` + +### CMake conditions + +`config.cmake` is a usual CMake-code file, so such commands like `if` and global variables like `WIN32` can be used: + +```cmake +if(WIN32) + hunter_config(GTest VERSION 1.7.0-hunter-9 CMAKE_ARGS GTEST_SUPER_MODE=ON) +endif() +``` + +### Links + +* [HunterGate](https://github.com/hunter-packages/gate#usage-custom-config) +* [hunter_config](https://github.com/ruslo/hunter/wiki/dev.modules#hunter_config) +* [Custom build types](https://github.com/ruslo/hunter/wiki/example.hunter_configuration_types) (e.g. Release/Debug) \ No newline at end of file diff --git a/docs/old-wiki/example.find_package.config.md b/docs/old-wiki/example.find_package.config.md new file mode 100644 index 000000000..a780dbcc1 --- /dev/null +++ b/docs/old-wiki/example.find_package.config.md @@ -0,0 +1,107 @@ +### MODULE vs. CONFIG + +Usually a package can be added to project using one of the `Find.cmake` standard CMake modules, e.g. [Boost](http://www.cmake.org/cmake/help/v3.2/module/FindBoost.html): + +```cmake +set(Boost_USE_STATIC_LIBS ON) +find_package(Boost REQUIRED) +if(WIN32) + add_definitions(-DBOOST_ALL_NO_LIB=1) + add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS}) +endif() + +include_directories(${Boost_INCLUDE_DIRS}) +add_executable(foo foo.cpp) +``` + +Using CONFIG-mode of the `find_package` command will allow all this code to be substituted with literally two lines (see [Boost](https://github.com/ruslo/hunter/wiki/pkg.boost)): +```cmake +find_package(Boost CONFIG REQUIRED) +target_link_libraries(... Boost::boost) + # include dirs (Boost_INCLUDE_DIRS) added automatically + # definition BOOST_ALL_NO_LIB=1 added automatically too +``` +effectively this will add a new [interface imported](http://www.cmake.org/cmake/help/v3.2/command/add_library.html#interface-libraries) target `Boost::boost` to your project. + +* [Documentation](http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#config-file-packages) +* [Stackoverflow question](http://stackoverflow.com/a/20857070/2288008) + +### Relocation challenge + +Note that when your dependency is found by `Find.cmake` and then installed with CMake config, the public libraries will be linked with hardcoded paths. For instance: + +```cmake +# CMakeLists.txt +find_package(Boost REQUIRED) +target_include_directories(foo PUBLIC ${Boost_INCLUDE_DIRS}) +``` + +```bash +> cmake --build _builds --target install +Install the project... +-- Install configuration: "Release" +... +-- Installing: //lib/cmake//Targets.cmake +-- Installing: //lib/cmake//Targets-release.cmake +``` +```bash +> grep -i interface_include //lib/cmake//Targets.cmake + INTERFACE_INCLUDE_DIRECTORIES "//include" +``` + +The bad thing about this is that when you pack your code and try to use it on another machine there will be no such directory like `//include/`. The solution to this problem is to use config-mode imported targets: +```cmake +# CMakeLists.txt +find_package(Boost CONFIG REQUIRED) +target_link_libraries(... PUBLIC Boost::boost) +``` + +```cmake +# Config.cmake.in +# template file that will be installed with your library +# i.e. user don't need to call find_package(Boost CONFIG) explicitly +find_dependency(Boost CONFIG) +... +``` + +```bash +> cmake --build _builds --target install +> grep -i boost //lib/cmake//Targets.cmake + INTERFACE_LINK_LIBRARIES "Boost::boost" +``` + +As you can see now the hardcoded paths go away and the [find_dependency](http://www.cmake.org/cmake/help/v3.2/module/CMakeFindDependencyMacro.html) command will locate new paths when the package is moved to machine with a different ``. Target `Boost::boost` will be linked automatically on `find_package`: + +```cmake +# User's CMakeLists.txt +find_package( CONFIG REQUIRED) + +# find_package(Boost CONFIG REQUIRED) # not needed! +# target_link_libraries(... Boost::boost) # not needed! + +target_link_libraries(... ::) +# add Boost::boost automatically with new +``` + +Note that Hunter will download transitively as well: +```cmake +hunter_add_package() +# hunter_add_package(Boost) # not needed! + +find_package( CONFIG REQUIRED) +target_link_libraries(... ::) +``` + +### CMake + +There is quite a lot of boilerplate code that you need to add, but the core of feature is these two lines (`Foo` is the project, `boo` is the target): +```cmake +install(TARGETS boo EXPORT FooTargets ...) # FooTarget.cmake now know about boo +install(EXPORT FooTargets ...) # install FooTarget.cmake +``` + +Next see real examples to run and documenation: + +* [CMake documentation](http://www.cmake.org/cmake/help/v3.2/manual/cmake-packages.7.html#creating-packages) +* [Example](https://github.com/forexample/package-example) +* [Header-only library example](https://github.com/ruslo/leathers/blob/master/CMakeLists.txt) (see `install` section) \ No newline at end of file diff --git a/docs/old-wiki/example.hunter.run.install.md b/docs/old-wiki/example.hunter.run.install.md new file mode 100644 index 000000000..cbf5322f4 --- /dev/null +++ b/docs/old-wiki/example.hunter.run.install.md @@ -0,0 +1,40 @@ +Example to show the usefulness of [HUNTER_RUN_INSTALL](https://github.com/ruslo/hunter/wiki/usr.variables#hunter_run_install) option. + +#### Example 1 +Assume you usually use `/home/username/tools/hunter` directory to install packages by specifying `HUNTER_ROOT` environment variable. Lets guess one time for any reason this variable is accidentially empty. Hunter will report this error while trying to find master file in default `/home/username/.hunter` location and when nothing found it will offer you to run auto-install explicitly: +```bash +> echo $HUNTER_ROOT + +# ooops, something wrong - nothing in output +> cmake -H. -B_builds +[hunter ** FATAL ERROR **] Hunter not found in '/home/username/.hunter/_Base/Download/Hunter/0.8.3/1eae623' +[hunter ** FATAL ERROR **] Set HUNTER_RUN_INSTALL=ON to auto-install it from 'https://.../v0.8.3.tar.gz' +[hunter ** FATAL ERROR **] Settings: +[hunter ** FATAL ERROR **] HUNTER_ROOT: /home/username/.hunter +[hunter ** FATAL ERROR **] HUNTER_SHA1: 1eae623cb5ce9da39c8c3e1b0f6e452f244ddc17 +``` + +#### Example 2 +Guess you want to remove old Hunter version `0.8.2`/`353b0b89bb838b9437a1082aa708b1ab7b3ab77b` from `HUNTER_ROOT` completely and use `0.8.3`/`1eae623cb5ce9da39c8c3e1b0f6e452f244ddc17` in every package (note that in general you can use both versions simultaneously without any limitations): +```bash +> rm -rf $HUNTER_ROOT/_Base/353b0b8 # Remove installed packages +> rm -rf $HUNTER_ROOT/_Base/Download/Hunter/0.8.2/353b0b8 # Remove Hunter archive +> grep SHA1 CMakeLists.txt # project with new 0.8.3 + SHA1 "1eae623cb5ce9da39c8c3e1b0f6e452f244ddc17" +> cmake -H. -B_builds -DHUNTER_RUN_INSTALL=ON +-- [hunter] Initializing Hunter workspace (1eae623cb5ce9da39c8c3e1b0f6e452f244ddc17) +-- [hunter] https://.../v0.8.3.tar.gz +-- [hunter] -> /.../_Base/Download/Hunter/0.8.3/1eae623 +``` + +Guess you forget to update one project and it still using `0.8.2`. Instead of silently install all packages to `HUNTER_ROOT` the error will be reported: +```bash +> grep SHA1 CMakeLists.txt # ooops, old version 0.8.2! + SHA1 "353b0b89bb838b9437a1082aa708b1ab7b3ab77b" +> cmake -H. -B_builds +[hunter ** FATAL ERROR **] Hunter not found in '/.../_Base/Download/Hunter/0.8.2/353b0b8' +[hunter ** FATAL ERROR **] Set HUNTER_RUN_INSTALL=ON to auto-install it from 'https://.../v0.8.2.tar.gz' +[hunter ** FATAL ERROR **] Settings: +[hunter ** FATAL ERROR **] HUNTER_ROOT: /.../ +[hunter ** FATAL ERROR **] HUNTER_SHA1: 353b0b89bb838b9437a1082aa708b1ab7b3ab77b +``` \ No newline at end of file diff --git a/docs/old-wiki/example.hunter_configuration_types.md b/docs/old-wiki/example.hunter_configuration_types.md new file mode 100644 index 000000000..95ed1fc96 --- /dev/null +++ b/docs/old-wiki/example.hunter_configuration_types.md @@ -0,0 +1,98 @@ +You got full control over what build type (Release/Debug) will be used while building your 3rd party packages. + +### HUNTER_CONFIGURATION_TYPES (global) + +Set [HUNTER_CONFIGURATION_TYPES][hunter-configuration-types] CMake variable to specify the list of build types to use while building **all** packages. Default value is `Release` + `Debug`: +```bash +> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON +... +-- [hunter *** DEBUG *** 2015-04-22T12:05:34] HUNTER_CONFIGURATION_TYPES: Release;Debug +``` + +Set your option via command line: +```bash +> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON -DHUNTER_CONFIGURATION_TYPES=SuperRelease +... +-- [hunter *** DEBUG *** 2015-04-22T12:08:56] HUNTER_CONFIGURATION_TYPES: SuperRelease +``` + +Note that `HUNTER_CONFIGURATION_TYPES` now is in CMake cache, so if you run this configure again variable will be used from cache even if it's not set by user: +```bash +> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON +... +-- [hunter *** DEBUG *** 2015-04-22T12:11:22] HUNTER_CONFIGURATION_TYPES: SuperRelease +``` +```bash +> grep HUNTER_CONFIGURATION_TYPES _builds/CMakeCache.txt +HUNTER_CONFIGURATION_TYPES:STRING=SuperRelease +``` + +You can remove cache to use defaults: +```bash +> rm _builds/CMakeCache.txt +> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON +... +-- [hunter *** DEBUG *** 2015-04-22T12:13:28] HUNTER_CONFIGURATION_TYPES: Release;Debug +``` + +Or using `-U` option: +```bash +> rm -rf _builds +> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON -DHUNTER_CONFIGURATION_TYPES=SuperRelease +... +-- [hunter *** DEBUG *** 2015-04-22T12:16:04] HUNTER_CONFIGURATION_TYPES: SuperRelease +``` +```bash +> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON +... +-- [hunter *** DEBUG *** 2015-04-22T12:16:43] HUNTER_CONFIGURATION_TYPES: SuperRelease +``` +```bash +> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON -UHUNTER_CONFIGURATION_TYPES +... +-- [hunter *** DEBUG *** 2015-04-22T12:17:32] HUNTER_CONFIGURATION_TYPES: Release;Debug +``` + +*See CMake [documentation](http://www.cmake.org/cmake/help/v3.2/command/set.html) about variables' types.* + +Also you can set this option to your `CMakeLists.txt` (do it **before** command `HunterGate`): +```cmake +# CMakeLists.txt +set(HUNTER_CONFIGURATION_TYPES MyRelease SuperDebug) +HunterGate(...) +``` + +```bash +> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON +... +-- [hunter *** DEBUG *** 2015-04-22T12:25:22] HUNTER_CONFIGURATION_TYPES: MyRelease;SuperDebug +``` + +### Per package + +You can customize package using `hunter_config` command (see also other [customizations](https://github.com/ruslo/hunter/wiki/example.custom.config.id)): + +```cmake +# CMakeLists.txt +HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.8.10.tar.gz" + SHA1 "9308d01ea52c7b8cf1347073c982c679dbac3c09" + LOCAL # <----- Use local config.cmake +) +... +hunter_add_package(GTest) +``` + +```cmake +# cmake/Hunter/config.cmake +hunter_config(GTest VERSION 1.7.0-hunter-9 CONFIGURATION_TYPES Release Debug) +hunter_config(ZLIB VERSION 1.2.8-hunter-1 CONFIGURATION_TYPES Release SuperRelease) +``` + +### Links + +* [CMAKE_BUILD_TYPE](http://www.cmake.org/cmake/help/v3.2/variable/CMAKE_BUILD_TYPE.html) +* [CMAKE_CONFIGURATION_TYPES](http://www.cmake.org/cmake/help/v3.2/variable/CMAKE_CONFIGURATION_TYPES.html) +* [Difference between CMAKE_BUILD_TYPE and CMAKE_CONFIGURATION_TYPES](http://stackoverflow.com/a/24470998/2288008) + +[hunter-configuration-types]: https://github.com/ruslo/hunter/wiki/usr.variables#hunter_configuration_types \ No newline at end of file diff --git a/docs/old-wiki/jenkins-pitfalls.md b/docs/old-wiki/jenkins-pitfalls.md new file mode 100644 index 000000000..6743d3089 --- /dev/null +++ b/docs/old-wiki/jenkins-pitfalls.md @@ -0,0 +1,53 @@ +### Fetch failed (windows) #1 + +* Error message + +``` +hudson.plugins.git.GitException: Failed to fetch from ... +Caused by: hudson.plugins.git.GitException: Command "git.exe clean -fdx" returned status code 1: +``` + +* Reason + +Possible reason is that some internal paths from build directory is too long for windows + +* Solution + +Use native windows command `rmdir` before git checkout, for example python script which remove `_builds` directory +([plugin used](https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep)): +```python +import os + +if os.name == 'nt': + # Fix windows error: `path too long` + os.system('rmdir _builds /s /q') +``` + +### Fetch failed (windows) #2 + +* Same reason but another solution. Tune git: [windows path too long for git](http://stackoverflow.com/a/22831095/2288008) + +### Path too long (windows) + +* Reason + +Path too long somewhere in a build step. + +* Solution (`HUNTER_JUNCTIONS`) + +Create a directory with a short path (like: `C:\jenkins\junctions`) and set an environment variable `HUNTER_JUNCTIONS` to point to this directory. Hunter will detect this variable and use this directory + to create [junction point](http://en.wikipedia.org/wiki/NTFS_junction_point). +You can verify that directory used by adding cmake variable `HUNTER_STATUS_DEBUG=ON`: + +``` +-- [hunter *** DEBUG ***] HUNTER_JUNCTIONS: C:/jenkins/junctions +-- [hunter *** DEBUG ***] Create windows junction: +-- [hunter *** DEBUG ***] from: C:/jenkins/home/workspace/HunterGate/CONFIG/Debug/TOOLCHAIN/nmake-vs2013-x64/label/windows/_builds/nmake-vs2013-x64-Debug/_3rdParty/hunter/external +-- [hunter *** DEBUG ***] to: C:/jenkins/junctions/lL1Pzqi5vb +Junction created for C:\jenkins\junctions\lL1Pzqi5vb <<===>> C:\jenkins\home\workspace\HunterGate\CONFIG\Debug\TOOLCHAIN\nmake-vs2013-x64\label\windows\_builds\nmake-vs2013-x64-Debug\_3rdParty\hunter\external +... +-- [hunter *** DEBUG ***] Generate step successful (dir: C:/jenkins/junctions/lL1Pzqi5vb) +... +-- [hunter *** DEBUG ***] Run build +-- [hunter *** DEBUG ***] Build step successful (dir: C:/jenkins/junctions/lL1Pzqi5vb) +``` \ No newline at end of file diff --git a/docs/old-wiki/rationale-toolchain-verification.md b/docs/old-wiki/rationale-toolchain-verification.md new file mode 100644 index 000000000..41d96a531 --- /dev/null +++ b/docs/old-wiki/rationale-toolchain-verification.md @@ -0,0 +1 @@ +* TODO \ No newline at end of file diff --git a/docs/old-wiki/usr.adding.new.package.custom.scheme.md b/docs/old-wiki/usr.adding.new.package.custom.scheme.md new file mode 100644 index 000000000..c7c3a71c5 --- /dev/null +++ b/docs/old-wiki/usr.adding.new.package.custom.scheme.md @@ -0,0 +1,167 @@ +Non-CMake projects can be added too. But sometimes it's not a trivial task (for example +there are a 3 custom schemes for [OpenSSL](https://github.com/ruslo/hunter/blob/master/cmake/projects/OpenSSL/hunter.cmake)). In general it's better to apply patch with CMake build and use [regular](https://github.com/ruslo/hunter/wiki/usr.adding.new.package) add instruction. Anyway here is a guide how to add a project with custom build: + +### 01. Test it manually +```bash +> wget https://github.com/phonegap/ios-sim/archive/1.8.2.tar.gz +> openssl sha1 1.8.2.tar.gz +SHA1(1.8.2.tar.gz)= 4328b3c8e6b455631d52b7ce5968170c9769eb1e +> tar xf 1.8.2.tar.gz +> cd ios-sim-1.8.2/ +> xcodebuild -target ios-sim -configuration Release +> ls build/Release/ios-sim +build/Release/ios-sim +``` + +### 02. Test it using ExternalProject_Add +```bash +> cat CMakeLists.txt +cmake_minimum_required(VERSION 3.0) + +include(ExternalProject) # ExternalProject_Add + +ExternalProject_Add( + ios_sim + URL + "https://github.com/phonegap/ios-sim/archive/1.8.2.tar.gz" + URL_HASH + SHA1=4328b3c8e6b455631d52b7ce5968170c9769eb1e + CONFIGURE_COMMAND + "" + BUILD_COMMAND + xcodebuild -target ios-sim -configuration Release + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + "${CMAKE_COMMAND}" -E make_directory "${CMAKE_INSTALL_PREFIX}" + COMMAND + "${CMAKE_COMMAND}" -E copy build/Release/ios-sim "${CMAKE_INSTALL_PREFIX}" +) +> cmake -H. -B_builds -DCMAKE_INSTALL_PREFIX=`pwd`/_install +> cmake --build _builds/ +> ls _install/ +ios-sim +``` +### 03. Add new package +First, custom build scheme need to be added to `cmake/schemes` directory +(*Note*: about directories [layout](https://github.com/ruslo/hunter/wiki/dev.layout)): +```bash +> cd ${HUNTER_ROOT} +> cat cmake/schemes/url_sha1_ios_sim.cmake.in +# This is configuration file, variable @SOME_VARIABLE_NAME@ will be substituted during configure_file command +cmake_minimum_required(VERSION 3.0) + +# If such variables like `CMAKE_CXX_FLAGS` or `CMAKE_CXX_COMPILER` not used by scheme +# setting `LANGUAGES` to `NONE` will speed-up build a little bit. If you have any problems/glitches +# use regular `project(Hunter)` command +project(Hunter LANGUAGES NONE) + +include(ExternalProject) # ExternalProject_Add + +# some Hunter modules will be used +list(APPEND CMAKE_MODULE_PATH "@HUNTER_SELF@/cmake/modules") + +include(hunter_status_debug) +include(hunter_test_string_not_empty) + +# print this message if HUNTER_STATUS_DEBUG option is ON +hunter_status_debug("Scheme: url_sha1_ios_sim") + +# Check variables is not empty +hunter_test_string_not_empty("@HUNTER_SELF@") +hunter_test_string_not_empty("@HUNTER_EP_NAME@") +hunter_test_string_not_empty("@HUNTER_PACKAGE_URL@") +hunter_test_string_not_empty("@HUNTER_PACKAGE_SHA1@") +hunter_test_string_not_empty("@HUNTER_PACKAGE_DOWNLOAD_DIR@") +hunter_test_string_not_empty("@HUNTER_PACKAGE_SOURCE_DIR@") +hunter_test_string_not_empty("@HUNTER_INSTALL_PREFIX@") + +ExternalProject_Add( + @HUNTER_EP_NAME@ # Name of the external project. Actually not used set for beautify logging messages + URL + @HUNTER_PACKAGE_URL@ # URL of the package to download + URL_HASH + SHA1=@HUNTER_PACKAGE_SHA1@ # SHA1 hash + DOWNLOAD_DIR + "@HUNTER_PACKAGE_DOWNLOAD_DIR@" # Archive destination location + SOURCE_DIR + "@HUNTER_PACKAGE_SOURCE_DIR@" # Unpack directory + INSTALL_DIR + "@HUNTER_INSTALL_PREFIX@" # not used actually (see install command) + CONFIGURE_COMMAND + "" + BUILD_COMMAND + xcodebuild -target ios-sim -configuration Release + BUILD_IN_SOURCE + 1 + INSTALL_COMMAND + "@CMAKE_COMMAND@" -E copy build/Release/ios-sim "@HUNTER_INSTALL_PREFIX@" +) +``` +Next steps are similar to [simple CMake-based](https://github.com/ruslo/hunter/wiki/usr.adding.new.package) +project add: +``` +> cat cmake/projects/ios_sim/hunter.cmake + +# !!! DO NOT PLACE HEADER GUARDS HERE !!! + +include(hunter_add_version) +include(hunter_download) +include(hunter_pick_scheme) + +hunter_add_version( + PACKAGE_NAME + ios_sim + VERSION + "1.8.2" + URL + "https://github.com/phonegap/ios-sim/archive/1.8.2.tar.gz" + SHA1 + 4328b3c8e6b455631d52b7ce5968170c9769eb1e +) + +hunter_pick_scheme(DEFAULT url_sha1_ios_sim) # Use new custom scheme +hunter_download(PACKAGE_NAME ios_sim) +``` +``` +> grep ios_sim cmake/config/default.cmake +hunter_config(ios_sim VERSION 1.8.2) +``` + +### 04. Using +Now package ready to be used: +```bash +> cat CMakeLists.txt +cmake_minimum_required(VERSION 2.8) + +include("cmake/HunterGate.cmake") + +HunterGate( + URL "https://url/to/your/hunter-archive.tar.gz" + SHA1 "put-archive-sha1-here" +) + +hunter_add_package(ios_sim) + +find_program(IOS_SIM_EXECUTABLE ios-sim ${IOS_SIM_ROOT}) +message("ios_sim: ${IOS_SIM_EXECUTABLE}") +> cmake -H. -B_builds +-- [hunter] HUNTER_ROOT: /.../Hunter +-- [hunter] [ Hunter-ID: 7912489 | Config-ID: 9ec2ff8 | Toolchain-ID: c018e63 ] +-- [hunter] IOS_SIM_ROOT: /.../Hunter/_Base/7912489/9ec2ff8/c018e63/Install (ver.: 1.8.2) +... +-- downloading... + src='https://github.com/phonegap/ios-sim/archive/1.8.2.tar.gz' +-- [download 100% complete] +ios_sim: /.../Hunter/_Base/7912489/9ec2ff8/c018e63/Install/ios-sim +``` + +### Default behaviour + +Note that such CMake variables like: +* [CMAKE_{C,CXX}_FLAGS](http://www.cmake.org/cmake/help/v3.2/variable/CMAKE_LANG_FLAGS.html) +* [CMAKE_{C,CXX}_COMPILER](http://www.cmake.org/cmake/help/v3.2/variable/CMAKE_LANG_FLAGS.html) +* [CMAKE_CONFIGURATION_TYPES](http://www.cmake.org/cmake/help/v3.2/variable/CMAKE_CONFIGURATION_TYPES.html) +* [BUILD_SHARED_LIBS](http://www.cmake.org/cmake/help/v3.2/variable/BUILD_SHARED_LIBS.html) + +must to be checked manually for each custom build scheme (see [CMake package default behaviour](https://github.com/ruslo/hunter/wiki/usr.adding.new.package#default-behaviour)) \ No newline at end of file diff --git a/docs/packages/all.rst b/docs/packages/all.rst new file mode 100644 index 000000000..e7da2cf36 --- /dev/null +++ b/docs/packages/all.rst @@ -0,0 +1,12 @@ +.. spelling:: + + wiki + +All packages +------------ + +.. toctree:: + :maxdepth: 1 + :glob: + + pkg/* diff --git a/docs/packages/cmake_modules.rst b/docs/packages/cmake_modules.rst new file mode 100644 index 000000000..6bd5992d5 --- /dev/null +++ b/docs/packages/cmake_modules.rst @@ -0,0 +1,10 @@ +.. spelling:: + + autotools + +CMake Modules +------------- + + - :ref:`pkg.autoutils` - CMake utilities to imitate autotools functions + - :ref:`pkg.CreateLaunchers` - CMake module to create command line and debug launchers, including MSVC ".user" file. + - :ref:`pkg.Sugar` - CMake tools and examples diff --git a/docs/packages/commandline.rst b/docs/packages/commandline.rst new file mode 100644 index 000000000..db3c2e9ac --- /dev/null +++ b/docs/packages/commandline.rst @@ -0,0 +1,12 @@ +.. spelling:: + + Commandline + commandline + +Commandline Tools +----------------- + + - :ref:`pkg.gflags` - contains a C++ library that implements commandline flags processing + - :ref:`pkg.cxxopts` - Lightweight C++ command line option parser + - :ref:`pkg.CLI11` - command line parser for C++11 and beyond that provides a rich feature set with a simple and intuitive interface + - :ref:`pkg.readline` - command line editor diff --git a/docs/packages/compiler.rst b/docs/packages/compiler.rst new file mode 100644 index 000000000..46ce0641c --- /dev/null +++ b/docs/packages/compiler.rst @@ -0,0 +1,7 @@ +Compiler +-------- + + - :ref:`pkg.ctti` - Compile Time Type Information for the C++ programming language. + - :ref:`pkg.bison` - general-purpose parser generator. + - :ref:`pkg.flex` - a tool for generating scanners. + - :ref:`pkg.LLVM` - collection of modular and reusable compiler and toolchain technologies. diff --git a/docs/packages/compression.rst b/docs/packages/compression.rst new file mode 100644 index 000000000..d7ee790c6 --- /dev/null +++ b/docs/packages/compression.rst @@ -0,0 +1,9 @@ +Compression +----------- + + - :ref:`pkg.BZip2` - high-quality data compressor. + - :ref:`pkg.lz4` - Extremely Fast Compression algorithm + - :ref:`pkg.lzma` - A compression library with an API similar to that of zlib. + - :ref:`pkg.minizip` - enables to extract files from a .zip archive file. + - :ref:`pkg.szip` + - :ref:`pkg.ZLIB` - A massively spiffy yet delicately unobtrusive compression library. diff --git a/docs/packages/computer-vision.rst b/docs/packages/computer-vision.rst new file mode 100644 index 000000000..5aff2ed87 --- /dev/null +++ b/docs/packages/computer-vision.rst @@ -0,0 +1,22 @@ +.. spelling:: + + Matlab + Morphable + Adelson + +Computer Vision +--------------- + + - :ref:`pkg.acf` - Aggregated Channel Feature object detection in C++ and OpenGL ES 2.0. + - :ref:`pkg.ccv` - A Modern Computer Vision Library + - :ref:`pkg.cvmatio` - Matlab Mat file read and write C++ class with OpenCV bindings. + - :ref:`pkg.cvsteer` - A concise implementation of separable steerable filters + via Freeman and Adelson, including second derivative of Gaussian and its + Hilbert transform, implemented with the OpenCV C++ API + - :ref:`pkg.dest` - high performance 2D shape tracking leveraging machine learning methods. + - :ref:`pkg.dlib` - modern C++ toolkit containing machine learning algorithms and tools for creating complex software in C++ to solve real world problems. + - :ref:`pkg.drishti` - Real time eye tracking for embedded and mobile devices. + - :ref:`pkg.eos` - A lightweight 3D Morphable Face Model fitting library in modern C++11/14 + - :ref:`pkg.Leptonica` - Open source library containing software that is broadly useful for image processing and image analysis applications + - :ref:`pkg.OpenCV` - Open Source Computer Vision Library + - :ref:`pkg.Tesseract` - Open Source OCR Engine diff --git a/docs/packages/concurrency.rst b/docs/packages/concurrency.rst new file mode 100644 index 000000000..ea292c110 --- /dev/null +++ b/docs/packages/concurrency.rst @@ -0,0 +1,24 @@ +.. spelling:: + + MultiThreading + HPC + GPGPU + GPU + LibCDS + libdill + libmill + +Concurrency +----------- + + - :ref:`pkg.ArrayFire` - general-purpose library that simplifies the process of developing software that targets parallel and massively-parallel architectures including CPUs, GPUs, and other hardware acceleration devices. + - :ref:`pkg.Async++` - concurrency framework for C++11 + - :ref:`pkg.BoostCompute` + - :ref:`pkg.GPUImage` - open source iOS framework for GPU-based image and video processing + - :ref:`pkg.LibCDS` - C++ library of Concurrent Data Structures + - :ref:`pkg.libdill` - C library that makes writing structured concurrent programs easy + - :ref:`pkg.libmill` - Go-style concurrency in C + - :ref:`pkg.ogles_gpgpu` - GPGPU for mobile devices and embedded systems using OpenGL ES 2.0 + - :ref:`pkg.OpenCL` - OpenCL headers and Installable Client Driver + - :ref:`pkg.OpenCL-cpp` - header only OpenCL c++ wrappers + - :ref:`pkg.thread-pool-cpp` - High performance C++14 thread pool diff --git a/docs/packages/containers.rst b/docs/packages/containers.rst new file mode 100644 index 000000000..e49dab928 --- /dev/null +++ b/docs/packages/containers.rst @@ -0,0 +1,5 @@ +Containers +---------- + + * :ref:`pkg.sparsehash` - C++ associative containers + * :ref:`pkg.sds` - Simple Dynamic Strings library for C diff --git a/docs/packages/crypto.rst b/docs/packages/crypto.rst new file mode 100644 index 000000000..c508f0bcf --- /dev/null +++ b/docs/packages/crypto.rst @@ -0,0 +1,11 @@ +.. spelling:: + + Crypto + CRC32C + CPU + +Crypto +------ + + - :ref:`pkg.crc32c` - CRC32C implementation with support for CPU-specific acceleration instructions + - :ref:`pkg.OpenSSL` - open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS>`_ and Secure Sockets Layer (SSL>`_ protocols. diff --git a/docs/packages/database.rst b/docs/packages/database.rst new file mode 100644 index 000000000..fb02d48f4 --- /dev/null +++ b/docs/packages/database.rst @@ -0,0 +1,18 @@ +.. spelling:: + + lmdb + LMDB + lmdbxx + +Database +-------- + + - :ref:`pkg.leveldb` - a fast key-value storage library + - :ref:`pkg.lmdb` - Lightning Memory-Mapped Database Manager + - :ref:`pkg.lmdbxx` - C++11 wrapper for the LMDB embedded B+ tree database library + - :ref:`pkg.MySQL-client` + - :ref:`pkg.odb-mysql` + - :ref:`pkg.odb-pgsql` + - :ref:`pkg.odb-sqlite` + - :ref:`pkg.PostgreSQL` + - :ref:`pkg.rocksdb` - an embeddable persistent key-value store for fast storage diff --git a/docs/packages/datetime.rst b/docs/packages/datetime.rst new file mode 100644 index 000000000..a817a4012 --- /dev/null +++ b/docs/packages/datetime.rst @@ -0,0 +1,9 @@ +.. spelling:: + + cctz + Datetime + +Datetime +-------- + + - :ref:`pkg.cctz` - library for translating between absolute and civil times using the rules of a time zone diff --git a/docs/packages/filesystem.rst b/docs/packages/filesystem.rst new file mode 100644 index 000000000..37d635956 --- /dev/null +++ b/docs/packages/filesystem.rst @@ -0,0 +1,9 @@ +.. spelling:: + + Filesystem + +Filesystem +---------- + + - :ref:`pkg.hdf5` - data model, library, and file format for storing and managing data. + - :ref:`pkg.tinydir` - Lightweight, portable and easy to integrate C directory and file reader diff --git a/docs/packages/frameworks.rst b/docs/packages/frameworks.rst new file mode 100644 index 000000000..6274083e0 --- /dev/null +++ b/docs/packages/frameworks.rst @@ -0,0 +1,16 @@ +.. spelling:: + + OpenTracing + Jaeger + +Frameworks +---------- + + - :ref:`pkg.Boost` - peer-reviewed portable C++ source libraries. + - :ref:`pkg.BoostProcess` + - :ref:`pkg.jaegertracing` - Jaeger C++ tracing implementation + - :ref:`pkg.opentracing-cpp` - OpenTracing API for C++ + - :ref:`pkg.Qt` + - :ref:`pkg.QtQmlManager` + - :ref:`pkg.wt` - Wt is a web GUI library in modern C++. + - :ref:`pkg.wxWidgets` - Cross-Platform GUI Library diff --git a/docs/packages/graphics.rst b/docs/packages/graphics.rst new file mode 100644 index 000000000..aa2263c0e --- /dev/null +++ b/docs/packages/graphics.rst @@ -0,0 +1,18 @@ +.. spelling:: + + freetype + shaders + +Graphics 2D/3D +-------------- + + - :ref:`pkg.aglet` - Tiny cross platform (headless) OpenGL context creation + - :ref:`pkg.Assimp` - portable Open Source library to import various well-known 3D model formats in a uniform manner + - :ref:`pkg.freetype` - render freetype fonts + - :ref:`pkg.glew` - The OpenGL Extension Wrangler Library + - :ref:`pkg.imgui` - Immediate-mode, bloat-free graphical user interface library for C++ + - :ref:`pkg.mojoshader` - MojoShader is a library to work with Direct3D shaders on alternate 3D APIs and non-Windows platforms + - :ref:`pkg.ogles_gpgpu` - GPGPU for mobile devices and embedded systems using OpenGL ES 2.0 + - :ref:`pkg.SDL2` - A cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. + - :ref:`pkg.SDL_ttf` - Sample library which allows to use TrueType fonts in SDL applications + - :ref:`pkg.Urho3D` - Cross-platform 2D and 3D game engine diff --git a/docs/packages/logging.rst b/docs/packages/logging.rst new file mode 100644 index 000000000..1d01e1612 --- /dev/null +++ b/docs/packages/logging.rst @@ -0,0 +1,7 @@ +Logging +------- + + - :ref:`pkg.fmt` - Small, safe and fast formatting library + - :ref:`pkg.glog` - C++ implementation of the Google logging module + - :ref:`pkg.log4cplus` - simple to use C++ logging API providing thread-safe, flexible, and arbitrarily granular control over log management and configuration. + - :ref:`pkg.spdlog` - Super fast C++ logging library. diff --git a/docs/packages/machine-learning.rst b/docs/packages/machine-learning.rst new file mode 100644 index 000000000..3f999db8a --- /dev/null +++ b/docs/packages/machine-learning.rst @@ -0,0 +1,11 @@ +.. spelling:: + + Keras + +Machine Learning +---------------- + + - :ref:`pkg.caffe` - fast open framework for deep learning. + - :ref:`pkg.dlib` - modern C++ toolkit containing machine learning algorithms and tools for creating complex software in C++ to solve real world problems. + - :ref:`pkg.xgboost` - Scalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM>`_ Library + - :ref:`pkg.frugally-deep` - Header-only library for using Keras models in C++ diff --git a/docs/packages/math.rst b/docs/packages/math.rst new file mode 100644 index 000000000..1961a9c6a --- /dev/null +++ b/docs/packages/math.rst @@ -0,0 +1,19 @@ +.. spelling:: + + Delaunay + +Math +---- + + - :ref:`pkg.CLAPACK` + - :ref:`pkg.Eigen` - C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms. + - :ref:`pkg.GSL` - GNU Scientific Library + - :ref:`pkg.HastyNoise` - SIMD open source noise generation library with a large collection of different noise algorithms. + - :ref:`pkg.OpenBLAS` - OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version + - :ref:`pkg.double-conversion` - provides binary-decimal and decimal-binary routines for IEEE doubles. + - :ref:`pkg.gemmlowp` - Low-precision matrix multiplication. + - :ref:`pkg.glm` - header only C++ mathematics library for graphics software based on the OpenGL Shading Language (GLSL) specifications. + - :ref:`pkg.half` - Half-precision floating point library + - :ref:`pkg.h3` - Hexagonal hierarchical geospatial indexing system + - :ref:`pkg.poly2tri` - 2D constrained Delaunay triangulation library + - :ref:`pkg.polyclipping` - Polygon and line clipping and offsetting library diff --git a/docs/packages/media.rst b/docs/packages/media.rst new file mode 100644 index 000000000..c58f0303c --- /dev/null +++ b/docs/packages/media.rst @@ -0,0 +1,17 @@ +.. spelling:: + + OpenAL + gif + WebP + +Media +----- + + - :ref:`pkg.Jpeg` - library for JPEG image compression. + - :ref:`pkg.OpenAL` - software implementation of the OpenAL 3D audio API. + - :ref:`pkg.PNG` - library for use in applications that read, create, and manipulate PNG (Portable Network Graphics) raster image files. + - :ref:`pkg.SDL_mixer` - A sample multi-channel audio mixer library for SDL. + - :ref:`pkg.TIFF` + - :ref:`pkg.giflib` - library for reading and writing gif images. + - :ref:`pkg.libyuv` - YUV scaling and conversion functionality. + - :ref:`pkg.WebP` - library to encode and decode images in WebP format. diff --git a/docs/packages/messaging.rst b/docs/packages/messaging.rst new file mode 100644 index 000000000..85e704854 --- /dev/null +++ b/docs/packages/messaging.rst @@ -0,0 +1,12 @@ +.. spelling:: + + IPC + +IPC/Messaging +------------- + + - :ref:`pkg.CapnProto` - Cap'n Proto serialization/RPC system - core tools and C++ library + - :ref:`pkg.Comet` - Modern (idiomatic>`_ binding between COM and C++ + - :ref:`pkg.rabbitmq-c` - C-language AMQP client library for use with v2.0+ of the RabbitMQ broker. + - :ref:`pkg.ZeroMQ` - provide an abstraction of asynchronous message queues, multiple messaging patterns, message filtering (subscriptions>`_, seamless access to multiple transport protocols and more. + - :ref:`pkg.ZMQPP` - "high-level" C++ binding for ZeroMQ/0mq/zmq diff --git a/docs/packages/networking.rst b/docs/packages/networking.rst new file mode 100644 index 000000000..709a5d531 --- /dev/null +++ b/docs/packages/networking.rst @@ -0,0 +1,30 @@ +.. spelling:: + + c-ares + gRPC + mDNS + DNS + websocket + Asio + scalable + +Networking +---------- + + - :ref:`pkg.autobahn-cpp` - open-source implementations of the The WebSocket Protocol and The Web Application Messaging Protocol (WAMP>`_ network protocols. + - :ref:`pkg.Avahi` - Service Discovery for Linux using mDNS/DNS-SD -- compatible with Bonjour + - :ref:`pkg.Beast` - HTTP and WebSocket built on Boost.Asio in C++11 + - :ref:`pkg.c-ares` - A C library for asynchronous DNS requests + - :ref:`pkg.CppNetlibUri` - C++ Network URI + - :ref:`pkg.civetweb` - Embedded C/C++ web server + - :ref:`pkg.cpr` - C++ Requests: Curl for People, a spiritual port of Python Requests + - :ref:`pkg.CURL` - A command line tool and library for transferring data with URL syntax + - :ref:`pkg.gRPC` - A high performance, open-source universal RPC framework + - :ref:`pkg.http-parser` - HTTP request/response parser for C + - :ref:`pkg.Libevent` - An event notification library for developing scalable network servers. + - :ref:`pkg.libevhtp` - Extremely-fast and secure embedded HTTP server library + - :ref:`pkg.kNet` - Low-level networking protocol library. + - :ref:`pkg.mongoose` - Embedded Web Server Library. + - :ref:`pkg.Libssh2` + - :ref:`pkg.PocoCpp` - Cross-platform C++ libraries with a network/internet focus. + - :ref:`pkg.websocketpp` - C++ websocket client/server library diff --git a/docs/packages/os.rst b/docs/packages/os.rst new file mode 100644 index 000000000..634c12be7 --- /dev/null +++ b/docs/packages/os.rst @@ -0,0 +1,10 @@ +OS +-- + + * :ref:`pkg.Android-Apk` + * :ref:`pkg.Android-Modules` + * :ref:`pkg.Android-SDK` + * :ref:`pkg.ios_sim` + * :ref:`pkg.QtAndroidCMake` + * :ref:`pkg.Washer` - Lightweight, header-only, C++ wrapper around the Windows API + * :ref:`pkg.WTL` - Windows Template Library (WTL) is a C++ library for developing Windows applications and UI components. diff --git a/docs/packages/pkg/ARM_NEON_2_x86_SSE.rst b/docs/packages/pkg/ARM_NEON_2_x86_SSE.rst new file mode 100644 index 000000000..d3319370f --- /dev/null +++ b/docs/packages/pkg/ARM_NEON_2_x86_SSE.rst @@ -0,0 +1,20 @@ +.. spelling:: + + ARM_NEON_2_x86_SSE + +.. index:: cpu ; ARM_NEON_2_x86_SSE + +.. _pkg.ARM_NEON_2_x86_SSE: + +ARM_NEON_2_x86_SSE +================== + +- `Official `__ +- `Hunterized `__ +- `Example `__ + +.. code-block:: cmake + + hunter_add_package(ARM_NEON_2_x86_SSE) + find_package(ARM_NEON_2_x86_SSE CONFIG REQUIRED) + target_link_libraries(... ARM_NEON_2_x86_SSE::ARM_NEON_2_x86_SSE) diff --git a/docs/packages/pkg/AllTheFlopsThreads.rst b/docs/packages/pkg/AllTheFlopsThreads.rst new file mode 100644 index 000000000..b716f6460 --- /dev/null +++ b/docs/packages/pkg/AllTheFlopsThreads.rst @@ -0,0 +1,28 @@ +.. spelling:: + + AllTheFlopsThreads + +.. index:: unsorted ; AllTheFlopsThreads + +.. _pkg.AllTheFlopsThreads: + +AllTheFlopsThreads +================== + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-ARM-EABI-v7a-System-Image.rst b/docs/packages/pkg/Android-ARM-EABI-v7a-System-Image.rst new file mode 100644 index 000000000..87b67efef --- /dev/null +++ b/docs/packages/pkg/Android-ARM-EABI-v7a-System-Image.rst @@ -0,0 +1,29 @@ +.. spelling:: + + Android-ARM-EABI-v7a-System-Image + EABI + +.. index:: android_sdk_component; Android-ARM-EABI-v7a-System-Image + +.. _pkg.Android-ARM-EABI-v7a-System-Image: + +Android-ARM-EABI-v7a-System-Image +================================= + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-ARM64-v8a-System-Image.rst b/docs/packages/pkg/Android-ARM64-v8a-System-Image.rst new file mode 100644 index 000000000..283127e6a --- /dev/null +++ b/docs/packages/pkg/Android-ARM64-v8a-System-Image.rst @@ -0,0 +1,21 @@ +.. spelling:: + + Android + ARM64 + v8a + System + Image + +.. index:: android_sdk_component ; Android-ARM64-v8a-System-Image + +.. _pkg.Android-ARM64-v8a-System-Image: + +Android-ARM64-v8a-System-Image +============================== + +- `Example `__ + +.. literalinclude:: /../examples/Android-ARM64-v8a-System-Image/CMakeLists.txt + :language: cmake + :start-after: # DOCUMENTATION_START { + :end-before: # DOCUMENTATION_END } diff --git a/docs/packages/pkg/Android-Apk.rst b/docs/packages/pkg/Android-Apk.rst new file mode 100644 index 000000000..4b89b463a --- /dev/null +++ b/docs/packages/pkg/Android-Apk.rst @@ -0,0 +1,23 @@ +.. spelling:: + + Android-Apk + Apk + +.. index:: android ; Android-Apk + +.. _pkg.Android-Apk: + +Android-Apk +=========== + +- `Official `__ +- `Hunterized `__ +- `Usage examples `__ + +.. code-block:: cmake + + hunter_add_package(Android-Apk) + list(APPEND CMAKE_MODULE_PATH "${ANDROID-APK_ROOT}") + include(AndroidApk) + add_library(simple ...) + android_create_apk(NAME simple DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/apk") diff --git a/docs/packages/pkg/Android-Build-Tools.rst b/docs/packages/pkg/Android-Build-Tools.rst new file mode 100644 index 000000000..422ba14de --- /dev/null +++ b/docs/packages/pkg/Android-Build-Tools.rst @@ -0,0 +1,28 @@ +.. spelling:: + + Android-Build-Tools + +.. index:: android_sdk_component; Android-Build-Tools + +.. _pkg.Android-Build-Tools: + +Android-Build-Tools +=================== + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-Google-APIs-Intel-x86-Atom-System-Image.rst b/docs/packages/pkg/Android-Google-APIs-Intel-x86-Atom-System-Image.rst new file mode 100644 index 000000000..7b9977919 --- /dev/null +++ b/docs/packages/pkg/Android-Google-APIs-Intel-x86-Atom-System-Image.rst @@ -0,0 +1,29 @@ +.. spelling:: + + Android-Google-APIs-Intel-x86-Atom-System-Image + APIs + +.. index:: android_sdk_component ; Android-Google-APIs-Intel-x86-Atom-System-Image + +.. _pkg.Android-Google-APIs-Intel-x86-Atom-System-Image: + +Android-Google-APIs-Intel-x86-Atom-System-Image +=============================================== + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-Google-APIs.rst b/docs/packages/pkg/Android-Google-APIs.rst new file mode 100644 index 000000000..215ca5990 --- /dev/null +++ b/docs/packages/pkg/Android-Google-APIs.rst @@ -0,0 +1,29 @@ +.. spelling:: + + Android-Google-APIs + APIs + +.. index:: android_sdk_component ; Android-Google-APIs + +.. _pkg.Android-Google-APIs: + +Android-Google-APIs +=================== + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-Google-Repository.rst b/docs/packages/pkg/Android-Google-Repository.rst new file mode 100644 index 000000000..809acea01 --- /dev/null +++ b/docs/packages/pkg/Android-Google-Repository.rst @@ -0,0 +1,28 @@ +.. spelling:: + + Android-Google-Repository + +.. index:: android_sdk_component ; Android-Google-Repository + +.. _pkg.Android-Google-Repository: + +Android-Google-Repository +========================= + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-Intel-x86-Atom-System-Image.rst b/docs/packages/pkg/Android-Intel-x86-Atom-System-Image.rst new file mode 100644 index 000000000..be8d2f7af --- /dev/null +++ b/docs/packages/pkg/Android-Intel-x86-Atom-System-Image.rst @@ -0,0 +1,28 @@ +.. spelling:: + + Android-Intel-x86-Atom-System-Image + +.. index:: android_sdk_component ; Android-Intel-x86-Atom-System-Image + +.. _pkg.Android-Intel-x86-Atom-System-Image: + +Android-Intel-x86-Atom-System-Image +=================================== + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-MIPS-System-Image.rst b/docs/packages/pkg/Android-MIPS-System-Image.rst new file mode 100644 index 000000000..1c1752911 --- /dev/null +++ b/docs/packages/pkg/Android-MIPS-System-Image.rst @@ -0,0 +1,20 @@ +.. spelling:: + + Android + MIPS + System + Image + +.. index:: android_sdk_component ; Android-MIPS-System-Image + +.. _pkg.Android-MIPS-System-Image: + +Android-MIPS-System-Image +========================= + +- `Example `__ + +.. literalinclude:: /../examples/Android-MIPS-System-Image/CMakeLists.txt + :language: cmake + :start-after: # DOCUMENTATION_START { + :end-before: # DOCUMENTATION_END } diff --git a/docs/packages/pkg/Android-Modules.rst b/docs/packages/pkg/Android-Modules.rst new file mode 100644 index 000000000..518054536 --- /dev/null +++ b/docs/packages/pkg/Android-Modules.rst @@ -0,0 +1,22 @@ +.. spelling:: + + Android-Modules + +.. index:: android ; Android-Modules + +.. _pkg.Android-Modules: + +Android-Modules +=============== + +- `Official `__ +- `Hunterized `__ + +.. code-block:: cmake + + hunter_add_package(Android-Modules) + + list(APPEND CMAKE_MODULE_PATH "${ANDROID-MODULES_ROOT}") + + include(AndroidNdkGdb) + include(AndroidNdkModules) diff --git a/docs/packages/pkg/Android-SDK-Platform-tools.rst b/docs/packages/pkg/Android-SDK-Platform-tools.rst new file mode 100644 index 000000000..21c524417 --- /dev/null +++ b/docs/packages/pkg/Android-SDK-Platform-tools.rst @@ -0,0 +1,28 @@ +.. spelling:: + + Android-SDK-Platform-tools + +.. index:: android_sdk_component ; Android-SDK-Platform-tools + +.. _pkg.Android-SDK-Platform-tools: + +Android-SDK-Platform-tools +========================== + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-SDK-Platform.rst b/docs/packages/pkg/Android-SDK-Platform.rst new file mode 100644 index 000000000..930e92886 --- /dev/null +++ b/docs/packages/pkg/Android-SDK-Platform.rst @@ -0,0 +1,28 @@ +.. spelling:: + + Android-SDK-Platform + +.. index:: android_sdk_component ; Android-SDK-Platform + +.. _pkg.Android-SDK-Platform: + +Android-SDK-Platform +==================== + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-SDK-Tools.rst b/docs/packages/pkg/Android-SDK-Tools.rst new file mode 100644 index 000000000..ff5c683e8 --- /dev/null +++ b/docs/packages/pkg/Android-SDK-Tools.rst @@ -0,0 +1,28 @@ +.. spelling:: + + Android-SDK-Tools + +.. index:: android_sdk_component ; Android-SDK-Tools + +.. _pkg.Android-SDK-Tools: + +Android-SDK-Tools +================= + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/Android-SDK.rst b/docs/packages/pkg/Android-SDK.rst new file mode 100644 index 000000000..3955b55bd --- /dev/null +++ b/docs/packages/pkg/Android-SDK.rst @@ -0,0 +1,23 @@ +.. spelling:: + + Android-SDK + +.. index:: android ; Android-SDK + +.. _pkg.Android-SDK: + +Android-SDK +=========== + +This module helps to create Android SDK directory: + +- https://github.com/hunter-packages/android-sdk + +.. code-block:: cmake + + hunter_add_package(Android-SDK) + message("Path to `android`: ${ANDROID-SDK_ROOT}/android-sdk/tools/android") + message("Path to `emulator`: ${ANDROID-SDK_ROOT}/android-sdk/tools/emulator") + message("Path to `adb`: ${ANDROID-SDK_ROOT}/android-sdk/platform-tools/adb") + +- `Examples `__ diff --git a/docs/packages/pkg/Android-Support-Repository.rst b/docs/packages/pkg/Android-Support-Repository.rst new file mode 100644 index 000000000..973f83f6c --- /dev/null +++ b/docs/packages/pkg/Android-Support-Repository.rst @@ -0,0 +1,28 @@ +.. spelling:: + + Android-Support-Repository + +.. index:: android_sdk_component ; Android-Support-Repository + +.. _pkg.Android-Support-Repository: + +Android-Support-Repository +========================== + +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + diff --git a/docs/packages/pkg/AngelScript.rst b/docs/packages/pkg/AngelScript.rst new file mode 100644 index 000000000..e37f7f567 --- /dev/null +++ b/docs/packages/pkg/AngelScript.rst @@ -0,0 +1,20 @@ +.. spelling:: + + AngelScript + +.. index:: unsorted ; AngelScript + +.. _pkg.AngelScript: + +AngelScript +=========== + +- `Official `__ +- `Hunterized `__ +- `Example `__ + +.. code-block:: cmake + + hunter_add_package(AngelScript) + find_package(AngelScript CONFIG REQUIRED) + target_link_libraries(boo PUBLIC AngelScript::AngelScript) diff --git a/docs/packages/pkg/ArrayFire.rst b/docs/packages/pkg/ArrayFire.rst new file mode 100644 index 000000000..bd9d330ba --- /dev/null +++ b/docs/packages/pkg/ArrayFire.rst @@ -0,0 +1,27 @@ +.. spelling:: + + ArrayFire + +.. index:: concurrency ; ArrayFire + +.. _pkg.ArrayFire: + +ArrayFire +========= + +.. |hunter| image:: https://img.shields.io/badge/hunter-v0.12.48-blue.svg + :target: https://github.com/ruslo/hunter/releases/tag/v0.12.48 + :alt: Hunter v0.12.48 + +- `Official `__ +- `Hunterized `__ +- `Example `__ +- `Testing `__ +- Available since |hunter| + +.. code-block:: cmake + + hunter_add_package(ArrayFire) + find_package(ArrayFire CONFIG REQUIRED) + target_link_libraries(... ArrayFire::af) + target_link_libraries(... ArrayFire::afcpu) diff --git a/docs/packages/pkg/Assimp.rst b/docs/packages/pkg/Assimp.rst new file mode 100644 index 000000000..82b9d1a85 --- /dev/null +++ b/docs/packages/pkg/Assimp.rst @@ -0,0 +1,21 @@ +.. spelling:: + + Assimp + +.. index:: graphics ; Assimp + +.. _pkg.Assimp: + +Assimp +====== + +- http://assimp.org/ +- `Official GitHub repo `__ +- `Hunterized `__ +- `Example `__ + +.. code-block:: cmake + + hunter_add_package(Assimp) + find_package(Assimp CONFIG REQUIRED) + target_link_libraries(... Assimp::assimp) diff --git a/docs/packages/pkg/Async++.rst b/docs/packages/pkg/Async++.rst new file mode 100644 index 000000000..5d2c1ba61 --- /dev/null +++ b/docs/packages/pkg/Async++.rst @@ -0,0 +1,25 @@ +.. spelling:: + + Async + +.. _pkg.Async++: + +Async++ +======= + +.. |hunter| image:: https://img.shields.io/badge/hunter-v0.12.28-blue.svg + :target: https://github.com/ruslo/hunter/releases/tag/v0.12.28 + :alt: Hunter v0.12.28 + +- `Official `__ +- `Hunterized `__ +- Available since |hunter| +- Added by `Andrei Laphin `__ + (`pr-268 `__) + +.. code-block:: cmake + + hunter_add_package(Async++) + find_package(Async++ CONFIG REQUIRED) + + target_link_libraries(... Async++::Async++) diff --git a/docs/packages/pkg/Avahi.rst b/docs/packages/pkg/Avahi.rst new file mode 100644 index 000000000..f33141162 --- /dev/null +++ b/docs/packages/pkg/Avahi.rst @@ -0,0 +1,26 @@ +.. spelling:: + + Avahi + +.. index:: networking ; Avahi + +.. _pkg.Avahi: + +Avahi +===== + +.. |hunter| image:: https://img.shields.io/badge/hunter-v0.12.10-blue.svg + :target: https://github.com/ruslo/hunter/releases/tag/v0.12.10 + :alt: Hunter v0.12.10 + +- `Official `__ +- `Example `__ +- Available since |hunter| +- Added by `Damien Buhl `__ + (`pr-237 `__) + +.. code-block:: cmake + + hunter_add_package(Avahi) + find_package(Avahi REQUIRED) + target_link_libraries(... Avahi::common Avahi::client Avahi::compat_libdns_sd) diff --git a/docs/packages/pkg/BZip2.rst b/docs/packages/pkg/BZip2.rst new file mode 100644 index 000000000..58948df86 --- /dev/null +++ b/docs/packages/pkg/BZip2.rst @@ -0,0 +1,26 @@ +.. spelling:: + + BZip + +.. index:: compression ; BZip2 + +.. _pkg.BZip2: + +BZip2 +===== + +.. |hunter| image:: https://img.shields.io/badge/hunter-v0.9.9-blue.svg + :target: https://github.com/ruslo/hunter/releases/tag/v0.9.9 + :alt: Hunter v0.9.9 + +- `Official `__ +- `Hunterized `__ +- `Example `__ +- Available since |hunter| + +.. code-block:: cmake + + hunter_add_package(BZip2) + + find_package(BZip2 CONFIG REQUIRED) + target_link_libraries(... BZip2::bz2) diff --git a/docs/packages/pkg/Beast.rst b/docs/packages/pkg/Beast.rst new file mode 100644 index 000000000..c3b2d22fe --- /dev/null +++ b/docs/packages/pkg/Beast.rst @@ -0,0 +1,24 @@ +.. spelling:: + + Beast + +.. index:: networking ; Beast + +.. _pkg.Beast: + +Beast +===== + +.. |hunter| image:: https://img.shields.io/badge/hunter-v0.9.9-blue.svg + :target: https://github.com/ruslo/hunter/releases/tag/v0.9.9 + :alt: Hunter v0.9.9 + +- `Official `__ +- `Hunterized `__ +- Available since |hunter| + +.. code-block:: cmake + + hunter_add_package(Beast) + find_package(Beast CONFIG REQUIRED) + target_link_libraries(... Beast::Beast) diff --git a/docs/packages/pkg/Boost.rst b/docs/packages/pkg/Boost.rst new file mode 100644 index 000000000..88b32a2fe --- /dev/null +++ b/docs/packages/pkg/Boost.rst @@ -0,0 +1,177 @@ +.. index:: frameworks ; Boost + +.. _pkg.Boost: + +Boost +===== + +.. code-block:: cmake + + # Header-only libraries + hunter_add_package(Boost) + find_package(Boost CONFIG REQUIRED) + target_link_libraries(... Boost::boost) + +- `Example `__ + +.. code-block:: cmake + + # Boost components (see list below) + hunter_add_package(Boost COMPONENTS system filesystem) + find_package(Boost CONFIG REQUIRED system filesystem) + target_link_libraries(... Boost::system Boost::filesystem) + +Examples: + +- `Boost-uuid `__ +- `Boost-system `__ +- `Boost-iostreams `__ +- `Boost-filesystem `__ +- `Boost-math `__ +- `Boost-contract `__ +- `Boost-stacktrace `__ + +List of components and availability (other libraries are header-only): + +.. literalinclude:: /../cmake/modules/hunter_get_boost_libs.cmake + :language: cmake + :start-after: # DOCUMENTATION_START { + :end-before: # DOCUMENTATION_END } + +CMake options +------------- + +You can use ``CMAKE_ARGS`` feature +(see +`customization `__) +to pass options to boost build or to append config macros in the default boost user +config file (``boost/config/user.hpp``): + +- Options of special form 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 G>AwTH(0;rC literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images-artifactory/02-remove-anon.png b/docs/user-guides/hunter-user/images-artifactory/02-remove-anon.png new file mode 100644 index 0000000000000000000000000000000000000000..fb45aebff2a8d213bb78fa593a487e445df04ce4 GIT binary patch literal 41969 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%0D>WyfJkM6?Bk)2^iJCDVRybp2C+SNE>W|LG7Tdp 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 U&f4t#VduSQX7y*j$(8&61`Be&-v9sr literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images-artifactory/06-add-user.png b/docs/user-guides/hunter-user/images-artifactory/06-add-user.png new file mode 100644 index 0000000000000000000000000000000000000000..830c3ea753db599db651bc7db2f225dc0742692a GIT binary patch literal 71694 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 literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images-artifactory/07-create-reader.png b/docs/user-guides/hunter-user/images-artifactory/07-create-reader.png new file mode 100644 index 0000000000000000000000000000000000000000..a11df2e6984792650a7d54e92a53a02d5c00c4e9 GIT binary patch literal 45700 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 literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images-artifactory/08-generate-api-key.png b/docs/user-guides/hunter-user/images-artifactory/08-generate-api-key.png new file mode 100644 index 0000000000000000000000000000000000000000..04f554fba3fa2f59091c89593ae2716e5281d560 GIT binary patch literal 43728 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

    a2JdWmkF#T?aQ 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 z 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 GlJ_^LLM;3M literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images-artifactory/11-users-permissions.png b/docs/user-guides/hunter-user/images-artifactory/11-users-permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..95470a90d1707b2661cf766e2ed197d475b43e2c GIT binary patch literal 52569 zcmcGW2T+si_vd3l6a-X2t|(xqgAEjrZUrd<2{i;oK)Uo^1VKdsm8Kv~Kp-IrJ#<7w zlrAkmAOYzKRY-tPvQLov+yCy&&VP1iHZ#tRF?rvooadbH`JD6Km%7@wIoSBwAP@-0 z-8(n*AP^Q91hQLq|32`ERipA#@Sk07dbiaen6?ws;4gb^RJBwgkb-FTjR!2??+2dT zF?NGMIKMIf?1~fTJPv`h%-y}AYT#`?GsNm|U^Vc4MEL9>N&y9&osaha_phb2b2Ne;a;0BAA1npLegVUM8-?Z~oA5^XA0ICztNM`|zlfkx={g z^5n;9Nw@YTCFjAP&eS1iaCh+faXR;wTT-oSO@raRg_z>32RU>u1iJI~#gRI(owqkc z=f-gKxs`ZJj7FGPZ^rb+-i-bNScw|c9*W9Z_oB?9WrH?%o0fZIMVep#9%y{&yTac) zsw}=S$S7|`$dP`FpZB&8E)2t~w6UEvLL*9Q;J?=NCvsN2Vap0v<{o|M1avTZO zt)}eT_tkaZAE(>9$p6E*CA5c93Af)QP?w^tj7l8iT1{)eOkh*z(HAL$X)z_3o+e~0 z_BZTijvc@ zot=n?@n=P`DeKtA9S)8%zw}-3I5pF>ja|#kqxl8FOb2$~ewWs>u-}?JO*m><15^Tq zR?pd*T`zZ3m)`2zL-P zDnD>^;yJiN4S7&br4WY35hSXKvlgw`*(Ga1uddj6yf==vI+a~zS->rC+@FM{=%B<)&8?b#-I^F4CSh7ES4-T<>4vC#9i$76J%SNh|2L+{Jv zg|vlyqL9i}vs*$9(7H0s6;Gb;>xuB{$wJ-^#T%k||Cop(yWqq%Jwq4zSZ=hB{pDv$ zvRg~4l+bh}^276%6J$Yr2pg1lIhBA(9U@T#4Nv_wAP7&a|2|Z9Sx^rjlv}r?NWHDNw6?XaxmbiQ%>Mno;0p&zg_t{!uf#>I*X3_3_t%|7f`ZAoS(<>bqRHa z20kG3ZnJ-#g&R0HM7=sT^NCn!@wUMR|Nd-d zCWkVsDfBuB(I~ynirRYPESi%(qz}_}VeFGeUArIbqk$rRs2|}~vHMXKp23={XF&1j z*y1lt5lFVlra!lt!|L{vNJ3=Hfi%}6dG|Q>y-uchvHA5^Y{?^nlIU&Z!cEWJ&?cd4 zk?|gz?j0U+$m#4Z-{f1xN|jwxhsH=YTc@&1xwd9&F_hGyn!0tpY!o6Z#Wa4{Dm*1y zJEM!9aLhN^e?VuYR!D;4UtAl6Ses0RFXU0Tl(qu4kG)l7gvBzP99M)WJe&~ZR4;w( z_g26}vGD9neOvLL@g_gN-6}udP5wk-uKm7L`Dw|@$(Z*ei)vjg-B&|Z%bTZ4;1l6U zmDvHW{<^MQ=c(Qy!X;rBy)1NijrfboT6{GtOFeSf-(@3+%P#ehFWl92o@=Gj?$?to zKiaDgyr}5Nz)p_nl~8Q~E_0_RB)-O42gO9eq+>i}Z|xZGY58Jg4>@gJI-8KbeoJx} z<_<%*)#=C9R6}iM>dGEs!NE88{8>Ye)nqS z=qkZs@%uSh_ueN-rDQKcv0IEd%oc%5P7a*P?Jf4zubf|Jbr|_>FmKSn%Ds}7H!Aa{ z$e(I-bDvf|@5f_^x->OtSkVa5k(Vr*ssCfLa|thipYrp z&Xd>fAygmc(=TP8)Wx5YR!yHvV%4s|Q-eA9kP(=S5UtcXVL0x|dSgRF`J2naY&RRY z{OgmW1%(yO13gee`4PKKl?`}@<}B7<4WEVASoAEEDiZ#0=`9JWMpo!0j~`S@(YIm;QwEuua4o_CMn+>$fjaN2OS_k^40!&fQ9 zf=->dU;H0lb>`-zw(mt9)*Yq|1t0#v%Hp2Ro5$8}X7z}!I+89XvI)^Sl}UetOw{i| zD~0*9sd?yLqjdQ^CbUA}|M?&YXXol%^@p|Ies1)l@^UVM7_ z*?kQO>#_Clsq@@zLc^+i8VDel7S^(VsrD2ijd+J_)U7!^c(djA?y*#c^agMrM1!M% zAg5{kYP_X5g30zJT6=vMz$_iuhp#}CXsr~q=`VYa8>FKs$mZ2Y-?LeV7Mr#g8KXxnFOcrDDXLxQ4bPr8Oq^O}_!6xaT^5NZBC%UbzYP5vFD>7buNyz& zXosWqJ}SGoChfWI60{O^s&^~k&!(q)h7|GQw-C02Sh8!D*G#awJ+1&N#b{B0Z5+<~ z{zIl7+rFQtiwhZekW*7Awnlp-a;gvg2t@6KibLn|> zEUe!VSM^Y4tsZ_}IlWR4qL(^{fTG(>l}V;Cs_JVVa1YXI!aQr?kt&ipDm-+Oi@5++ zPj8))>dWt_`Ka*KG^XgTcwo^7d+Yv}lG+Qs7M*`cowc=Iv?wcGdlu+=xb~l+@&`6J zWwvlJl(0nVl)xU&A8z^l2PqpPT?I$4lRBQ{Ul3K%XUPoG9e*sMd@ZhH;c}UlyP(q0 z_m1?Lx`@t>4jEy2_=OItI20O(Bw18JG$i977Z5c)1mCGNtP{}U7*xqPK38G;b;_&FuUVU<%_fq`FYTW%Jxn@?s$!H33mN}U->&i3I|W|JKw6Y`k(EiUR-LV!#E1wTfJ z*K7#qq>rham--(nOfH0w*EoWmUXQo>rG!}SyMq07ee(+5r#%!mTP(|R`D*N#oDm0X zndP}+_u65@GDo%o>;wku`|MiX;30s{4o2+xyL^xy|#Nm--_h4of4?;Y;AU!rFneF&?fXM zw$SEC_Nnb#gNZQbhaTd17Yeke;_>K1(^|`F1r2cHW@)cqOC9 zk$p1yHb*|E2ci6M-eka&^k$Wf`PQK8uE8Z(Jke>3EUUn%f925q`xmWGl*=^hnTAv4 zMmeR2M*ntoc5tN~H-FUM*(>!)HgMUtp6ge=2Esz6UBWaCJ=QXCUdwptA0<2=FLp~Y z9tFeYmibq%D^$*YAi|35E4TXX3^B8%@Rfd!>B;2B$z-89N5zu^loL^yB22T7&_c+?aSFagtx{WS&oyX3XSHg z)N`g4KDo_O%K~1%J~w#UCGBDHB(*Y#)_EVMG5C%T^=9wo9{*7&eb~(Al_)*oKQ5+q zZh*q4F)0_=zn4&IQ_21=$oTqqlkR)21hH?1`ATT*(uBt9hbSDnRI5_9znR_ zm+X3aY^k0~l(?(5=i3v5{;8GCe6;y_ z>+wstu-Aggl};(_TmH?Z5-ag7o|&`m4D#ZN=pfQeDdVdQSX^>W`0a|fSpFlJE_0u5 z6}}veO(a#K#>_vSQfV`vl22;RC~xaGF0_4#i+!-3A^+EcskD&UFKRXR4POX&M0A-Uo0 zhWW@-i-B?JVuwPjRhQJ&k(W@vS+J3r-$VNLtB~^9Tj?$L-V&>aZ;i>(; zDp}+7hO@%yJ;+3dpQ(-{<-H`c2&6!;IghHkwSVHMBYRCb>fKdrd%>`qNO6Mw)F`)> zGRZ=w1cSJc&q=dj>et}H8>F}^C$92m3-}_lBsP93?7M#ssn&9RS4!Lo%<-wdyM@v~6e4q`Ouh*W5!ERQ=L*1{JIjsV~xD_dX%z>Vf15G>J$n6)a0xU$Lo{^rOu##&f;^CTcTDgcJ3M zww$R!fkCNB0*FnwxLGr|WvD0KYo!c!$O>+rD!oW_!}IYaU{^2SUQ@E65)ZLh(|bnS{%)GC}a8)Cyn570Pueu|wS3a^=E32a(ghto<%(heG zFU?hc6bn@s<>7?YTjzeys%27x;7jDLWA$c29YtIU9gIuD@Z&;YYMA4S)g7`oAY+!nGw}JXb8_^YlGWX zay4;wqg)q1HxLV^Zuo7640Jn<&v8Yb=(!MNd*Yv4wRRM{tM{RLt$TWk$A32o7z{%P zAA7GeBC8tPuFtryTq7;c4t>~kZLVONn)#8;$(h1dR%EQDD5(zl^$avFLX5`aK3;;< zm4+n~g%Z)}i|0H^E+C{%e54OedmR=Gb=$ z0sCr`kMH{t&`w%b`S2oki1GWpUZ-v#v@)e*!`nGJ?~1|JD>+1kG5L7*eD*OK0q-~& zjz=MviuzM49odjqxGM`^X7aZ>-VnU~_?GLYQu&m+!sUC)E#pasWj|A{IGA()lid9& z;oQ|}vZD;4#4917_GAO^XWNHZJ6>e@fh?pjY=tIL)16IC0f}{xzgvPMR~L6_UIcAz zMxn$5ftOWl=dP|@w)@qk*v_tY&+Y;5Y5GV)h*X&IuW%=}T6cLy!ZTcURT5=pz2Hz) zN_v3$A9YotWkzbt!Na^q#U++S4LHKRE4XCL5ZS*RSGd^BLMIO&v<_fy2|J8;nMK_8 zj3aBBu*-sbg+N71)n3$*nR6&YW`1|AbI2(>sB{`WNwb&A>idaYvuHy#d~(A7phrqY z6dm%;ud7}79}D}+Aai-4p_RHra(W|T`fG7a)}~^deK&k=YfiATc&UN5ajbpdr=*VS z+fW-rvK`{}c?lw;<3}S7YftFR_))hUQC) zH-!Lf^6OKssTRk3hROY$rce8%pEP*jniF5cH-8`_84GZHVWIop*)M_m|;s zpTmU0=Q8-bu2n=1U{!neNr@PIs7^UlH!{H=Pt35rb&c*p_t;-OJ0N(_phxrcoy!}n z&wtr?!OyxQ6mJEpASv-fn{y;iWk?UVUUpBC-vtY*v?;|^9-+LjY`SY|t7kKBY4erg zQ~o?UFQbA|T)`;D&NX*jbq`yvNRfAj7K9T?zPreK%-YM*)7h?XJ2nxd+@xbe+h zspnaj!uFv=eCry2a7}GvJ63&?CiUyVtS3+sy4zAO-QGnd-=s`x#`|fKKRIJs$j@H4 zTjOCqa#E-1t5CHJi+GJyZSRUt^TqV5we8kH4_+R4*_(GuAD^Jk3T2f=5xc{XCY-Pw zG2H;bQf3$L>l`&fXi&$mFLhk5vOI=nWus_wWs#daJqQ(6n<%m__0s(YE53|Fr6DJHN}d=4@l)HyBB`s6s_84ZF}(7X#u3oh5w>wus* zipujR);yr>6Hm~6QWP;7JdLvHTb2QL6XDbtupb8c$*VoRJMvW(82kh;D*cLorCVs5 zl>d>i7f2Ic=;v_GE-8r$C7on?nW-RvwZ|`6=9o&cvFVW%7_(+JgLvJSrnd%RXIJ<* zKTqm1JU1n-9e95pttV~B9F+?3;}A`vlANPFkWAW4Wgmz*!iy520G0u64)9Lw^`1lnO$-LYfW%5s7_tA`3 zRZqe!c(*xm+_XhWnI1c&78*iIJ=)NV!Eq1r~hlk)#(WVaqn7*WA?9PrT#?yWw<;N;i?(ikO*MH?2>7F zoS3fl?ZP0*^Gz(UrGlr z|GSDr!#QE$`IUIhCk=u4jIyG}o8p@D%p`m2$oUWItIqBG%MS%* zqn=teLrsr-Iu(!b)7<&|jdI{PQXzK2!ei{mTjG(OPsgHnLlL>0u%OiuR_6mdAO30Q zV*Whw-Mioa8O%)V|4ki+_f9_YLxCM0<0xa_Ta1LFOd2A1B~P8IBe3n<*w3lF@x-v7-Yi{PcA@mC?i5YCjzAd=$fqD6N3(x7XA)l zm&zX-8*8cmDV*v+!DClS1!s!8w3`Q4P}rJ3z3~UraXrdYYZ-x+T#CzYP>-avCR&pw z)wHxGN`V2YQ8rBt68;t!bdP>JYXrSHIA6xHT$Sy2CT%0ImFO>jUwMB`8<;v|8g|Evez``0jVZH)_qFX zzP~W5Cs)7m{Jr-UHYq-zaU~A)nWA=w@2`&m@_IL}+3r;O%Vse{%nVwFP#aWRO(&yh zqtVK~_8O(np6#t1k2jqGM*??SD4?7Fs?&_4sL@T2^1s_>rCJl(gMn8L#ER;hT}$MK zrrDA1XWa6!FB~X$%jOWg-lrApF;_lmlBE$>C257{*10~S_PtZ%DY3Jz*_?8D|4~La8C`o zcWKeUG<+NXWM?kN8jyZ9yyB}I*VmRir->c#n=5Z@yEb}o-e@1yi0YS51g1CVEy96j zjK$~-2IN2fb(&CM`8?^LnHOiGp48Vv6(zW?F9cH@#bxZe^ADf7RTj@tvun@3M<3qI zU@GSd-P+_D6|8BSD8kv|RqK%8bQ;T{={}BD=%L90?(RuvEZ!Aw2BrE!rdP&r0-i@isI%wG#MU8La zmvwk=nZy5*=_WKM)Vk6hI~nHuj1eYC*KYh)yB}6UKdhp>?}Y1*Q$#`5d&%-WC8x_~ zO9_Ls&~^g6(z9G;brwe|J?>Oi7gm|*g5d3|NOf0)Va%p`DZW!z-s-9#3Cq*jsTE6x zeYyCU5I2^1wonELBDbrZo#G`;tqsjw!W1Isjx%IM@_HQgi~`qZaYD=g?41tOyMxxS z9Kvn+rA{@>u72lJJUd)0q2f{l&KWc(<LsLF*tH_B;5)LhLYg| ze?_z}Nr~2H>0~S^9`Ybxr1*rAf0>trjdb<0-h{^ys)V+NMpGwSJ@!zPHRfU2|0~!<0J-=RX0EZ zlJHz8@G*#U?mbNv2RRlK9@AQ14k+%O*DQJ05q(NM{Gbb=8&;Q1I68RsBL!30HpEq- zjPMzclfY6fZeHHrTNPWi0ppg(Kgx6Lda!~9=WOy_FJ!+l2~Z7SE5_E)$t_Fw!$woL zmW6Q={JSy8dW(}}EO+gnrTltMw>Y#?t(`~9`-^jkUk4d=C$AhKQ+)cZ5{zpDH_ghj z(>k&*7}gU5e9GbJ25;9o)Va#dbIb4d`4fF6eHt&Rb)TeiLNy_b0^NnYHv`$QJ#Y87 zbz_lEELr@4SiJE)y3 z-+%wMzw==LB6)%m|*NtNHZtLfWZe zrLbsn`?0(zsBZRF7XNqj%Xc?USx&Yk4;8M~+2vP2A0(2bPU^9}1s_qwF7}9bX9rdx z%{gfHtw8Xou&IFUNss&VYbJ@C;Sy)vnkdk11B;1ROE|Oj$Z}+FDqqd;GbsK3-|?qiIc+5Q z{mLNxa?N^*&%`mj<>l-r7Y1Hpx_wo6bL(_ zh{SfUiMMn+!p=<`5C$Bp^-ThSSFD)NPTQ_GZ(35|&_TV>p4=LX1%6RzV$Bwv0wVNP z=g9Jx*eeHmL8NxzQd+gJ=5@QWK5_QiDd^)IGP~0J*Rbvy3n4RvcAfH$#i-_+ycS*V zeB+hso3sVQY4auH`#HmK^e*UU#Y{Xhh5_CQCG3At+OLqv-olxE6o6Ke2l-SAnhwJeME^2wB<6{25ziO_!7 z7E)*?XlqGm-pGC3I{Q{6KT+?NGvP@H1*-Z{K+Rx#RJt(UBnxOyAY0^qyFxOlwzlN) zudfQ$%*bV!^*(uc!3PQj8ihcctDLv?>$o?^q{kiILMFt_yWIFLgOK_f-e>gg(l5%X zA@A@6=)0WLM%>o9yP@et(q_?Jk7*pdAM-V1J~en;j#VoI|I z15D3KX*lM10r~P7(3+M(Yt4wkZ&&LMynb`|n*C|<)NmJR;1d-*^UbS$eKf66Fm&N< zL7#83&cqq?&osLmt-qBlzaIoUGBUoU>zT}WcTRJ#P>?%S5J8&yl~J9Qm+qkYlQJtd zcSZDr^%xiIg`IameK<$8C2RQH?ILGwZMktCXVDCySs+B-_N!Sm$4fFrM1>UssOajQ zWMK8-kvzNoD}4o)L(h~FMd7Ns=huHmg}b5|SEAz@T^&7tqY)zK}mL6r0LHr02-;Ze z&C=wXH@Zb#1X^{*gnfCIaMjKA()}F%gWZ3f^P5xW>yXxkhC13>@|o%6#KW7Nn$jiB zQk5+%iiyX}DBbINs$>s5z>7(;9#1=fjGsXYsiU~w_Gn!l;<+!APrJ|ZNzEyBjxpYx zP$^~rJ!>s&Hg22$5ULicKqVav$FiJL#-TEeimW5;>kger#C}$@VpcvQ9WO98o#ol+T#(ir%;r4pS zZ@!wDS@>oDIK-c4XT55ntbG7&ZovNZ&Tf*?4`2vwb2aNuUIA48yZ7$7$2?q%af7@5 zJm>Td={Y-a6U2LW(zHj;Qn!6~t+YLG0b-dRLiX<@s6~IX;xBc--^IkRU+;J5NPEie z=t|}=Ii#nj_n)lsMe=*YyznB|@g_Ac=uQHfmd2y;pDw$s1OKyM?!QfX|GPH4tTK?L zY!Y2_W0)!CIB9D$i{`YG8#g^GE4$__%GeKc8(~GJGj=`}Ikur9vrO7JY1H~ut-B+% zmdIzeO&uT*-Q|!v+Y9$N6vtTW>|{e8kb#aHtV7W14H$^On+0ijCG?R@0<*K)qDZel zuZp06Gm)#s+88Y~FL_h?pB!?&*SxvcLMW86^NY0A1L4_h`lF+xLv>t+o53>J-{73< z+jZ5A)Iayr{I#gwWs#N`A8$=1_bkzNex&;@&%Aoz$dMz3d-DPp68VaE@2}^AZR&b} zGbv@{*q5J|~{jf7C|87yNLts9?_+C``3up+(-|wY8Zn#7_W7N9q z>0cZI(XDt~D5kv9O!)>q0#Xw*yRQ1!Sl~zGD=eY>AHi(=Xfp-CqgSfy>Ak}>*7aU> z9F^SVV`%@=>|Z)i5Sy52$17%#|Lxli%{zCVJYQY)cD7&6`8U=6KQ&?AJen6TZrCQU zGlR5D(dC~gF<9Q?WO6T|5xG6v-`4fkm>GjI^BIuL z5yOzCr49ukIWbt>%2_%=r#8IcKCMRvjf}?Yk$Uj z%iU~}eaqBhQ5f zbd)zADR|8-({>I?@Vj#pbx2<%2$NsFM+w*qr}`Iar78`Tf(Y| z;vS*G1Lc*ss>kBmgM?P^G@7dP^LAO30BtX227TfC`=#&zU^HlO95EptAgF<#dNhe< z_wgb8M+C&pVR=Rm=Bt*XHo-7TgBXD;*8*3DyfD5y08a$Pmf2_rkOB(FKV2{Hp_veVQ6jYdeRl!-zKup z^Z^#b!6$=e3K|E%S;+%=HKz6N;eY@=^f=!nU5#Z0ixkf_Xf=NL@DoVQTAA?5Sqrum zFsooW{HGuZv z_ynVlRj3c-!44~PLrzI*#sdC}i;JE=PCfT-yp;3DV4YHxAZa>b0@=$295TZ|_js^9 zwz@a0a+ZL@ZEddmnf^VH!G$j^O5V#YwOob=iv{+TyG?52rK!)jwe#7ft2(5>Ddqc0 z=gAD$i?h3CCzECeErIM8#8my!aE@N+wuidcl-T1vcfhlX@y&dbmK?9#@C9J63YU%G z#gE^X*miwK8e-?7UXk{lGy(qQ$$y;hm_VJ~#qMk!q4llx`OBeD4ho{$x5V_QWP74a zv%*o(iwX|F;3Jso);HLW`*6LTZ*nj^b;gpxBo9?={L_YHDi}=Orgi!Dh@baULKzeSm)?uFWsCE6-cU zw?_q44ANe~G&CY`JOZsBvF4e!wzime`n$3@6JIJTP?AbPc|E7(5eB#S#OulJas@2p`t6?dk~<8_e(2KA5!hb8I4gAfJGhnY~|&Zm(2>nro~8cxde zsWZnxzAj$hv+yq>6*&OFDhBWq>$Z>6yL*95`Z>{_I^S#m`<&MIZjhni=75JUy&H4> ze)ey+*BXG0O@(xeL6LnRe#85a3;#lWjl$i@Rd#hDEVAAU7D<4_ z%nnuJcRKAsy~gzEKGe>*b@~5`I$??;%~|&iQBhH%o;z)xlK=9+!vCWHa}iMR9GsU-kRNS~UWxxy1bi!?wW(QIS^X)Be$3N4_a-)W zY}O^8szvbDWbHP&gg0e#1_}pO>FGHCPgA1SUB~LIJ;>~~Kk<;*qaa!r0mA0fxV^MD z&&kO2h#BNqynOjG{>__VPH^any;BX;xuMGLeJG}D02Uhp<=GbkO>;Q8trvoSpPHz% zb9Hsi<$&n}Ihr+fDDTsSLwUQc_WYHbJX{5wu<3$-s|NqaXFW9EfQ0r-&FXLV`MzD6 z@e&0=8>2$Rg1!&HG$Z+CniO`z;FsI^5e}^>iiCelF^8Clwu)pb<-wH0SyMBh@Iad- z*nmS-YSS*rr2h(M&z#?1bCmp(zGnignw)T$XrnxIIQ8hW)NIVzzy7nV25PSl~92vNs(_h-K}eqXNqg9*4g$F5imPD zWOK?9Zf<5pN8tD9Xf^s*#>0|>$1gp4!LAQV27#3TW;uL&ahNHeaI?Q(NtZH7ZP+`V z>x<9Wq2m;6Z7G$4C!lde@&K2}lPxC8mL(0>g`xq2_9O+Yl&i>|U`ZDK_#|WqqR#&`mv3O#{&l`?~ednH!}PJVQYV%K&f#CK8k-=I}!5#pF9BTFEXX16TJW&dp@ zfvAXt^c#!SrLX|6<|(Y zlNl7gpQRr$smM1T9adz%m*E`8D+m&DjyvI6?QmZF1yDP3<;|?C2bt=aW2E*}he22@ zze%b9Gz2O0l{wB9UBd*diYuVeMDuvd=DnoBayPhN2(ucH9F5fVAbx88^@IUJcjc&R zxnuJ*T?XhnZTac5e&pQjnR+heVvzLuWfz~o?Kt-I{jlc!951<`KuI`@USbm&Pk%1h zbYzCCTV$<;({fcnP%i`k#tDxj1EK2#I%DMk6^r1RCQ63W?*q{>NxN}tu3hm*sIT)$nv9`;CRsJd8v|8{ zwrNk9Lxg48<1y6IM0Qz^{t@IYw}GS6)GjO9bXOy$e1e~ui5Cuj|5&;+e5H^cy*u?| zGKagtHVln`jp8ybNIV|)p1%-l0jr!V<`~B2bwuqtrYZQSC{VeP%l+Byc?&O?Z{$(eJ8Y$nlSrzd7DQmQWv9}9?~q%iy^0_$zUH6*;LfCc|U=z$FsbpU&{5M zKPGTz2lxc`M^g90Zt|o^xtIGeOFu z=*xOfF5PRBPIXG6ThP_dddPF=Rg{Kd|##Bq2wzGD?|U7vqdjmjc-(c((t2Y63*AUkB!G*|DOv%U8KX43$TJT@gW z{bqn=?C6gjj-hft!Z;uKGUZB9eE1e64YZc!Ap#6!DyzcRQOEMOpa^JK?v}%h-GMX> zLn!tL@?ZQh2cGcThtik%76jC`lXtB(VW8A8iMjb zdj-ZhY@kl({Ujy={Xxb-_M=q*#4p+P7%VHL5gB06fK)=u3)P1FE5ag}<&;k<28v*q z2=z_gc(E%z5)2OhD^GUWkA9CFaw*}|)qyGBgPzn(`&ZtbePNr=uW^b3>g(_y$P`pz z;HEF%XEFaC&#!-RFSFYQs5ezI3VBGT5ApB4G(M@Z|7WblFMw=rTQTx)oxm#PmP0d2 z9r`wkrrwn&vk zYW>x4Ie2DDE+Hw|N}K7o1QkP1R;?d#$xkjd=fBdP2XW7QCqaeWeEr{b=KPm5;JEgc+T{Va6&Yst9!j>2gboWEHJ4*%Q7*(cx41JCOa098brl@}(vHi>#t(6|8sufexItLr3&6SH@TnFb3t2T|g`~|yICp0L3?RC;*oq8VCBP@PwC>(509^rP2LwLr zq&n3ywknUyyMfY6|DW+@M6iH3z5Dlw;jHW?y9Sio=XDZbepE zE-*Bq=AN|j zS`+a`I^FNn1Ac#{o|`R23Be?S_0PGsQ6)%V+}1%?fy2h?;+*2m=$AGB>?z2cj3c&Z z0be?Y;K8gNKiW55zt6BG+N$YZ%e|T#T?_2ZhzNW9d2D-m54D^V>O1QPJ)kVf%Tl~f?2~H|#=gVb|+Uj`~XKvUvE?j>k? zB`4CMW;ld>MmlKi73wtX8sgpbS`f%%j9py|ao^2&M?rY5vSbk-9M4$Dp~KrP&sT~V zfhL(^(BaipoiG@%GDK@s-ulIq@Cp;}Etyb|*)BDpxH4#&o#Ko1Vmn#7@mA{ILzY-4 zx>Ck3N9Os}rG5L`UT8^X=05e2x1$9enT=uW#_IJKpj;pyX;)eu-lMSGq3+1+l8W!s zU4L4&K!7~Hh2YRMY~C$kFvO$DEv#KE1+VaK9PSEWwuqSGG4R=Uno^6sf(zfcb;^*z z+s%tHBX~p*lj4>;vMoUukzbgVEu!Et)n;*Q)k9|2k)(0qw_C6O8PRCw=H>>Z!_)Ko zF`H+OYiXzIYd8M9vNuhid>-B*c;y=<>4l6Rm0gAv4d72v3Uv~4`Ts>D`c;xt%RfZG>#6Af|Npj%gNENISt;tX2o6}*RrBnou42r90fa*pgL zZu-r>Do6BtvELqOLW?^h=oF;WxO{K9stqNmPY#CF=#`ZxNvui*Fr*z9C(glY%tA^~ zU2Rg+-fsn9>$=WdMF+&s4^%5FS%kI)4#6^0CzJH|^@l{Vcda3TWxNbkyxfLc8Th`^uA5j84eFpu#ow)LQ2ZEz8EMwCnYr*}s`CRX`4 zy;uPPzq&-Fty}N(@?B*>==jVY_igv5AUi=l+mf-?9%S}KNaMi^nse9ZNcNTJ>woTm zjVH}~ut|~2Az_gilHa`IN|h3TuS097MwGTP;A+m;g9C=F0Z)5Dbf=Yk)=C-xkk{2e zolO12CNKB<#hFW{C-;(6K9vh9Rqx~NxMJJ+Elidz!1c)V=6gKhXFxm z2+$7j4Mal2Xyu^iama`A1mtU#w4-cF2Ji{}sb8P~#TP-of;?Ke+^IQ>V9*nepN|)S z#^(lv=UnP`emZRU@|K^Xzg=zm-N80xhCd&hXmP9dl@&{KXJJm=;jES0)rO~O%ZZ1f z-r;(~$o7xJs?e15Lch&1D)k@qogFhqqZpr3Y((UEtOfDQMwN1Fw-hp3r+aH>%RTK^ zYWpiUiG?O{c0PU|TFn%im68=(FcjCwp}-l^Y@T|1F*^Za(M}6!LJAB1{@SUF)d}pH zyG|4G3`kHWOrv#5Mw0|4dvE)G5J_1!!TU*VyG%)zBY9%a78yAm9d|fFo1@OR-;ayl zf{t?ycj=ldFL&g-hp~c|t#{&GfMFF?gGdp1d{S)Z;O?MYuJ3LEWm{vN#ClSWo zx@n|~E6V#7t$WY&{skt-+Tyr+a4YgEF&|XbuQu1ERx65B;&sds(Z3>=10wL2i`jVj z7^66e9&s4X2L!Xv@T4l4V@(ZKn_X*_VIb>dSjV!ULxN1Z=Lac@H6ZdLe_Gh)#I}~Q&qOiIL%8x({i69s+f_o^@(chQW#MABy)4E zxwdaed2sanH@1NazoaAs@>a^qBflKeEDX*o+$64^ixRzj>At^h@!tQ~GRCaDlLN}b zaSmgU`_7az8$eoFo3@Yno3py5qBp4ZTvQH&AoW%l*0?Z~=lA?z`DHiKljj|>+ylxd z6cK+#l9n&G(~Eo^!bU(q1(C@qlkRVPdL`wm{`E@#Yinv7s>&?-@l8MFqu*vFG?y*k z)daKHc-@}K@xrwvE8sVeYZmw`(nlU&dt0M(0L)VpO9ipKYrb^<+4GP5tsRMRn-m#G zL?ZbA2@Q#zJF$VYOK$R*A)jG9a!y?e-$WA-jz1@|JSko{!q>=LqTuvA>$rG-l%m4S zR5-j)@tMN>%njGShj{(+e3I;ZXh~(z*c__ul#^ zrxL<|n)mbZr(?dyr5tq2Y60FgNgmdq*|3uKU8VAj>G?QV<0Zu^=4_ML>!mARwK9)QCz8RVh*=Ac`oc zh&1WFB^0IiD5xk!YUss=lu#51B_Z%V6W8A7+;h)8-~Hoej6KF0d#n{Q=R4>7KF_Z` zyH_iZgf}%a_&Y|lZ|eTa6vMU*Sf1_C-NmIBem7^JAJRLL@)ovUU2M6TU$GC z{eHeHuKsMywx4_53>&toLGhC>{RKP=9x>T|cfSg@9Aj)7^ndz*5_WKg`Z3gQwsCC; zuAaZq^=)AKa%hB(e1DKBFsxbhj-$xs)0E!;Iy$pXwI_ivW3KP*F~8(*)T=d6rg8HNX5G*&n4lAJvHaETW0{n^1$|BYc#AUZ6AJp54c+?2QUt#6m4-abk4$9u%utgcTH z3(YYd?8fHd{R(<>KgPItL&B zTI`!rJ7u}SLvPEzl2>obkE4WP;8!Q@%cDA(n9;5SWV|^)ZW}v#c zfHH4OG&%F#rM@bPQsuc-AtS3#OtZ1-s7FVZilohC;nK()PhX$)_dH{Lo$|T)d?8`$ zjxY!|}Ya?T=kU>>FIRt-v8=Pg7FU&Wly5{rxT z>t_vS8<^0{uRDrMocORe?-+mfH4NrDS_Z*5l(s8ObX_v85@UaP1&-pNgH`?#hq?ed zk1)CTh4}!GS-HDp#RqE%^(A!%+1jFcf6d&_c2ynE=h;y*2hFDWL1>h-`=E`SEr`%* zvz^KIV_ToP3wp0U>U#0gR7q8Is-90SI6pyxI^TZ`ya+52P^~ZV+9(dS zCNwz2vfwmb^jgw+bvwr^&%E9a>Y16I9Af$M7Q*$!*PdCstQ#|uZQe(-_mpXyRi9kt zlUh@lctlII07+HXb*|Ez?lkK)T&R?oXM}0uz&x9SX>IPHSot*xr07f|MJ-wcZ&vce z6WfWmK7IPcB;ycCdt-k-tM0U5LN|wo7GIjiVV21r7D0Y#me(zhc?g6!BkTtZHT`~F z&W9Iu=jm^cq8nRc&&_~x^EG1VIHa+Q?LcizPMU6N9M6v}7i)B)_W0yen2Q?r$O>cq zbGGo0ELvPt=s^G-#cAX@2;_RY-t|Z&h$!=8{9MhOjm}7Fzt17W+>fK3rn!PM^f;AF~Uv)8|Gz}sv*Yo{_=4F*^L1{=~GSAtwgCi0k&t=dE zB;TEX%$RQ$lZ2g-2)2e=5EvnFpbIOCzqY5qg2GpJ4Y?~_4i@{3&e*f-R)OSf^X`3N z8#pf!l%v2{jF5v`Sn}q_y;6pIP)%EFNA<{C5irjnA03IuZF_?tYTd*~@G))$cxlx(Xz~nHb>UoIubpa^_OH zMwH;P_8(LWJJFyoY-K zMjZXNq_cAA(tevVH|?+lY=`Yx;K$bM+jH}I^~&f<{xSuTqdXvge?I>? zY4P8}1;u-VbvJ?;l1^2Ai<7SOTZ@H~PCpNq7i9c9%uzR`%z4oH2H%>^{tr5@*qfvK z6Z(rC$EGAC*URn8oamk|g)hLD`sZ&b-ite9nlPf=hh4BXvp8nB1mn1S+;z?Pa865A46913yGEDTL<||!in!EZC&AxA#_Cl}#>P33(n7%FGXMaQ` zb1!aFefs_vMalIWfc$Psp#RYm>&o~k;PT4ZM${WUmZQ(IU2+B|6r!_qB^T}7xpQ_e z56_&_Q%mz?c|Q%OS2A~3TtT(@ub-hf9ockELRz{KbQXW4EdRQSfIfkzZw2N4h1CE5 zXJP((h5l2-X386<;UY5MQy!O5f5uZ;JMY0Br;(l)!T)jh2a2pi8S`*(sYBi$&7q##I89YBO$)}xQXHn(;`x$!y*yMnC*$aRW^&gS){CKKbauExq z$GfqJfT=DUUJWw?A2<4#l%|$e>Hp3nY$sYpMqMlQq(vM+)tkhuTdDm~%07x3oLkAB z87*&bdb}QceTi00IB`gpjuGGQvFdS?o|l1O-k2pPhlp@=-Be{^I0jxYQo^RU?jn~*h73rxfRK3@RU&&I3lWc&b9#K?zg z1R|&{MII!0@E!0;sR*%uMbI$7WK8YN&>%nFf6Av3vFS|=Y@2BQE>b@9jjuvq6V-u_ zdly0g?jl}1@GBS;-0#@|=x!eR613^CZ?_@ZmJ!Q-=pGUQrE8Y)oVEjrn(LMsaA%G? zZE{dYB|+=vIo17%s>wpItgWJ7pDr~1NKhvriraHGEw1~`a-H6Q6=#}OJPS&*AR^)e z8010emKlPw=d%n&xHpsz=Av5)b(6srptj~H`>C3IZfXv(5f6^8FG-baJK1V%W%`I* zSilQj8#ww_jWZ_$nRWr1vBlLzci)`2Gl2 z8?qe+y!hK^N~ltJ`1VzNKje+p&8HrB=!%7BtC7qJ6ue+e-E0gF4sV*^|lXcOs6 zh?m`Llhal?30JDr)!p4K>^IF;hU5PUo!rno_@J&KMmVf1Ce{?;;C0+;F%owT)*k1H zufdDy=bU4V5dXvD>KWZ_X2(x}P0$6|U@42M^B@ndd~USG83Z>L8*}BO_(3NQ#+&TF z+0io8`ziR9uGMaMm7IFV2e@2nzT(-CpENw)3zhCPK+ztQK=&hYAN9WCK=Ykv-<9QD z%jdO*G&Z_Jr4Gi+u`7V`R6EK09jRNJZ$?B>cetzEC%^Rs@4B{mNkKw3Z*gEhv#`cJ zCuoDPe5URSj=r|K-~_z6vso#QTx7_a+msEOmXR}VPFoGP>_WZy^|iqQmCG}6ER|<< z(K~&ezVTfK(-qi1W{HQV3uM`M^>c<>0!Y1FAR-tAYCLva(X#|T127UJ+ z;+F2ATyV$Zj9n4FAz;h4X{2c0rKC($_oxLs_88%Yhc_<%IHLC1m^$ljY7vIW@bee! z_lYs~dL!~OKX+X+L3DHT(=7qdk>Ck(Olvzj4mPf{Zk+@u(5kGW>OgB%*&pUd5Y!LD zB-dSfxT6%ZsMMko;S$}FcZDyG8j-V=x6BtQNF@=F2Y6`MN^F!j_-K5~Io1Qx`bJ?Y`u< zu7sbxJdQ22lv`fSMVl}b1qg38-%z&vm)nV7`SLsS)~ABUm(9s}8?>{6oF8&iquze$ zo=ZGM*xKoh0Fm5kpHl0BPXMaKE@`;l$FXnnjq~4N9QB%+VY&a+^wBp3l&{hI4MP2lcwYq zBW>6%kuAUu-EY}hxRwe}E8%gr5-UMi3;ad&m9Mt^3TwNElcJ-4Dj74LzvNQTWnr;m zv`b#@t@PhmFW9<_=$J93h;+VuvkKESgq44G=-dYeF@OrosQNt*xHg%BEBSpJ)S_*CJAzyXm z?WY1IHUAuiJpWoY;biDTXU`cbT%bjjZtjz5e~-d;L9ZFRVDMfGk?)_Tb?GQr<8P5; zu3&bl7u&R&=Mb!(f;QRSrd<%XD@E)z!d+nsEr&5A{6eeLNKZ}ItB#sZY7d7U_hP0| zaC>UPYNpr^P=d`rV;7aP>DbN=Vvwdz=F^uk)>B*f*YR;ruEeB%Pt7Jju-U~S>Q0dm z2tDHK?^RfTRgSq^O*b_tklAPF)*!LYrslwu6g}k;iMLizw-5W?8?jxxKeB&OdcVdT z7wk>NpzOO)EJfhExCZ;-u&zHNAbVLZ(MVzBDfp0USts2QMJeKGIItDRlVZh)Ytc9^ z=I+Plh1;5cK*Y3Sncwe&eLTrxJey~?$1s@N=UeF76lzj-IA?0Z8nrH)l36At!%DqR z_Dvb#peE(=9AdAL2hvpZuq7zwtCM7&%DaJz^U|N(IDPt<1@TObJs(!n%ce+^CTU`t`jy;2R?lf`V zZNQFV?+I)0DO_gBcP2j&n{w)dGNqSU?`>e<)1%zRdkee9GBsEfKV>bW{4dwkf4C-Q z$jx?IRRfa*o4Q-F0uO#AmF}qbi#D#X(O=s(v7nkR$~FQ!ro@8U5vn+O_ZnJ{{f*#S zcbEfy6jSRzd4bJU&>ZuN5Y9OjJhjmt$>nE5*dP`}IA=RA06WtwTx-F;)uBkuFKf!p zNI}E?MINMR4E)h}=o%u@@f*?C2uuNj?3i2WV#P?Mc4x%-eWQrU+&n} zd6WswE#vOm{FYIls7kis{4lkAy4x?$!$W)-#wBnc^mt*|G>BnEjsoS1=w#n%^Ey@sINBD>uqn zHJD2uAVJW{kyLhoBdOuq7CjnsqA^D1JLd(sS&S+ zAO}DTOQ93#M}jEo4FM(vokcB}s+XWNtoW42_A$-f9;jnVEFDfS+oe`0vZLe2Ort)T z7G}Lo#pI`oZ>vZ$kQVtz9uy=XDlIKNZYZ<^ai7#1VgvtsVmJ7cfHXf|HaNEwUGKa0nz=S}HzhrS`Rf0mu(|WJbM^CAkye2H4 z0^v;K$G-sSiSE4mTH_Vxj<e>Ix4WoE51+-RwK9`UlT9@w%7|P59&j;Pw3}6oUb`SY~ z(*#;}%dLR=r zQq^Z}L&87SVS|i<{&)}x=K(cn@k!0-J~(V^L=MsCK+Fr;)UjxAcF#IV9|c|6Ou9yY zu0i&|lSAi*ypdd`1ES^=GahdM{@CTAB*a9Ik;rS*v^!T z+m>DIJSfoPI>7;iw2nyEvrC=*?v6<>I4y@JHv@NCHRw6|W$=baM@HU+V#V#AEwrXi zpg9_`Jj7;$^RpBX&NnVhs?LLB2vPi%pY;6mm-Ze35gKX|!Ogbn1w{bZAsWDvk3t&N zXInA^4ZwbM1M-cEz%E$nhxp+>n`IAI+)6Lc?uWv1p4*17l}r-0nESH&{@WiTZV}Sy z^Zyo)l=J!+3T{^0J)yl;h`1XJ9S|UWnV_kBUxT~XyRosc`a3k)9vg%-!?!m091Rb| zlzWL~&qB=A;Umc1SM<6CfJ8rHnt=vzJ~}Nu%n`thi)6iZ^&sC%8v zWnpJl6dPNqx&Wc=5b9*}=R{ej)%memwMis3#)C6FohOG&0(TR{V(t_aoB#jenSU-_ zq!T<{cTOenn#7Z$eR=bZ!U5B4W4@QHn26|8M770+rdIE^xR}u-<#_PgmYBp zK0`lka z_=oCfv&7%Is^j9$Lw%)Y^J+VCb!t_oh0V%Z7`0tR*3H8Hy<7N`G;X}o5Q2Lji`X7H z^ru)oxi9(WQNr99sRbUii&}oV>6r@i9!F^Rw6l?|m<+n`!8kpuRLg95EtbLdNvF6E z=zw(}Q<~?2m@?>gwMu3TVzd5+5#!#MP%=_j^E=W8twBsb>k2YNT+_n_b;U?LJeRDONPH4T=7@}2wn`U*+wIFQRc;)VM;5a1Z^ld9c1HMJrJKCeh8*jz78G#9GqI6C@7NOD-Z! zMJ5Xe-mRg2WGI?$nFt*P$Ys2qELOKt@AuYmw5~Ss)`vs0t$NsXB&iFDcN&iQ9H=A| zFx`PhDQauz3kAHe`SjxC?9v%7g@B?bU^XjC?~o)hmg0%37!Sg_r+yI5F7yQTWiRUw z98*e%98yz4EBAu*y6HSqs=5}ZcjLU6$K-8?!K%zVyH{0&0{+U8`I#AGdE2-IOTsS! zgEt6Xo*6g{?%=)A2XR#omRWt)W{p#IA{we!Z(ib0sJ#R^FL}5kBEOfK$>b4mya!8rEkWm zp6>(TWe?3);9$YST^N<@4tqC<-{mxgl(6Y%#C=A*#GK3kS})*qZ3voHW%Uv5=7*EY zS-oL+h!|pwse16#cU~q&aE}hvFv{@;~;^f^@i|l2c^d)0?ZsU_Pu(8)j{8Yl` zcO^)?81zv7eGX`bYWi&TuoY|)Bc_p(h;uWDz)@>Con{h4-R=XJ;<;WX(6@GiVU>#l zotJ~;CR~Qvs{vbXSI3OPv(&{EFcEx&JQsNvEia!cQIoo3n%Ba< zA&A$=Bkl8Fw=Xw8ofNc3CW+ePLY$w3kX>d2cU{3EiD2LnA60B;Cf=KWG|#lS=UZ2y zztW!lYdJIN0}3PXvi4NpaiPQNS^P3P3?j)MB>0C8U{Q_4>+Go;avX*x79c)dUJ2Gm zZFC#xAZaYqq}!PqWsYO_2sUi2XLcD$>`$)O%bc$}_xXGS2rk1-jCh`5tF)&;at-@N zKbR3jIPR{B2Z!YYLoQ)&7i~>g)ly7b1FO!iv*g#sb+#VTGzQ*QS|1Wo&WB;#3f^N`&AH zIXnjGmCmoryqk>%tDLIIg=URr5$A?a`P^kYM!B^gGlxK4&X5b=IpRYRfjTa!oX^EQ(eTnroBw*(`uZ|y5N=$| z>fLS+jL;R#Ns8y)`A?^u{rE9wfRX7f?S67;CQhO=`8eIFwQ9(BXZo*q!dI#OR=-D4 z)DI~fT`$kv82UY(V~P>`Yoqs%g+W&m5n*AXXzz_V1@m#bK?M0AB1H7uwD~(`iEQsa zFqAW1OHhSdv-Rxn4Gfi_^!dwMR$V{5>{e2cVg>FJ_SKkT&X>ux)NfVVc!>gZ--$TN z0nKX9xw0r?@744j)Y~;rzw%#Qn&XkP1e1U}Z-yxo{{^Ek(^1*En(qYJ4Qio(e`&8J zMU?W8%h}b9?UA4+<}L9H=53x*KhnZGbpV!CPAsSrT&Qa$LS$SgRBm?u3<`Fb+T-B| zJi^cdW`BjyX>!;W!Z$gHOsFxi&TRUg{!B)2q4LO1xdU91PM%g$A;DnFLF>QYV9G+w zQaib(h4yI!LIG0{Hb1&$xhop?QfV(kwl=!vZ)5L4JX0bL*hJOrrw=~s@a8FI?35o%}M;O^yv&i&#;9EJu)nCN5Dj*T~(~^ z{``hL53a>^seP@QEjG}RBadCie>u#ONP0Lv&gM1#fuxPr1#s|jmo{J##;!S^TG9He zi{mP_1Er3u1dMkT<54YK^*Wa_)S|XpdHDLAk1mHTxNCzbL>drOL-h{U`R<0AWBLB-~_ zzs!Q1(W7iX1l$e2Oaxb=_xcH5>B3hH6FznqVNaUs_KHYhIt%G#i*(5syY**wI#-Sz z@CE*2*vSx+qjUvQl%Cc8s^8^&ko52aaiFU$WGxy61Bxa*>0#ASxXeLBV{-p7#hBC? zyu+vZEJ{YBQvQj+I4FQ=SqDm-2Jck7GHW};hFqrLy&f?%jr}4#-S6``{5=gn7ktnlv?h)_C_6G*OgRbG`WNxl?ewSpBCI}9Bk7tf#qK#Fy z6c9EH)pOChOa)C+Y_|#fjH04fQw0qY3k!%v`-1Yp6c&Zkb^W>0o;t6%j&N&o zBi|y~S4YQxUXUe}G+RYEd*3;z2ZB!s@e>r_h}f#;HAq;=M`OcKw(zpz_|tpnU}*22Y~B=d|gy(4>cA$5X9zli?Vl3 zLg0Y-{!||v8&fO)%Tb$FR7ebx@zJ{kl8QrAp6Jy1g(I))>_7Yo*$sG+-SgrJVd`r2 ze+5=@b8`!x=9=p8$9MB8kV$8VSJ{Iy1l33rX`$u|R;}jQ)}*<|I@pzs-(mh0SYhPc z+T^Nqj3A>K$)%a)pwvj-{zEZ_hXNsm)}c1(D%(Vr5pNaN{UDyDww!Box2E7Gh&UsO zGe=He3)svyJU3#Wd~X}G&-ixKqv(ek7I%NYcdmFk61oW!E53bfFBAa5ntk9I_+H-$ zG(@HT0K!iq2Mmbqff+8)z_9rHao(o&-3Y7XYy4`;{DUbURb-rCwnZ42x6*K3EW6wR zAbdQc+62i5v^w2D#Z!TonIh>|-nK?KLxk>f;-EHmcu%ZmsQx6x$-}-g)Dre$(E9?w zgtL{z@e-ZlJ$Oi^T|)Nm#5!;?EJ5*HefG9iPfsCM;f~31)hDigZi~wGP%_5#FP|)@ zEWX*sS}}OYv8tdq(8m_{LaKv`F>qzFozfY~H!Bxr*rPha%zS1~oH{j#WGCi7-SY>4 zNO4SKSNw6^=r!JDCgY0bFU_gK} zNQH3Q=wmKw0kJd#K+uomuH_%Ip|6oG`IL$oMCf-!!=+8c*AE;?V7LOUDtedP5*%)xJtSxZ&e2Ir17ORl;~9T{e4G@4 zUl&{z$-!Pgp3F$|rssxVGNNsQ58r;ol_-7t$7SQlj7slF5tSP~HB8an zCvF(p31^5}I6Ik@Lxiw)&?@6;2-&g3Wpo6Sy@R;G7C5Pr`jsJV581#LkfXZBQiALpdo1fs7!R9x|-Sgc3h|d|b1?HLANycA&9z}~` zN6chiZX_6t-OBk=mGD{FP+*Fgh})JjZvPxl{tJSvR$>g{cSmk5Its^p0)i3Nk3+)T z=fSNvbxUgp^xdJX`zZJgS&F0k1TS}fv>sE7qg+Z?h1F7$3RAbtZ4x(PJ}R}k#|ZO2 zI{-I3w9UF6tUk3!ymW!P8Ji@xN4H)Wd#8i3?eqCd&f~uTB&B+C*a?`9nRXF&1)AVC-A>C1>RPX@FrY6 zBLqCfdQqx7X~I~pl)L?si8NC&zpp%`$1H!3wp4~6jna*_>%-@hj@MO4tdv247oDR81N%{AJ;0sDd87eMAlRO}^n@9eF z=6eF(YX#0@i@7WLy{sIN9B|WX``O7#g5r8!@#py-pPc*bN*)Gof&{7+9uL1z<>1@I$K?+% zPn1f4D1-|RigG6FL?v&`UE-vy)t>^7Nvr^@?`ICFfT zB;;DNqr<}}St+PKPF$UQ?;jPJ>ctl41G#H0D;CicYAC8tEf9!#;K>^?P4R*#t#k^J zkTQ~dSp*_tkLbND*4VTa&lj8~k%m3#!;l{orm&Q<$q5yAcN;F(nxscc+#Ps60KDI5QNnEA+2_?SF?k2n4D)Ql zLdXfZI%8lxnnvIT<;5^apmN!zE6Ha4erle4k(lT+sE;^!#EgK=hK$tBcs_1jB%M#-PP1_#HG1<0uaf^<|0-ks zz|%oz(x4f7?swx681wTVva-Iz~Ui0YvoLF|N!3XMr(9BFy zn5NR|yiq1jf~Z#uhFFfj_vKC}LLhPLyj!&82lqyrgr9v8B&jQ68^M3A?^_vt38+ zIv@O&oF8<_Q}4?1{B3RQp2f_V;b0+}qaGKdVR;_wh%k@Q$oz z3F}ER6VzU();RKrC6mMVhb&7YviEClc&Cql?mVfP=hygbgtIu=|H|vOhj`pmPN}k8 zqE+v9tWV-(fBzUMbN_vvKAIx6X+=&tso5G=nrD-53V}*P{wkU0FKnQdD#pK;2t>^I zyO6AZPhx3p=P8Gm?_OZ!6>p~Jq$;JAbD#&G%?vudUGs*RcvX(O92~3O7BLT&w{MjC zQ$2dKNeWm;4+`0B%knoc$I8JlYXr7uH_WZ_Gy8${BJ*9NHjTj(fAXmyGdo@@dA+*) zCkg`!3)$X*!=5k8cf4kcS;ta2C5A43^=NF6?YG{x{&MxC@o^G*V9k4>b0e9g$9&HA zN;xbKyg=09-zP&k2K%t8gR$d_#ov9CCRACv2^NE<<xj#k=JQzF?3EUouPVBqaC1B}yFucU`2;nKM+faKy1A>SgeXeeo21!o#wKc5&a+C1|IK=PL8}z$Yl!Pc{4lox`Dv0Kg_bhec6V6R ziX5_8TdxM%j?Bc`94-1fz4~M|m2j4mv7qC8{%e@R-MP9a_AA7#yOJ%1h(-k^0HF}il|+V*_KT(CKVL8;dOjk%w7;2&8Kjh- z@9--mR5=e<`#PMBgp5%O+hNJ!f`L-j-O?>HORb6L8kaIR@`uYTd|?=Sww^4z#bsD5#m1IF8MPU+kR;4j&x|w|M5+xIi1pV~n@NS_hXpjnCLGY0(z!J~r~0j2{nc z$ulyq^@*xoNw&@R3w}0RRP3AFJ2v5wNSi}oLGQ$yHUHVnrEdyD%)@|!(M^DXh0V@`TbT0(G|+{$+fX`n*~J;lxjpg>k0Pm(+aiqS zsE4viuGht?@4n&5cPPKfMePckZ45~fATex;!KrVcE!%*p&-MS#k<8+Ty?IW>)ly;o z*M0igyR=x_!2ksdYi@W(=EsEky!|Uq7sp9<_PVI2r2ZtF=zQgkwRFZh1NW!JIGq`y z?|-=hTgx#yX8*Bb5Bh{3PNd^PurxcH_@kvRSBQ16v01&)QPi_K9-F-U)220kaDK6Q zXPkn+B`s!^FS_d5z48x3e)&hz*H3R;9vQ!JYlB^F)q6ePq_&B1xvSa*yKG`si1*_t z61>p%IjuX$nMcmnJ+8P-t_@;w9C_B}xH&o>5$xGNP846T^Q2XIa?5x%)+_K(&kH?o zE#gY3YYOn47B2~C45NcMRrBQmJLw7S6N49jm&Wsmwr`l15o#V&pf>ojBfUoM zY~Izn7FzNKvjaKn>0sgA)%lSFDL?ccWqP6r2NTXP-f-|y1q|Cc^A;EEH}K<$E>3&o zT57@FjO)|I_S?W! z=R`ZD^lJwXf1=+No+W(~ENmmGz_cBK?4+Lr6{<8bb(zys!Fl?iOW6IV5CFR@pT1xe zm3Jg~ox^-0Nv$hO`xd>#Y4j}<_U#ufIcbblcAE#bVmv*`mh8~I_{>`D#d2DQ!iHmT znUjN@Z{m*v;zJ#tk;>w7iTfk*pC|q6s=51X=b{$J)r7CapM9^DkkhD9$TeI@(vhp+ zRy>h>eBUR0_=VovJ{IFkhXo$b?UePLb}iHyekiKO^YSt@R$QMPY^Gmg&6z4qb8^NW zjTpoZvGgNznj*b?J?DN$*Bhv)HY|z><2d#X_==Qw9Vq3LaLC%&GF-pIf2EEgX`jYr zdKiM!$3WM8B;aBk=4zBA{^WhTi5GSJTQeWmKaM?TbF;1t6O|@-tTloAF^X9RQrXVwNY2z>X2;6nZ&c2 z*?9Bk;*&;=W*PpwT_3jxC0q>0Kl@RJ&1fsN3!+c&!VDc*fI!`TgD|;od)gEhBDE6F z_OHACJ{j9Ezu@L~e>vDPg4l(nPo;8Y1W0s}M0Cp_YX_x~m^F!oM3X7v=&Nw2;hNPH z1)tE6b-T~c)?Y?^k>`}mGYLDT6K5x;u#vz>n7>c|uE*9s!Af^gy&JpQn6)SFjdEG$ z#@|y0dr^^+w4zEWk=6sB+j72jT{`xbx9lQk{qp-?R!dExVtwayF8s6it|eaiZG2y5{qTcoAFakFW?9h1B4EK)xATrcQg=&}taQ{cp2 zYJ+3!`bjKyn!R1fu4C_2xpKqFpUrLbyY^o4KdGz6ufN?}lBom1dbPJeeTO&YOs{Hm+0ZNqt7?%`a8eim$Y~5|<$O zTK}Y3gcezS!hY9%{LG#`nBDVc`&SwssI-#9E)YT)zX=Z0dH8V<|8x!WJWWG$F}93Q zevHKWJ5HVcrDHr8WxUakkwayge9&$2oW$a?V;^33(64fhGNGj{j#Rr;r=%G}5)E`; z6}=&&Qs+3slZ=xMbV@}4px11ZqtsOh+?1mvxaAjdxJH)s7Mh;6TdCq%9Q)V%b1r*h z*7Wj(rq6S}Kt2DuX|};U`x(1%)JCc zwm4VK=X1H%nr5f{>jtx$j1(qX3tz0?ZE0K33A5lw0)37gmehE^*k;GLyie4NTy;&C z*r?T3DqU>b4+%=uBXh?LTUlV z&a3{ubA5PMJ8t#oPm2%}lv@u_`CU9ZT3%=GED0OS&9F{BeSc$6I2Reg_Tgu1?DvONwDI90YX=ULP>a*Z z1^TD5+b??Qg%wS63ohg)_SrK_lP){tSf_ejzT|(>`1(|^lUlbwgOZA}9K1VV9C3AW z!2)wjUBvX}dc}*u1-&Q_+_uO>s8HP%>==QNH7?<8@FJP#b&8(ORFv<{7}0_#uU>+GiuOx2EMJmG|qW$*XW>>dy6zcTcn%{Hy^z`%Q`%cd-~e0 zLkV(tYma!4wn66U-{*X`(IF3i8bIn|fV%o25yTeqj&{>`oet=Oaa9p=AhuX7xWxa7 z(AzR$aG*q#!Fq}+WuCmA>2ADdPWh|0Sv$;%yB>U`r{^L5Y+sgk(lp;mz06_Oa70 zuMCQRmtlXlhAUOTk>}-Jz8o8xg9Vn*9ifGN21&HnlUeB9rGGy%$`~(o|8!ld#Q@t0 zQg8}kQpx{^z~jPEm{o88v6RoK(RW3PdY?L{;=UQ-XLG|C)@p?t_$r!e_PGgg%X*$dg{i^ z@|bPI@Fg#c>N~*2_1yxsH+`;=r|wSiJIaFh$1kkI4)X5T`7z?Sv@=Y^x0ajRC;Hoj z^C!vq_`;d$#rq>VJ=su!RtPy_=DIGAhKfH<@~NKk&L>H`bNR=ge>=!o`Qq0aKR>5P z28`;KN}VFRd{JV!MqGWb1P7jLA?0%N@sq#hE*1(grTF-*+^((*AK|fxsIG2Y=siQK zpsN&;+a9ubkQ)?pR=_hdG!BBkZOnTXqtmh#e5kzH_wnl8sfd29r|)X`x{}KeYM-DZ zr{rG87l~Lj24W5KAPJ%eFxz-(w=9aLz7&JS2e^>3yQ{Yyj!bN9KkCWGHw`W>L~=z* zSZ|D4zxq*(!5MERRxthVHhpM9WX!p_Y+~ED2M^|F<6t;&S&6W?xoq0e(u`0xzJ97cmXp20 zesr+{rZ?{v?+ZG7*q{*yzZoA=nWu?pyN^0tE_M!c?#(;Y)ip4_(A#0ZB+)sQxQK}TS+nOfv0*8QE>XvCi5X~_+htGD|M&dGgkGU*B$yD#obfp6iw;~Ts)G}s~=M^d?hMB zd?-15WG-AD*}$lMm*x)(%+BrfnIUSB%)T`4@$2c;AdUD8Ptm{(D%DHjnj9}*>ZKSR zx9aBc1FX-}Fh(>hS(Ta|qhMvEuAi^bvz(c-hW8Ks09)FeNYEXPcvMpm_BK3Gu4DQ9h&n04Lj*4By_dw)91 zjt{{h!E|Hd6i@Zi-{^@gDX%05#*Jn&SMem0%J=`OfzQm!s#?Cm&LwD0=2dvF-hJly zC^9w_CQjZ?CA`=WFv#kIIiwR#t?dx&-FqbE1bD@sx5m1;7K)@)NY9jX4Fxv<#aJt0 z9jX+{*J^h4scC5~jC9S!Mf_BMKtQ3N2)1IJGS+?9!z>8mhC+KgS~^i7kGG0S=&RHc z4zkXfSE%p-Cj@!(cagC(+@5__&fXwPD-e_@F)aW9yFjDt1Sb$S+&(!98La$uZ2OX6 z`pYcyGi2a~nOWIHZT7|V4?StrRM89h&tJa8lOo-iMH~{#$S!>oDa!(=M<+44gt?#7 zpt1G8NqyJ-YcNcK_69@P5qxkPf1>yzc0Z@znY%d>_5i`mI}Cx`_Q zJs$=9PxTa8cdB<{d20(15Ws#AGFokNOZS+MyaMy+XsO*V`xnAmFFj!P@Bk=4ufx;| z@(cjhhx zW)7``Ve}OPgpDIcDR%aM-5b~+l(|bR4GR7jjkk=Na@$hT%p4ZDG-i=fbLxn5gSWt%BY*3MlFG(YG zBcpo9j%rzwg_B9`1hOJT;!l?iIu|2jE6c1JcF@W3D5dU3j2|z;7gvM0*PQ1Z_48ku z@{w^jHB%?T)sEOB16={H_zYR{3jN5SR8d>R@;maCg-3n}F-LQJwsh}MDUfjmB`tDA zx!eJKb6kkM=JFnt?#kl#0-J9}V&r%idhqaVI=Ay`hJ1EKY~~g=*0_wRgmtDatOu0+ z{iEyn_{2MJgCK4m<067e5$CO8zT5fEJJ3>tVt{+7i0&1NwE9rQOexz zT>^9RxDi{S6H`c1T{|%*IVpXUFFLyPmr=M&Bln#I;#Q1x0zn^%AaeSY!n+2Jp0+#5 zosf&y58kIK(=9nghL|+`BjOY$sOl*v_k?klZZ7x@VD2BxcUx;0aJP8%Uh#Ztai-84 zO!c;u^X&`E5G#oIzaBcZZpu_p^I_N6SCQxg2hb|-x{bIIlzKp8F^G6P{+Zyx;U&n% zErE+P;}HQB!t@%VNKt0+_)PFpy0XK{C49fqsveqg%(Q$#JKg(sS>bd}?R%*5X8B(H zvDh%(hrf}v*8|)UOE7Au!MWzQDl$E|7WOyieF9WL3~T4YXW6!b+9gxterdD;^PmBM=+0u1$M#+GP(e0X|ww~ScdA*$^bavAhpA}D96q&XC2baEglh@ z6E1k)j*i~OSyxz>9rs3qcMfEB7Q_I!Vh9+|Oio%r3<`{(&3mW#_82@Kc0IRPKJ`A( zN6WKMn|pl?nyuI)j|n5F5eSn=`C$h0?8;A`McYcejT~UfVF^$ogLV=G@?Q~A5hh

    #u9=TgFxv$vycR}_(1> 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

    UmAv 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 Irk;ua1y;5$LI3~& literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images/accept-invitation.png b/docs/user-guides/hunter-user/images/accept-invitation.png new file mode 100644 index 0000000000000000000000000000000000000000..bd336a970428ece1d26ec6a06943264c4f452b4e GIT binary patch literal 24599 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 literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images/appveyor-encrypt.png b/docs/user-guides/hunter-user/images/appveyor-encrypt.png new file mode 100644 index 0000000000000000000000000000000000000000..e1b1ed1b8372ca909868c154325edae8529fa0b8 GIT binary patch literal 29521 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 literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images/upload.graphml b/docs/user-guides/hunter-user/images/upload.graphml new file mode 100644 index 000000000..94474685e --- /dev/null +++ b/docs/user-guides/hunter-user/images/upload.graphml @@ -0,0 +1,725 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Encrypted +token + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Decrypted +token + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cache server + + + + + + + + + + + + + + + + + Travis/AppVeyor + + + + + + + + + + + + + + + + + Token string + bot name "ingenue" +pair gives "write" permissions +to binary cache server + + + + + + + + + + + + + + + + + hunter-cache-use + + + + + + + + + + + + + + + + + + + + + + + + + hunter-cache + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="36px" height="57px" viewBox="0 -0.741 36 57" enable-background="new 0 -0.741 36 57" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="230.1768" y1="798.6021" x2="180.3346" y2="798.6021" gradientTransform="matrix(1 0 0 1 -195.2002 -770.8008)"> + <stop offset="0" style="stop-color:#4D4D4D"/> + <stop offset="1" style="stop-color:#8D8D8D"/> +</linearGradient> +<rect y="0.943" fill="url(#SVGID_1_)" width="34.977" height="53.716"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="224.6807" y1="798.6021" x2="200.6973" y2="798.6021" gradientTransform="matrix(1 0 0 1 -195.2002 -770.8008)"> + <stop offset="0.0319" style="stop-color:#848484"/> + <stop offset="0.1202" style="stop-color:#8C8C8C"/> + <stop offset="0.308" style="stop-color:#969696"/> + <stop offset="0.5394" style="stop-color:#999999"/> + <stop offset="0.5501" style="stop-color:#9C9C9C"/> + <stop offset="0.6256" style="stop-color:#B0B0B0"/> + <stop offset="0.7118" style="stop-color:#BEBEBE"/> + <stop offset="0.8178" style="stop-color:#C7C7C7"/> + <stop offset="1" style="stop-color:#C9C9C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M5.497,0.943c7.945-1.258,16.04-1.258,23.983,0c0,17.905,0,35.811,0,53.716 + c-7.943,1.258-16.039,1.258-23.983,0C5.497,36.753,5.497,18.848,5.497,0.943z"/> +<path fill="#515151" d="M5.497,14.621c7.995,0,15.989,0,23.983,0c0,13.346,0,26.693,0,40.037c-7.943,1.258-16.039,1.258-23.983,0 + C5.497,41.314,5.497,27.967,5.497,14.621z"/> +<path opacity="0.43" fill="#565656" d="M5.497,4.745c7.982-0.628,16.001-0.628,23.983,0c0,2.707,0,5.413,0,8.12 + c-7.994,0-15.989,0-23.983,0C5.497,10.158,5.497,7.452,5.497,4.745z"/> +<path opacity="0.43" fill="none" stroke="#4D4D4D" stroke-width="0.0999" stroke-miterlimit="10" d="M5.497,4.745 + c7.982-0.628,16.001-0.628,23.983,0c0,2.707,0,5.413,0,8.12c-7.994,0-15.989,0-23.983,0C5.497,10.158,5.497,7.452,5.497,4.745z"/> +<polygon opacity="0.43" fill="#565656" stroke="#4D4D4D" stroke-width="0.0135" stroke-miterlimit="10" enable-background="new " points=" + 6.496,5.746 9.869,5.606 9.869,6.661 6.496,6.799 "/> +<rect x="31.307" y="2.517" fill="#E7ED00" stroke="#717171" stroke-width="0.1926" stroke-miterlimit="10" width="3.692" height="1.505"/> +<rect x="31.307" y="5.8" fill="#C8FF00" stroke="#717171" stroke-width="0.1926" stroke-miterlimit="10" width="3.692" height="1.507"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="29.4414" y1="35.1235" x2="5.4995" y2="35.1235"> + <stop offset="0" style="stop-color:#808080"/> + <stop offset="0.1907" style="stop-color:#828282"/> + <stop offset="0.2955" style="stop-color:#8A8A8A"/> + <stop offset="0.3795" style="stop-color:#989898"/> + <stop offset="0.4524" style="stop-color:#ACACAC"/> + <stop offset="0.5175" style="stop-color:#C5C5C5"/> + <stop offset="0.5273" style="stop-color:#C9C9C9"/> + <stop offset="0.5914" style="stop-color:#C9C9C9"/> + <stop offset="0.9681" style="stop-color:#C9C9C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M5.5,14.822c0,13.22,0,26.438,0,39.66c7.931,1.256,16.012,1.256,23.941,0c0-13.222,0-26.439,0-39.66 + C21.461,14.822,13.48,14.822,5.5,14.822z M28.396,18.703c-0.74,0.01-1.482,0.02-2.225,0.029c0-0.951,0-1.901-0.001-2.85 + c0.742-0.003,1.483-0.005,2.224-0.008C28.396,16.817,28.396,17.76,28.396,18.703z M16.354,42.496c0-0.961,0-1.924,0-2.885 + c0.744,0.006,1.489,0.006,2.233,0c0,0.961,0,1.924,0,2.885C17.843,42.503,17.098,42.503,16.354,42.496z M18.587,43.568 + c0,0.955,0,1.91,0,2.866c-0.744,0.009-1.489,0.009-2.234,0c0-0.956,0-1.911,0-2.866C17.098,43.574,17.843,43.574,18.587,43.568z + M18.586,27.742c0,0.961,0,1.922,0,2.886c-0.744,0.004-1.488,0.004-2.231,0c0-0.964,0-1.925,0-2.886 + C17.099,27.746,17.842,27.746,18.586,27.742z M16.354,26.671c0-0.955,0-1.91,0-2.865c0.743,0.002,1.487,0.002,2.23,0 + c0,0.955,0,1.91,0,2.865C17.842,26.675,17.099,26.675,16.354,26.671z M16.354,34.583c0-0.961,0-1.924,0-2.885 + c0.744,0.004,1.488,0.004,2.231,0c0,0.961,0,1.924,0,2.885C17.842,34.588,17.099,34.588,16.354,34.583z M18.586,35.656 + c0,0.961,0,1.924,0.001,2.885c-0.745,0.008-1.489,0.008-2.233,0c0-0.961,0-1.924,0-2.885C17.099,35.66,17.842,35.66,18.586,35.656z + M15.307,30.619c-0.742-0.01-1.484-0.021-2.227-0.039c0-0.957,0-1.916,0-2.875c0.742,0.014,1.485,0.023,2.226,0.029 + C15.307,28.695,15.307,29.656,15.307,30.619z M15.307,31.689c0,0.961,0,1.924,0,2.885c-0.742-0.012-1.485-0.025-2.227-0.047 + c0-0.959,0.001-1.92,0.001-2.877C13.822,31.667,14.565,31.68,15.307,31.689z M15.307,35.644c0,0.959,0,1.922-0.001,2.883 + c-0.742-0.012-1.485-0.031-2.228-0.056c0-0.959,0.001-1.918,0.001-2.877C13.821,35.617,14.564,35.633,15.307,35.644z M15.306,39.597 + c0,0.96,0,1.922,0,2.883c-0.742-0.016-1.486-0.037-2.228-0.064c0-0.959,0-1.916,0.001-2.877 + C13.82,39.564,14.563,39.585,15.306,39.597z M19.637,39.597c0.742-0.012,1.484-0.033,2.227-0.059c0,0.959,0,1.918,0,2.875 + c-0.741,0.029-1.483,0.052-2.227,0.064C19.637,41.519,19.637,40.559,19.637,39.597z M19.637,38.527c0-0.961,0-1.924,0-2.883 + c0.74-0.012,1.482-0.027,2.225-0.05c0,0.959,0,1.918,0.002,2.876C21.121,38.496,20.377,38.515,19.637,38.527z M19.637,34.572 + c0-0.961,0-1.922-0.002-2.883c0.741-0.01,1.483-0.021,2.225-0.039c0.002,0.957,0.002,1.916,0.002,2.875 + C21.119,34.547,20.376,34.564,19.637,34.572z M19.635,30.619c0-0.963,0-1.924,0-2.885c0.74-0.006,1.483-0.017,2.225-0.029 + c0,0.959,0,1.916,0,2.875C21.118,30.599,20.376,30.609,19.635,30.619z M19.633,26.666c0-0.955,0-1.909,0-2.864 + c0.741-0.005,1.483-0.013,2.227-0.021c0,0.951,0,1.903,0,2.856C21.118,26.65,20.375,26.66,19.633,26.666z M19.633,22.732 + c-0.001-0.963-0.001-1.924-0.001-2.885c0.741-0.002,1.483-0.006,2.226-0.012c0,0.959,0.002,1.918,0.002,2.877 + C21.116,22.72,20.374,22.728,19.633,22.732z M18.586,22.736c-0.744,0.002-1.487,0.002-2.23,0c0-0.963,0-1.924,0-2.887 + c0.743,0.002,1.487,0.002,2.23,0C18.586,20.813,18.586,21.773,18.586,22.736z M15.309,22.732c-0.742-0.004-1.483-0.012-2.226-0.02 + c0-0.959,0.001-1.918,0.001-2.877c0.742,0.006,1.484,0.01,2.226,0.012C15.31,20.808,15.309,21.769,15.309,22.732z M15.309,23.801 + c0,0.955,0,1.91,0,2.864c-0.742-0.006-1.483-0.016-2.227-0.027c0-0.953,0-1.906,0-2.859C13.825,23.789,14.566,23.796,15.309,23.801z + M12.036,26.617c-0.742-0.017-1.483-0.033-2.225-0.055c0-0.947,0-1.895,0.001-2.841c0.741,0.019,1.483,0.031,2.225,0.042 + C12.037,24.716,12.036,25.666,12.036,26.617z M12.035,27.683c0,0.957,0,1.916,0,2.873c-0.742-0.021-1.483-0.047-2.225-0.076 + c0-0.953,0-1.904,0-2.857C10.552,27.646,11.293,27.667,12.035,27.683z M12.035,31.621c0,0.957-0.001,1.914-0.001,2.871 + c-0.742-0.023-1.483-0.055-2.224-0.092c0-0.953,0-1.906,0-2.859C10.551,31.572,11.292,31.6,12.035,31.621z M12.033,35.56 + c0,0.956-0.001,1.914-0.001,2.871c-0.742-0.031-1.484-0.066-2.225-0.111c0-0.953,0.001-1.906,0.001-2.858 + C10.549,35.5,11.291,35.533,12.033,35.56z M12.031,39.498c0,0.955,0,1.914-0.001,2.869c-0.742-0.035-1.484-0.078-2.225-0.129 + c0-0.953,0-1.904,0.001-2.857C10.547,39.426,11.289,39.465,12.031,39.498z M12.03,43.435c0,0.951-0.001,1.901-0.001,2.854 + c-0.742-0.041-1.484-0.09-2.225-0.149c0-0.944,0.001-1.892,0.001-2.838C10.546,43.353,11.288,43.4,12.03,43.435z M13.077,43.482 + c0.743,0.031,1.486,0.053,2.228,0.067c0,0.956,0,1.91,0,2.864c-0.742-0.016-1.486-0.041-2.229-0.074 + C13.077,45.389,13.077,44.435,13.077,43.482z M15.305,47.486c0,0.961,0,1.922,0,2.883c-0.743-0.019-1.487-0.047-2.23-0.084 + c0-0.959,0-1.918,0.001-2.875C13.818,47.443,14.562,47.468,15.305,47.486z M16.353,47.504c0.745,0.009,1.49,0.009,2.234,0 + c0.001,0.96,0.001,1.924,0.001,2.883c-0.745,0.011-1.49,0.011-2.235,0C16.353,49.427,16.353,48.464,16.353,47.504z M19.639,47.486 + c0.741-0.018,1.483-0.043,2.227-0.076c0,0.957,0.002,1.916,0.002,2.875c-0.742,0.037-1.486,0.065-2.229,0.084 + C19.639,49.406,19.639,48.447,19.639,47.486z M19.637,46.414c0-0.954,0-1.908,0-2.864c0.742-0.015,1.484-0.036,2.229-0.067 + c0,0.953,0,1.905,0,2.857C21.122,46.373,20.379,46.398,19.637,46.414z M22.911,43.435c0.741-0.035,1.483-0.082,2.224-0.135 + c0,0.945,0,1.895,0.002,2.838c-0.74,0.059-1.482,0.107-2.226,0.15C22.911,45.336,22.911,44.386,22.911,43.435z M22.911,42.369 + c-0.001-0.957-0.001-1.914-0.002-2.871c0.741-0.032,1.483-0.069,2.225-0.117c0,0.954,0.001,1.906,0.001,2.857 + C24.395,42.289,23.652,42.333,22.911,42.369z M22.909,38.431c0-0.957-0.001-1.915-0.001-2.871c0.742-0.027,1.482-0.061,2.224-0.098 + c0.001,0.951,0.001,1.904,0.001,2.857C24.393,38.363,23.65,38.4,22.909,38.431z M22.908,34.494c0-0.957-0.002-1.916-0.002-2.871 + c0.742-0.021,1.482-0.051,2.225-0.079c0,0.952,0,1.903,0.001,2.856C24.391,34.437,23.648,34.468,22.908,34.494z M22.906,30.556 + c0-0.957,0-1.916-0.002-2.873c0.742-0.016,1.484-0.037,2.226-0.061c0,0.953,0.001,1.904,0.001,2.857 + C24.391,30.509,23.648,30.535,22.906,30.556z M22.904,26.617c0-0.951,0-1.901,0-2.854c0.74-0.011,1.482-0.025,2.224-0.042 + c0,0.946,0.001,1.894,0.001,2.841C24.389,26.583,23.646,26.601,22.904,26.617z M22.902,22.699c0-0.957,0-1.916,0-2.874 + c0.742-0.007,1.482-0.014,2.225-0.023c0.001,0.953,0.001,1.906,0.001,2.859C24.387,22.676,23.646,22.689,22.902,22.699z + M22.902,18.76C22.9,17.802,22.9,16.845,22.9,15.887c0.742,0,1.481-0.003,2.225-0.004c0.001,0.953,0.001,1.906,0.002,2.858 + C24.385,18.75,23.643,18.756,22.902,18.76z M21.855,18.767c-0.742,0.004-1.482,0.007-2.225,0.009c0-0.961,0-1.922,0-2.884 + c0.741,0,1.482-0.001,2.225-0.002C21.855,16.849,21.855,17.808,21.855,18.767z M18.585,18.779c-0.743,0.001-1.486,0.001-2.229,0 + c0-0.961,0-1.923,0-2.885c0.742,0,1.486,0,2.229,0C18.585,16.855,18.585,17.817,18.585,18.779z M15.31,18.777 + c-0.742-0.002-1.483-0.005-2.225-0.009c0-0.959,0-1.918,0-2.877c0.742,0,1.483,0.001,2.225,0.002 + C15.31,16.854,15.31,17.815,15.31,18.777z M12.039,18.76c-0.742-0.005-1.483-0.011-2.225-0.019c0-0.953,0-1.905,0.001-2.858 + c0.742,0.001,1.483,0.004,2.224,0.004C12.039,16.845,12.039,17.803,12.039,18.76z M12.039,19.827c0,0.957-0.001,1.915-0.001,2.872 + c-0.741-0.01-1.483-0.021-2.224-0.035c0-0.953,0-1.906,0-2.859C10.555,19.813,11.296,19.819,12.039,19.827z M8.768,22.64 + c-0.741-0.018-1.482-0.035-2.223-0.057c0-0.943,0-1.887,0-2.831c0.741,0.013,1.482,0.025,2.223,0.036 + C8.768,20.739,8.768,21.689,8.768,22.64z M8.767,23.697c0,0.944,0,1.89,0,2.832c-0.741-0.024-1.482-0.053-2.223-0.084 + c0-0.938,0-1.873,0-2.811C7.284,23.658,8.026,23.679,8.767,23.697z M8.766,27.587c0,0.949-0.001,1.898-0.001,2.85 + c-0.74-0.033-1.481-0.068-2.222-0.111c0-0.942,0-1.887,0-2.83C7.284,27.529,8.025,27.56,8.766,27.587z M8.765,31.494 + c0,0.951-0.001,1.9-0.001,2.852c-0.74-0.04-1.481-0.087-2.221-0.139c0-0.943,0-1.887,0-2.831C7.283,31.42,8.023,31.459,8.765,31.494 + z M8.763,35.404c0,0.949,0,1.899,0,2.851c-0.741-0.052-1.481-0.104-2.22-0.168c0-0.942,0-1.886,0-2.829 + C7.282,35.31,8.022,35.361,8.763,35.404z M8.762,39.312c0,0.949,0,1.899-0.001,2.852c-0.741-0.059-1.48-0.123-2.219-0.195 + c0-0.943,0-1.889,0-2.83C7.281,39.203,8.021,39.26,8.762,39.312z M8.76,43.219c0,0.944,0,1.888-0.001,2.832 + c-0.74-0.065-1.479-0.14-2.218-0.224c0-0.938,0-1.875,0-2.812C7.281,43.092,8.02,43.16,8.76,43.219z M8.759,47.109 + c0,0.951,0,1.9,0,2.851c-0.741-0.073-1.48-0.158-2.219-0.253c0-0.942,0-1.887,0-2.828C7.279,46.964,8.019,47.039,8.759,47.109z + M9.804,47.201c0.741,0.06,1.483,0.111,2.224,0.154c0,0.955,0,1.912,0,2.868c-0.742-0.045-1.484-0.103-2.225-0.166 + C9.804,49.107,9.804,48.154,9.804,47.201z M12.027,51.291c0,0.957,0,1.916,0,2.873c-0.742-0.053-1.484-0.114-2.225-0.188 + c0-0.951,0.001-1.904,0.001-2.857C10.544,51.187,11.285,51.244,12.027,51.291z M13.075,51.353c0.743,0.039,1.486,0.067,2.229,0.086 + c0,0.961,0,1.922,0,2.885c-0.743-0.021-1.487-0.053-2.229-0.094C13.075,53.269,13.075,52.312,13.075,51.353z M16.353,51.459 + c0.745,0.009,1.49,0.009,2.235,0c0,0.961,0,1.924,0,2.885c-0.745,0.013-1.491,0.013-2.235,0 + C16.353,53.382,16.353,52.42,16.353,51.459z M19.639,51.439c0.741-0.019,1.485-0.049,2.229-0.086c0,0.959,0,1.92,0.001,2.877 + c-0.743,0.041-1.485,0.072-2.229,0.094C19.639,53.361,19.639,52.4,19.639,51.439z M22.913,51.291 + c0.743-0.047,1.483-0.104,2.226-0.172c0,0.953,0,1.906,0,2.857c-0.74,0.073-1.481,0.135-2.224,0.188 + C22.914,53.205,22.914,52.248,22.913,51.291z M22.913,50.224c-0.001-0.956-0.001-1.912-0.001-2.869 + c0.742-0.043,1.484-0.095,2.225-0.154c0,0.953,0,1.906,0.002,2.857C24.396,50.123,23.654,50.179,22.913,50.224z M26.184,47.109 + c0.739-0.066,1.479-0.145,2.217-0.229c0,0.942,0,1.887,0,2.83c-0.736,0.092-1.478,0.177-2.217,0.252 + C26.184,49.009,26.184,48.06,26.184,47.109z M26.184,46.051c-0.002-0.944-0.002-1.888-0.002-2.832 + c0.739-0.06,1.48-0.127,2.219-0.202c0,0.938,0,1.873,0,2.811C27.662,45.912,26.923,45.986,26.184,46.051z M26.182,42.162 + c0-0.95-0.002-1.9-0.002-2.85c0.74-0.052,1.48-0.109,2.219-0.176c0.002,0.943,0.002,1.887,0.002,2.83 + C27.662,42.039,26.921,42.105,26.182,42.162z M26.18,38.253c0-0.95,0-1.9-0.002-2.852c0.742-0.041,1.482-0.093,2.221-0.146 + c0,0.942,0,1.887,0,2.829C27.66,38.15,26.92,38.203,26.18,38.253z M26.178,34.345c0-0.949,0-1.898,0-2.852 + c0.74-0.034,1.481-0.073,2.221-0.117c0,0.943,0,1.887,0,2.83C27.659,34.258,26.918,34.305,26.178,34.345z M26.177,30.437 + c0-0.949,0-1.9-0.001-2.85c0.741-0.027,1.481-0.059,2.221-0.092c0,0.943,0.002,1.888,0.002,2.83 + C27.659,30.367,26.918,30.404,26.177,30.437z M26.176,26.529c-0.001-0.942-0.001-1.888-0.001-2.832 + c0.742-0.018,1.482-0.039,2.222-0.063c0,0.938,0,1.873,0,2.811C27.657,26.476,26.917,26.503,26.176,26.529z M26.174,22.64 + c0-0.951-0.001-1.901-0.001-2.851c0.741-0.01,1.483-0.022,2.224-0.035c0,0.943,0,1.886,0,2.831 + C27.657,22.605,26.915,22.623,26.174,22.64z M8.769,15.881c0,0.95,0,1.9-0.001,2.85c-0.741-0.008-1.482-0.018-2.223-0.028 + c0-0.943,0-1.887,0-2.83C7.286,15.876,8.028,15.878,8.769,15.881z M6.54,50.758c0.738,0.097,1.478,0.183,2.218,0.258 + c0,0.95,0,1.901,0,2.853c-0.741-0.084-1.48-0.178-2.218-0.28C6.54,52.646,6.54,51.701,6.54,50.758z M26.184,53.869 + c0-0.95,0-1.899,0-2.853c0.739-0.075,1.479-0.163,2.217-0.259c0.002,0.941,0.002,1.889,0.002,2.83 + C27.663,53.693,26.925,53.785,26.184,53.869z"/> +<path id="highlight_2_" opacity="0.17" fill="#FFFFFF" enable-background="new " d="M0,0.943h5.497c0,0,6.847-0.943,11.974-0.943 + C22.6,0,29.48,0.943,29.48,0.943h5.496v41.951c0,0-12.076-0.521-18.623-2.548C9.807,38.32,0,30.557,0,30.557V0.943z"/> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="68px" height="46px" viewBox="-0.064 -0.075 68 46" enable-background="new -0.064 -0.075 68 46" + xml:space="preserve"> +<defs> +</defs> +<radialGradient id="SVGID_1_" cx="478.8413" cy="1991.2729" r="21.6001" gradientTransform="matrix(1.15 0 0 1 -526.6598 -1982.4023)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#F2F2F2"/> + <stop offset="1" style="stop-color:#8D8D8D"/> +</radialGradient> +<path fill="url(#SVGID_1_)" d="M10.263,1.903c0-0.987,0.807-1.794,1.794-1.794h43.279c0.986,0,1.795,0.807,1.795,1.794v26.978 + c0,0.987-0.809,1.794-1.795,1.794h-43.28c-0.987,0-1.794-0.807-1.794-1.794L10.263,1.903L10.263,1.903z"/> +<path display="none" fill="none" stroke="#3C89C9" stroke-width="0.2185" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d=" + M10.263,1.903c0-0.987,0.807-1.794,1.794-1.794h43.279c0.986,0,1.795,0.807,1.795,1.794v26.978c0,0.987-0.809,1.794-1.795,1.794 + h-43.28c-0.987,0-1.794-0.807-1.794-1.794L10.263,1.903L10.263,1.903z"/> +<radialGradient id="SVGID_2_" cx="455.894" cy="1983.9624" r="47.8462" fx="493.5344" fy="1977.5143" gradientTransform="matrix(1.1935 0 0 1 -509.6731 -1982.4023)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#4D4D4D"/> + <stop offset="1" style="stop-color:#999999"/> +</radialGradient> +<path fill="url(#SVGID_2_)" d="M11.18,2.819c0-0.987,0.807-1.794,1.794-1.794h41.649c0.986,0,1.795,0.807,1.795,1.794v24.943 + c0,0.985-0.809,1.794-1.795,1.794H12.974c-0.987,0-1.794-0.809-1.794-1.794V2.819z"/> +<radialGradient id="SVGID_3_" cx="456.8843" cy="1984.0386" r="30.6699" gradientTransform="matrix(1.1923 0 0 1 -510.1314 -1982.4023)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</radialGradient> +<path fill="url(#SVGID_3_)" d="M11.689,3.228c0-0.987,0.807-1.794,1.794-1.794h40.633c0.986,0,1.795,0.807,1.795,1.794v24.126 + c0,0.986-0.809,1.794-1.795,1.794H13.483c-0.987,0-1.794-0.809-1.794-1.794V3.228z"/> +<path opacity="0.24" fill="#F2F2F2" d="M11.689,21.472V3.228c0-0.987,0.807-1.794,1.794-1.794h40.633 + c0.986,0,1.795,0.807,1.795,1.794v9.454c0,0.987-10.518,5.21-18.256,6.795C29.917,21.062,11.689,21.472,11.689,21.472z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="131.3501" y1="-212.2612" x2="131.3501" y2="-170.6274" gradientTransform="matrix(1 0 0 -1 -97.6001 -165.0498)"> + <stop offset="0" style="stop-color:#4D4D4D"/> + <stop offset="0.0667" style="stop-color:#717171"/> + <stop offset="0.069" style="stop-color:#757575"/> + <stop offset="0.0831" style="stop-color:#8C8C8C"/> + <stop offset="0.0996" style="stop-color:#9E9E9E"/> + <stop offset="0.1196" style="stop-color:#AAAAAA"/> + <stop offset="0.1466" style="stop-color:#B1B1B1"/> + <stop offset="0.2121" style="stop-color:#B3B3B3"/> + <stop offset="1" style="stop-color:#C5C5C5"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M58.385,32.234c-0.689-0.856-2.154-1.559-3.254-1.559H12c-1.1,0-2.552,0.711-3.227,1.579 + l-7.546,9.717C0,43.55,0.042,43.785,0,44.55v0.125c0.056,0.393,0.311,1.002,1.248,1.002h64.75c0.75,0.002,1.5-0.252,1.5-1.002V44.55 + c0-0.813,0-0.813-1.254-2.559L58.385,32.234z"/> +<path opacity="0.23" fill="#F2F2F2" enable-background="new " d="M58.385,32.234c-0.689-0.856-2.154-1.559-3.254-1.559H12 + c-1.1,0-2.552,0.711-3.227,1.579l-7.055,9.085l58.098-7.33L58.385,32.234z"/> +<path fill="#6E6E6E" d="M59.75,37.205c0.344,0.431,0.172,0.783-0.377,0.783H8.249c-0.55,0-0.742-0.369-0.427-0.819l2.786-3.986 + c0.315-0.45,1.023-0.819,1.573-0.819h42.729c0.551,0,1.279,0.354,1.623,0.783L59.75,37.205z"/> +<path fill="#6E6E6E" d="M40.43,41.906c0.072,0.217-0.057,0.395-0.285,0.395H26.727c-0.229,0-0.364-0.18-0.3-0.398l0.822-2.826 + c0.064-0.221,0.303-0.399,0.532-0.399h11.167c0.229,0,0.475,0.179,0.547,0.396L40.43,41.906z"/> +</svg> + + + + diff --git a/docs/user-guides/hunter-user/images/upload.png b/docs/user-guides/hunter-user/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..baa24436a6a456834f02acb1be79f4538d6e08ba GIT binary patch literal 62097 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. +There is also possibility do download ``docker images`` where +``Nexus Repository Manager`` is already installed: + +* `Nexus Repository Manager 2 `__ +* `Nexus Repository Manager 3 `__ + +Nexus adding, configuring and managing repositories +=================================================== + +To create new or manage existing repository follow this links: + +* `Adding a new repository `__ +* `Managing repositories `__ +* `Configuring repositories `__ + +Uploading cache binaries to Nexus +================================= + +The simplest way to upload local cache binaries to Nexus server is by using +``cURL``: + +.. code-block:: bash + + $ cd hunter/_Base/Cache/meta + $ CACHE_REPOSITORY_URL="http://my.nexus.server.com/content/repositories/hunter/cache" + $ find ./ -type f -exec curl -u nexuser:nexpwd --upload-file "{}" "$CACHE_REPOSITORY_URL/meta/{}" + $ cd ../raw + $ find ./ -type f -exec curl -u nexuser:nexpwd --upload-file "{}" "$CACHE_REPOSITORY_URL/raw/{}" + +Configuring Hunter to use Nexus +=============================== + +Set :ref:`HUNTER_CACHE_SERVERS ` +variable before ``HunterGate`` to configure ``Hunter`` to use ``Nexus`` server: + +.. code-block:: cmake + + set( + HUNTER_CACHE_SERVERS + "http://my.nexus.server.com/content/repositories/hunter/cache" + CACHE + STRING + "Hunter cache servers" + ) + + HunterGate(URL "..." SHA1 "...") diff --git a/docs/user-guides/images/repo-scope.png b/docs/user-guides/images/repo-scope.png new file mode 100644 index 0000000000000000000000000000000000000000..8cdfc427ed5e8a6fc02fdcc7476cdbfbd580c717 GIT binary patch literal 6783 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 E29Pc4y8r+H literal 0 HcmV?d00001 diff --git a/examples/ARM_NEON_2_x86_SSE/CMakeLists.txt b/examples/ARM_NEON_2_x86_SSE/CMakeLists.txt new file mode 100644 index 000000000..06a76cf03 --- /dev/null +++ b/examples/ARM_NEON_2_x86_SSE/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-ARM_NEON_2_x86_SSE) + +# download boost.compute +hunter_add_package(ARM_NEON_2_x86_SSE) + +# now boost.compute can be used +find_package(ARM_NEON_2_x86_SSE CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo ARM_NEON_2_x86_SSE::ARM_NEON_2_x86_SSE) diff --git a/examples/ARM_NEON_2_x86_SSE/foo.cpp b/examples/ARM_NEON_2_x86_SSE/foo.cpp new file mode 100644 index 000000000..484da786a --- /dev/null +++ b/examples/ARM_NEON_2_x86_SSE/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/Android-ARM-EABI-v7a-System-Image/CMakeLists.txt b/examples/Android-ARM-EABI-v7a-System-Image/CMakeLists.txt new file mode 100644 index 000000000..c94d59b40 --- /dev/null +++ b/examples/Android-ARM-EABI-v7a-System-Image/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(Foo) + +hunter_add_package(Android-ARM-EABI-v7a-System-Image) diff --git a/examples/Android-ARM64-v8a-System-Image/CMakeLists.txt b/examples/Android-ARM64-v8a-System-Image/CMakeLists.txt new file mode 100644 index 000000000..bfe1cf366 --- /dev/null +++ b/examples/Android-ARM64-v8a-System-Image/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Android-ARM64-v8a-System-Image) + +# DOCUMENTATION_START { +hunter_add_package(Android-ARM64-v8a-System-Image) +# DOCUMENTATION_END } diff --git a/examples/Android-MIPS-System-Image/CMakeLists.txt b/examples/Android-MIPS-System-Image/CMakeLists.txt new file mode 100644 index 000000000..d868d609e --- /dev/null +++ b/examples/Android-MIPS-System-Image/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Android-MIPS-System-Image) + +# DOCUMENTATION_START { +hunter_add_package(Android-MIPS-System-Image) +# DOCUMENTATION_END } diff --git a/examples/Android-SDK/CMakeLists.txt b/examples/Android-SDK/CMakeLists.txt new file mode 100644 index 000000000..2594794c5 --- /dev/null +++ b/examples/Android-SDK/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(Foo) + +hunter_add_package(Android-SDK) diff --git a/examples/AngelScript/CMakeLists.txt b/examples/AngelScript/CMakeLists.txt new file mode 100644 index 000000000..4b849bdc9 --- /dev/null +++ b/examples/AngelScript/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-AngelScript) + +hunter_add_package(AngelScript) +find_package(AngelScript CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC AngelScript::AngelScript) diff --git a/examples/AngelScript/boo.cpp b/examples/AngelScript/boo.cpp new file mode 100644 index 000000000..d705320ea --- /dev/null +++ b/examples/AngelScript/boo.cpp @@ -0,0 +1,6 @@ +#include // std::cout +#include + +int main() { + std::cout << asGetLibraryVersion() << std::endl; +} diff --git a/examples/Beast/CMakeLists.txt b/examples/Beast/CMakeLists.txt new file mode 100644 index 000000000..38a87a353 --- /dev/null +++ b/examples/Beast/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2017, Sacha Refshauge +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Beast) + +hunter_add_package(Beast) +find_package(Beast CONFIG REQUIRED) + +add_executable(example example.cpp) +target_link_libraries(example Beast::Beast) diff --git a/examples/Beast/example.cpp b/examples/Beast/example.cpp new file mode 100644 index 000000000..1721c9339 --- /dev/null +++ b/examples/Beast/example.cpp @@ -0,0 +1,13 @@ +#include +#include +#include + +int main() +{ + // Set up HTTP request + beast::http::request req; + req.version = 11; + req.prepare_payload(); + + return 0; +} diff --git a/examples/Boost-contract/CMakeLists.txt b/examples/Boost-contract/CMakeLists.txt new file mode 100644 index 000000000..4ddcf5890 --- /dev/null +++ b/examples/Boost-contract/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS system contract) +find_package(Boost CONFIG REQUIRED system contract) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::system Boost::contract) diff --git a/examples/Boost-contract/foo.cpp b/examples/Boost-contract/foo.cpp new file mode 100644 index 000000000..f1449e3f8 --- /dev/null +++ b/examples/Boost-contract/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/Boost-custom-args/CMakeLists.txt b/examples/Boost-custom-args/CMakeLists.txt new file mode 100644 index 000000000..5be452a4a --- /dev/null +++ b/examples/Boost-custom-args/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost) +find_package(Boost CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::boost) diff --git a/examples/Boost-custom-args/config.cmake b/examples/Boost-custom-args/config.cmake new file mode 100644 index 000000000..ba5f69680 --- /dev/null +++ b/examples/Boost-custom-args/config.cmake @@ -0,0 +1,7 @@ +hunter_config( + Boost + VERSION ${HUNTER_Boost_VERSION} + CMAKE_ARGS + CONFIG_MACRO=BOOST_REGEX_MATCH_EXTRA;BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS + CONFIG_MACRO_BOOST_MPL_LIMIT_LIST_SIZE=3 +) diff --git a/examples/Boost-custom-args/foo.cpp b/examples/Boost-custom-args/foo.cpp new file mode 100644 index 000000000..77c3aa3aa --- /dev/null +++ b/examples/Boost-custom-args/foo.cpp @@ -0,0 +1,21 @@ +#include +#include + +#if !defined(BOOST_REGEX_MATCH_EXTRA) +# error "BOOST_REGEX_MATCH_EXTRA not defined" +#endif + +#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) +# error "BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS not defined" +#endif + +#if !defined(BOOST_MPL_LIMIT_LIST_SIZE) +# error "BOOST_MPL_LIMIT_LIST_SIZE not defined" +#endif + +#if (BOOST_MPL_LIMIT_LIST_SIZE) != 3 +# error "BOOST_MPL_LIMIT_LIST_SIZE is not 3" +#endif + +int main() { +} diff --git a/examples/Boost-fiber/CMakeLists.txt b/examples/Boost-fiber/CMakeLists.txt new file mode 100644 index 000000000..2f6fe0703 --- /dev/null +++ b/examples/Boost-fiber/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS context fiber) +find_package(Boost CONFIG REQUIRED context fiber) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::context Boost::fiber) diff --git a/examples/Boost-fiber/foo.cpp b/examples/Boost-fiber/foo.cpp new file mode 100644 index 000000000..b6775cd5c --- /dev/null +++ b/examples/Boost-fiber/foo.cpp @@ -0,0 +1,22 @@ +#include +#include +#include + + +int calculate_the_answer_to_life_the_universe_and_everything() +{ + return 42; +} + +int main() { + boost::fibers::packaged_task pt(calculate_the_answer_to_life_the_universe_and_everything); + boost::fibers::future fi=pt.get_future(); + + boost::fibers::fiber task(boost::move(pt)); // launch task on a thread + + fi.wait(); // wait for it to finish + + assert(fi.valid()); + assert(!fi.get_exception_ptr()); + assert(fi.get()==42); +} diff --git a/examples/Boost-filesystem-shared/CMakeLists.txt b/examples/Boost-filesystem-shared/CMakeLists.txt new file mode 100644 index 000000000..cf98c0e17 --- /dev/null +++ b/examples/Boost-filesystem-shared/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2013-2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) #set BUILD_SHARED_LIBS=ON +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS system filesystem) +find_package(Boost CONFIG REQUIRED system filesystem) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::system Boost::filesystem) diff --git a/examples/Boost-filesystem-shared/config.cmake b/examples/Boost-filesystem-shared/config.cmake new file mode 100644 index 000000000..0bf7053a2 --- /dev/null +++ b/examples/Boost-filesystem-shared/config.cmake @@ -0,0 +1,4 @@ +hunter_config(Boost + VERSION ${HUNTER_Boost_VERSION} + CMAKE_ARGS BUILD_SHARED_LIBS=ON +) diff --git a/examples/Boost-filesystem-shared/foo.cpp b/examples/Boost-filesystem-shared/foo.cpp new file mode 100644 index 000000000..13f5f9067 --- /dev/null +++ b/examples/Boost-filesystem-shared/foo.cpp @@ -0,0 +1,7 @@ +#include +#include // std::cout + +int main() { + namespace fs = boost::filesystem; + std::cout << "Current path: " << fs::current_path() << std::endl; +} diff --git a/examples/Boost-iostreams-1-64/CMakeLists.txt b/examples/Boost-iostreams-1-64/CMakeLists.txt new file mode 100644 index 000000000..749022987 --- /dev/null +++ b/examples/Boost-iostreams-1-64/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS iostreams serialization) +find_package(Boost CONFIG REQUIRED iostreams serialization) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::iostreams Boost::serialization) diff --git a/examples/Boost-iostreams-1-64/config.cmake b/examples/Boost-iostreams-1-64/config.cmake new file mode 100644 index 000000000..28fec7bdc --- /dev/null +++ b/examples/Boost-iostreams-1-64/config.cmake @@ -0,0 +1 @@ +hunter_config(Boost VERSION 1.64.0) diff --git a/examples/Boost-iostreams-1-64/foo.cpp b/examples/Boost-iostreams-1-64/foo.cpp new file mode 100644 index 000000000..f49eb2a8f --- /dev/null +++ b/examples/Boost-iostreams-1-64/foo.cpp @@ -0,0 +1,66 @@ +// Copyright (c) 2015, David Hirvonen +// All rights reserved. + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +struct Record +{ + Record() {} + Record(int age, const std::string &name) : age(age), name(name) {} + + int age; + std::string name; + + // Boost serialization: + //friend class boost::serialization::access; + template void serialize(Archive & ar, const unsigned int version) + { + ar & age; + ar & name; + } +}; + +int main(int argc, char **argv) +{ + std::string filename = "/tmp/record.dat"; + + typedef boost::iostreams::zlib_compressor Compressor; + typedef boost::iostreams::zlib_decompressor Decompressor; + + { // Dump the record: + Record record(1, "kermit"); + std::ofstream ofs(filename, std::ios_base::out | std::ios_base::binary); + if(ofs) + { + boost::iostreams::filtering_stream buffer; + buffer.push(Compressor()); + buffer.push(ofs); + boost::archive::binary_oarchive oa(buffer); + oa << record; + } + } + + { // Load the record + Record record; + std::ifstream ifs(filename, std::ios_base::in | std::ios_base::binary); + if(ifs) + { + boost::iostreams::filtering_streambuf buffer; + buffer.push(Decompressor()); + buffer.push(ifs); + boost::archive::binary_iarchive ia(buffer); // (ifs); + ia >> record; + } + } +} + diff --git a/examples/Boost-log-shared/CMakeLists.txt b/examples/Boost-log-shared/CMakeLists.txt new file mode 100644 index 000000000..a1227604b --- /dev/null +++ b/examples/Boost-log-shared/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) #set BUILD_SHARED_LIBS=ON +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS log filesystem system chrono thread regex date_time atomic) +find_package(Boost CONFIG REQUIRED log filesystem system chrono thread regex date_time atomic) + +add_executable(foo foo.cpp) +target_link_libraries(foo + PUBLIC + Boost::log + Boost::filesystem + Boost::system + Boost::chrono + Boost::thread + Boost::regex + Boost::date_time + Boost::atomic + Boost::boost +) diff --git a/examples/Boost-log-shared/config.cmake b/examples/Boost-log-shared/config.cmake new file mode 100644 index 000000000..0bf7053a2 --- /dev/null +++ b/examples/Boost-log-shared/config.cmake @@ -0,0 +1,4 @@ +hunter_config(Boost + VERSION ${HUNTER_Boost_VERSION} + CMAKE_ARGS BUILD_SHARED_LIBS=ON +) diff --git a/examples/Boost-log-shared/foo.cpp b/examples/Boost-log-shared/foo.cpp new file mode 100644 index 000000000..aa44bb9ae --- /dev/null +++ b/examples/Boost-log-shared/foo.cpp @@ -0,0 +1,13 @@ +#include + +int main(int, char*[]) +{ + BOOST_LOG_TRIVIAL(trace) << "A trace severity message"; + BOOST_LOG_TRIVIAL(debug) << "A debug severity message"; + BOOST_LOG_TRIVIAL(info) << "An informational severity message"; + BOOST_LOG_TRIVIAL(warning) << "A warning severity message"; + BOOST_LOG_TRIVIAL(error) << "An error severity message"; + BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message"; + + return 0; +} diff --git a/examples/Boost-log/CMakeLists.txt b/examples/Boost-log/CMakeLists.txt new file mode 100644 index 000000000..35550d421 --- /dev/null +++ b/examples/Boost-log/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS log) +find_package(Boost CONFIG REQUIRED log) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::log) diff --git a/examples/Boost-log/foo.cpp b/examples/Boost-log/foo.cpp new file mode 100644 index 000000000..75cfa0184 --- /dev/null +++ b/examples/Boost-log/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/Boost-math/CMakeLists.txt b/examples/Boost-math/CMakeLists.txt new file mode 100644 index 000000000..843235678 --- /dev/null +++ b/examples/Boost-math/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +# download boost +hunter_add_package(Boost COMPONENTS math) + +# now boost::math_* targets +# link in all the parts of boost math, or leave out unneeded parts +find_package(Boost CONFIG REQUIRED math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l) +add_executable(foo foo.cpp) +# link in the libraries as well for whatever is found above in find_package +target_link_libraries(foo + Boost::math_c99 + Boost::math_c99f + Boost::math_c99l + Boost::math_tr1 + Boost::math_tr1f + Boost::math_tr1l +) + diff --git a/examples/Boost-math/foo.cpp b/examples/Boost-math/foo.cpp new file mode 100644 index 000000000..003b520e9 --- /dev/null +++ b/examples/Boost-math/foo.cpp @@ -0,0 +1,5 @@ +#include + +int main() { +} + diff --git a/examples/Boost-program-options/CMakeLists.txt b/examples/Boost-program-options/CMakeLists.txt new file mode 100644 index 000000000..f9a68b8db --- /dev/null +++ b/examples/Boost-program-options/CMakeLists.txt @@ -0,0 +1,13 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS program_options) +find_package(Boost CONFIG REQUIRED COMPONENTS program_options) diff --git a/examples/Boost-python/CMakeLists.txt b/examples/Boost-python/CMakeLists.txt new file mode 100644 index 000000000..85b3d6e26 --- /dev/null +++ b/examples/Boost-python/CMakeLists.txt @@ -0,0 +1,34 @@ +# Copyright (c) 2013, Ruslan Baratov +# Modified work: Copyright (c) 2018, Gregory Kramida +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) +option(HUNTER_BUILD_SHARED_LIBS "..." ON) + +# Configure: +set(PYTHON_VERSION 3.5) +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +# Requires python version 3.5. Change this in config.cmake if necessary. +hunter_add_package(Boost COMPONENTS python) +find_package(Boost CONFIG REQUIRED python35) +find_package(PythonLibs ${PYTHON_VERSION} EXACT REQUIRED) + +PYTHON_ADD_MODULE(foo foo.cpp) +target_link_libraries( + foo + PUBLIC + Boost::python35 + ${PYTHON_LIBRARIES} +) +target_include_directories( + foo + PUBLIC + ${PYTHON_INCLUDE_DIR} +) diff --git a/examples/Boost-python/config.cmake b/examples/Boost-python/config.cmake new file mode 100644 index 000000000..d33c44bec --- /dev/null +++ b/examples/Boost-python/config.cmake @@ -0,0 +1,3 @@ +# Note: PYTHON_VERSION is optional. Refer to Boost package documentation on how +# and when to use it: https://docs.hunter.sh/en/latest/packages/pkg/Boost.html#cmake-options +hunter_config(Boost VERSION ${HUNTER_Boost_VERSION} CMAKE_ARGS PYTHON_VERSION=${PYTHON_VERSION}) diff --git a/examples/Boost-python/foo.cpp b/examples/Boost-python/foo.cpp new file mode 100644 index 000000000..02907e00a --- /dev/null +++ b/examples/Boost-python/foo.cpp @@ -0,0 +1,12 @@ +#include + +char const* greet() +{ + return "hello, world"; +} + +BOOST_PYTHON_MODULE(hello_ext) +{ + using namespace boost::python; + def("greet", greet); +} diff --git a/examples/Boost-random/CMakeLists.txt b/examples/Boost-random/CMakeLists.txt new file mode 100644 index 000000000..7721d532e --- /dev/null +++ b/examples/Boost-random/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2017, Pawel Bylica +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost-random) + +hunter_add_package(Boost COMPONENTS random) +find_package(Boost CONFIG REQUIRED random) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::random) diff --git a/examples/Boost-random/foo.cpp b/examples/Boost-random/foo.cpp new file mode 100644 index 000000000..4e1eafc12 --- /dev/null +++ b/examples/Boost-random/foo.cpp @@ -0,0 +1,10 @@ +// Copyright (c) 2017, Pawel Bylica +// All rights reserved. + +#include + +int main() { + boost::random::mt19937 rng; + boost::random::uniform_int_distribution<> six(1,6); + return six(rng); +} diff --git a/examples/Boost-stacktrace/CMakeLists.txt b/examples/Boost-stacktrace/CMakeLists.txt new file mode 100644 index 000000000..27720d542 --- /dev/null +++ b/examples/Boost-stacktrace/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2013-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS stacktrace) +find_package(Boost CONFIG REQUIRED stacktrace_backtrace) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::stacktrace_backtrace) diff --git a/examples/Boost-stacktrace/foo.cpp b/examples/Boost-stacktrace/foo.cpp new file mode 100644 index 000000000..0e1d9bb95 --- /dev/null +++ b/examples/Boost-stacktrace/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/Boost-system-1-66/CMakeLists.txt b/examples/Boost-system-1-66/CMakeLists.txt new file mode 100644 index 000000000..5d3cfe9f2 --- /dev/null +++ b/examples/Boost-system-1-66/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS system) +find_package(Boost CONFIG REQUIRED system) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC Boost::system) diff --git a/examples/Boost-system-1-66/config.cmake b/examples/Boost-system-1-66/config.cmake new file mode 100644 index 000000000..853a6f287 --- /dev/null +++ b/examples/Boost-system-1-66/config.cmake @@ -0,0 +1 @@ +hunter_config(Boost VERSION 1.66.0) diff --git a/examples/Boost-system-1-66/foo.cpp b/examples/Boost-system-1-66/foo.cpp new file mode 100644 index 000000000..7bb6d3bcb --- /dev/null +++ b/examples/Boost-system-1-66/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/Boost-test/CMakeLists.txt b/examples/Boost-test/CMakeLists.txt new file mode 100644 index 000000000..eea862834 --- /dev/null +++ b/examples/Boost-test/CMakeLists.txt @@ -0,0 +1,13 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-boost) + +hunter_add_package(Boost COMPONENTS test) +find_package(Boost CONFIG REQUIRED COMPONENTS unit_test_framework) diff --git a/examples/BoringSSL/CMakeLists.txt b/examples/BoringSSL/CMakeLists.txt new file mode 100644 index 000000000..a67d43028 --- /dev/null +++ b/examples/BoringSSL/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-BoringSSL) + +hunter_add_package(BoringSSL) +find_package(BoringSSL CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo BoringSSL::ssl BoringSSL::crypto) diff --git a/examples/BoringSSL/foo.cpp b/examples/BoringSSL/foo.cpp new file mode 100644 index 000000000..18c854b7f --- /dev/null +++ b/examples/BoringSSL/foo.cpp @@ -0,0 +1,5 @@ +#include + +int main() { + auto *rsa = RSA_new(); +} diff --git a/examples/Box2D/CMakeLists.txt b/examples/Box2D/CMakeLists.txt new file mode 100644 index 000000000..c4cbdf04c --- /dev/null +++ b/examples/Box2D/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Box2D) + +hunter_add_package(Box2D) +find_package(Box2D CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC Box2D::Box2D) diff --git a/examples/Box2D/boo.cpp b/examples/Box2D/boo.cpp new file mode 100644 index 000000000..cfca60bb2 --- /dev/null +++ b/examples/Box2D/boo.cpp @@ -0,0 +1,7 @@ +#include + +int main() { + b2Mat33* M1(0); + b2Mat33* M2(0); + M1->GetSymInverse33(M2); +} diff --git a/examples/CLI11/CMakeLists.txt b/examples/CLI11/CMakeLists.txt new file mode 100644 index 000000000..37cadae7a --- /dev/null +++ b/examples/CLI11/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(CLI11-example) + +# DOCUMENTATION_START { +hunter_add_package(CLI11) +find_package(CLI11 CONFIG REQUIRED) + +add_executable(CLI11-example main.cpp) +target_link_libraries(CLI11-example CLI11::CLI11) +# DOCUMENTATION_END } diff --git a/examples/CLI11/main.cpp b/examples/CLI11/main.cpp new file mode 100644 index 000000000..aef12f504 --- /dev/null +++ b/examples/CLI11/main.cpp @@ -0,0 +1,8 @@ +#include + +int main(int argc, char* argv[]) +{ + CLI::App app{"CLI11 example"}; + CLI11_PARSE(app, argc, argv); + return 0; +} diff --git a/examples/CURL-BoringSSL/CMakeLists.txt b/examples/CURL-BoringSSL/CMakeLists.txt new file mode 100644 index 000000000..e9e20339f --- /dev/null +++ b/examples/CURL-BoringSSL/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-curl) + +hunter_add_package(CURL) +find_package(CURL CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE CURL::libcurl) diff --git a/examples/CURL-BoringSSL/config.cmake b/examples/CURL-BoringSSL/config.cmake new file mode 100644 index 000000000..11b0c66f9 --- /dev/null +++ b/examples/CURL-BoringSSL/config.cmake @@ -0,0 +1,5 @@ +hunter_config( + CURL + VERSION ${HUNTER_CURL_VERSION} + CMAKE_ARGS CMAKE_USE_BORINGSSL=ON +) diff --git a/examples/CURL-BoringSSL/foo.cpp b/examples/CURL-BoringSSL/foo.cpp new file mode 100644 index 000000000..7226f4b94 --- /dev/null +++ b/examples/CURL-BoringSSL/foo.cpp @@ -0,0 +1,51 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + * Very simple HTTP GET + * + */ +#include +#include + +int main(void) +{ + CURL *curl; + CURLcode res; + + curl = curl_easy_init(); + if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + /* example.com is redirected, so we tell libcurl to follow redirection */ + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + + /* Perform the request, res will get the return code */ + res = curl_easy_perform(curl); + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* always cleanup */ + curl_easy_cleanup(curl); + } + return 0; +} diff --git a/examples/CURL-with-ares/CMakeLists.txt b/examples/CURL-with-ares/CMakeLists.txt new file mode 100644 index 000000000..8bd3ac02c --- /dev/null +++ b/examples/CURL-with-ares/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-curl) + +hunter_add_package(CURL) +find_package(CURL CONFIG REQUIRED) + + +add_executable(foo foo.cpp) + + +target_link_libraries(foo PRIVATE CURL::libcurl) diff --git a/examples/CURL-with-ares/config.cmake b/examples/CURL-with-ares/config.cmake new file mode 100644 index 000000000..bbd456d15 --- /dev/null +++ b/examples/CURL-with-ares/config.cmake @@ -0,0 +1 @@ +hunter_config(CURL VERSION ${HUNTER_CURL_VERSION} CMAKE_ARGS ENABLE_ARES=ON) diff --git a/examples/CURL-with-ares/foo.cpp b/examples/CURL-with-ares/foo.cpp new file mode 100644 index 000000000..7226f4b94 --- /dev/null +++ b/examples/CURL-with-ares/foo.cpp @@ -0,0 +1,51 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + * Very simple HTTP GET + * + */ +#include +#include + +int main(void) +{ + CURL *curl; + CURLcode res; + + curl = curl_easy_init(); + if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); + /* example.com is redirected, so we tell libcurl to follow redirection */ + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + + /* Perform the request, res will get the return code */ + res = curl_easy_perform(curl); + /* Check for errors */ + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", + curl_easy_strerror(res)); + + /* always cleanup */ + curl_easy_cleanup(curl); + } + return 0; +} diff --git a/examples/CapnProto/CMakeLists.txt b/examples/CapnProto/CMakeLists.txt new file mode 100644 index 000000000..bf8f0a2c9 --- /dev/null +++ b/examples/CapnProto/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-capnproto) + +hunter_add_package(CapnProto) + +find_package(CapnProto CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo CapnProto::capnp) diff --git a/examples/CapnProto/foo.cpp b/examples/CapnProto/foo.cpp new file mode 100644 index 000000000..0256abe3c --- /dev/null +++ b/examples/CapnProto/foo.cpp @@ -0,0 +1,7 @@ +#include + +int main() { + ::capnp::MallocMessageBuilder message; + + return 0; +} diff --git a/examples/Catch/CMakeLists.txt b/examples/Catch/CMakeLists.txt new file mode 100644 index 000000000..4c2fc98e6 --- /dev/null +++ b/examples/Catch/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (c) 2016 Alexey Ulyanov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Catch) + +hunter_add_package(Catch) + +# DOCUMENTATION_START { +find_package(Catch2 CONFIG REQUIRED) + +set(SOURCES main.cpp + foo_test.cpp + foo.cpp) +set(HEADERS foo.hpp) + +add_executable(foo_test ${SOURCES} ${HEADERS}) +target_link_libraries(foo_test PUBLIC Catch2::Catch2) +# DOCUMENTATION_END } diff --git a/examples/Catch/foo.cpp b/examples/Catch/foo.cpp new file mode 100644 index 000000000..4eaadd41b --- /dev/null +++ b/examples/Catch/foo.cpp @@ -0,0 +1,5 @@ +#include "foo.hpp" + +namespace ns_foo { + bool return_true() { return true; } +} diff --git a/examples/Catch/foo.hpp b/examples/Catch/foo.hpp new file mode 100644 index 000000000..eebb7aa25 --- /dev/null +++ b/examples/Catch/foo.hpp @@ -0,0 +1,9 @@ +#ifndef FOO_H +#define FOO_H +#pragma once + +namespace ns_foo { + bool return_true(); +} + +#endif diff --git a/examples/Catch/foo_test.cpp b/examples/Catch/foo_test.cpp new file mode 100644 index 000000000..9f6168f43 --- /dev/null +++ b/examples/Catch/foo_test.cpp @@ -0,0 +1,9 @@ +#include +#include "foo.hpp" + +namespace ns_foo { + TEST_CASE("foo_test", "[foo]") { + REQUIRE_NOTHROW(return_true()); + REQUIRE(true == return_true()); + } +} diff --git a/examples/Catch/main.cpp b/examples/Catch/main.cpp new file mode 100644 index 000000000..4ed06df1f --- /dev/null +++ b/examples/Catch/main.cpp @@ -0,0 +1,2 @@ +#define CATCH_CONFIG_MAIN +#include diff --git a/examples/CppNetlibUri/CMakeLists.txt b/examples/CppNetlibUri/CMakeLists.txt new file mode 100644 index 000000000..9972feeca --- /dev/null +++ b/examples/CppNetlibUri/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cppnetliburi) + +hunter_add_package(CppNetlibUri) + +find_package(CppNetlibUri CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo network-uri) diff --git a/examples/CppNetlibUri/foo.cpp b/examples/CppNetlibUri/foo.cpp new file mode 100644 index 000000000..2d8046bff --- /dev/null +++ b/examples/CppNetlibUri/foo.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + network::uri uri; + return uri.string().length(); +} diff --git a/examples/CreateLaunchers/CMakeLists.txt b/examples/CreateLaunchers/CMakeLists.txt new file mode 100644 index 000000000..6b0943fb1 --- /dev/null +++ b/examples/CreateLaunchers/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-CreateLaunchers) + +# DOCUMENTATION_START { +hunter_add_package(CreateLaunchers) +find_package(CreateLaunchers CONFIG REQUIRED) + +add_executable(CreateLaunchers_test main.cpp) + +include(CreateLaunchers) + +create_target_launcher(CreateLaunchers_test + ARGS "-a" + RUNTIME_LIBRARY_DIRS "./" + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} +) + +# DOCUMENTATION_END } diff --git a/examples/CreateLaunchers/main.cpp b/examples/CreateLaunchers/main.cpp new file mode 100644 index 000000000..905869dfa --- /dev/null +++ b/examples/CreateLaunchers/main.cpp @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} diff --git a/examples/Eigen-Boost/CMakeLists.txt b/examples/Eigen-Boost/CMakeLists.txt new file mode 100644 index 000000000..8ccbcb276 --- /dev/null +++ b/examples/Eigen-Boost/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(HUNTER_USE_CACHE_SERVERS NO) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-eigen) + +# Build Boost first. +hunter_add_package(Boost) + +# Then try to build Eigen. +# Eigen calls 'find_package(Boost)' but doesn't call 'hunter_add_package(Boost)', +# this leads to conflict similar to the one described in: +# * https://docs.hunter.sh/en/latest/creating-new/cmake-dependencies.html#conflict +# Fix: exclude code with 'find_package(Boost)' (this code only for building tests) +# or hunterize Eigen. +hunter_add_package(Eigen) diff --git a/examples/EnumGroup/CMakeLists.txt b/examples/EnumGroup/CMakeLists.txt new file mode 100644 index 000000000..079da7ed4 --- /dev/null +++ b/examples/EnumGroup/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-EnumGroup) + +# DOCUMENTATION_START { +hunter_add_package(EnumGroup) +find_package(EnumGroup CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC EnumGroup::EnumGroup) +# DOCUMENTATION_END } diff --git a/examples/EnumGroup/boo.cpp b/examples/EnumGroup/boo.cpp new file mode 100644 index 000000000..759bc1187 --- /dev/null +++ b/examples/EnumGroup/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/FP16/CMakeLists.txt b/examples/FP16/CMakeLists.txt new file mode 100644 index 000000000..af1682b99 --- /dev/null +++ b/examples/FP16/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-FP16) + +# DOCUMENTATION_START { +hunter_add_package(FP16) +find_package(FP16 REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC FP16::fp16) +# DOCUMENTATION_END } diff --git a/examples/FP16/boo.cpp b/examples/FP16/boo.cpp new file mode 100644 index 000000000..7c435f70c --- /dev/null +++ b/examples/FP16/boo.cpp @@ -0,0 +1,16 @@ +#include + +int main() { + // Test FP16 + const uint16_t min_po2_f16 = UINT16_C(0x0400); + const float min_po2_value = fp16_ieee_to_fp32_value(min_po2_f16); + + const uint16_t positive_infinity_f16 = UINT16_C(0x7C00); + const uint16_t negative_infinity_f16 = UINT16_C(0xFC00); + + const uint32_t positive_infinity_f32 = UINT32_C(0x7F800000); + const uint32_t negative_infinity_f32 = UINT32_C(0xFF800000); + + + return 0; +} diff --git a/examples/FakeIt/CMakeLists.txt b/examples/FakeIt/CMakeLists.txt new file mode 100644 index 000000000..53a8a078c --- /dev/null +++ b/examples/FakeIt/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2016 Alexey Ulyanov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-FakeIt) +set(CMAKE_CXX_STANDARD 11) + +hunter_add_package(FakeIt) + +find_package(FakeIt CONFIG REQUIRED) + +set(SOURCES fakeit_test.cpp) + +add_executable(fakeit_test ${SOURCES}) +target_link_libraries(fakeit_test PRIVATE FakeIt::FakeIt) + +enable_testing() +add_test(NAME fakeit_test COMMAND fakeit_test) diff --git a/examples/FakeIt/fakeit_test.cpp b/examples/FakeIt/fakeit_test.cpp new file mode 100644 index 000000000..f65d87a67 --- /dev/null +++ b/examples/FakeIt/fakeit_test.cpp @@ -0,0 +1,30 @@ +#include +#include + +struct SomeInterface { + virtual int foo(int) = 0; + virtual int bar(std::string) = 0; +}; + +int main() +{ + using namespace fakeit; + + // Instantiate a mock object. + Mock mock; + + // Setup mock behavior. + When(Method(mock,foo)).Return(1); // Method mock.foo will return 1 once. + + // Fetch the mock instance. + SomeInterface &i = mock.get(); + + // Production code + i.foo(1); + + // Verify method mock.foo was invoked. + Verify(Method(mock,foo)); + + // Verify method mock.foo was invoked with specific arguments. + Verify(Method(mock,foo).Using(1)); +} diff --git a/examples/Fruit/CMakeLists.txt b/examples/Fruit/CMakeLists.txt new file mode 100644 index 000000000..9da14621b --- /dev/null +++ b/examples/Fruit/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-fruit) + +# DOCUMENTATION_START { +hunter_add_package(Fruit) +find_package(Fruit CONFIG REQUIRED) + +add_executable(foo foo.cpp) + +target_link_libraries(foo PRIVATE Fruit::fruit) +# DOCUMENTATION_END } diff --git a/examples/Fruit/foo.cpp b/examples/Fruit/foo.cpp new file mode 100644 index 000000000..502a80aa3 --- /dev/null +++ b/examples/Fruit/foo.cpp @@ -0,0 +1,52 @@ +// copied from the example at https://github.com/google/fruit/wiki/tutorial:-getting-started + +#include +#include + +class Writer { +public: + virtual void write(std::string s) = 0; +}; + +class StdoutWriter : public Writer { +public: + // Like "StdoutWriter() = default;" but also marks this constructor as the one to use for injection. + INJECT(StdoutWriter()) = default; + + virtual void write(std::string s) override { + std::cout << s; + } +}; + +class Greeter { +public: + virtual void greet() = 0; +}; + +class GreeterImpl : public Greeter { +private: + Writer* writer; + +public: + // Like "GreeterImpl(Writer* writer) : ... {...}" but also marks this constructor as the one to use for injection. + INJECT(GreeterImpl(Writer* writer)) + : writer(writer) { + } + + virtual void greet() override { + writer->write("Hello world!\n"); + } +}; + +fruit::Component getGreeterComponent() { + return fruit::createComponent() + .bind() + .bind(); +} + +int main() { + fruit::Injector injector(getGreeterComponent); + Greeter* greeter = injector.get(); + greeter->greet(); + return 0; +} diff --git a/examples/FunctionalPlus/CMakeLists.txt b/examples/FunctionalPlus/CMakeLists.txt new file mode 100644 index 000000000..0c8632d26 --- /dev/null +++ b/examples/FunctionalPlus/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-FunctionalPlus) + +# DOCUMENTATION_START { +hunter_add_package(FunctionalPlus) +find_package(FunctionalPlus CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo FunctionalPlus::fplus) +# DOCUMENTATION_END } diff --git a/examples/FunctionalPlus/foo.cpp b/examples/FunctionalPlus/foo.cpp new file mode 100644 index 000000000..2788c673f --- /dev/null +++ b/examples/FunctionalPlus/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/GPUImage/CMakeLists.txt b/examples/GPUImage/CMakeLists.txt new file mode 100644 index 000000000..cdd16668c --- /dev/null +++ b/examples/GPUImage/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-GPUImage) + +# DOCUMENTATION_START { +hunter_add_package(GPUImage) +find_package(GPUImage CONFIG REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC GPUImage::gpuimage) +# DOCUMENTATION_END } diff --git a/examples/GPUImage/foo.mm b/examples/GPUImage/foo.mm new file mode 100644 index 000000000..7c61c3a92 --- /dev/null +++ b/examples/GPUImage/foo.mm @@ -0,0 +1,5 @@ +#include + +int main() { + auto *filter = [[GPUImageGrayscaleFilter alloc] init]; +} diff --git a/examples/HalideIR/CMakeLists.txt b/examples/HalideIR/CMakeLists.txt new file mode 100644 index 000000000..3462a82bd --- /dev/null +++ b/examples/HalideIR/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-HalideIR) + +# DOCUMENTATION_START { +hunter_add_package(HalideIR) +find_package(HalideIR CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC HalideIR::HalideIR) +# DOCUMENTATION_END } diff --git a/examples/HalideIR/boo.cpp b/examples/HalideIR/boo.cpp new file mode 100644 index 000000000..64ee625e1 --- /dev/null +++ b/examples/HalideIR/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/HastyNoise/CMakeLists.txt b/examples/HastyNoise/CMakeLists.txt new file mode 100644 index 000000000..090c4392b --- /dev/null +++ b/examples/HastyNoise/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) +include("../common.cmake") + +project(download_hastynoisesimd) + +# DOCUMENTATION_START { +hunter_add_package(HastyNoise) +find_package(HastyNoise CONFIG REQUIRED) + +add_executable(hastynoise_test main.cpp) +target_link_libraries(hastynoise_test HastyNoise::hastyNoise) +# DOCUMENTATION_END } diff --git a/examples/HastyNoise/config.cmake b/examples/HastyNoise/config.cmake new file mode 100644 index 000000000..dc7abfd3c --- /dev/null +++ b/examples/HastyNoise/config.cmake @@ -0,0 +1,4 @@ +hunter_config(Boost VERSION ${HUNTER_Boost_VERSION} + CMAKE_ARGS + BUILD_SHARED_LIBS=ON +) diff --git a/examples/HastyNoise/main.cpp b/examples/HastyNoise/main.cpp new file mode 100644 index 000000000..a9d1a4628 --- /dev/null +++ b/examples/HastyNoise/main.cpp @@ -0,0 +1,8 @@ +#include + +int main(int argc, char **argv) +{ + size_t simdLevel=HastyNoise::GetFastestSIMD(); + + auto noise=HastyNoise::CreateNoise(1337, simdLevel); +} diff --git a/examples/ICU/CMakeLists.txt b/examples/ICU/CMakeLists.txt new file mode 100644 index 000000000..11ea71fdd --- /dev/null +++ b/examples/ICU/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-icu) + +# DOCUMENTATION_START { +hunter_add_package(ICU) +find_package(ICU CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC ICU::uc) +# DOCUMENTATION_END } diff --git a/examples/ICU/boo.cpp b/examples/ICU/boo.cpp new file mode 100644 index 000000000..599c3b76e --- /dev/null +++ b/examples/ICU/boo.cpp @@ -0,0 +1,16 @@ +#include + +#include +#include + +int main() +{ + const std::string greek_utf8 = "γεια σας"; + const icu::UnicodeString greek = icu::UnicodeString::fromUTF8(greek_utf8); + + if (greek.countChar32() != 8) + { + std::cerr << "Sanity check failed" << std::endl; + return 1; + } +} diff --git a/examples/IF97/CMakeLists.txt b/examples/IF97/CMakeLists.txt new file mode 100644 index 000000000..16455c032 --- /dev/null +++ b/examples/IF97/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-IF97) + +hunter_add_package(IF97) +find_package(IF97 CONFIG REQUIRED) + +add_executable(IF97 IF97.cpp) +target_link_libraries(IF97 IF97::IF97) diff --git a/examples/IF97/IF97.cpp b/examples/IF97/IF97.cpp new file mode 100644 index 000000000..7ed92dddd --- /dev/null +++ b/examples/IF97/IF97.cpp @@ -0,0 +1,36 @@ +// This compiler flag causes input/output units on the Thermodynamic Properties in IF97.h +// to take pressure units of [MPa] and Energy units of [kJ] for comparison with IAPWS +// table values. If not set, the default behavior of IF97.h is to use straight SI units +// with pressure in [Pa] and enthalpy in [J]. +#define IAPWS_UNITS + +#include +#include + +int main(){ + + using namespace IF97; + + printf("*****************************************************************\n"); + printf("******************** Verification Tables ************************\n"); + printf("* Tables below are printed for verification. Unless otherwise *\n"); + printf("* noted, tables are reproduced from the *\n"); + printf("* \"Revised Release on the IAPWS Industrial Formulation 1997\" *\n"); + printf("* IAPWS R7-97(2012). *\n"); + printf("*****************************************************************\n\n\n"); + + + double T1 = 300, T2 = 300, T3 = 500, p1 = 3, p2 = 80, p3 = 3; + printf("*****************************************************************\n"); + printf("******************** Table 5 - Region 1 *************************\n"); + printf("*****************************************************************\n"); + printf("%5s %11.8e %11.8e %11.8e\n", "v", 1/rhomass_Tp(T1, p1), 1/rhomass_Tp(T2, p2), 1/rhomass_Tp(T3, p3)); + printf("%5s %11.8e %11.8e %11.8e\n", "h", hmass_Tp(T1, p1), hmass_Tp(T2, p2), hmass_Tp(T3, p3)); + printf("%5s %11.8e %11.8e %11.8e\n", "u", umass_Tp(T1, p1), umass_Tp(T2, p2), umass_Tp(T3, p3)); + printf("%5s %11.8e %11.8e %11.8e\n", "s", smass_Tp(T1, p1), smass_Tp(T2, p2), smass_Tp(T3, p3)); + printf("%5s %11.8e %11.8e %11.8e\n", "cp", cpmass_Tp(T1, p1), cpmass_Tp(T2, p2), cpmass_Tp(T3, p3)); + printf("%5s %11.8e %11.8e %11.8e\n", "w", speed_sound_Tp(T1, p1), speed_sound_Tp(T2, p2), speed_sound_Tp(T3, p3)); + printf("***************************************************************\n\n"); + + return 0; +} \ No newline at end of file diff --git a/examples/LAPACK-CBLAS/CMakeLists.txt b/examples/LAPACK-CBLAS/CMakeLists.txt new file mode 100644 index 000000000..4c5197b6f --- /dev/null +++ b/examples/LAPACK-CBLAS/CMakeLists.txt @@ -0,0 +1,35 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + + +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-LAPACK) + +hunter_add_package(LAPACK) + +string(COMPARE EQUAL "${LAPACK_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Licenses not found") +endif() + +message("LAPACK licenses:") +foreach(x ${LAPACK_LICENSES}) + message("* ${x}") + if(NOT EXISTS "${LAPACK_LICENSES}") + message(FATAL_ERROR "File not found") + endif() +endforeach() + +find_package(cblas CONFIG REQUIRED) +# Test double library creation +find_package(cblas CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo cblas) + diff --git a/examples/LAPACK-CBLAS/config.cmake b/examples/LAPACK-CBLAS/config.cmake new file mode 100644 index 000000000..48d3bab51 --- /dev/null +++ b/examples/LAPACK-CBLAS/config.cmake @@ -0,0 +1,4 @@ +hunter_config(LAPACK + VERSION ${HUNTER_LAPACK_VERSION} + CMAKE_ARGS CBLAS=ON + ) diff --git a/examples/LAPACK-CBLAS/foo.cpp b/examples/LAPACK-CBLAS/foo.cpp new file mode 100644 index 000000000..3c55ffa7c --- /dev/null +++ b/examples/LAPACK-CBLAS/foo.cpp @@ -0,0 +1,14 @@ +#include // std::cout +#include + +int main() { + double X[3]; + X[0] = 1; + X[1] = 2; + X[2] = 3; + const int N = 3; + const int incX = 1; + + double sum = cblas_dasum(N, X, incX); + std::cout << "sum over [1, 2, 3] = " << sum << std::endl; +} diff --git a/examples/LAPACK-dynamic/CMakeLists.txt b/examples/LAPACK-dynamic/CMakeLists.txt new file mode 100644 index 000000000..53fb83aef --- /dev/null +++ b/examples/LAPACK-dynamic/CMakeLists.txt @@ -0,0 +1,35 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-LAPACK) + +hunter_add_package(LAPACK) + +string(COMPARE EQUAL "${LAPACK_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Licenses not found") +endif() + +message("LAPACK licenses:") +foreach(x ${LAPACK_LICENSES}) + message("* ${x}") + if(NOT EXISTS "${LAPACK_LICENSES}") + message(FATAL_ERROR "File not found") + endif() +endforeach() + +find_package(LAPACK CONFIG REQUIRED) +# Test double library creation +find_package(LAPACK CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo blas lapack) + diff --git a/examples/LAPACK-dynamic/config.cmake b/examples/LAPACK-dynamic/config.cmake new file mode 100644 index 000000000..7880662d5 --- /dev/null +++ b/examples/LAPACK-dynamic/config.cmake @@ -0,0 +1,4 @@ +hunter_config(LAPACK + VERSION ${HUNTER_LAPACK_VERSION} + CMAKE_ARGS BUILD_SHARED_LIBS=ON +) diff --git a/examples/LAPACK-dynamic/foo.cpp b/examples/LAPACK-dynamic/foo.cpp new file mode 100644 index 000000000..b230adc8a --- /dev/null +++ b/examples/LAPACK-dynamic/foo.cpp @@ -0,0 +1,5 @@ +#include // std::cout + +int main() { + std::cout << "This program is doing nothing!" << std::endl; +} diff --git a/examples/LAPACK/CMakeLists.txt b/examples/LAPACK/CMakeLists.txt new file mode 100644 index 000000000..c152432e0 --- /dev/null +++ b/examples/LAPACK/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-LAPACK) + +hunter_add_package(LAPACK) + +string(COMPARE EQUAL "${LAPACK_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Licenses not found") +endif() + +message("LAPACK licenses:") +foreach(x ${LAPACK_LICENSES}) + message("* ${x}") + if(NOT EXISTS "${LAPACK_LICENSES}") + message(FATAL_ERROR "File not found") + endif() +endforeach() + +find_package(LAPACK CONFIG REQUIRED) +# Test double library creation +find_package(LAPACK CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo blas lapack) + diff --git a/examples/LAPACK/foo.cpp b/examples/LAPACK/foo.cpp new file mode 100644 index 000000000..b230adc8a --- /dev/null +++ b/examples/LAPACK/foo.cpp @@ -0,0 +1,5 @@ +#include // std::cout + +int main() { + std::cout << "This program is doing nothing!" << std::endl; +} diff --git a/examples/LLVM/CMakeLists.txt b/examples/LLVM/CMakeLists.txt new file mode 100644 index 000000000..a956d41cc --- /dev/null +++ b/examples/LLVM/CMakeLists.txt @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-LLVM) + +# DOCUMENTATION_START { +hunter_add_package(LLVM) +find_package(LLVM CONFIG REQUIRED) + +include_directories(${LLVM_INCLUDE_DIRS}) +add_definitions(${LLVM_DEFINITIONS}) +llvm_map_components_to_libnames(llvm_libs support core) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC ${llvm_libs}) +# DOCUMENTATION_END } + +if(NOT TARGET llvm-ar) + message(FATAL_ERROR "llvm-ar target not exists") +endif() +get_target_property(llvm_ar_path llvm-ar IMPORTED_LOCATION_RELEASE) +execute_process( + COMMAND ${llvm_ar_path} --version + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE output +) +if(NOT result EQUAL 0) + message(FATAL_ERROR "Command failed (${result}, ${output})") +endif() +message("llvm-ar info (${llvm_ar_path}):\n${output}") + +unset(clang_path CACHE) +find_program(clang_path clang++ HINTS "${LLVM_ROOT}/bin") +execute_process( + COMMAND ${clang_path} --version + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE output +) +if(NOT result EQUAL 0) + message(FATAL_ERROR "Command failed (${result}, ${output})") +endif() +message("clang++ info (${clang_path}):\n${output}") diff --git a/examples/LLVM/boo.cpp b/examples/LLVM/boo.cpp new file mode 100644 index 000000000..d9f56e4cb --- /dev/null +++ b/examples/LLVM/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/Leathers/boo.cpp b/examples/Leathers/boo.cpp new file mode 100644 index 000000000..550f954b9 --- /dev/null +++ b/examples/Leathers/boo.cpp @@ -0,0 +1,5 @@ +#include +#include + +int main() { +} diff --git a/examples/Leptonica/CMakeLists.txt b/examples/Leptonica/CMakeLists.txt new file mode 100644 index 000000000..6d06f84d8 --- /dev/null +++ b/examples/Leptonica/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Leptonica) + +# download Leptonica +# DOCUMENTATION_START { +hunter_add_package(Leptonica) +find_package(Leptonica CONFIG REQUIRED) +add_executable(example example.c) + +target_link_libraries(example Leptonica::leptonica) +# DOCUMENTATION_END } + +enable_testing() + +add_test(example example) diff --git a/examples/Leptonica/example.c b/examples/Leptonica/example.c new file mode 100644 index 000000000..b2ed1bb6d --- /dev/null +++ b/examples/Leptonica/example.c @@ -0,0 +1,9 @@ +#include +#include +#include + +int main() { + PIXA* pixaDisp = pixaCreate(0); + pixaDestroy(&pixaDisp); + return 0; +} diff --git a/examples/LibCDS/CMakeLists.txt b/examples/LibCDS/CMakeLists.txt new file mode 100644 index 000000000..76810c591 --- /dev/null +++ b/examples/LibCDS/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-LibCDS) + +hunter_add_package(LibCDS) + +find_package(LibCDS CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main LibCDS::cds) # Use LibCDS::cds-s for static library diff --git a/examples/LibCDS/main.cpp b/examples/LibCDS/main.cpp new file mode 100644 index 000000000..16bb99064 --- /dev/null +++ b/examples/LibCDS/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/Libevent/CMakeLists.txt b/examples/Libevent/CMakeLists.txt new file mode 100644 index 000000000..a51de1487 --- /dev/null +++ b/examples/Libevent/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-libevent) + +hunter_add_package(Libevent) + +find_package(Libevent CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main Libevent::event_core + Libevent::event_extra) diff --git a/examples/Libevent/main.cpp b/examples/Libevent/main.cpp new file mode 100644 index 000000000..819586408 --- /dev/null +++ b/examples/Libevent/main.cpp @@ -0,0 +1,7 @@ +#include +#include + +int main() +{ + return 0; +} diff --git a/examples/LodePNG/CMakeLists.txt b/examples/LodePNG/CMakeLists.txt new file mode 100644 index 000000000..961e58b0e --- /dev/null +++ b/examples/LodePNG/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-LodePNG) + +# DOCUMENTATION_START { +hunter_add_package(LodePNG) +find_package(LodePNG CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main PUBLIC LodePNG::lodepng) +# DOCUMENTATION_END } diff --git a/examples/LodePNG/main.cpp b/examples/LodePNG/main.cpp new file mode 100644 index 000000000..06168d030 --- /dev/null +++ b/examples/LodePNG/main.cpp @@ -0,0 +1,7 @@ +#include + +// See https://github.com/lvandeve/lodepng/tree/master/examples +int main() { + lodepng::State state; + (void)state; +} diff --git a/examples/Lua/boo.cpp b/examples/Lua/boo.cpp new file mode 100644 index 000000000..049c45062 --- /dev/null +++ b/examples/Lua/boo.cpp @@ -0,0 +1,11 @@ +#include + +int main() { + lua_State* state(0); + + char data[100]; + unsigned size(0); + const char* name = "name"; + + luaL_loadbuffer(state, data, size, name); +} diff --git a/examples/MathFu/CMakeLists.txt b/examples/MathFu/CMakeLists.txt new file mode 100644 index 000000000..303240a72 --- /dev/null +++ b/examples/MathFu/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-MathFu) + +# DOCUMENTATION_START { +hunter_add_package(MathFu) +find_package(MathFu CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC MathFu::mathfu) +# DOCUMENTATION_END } diff --git a/examples/MathFu/boo.cpp b/examples/MathFu/boo.cpp new file mode 100644 index 000000000..a226b3e91 --- /dev/null +++ b/examples/MathFu/boo.cpp @@ -0,0 +1,9 @@ +#include +#include + +int main(int argc, char *argv[]) { + mathfu::Vector v1(1.0f, 2.0f, 3.0f), v2(3.0f, 2.5f, 0.5f), v3; + v3 = v1 + v2; + printf("%.1f %.1f %.1f\n", v3.x, v3.y, v3.z); + return 0; +} diff --git a/examples/Microsoft.GSL/CMakeLists.txt b/examples/Microsoft.GSL/CMakeLists.txt new file mode 100644 index 000000000..052e0a7d9 --- /dev/null +++ b/examples/Microsoft.GSL/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Microsoft.GSL) + +# DOCUMENTATION_START { +hunter_add_package(Microsoft.GSL) +find_package(Microsoft.GSL CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC Microsoft.GSL::GSL) +# DOCUMENTATION_END } diff --git a/examples/Microsoft.GSL/boo.cpp b/examples/Microsoft.GSL/boo.cpp new file mode 100644 index 000000000..6ed828fa4 --- /dev/null +++ b/examples/Microsoft.GSL/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/NASM/CMakeLists.txt b/examples/NASM/CMakeLists.txt new file mode 100644 index 000000000..ea1224023 --- /dev/null +++ b/examples/NASM/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright (c) 2017 Zhuhao Wang +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-NASM) + +hunter_add_package(NASM) + +find_program(NASM_EXECUTABLE + nasm + HINTS + ${NASM_ROOT}/bin + NO_DEFAULT_PATH + ) + +execute_process( + COMMAND "${NASM_EXECUTABLE}" -v + RESULT_VARIABLE result + OUTPUT_VARIABLE output + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + +if(NOT result EQUAL 0) + message(FATAL_ERROR "NASM failed") +endif() + +message("NASM version: ${output}") diff --git a/examples/NLopt/CMakeLists.txt b/examples/NLopt/CMakeLists.txt new file mode 100644 index 000000000..c48c45f44 --- /dev/null +++ b/examples/NLopt/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-nlopt) + +# DOCUMENTATION_START { +hunter_add_package(NLopt) +find_package(NLopt CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC NLopt::nlopt) +# DOCUMENTATION_END } diff --git a/examples/NLopt/boo.cpp b/examples/NLopt/boo.cpp new file mode 100644 index 000000000..2d25712a3 --- /dev/null +++ b/examples/NLopt/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/ONNX/CMakeLists.txt b/examples/ONNX/CMakeLists.txt new file mode 100644 index 000000000..4355b0060 --- /dev/null +++ b/examples/ONNX/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-onnx) + +# DOCUMENTATION_START { +hunter_add_package(ONNX) +find_package(ONNX CONFIG REQUIRED) + +add_executable(test test.cpp) +target_link_libraries(test PUBLIC onnx::onnx onnx::onnxifi) +# DOCUMENTATION_END } diff --git a/examples/ONNX/test.cpp b/examples/ONNX/test.cpp new file mode 100644 index 000000000..696bf1261 --- /dev/null +++ b/examples/ONNX/test.cpp @@ -0,0 +1,8 @@ +#include "onnx/string_utils.h" +#include +#include + +int main() { + std::string ret = ONNX_NAMESPACE::to_string(0); + return atoi(ret.c_str()); +} diff --git a/examples/OpenAL/CMakeLists.txt b/examples/OpenAL/CMakeLists.txt new file mode 100644 index 000000000..9a7177034 --- /dev/null +++ b/examples/OpenAL/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-OpenAL) + +hunter_add_package(OpenAL) + +find_package(OpenAL CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main OpenAL::OpenAL) diff --git a/examples/OpenAL/main.cpp b/examples/OpenAL/main.cpp new file mode 100644 index 000000000..d5724a643 --- /dev/null +++ b/examples/OpenAL/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/OpenCL-cpp/CMakeLists.txt b/examples/OpenCL-cpp/CMakeLists.txt new file mode 100644 index 000000000..d5ad81280 --- /dev/null +++ b/examples/OpenCL-cpp/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_opencl_cpp) + +hunter_add_package(OpenCL-cpp) +find_package(OpenCL-cpp CONFIG REQUIRED) + +add_executable(opencl_cpp_test main.cpp) +target_link_libraries(opencl_cpp_test OpenCL-cpp::OpenCL-cpp) diff --git a/examples/OpenCL-cpp/main.cpp b/examples/OpenCL-cpp/main.cpp new file mode 100644 index 000000000..12250d5b5 --- /dev/null +++ b/examples/OpenCL-cpp/main.cpp @@ -0,0 +1,18 @@ +#if __APPLE__ +#include +#else +#include +#endif + +#include + +int main() +{ + std::vector platforms; + + cl::Platform::get(&platforms); + return 0; +} + + + diff --git a/examples/OpenCL/CMakeLists.txt b/examples/OpenCL/CMakeLists.txt new file mode 100644 index 000000000..a954d8283 --- /dev/null +++ b/examples/OpenCL/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_opencl) + +hunter_add_package(OpenCL) +find_package(OpenCL CONFIG REQUIRED) + +add_executable(opencl_test main.cpp) +target_link_libraries(opencl_test OpenCL::OpenCL) diff --git a/examples/OpenCL/main.cpp b/examples/OpenCL/main.cpp new file mode 100644 index 000000000..bfd0472a0 --- /dev/null +++ b/examples/OpenCL/main.cpp @@ -0,0 +1,14 @@ +#if __APPLE__ +#include +#else +#include +#endif + +int main() +{ + cl_platform_id platform_id = NULL; + cl_uint ret_num_platforms; + + clGetPlatformIDs(1, &platform_id, &ret_num_platforms); + return 0; +} diff --git a/examples/OpenCV-Qt/CMakeLists.txt b/examples/OpenCV-Qt/CMakeLists.txt new file mode 100644 index 000000000..1f61576e8 --- /dev/null +++ b/examples/OpenCV-Qt/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2017, Alexandre Pretyman +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-opencv-qt) + +hunter_add_package(OpenCV) +find_package(OpenCV REQUIRED) +message("OpenCV_DIR: ${OpenCV_DIR}") +message("OpenCV_CONFIG: ${OpenCV_CONFIG}") +message("OpenCV_LIBS: ${OpenCV_LIBS}") + +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE ${OpenCV_LIBS}) diff --git a/examples/OpenCV-Qt/config.cmake b/examples/OpenCV-Qt/config.cmake new file mode 100644 index 000000000..1d96b9879 --- /dev/null +++ b/examples/OpenCV-Qt/config.cmake @@ -0,0 +1,7 @@ +hunter_config(OpenCV + VERSION ${HUNTER_OpenCV_VERSION} + CMAKE_ARGS + # enable Qt back-end for GUI + WITH_QT=YES +) + diff --git a/examples/OpenCV-Qt/foo.cpp b/examples/OpenCV-Qt/foo.cpp new file mode 100644 index 000000000..4023e8691 --- /dev/null +++ b/examples/OpenCV-Qt/foo.cpp @@ -0,0 +1,86 @@ +// from https://github.com/opencv/opencv/blob/0eb1bfa874567cae025f42b2da79c2f754d765d9/samples/cpp/edge.cpp +#include "opencv2/core/utility.hpp" +#include "opencv2/imgproc.hpp" +#include "opencv2/imgcodecs.hpp" +#include "opencv2/highgui.hpp" + +#include + +using namespace cv; +using namespace std; + +int edgeThresh = 1; +int edgeThreshScharr=1; + +Mat image, gray, blurImage, edge1, edge2, cedge; + +const char* window_name1 = "Edge map : Canny default (Sobel gradient)"; +const char* window_name2 = "Edge map : Canny with custom gradient (Scharr)"; + +// define a trackbar callback +static void onTrackbar(int, void*) +{ + blur(gray, blurImage, Size(3,3)); + + // Run the edge detector on grayscale + Canny(blurImage, edge1, edgeThresh, edgeThresh*3, 3); + cedge = Scalar::all(0); + + image.copyTo(cedge, edge1); + imshow(window_name1, cedge); + + /// Canny detector with scharr + Mat dx,dy; + Scharr(blurImage,dx,CV_16S,1,0); + Scharr(blurImage,dy,CV_16S,0,1); + Canny( dx,dy, edge2, edgeThreshScharr, edgeThreshScharr*3 ); + /// Using Canny's output as a mask, we display our result + cedge = Scalar::all(0); + image.copyTo(cedge, edge2); + imshow(window_name2, cedge); +} + +static void help() +{ + printf("\nThis sample demonstrates Canny edge detection\n" + "Call:\n" + " /.edge [image_name -- Default is ../data/fruits.jpg]\n\n"); +} + +const char* keys = +{ + "{help h||}{@image |../data/fruits.jpg|input image name}" +}; + +int main( int argc, const char** argv ) +{ + help(); + CommandLineParser parser(argc, argv, keys); + string filename = parser.get(0); + + image = imread(filename, IMREAD_COLOR); + if(image.empty()) + { + printf("Cannot read image file: %s\n", filename.c_str()); + help(); + return -1; + } + cedge.create(image.size(), image.type()); + cvtColor(image, gray, COLOR_BGR2GRAY); + + // Create a window + namedWindow(window_name1, 1); + namedWindow(window_name2, 1); + + // create a toolbar + createTrackbar("Canny threshold default", window_name1, &edgeThresh, 100, onTrackbar); + createTrackbar("Canny threshold Scharr", window_name2, &edgeThreshScharr, 400, onTrackbar); + + // Show the image + onTrackbar(0, 0); + + // Wait for a key stroke; the same function arranges events processing + waitKey(0); + + return 0; +} diff --git a/examples/OpenCV-extra/CMakeLists.txt b/examples/OpenCV-extra/CMakeLists.txt new file mode 100644 index 000000000..99caa95e3 --- /dev/null +++ b/examples/OpenCV-extra/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-opencvextra) + +hunter_add_package(OpenCV) +find_package(OpenCV REQUIRED) + +message("OpenCV_DIR: ${OpenCV_DIR}") +message("OpenCV_CONFIG: ${OpenCV_CONFIG}") +message("OpenCV_LIBS: ${OpenCV_LIBS}") + +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE ${OpenCV_LIBS}) diff --git a/examples/OpenCV-extra/config.cmake b/examples/OpenCV-extra/config.cmake new file mode 100644 index 000000000..72221fcb7 --- /dev/null +++ b/examples/OpenCV-extra/config.cmake @@ -0,0 +1,10 @@ +hunter_config(OpenCV + VERSION ${HUNTER_OpenCV_VERSION} + CMAKE_ARGS + OPENCV_WITH_EXTRA_MODULES=YES + #disabled because of incorrect cmake install for ios + BUILD_opencv_dnn=OFF + #disabled because of incorrect cmake install for osx/ios + BUILD_opencv_xobjdetect=OFF + BUILD_opencv_hdf=OFF # not hunterized yet +) diff --git a/examples/OpenCV-extra/foo.cpp b/examples/OpenCV-extra/foo.cpp new file mode 100644 index 000000000..7f6cf9c12 --- /dev/null +++ b/examples/OpenCV-extra/foo.cpp @@ -0,0 +1,26 @@ +// http://docs.opencv.org/doc/tutorials/introduction/linux_gcc_cmake/linux_gcc_cmake.html + +#include +#include +#include + +int main(int argc, char** argv) { + if (argc != 2) { + printf("usage: DisplayImage.out \n"); + return -1; + } + + cv::Mat image; + image = cv::imread(argv[1], 1); + + if (!image.data) { + printf("No image data \n"); + return EXIT_FAILURE; + } + cv::namedWindow("Display Image", cv::WINDOW_AUTOSIZE); + cv::imshow("Display Image", image); + + cv::waitKey(0); + + return EXIT_SUCCESS; +} diff --git a/examples/OpenCV-ffmpeg/CMakeLists.txt b/examples/OpenCV-ffmpeg/CMakeLists.txt new file mode 100644 index 000000000..d5376278d --- /dev/null +++ b/examples/OpenCV-ffmpeg/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2015-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-opencv) + +hunter_add_package(OpenCV) +find_package(OpenCV REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE ${OpenCV_LIBS}) diff --git a/examples/OpenCV-ffmpeg/config.cmake b/examples/OpenCV-ffmpeg/config.cmake new file mode 100644 index 000000000..5e6bff211 --- /dev/null +++ b/examples/OpenCV-ffmpeg/config.cmake @@ -0,0 +1,27 @@ +hunter_config( + ffmpeg + VERSION + ${HUNTER_ffmpeg_VERSION} + CMAKE_ARGS + FFMPEG_ENABLE_GPL=ON + FFMPEG_ENABLE_LIBX264=ON + FFMPEG_ENABLE_PROGRAMS=ON + FFMPEG_ENABLE_AVFILTER=ON + FFMPEG_ENABLE_MUXER=image2 + FFMPEG_ENABLE_DEMUXER=mov;image2 + FFMPEG_ENABLE_PROTOCOL=file + FFMPEG_ENABLE_ENCODER=bmp + FFMPEG_ENABLE_FILTER=scale;overlay + FFMPEG_ENABLE_SWSCALE=ON + FFMPEG_ENABLE_AUTODETECT=OFF + FFMPEG_AUTOCONF_FLAGS=ON +) + +hunter_config( + OpenCV + VERSION + ${HUNTER_OpenCV_VERSION} + CMAKE_ARGS + WITH_FFMPEG=ON + OPENCV_FFMPEG_USE_FIND_PACKAGE=YES +) diff --git a/examples/OpenCV-ffmpeg/foo.cpp b/examples/OpenCV-ffmpeg/foo.cpp new file mode 100644 index 000000000..d49c7cdfb --- /dev/null +++ b/examples/OpenCV-ffmpeg/foo.cpp @@ -0,0 +1,49 @@ +#include +#include +#include + +#include +#include + +int main(int argc, char **argv) +{ + if(argc != 3) + { + std::cerr << "Incorrect number of arguments: " << argc << std::endl; + return EXIT_FAILURE; + } + + std::cout << "open " << argv[1] << std::endl; + cv::VideoCapture video(argv[1]); + + if(!video.isOpened()) + { + std::cerr << "Failed to open" << std::endl; + return EXIT_FAILURE; + } + + const std::string dir = argv[2]; + std::cout << "Writing to directory: " << dir << std::endl; + + std::ostringstream filename; + + for(int i=0;;++i) + { + cv::Mat frame; + video >> frame; + if(frame.empty()) + { + break; + } + + filename.str(""); + filename << dir << "/frame-" << i << ".png"; + + std::cout << frame.cols << " x " << frame.rows << " mean " + << cv::mean(frame) << " to file: " << filename.str() << std::endl; + + cv::imwrite(filename.str(), frame); + } + + return EXIT_SUCCESS; +} diff --git a/examples/OpenNMTTokenizer/CMakeLists.txt b/examples/OpenNMTTokenizer/CMakeLists.txt new file mode 100644 index 000000000..012e913d3 --- /dev/null +++ b/examples/OpenNMTTokenizer/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(foo) + +# DOCUMENTATION_START { +hunter_add_package(OpenNMTTokenizer) +find_package(OpenNMTTokenizer CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo OpenNMTTokenizer::OpenNMTTokenizer) +# DOCUMENTATION_END } diff --git a/examples/OpenNMTTokenizer/foo.cpp b/examples/OpenNMTTokenizer/foo.cpp new file mode 100644 index 000000000..cd64cc675 --- /dev/null +++ b/examples/OpenNMTTokenizer/foo.cpp @@ -0,0 +1,11 @@ +#include +#include + +int main() { + onmt::ITokenizer* tokenizer(0); + std::string line; + if (false) { + // Just check API + std::cout << tokenizer->tokenize(line); + } +} diff --git a/examples/OpenSSL-1.0.2/CMakeLists.txt b/examples/OpenSSL-1.0.2/CMakeLists.txt new file mode 100644 index 000000000..57e8f2014 --- /dev/null +++ b/examples/OpenSSL-1.0.2/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-openssl) + +hunter_add_package(OpenSSL) +find_package(OpenSSL REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC OpenSSL::SSL OpenSSL::Crypto) diff --git a/examples/OpenSSL-1.0.2/config.cmake b/examples/OpenSSL-1.0.2/config.cmake new file mode 100644 index 000000000..5d27c8831 --- /dev/null +++ b/examples/OpenSSL-1.0.2/config.cmake @@ -0,0 +1 @@ +hunter_config(OpenSSL VERSION 1.0.2s) diff --git a/examples/OpenSSL-1.0.2/foo.cpp b/examples/OpenSSL-1.0.2/foo.cpp new file mode 100644 index 000000000..237a7c5e7 --- /dev/null +++ b/examples/OpenSSL-1.0.2/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/OpenSSL-asm/CMakeLists.txt b/examples/OpenSSL-asm/CMakeLists.txt new file mode 100644 index 000000000..57e8f2014 --- /dev/null +++ b/examples/OpenSSL-asm/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-openssl) + +hunter_add_package(OpenSSL) +find_package(OpenSSL REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC OpenSSL::SSL OpenSSL::Crypto) diff --git a/examples/OpenSSL-asm/config.cmake b/examples/OpenSSL-asm/config.cmake new file mode 100644 index 000000000..05efc948a --- /dev/null +++ b/examples/OpenSSL-asm/config.cmake @@ -0,0 +1,3 @@ +hunter_config(OpenSSL VERSION ${HUNTER_OpenSSL_VERSION} + CMAKE_ARGS ASM_SUPPORT=ON +) diff --git a/examples/OpenSSL-asm/foo.cpp b/examples/OpenSSL-asm/foo.cpp new file mode 100644 index 000000000..237a7c5e7 --- /dev/null +++ b/examples/OpenSSL-asm/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/OpenSceneGraph/CMakeLists.txt b/examples/OpenSceneGraph/CMakeLists.txt new file mode 100644 index 000000000..1a3c45818 --- /dev/null +++ b/examples/OpenSceneGraph/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-OpenSceneGraph) + +# DOCUMENTATION_START { +hunter_add_package(OpenSceneGraph) +find_package(OpenSceneGraph CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC OpenSceneGraph::osg) +# DOCUMENTATION_END } diff --git a/examples/OpenSceneGraph/boo.cpp b/examples/OpenSceneGraph/boo.cpp new file mode 100644 index 000000000..e3aec7ee7 --- /dev/null +++ b/examples/OpenSceneGraph/boo.cpp @@ -0,0 +1,8 @@ +#include +#include +#include +#include + + +int main() { +} diff --git a/examples/PROJ4/CMakeLists.txt b/examples/PROJ4/CMakeLists.txt new file mode 100644 index 000000000..4fc9bc471 --- /dev/null +++ b/examples/PROJ4/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-proj4) + +# DOCUMENTATION_START { +hunter_add_package(PROJ4) +find_package(PROJ4 CONFIG REQUIRED) + +add_executable(hello-proj4 hello-proj4.cpp) +target_link_libraries(hello-proj4 PUBLIC proj) +# DOCUMENTATION_END } diff --git a/examples/PROJ4/hello-proj4.cpp b/examples/PROJ4/hello-proj4.cpp new file mode 100644 index 000000000..5c07395e6 --- /dev/null +++ b/examples/PROJ4/hello-proj4.cpp @@ -0,0 +1,8 @@ +#include + +#include + +int main() { + PJ_INFO nfo = proj_info(); + std::cout << nfo.release << std::endl; +} diff --git a/examples/PhysUnits/CMakeLists.txt b/examples/PhysUnits/CMakeLists.txt new file mode 100644 index 000000000..1c7d7df17 --- /dev/null +++ b/examples/PhysUnits/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-PhysUnits) + +# DOCUMENTATION_START { +hunter_add_package(PhysUnits) +find_package(PhysUnits CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC PhysUnits::PhysUnits) +# DOCUMENTATION_END } diff --git a/examples/PhysUnits/boo.cpp b/examples/PhysUnits/boo.cpp new file mode 100644 index 000000000..abd5d8788 --- /dev/null +++ b/examples/PhysUnits/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/QtPropertyEditor/CMakeLists.txt b/examples/QtPropertyEditor/CMakeLists.txt new file mode 100644 index 000000000..f13f3daf5 --- /dev/null +++ b/examples/QtPropertyEditor/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-QtPropertyEditor) + +# DOCUMENTATION_START { +hunter_add_package(QtPropertyEditor) +find_package(QtPropertyEditor CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC QtPropertyEditor::PropertyEditor) +# DOCUMENTATION_END } diff --git a/examples/QtPropertyEditor/boo.cpp b/examples/QtPropertyEditor/boo.cpp new file mode 100644 index 000000000..5b013b30c --- /dev/null +++ b/examples/QtPropertyEditor/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/Qwt/CMakeLists.txt b/examples/Qwt/CMakeLists.txt new file mode 100644 index 000000000..44868c0cf --- /dev/null +++ b/examples/Qwt/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Qwt) + +# DOCUMENTATION_START { +hunter_add_package(Qwt) +find_package(Qwt CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC Qwt::qwt) +# DOCUMENTATION_END } diff --git a/examples/Qwt/boo.cpp b/examples/Qwt/boo.cpp new file mode 100644 index 000000000..5026780c1 --- /dev/null +++ b/examples/Qwt/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/RapidXML/CMakeLists.txt b/examples/RapidXML/CMakeLists.txt new file mode 100644 index 000000000..802d5797b --- /dev/null +++ b/examples/RapidXML/CMakeLists.txt @@ -0,0 +1,20 @@ + +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("${CMAKE_CURRENT_SOURCE_DIR}/../common.cmake") + +project(download-RapidXML) + +# download RapidXML +hunter_add_package(RapidXML) + +# RapidXML available +find_package(RapidXML REQUIRED CONFIG) + +add_executable(foo foo.cpp) +target_link_libraries(foo RapidXML::RapidXML) diff --git a/examples/RapidXML/foo.cpp b/examples/RapidXML/foo.cpp new file mode 100644 index 000000000..b2ab6b083 --- /dev/null +++ b/examples/RapidXML/foo.cpp @@ -0,0 +1,7 @@ +#include "rapidxml/rapidxml.hpp" + +int main() +{ + return 0; +} + diff --git a/examples/RedisClient/CMakeLists.txt b/examples/RedisClient/CMakeLists.txt new file mode 100644 index 000000000..0e94d1da5 --- /dev/null +++ b/examples/RedisClient/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-redisclient) + +# DOCUMENTATION_START { +hunter_add_package(RedisClient) +find_package(RedisClient CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC RedisClient::RedisClient) +# DOCUMENTATION_END } diff --git a/examples/RedisClient/boo.cpp b/examples/RedisClient/boo.cpp new file mode 100644 index 000000000..f9a45089d --- /dev/null +++ b/examples/RedisClient/boo.cpp @@ -0,0 +1,50 @@ +// https://github.com/nekipelov/redisclient/blob/v0.6.1/README.md + +#include +#include +#include +#include +#include +#include + +int main(int, char **) +{ + boost::asio::ip::address address = boost::asio::ip::address::from_string("127.0.0.1"); + const unsigned short port = 6379; + boost::asio::ip::tcp::endpoint endpoint(address, port); + + boost::asio::io_service ioService; + redisclient::RedisSyncClient redis(ioService); + boost::system::error_code ec; + + redis.connect(endpoint, ec); + + if(ec) + { + std::cerr << "Can't connect to redis: " << ec.message() << std::endl; + return EXIT_FAILURE; + } + + redisclient::RedisValue result; + + result = redis.command("SET", {"key", "value"}); + + if( result.isError() ) + { + std::cerr << "SET error: " << result.toString() << "\n"; + return EXIT_FAILURE; + } + + result = redis.command("GET", {"key"}); + + if( result.isOk() ) + { + std::cout << "GET: " << result.toString() << "\n"; + return EXIT_SUCCESS; + } + else + { + std::cerr << "GET error: " << result.toString() << "\n"; + return EXIT_FAILURE; + } +} diff --git a/examples/SDL2/dummy.cpp b/examples/SDL2/dummy.cpp new file mode 100644 index 000000000..1730a23df --- /dev/null +++ b/examples/SDL2/dummy.cpp @@ -0,0 +1,4 @@ +int dummy() +{ + return 42; +} diff --git a/examples/SDL_image/CMakeLists.txt b/examples/SDL_image/CMakeLists.txt new file mode 100644 index 000000000..92b75c20b --- /dev/null +++ b/examples/SDL_image/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required (VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(SDL_image-test) + +hunter_add_package(SDL_image) +find_package(SDL_image CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main + SDL_image::SDL_image + SDL2::SDL2main) diff --git a/examples/SDL_image/main.cpp b/examples/SDL_image/main.cpp new file mode 100644 index 000000000..aa7fe5feb --- /dev/null +++ b/examples/SDL_image/main.cpp @@ -0,0 +1,77 @@ +// Using SDL2 to create an application window +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + SDL_Init(SDL_INIT_VIDEO); // Initialize SDL2 + + SDL_Window *window; // Declare a pointer to an SDL_Window + SDL_Renderer* renderer; + + // Create an application window with the following settings: + window = SDL_CreateWindow( + "An SDL2 window", // const char* title + SDL_WINDOWPOS_UNDEFINED, // int x: initial x position + SDL_WINDOWPOS_UNDEFINED, // int y: initial y position + 640, // int w: width, in pixels + 480, // int h: height, in pixels + SDL_WINDOW_SHOWN // Uint32 flags: window options, see docs + ); + + renderer = SDL_CreateRenderer(window, -1, 0); + + // Check that the window was successfully made + if(window==NULL) + { + // In the event that the window could not be made... + std::cout << "Could not create window: " << SDL_GetError() << '\n'; + SDL_Quit(); + return 1; + } + + assert(argc >= 2); + + SDL_Surface* surface = IMG_Load(argv[1]); + if(surface == NULL) + { + std::cout << "Could not load image: " << SDL_GetError() << '\n'; + SDL_Quit(); + return 1; + } + + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + + + bool done = false; + SDL_Event e; + + while(!done) + { + while(SDL_PollEvent(&e) != 0 ) + { + if( e.type == SDL_QUIT ) + done = true; + } + + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); + SDL_RenderClear(renderer); + + SDL_RenderCopy(renderer, texture, NULL, NULL); + + + SDL_RenderPresent(renderer); + } + + SDL_DestroyTexture(texture); + + // Close and destroy the window + SDL_DestroyWindow(window); + + // Clean up SDL2 and exit the program + SDL_Quit(); + return 0; +} diff --git a/examples/SDL_mixer/CMakeLists.txt b/examples/SDL_mixer/CMakeLists.txt new file mode 100644 index 000000000..14d4fed7b --- /dev/null +++ b/examples/SDL_mixer/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required (VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(SDL_mixer-test) + +hunter_add_package(SDL_mixer) +find_package(SDL_mixer CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main + SDL_mixer::SDL_mixer + SDL2::SDL2main) diff --git a/examples/SDL_mixer/main.cpp b/examples/SDL_mixer/main.cpp new file mode 100644 index 000000000..ccf1fb02c --- /dev/null +++ b/examples/SDL_mixer/main.cpp @@ -0,0 +1,237 @@ +/* + PLAYMUS: A test application for the SDL mixer library. + Copyright (C) 1997-2016 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* Quiet windows compiler warnings */ +#define _CRT_SECURE_NO_WARNINGS + +/* $Id$ */ + +#include +#include +#include + +#ifdef unix +#include +#endif + +#include "SDL.h" +#include "SDL_mixer.h" + +#ifdef HAVE_SIGNAL_H +#include +#endif + + +static int audio_open = 0; +static Mix_Music *music = NULL; +static int next_track = 0; + +void CleanUp(int exitcode) +{ + if( Mix_PlayingMusic() ) { + Mix_FadeOutMusic(1500); + SDL_Delay(1500); + } + if ( music ) { + Mix_FreeMusic(music); + music = NULL; + } + if ( audio_open ) { + Mix_CloseAudio(); + audio_open = 0; + } + SDL_Quit(); + exit(exitcode); +} + +void Usage(char *argv0) +{ + fprintf(stderr, "Usage: %s [-i] [-l] [-8] [-r rate] [-c channels] [-b buffers] [-v N] [-rwops] \n", argv0); +} + +void Menu(void) +{ + char buf[10]; + + printf("Available commands: (p)ause (r)esume (h)alt volume(v#) > "); + fflush(stdin); + if (scanf("%s",buf) == 1) { + switch(buf[0]){ + case 'p': case 'P': + Mix_PauseMusic(); + break; + case 'r': case 'R': + Mix_ResumeMusic(); + break; + case 'h': case 'H': + Mix_HaltMusic(); + break; + case 'v': case 'V': + Mix_VolumeMusic(atoi(buf+1)); + break; + } + } + printf("Music playing: %s Paused: %s\n", Mix_PlayingMusic() ? "yes" : "no", + Mix_PausedMusic() ? "yes" : "no"); +} + +#ifdef HAVE_SIGNAL_H + +void IntHandler(int sig) +{ + switch (sig) { + case SIGINT: + next_track++; + break; + } +} + +#endif + +int main(int argc, char *argv[]) +{ + int audio_rate; + Uint16 audio_format; + int audio_channels; + int audio_buffers; + int audio_volume = MIX_MAX_VOLUME; + int looping = 0; + int interactive = 0; + int rwops = 0; + int i; + + /* Initialize variables */ + audio_rate = 22050; + audio_format = AUDIO_S16; + audio_channels = 2; + audio_buffers = 4096; + + /* Check command line usage */ + for ( i=1; argv[i] && (*argv[i] == '-'); ++i ) { + if ( (strcmp(argv[i], "-r") == 0) && argv[i+1] ) { + ++i; + audio_rate = atoi(argv[i]); + } else + if ( strcmp(argv[i], "-m") == 0 ) { + audio_channels = 1; + } else + if ( (strcmp(argv[i], "-c") == 0) && argv[i+1] ) { + ++i; + audio_channels = atoi(argv[i]); + } else + if ( (strcmp(argv[i], "-b") == 0) && argv[i+1] ) { + ++i; + audio_buffers = atoi(argv[i]); + } else + if ( (strcmp(argv[i], "-v") == 0) && argv[i+1] ) { + ++i; + audio_volume = atoi(argv[i]); + } else + if ( strcmp(argv[i], "-l") == 0 ) { + looping = -1; + } else + if ( strcmp(argv[i], "-i") == 0 ) { + interactive = 1; + } else + if ( strcmp(argv[i], "-8") == 0 ) { + audio_format = AUDIO_U8; + } else + if ( strcmp(argv[i], "-rwops") == 0 ) { + rwops = 1; + } else { + Usage(argv[0]); + return(1); + } + } + if ( ! argv[i] ) { + Usage(argv[0]); + return(1); + } + + /* Initialize the SDL library */ + if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) { + fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); + return(255); + } + +#ifdef HAVE_SIGNAL_H + signal(SIGINT, IntHandler); + signal(SIGTERM, CleanUp); +#endif + + /* Open the audio device */ + if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) < 0) { + fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); + return(2); + } else { + Mix_QuerySpec(&audio_rate, &audio_format, &audio_channels); + printf("Opened audio at %d Hz %d bit %s (%s), %d bytes audio buffer\n", audio_rate, + (audio_format&0xFF), + (audio_channels > 2) ? "surround" : (audio_channels > 1) ? "stereo" : "mono", + (audio_format&0x1000) ? "BE" : "LE", + audio_buffers ); + } + audio_open = 1; + + /* Set the music volume */ + Mix_VolumeMusic(audio_volume); + + /* Set the external music player, if any */ + Mix_SetMusicCMD(SDL_getenv("MUSIC_CMD")); + + while (argv[i]) { + next_track = 0; + + /* Load the requested music file */ + if ( rwops ) { + music = Mix_LoadMUS_RW(SDL_RWFromFile(argv[i], "rb"), SDL_TRUE); + } else { + music = Mix_LoadMUS(argv[i]); + } + if ( music == NULL ) { + fprintf(stderr, "Couldn't load %s: %s\n", + argv[i], SDL_GetError()); + CleanUp(2); + } + + /* Play and then exit */ + printf("Playing %s\n", argv[i]); + Mix_FadeInMusic(music,looping,2000); + while ( !next_track && (Mix_PlayingMusic() || Mix_PausedMusic()) ) { + if(interactive) + Menu(); + else + SDL_Delay(100); + } + Mix_FreeMusic(music); + music = NULL; + + /* If the user presses Ctrl-C more than once, exit. */ + SDL_Delay(500); + if ( next_track > 1 ) break; + + i++; + } + CleanUp(0); + + /* Not reached, but fixes compiler warnings */ + return 0; +} diff --git a/examples/SDL_ttf/CMakeLists.txt b/examples/SDL_ttf/CMakeLists.txt new file mode 100644 index 000000000..ba013e8ea --- /dev/null +++ b/examples/SDL_ttf/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-SDL_ttf) + +hunter_add_package(SDL_ttf) +find_package(SDL_ttf CONFIG REQUIRED) + +add_executable(SDL_ttf main.cpp) +target_link_libraries(SDL_ttf SDL_ttf::SDL_ttf) diff --git a/examples/SDL_ttf/main.cpp b/examples/SDL_ttf/main.cpp new file mode 100644 index 000000000..690a8d09d --- /dev/null +++ b/examples/SDL_ttf/main.cpp @@ -0,0 +1,342 @@ +/* + showfont: An example of using the SDL_ttf library with 2D graphics. + Copyright (C) 2001-2016 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* A simple program to test the text rendering feature of the TTF library */ + +/* quiet windows compiler warnings */ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include + +#include +#include + +#define DEFAULT_PTSIZE 18 +#define DEFAULT_TEXT "The quick brown fox jumped over the lazy dog" +#define NUM_COLORS 256 +#define WIDTH 640 +#define HEIGHT 480 + +static char *Usage = + "Usage: %s [-solid] [-utf8|-unicode] [-b] [-i] [-u] [-s] [-outline size] [-hintlight|-hintmono|-hintnone] [-nokerning] [-fgcol r,g,b] [-bgcol r,g,b] .ttf [ptsize] [text]\n"; + +typedef struct { + SDL_Texture *caption; + SDL_Rect captionRect; + SDL_Texture *message; + SDL_Rect messageRect; +} Scene; + +static void draw_scene(SDL_Renderer *renderer, Scene *scene) +{ + /* Clear the background to background color */ + SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); + SDL_RenderClear(renderer); + + SDL_RenderCopy(renderer, scene->caption, NULL, &scene->captionRect); + SDL_RenderCopy(renderer, scene->message, NULL, &scene->messageRect); + SDL_RenderPresent(renderer); +} + +static void cleanup(int exitcode) +{ + TTF_Quit(); + SDL_Quit(); + exit(exitcode); +} + +int main(int argc, char *argv[]) +{ + char *argv0 = argv[0]; + SDL_Window *window; + SDL_Renderer *renderer; + TTF_Font *font; + SDL_Surface *text; + Scene scene; + int ptsize; + int i, done; + SDL_Color white = { 0xFF, 0xFF, 0xFF, 0 }; + SDL_Color black = { 0x00, 0x00, 0x00, 0 }; + SDL_Color *forecol; + SDL_Color *backcol; + SDL_Event event; + int rendersolid; + int renderstyle; + int outline; + int hinting; + int kerning; + int dump; + enum { + RENDER_LATIN1, + RENDER_UTF8, + RENDER_UNICODE + } rendertype; + char *message, string[128]; + + /* Look for special execution mode */ + dump = 0; + /* Look for special rendering types */ + rendersolid = 0; + renderstyle = TTF_STYLE_NORMAL; + rendertype = RENDER_LATIN1; + outline = 0; + hinting = TTF_HINTING_NORMAL; + kerning = 1; + /* Default is black and white */ + forecol = &black; + backcol = &white; + for ( i=1; argv[i] && argv[i][0] == '-'; ++i ) { + if ( strcmp(argv[i], "-solid") == 0 ) { + rendersolid = 1; + } else + if ( strcmp(argv[i], "-utf8") == 0 ) { + rendertype = RENDER_UTF8; + } else + if ( strcmp(argv[i], "-unicode") == 0 ) { + rendertype = RENDER_UNICODE; + } else + if ( strcmp(argv[i], "-b") == 0 ) { + renderstyle |= TTF_STYLE_BOLD; + } else + if ( strcmp(argv[i], "-i") == 0 ) { + renderstyle |= TTF_STYLE_ITALIC; + } else + if ( strcmp(argv[i], "-u") == 0 ) { + renderstyle |= TTF_STYLE_UNDERLINE; + } else + if ( strcmp(argv[i], "-s") == 0 ) { + renderstyle |= TTF_STYLE_STRIKETHROUGH; + } else + if ( strcmp(argv[i], "-outline") == 0 ) { + if ( sscanf (argv[++i], "%d", &outline) != 1 ) { + fprintf(stderr, Usage, argv0); + return(1); + } + } else + if ( strcmp(argv[i], "-hintlight") == 0 ) { + hinting = TTF_HINTING_LIGHT; + } else + if ( strcmp(argv[i], "-hintmono") == 0 ) { + hinting = TTF_HINTING_MONO; + } else + if ( strcmp(argv[i], "-hintnone") == 0 ) { + hinting = TTF_HINTING_NONE; + } else + if ( strcmp(argv[i], "-nokerning") == 0 ) { + kerning = 0; + } else + if ( strcmp(argv[i], "-dump") == 0 ) { + dump = 1; + } else + if ( strcmp(argv[i], "-fgcol") == 0 ) { + int r, g, b; + if ( sscanf (argv[++i], "%d,%d,%d", &r, &g, &b) != 3 ) { + fprintf(stderr, Usage, argv0); + return(1); + } + forecol->r = (Uint8)r; + forecol->g = (Uint8)g; + forecol->b = (Uint8)b; + } else + if ( strcmp(argv[i], "-bgcol") == 0 ) { + int r, g, b; + if ( sscanf (argv[++i], "%d,%d,%d", &r, &g, &b) != 3 ) { + fprintf(stderr, Usage, argv0); + return(1); + } + backcol->r = (Uint8)r; + backcol->g = (Uint8)g; + backcol->b = (Uint8)b; + } else { + fprintf(stderr, Usage, argv0); + return(1); + } + } + argv += i; + argc -= i; + + /* Check usage */ + if ( ! argv[0] ) { + fprintf(stderr, Usage, argv0); + return(1); + } + + /* Initialize the TTF library */ + if ( TTF_Init() < 0 ) { + fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError()); + SDL_Quit(); + return(2); + } + + /* Open the font file with the requested point size */ + ptsize = 0; + if ( argc > 1 ) { + ptsize = atoi(argv[1]); + } + if ( ptsize == 0 ) { + i = 2; + ptsize = DEFAULT_PTSIZE; + } else { + i = 3; + } + font = TTF_OpenFont(argv[0], ptsize); + if ( font == NULL ) { + fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", + ptsize, argv[0], SDL_GetError()); + cleanup(2); + } + TTF_SetFontStyle(font, renderstyle); + TTF_SetFontOutline(font, outline); + TTF_SetFontKerning(font, kerning); + TTF_SetFontHinting(font, hinting); + + if( dump ) { + for( i = 48; i < 123; i++ ) { + SDL_Surface* glyph = NULL; + + glyph = TTF_RenderGlyph_Shaded( font, i, *forecol, *backcol ); + + if( glyph ) { + char outname[64]; + sprintf( outname, "glyph-%d.bmp", i ); + SDL_SaveBMP( glyph, outname ); + } + + } + cleanup(0); + } + + /* Create a window */ + if (SDL_CreateWindowAndRenderer(WIDTH, HEIGHT, 0, &window, &renderer) < 0) { + fprintf(stderr, "SDL_CreateWindowAndRenderer() failed: %s\n", SDL_GetError()); + cleanup(2); + } + + /* Show which font file we're looking at */ + sprintf(string, "Font file: %s", argv[0]); /* possible overflow */ + if ( rendersolid ) { + text = TTF_RenderText_Solid(font, string, *forecol); + } else { + text = TTF_RenderText_Shaded(font, string, *forecol, *backcol); + } + if ( text != NULL ) { + scene.captionRect.x = 4; + scene.captionRect.y = 4; + scene.captionRect.w = text->w; + scene.captionRect.h = text->h; + scene.caption = SDL_CreateTextureFromSurface(renderer, text); + SDL_FreeSurface(text); + } + + /* Render and center the message */ + if ( argc > 2 ) { + message = argv[2]; + } else { + message = DEFAULT_TEXT; + } + switch (rendertype) { + case RENDER_LATIN1: + if ( rendersolid ) { + text = TTF_RenderText_Solid(font,message,*forecol); + } else { + text = TTF_RenderText_Shaded(font,message,*forecol,*backcol); + } + break; + + case RENDER_UTF8: + if ( rendersolid ) { + text = TTF_RenderUTF8_Solid(font,message,*forecol); + } else { + text = TTF_RenderUTF8_Shaded(font,message,*forecol,*backcol); + } + break; + + case RENDER_UNICODE: + { + Uint16 *unicode_text = SDL_iconv_utf8_ucs2(message); + if ( rendersolid ) { + text = TTF_RenderUNICODE_Solid(font, + unicode_text, *forecol); + } else { + text = TTF_RenderUNICODE_Shaded(font, + unicode_text, *forecol, *backcol); + } + SDL_free(unicode_text); + } + break; + default: + text = NULL; /* This shouldn't happen */ + break; + } + if ( text == NULL ) { + fprintf(stderr, "Couldn't render text: %s\n", SDL_GetError()); + TTF_CloseFont(font); + cleanup(2); + } + scene.messageRect.x = (WIDTH - text->w)/2; + scene.messageRect.y = (HEIGHT - text->h)/2; + scene.messageRect.w = text->w; + scene.messageRect.h = text->h; + scene.message = SDL_CreateTextureFromSurface(renderer, text); + printf("Font is generally %d big, and string is %d big\n", + TTF_FontHeight(font), text->h); + + draw_scene(renderer, &scene); + + /* Wait for a keystroke, and blit text on mouse press */ + done = 0; + while ( ! done ) { + if ( SDL_WaitEvent(&event) < 0 ) { + fprintf(stderr, "SDL_PullEvent() error: %s\n", + SDL_GetError()); + done = 1; + continue; + } + switch (event.type) { + case SDL_MOUSEBUTTONDOWN: + scene.messageRect.x = event.button.x - text->w/2; + scene.messageRect.y = event.button.y - text->h/2; + scene.messageRect.w = text->w; + scene.messageRect.h = text->h; + draw_scene(renderer, &scene); + break; + + case SDL_KEYDOWN: + case SDL_QUIT: + done = 1; + break; + default: + break; + } + } + SDL_FreeSurface(text); + TTF_CloseFont(font); + SDL_DestroyTexture(scene.caption); + SDL_DestroyTexture(scene.message); + cleanup(0); + + /* Not reached, but fixes compiler warnings */ + return 0; +} + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/examples/SimpleSignal/CMakeLists.txt b/examples/SimpleSignal/CMakeLists.txt new file mode 100644 index 000000000..e8e7873d4 --- /dev/null +++ b/examples/SimpleSignal/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-SimpleSignal) + +# DOCUMENTATION_START { +hunter_add_package(SimpleSignal) +find_package(SimpleSignal CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC SimpleSignal::SimpleSignal) +# DOCUMENTATION_END } diff --git a/examples/SimpleSignal/boo.cpp b/examples/SimpleSignal/boo.cpp new file mode 100644 index 000000000..2d4cd1f27 --- /dev/null +++ b/examples/SimpleSignal/boo.cpp @@ -0,0 +1,41 @@ +#include + +#include +#include +#include +#include +#include +#include + +#ifndef _MSC_VER +#include +#include +static std::string string_printf (const char *format, ...) __attribute__ ((__format__ (__printf__, 1, 2))); +#endif + +static std::string accu; + +static std::string string_printf (const char *format, ...) +{ + std::string result; + char str[1000]; + va_list args; + va_start (args, format); + if (vsnprintf (str, sizeof str, format, args) >= 0) + result = str; + va_end (args); + return result; +} + +static char float_callback (float f, int, std::string) +{ + accu += string_printf ("float: %.2f\n", f); + return 0; +} + +int main() { + Simple::Signal sig1; + size_t id1 = sig1.connect(float_callback); + sig1.emit (.3f, 4, "huhu"); + sig1.disconnect(id1); +} diff --git a/examples/Snappy/CMakeLists.txt b/examples/Snappy/CMakeLists.txt new file mode 100644 index 000000000..9c28c34b0 --- /dev/null +++ b/examples/Snappy/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-snappy) + +# DOCUMENTATION_START { +hunter_add_package(Snappy) +find_package(Snappy CONFIG REQUIRED) + +add_executable(snappy_compress_test main.cpp) +target_link_libraries(snappy_compress_test Snappy::snappy) +# DOCUMENTATION_END } + diff --git a/examples/Snappy/main.cpp b/examples/Snappy/main.cpp new file mode 100644 index 000000000..97e33b505 --- /dev/null +++ b/examples/Snappy/main.cpp @@ -0,0 +1,15 @@ +#include + +int main() +{ + const char input[] = "Hunter is great!"; + std::string output; + size_t size = snappy::Compress(input, sizeof(input), &output); + if (size == 0) + return 2; + + if (!snappy::IsValidCompressedBuffer(output.data(), output.size())) + return 1; + + return 0; +} diff --git a/examples/Sqlpp11/CMakeLists.txt b/examples/Sqlpp11/CMakeLists.txt new file mode 100644 index 000000000..c7c2f28a7 --- /dev/null +++ b/examples/Sqlpp11/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-sqlpp11) + +# DOCUMENTATION_START { +hunter_add_package(Sqlpp11) +find_package(Sqlpp11 CONFIG REQUIRED) + +add_executable(example example.cpp) +target_link_libraries(example sqlpp11) +# DOCUMENTATION_END } + diff --git a/examples/Sqlpp11/example.cpp b/examples/Sqlpp11/example.cpp new file mode 100644 index 000000000..87657bf7f --- /dev/null +++ b/examples/Sqlpp11/example.cpp @@ -0,0 +1,7 @@ +#include + +int main(int argc, char** argv) { + auto x = sqlpp::cte(sqlpp::alias::x); + + return 0; +} diff --git a/examples/SuiteSparse-dynLAPACK/CMakeLists.txt b/examples/SuiteSparse-dynLAPACK/CMakeLists.txt new file mode 100644 index 000000000..16e054453 --- /dev/null +++ b/examples/SuiteSparse-dynLAPACK/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-SuiteSparse) + +hunter_add_package(SuiteSparse) + +string(COMPARE EQUAL "${SuiteSparse_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Licenses not found") +endif() + +message("SuiteSparse licenses:") +foreach(x ${SuiteSparse_LICENSES}) + message("* ${x}") + if(NOT EXISTS "${SuiteSparse_LICENSES}") + message(FATAL_ERROR "File not found") + endif() +endforeach() + +find_package(SuiteSparse CONFIG REQUIRED) + +# Test double library creation +find_package(SuiteSparse CONFIG REQUIRED) + +# Create executable +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE SuiteSparse::cholmod) diff --git a/examples/SuiteSparse-dynLAPACK/config.cmake b/examples/SuiteSparse-dynLAPACK/config.cmake new file mode 100644 index 000000000..7880662d5 --- /dev/null +++ b/examples/SuiteSparse-dynLAPACK/config.cmake @@ -0,0 +1,4 @@ +hunter_config(LAPACK + VERSION ${HUNTER_LAPACK_VERSION} + CMAKE_ARGS BUILD_SHARED_LIBS=ON +) diff --git a/examples/SuiteSparse-dynLAPACK/foo.cpp b/examples/SuiteSparse-dynLAPACK/foo.cpp new file mode 100644 index 000000000..d09d1ba34 --- /dev/null +++ b/examples/SuiteSparse-dynLAPACK/foo.cpp @@ -0,0 +1,13 @@ +#include // std::cout +#include + +int main() { + // define variable + cholmod_dense *A; + + cholmod_common c ; + cholmod_start(&c) ; // start CHOLMOD + A = cholmod_ones(3, 3, CHOLMOD_REAL, &c) ; // A = ones(3,3) + std::cout << "norm(A): " << cholmod_norm_dense(A, 0, &c) << std::endl; + cholmod_finish (&c) ; // finish CHOLMOD +} diff --git a/examples/SuiteSparse/CMakeLists.txt b/examples/SuiteSparse/CMakeLists.txt new file mode 100644 index 000000000..2ccd027ad --- /dev/null +++ b/examples/SuiteSparse/CMakeLists.txt @@ -0,0 +1,34 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-SuiteSparse) + +hunter_add_package(SuiteSparse) + +string(COMPARE EQUAL "${SuiteSparse_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Licenses not found") +endif() + +message("SuiteSparse licenses:") +foreach(x ${SuiteSparse_LICENSES}) + message("* ${x}") + if(NOT EXISTS "${SuiteSparse_LICENSES}") + message(FATAL_ERROR "File not found") + endif() +endforeach() + +find_package(SuiteSparse CONFIG REQUIRED) + +# Test double library creation +find_package(SuiteSparse CONFIG REQUIRED) + +# Create executable +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE SuiteSparse::cholmod) diff --git a/examples/SuiteSparse/foo.cpp b/examples/SuiteSparse/foo.cpp new file mode 100644 index 000000000..d09d1ba34 --- /dev/null +++ b/examples/SuiteSparse/foo.cpp @@ -0,0 +1,13 @@ +#include // std::cout +#include + +int main() { + // define variable + cholmod_dense *A; + + cholmod_common c ; + cholmod_start(&c) ; // start CHOLMOD + A = cholmod_ones(3, 3, CHOLMOD_REAL, &c) ; // A = ones(3,3) + std::cout << "norm(A): " << cholmod_norm_dense(A, 0, &c) << std::endl; + cholmod_finish (&c) ; // finish CHOLMOD +} diff --git a/examples/TCLAP/CMakeLists.txt b/examples/TCLAP/CMakeLists.txt new file mode 100644 index 000000000..be3940b73 --- /dev/null +++ b/examples/TCLAP/CMakeLists.txt @@ -0,0 +1,20 @@ + +# by Cyberunner23 +# for the Hunter project + +cmake_minimum_required(VERSION 3.0) + +variable_watch(HUNTER_TCLAP_VERSION) + +include("../common.cmake") + +project(example-TCLAP) + +# DOCUMENTATION_START { +hunter_add_package(TCLAP) +find_package(TCLAP CONFIG REQUIRED) + +add_executable(foo main.cpp) +target_link_libraries(foo TCLAP::TCLAP) +# DOCUMENTATION_END } + diff --git a/examples/TCLAP/main.cpp b/examples/TCLAP/main.cpp new file mode 100644 index 000000000..bdf956539 --- /dev/null +++ b/examples/TCLAP/main.cpp @@ -0,0 +1,9 @@ + +//Complete example at "http://tclap.sourceforge.net/manual.html#BASIC_USAGE" + +#include "tclap/CmdLine.h" + +int main(int argc, char** argv) +{ + TCLAP::CmdLine cmd("Command description message", ' ', "0.9"); +} diff --git a/examples/Tesseract/CMakeLists.txt b/examples/Tesseract/CMakeLists.txt new file mode 100644 index 000000000..a34645ab2 --- /dev/null +++ b/examples/Tesseract/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2017, Sacha Refshauge +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Tesseract) + +# DOCUMENTATION_START { +hunter_add_package(Tesseract) +find_package(Tesseract CONFIG REQUIRED) + +add_executable(example example.cpp) +target_link_libraries(example Tesseract::libtesseract) +# DOCUMENTATION_END } diff --git a/examples/Tesseract/example.cpp b/examples/Tesseract/example.cpp new file mode 100644 index 000000000..8afc7a981 --- /dev/null +++ b/examples/Tesseract/example.cpp @@ -0,0 +1,10 @@ +#include +#include + +int main() +{ + tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI(); + api->End(); + + return 0; +} diff --git a/examples/Urho3D/CMakeLists.txt b/examples/Urho3D/CMakeLists.txt new file mode 100644 index 000000000..e739cc4e4 --- /dev/null +++ b/examples/Urho3D/CMakeLists.txt @@ -0,0 +1,43 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-Urho3D) + +hunter_add_package(Urho3D) +find_package(Urho3D CONFIG REQUIRED) + +set( + sources + Mover.cpp + Mover.h + SkeletalAnimation.cpp + SkeletalAnimation.h +) +if(ANDROID) + list(APPEND sources "${URHO3D_ROOT}/include/SDL2/android/SDL_android_main.c") +endif() + +if(ANDROID) + add_library(SkeletalAnimation SHARED ${sources}) +else() + add_executable(SkeletalAnimation WIN32 ${sources}) +endif() + +target_link_libraries(SkeletalAnimation PUBLIC Urho3D::Urho3D) + +if(WIN32) + set(resources "${URHO3D_ROOT}/share/Resources") +else() + set(resources "${URHO3D_ROOT}/share/Urho3D/Resources") +endif() + +enable_testing() +add_test(NAME SkeletalAnimation COMMAND SkeletalAnimation -pp "${resources}") diff --git a/examples/Urho3D/Mover.cpp b/examples/Urho3D/Mover.cpp new file mode 100644 index 000000000..7ff4b1e49 --- /dev/null +++ b/examples/Urho3D/Mover.cpp @@ -0,0 +1,64 @@ +// +// Copyright (c) 2008-2016 the Urho3D project. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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. +// + +#include +#include +#include + +#include "Mover.h" + +#include + +Mover::Mover(Context* context) : + LogicComponent(context), + moveSpeed_(0.0f), + rotationSpeed_(0.0f) +{ + // Only the scene update event is needed: unsubscribe from the rest for optimization + SetUpdateEventMask(USE_UPDATE); +} + +void Mover::SetParameters(float moveSpeed, float rotationSpeed, const BoundingBox& bounds) +{ + moveSpeed_ = moveSpeed; + rotationSpeed_ = rotationSpeed; + bounds_ = bounds; +} + +void Mover::Update(float timeStep) +{ + node_->Translate(Vector3::FORWARD * moveSpeed_ * timeStep); + + // If in risk of going outside the plane, rotate the model right + Vector3 pos = node_->GetPosition(); + if (pos.x_ < bounds_.min_.x_ || pos.x_ > bounds_.max_.x_ || pos.z_ < bounds_.min_.z_ || pos.z_ > bounds_.max_.z_) + node_->Yaw(rotationSpeed_ * timeStep); + + // Get the model's first (only) animation state and advance its time. Note the convenience accessor to other components + // in the same scene node + AnimatedModel* model = GetComponent(); + if (model->GetNumAnimationStates()) + { + AnimationState* state = model->GetAnimationStates()[0]; + state->AddTime(timeStep); + } +} diff --git a/examples/Urho3D/Mover.h b/examples/Urho3D/Mover.h new file mode 100644 index 000000000..42760092c --- /dev/null +++ b/examples/Urho3D/Mover.h @@ -0,0 +1,57 @@ +// +// Copyright (c) 2008-2016 the Urho3D project. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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. +// + +#pragma once + +#include + +using namespace Urho3D; + +/// Custom logic component for moving the animated model and rotating at area edges. +class Mover : public LogicComponent +{ + URHO3D_OBJECT(Mover, LogicComponent); + +public: + /// Construct. + Mover(Context* context); + + /// Set motion parameters: forward movement speed, rotation speed, and movement boundaries. + void SetParameters(float moveSpeed, float rotateSpeed, const BoundingBox& bounds); + /// Handle scene update. Called by LogicComponent base class. + virtual void Update(float timeStep); + + /// Return forward movement speed. + float GetMoveSpeed() const { return moveSpeed_; } + /// Return rotation speed. + float GetRotationSpeed() const { return rotationSpeed_; } + /// Return movement boundaries. + const BoundingBox& GetBounds() const { return bounds_; } + +private: + /// Forward movement speed. + float moveSpeed_; + /// Rotation speed. + float rotationSpeed_; + /// Movement boundaries. + BoundingBox bounds_; +}; diff --git a/examples/Urho3D/Sample.h b/examples/Urho3D/Sample.h new file mode 100644 index 000000000..942631829 --- /dev/null +++ b/examples/Urho3D/Sample.h @@ -0,0 +1,121 @@ +// +// Copyright (c) 2008-2016 the Urho3D project. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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. +// + +#pragma once + +#include +#include + +namespace Urho3D +{ + +class Node; +class Scene; +class Sprite; + +} + +// All Urho3D classes reside in namespace Urho3D +using namespace Urho3D; + +const float TOUCH_SENSITIVITY = 2.0f; + +/// Sample class, as framework for all samples. +/// - Initialization of the Urho3D engine (in Application class) +/// - Modify engine parameters for windowed mode and to show the class name as title +/// - Create Urho3D logo at screen +/// - Set custom window title and icon +/// - Create Console and Debug HUD, and use F1 and F2 key to toggle them +/// - Toggle rendering options from the keys 1-8 +/// - Take screenshot with key 9 +/// - Handle Esc key down to hide Console or exit application +/// - Init touch input on mobile platform using screen joysticks (patched for each individual sample) +class Sample : public Application +{ + // Enable type information. + URHO3D_OBJECT(Sample, Application); + +public: + /// Construct. + Sample(Context* context); + + /// Setup before engine initialization. Modifies the engine parameters. + virtual void Setup(); + /// Setup after engine initialization. Creates the logo, console & debug HUD. + virtual void Start(); + /// Cleanup after the main loop. Called by Application. + virtual void Stop(); + +protected: + /// Return XML patch instructions for screen joystick layout for a specific sample app, if any. + virtual String GetScreenJoystickPatchString() const { return String::EMPTY; } + /// Initialize touch input on mobile platform. + void InitTouchInput(); + /// Initialize mouse mode on non-web platform. + void InitMouseMode(MouseMode mode); + /// Control logo visibility. + void SetLogoVisible(bool enable); + + /// Logo sprite. + SharedPtr logoSprite_; + /// Scene. + SharedPtr scene_; + /// Camera scene node. + SharedPtr cameraNode_; + /// Camera yaw angle. + float yaw_; + /// Camera pitch angle. + float pitch_; + /// Flag to indicate whether touch input has been enabled. + bool touchEnabled_; + /// Mouse mode option to use in the sample. + MouseMode useMouseMode_; + +private: + /// Create logo. + void CreateLogo(); + /// Set custom window Title & Icon + void SetWindowTitleAndIcon(); + /// Create console and debug HUD. + void CreateConsoleAndDebugHud(); + /// Handle request for mouse mode on web platform. + void HandleMouseModeRequest(StringHash eventType, VariantMap& eventData); + /// Handle request for mouse mode change on web platform. + void HandleMouseModeChange(StringHash eventType, VariantMap& eventData); + /// Handle key down event to process key controls common to all samples. + void HandleKeyDown(StringHash eventType, VariantMap& eventData); + /// Handle key up event to process key controls common to all samples. + void HandleKeyUp(StringHash eventType, VariantMap& eventData); + /// Handle scene update event to control camera's pitch and yaw for all samples. + void HandleSceneUpdate(StringHash eventType, VariantMap& eventData); + /// Handle touch begin event to initialize touch input on desktop platform. + void HandleTouchBegin(StringHash eventType, VariantMap& eventData); + + /// Screen joystick index for navigational controls (mobile platforms only). + unsigned screenJoystickIndex_; + /// Screen joystick index for settings (mobile platforms only). + unsigned screenJoystickSettingsIndex_; + /// Pause flag. + bool paused_; +}; + +#include "Sample.inl" diff --git a/examples/Urho3D/Sample.inl b/examples/Urho3D/Sample.inl new file mode 100644 index 000000000..3ef9e1cbf --- /dev/null +++ b/examples/Urho3D/Sample.inl @@ -0,0 +1,428 @@ +// +// Copyright (c) 2008-2016 the Urho3D project. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Sample::Sample(Context* context) : + Application(context), + yaw_(0.0f), + pitch_(0.0f), + touchEnabled_(false), + screenJoystickIndex_(M_MAX_UNSIGNED), + screenJoystickSettingsIndex_(M_MAX_UNSIGNED), + paused_(false), + useMouseMode_(MM_ABSOLUTE) +{ +} + +void Sample::Setup() +{ + // Modify engine startup parameters + engineParameters_["WindowTitle"] = GetTypeName(); + engineParameters_["LogName"] = GetSubsystem()->GetAppPreferencesDir("urho3d", "logs") + GetTypeName() + ".log"; + engineParameters_["FullScreen"] = false; + engineParameters_["Headless"] = false; + engineParameters_["Sound"] = false; + + // Construct a search path to find the resource prefix with two entries: + // The first entry is an empty path which will be substituted with program/bin directory -- this entry is for binary when it is still in build tree + // The second and third entries are possible relative paths from the installed program/bin directory to the asset directory -- these entries are for binary when it is in the Urho3D SDK installation location + if (!engineParameters_.Contains("ResourcePrefixPaths")) + engineParameters_["ResourcePrefixPaths"] = ";../share/Resources;../share/Urho3D/Resources"; +} + +void Sample::Start() +{ + if (GetPlatform() == "Android" || GetPlatform() == "iOS") + // On mobile platform, enable touch by adding a screen joystick + InitTouchInput(); + else if (GetSubsystem()->GetNumJoysticks() == 0) + // On desktop platform, do not detect touch when we already got a joystick + SubscribeToEvent(E_TOUCHBEGIN, URHO3D_HANDLER(Sample, HandleTouchBegin)); + + // Create logo + CreateLogo(); + + // Set custom window Title & Icon + SetWindowTitleAndIcon(); + + // Create console and debug HUD + CreateConsoleAndDebugHud(); + + // Subscribe key down event + SubscribeToEvent(E_KEYDOWN, URHO3D_HANDLER(Sample, HandleKeyDown)); + // Subscribe key up event + SubscribeToEvent(E_KEYUP, URHO3D_HANDLER(Sample, HandleKeyUp)); + // Subscribe scene update event + SubscribeToEvent(E_SCENEUPDATE, URHO3D_HANDLER(Sample, HandleSceneUpdate)); +} + +void Sample::Stop() +{ + engine_->DumpResources(true); +} + +void Sample::InitTouchInput() +{ + touchEnabled_ = true; + + ResourceCache* cache = GetSubsystem(); + Input* input = GetSubsystem(); + XMLFile* layout = cache->GetResource("UI/ScreenJoystick_Samples.xml"); + const String& patchString = GetScreenJoystickPatchString(); + if (!patchString.Empty()) + { + // Patch the screen joystick layout further on demand + SharedPtr patchFile(new XMLFile(context_)); + if (patchFile->FromString(patchString)) + layout->Patch(patchFile); + } + screenJoystickIndex_ = input->AddScreenJoystick(layout, cache->GetResource("UI/DefaultStyle.xml")); + input->SetScreenJoystickVisible(screenJoystickSettingsIndex_, true); +} + +void Sample::InitMouseMode(MouseMode mode) +{ + useMouseMode_ = mode; + + Input* input = GetSubsystem(); + + if (GetPlatform() != "Web") + { + if (useMouseMode_ == MM_FREE) + input->SetMouseVisible(true); + + Console* console = GetSubsystem(); + if (useMouseMode_ != MM_ABSOLUTE) + { + input->SetMouseMode(useMouseMode_); + if (console && console->IsVisible()) + input->SetMouseMode(MM_ABSOLUTE, true); + } + } + else + { + input->SetMouseVisible(true); + SubscribeToEvent(E_MOUSEBUTTONDOWN, URHO3D_HANDLER(Sample, HandleMouseModeRequest)); + SubscribeToEvent(E_MOUSEMODECHANGED, URHO3D_HANDLER(Sample, HandleMouseModeChange)); + } +} + +void Sample::SetLogoVisible(bool enable) +{ + if (logoSprite_) + logoSprite_->SetVisible(enable); +} + +void Sample::CreateLogo() +{ + // Get logo texture + ResourceCache* cache = GetSubsystem(); + Texture2D* logoTexture = cache->GetResource("Textures/LogoLarge.png"); + if (!logoTexture) + return; + + // Create logo sprite and add to the UI layout + UI* ui = GetSubsystem(); + logoSprite_ = ui->GetRoot()->CreateChild(); + + // Set logo sprite texture + logoSprite_->SetTexture(logoTexture); + + int textureWidth = logoTexture->GetWidth(); + int textureHeight = logoTexture->GetHeight(); + + // Set logo sprite scale + logoSprite_->SetScale(256.0f / textureWidth); + + // Set logo sprite size + logoSprite_->SetSize(textureWidth, textureHeight); + + // Set logo sprite hot spot + logoSprite_->SetHotSpot(0, textureHeight); + + // Set logo sprite alignment + logoSprite_->SetAlignment(HA_LEFT, VA_BOTTOM); + + // Make logo not fully opaque to show the scene underneath + logoSprite_->SetOpacity(0.75f); + + // Set a low priority for the logo so that other UI elements can be drawn on top + logoSprite_->SetPriority(-100); +} + +void Sample::SetWindowTitleAndIcon() +{ + ResourceCache* cache = GetSubsystem(); + Graphics* graphics = GetSubsystem(); + Image* icon = cache->GetResource("Textures/UrhoIcon.png"); + graphics->SetWindowIcon(icon); + graphics->SetWindowTitle("Urho3D Sample"); +} + +void Sample::CreateConsoleAndDebugHud() +{ + // Get default style + ResourceCache* cache = GetSubsystem(); + XMLFile* xmlFile = cache->GetResource("UI/DefaultStyle.xml"); + + // Create console + Console* console = engine_->CreateConsole(); + console->SetDefaultStyle(xmlFile); + console->GetBackground()->SetOpacity(0.8f); + + // Create debug HUD. + DebugHud* debugHud = engine_->CreateDebugHud(); + debugHud->SetDefaultStyle(xmlFile); +} + + +void Sample::HandleKeyUp(StringHash eventType, VariantMap& eventData) +{ + using namespace KeyUp; + + int key = eventData[P_KEY].GetInt(); + + // Close console (if open) or exit when ESC is pressed + if (key == KEY_ESC) + { + Console* console = GetSubsystem(); + if (console->IsVisible()) + console->SetVisible(false); + else + { + if (GetPlatform() == "Web") + { + GetSubsystem()->SetMouseVisible(true); + if (useMouseMode_ != MM_ABSOLUTE) + GetSubsystem()->SetMouseMode(MM_FREE); + } + else + engine_->Exit(); + } + } +} + +void Sample::HandleKeyDown(StringHash eventType, VariantMap& eventData) +{ + using namespace KeyDown; + + int key = eventData[P_KEY].GetInt(); + + // Toggle console with F1 or Z + if (key == KEY_F1 || key == 'Z') + GetSubsystem()->Toggle(); + + // Toggle debug HUD with F2 + else if (key == KEY_F2) + { + DebugHud* debugHud = GetSubsystem(); + if (debugHud->GetMode() == 0 || debugHud->GetMode() == DEBUGHUD_SHOW_ALL_MEMORY) + debugHud->SetMode(DEBUGHUD_SHOW_ALL); + else + debugHud->SetMode(DEBUGHUD_SHOW_NONE); + } + else if (key == KEY_F3) + { + DebugHud* debugHud = GetSubsystem(); + if (debugHud->GetMode() == 0 || debugHud->GetMode() == DEBUGHUD_SHOW_ALL) + debugHud->SetMode(DEBUGHUD_SHOW_ALL_MEMORY); + else + debugHud->SetMode(DEBUGHUD_SHOW_NONE); + } + + // Common rendering quality controls, only when UI has no focused element + else if (!GetSubsystem()->GetFocusElement()) + { + Renderer* renderer = GetSubsystem(); + + // Preferences / Pause + if (key == KEY_SELECT && touchEnabled_) + { + paused_ = !paused_; + + Input* input = GetSubsystem(); + if (screenJoystickSettingsIndex_ == M_MAX_UNSIGNED) + { + // Lazy initialization + ResourceCache* cache = GetSubsystem(); + screenJoystickSettingsIndex_ = input->AddScreenJoystick(cache->GetResource("UI/ScreenJoystickSettings_Samples.xml"), cache->GetResource("UI/DefaultStyle.xml")); + } + else + input->SetScreenJoystickVisible(screenJoystickSettingsIndex_, paused_); + } + + // Texture quality + else if (key == '1') + { + int quality = renderer->GetTextureQuality(); + ++quality; + if (quality > QUALITY_HIGH) + quality = QUALITY_LOW; + renderer->SetTextureQuality(quality); + } + + // Material quality + else if (key == '2') + { + int quality = renderer->GetMaterialQuality(); + ++quality; + if (quality > QUALITY_HIGH) + quality = QUALITY_LOW; + renderer->SetMaterialQuality(quality); + } + + // Specular lighting + else if (key == '3') + renderer->SetSpecularLighting(!renderer->GetSpecularLighting()); + + // Shadow rendering + else if (key == '4') + renderer->SetDrawShadows(!renderer->GetDrawShadows()); + + // Shadow map resolution + else if (key == '5') + { + int shadowMapSize = renderer->GetShadowMapSize(); + shadowMapSize *= 2; + if (shadowMapSize > 2048) + shadowMapSize = 512; + renderer->SetShadowMapSize(shadowMapSize); + } + + // Shadow depth and filtering quality + else if (key == '6') + { + ShadowQuality quality = renderer->GetShadowQuality(); + quality = (ShadowQuality)(quality + 1); + if (quality > SHADOWQUALITY_BLUR_VSM) + quality = SHADOWQUALITY_SIMPLE_16BIT; + renderer->SetShadowQuality(quality); + } + + // Occlusion culling + else if (key == '7') + { + bool occlusion = renderer->GetMaxOccluderTriangles() > 0; + occlusion = !occlusion; + renderer->SetMaxOccluderTriangles(occlusion ? 5000 : 0); + } + + // Instancing + else if (key == '8') + renderer->SetDynamicInstancing(!renderer->GetDynamicInstancing()); + + // Take screenshot + else if (key == '9') + { + Graphics* graphics = GetSubsystem(); + Image screenshot(context_); + graphics->TakeScreenShot(screenshot); + // Here we save in the Data folder with date and time appended + screenshot.SavePNG(GetSubsystem()->GetProgramDir() + "Data/Screenshot_" + + Time::GetTimeStamp().Replaced(':', '_').Replaced('.', '_').Replaced(' ', '_') + ".png"); + } + } +} + +void Sample::HandleSceneUpdate(StringHash eventType, VariantMap& eventData) +{ + // Move the camera by touch, if the camera node is initialized by descendant sample class + if (touchEnabled_ && cameraNode_) + { + Input* input = GetSubsystem(); + for (unsigned i = 0; i < input->GetNumTouches(); ++i) + { + TouchState* state = input->GetTouch(i); + if (!state->touchedElement_) // Touch on empty space + { + if (state->delta_.x_ ||state->delta_.y_) + { + Camera* camera = cameraNode_->GetComponent(); + if (!camera) + return; + + Graphics* graphics = GetSubsystem(); + yaw_ += TOUCH_SENSITIVITY * camera->GetFov() / graphics->GetHeight() * state->delta_.x_; + pitch_ += TOUCH_SENSITIVITY * camera->GetFov() / graphics->GetHeight() * state->delta_.y_; + + // Construct new orientation for the camera scene node from yaw and pitch; roll is fixed to zero + cameraNode_->SetRotation(Quaternion(pitch_, yaw_, 0.0f)); + } + else + { + // Move the cursor to the touch position + Cursor* cursor = GetSubsystem()->GetCursor(); + if (cursor && cursor->IsVisible()) + cursor->SetPosition(state->position_); + } + } + } + } +} + +void Sample::HandleTouchBegin(StringHash eventType, VariantMap& eventData) +{ + // On some platforms like Windows the presence of touch input can only be detected dynamically + InitTouchInput(); + UnsubscribeFromEvent("TouchBegin"); +} + +// If the user clicks the canvas, attempt to switch to relative mouse mode on web platform +void Sample::HandleMouseModeRequest(StringHash eventType, VariantMap& eventData) +{ + Console* console = GetSubsystem(); + if (console && console->IsVisible()) + return; + Input* input = GetSubsystem(); + if (useMouseMode_ == MM_ABSOLUTE) + input->SetMouseVisible(false); + else if (useMouseMode_ == MM_FREE) + input->SetMouseVisible(true); + input->SetMouseMode(useMouseMode_); +} + +void Sample::HandleMouseModeChange(StringHash eventType, VariantMap& eventData) +{ + Input* input = GetSubsystem(); + bool mouseLocked = eventData[MouseModeChanged::P_MOUSELOCKED].GetBool(); + input->SetMouseVisible(!mouseLocked); +} diff --git a/examples/Urho3D/SkeletalAnimation.cpp b/examples/Urho3D/SkeletalAnimation.cpp new file mode 100644 index 000000000..dd709e9e5 --- /dev/null +++ b/examples/Urho3D/SkeletalAnimation.cpp @@ -0,0 +1,256 @@ +// +// Copyright (c) 2008-2016 the Urho3D project. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Mover.h" +#include "SkeletalAnimation.h" + +#include + +URHO3D_DEFINE_APPLICATION_MAIN(SkeletalAnimation) + +SkeletalAnimation::SkeletalAnimation(Context* context) : + Sample(context), + drawDebug_(false) +{ + // Register an object factory for our custom Mover component so that we can create them to scene nodes + context->RegisterFactory(); +} + +void SkeletalAnimation::Start() +{ + // Execute base class startup + Sample::Start(); + + // Create the scene content + CreateScene(); + + // Create the UI content + CreateInstructions(); + + // Setup the viewport for displaying the scene + SetupViewport(); + + // Hook up to the frame update and render post-update events + SubscribeToEvents(); + + // Set the mouse mode to use in the sample + Sample::InitMouseMode(MM_ABSOLUTE); +} + +void SkeletalAnimation::CreateScene() +{ + ResourceCache* cache = GetSubsystem(); + + scene_ = new Scene(context_); + + // Create octree, use default volume (-1000, -1000, -1000) to (1000, 1000, 1000) + // Also create a DebugRenderer component so that we can draw debug geometry + scene_->CreateComponent(); + scene_->CreateComponent(); + + // Create scene node & StaticModel component for showing a static plane + Node* planeNode = scene_->CreateChild("Plane"); + planeNode->SetScale(Vector3(100.0f, 1.0f, 100.0f)); + StaticModel* planeObject = planeNode->CreateComponent(); + planeObject->SetModel(cache->GetResource("Models/Plane.mdl")); + planeObject->SetMaterial(cache->GetResource("Materials/StoneTiled.xml")); + + // Create a Zone component for ambient lighting & fog control + Node* zoneNode = scene_->CreateChild("Zone"); + Zone* zone = zoneNode->CreateComponent(); + zone->SetBoundingBox(BoundingBox(-1000.0f, 1000.0f)); + zone->SetAmbientColor(Color(0.15f, 0.15f, 0.15f)); + zone->SetFogColor(Color(0.5f, 0.5f, 0.7f)); + zone->SetFogStart(100.0f); + zone->SetFogEnd(300.0f); + + // Create a directional light to the world. Enable cascaded shadows on it + Node* lightNode = scene_->CreateChild("DirectionalLight"); + lightNode->SetDirection(Vector3(0.6f, -1.0f, 0.8f)); + Light* light = lightNode->CreateComponent(); + light->SetLightType(LIGHT_DIRECTIONAL); + light->SetCastShadows(true); + light->SetShadowBias(BiasParameters(0.00025f, 0.5f)); + // Set cascade splits at 10, 50 and 200 world units, fade shadows out at 80% of maximum shadow distance + light->SetShadowCascade(CascadeParameters(10.0f, 50.0f, 200.0f, 0.0f, 0.8f)); + + // Create animated models + const unsigned NUM_MODELS = 100; + const float MODEL_MOVE_SPEED = 2.0f; + const float MODEL_ROTATE_SPEED = 100.0f; + const BoundingBox bounds(Vector3(-47.0f, 0.0f, -47.0f), Vector3(47.0f, 0.0f, 47.0f)); + + for (unsigned i = 0; i < NUM_MODELS; ++i) + { + Node* modelNode = scene_->CreateChild("Jack"); + modelNode->SetPosition(Vector3(Random(90.0f) - 45.0f, 0.0f, Random(90.0f) - 45.0f)); + modelNode->SetRotation(Quaternion(0.0f, Random(360.0f), 0.0f)); + AnimatedModel* modelObject = modelNode->CreateComponent(); + modelObject->SetModel(cache->GetResource("Models/Jack.mdl")); + modelObject->SetMaterial(cache->GetResource("Materials/Jack.xml")); + modelObject->SetCastShadows(true); + + // Create an AnimationState for a walk animation. Its time position will need to be manually updated to advance the + // animation, The alternative would be to use an AnimationController component which updates the animation automatically, + // but we need to update the model's position manually in any case + Animation* walkAnimation = cache->GetResource("Models/Jack_Walk.ani"); + AnimationState* state = modelObject->AddAnimationState(walkAnimation); + // The state would fail to create (return null) if the animation was not found + if (state) + { + // Enable full blending weight and looping + state->SetWeight(1.0f); + state->SetLooped(true); + state->SetTime(Random(walkAnimation->GetLength())); + } + + // Create our custom Mover component that will move & animate the model during each frame's update + Mover* mover = modelNode->CreateComponent(); + mover->SetParameters(MODEL_MOVE_SPEED, MODEL_ROTATE_SPEED, bounds); + } + + // Create the camera. Limit far clip distance to match the fog + cameraNode_ = scene_->CreateChild("Camera"); + Camera* camera = cameraNode_->CreateComponent(); + camera->SetFarClip(300.0f); + + // Set an initial position for the camera scene node above the plane + cameraNode_->SetPosition(Vector3(0.0f, 5.0f, 0.0f)); +} + +void SkeletalAnimation::CreateInstructions() +{ + ResourceCache* cache = GetSubsystem(); + UI* ui = GetSubsystem(); + + // Construct new Text object, set string to display and font to use + Text* instructionText = ui->GetRoot()->CreateChild(); + instructionText->SetText( + "Use WASD keys and mouse/touch to move\n" + "Space to toggle debug geometry" + ); + instructionText->SetFont(cache->GetResource("Fonts/Anonymous Pro.ttf"), 15); + // The text has multiple rows. Center them in relation to each other + instructionText->SetTextAlignment(HA_CENTER); + + // Position the text relative to the screen center + instructionText->SetHorizontalAlignment(HA_CENTER); + instructionText->SetVerticalAlignment(VA_CENTER); + instructionText->SetPosition(0, ui->GetRoot()->GetHeight() / 4); +} + +void SkeletalAnimation::SetupViewport() +{ + Renderer* renderer = GetSubsystem(); + + // Set up a viewport to the Renderer subsystem so that the 3D scene can be seen + SharedPtr viewport(new Viewport(context_, scene_, cameraNode_->GetComponent())); + renderer->SetViewport(0, viewport); +} + +void SkeletalAnimation::SubscribeToEvents() +{ + // Subscribe HandleUpdate() function for processing update events + SubscribeToEvent(E_UPDATE, URHO3D_HANDLER(SkeletalAnimation, HandleUpdate)); + + // Subscribe HandlePostRenderUpdate() function for processing the post-render update event, sent after Renderer subsystem is + // done with defining the draw calls for the viewports (but before actually executing them.) We will request debug geometry + // rendering during that event + SubscribeToEvent(E_POSTRENDERUPDATE, URHO3D_HANDLER(SkeletalAnimation, HandlePostRenderUpdate)); +} + +void SkeletalAnimation::MoveCamera(float timeStep) +{ + // Do not move if the UI has a focused element (the console) + if (GetSubsystem()->GetFocusElement()) + return; + + Input* input = GetSubsystem(); + + // Movement speed as world units per second + const float MOVE_SPEED = 20.0f; + // Mouse sensitivity as degrees per pixel + const float MOUSE_SENSITIVITY = 0.1f; + + // Use this frame's mouse motion to adjust camera node yaw and pitch. Clamp the pitch between -90 and 90 degrees + IntVector2 mouseMove = input->GetMouseMove(); + yaw_ += MOUSE_SENSITIVITY * mouseMove.x_; + pitch_ += MOUSE_SENSITIVITY * mouseMove.y_; + pitch_ = Clamp(pitch_, -90.0f, 90.0f); + + // Construct new orientation for the camera scene node from yaw and pitch. Roll is fixed to zero + cameraNode_->SetRotation(Quaternion(pitch_, yaw_, 0.0f)); + + // Read WASD keys and move the camera scene node to the corresponding direction if they are pressed + if (input->GetKeyDown('W')) + cameraNode_->Translate(Vector3::FORWARD * MOVE_SPEED * timeStep); + if (input->GetKeyDown('S')) + cameraNode_->Translate(Vector3::BACK * MOVE_SPEED * timeStep); + if (input->GetKeyDown('A')) + cameraNode_->Translate(Vector3::LEFT * MOVE_SPEED * timeStep); + if (input->GetKeyDown('D')) + cameraNode_->Translate(Vector3::RIGHT * MOVE_SPEED * timeStep); + + // Toggle debug geometry with space + if (input->GetKeyPress(KEY_SPACE)) + drawDebug_ = !drawDebug_; +} + +void SkeletalAnimation::HandleUpdate(StringHash eventType, VariantMap& eventData) +{ + using namespace Update; + + // Take the frame time step, which is stored as a float + float timeStep = eventData[P_TIMESTEP].GetFloat(); + + // Move the camera, scale movement with time step + MoveCamera(timeStep); +} + +void SkeletalAnimation::HandlePostRenderUpdate(StringHash eventType, VariantMap& eventData) +{ + // If draw debug mode is enabled, draw viewport debug geometry, which will show eg. drawable bounding boxes and skeleton + // bones. Note that debug geometry has to be separately requested each frame. Disable depth test so that we can see the + // bones properly + if (drawDebug_) + GetSubsystem()->DrawDebugGeometry(false); +} diff --git a/examples/Urho3D/SkeletalAnimation.h b/examples/Urho3D/SkeletalAnimation.h new file mode 100644 index 000000000..04c5d1090 --- /dev/null +++ b/examples/Urho3D/SkeletalAnimation.h @@ -0,0 +1,86 @@ +// +// Copyright (c) 2008-2016 the Urho3D project. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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. +// + +#pragma once + +#include "Sample.h" + +namespace Urho3D +{ + +class Node; +class Scene; + +} + +/// Skeletal animation example. +/// This sample demonstrates: +/// - Populating a 3D scene with skeletally animated AnimatedModel components; +/// - Moving the animated models and advancing their animation using a custom component +/// - Enabling a cascaded shadow map on a directional light, which allows high-quality shadows +/// over a large area (typically used in outdoor scenes for shadows cast by sunlight) +/// - Displaying renderer debug geometry +class SkeletalAnimation : public Sample +{ + URHO3D_OBJECT(SkeletalAnimation, Sample); + +public: + /// Construct. + SkeletalAnimation(Context* context); + + /// Setup after engine initialization and before running the main loop. + virtual void Start(); + +protected: + /// Return XML patch instructions for screen joystick layout for a specific sample app, if any. + virtual String GetScreenJoystickPatchString() const { return + "" + " " + " Debug" + " " + " " + " " + " " + " " + " " + ""; + } + +private: + /// Construct the scene content. + void CreateScene(); + /// Construct an instruction text to the UI. + void CreateInstructions(); + /// Set up a viewport for displaying the scene. + void SetupViewport(); + /// Subscribe to application-wide logic update and post-render update events. + void SubscribeToEvents(); + /// Read input and moves the camera. + void MoveCamera(float timeStep); + /// Handle the logic update event. + void HandleUpdate(StringHash eventType, VariantMap& eventData); + /// Handle the post-render update event. + void HandlePostRenderUpdate(StringHash eventType, VariantMap& eventData); + + /// Flag for drawing debug geometry. + bool drawDebug_; +}; diff --git a/examples/Urho3D/config.cmake b/examples/Urho3D/config.cmake new file mode 100644 index 000000000..cf0faa7cc --- /dev/null +++ b/examples/Urho3D/config.cmake @@ -0,0 +1,6 @@ +# DOCUMENTATION_START { +# config.cmake + +hunter_config(Lua VERSION 5.1.5-p3) +hunter_config(SDL2 VERSION 2.0.4-urho-p4) +# DOCUMENTATION_END } diff --git a/examples/VulkanMemoryAllocator/CMakeLists.txt b/examples/VulkanMemoryAllocator/CMakeLists.txt new file mode 100644 index 000000000..be3e3662f --- /dev/null +++ b/examples/VulkanMemoryAllocator/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-VulkanMemoryAllocator) + +# DOCUMENTATION_START { +hunter_add_package(VulkanMemoryAllocator) +find_package(VulkanMemoryAllocator CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC VulkanMemoryAllocator::VulkanMemoryAllocator) +# DOCUMENTATION_END } diff --git a/examples/VulkanMemoryAllocator/boo.cpp b/examples/VulkanMemoryAllocator/boo.cpp new file mode 100644 index 000000000..e245fac1c --- /dev/null +++ b/examples/VulkanMemoryAllocator/boo.cpp @@ -0,0 +1,3 @@ + +int main() { +} diff --git a/examples/WDC/CMakeLists.txt b/examples/WDC/CMakeLists.txt new file mode 100644 index 000000000..fcc1f46f2 --- /dev/null +++ b/examples/WDC/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.3) + +include("../common.cmake") + +set(CMAKE_CXX_STANDARD 11) +set(CXX_STANDARD_REQUIRED ON) + +project(download-wdc) + +hunter_add_package(WDC) +find_package(WDC CONFIG REQUIRED) + +add_executable(example init.cpp) +target_link_libraries(example WDC::libwdc) diff --git a/examples/WDC/init.cpp b/examples/WDC/init.cpp new file mode 100644 index 000000000..532920082 --- /dev/null +++ b/examples/WDC/init.cpp @@ -0,0 +1,60 @@ +#include + +#include +#include +#include +#include +#include + +std::map base_options = { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } +}; + +std::map options_with_proxy = { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" }, + { "proxy_hostname", "https://10.0.0.1:8080" }, + { "proxy_username", "{proxy_username}" }, + { "proxy_password", "{proxy_password}" } +}; + +std::map options_with_cert = { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" }, + { "cert_path", "/etc/ssl/certs/client.crt" }, + { "key_path", "/etc/ssl/private/client.key" } +}; + +std::string options_to_string(const std::map & options) +{ + std::stringstream stream; + for (const auto& option : options) + { + stream << "\t" << option.first << ": " << option.second << std::endl; + } + return stream.str(); +} + +int main() +{ + auto various_options = { + base_options, + options_with_proxy, + options_with_cert + }; + + for (const auto& options : various_options) + { + std::unique_ptr client{ new WebDAV::Client{ options }}; + + bool is_connected = client->check(); + std::cout << "Client with options: " << std::endl + << options_to_string(options) + << " is " << (is_connected ? " " : "not ") << "connected" + << std::endl << std::endl; + } +} diff --git a/examples/WebKit/CMakeLists.txt b/examples/WebKit/CMakeLists.txt new file mode 100644 index 000000000..b59842339 --- /dev/null +++ b/examples/WebKit/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-WebKit) + +# DOCUMENTATION_START { +hunter_add_package(WebKit) +find_package(WebKit CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries( + boo + PUBLIC + WebKit::JavaScriptCore + WebKit::WTF +) +# DOCUMENTATION_END } diff --git a/examples/WebKit/boo.cpp b/examples/WebKit/boo.cpp new file mode 100644 index 000000000..4a3c702db --- /dev/null +++ b/examples/WebKit/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/WebP/CMakeLists.txt b/examples/WebP/CMakeLists.txt new file mode 100644 index 000000000..8343ce070 --- /dev/null +++ b/examples/WebP/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2018, Ruslan Baratov +# Copyright (c) 2018, Mathieu-Andre Chiasson +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-webp) + +# DOCUMENTATION_START { +hunter_add_package(WebP) +find_package(WebP CONFIG REQUIRED) +add_executable(main main.cpp) +target_link_libraries(main WebP::webp) +# DOCUMENTATION_END } + diff --git a/examples/WebP/main.cpp b/examples/WebP/main.cpp new file mode 100644 index 000000000..20ee2aadc --- /dev/null +++ b/examples/WebP/main.cpp @@ -0,0 +1,8 @@ +#include +#include +#include + +int main() { + return 0; +} + diff --git a/examples/YAJL/CMakeLists.txt b/examples/YAJL/CMakeLists.txt new file mode 100644 index 000000000..1958bef09 --- /dev/null +++ b/examples/YAJL/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-YAJL) + +# DOCUMENTATION_START { +hunter_add_package(YAJL) +find_package(YAJL CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC YAJL::yajl) +# DOCUMENTATION_END } diff --git a/examples/YAJL/boo.cpp b/examples/YAJL/boo.cpp new file mode 100644 index 000000000..2792555cf --- /dev/null +++ b/examples/YAJL/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/accelerate/CMakeLists.txt b/examples/accelerate/CMakeLists.txt new file mode 100644 index 000000000..4a09a815b --- /dev/null +++ b/examples/accelerate/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-accelerate) + +find_package(accelerate REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC accelerate::accelerate) diff --git a/examples/accelerate/foo.mm b/examples/accelerate/foo.mm new file mode 100644 index 000000000..1b5d3ca03 --- /dev/null +++ b/examples/accelerate/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/acf/CMakeLists.txt b/examples/acf/CMakeLists.txt new file mode 100644 index 000000000..0e6eb31fd --- /dev/null +++ b/examples/acf/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-acf) + +hunter_add_package(acf) +find_package(acf CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo acf::acf) diff --git a/examples/acf/foo.cpp b/examples/acf/foo.cpp new file mode 100644 index 000000000..731880d12 --- /dev/null +++ b/examples/acf/foo.cpp @@ -0,0 +1,5 @@ +#include + +int main() { + acf::Detector("just_a_test"); +} diff --git a/examples/actionlib/CMakeLists.txt b/examples/actionlib/CMakeLists.txt new file mode 100644 index 000000000..94ec4db57 --- /dev/null +++ b/examples/actionlib/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_actionlib) + +# DOCUMENTATION_START { + +hunter_add_package(actionlib) +find_package(catkin CONFIG REQUIRED COMPONENTS actionlib) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/actionlib/main.cpp b/examples/actionlib/main.cpp new file mode 100644 index 000000000..ce833acf6 --- /dev/null +++ b/examples/actionlib/main.cpp @@ -0,0 +1,10 @@ +#include +#include +#include + +int main() { + ros::Time::init(); + ros::Duration(3).sleep(); + std::cout << "Done" << std::endl; + return 0; +} diff --git a/examples/actionlib/package.xml b/examples/actionlib/package.xml new file mode 100644 index 000000000..69c88ece3 --- /dev/null +++ b/examples/actionlib/package.xml @@ -0,0 +1,11 @@ + + download_actionlib + 0.0.0 + + This package provides foo capability. + + Krasimir Georgiev + BSD + + catkin + diff --git a/examples/aes/CMakeLists.txt b/examples/aes/CMakeLists.txt new file mode 100644 index 000000000..9e4c4ce8a --- /dev/null +++ b/examples/aes/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-aes) + +hunter_add_package(aes) +find_package(aes CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo aes::aes) diff --git a/examples/aes/foo.cpp b/examples/aes/foo.cpp new file mode 100644 index 000000000..1bd4df6ed --- /dev/null +++ b/examples/aes/foo.cpp @@ -0,0 +1,10 @@ +#include + +int main() { + uint8_t* input = 0; + uint8_t* key = 0; + uint8_t *output = 0; + uint32_t length = 0; + + AES_ECB_encrypt(input, key, output, length); +} diff --git a/examples/aglet/CMakeLists.txt b/examples/aglet/CMakeLists.txt new file mode 100644 index 000000000..2e37296dd --- /dev/null +++ b/examples/aglet/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-aglet) + +hunter_add_package(aglet) +find_package(aglet CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC aglet::aglet) diff --git a/examples/aglet/foo.cpp b/examples/aglet/foo.cpp new file mode 100644 index 000000000..7fc78ec39 --- /dev/null +++ b/examples/aglet/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/android/CMakeLists.txt b/examples/android/CMakeLists.txt new file mode 100644 index 000000000..6da92b53b --- /dev/null +++ b/examples/android/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android) + +find_package(android REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC android::android) diff --git a/examples/android/foo.cpp b/examples/android/foo.cpp new file mode 100644 index 000000000..3927d0ab4 --- /dev/null +++ b/examples/android/foo.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2017, Ruslan Baratov +// All rights reserved. + +#include + +int main() { +} diff --git a/examples/android_arm64_v8a_system_image_packer/CMakeLists.txt b/examples/android_arm64_v8a_system_image_packer/CMakeLists.txt new file mode 100644 index 000000000..8749e0023 --- /dev/null +++ b/examples/android_arm64_v8a_system_image_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_arm64_v8a_system_image_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_arm64_v8a_system_image_packer) +# DOCUMENTATION_END } diff --git a/examples/android_arm_eabi_v7a_system_image_packer/CMakeLists.txt b/examples/android_arm_eabi_v7a_system_image_packer/CMakeLists.txt new file mode 100644 index 000000000..24983bba0 --- /dev/null +++ b/examples/android_arm_eabi_v7a_system_image_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_arm_eabi_v7a_system_image_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_arm_eabi_v7a_system_image_packer) +# DOCUMENTATION_END } diff --git a/examples/android_build_tools_packer/CMakeLists.txt b/examples/android_build_tools_packer/CMakeLists.txt new file mode 100644 index 000000000..c6e503a65 --- /dev/null +++ b/examples/android_build_tools_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_build_tools_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_build_tools_packer) +# DOCUMENTATION_END } diff --git a/examples/android_google_apis_intel_x86_atom_system_image_packer/CMakeLists.txt b/examples/android_google_apis_intel_x86_atom_system_image_packer/CMakeLists.txt new file mode 100644 index 000000000..034693b47 --- /dev/null +++ b/examples/android_google_apis_intel_x86_atom_system_image_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_google_apis_intel_x86_atom_system_image_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_google_apis_intel_x86_atom_system_image_packer) +# DOCUMENTATION_END } diff --git a/examples/android_google_apis_packer/CMakeLists.txt b/examples/android_google_apis_packer/CMakeLists.txt new file mode 100644 index 000000000..ed966f821 --- /dev/null +++ b/examples/android_google_apis_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_google_apis_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_google_apis_packer) +# DOCUMENTATION_END } diff --git a/examples/android_google_repository_packer/CMakeLists.txt b/examples/android_google_repository_packer/CMakeLists.txt new file mode 100644 index 000000000..4131b7382 --- /dev/null +++ b/examples/android_google_repository_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_google_repository_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_google_repository_packer) +# DOCUMENTATION_END } diff --git a/examples/android_intel_x86_atom_system_image_packer/CMakeLists.txt b/examples/android_intel_x86_atom_system_image_packer/CMakeLists.txt new file mode 100644 index 000000000..09e94e817 --- /dev/null +++ b/examples/android_intel_x86_atom_system_image_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_intel_x86_atom_system_image_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_intel_x86_atom_system_image_packer) +# DOCUMENTATION_END } diff --git a/examples/android_log/CMakeLists.txt b/examples/android_log/CMakeLists.txt new file mode 100644 index 000000000..9a7d5205f --- /dev/null +++ b/examples/android_log/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_log) + +find_package(android_log REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC android_log::android_log) diff --git a/examples/android_log/foo.cpp b/examples/android_log/foo.cpp new file mode 100644 index 000000000..cf8724e83 --- /dev/null +++ b/examples/android_log/foo.cpp @@ -0,0 +1,8 @@ +// Copyright (c) 2015, Ruslan Baratov +// All rights reserved. + +#include + +int main() { + __android_log_print(ANDROID_LOG_INFO, "foo", "boo"); +} diff --git a/examples/android_mips_system_image_packer/CMakeLists.txt b/examples/android_mips_system_image_packer/CMakeLists.txt new file mode 100644 index 000000000..8422b2042 --- /dev/null +++ b/examples/android_mips_system_image_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_mips_system_image_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_mips_system_image_packer) +# DOCUMENTATION_END } diff --git a/examples/android_sdk_packer/CMakeLists.txt b/examples/android_sdk_packer/CMakeLists.txt new file mode 100644 index 000000000..154327c22 --- /dev/null +++ b/examples/android_sdk_packer/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_sdk_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_sdk_packer) +find_package(android_sdk_packer CONFIG REQUIRED) +# DOCUMENTATION_END } diff --git a/examples/android_sdk_platform_packer/CMakeLists.txt b/examples/android_sdk_platform_packer/CMakeLists.txt new file mode 100644 index 000000000..8c2fbf6ec --- /dev/null +++ b/examples/android_sdk_platform_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_sdk_platform_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_sdk_platform_packer) +# DOCUMENTATION_END } diff --git a/examples/android_sdk_platform_tools_packer/CMakeLists.txt b/examples/android_sdk_platform_tools_packer/CMakeLists.txt new file mode 100644 index 000000000..b66406227 --- /dev/null +++ b/examples/android_sdk_platform_tools_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_sdk_platform_tools_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_sdk_platform_tools_packer) +# DOCUMENTATION_END } diff --git a/examples/android_sdk_tools_packer/CMakeLists.txt b/examples/android_sdk_tools_packer/CMakeLists.txt new file mode 100644 index 000000000..82c00e5b9 --- /dev/null +++ b/examples/android_sdk_tools_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_sdk_tools_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_sdk_tools_packer) +# DOCUMENTATION_END } diff --git a/examples/android_support_repository_packer/CMakeLists.txt b/examples/android_support_repository_packer/CMakeLists.txt new file mode 100644 index 000000000..d55a5f721 --- /dev/null +++ b/examples/android_support_repository_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-android_support_repository_packer) + +# DOCUMENTATION_START { +hunter_add_package(android_support_repository_packer) +# DOCUMENTATION_END } diff --git a/examples/angles/CMakeLists.txt b/examples/angles/CMakeLists.txt new file mode 100644 index 000000000..ffe7a7cb2 --- /dev/null +++ b/examples/angles/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-angles) + +# DOCUMENTATION_START { +hunter_add_package(angles) +find_package(catkin CONFIG REQUIRED COMPONENTS angles) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/angles/main.cpp b/examples/angles/main.cpp new file mode 100644 index 000000000..f17786668 --- /dev/null +++ b/examples/angles/main.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/angles/package.xml b/examples/angles/package.xml new file mode 100644 index 000000000..d6f042489 --- /dev/null +++ b/examples/angles/package.xml @@ -0,0 +1,11 @@ + + download-angles + 0.0.0 + + This package provides foo capability. + + Krasimir Georgiev + BSD + + catkin + diff --git a/examples/applicationservices/CMakeLists.txt b/examples/applicationservices/CMakeLists.txt new file mode 100644 index 000000000..fb5be3a2e --- /dev/null +++ b/examples/applicationservices/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-applicationservices) + +find_package(applicationservices REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC applicationservices::applicationservices) diff --git a/examples/applicationservices/foo.mm b/examples/applicationservices/foo.mm new file mode 100644 index 000000000..76911fad6 --- /dev/null +++ b/examples/applicationservices/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/arabica/CMakeLists.txt b/examples/arabica/CMakeLists.txt new file mode 100644 index 000000000..6575fcd9c --- /dev/null +++ b/examples/arabica/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-arabica) + +# DOCUMENTATION_START { +hunter_add_package(arabica) +find_package(arabica CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC arabica::arabica) +# DOCUMENTATION_END } diff --git a/examples/arabica/boo.cpp b/examples/arabica/boo.cpp new file mode 100644 index 000000000..cd48e9e7a --- /dev/null +++ b/examples/arabica/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/audiounit/CMakeLists.txt b/examples/audiounit/CMakeLists.txt new file mode 100644 index 000000000..3523b3f8e --- /dev/null +++ b/examples/audiounit/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-audiounit) + +find_package(audiounit REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC audiounit::audiounit) diff --git a/examples/audiounit/foo.mm b/examples/audiounit/foo.mm new file mode 100644 index 000000000..7bc45397b --- /dev/null +++ b/examples/audiounit/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/autobahn-cpp/CMakeLists.txt b/examples/autobahn-cpp/CMakeLists.txt new file mode 100644 index 000000000..f6c238c28 --- /dev/null +++ b/examples/autobahn-cpp/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-autobahn-cpp) + +hunter_add_package(autobahn-cpp) + +set (CMAKE_CXX_STANDARD 11) + +find_package(autobahn-cpp CONFIG REQUIRED) + +add_executable(test_autobahn-cpp websocket_callee.cpp parameters.cpp) +target_link_libraries(test_autobahn-cpp autobahn-cpp::autobahn-cpp) diff --git a/examples/autobahn-cpp/parameters.cpp b/examples/autobahn-cpp/parameters.cpp new file mode 100644 index 000000000..4f307e66d --- /dev/null +++ b/examples/autobahn-cpp/parameters.cpp @@ -0,0 +1,149 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) Tavendo GmbH +// +// Boost Software License - Version 1.0 - August 17th, 2003 +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software, unless such copies or derivative +// works are solely in the form of machine-executable object code generated by +// a source language processor. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +/////////////////////////////////////////////////////////////////////////////// + +#include "parameters.hpp" + +#include +#include +#include +#include + +namespace { +const std::string LOCALHOST_IP_ADDRESS_STRING("127.0.0.1"); +const boost::asio::ip::address LOCALHOST_IP_ADDRESS( + boost::asio::ip::address::from_string(LOCALHOST_IP_ADDRESS_STRING)); +const std::string DEFAULT_REALM("realm1"); +const uint16_t DEFAULT_RAWSOCKET_PORT(8000); +const std::string DEFAULT_UDS_PATH("/tmp/crossbar.sock"); +} + +parameters::parameters() + : m_debug(false) + , m_realm(DEFAULT_REALM) + , m_rawsocket_endpoint(LOCALHOST_IP_ADDRESS, DEFAULT_RAWSOCKET_PORT) +#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS + , m_uds_endpoint(DEFAULT_UDS_PATH) +#endif +{ +} + +bool parameters::debug() const +{ + return m_debug; +} + +const std::string& parameters::realm() const +{ + return m_realm; +} + +const boost::asio::ip::tcp::endpoint& parameters::rawsocket_endpoint() const +{ + return m_rawsocket_endpoint; +} + +#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS +const boost::asio::local::stream_protocol::endpoint& parameters::uds_endpoint() const +{ + return m_uds_endpoint; +} +#endif + +void parameters::set_debug(bool value) +{ + m_debug = value; +} + +void parameters::set_realm(const std::string& realm) +{ + m_realm = realm; +} + +void parameters::set_rawsocket_endpoint(const std::string& ip_address, uint16_t port) +{ + m_rawsocket_endpoint = boost::asio::ip::tcp::endpoint( + boost::asio::ip::address::from_string(ip_address), port); +} + +#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS +void parameters::set_uds_endpoint(const std::string& path) +{ + m_uds_endpoint = boost::asio::local::stream_protocol::endpoint(path); +} +#endif + +std::unique_ptr get_parameters(int argc, char** argv) +{ + std::unique_ptr params(new parameters); + + namespace po = boost::program_options; + po::options_description description("options"); + description.add_options() + ("help", "Display this help message") + ("debug,d", po::bool_switch()->default_value(false), + "Enable debug logging.") + ("realm,r", po::value()->default_value(DEFAULT_REALM), + "The realm to join on the wamp router.") + ("uds-path,u", po::value()->default_value(DEFAULT_UDS_PATH), + "The unix domain socket path the wamp router is listening for connections on.") + ("rawsocket-ip,h", po::value()->default_value(LOCALHOST_IP_ADDRESS_STRING), + "The ip address of the host running the wamp router.") + ("rawsocket-port,p", po::value()->default_value(DEFAULT_RAWSOCKET_PORT), + "The port that the wamp router is listening for connections on."); + + po::variables_map variables; + try { + po::store(po::parse_command_line(argc, argv, description), variables); + + if (variables.count("help")) { + std::cout << "Example Parameters" << std::endl + << description << std::endl; + exit(0); + } + + po::notify(variables); + } catch(po::error& e) { + std::cerr << "error: " << e.what() << std::endl << std::endl; + std::cerr << description << std::endl; + exit(-1); + } + + params->set_debug(variables["debug"].as()); + params->set_realm(variables["realm"].as()); + params->set_rawsocket_endpoint( + variables["rawsocket-ip"].as(), + variables["rawsocket-port"].as()); + +#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS + params->set_uds_endpoint( + variables["uds-path"].as()); +#endif + return params; +} diff --git a/examples/autobahn-cpp/parameters.hpp b/examples/autobahn-cpp/parameters.hpp new file mode 100644 index 000000000..56f2e495f --- /dev/null +++ b/examples/autobahn-cpp/parameters.hpp @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) Tavendo GmbH +// +// Boost Software License - Version 1.0 - August 17th, 2003 +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software, unless such copies or derivative +// works are solely in the form of machine-executable object code generated by +// a source language processor. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef EXAMPLES_PARAMETERS_HPP +#define EXAMPLES_PARAMETERS_HPP + +#include +#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS +# include +#endif +#include +#include + +class parameters +{ +public: + parameters(); + + bool debug() const; + const std::string& realm() const; + const boost::asio::ip::tcp::endpoint& rawsocket_endpoint() const; + +#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS + void set_uds_endpoint(const std::string& path); + const boost::asio::local::stream_protocol::endpoint& uds_endpoint() const; +#endif + + void set_debug(bool enabled); + void set_realm(const std::string& realm); + void set_rawsocket_endpoint(const std::string& ip_address, uint16_t port); +private: + bool m_debug; + std::string m_realm; + boost::asio::ip::tcp::endpoint m_rawsocket_endpoint; +#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS + boost::asio::local::stream_protocol::endpoint m_uds_endpoint; +#endif +}; + +std::unique_ptr get_parameters(int argc, char** argv); + +#endif // EXAMPLES_PARAMETERS_HPP diff --git a/examples/autobahn-cpp/websocket_callee.cpp b/examples/autobahn-cpp/websocket_callee.cpp new file mode 100644 index 000000000..5938ed722 --- /dev/null +++ b/examples/autobahn-cpp/websocket_callee.cpp @@ -0,0 +1,144 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) Tavendo GmbH +// +// Boost Software License - Version 1.0 - August 17th, 2003 +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software, unless such copies or derivative +// works are solely in the form of machine-executable object code generated by +// a source language processor. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +/////////////////////////////////////////////////////////////////////////////// + +#include "parameters.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void add2(autobahn::wamp_invocation invocation) +{ + auto a = invocation->argument(0); + auto b = invocation->argument(1); + + std::cerr << "Procedure com.examples.calculator.add2 invoked: " << a << ", " << b << std::endl; + + invocation->result(std::make_tuple(a + b)); +} + +typedef websocketpp::client client; + +int main(int argc, char** argv) +{ + std::cerr << "Boost: " << BOOST_VERSION << std::endl; + try { + auto parameters = get_parameters(argc, argv); + + std::cerr << "Connecting to realm: " << parameters->realm() << std::endl; + + boost::asio::io_service io; + bool debug = parameters->debug(); + + client ws_clinet; + ws_clinet.init_asio(&io); + auto transport = std::make_shared < autobahn::wamp_websocketpp_websocket_transport >( + ws_clinet, "ws://127.0.0.1:8080/ws", debug); + + + auto session = std::make_shared(io, debug); + + // Create a thread to run the telemetry loop + transport->attach(std::static_pointer_cast(session)); + + // Make sure the continuation futures we use do not run out of scope prematurely. + // Since we are only using one thread here this can cause the io service to block + // as a future generated by a continuation will block waiting for its promise to be + // fulfilled when it goes out of scope. This would prevent the session from receiving + // responses from the router. + boost::future connect_future; + boost::future start_future; + boost::future join_future; + boost::future provide_future; + + connect_future = transport->connect().then([&](boost::future connected) { + try { + connected.get(); + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + io.stop(); + return; + } + + std::cerr << "transport connected" << std::endl; + + start_future = session->start().then([&](boost::future started) { + try { + started.get(); + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + io.stop(); + return; + } + + std::cerr << "session started" << std::endl; + + join_future = session->join(parameters->realm()).then([&](boost::future joined) { + try { + std::cerr << "joined realm: " << joined.get() << std::endl; + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + io.stop(); + return; + } + + provide_future = session->provide("com.examples.calculator.add2", &add2).then( + [&](boost::future registration) { + try { + std::cerr << "registered procedure:" << registration.get().id() << std::endl; + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + io.stop(); + return; + } + }); + }); + }); + }); + + std::cerr << "starting io service" << std::endl; + + io.run(); + + std::cerr << "stopped io service" << std::endl; + } + catch (const std::exception& e) { + std::cerr << "exception: " << e.what() << std::endl; + return -1; + } + + return 0; +} diff --git a/examples/autoutils/CMakeLists.txt b/examples/autoutils/CMakeLists.txt new file mode 100644 index 000000000..3664b0721 --- /dev/null +++ b/examples/autoutils/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-autoutils) + +# DOCUMENTATION_START { +# download autoutils +hunter_add_package(autoutils) +find_package(autoutils CONFIG REQUIRED) + +# include modules +include(AutoutilsCheckHeader) + +autoutils_check_header("stdio.h") +if(NOT HAVE_STDIO_H) + message(FATAL_ERROR "Cannot find stdio.h") +endif() +# DOCUMENTATION_END } diff --git a/examples/aws-c-common/CMakeLists.txt b/examples/aws-c-common/CMakeLists.txt new file mode 100644 index 000000000..4c40ed075 --- /dev/null +++ b/examples/aws-c-common/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-aws-c-common) + +# DOCUMENTATION_START { +hunter_add_package(aws-c-common) + +find_package(aws-c-common CONFIG REQUIRED) +# To use exported modules +include(AwsSIMD) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC AWS::aws-c-common) +# DOCUMENTATION_END } diff --git a/examples/aws-c-common/boo.cpp b/examples/aws-c-common/boo.cpp new file mode 100644 index 000000000..35f5de248 --- /dev/null +++ b/examples/aws-c-common/boo.cpp @@ -0,0 +1,8 @@ +#include +#include + +int main() { + struct aws_allocator *allocator = aws_default_allocator(); + struct aws_string *s = aws_string_new_from_c_str(allocator, "hello world"); + aws_string_destroy(s); +} diff --git a/examples/benchmark/CMakeLists.txt b/examples/benchmark/CMakeLists.txt new file mode 100644 index 000000000..eda5cf434 --- /dev/null +++ b/examples/benchmark/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-benchmark) + +hunter_add_package(benchmark) + +find_package(benchmark CONFIG REQUIRED) + +add_executable(bench main.cpp) +target_link_libraries(bench benchmark::benchmark) diff --git a/examples/benchmark/main.cpp b/examples/benchmark/main.cpp new file mode 100644 index 000000000..687d68441 --- /dev/null +++ b/examples/benchmark/main.cpp @@ -0,0 +1,24 @@ +// "Basic usage" example from https://github.com/google/benchmark/blob/v1.3.0/README.md + +// configure, compile and run: +// cmake -H. -Bbuild && cmake --build build && build/bench + +#include +#include + +static void BM_StringCreation(benchmark::State& state) { + for (auto _ : state) + std::string empty_string; +} +// Register the function as a benchmark +BENCHMARK(BM_StringCreation); + +// Define another benchmark +static void BM_StringCopy(benchmark::State& state) { + std::string x = "hello"; + for (auto _ : state) + std::string copy(x); +} +BENCHMARK(BM_StringCopy); + +BENCHMARK_MAIN(); diff --git a/examples/bento4/CMakeLists.txt b/examples/bento4/CMakeLists.txt new file mode 100644 index 000000000..fc13e2a1f --- /dev/null +++ b/examples/bento4/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-bento4) + +# DOCUMENTATION_START { +hunter_add_package(bento4) +find_package(bento4 CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main PUBLIC bento4::ap4) +# DOCUMENTATION_END } diff --git a/examples/bento4/main.cpp b/examples/bento4/main.cpp new file mode 100644 index 000000000..24ff65516 --- /dev/null +++ b/examples/bento4/main.cpp @@ -0,0 +1,8 @@ +#include + +// See https://www.bento4.com/documentation/ for more details. +int main() { + AP4_File file; + (void)file; + return 0; +} diff --git a/examples/binaryen/CMakeLists.txt b/examples/binaryen/CMakeLists.txt new file mode 100644 index 000000000..e944236b6 --- /dev/null +++ b/examples/binaryen/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-binaryen) + +# DOCUMENTATION_START { +hunter_add_package(binaryen) +find_package(binaryen CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC binaryen::binaryen) +# DOCUMENTATION_END } diff --git a/examples/binaryen/boo.cpp b/examples/binaryen/boo.cpp new file mode 100644 index 000000000..afd0e09f3 --- /dev/null +++ b/examples/binaryen/boo.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +// "hello world" type example: create a function that adds two i32s and returns the result + +int main() { + BinaryenModuleRef module = BinaryenModuleCreate(); + + // Create a function type for i32 (i32, i32) + BinaryenType params[2] = { BinaryenTypeInt32(), BinaryenTypeInt32() }; + BinaryenFunctionTypeRef iii = BinaryenAddFunctionType(module, "iii", BinaryenTypeInt32(), params, 2); + + // Get the 0 and 1 arguments, and add them + BinaryenExpressionRef x = BinaryenGetLocal(module, 0, BinaryenTypeInt32()), + y = BinaryenGetLocal(module, 1, BinaryenTypeInt32()); + BinaryenExpressionRef add = BinaryenBinary(module, BinaryenAddInt32(), x, y); + + // Create the add function + // Note: no additional local variables + // Note: no basic blocks here, we are an AST. The function body is just an expression node. + BinaryenFunctionRef adder = BinaryenAddFunction(module, "adder", iii, NULL, 0, add); + + // Print it out + BinaryenModulePrint(module); + + // Clean up the module, which owns all the objects we created above + BinaryenModuleDispose(module); + + return 0; +} diff --git a/examples/bison/CMakeLists.txt b/examples/bison/CMakeLists.txt new file mode 100644 index 000000000..1b99fa89d --- /dev/null +++ b/examples/bison/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-bison) + +hunter_add_package(bison) +find_package(BISON REQUIRED) + +BISON_TARGET(rpcalc rpcalc.y ${CMAKE_CURRENT_BINARY_DIR}/rpcalc.cpp) +add_executable(rpcalc ${BISON_rpcalc_OUTPUTS}) diff --git a/examples/bison/rpcalc.y b/examples/bison/rpcalc.y new file mode 100644 index 000000000..e6cf1569d --- /dev/null +++ b/examples/bison/rpcalc.y @@ -0,0 +1,94 @@ +/* Reverse polish notation calculator. */ + + +%{ + #include + #include + int yylex (void); + void yyerror (char const *); +%} + + +%define api.value.type {double} +%token NUM + +%% /* Grammar rules and actions follow. */ + +input: + %empty +| input line +; + + + +line: + '\n' +| exp '\n' { printf ("%.10g\n", $1); } +; + + + +exp: + NUM { $$ = $1; } +| exp exp '+' { $$ = $1 + $2; } +| exp exp '-' { $$ = $1 - $2; } +| exp exp '*' { $$ = $1 * $2; } +| exp exp '/' { $$ = $1 / $2; } +| exp exp '^' { $$ = pow ($1, $2); } /* Exponentiation */ +| exp 'n' { $$ = -$1; } /* Unary minus */ +; + +%% + +/* The lexical analyzer returns a double floating point + number on the stack and the token NUM, or the numeric code + of the character read if not a number. It skips all blanks + and tabs, and returns 0 for end-of-input. */ + +#include + + + +int +yylex (void) +{ + int c; + + /* Skip white space. */ + while ((c = getchar ()) == ' ' || c == '\t') + continue; + + + /* Process numbers. */ + if (c == '.' || isdigit (c)) + { + ungetc (c, stdin); + scanf ("%lf", &yylval); + return NUM; + } + + + /* Return end-of-input. */ + if (c == EOF) + return 0; + /* Return a single char. */ + return c; +} + + +int +main (void) +{ + return yyparse (); +} + +#include + + +/* Called by yyparse on error. */ +void +yyerror (char const *s) +{ + fprintf (stderr, "%s\n", s); +} + diff --git a/examples/boost-pba/CMakeLists.txt b/examples/boost-pba/CMakeLists.txt new file mode 100644 index 000000000..152cbb426 --- /dev/null +++ b/examples/boost-pba/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") +include("../common.cmake") + +project(download-boost-pba) + +hunter_add_package(boost-pba) +find_package(boost-pba CONFIG REQUIRED) + +add_executable(boost-pba-test main.cpp) +target_link_libraries(boost-pba-test boost-pba::boost-pba) diff --git a/examples/boost-pba/config.cmake b/examples/boost-pba/config.cmake new file mode 100644 index 000000000..2708af5db --- /dev/null +++ b/examples/boost-pba/config.cmake @@ -0,0 +1 @@ +hunter_config(Boost VERSION 1.58.0-p1) diff --git a/examples/boost-pba/main.cpp b/examples/boost-pba/main.cpp new file mode 100644 index 000000000..0d89fd574 --- /dev/null +++ b/examples/boost-pba/main.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/botan/CMakeLists.txt b/examples/botan/CMakeLists.txt new file mode 100644 index 000000000..08a67f614 --- /dev/null +++ b/examples/botan/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(botan-example) + +# DOCUMENTATION_START { +hunter_add_package(botan) +find_package(botan-2 CONFIG REQUIRED) + +add_executable(bte boo.cpp) +target_link_libraries(bte PUBLIC PkgConfig::botan-2) +# DOCUMENTATION_END } diff --git a/examples/botan/boo.cpp b/examples/botan/boo.cpp new file mode 100644 index 000000000..99f07307c --- /dev/null +++ b/examples/botan/boo.cpp @@ -0,0 +1,26 @@ +#include +#include +#include + +int main () + { + std::unique_ptr hash1(Botan::HashFunction::create("SHA-256")); + std::unique_ptr hash2(Botan::HashFunction::create("SHA-384")); + std::unique_ptr hash3(Botan::HashFunction::create("SHA-3")); + std::vector buf(2048); + + while(std::cin.good()) + { + //read STDIN to buffer + std::cin.read(reinterpret_cast(buf.data()), buf.size()); + size_t readcount = std::cin.gcount(); + //update hash computations with read data + hash1->update(buf.data(),readcount); + hash2->update(buf.data(),readcount); + hash3->update(buf.data(),readcount); + } + std::cout << "SHA-256: " << Botan::hex_encode(hash1->final()) << std::endl; + std::cout << "SHA-384: " << Botan::hex_encode(hash2->final()) << std::endl; + std::cout << "SHA-3: " << Botan::hex_encode(hash3->final()) << std::endl; + return 0; + } diff --git a/examples/breakpad/CMakeLists.txt b/examples/breakpad/CMakeLists.txt new file mode 100644 index 000000000..bcdf1807b --- /dev/null +++ b/examples/breakpad/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.6) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-breakpad) + +# DOCUMENTATION_START { +hunter_add_package(breakpad) +find_package(breakpad CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC breakpad::libbreakpad) +# DOCUMENTATION_END } diff --git a/examples/breakpad/boo.cpp b/examples/breakpad/boo.cpp new file mode 100644 index 000000000..e0771c06f --- /dev/null +++ b/examples/breakpad/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/bullet/CMakeLists.txt b/examples/bullet/CMakeLists.txt new file mode 100644 index 000000000..a5112aea8 --- /dev/null +++ b/examples/bullet/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-bullet) + +hunter_add_package(bullet) +find_package(bullet CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries( + boo + PUBLIC + bullet::BulletCollision + bullet::BulletDynamics + bullet::BulletSoftBody + bullet::LinearMath +) diff --git a/examples/bullet/boo.cpp b/examples/bullet/boo.cpp new file mode 100644 index 000000000..debcc0b7a --- /dev/null +++ b/examples/bullet/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/c-ares/CMakeLists.txt b/examples/c-ares/CMakeLists.txt new file mode 100644 index 000000000..b45e2b4f8 --- /dev/null +++ b/examples/c-ares/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-c-ares) + +hunter_add_package(c-ares) + +find_package(c-ares CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main c-ares::cares) diff --git a/examples/c-ares/main.cpp b/examples/c-ares/main.cpp new file mode 100644 index 000000000..0279bc42c --- /dev/null +++ b/examples/c-ares/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/carbon/CMakeLists.txt b/examples/carbon/CMakeLists.txt new file mode 100644 index 000000000..6703cf5c8 --- /dev/null +++ b/examples/carbon/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-carbon) + +find_package(carbon REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC carbon::carbon) diff --git a/examples/carbon/foo.mm b/examples/carbon/foo.mm new file mode 100644 index 000000000..3c16393fb --- /dev/null +++ b/examples/carbon/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/catkin/CMakeLists.txt b/examples/catkin/CMakeLists.txt new file mode 100644 index 000000000..49b8f4278 --- /dev/null +++ b/examples/catkin/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_catkin) + +# DOCUMENTATION_START { +hunter_add_package(catkin) +find_package(catkin CONFIG REQUIRED) + +catkin_package() +# DOCUMENTATION_END } diff --git a/examples/catkin/package.xml b/examples/catkin/package.xml new file mode 100644 index 000000000..8e56d224f --- /dev/null +++ b/examples/catkin/package.xml @@ -0,0 +1,11 @@ + + download_catkin + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/cctz/CMakeLists.txt b/examples/cctz/CMakeLists.txt new file mode 100644 index 000000000..9a2481ee9 --- /dev/null +++ b/examples/cctz/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +project(download-cctz) + +# DOCUMENTATION_START { +hunter_add_package(cctz) +find_package(cctz CONFIG REQUIRED) +add_executable(main main.cpp) +target_link_libraries(main cctz::cctz) +# DOCUMENTATION_END } diff --git a/examples/cctz/main.cpp b/examples/cctz/main.cpp new file mode 100644 index 000000000..5889e75f6 --- /dev/null +++ b/examples/cctz/main.cpp @@ -0,0 +1,8 @@ +#include + +int main() +{ + cctz::time_zone syd; + cctz::load_time_zone("Australia/Sydney", &syd); + return 0; +} diff --git a/examples/ceres-solver-suitesparse-dynLAPACK/CMakeLists.txt b/examples/ceres-solver-suitesparse-dynLAPACK/CMakeLists.txt new file mode 100644 index 000000000..b46acdcdc --- /dev/null +++ b/examples/ceres-solver-suitesparse-dynLAPACK/CMakeLists.txt @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-ceres-solver) +# build LAPACK as shared library +#hunter_config(LAPACK +# VERSION ${HUNTER_LAPACK_VERSION} +# CMAKE_ARGS BUILD_SHARED_LIBS=ON +#) +# as alternative build LAPACK as static lib by removing the above lines from config.cmake +# If doing so you need to enable Fortran support +# enable_language(Fortran) +# build LAPACK as shared library + +hunter_add_package(ceres-solver) + +find_package(Ceres CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo ceres) + diff --git a/examples/ceres-solver-suitesparse-dynLAPACK/config.cmake b/examples/ceres-solver-suitesparse-dynLAPACK/config.cmake new file mode 100644 index 000000000..dbc2f81cc --- /dev/null +++ b/examples/ceres-solver-suitesparse-dynLAPACK/config.cmake @@ -0,0 +1,10 @@ +hunter_config(ceres-solver + VERSION ${HUNTER_ceres-solver_VERSION} CMAKE_ARGS + LAPACK=ON + SUITESPARSE=ON + CXSPARSE=ON # since 1.14.0-p1 +) +hunter_config(LAPACK + VERSION ${HUNTER_LAPACK_VERSION} + CMAKE_ARGS BUILD_SHARED_LIBS=ON +) diff --git a/examples/ceres-solver-suitesparse-dynLAPACK/foo.cpp b/examples/ceres-solver-suitesparse-dynLAPACK/foo.cpp new file mode 100644 index 000000000..0bae395a1 --- /dev/null +++ b/examples/ceres-solver-suitesparse-dynLAPACK/foo.cpp @@ -0,0 +1,43 @@ +#include +#include + +using ceres::AutoDiffCostFunction; +using ceres::CostFunction; +using ceres::Problem; +using ceres::Solver; +using ceres::Solve; + +struct ModelConst +{ + // Calculate the residuals, + // the input parameters are the ones optimized for + template + bool operator()(const T* const x, + T* residual) const { + residual[0] = T(42) - x[0]; + return true; + } +}; +int main(int argc, char* argv[]) { + Problem problem; + // variable to optimize in place + double x = 0; + Solver::Options options; + Solver::Summary summary; + + // use a sparse solver explicitly + options.linear_solver_type = ceres::SPARSE_NORMAL_CHOLESKY; + + // print minimizer output + options.minimizer_progress_to_stdout = true; + + // AutoDiffCostFunction + CostFunction* cost_fun + = new AutoDiffCostFunction( + new ModelConst()); + problem.AddResidualBlock(cost_fun, NULL, &x); + Solve(options, &problem, &summary); + + // output optimized result + std::cout << "x: " << x << std::endl; +} diff --git a/examples/ceres-solver-suitesparse/CMakeLists.txt b/examples/ceres-solver-suitesparse/CMakeLists.txt new file mode 100644 index 000000000..db2fd3d79 --- /dev/null +++ b/examples/ceres-solver-suitesparse/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-ceres-solver) +# enable Fortran support, needed for LAPACK static libs +enable_language(Fortran) +# as alternative LAPACK can be built as shared lib by adding +# the following lines to config.cmake (uncommented) +#hunter_config(LAPACK +# VERSION ${HUNTER_LAPACK_VERSION} +# CMAKE_ARGS BUILD_SHARED_LIBS=ON +#) + +hunter_add_package(ceres-solver) + +find_package(Ceres CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo ceres) + diff --git a/examples/ceres-solver-suitesparse/config.cmake b/examples/ceres-solver-suitesparse/config.cmake new file mode 100644 index 000000000..355e7a46a --- /dev/null +++ b/examples/ceres-solver-suitesparse/config.cmake @@ -0,0 +1,6 @@ +hunter_config(ceres-solver + VERSION ${HUNTER_ceres-solver_VERSION} CMAKE_ARGS + LAPACK=ON + SUITESPARSE=ON + CXSPARSE=ON # since 1.14.0-p1 +) diff --git a/examples/ceres-solver-suitesparse/foo.cpp b/examples/ceres-solver-suitesparse/foo.cpp new file mode 100644 index 000000000..0bae395a1 --- /dev/null +++ b/examples/ceres-solver-suitesparse/foo.cpp @@ -0,0 +1,43 @@ +#include +#include + +using ceres::AutoDiffCostFunction; +using ceres::CostFunction; +using ceres::Problem; +using ceres::Solver; +using ceres::Solve; + +struct ModelConst +{ + // Calculate the residuals, + // the input parameters are the ones optimized for + template + bool operator()(const T* const x, + T* residual) const { + residual[0] = T(42) - x[0]; + return true; + } +}; +int main(int argc, char* argv[]) { + Problem problem; + // variable to optimize in place + double x = 0; + Solver::Options options; + Solver::Summary summary; + + // use a sparse solver explicitly + options.linear_solver_type = ceres::SPARSE_NORMAL_CHOLESKY; + + // print minimizer output + options.minimizer_progress_to_stdout = true; + + // AutoDiffCostFunction + CostFunction* cost_fun + = new AutoDiffCostFunction( + new ModelConst()); + problem.AddResidualBlock(cost_fun, NULL, &x); + Solve(options, &problem, &summary); + + // output optimized result + std::cout << "x: " << x << std::endl; +} diff --git a/examples/ceres-solver/CMakeLists.txt b/examples/ceres-solver/CMakeLists.txt new file mode 100644 index 000000000..e1fe6607d --- /dev/null +++ b/examples/ceres-solver/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-ceres-solver) + +hunter_add_package(ceres-solver) + +find_package(Ceres CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo ceres) + diff --git a/examples/ceres-solver/foo.cpp b/examples/ceres-solver/foo.cpp new file mode 100644 index 000000000..986630a72 --- /dev/null +++ b/examples/ceres-solver/foo.cpp @@ -0,0 +1,36 @@ +#include +#include + +using ceres::AutoDiffCostFunction; +using ceres::CostFunction; +using ceres::Problem; +using ceres::Solver; +using ceres::Solve; + +struct ModelEqual2 +{ + // Calculate the residuals, + // the input parameters are the ones optimized for + template + bool operator()(const T* const x, + T* residual) const { + residual[0] = T(2) - x[0]; + return true; + } +}; +int main(int argc, char* argv[]) { + Problem problem; + // variable to optimize in place + double x = 0; + Solver::Options options; + Solver::Summary summary; + // AutoDiffCostFunction + CostFunction* cost_fun + = new AutoDiffCostFunction( + new ModelEqual2()); + problem.AddResidualBlock(cost_fun, NULL, &x); + Solve(options, &problem, &summary); + + // output optimized result + std::cout << "x: " << x << std::endl; +} diff --git a/examples/check_ci_tag/CMakeLists.txt b/examples/check_ci_tag/CMakeLists.txt new file mode 100644 index 000000000..de98cbdf5 --- /dev/null +++ b/examples/check_ci_tag/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +# Mimic Travis environment for testing { +set(ENV{TRAVIS_TAG} "v1.0.0") +# } + +# DOCUMENTATION_START { +project(foo VERSION 1.0.0) + +hunter_add_package(check_ci_tag) +find_package(check_ci_tag CONFIG REQUIRED) + +# Read environment variables like TRAVIS_TAG/APPVEYOR_REPO_TAG_NAME +# and check they match PROJECT_VERSION +check_ci_tag() +# DOCUMENTATION_END } diff --git a/examples/civetweb/CMakeLists.txt b/examples/civetweb/CMakeLists.txt new file mode 100644 index 000000000..e02f004e9 --- /dev/null +++ b/examples/civetweb/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-civetweb) + +hunter_add_package(civetweb) +find_package(civetweb CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC civetweb::civetweb-c-library) diff --git a/examples/civetweb/boo.cpp b/examples/civetweb/boo.cpp new file mode 100644 index 000000000..1c6b80590 --- /dev/null +++ b/examples/civetweb/boo.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + unsigned features = 0; + return mg_init_library(features); +} diff --git a/examples/class_loader/CMakeLists.txt b/examples/class_loader/CMakeLists.txt new file mode 100644 index 000000000..65f0a64d4 --- /dev/null +++ b/examples/class_loader/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-class_loader) + +# DOCUMENTATION_START { +hunter_add_package(class_loader) +find_package(catkin CONFIG REQUIRED COMPONENTS class_loader) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/class_loader/main.cpp b/examples/class_loader/main.cpp new file mode 100644 index 000000000..4af5bd2a2 --- /dev/null +++ b/examples/class_loader/main.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/class_loader/package.xml b/examples/class_loader/package.xml new file mode 100644 index 000000000..6c2d84b5b --- /dev/null +++ b/examples/class_loader/package.xml @@ -0,0 +1,12 @@ + + download-class_loader + 0.0.0 + + This package provides foo capability. + + Krasimir Georgiev + BSD + + catkin + + diff --git a/examples/cmcstl2/CMakeLists.txt b/examples/cmcstl2/CMakeLists.txt new file mode 100644 index 000000000..58f969abe --- /dev/null +++ b/examples/cmcstl2/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cmcstl2) + +# DOCUMENTATION_START { +hunter_add_package(cmcstl2) +find_package(cmcstl2 CONFIG REQUIRED) + +add_executable(simple simple.cpp) +target_link_libraries(simple stl2) +# DOCUMENTATION_END } diff --git a/examples/cmcstl2/simple.cpp b/examples/cmcstl2/simple.cpp new file mode 100644 index 000000000..ac25d9175 --- /dev/null +++ b/examples/cmcstl2/simple.cpp @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include +#include + +// Qualify everything with "std::experimental::ranges" if you like, +// I prefer to use a namespace alias: +namespace ranges = std::experimental::ranges; + +template class show_type; + +template +void foo(T&) {} + +int main() { + auto v = std::vector{ "this", "is", "a", "test" }; + ranges::sort(v); + auto out = ranges::ostream_iterator{ std::cout, " " }; + ranges::copy(v, out); + std::cout << '\n'; + auto result = ranges::reverse_copy(v, out); + std::cout << '\n'; + return !(result.in == ranges::end(v)); +} diff --git a/examples/coreaudio/CMakeLists.txt b/examples/coreaudio/CMakeLists.txt new file mode 100644 index 000000000..760a57765 --- /dev/null +++ b/examples/coreaudio/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-coreaudio) + +find_package(coreaudio REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC coreaudio::coreaudio) diff --git a/examples/coreaudio/foo.mm b/examples/coreaudio/foo.mm new file mode 100644 index 000000000..3e971c84a --- /dev/null +++ b/examples/coreaudio/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/coretext/CMakeLists.txt b/examples/coretext/CMakeLists.txt new file mode 100644 index 000000000..bd19ec682 --- /dev/null +++ b/examples/coretext/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-coretext) + +find_package(coretext REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC coretext::coretext) diff --git a/examples/coretext/foo.mm b/examples/coretext/foo.mm new file mode 100644 index 000000000..96e484e0f --- /dev/null +++ b/examples/coretext/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/corrade/CMakeLists.txt b/examples/corrade/CMakeLists.txt new file mode 100644 index 000000000..985dd3bd0 --- /dev/null +++ b/examples/corrade/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-corrade) + +# DOCUMENTATION_START { +set(components Containers Interconnect PluginManager TestSuite Utility) + +foreach(comp ${components}) + list(APPEND components_with_prefix Corrade::${comp}) +endforeach() + +hunter_add_package(corrade) +find_package(Corrade CONFIG REQUIRED COMPONENTS ${components}) + +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE ${components_with_prefix}) +# DOCUMENTATION_END } diff --git a/examples/corrade/foo.cpp b/examples/corrade/foo.cpp new file mode 100644 index 000000000..ce61fb25f --- /dev/null +++ b/examples/corrade/foo.cpp @@ -0,0 +1,83 @@ +// Copy of https://raw.githubusercontent.com/mosra/corrade/master/src/examples/interconnect/main.cpp +/* + This file is part of Corrade. + + Original authors — credit is appreciated but not required: + + 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 + — Vladimír Vondruš + + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or distribute + this software, either in source code form or as a compiled binary, for any + purpose, commercial or non-commercial, and by any means. + + In jurisdictions that recognize copyright laws, the author or authors of + this software dedicate any and all copyright interest in the software to + the public domain. We make this dedication for the benefit of the public + at large and to the detriment of our heirs and successors. We intend this + dedication to be an overt act of relinquishment in perpetuity of all + present and future rights to this software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 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. +*/ + +#include +#include +#include +#include + +using namespace Corrade; + +class RemoteControl: public Interconnect::Emitter { + public: + Signal triggered(const std::string& password, int timeout) { + return emit(&RemoteControl::triggered, password, timeout); + } +}; + +class Bomb: public Interconnect::Receiver { + public: + void launch(const std::string& password, int timeout); +}; + +void Bomb::launch(const std::string& password, int timeout) { + if(password != "terrorist69") { + Utility::Error{} << "Wrong password. No apocalypse will be performed."; + return; + } + + Utility::Warning{} << "Launching bomb in" << timeout << "seconds."; + + // ... + + delete this; // commit suicide +} + +int main() { + RemoteControl rc; + Bomb *bomb1 = new Bomb, + *bomb2 = new Bomb, + *bomb3 = new Bomb; + + Interconnect::connect(rc, &RemoteControl::triggered, *bomb1, &Bomb::launch); + Interconnect::connect(rc, &RemoteControl::triggered, *bomb2, &Bomb::launch); + Interconnect::connect(rc, &RemoteControl::triggered, *bomb3, &Bomb::launch); + + Utility::Debug{} << "Successfully installed" << rc.signalConnectionCount() + << "bombs."; + + rc.triggered("terrorist69", 60); // Launch all connected bombs after 60 seconds + + if(rc.signalConnectionCount()) + Utility::Fatal{1} << "Mission failed!" << rc.signalConnectionCount() + << "bombs didn't explode!"; + + Utility::Debug{} << "Mission succeeded!"; +} diff --git a/examples/cpp_redis/CMakeLists.txt b/examples/cpp_redis/CMakeLists.txt new file mode 100644 index 000000000..d242a2341 --- /dev/null +++ b/examples/cpp_redis/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cpp_redis) + +# download cpp_redis +hunter_add_package(cpp_redis) + +# now cpp_redis can be used +find_package(cpp_redis CONFIG REQUIRED) + +add_executable(foo foo.cpp) +set_property(TARGET foo PROPERTY CXX_STANDARD 11) +target_link_libraries(foo cpp_redis::cpp_redis) diff --git a/examples/cpp_redis/foo.cpp b/examples/cpp_redis/foo.cpp new file mode 100644 index 000000000..88467fccd --- /dev/null +++ b/examples/cpp_redis/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/cppcodec/CMakeLists.txt b/examples/cppcodec/CMakeLists.txt new file mode 100644 index 000000000..c687684f0 --- /dev/null +++ b/examples/cppcodec/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cppcodec) + +# DOCUMENTATION_START { +hunter_add_package(cppcodec) +find_package(cppcodec CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC cppcodec::cppcodec) +# DOCUMENTATION_END } diff --git a/examples/cppcodec/boo.cpp b/examples/cppcodec/boo.cpp new file mode 100644 index 000000000..98cc314a5 --- /dev/null +++ b/examples/cppcodec/boo.cpp @@ -0,0 +1,39 @@ +/** + * This is free and unencumbered software released into the public domain. + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER 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. + * + * For more information, please refer to + */ + +#include +#include +#include + +int main() { + using base32 = cppcodec::base32_crockford; + using base64 = cppcodec::base64_rfc4648; + + std::vector decoded = base64::decode("YW55IGNhcm5hbCBwbGVhc3VyZQ=="); + std::cout << "decoded size (\"any carnal pleasure\"): " << decoded.size() << '\n'; + std::cout << base32::encode(decoded) << std::endl; // "C5Q7J833C5S6WRBC41R6RSB1EDTQ4S8" + return 0; +} diff --git a/examples/cpr/CMakeLists.txt b/examples/cpr/CMakeLists.txt new file mode 100644 index 000000000..b471f164f --- /dev/null +++ b/examples/cpr/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cpr) + +hunter_add_package(cpr) +find_package(cpr CONFIG REQUIRED) + +add_executable(cpr_example example.cpp) +target_link_libraries(cpr_example cpr::cpr) diff --git a/examples/cpr/example.cpp b/examples/cpr/example.cpp new file mode 100644 index 000000000..565a149bd --- /dev/null +++ b/examples/cpr/example.cpp @@ -0,0 +1,10 @@ +#include +#include + +int main(int argc, char** argv) { + auto r = cpr::Get(cpr::Url{ "http://www.httpbin.org/get" }); + std::cout << r.url << std::endl; // http://www.httpbin.org/get + std::cout << r.status_code << std::endl; // 200 + std::cout << r.header["content-type"] << std::endl; // application/json + std::cout << r.text << std::endl; +} diff --git a/examples/cpuinfo/CMakeLists.txt b/examples/cpuinfo/CMakeLists.txt new file mode 100644 index 000000000..51ffcd098 --- /dev/null +++ b/examples/cpuinfo/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cpuinfo) + +# DOCUMENTATION_START { +hunter_add_package(cpuinfo) +find_package(cpuinfo CONFIG REQUIRED) + +add_executable(test example.cpp) +target_link_libraries(test cpuinfo::cpuinfo) +# DOCUMENTATION_END } + diff --git a/examples/cpuinfo/example.cpp b/examples/cpuinfo/example.cpp new file mode 100644 index 000000000..5054cb829 --- /dev/null +++ b/examples/cpuinfo/example.cpp @@ -0,0 +1,10 @@ +#include +#include + +int main(int argc, char** argv) { + if (cpuinfo_initialize()) + { + return 0; + } + return 1; +} diff --git a/examples/crc32c/CMakeLists.txt b/examples/crc32c/CMakeLists.txt new file mode 100644 index 000000000..19a3ce459 --- /dev/null +++ b/examples/crc32c/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-crc32c) + +hunter_add_package(crc32c) + +find_package(crc32c CONFIG REQUIRED) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +add_executable(main main.cpp) +target_link_libraries(main crc32c::crc32c) diff --git a/examples/crc32c/main.cpp b/examples/crc32c/main.cpp new file mode 100644 index 000000000..3e884071c --- /dev/null +++ b/examples/crc32c/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/cryptopp/CMakeLists.txt b/examples/cryptopp/CMakeLists.txt new file mode 100644 index 000000000..3ad18f8e7 --- /dev/null +++ b/examples/cryptopp/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cryptopp) + +# DOCUMENTATION_START { +hunter_add_package(cryptopp) +find_package(cryptopp CONFIG REQUIRED) + +add_executable(cryptopp-test main.cpp) +target_link_libraries(cryptopp-test PRIVATE cryptopp-static) +# DOCUMENTATION_END } diff --git a/examples/cryptopp/main.cpp b/examples/cryptopp/main.cpp new file mode 100644 index 000000000..133154f34 --- /dev/null +++ b/examples/cryptopp/main.cpp @@ -0,0 +1,21 @@ +#include +#include +#include +#include + +int main() { + CryptoPP::byte digest[ CryptoPP::SHA1::DIGESTSIZE ]; + std::string message = "abcdefghijklmnopqrstuvwxyz"; + + CryptoPP::SHA1 hash; + hash.CalculateDigest( digest, (const CryptoPP::byte*)message.c_str(), message.length() ); + + CryptoPP::HexEncoder encoder; + std::string output; + + encoder.Attach( new CryptoPP::StringSink( output ) ); + encoder.Put( digest, sizeof(digest) ); + encoder.MessageEnd(); + + std::cout << output << std::endl; +} diff --git a/examples/ctti/CMakeLists.txt b/examples/ctti/CMakeLists.txt new file mode 100644 index 000000000..9c2bad0a3 --- /dev/null +++ b/examples/ctti/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ctti) + +# DOCUMENTATION_START { +hunter_add_package(ctti) +find_package(ctti CONFIG REQUIRED) + +add_executable(ctti_test main.cpp) +target_link_libraries(ctti_test ctti::ctti) +# DOCUMENTATION_END } diff --git a/examples/ctti/main.cpp b/examples/ctti/main.cpp new file mode 100644 index 000000000..95db4ee3d --- /dev/null +++ b/examples/ctti/main.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +struct foo +{ + int i=0; +}; + +int f(const std::string&, int) +{ + return 42; +} + +enum class bar_enum +{ + FOO, + BAR, + QUUX +}; + +int main() +{ + static_assert(ctti::type_id()!=ctti::type_id(), "what?"); + + std::cout<()<()<()<()<<" -> "<()<()<<" -> "<()<()<()< +#include +#include + +#include + +int main() { +} diff --git a/examples/cvsteer/CMakeLists.txt b/examples/cvsteer/CMakeLists.txt new file mode 100644 index 000000000..b5ce1e8b2 --- /dev/null +++ b/examples/cvsteer/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cvsteer) + +# DOCUMENTATION_START { +hunter_add_package(cvsteer) +find_package(cvsteer CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC cvsteer::cvsteer) +# DOCUMENTATION_END } diff --git a/examples/cvsteer/foo.cpp b/examples/cvsteer/foo.cpp new file mode 100644 index 000000000..ca34cb668 --- /dev/null +++ b/examples/cvsteer/foo.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + cv::Mat1f image = cv::Mat1f::zeros(128, 128); + fa::SteerableFiltersG2 filters(image, 4, 0.67f); +} diff --git a/examples/cxxopts/CMakeLists.txt b/examples/cxxopts/CMakeLists.txt new file mode 100644 index 000000000..2dc4ed1c7 --- /dev/null +++ b/examples/cxxopts/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-cxxopts) + +# DOCUMENTATION_START { +hunter_add_package(cxxopts) +find_package(cxxopts CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC cxxopts::cxxopts) +# DOCUMENTATION_END } diff --git a/examples/cxxopts/boo.cpp b/examples/cxxopts/boo.cpp new file mode 100644 index 000000000..b54177406 --- /dev/null +++ b/examples/cxxopts/boo.cpp @@ -0,0 +1,138 @@ +/* + +Copyright (c) 2014 Jarryd Beck + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +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. + +*/ + +#include + +#include "cxxopts.hpp" + +int main(int argc, char* argv[]) +{ + try + { + cxxopts::Options options(argv[0], " - example command line options"); + options + .positional_help("[optional args]") + .show_positional_help(); + + bool apple = false; + + options.add_options() + ("a,apple", "an apple", cxxopts::value(apple)) + ("b,bob", "Bob") + ("f, file", "File", cxxopts::value>(), "FILE") + ("i,input", "Input", cxxopts::value()) + ("o,output", "Output file", cxxopts::value() + ->default_value("a.out")->implicit_value("b.def"), "BIN") + ("positional", + "Positional arguments: these are the arguments that are entered " + "without an option", cxxopts::value>()) + ("long-description", + "thisisareallylongwordthattakesupthewholelineandcannotbebrokenataspace") + ("help", "Print help") + ("int", "An integer", cxxopts::value(), "N") + ("float", "A floating point number", cxxopts::value()) + ("option_that_is_too_long_for_the_help", "A very long option") + #ifdef CXXOPTS_USE_UNICODE + ("unicode", u8"A help option with non-ascii: à. Here the size of the" + " string should be correct") + #endif + ; + + options.add_options("Group") + ("c,compile", "compile") + ("d,drop", "drop", cxxopts::value>()); + + options.parse_positional({"input", "output", "positional"}); + + auto result = options.parse(argc, argv); + + if (result.count("help")) + { + std::cout << options.help({"", "Group"}) << std::endl; + exit(0); + } + + if (apple) + { + std::cout << "Saw option ‘a’ " << result.count("a") << " times " << + std::endl; + } + + if (result.count("b")) + { + std::cout << "Saw option ‘b’" << std::endl; + } + + if (result.count("f")) + { + auto& ff = result["f"].as>(); + std::cout << "Files" << std::endl; + for (const auto& f : ff) + { + std::cout << f << std::endl; + } + } + + if (result.count("input")) + { + std::cout << "Input = " << result["input"].as() + << std::endl; + } + + if (result.count("output")) + { + std::cout << "Output = " << result["output"].as() + << std::endl; + } + + if (result.count("positional")) + { + std::cout << "Positional = {"; + auto& v = result["positional"].as>(); + for (const auto& s : v) { + std::cout << s << ", "; + } + std::cout << "}" << std::endl; + } + + if (result.count("int")) + { + std::cout << "int = " << result["int"].as() << std::endl; + } + + if (result.count("float")) + { + std::cout << "float = " << result["float"].as() << std::endl; + } + + std::cout << "Arguments remain = " << argc << std::endl; + + } catch (const cxxopts::OptionException& e) + { + std::cout << "error parsing options: " << e.what() << std::endl; + exit(1); + } + + return 0; +} diff --git a/examples/czmq/CMakeLists.txt b/examples/czmq/CMakeLists.txt new file mode 100644 index 000000000..2ecddedbc --- /dev/null +++ b/examples/czmq/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required (VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("${CMAKE_CURRENT_SOURCE_DIR}/../common.cmake") + +project(download-czmq) + +#set(THREADS_PREFER_PTHREAD_FLAG ON) + +hunter_add_package(czmq) +find_package(czmq REQUIRED CONFIG) + +add_executable(main main.cpp) +target_link_libraries(main czmq::czmq) diff --git a/examples/czmq/main.cpp b/examples/czmq/main.cpp new file mode 100644 index 000000000..fd6afa5c6 --- /dev/null +++ b/examples/czmq/main.cpp @@ -0,0 +1,17 @@ +#include + + +int main() +{ + zsock_t *push = zsock_new_push ("inproc://example"); + zsock_t *pull = zsock_new_pull ("inproc://example"); + zstr_send (push, "Hello, World"); + + char *string = zstr_recv (pull); + puts (string); + zstr_free (&string); + + zsock_destroy (&pull); + zsock_destroy (&push); + return 0; +} diff --git a/examples/date/CMakeLists.txt b/examples/date/CMakeLists.txt new file mode 100644 index 000000000..180b3ee1d --- /dev/null +++ b/examples/date/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-date) + +# DOCUMENTATION_START { +hunter_add_package(date) +find_package(date CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC date_interface) +# DOCUMENTATION_END } diff --git a/examples/date/boo.cpp b/examples/date/boo.cpp new file mode 100644 index 000000000..30fc3caee --- /dev/null +++ b/examples/date/boo.cpp @@ -0,0 +1,10 @@ +#include +#include + +int main() { + using namespace date; + using namespace std::chrono; + + auto today = floor(system_clock::now()); + std::cout << today << '\n'; +} diff --git a/examples/debug_assert/CMakeLists.txt b/examples/debug_assert/CMakeLists.txt new file mode 100644 index 000000000..4a22ad7b8 --- /dev/null +++ b/examples/debug_assert/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016 Alexey Ulyanov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-debug_assert) +set(CMAKE_CXX_STANDARD 11) + +hunter_add_package(debug_assert) + +find_package(debug_assert CONFIG REQUIRED) + +set(SOURCES main.cpp) + +add_executable(debug_assert_example ${SOURCES}) +target_link_libraries(debug_assert_example PUBLIC debug_assert) diff --git a/examples/debug_assert/main.cpp b/examples/debug_assert/main.cpp new file mode 100644 index 000000000..882bb3e06 --- /dev/null +++ b/examples/debug_assert/main.cpp @@ -0,0 +1,68 @@ +#include "debug_assert.hpp" + +#include +#include + +//=== module A ===// +#define MODULE_A_LEVEL 1 // macro to control assertion level +// usually set by the build system + +// tag type that defines a module +struct module_a +: debug_assert::default_handler, // it uses the default handler + debug_assert::set_level // and this level +{}; + +void module_a_func(void* ptr) +{ + DEBUG_ASSERT(ptr, module_a{}); // minimal assertion + DEBUG_ASSERT(2 + 2 == 4, module_a{}, debug_assert::level<2>{}); // assertion with level + DEBUG_ASSERT(1 == 0, module_a{}, "this should be true"); // assertion with additional parameters, i.e. a message + DEBUG_UNREACHABLE(module_a{}); // mark unreachable statements +} + +//=== module B ===// +#define MODULE_B_LEVEL 2 + +struct module_b +: debug_assert::set_level// b uses all assertions with level <= 2 +{ + // module b uses a different handler + // it does not support a message + // instead you can specify a pointer value + static void handle(const debug_assert::source_location& loc, const char* expression, void* ptr = nullptr) + { + std::cerr << "Assertion failure '" << loc.file_name << ':' << loc.line_number << ": " << expression; + if (ptr) + std::cerr << " - pointer is " << ptr; + std::cerr << '\n'; + } +}; + +void module_b_func(int &value, void* ptr) +{ + DEBUG_ASSERT(ptr == &value, module_b{}, ptr); // uses the additional custom parameter + DEBUG_ASSERT(ptr == &value, module_b{}, debug_assert::level<2>{}, ptr); // also works with a custom level +} + +int main() +{ + auto old_handler = std::signal(SIGABRT, [](int signal) + { + if(signal == SIGABRT) + { + std::cerr << "Please never call std::abort() in production :)"; + std::exit(EXIT_SUCCESS); + } + }); + + if(old_handler == SIG_ERR) + { + std::cerr << "Error settings custom SIGABRT handler"; + return EXIT_FAILURE; + } + + module_a_func(nullptr); + int val = 5; + module_b_func(val, &val); +} \ No newline at end of file diff --git a/examples/dlib-staticLib/CMakeLists.txt b/examples/dlib-staticLib/CMakeLists.txt new file mode 100644 index 000000000..7e261e557 --- /dev/null +++ b/examples/dlib-staticLib/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) #set DLIB_HEADER_ONLY=OFF +include("../common.cmake") + +project(download-dlib) + +hunter_add_package(dlib) +find_package(dlib CONFIG REQUIRED) + +add_executable(timer_ex timer_ex.cpp) +target_link_libraries(timer_ex dlib::dlib) diff --git a/examples/dlib-staticLib/config.cmake b/examples/dlib-staticLib/config.cmake new file mode 100644 index 000000000..c348605e0 --- /dev/null +++ b/examples/dlib-staticLib/config.cmake @@ -0,0 +1,5 @@ +hunter_config(dlib + VERSION ${HUNTER_dlib_VERSION} + CMAKE_ARGS + DLIB_HEADER_ONLY=OFF +) diff --git a/examples/dlib-staticLib/timer_ex.cpp b/examples/dlib-staticLib/timer_ex.cpp new file mode 100644 index 000000000..e1d554926 --- /dev/null +++ b/examples/dlib-staticLib/timer_ex.cpp @@ -0,0 +1,56 @@ +// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt + + +/* + This is an example illustrating the use of the timer object from the dlib C++ Library. + + The timer is an object that calls some user specified member function at regular + intervals from another thread. +*/ + + +#include +#include // for dlib::sleep +#include + +using namespace dlib; +using namespace std; + +// ---------------------------------------------------------------------------------------- + +class timer_example +{ +public: + void action_function() + { + // print out a message so we can see that this function is being triggered + cout << "action_function() called" << endl; + } +}; + +// ---------------------------------------------------------------------------------------- + +int main() +{ + timer_example e; + + // Here we construct our timer object. It needs two things. The second argument is + // the member function it is going to call at regular intervals and the first argument + // is the object instance it will call that member function on. + timer t(e, &timer_example::action_function); + + // Set the timer object to trigger every second + t.set_delay_time(1000); + + // Start the timer. It will start calling the action function 1 second from this call + // to start. + t.start(); + + // Sleep for 10 seconds before letting the program end. + dlib::sleep(10000); + + // The timer will destruct itself properly and stop calling the action_function. +} + +// ---------------------------------------------------------------------------------------- + diff --git a/examples/dlpack/CMakeLists.txt b/examples/dlpack/CMakeLists.txt new file mode 100644 index 000000000..3515100ac --- /dev/null +++ b/examples/dlpack/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-dlpack) + +# DOCUMENTATION_START { +hunter_add_package(dlpack) +find_package(dlpack CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC dlpack::dlpack) +# DOCUMENTATION_END } diff --git a/examples/dlpack/boo.cpp b/examples/dlpack/boo.cpp new file mode 100644 index 000000000..785ce08ac --- /dev/null +++ b/examples/dlpack/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/dmlc-core/CMakeLists.txt b/examples/dmlc-core/CMakeLists.txt new file mode 100644 index 000000000..bb6bc8904 --- /dev/null +++ b/examples/dmlc-core/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-dmlc-core) + +# DOCUMENTATION_START { +hunter_add_package(dmlc-core) +find_package(dmlc CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC dmlc::dmlc) +# DOCUMENTATION_END } diff --git a/examples/dmlc-core/foo.cpp b/examples/dmlc-core/foo.cpp new file mode 100644 index 000000000..edac8ea4a --- /dev/null +++ b/examples/dmlc-core/foo.cpp @@ -0,0 +1,62 @@ +// This is an example program showing usage of parameter module +// Build, on root folder, type +// +// make example +// +// Example usage: +// +// example/parameter num_hidden=100 name=aaa activation=relu +// + +#include + +struct MyParam : public dmlc::Parameter { + float learning_rate; + int num_hidden; + int activation; + std::string name; + // declare parameters in header file + DMLC_DECLARE_PARAMETER(MyParam) { + DMLC_DECLARE_FIELD(num_hidden).set_range(0, 1000) + .describe("Number of hidden unit in the fully connected layer."); + DMLC_DECLARE_FIELD(learning_rate).set_default(0.01f) + .describe("Learning rate of SGD optimization."); + DMLC_DECLARE_FIELD(activation).add_enum("relu", 1).add_enum("sigmoid", 2) + .describe("Activation function type."); + DMLC_DECLARE_FIELD(name).set_default("mnet") + .describe("Name of the net."); + + // user can also set nhidden besides num_hidden + DMLC_DECLARE_ALIAS(num_hidden, nhidden); + DMLC_DECLARE_ALIAS(activation, act); + } +}; + +// register it in cc file +DMLC_REGISTER_PARAMETER(MyParam); + +int main(int argc, char *argv[]) { + if (argc == 1) { + printf("Usage: [key=value] ...\n"); + return 0; + } + + MyParam param; + std::map kwargs; + for (int i = 0; i < argc; ++i) { + char name[256], val[256]; + if (sscanf(argv[i], "%[^=]=%[^\n]", name, val) == 2) { + kwargs[name] = val; + } + } + printf("Docstring\n---------\n%s", MyParam::__DOC__().c_str()); + + printf("start to set parameters ...\n"); + param.Init(kwargs); + printf("-----\n"); + printf("param.num_hidden=%d\n", param.num_hidden); + printf("param.learning_rate=%f\n", param.learning_rate); + printf("param.name=%s\n", param.name.c_str()); + printf("param.activation=%d\n", param.activation); + return 0; +} diff --git a/examples/doctest/CMakeLists.txt b/examples/doctest/CMakeLists.txt new file mode 100644 index 000000000..519bea163 --- /dev/null +++ b/examples/doctest/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-doctest) + + +hunter_add_package(doctest) + +find_package(doctest CONFIG REQUIRED) + +set(SOURCES foo_test_main.cpp + foo_test.cpp + foo.cpp) +set(HEADERS foo.hpp) + +add_executable(doctest_test ${SOURCES} ${HEADERS}) +target_link_libraries(doctest_test PUBLIC doctest::doctest) + +enable_testing(true) +add_test(NAME doctest_test COMMAND doctest_test) diff --git a/examples/doctest/foo.cpp b/examples/doctest/foo.cpp new file mode 100644 index 000000000..ba1ac1116 --- /dev/null +++ b/examples/doctest/foo.cpp @@ -0,0 +1,5 @@ +#include "foo.hpp" + +namespace foo { + bool return_true() { return true; } +} diff --git a/examples/doctest/foo.hpp b/examples/doctest/foo.hpp new file mode 100644 index 000000000..51464d67a --- /dev/null +++ b/examples/doctest/foo.hpp @@ -0,0 +1,9 @@ +#ifndef FOO_H +#define DOCTEST_H +#pragma once + +namespace foo { + bool return_true(); +} + +#endif diff --git a/examples/doctest/foo_test.cpp b/examples/doctest/foo_test.cpp new file mode 100644 index 000000000..4e7dd7114 --- /dev/null +++ b/examples/doctest/foo_test.cpp @@ -0,0 +1,9 @@ +#include +#include "foo.hpp" + +namespace foo { + TEST_CASE("foo_test") { + REQUIRE_NOTHROW(return_true()); + REQUIRE(true == return_true()); + } +} diff --git a/examples/doctest/foo_test_main.cpp b/examples/doctest/foo_test_main.cpp new file mode 100644 index 000000000..b8e3a4bf1 --- /dev/null +++ b/examples/doctest/foo_test_main.cpp @@ -0,0 +1,2 @@ +#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN +#include diff --git a/examples/double-conversion/CMakeLists.txt b/examples/double-conversion/CMakeLists.txt new file mode 100644 index 000000000..5e7445bfc --- /dev/null +++ b/examples/double-conversion/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-double-conversion) + +hunter_add_package(double-conversion) + +# now double-conversion can be used +find_package(double-conversion CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main double-conversion::double-conversion) diff --git a/examples/double-conversion/main.cpp b/examples/double-conversion/main.cpp new file mode 100644 index 000000000..9b1f29b28 --- /dev/null +++ b/examples/double-conversion/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/draco/CMakeLists.txt b/examples/draco/CMakeLists.txt new file mode 100644 index 000000000..ba4825430 --- /dev/null +++ b/examples/draco/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-draco) + +# DOCUMENTATION_START { +hunter_add_package(draco) +find_package(draco CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC draco::draco) +# DOCUMENTATION_END } diff --git a/examples/draco/boo.cpp b/examples/draco/boo.cpp new file mode 100644 index 000000000..98c8f271d --- /dev/null +++ b/examples/draco/boo.cpp @@ -0,0 +1,7 @@ +#include +#include + +int main() { + draco::DecoderBuffer buffer; + buffer.Init(nullptr, 0); +} diff --git a/examples/drishti/CMakeLists.txt b/examples/drishti/CMakeLists.txt new file mode 100644 index 000000000..3b6f58129 --- /dev/null +++ b/examples/drishti/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-drishti) + +# DOCUMENTATION_START { +hunter_add_package(drishti) +find_package(drishti CONFIG REQUIRED) + +add_executable(drishti foo.cpp) +target_link_libraries(drishti PUBLIC drishti::drishti) +# DOCUMENTATION_END } diff --git a/examples/drishti/config.cmake b/examples/drishti/config.cmake new file mode 100644 index 000000000..8d63c437b --- /dev/null +++ b/examples/drishti/config.cmake @@ -0,0 +1,35 @@ +# DOCUMENTATION_START { + +hunter_config( + xgboost + VERSION 0.40-p10 + CMAKE_ARGS XGBOOST_USE_HALF=ON XGBOOST_USE_CEREAL=ON XGBOOST_DO_LEAN=ON +) + +hunter_config( + acf + VERSION ${HUNTER_acf_VERSION} + CMAKE_ARGS + ACF_BUILD_OGLES_GPGPU=ON +) + +if(ANDROID) + # https://travis-ci.org/ingenue/hunter/jobs/287844545 + # Will be fixed in Android NDK 17 + set(drishti_dlib_version 19.2-p2) + # error: 'struct lconv' has no member named 'decimal_point' -/- + hunter_config(nlohmann_json VERSION 2.1.1-p1) +else() + set(drishti_dlib_version 19.6-p2) +endif() + +hunter_config( + dlib + VERSION ${drishti_dlib_version} + CMAKE_ARGS + DLIB_USE_BLAS=OFF + DLIB_USE_LAPACK=OFF + DLIB_USE_MKL_FFT=OFF +) + +# DOCUMENTATION_END } diff --git a/examples/drishti/foo.cpp b/examples/drishti/foo.cpp new file mode 100644 index 000000000..9274d5cec --- /dev/null +++ b/examples/drishti/foo.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + std::string sModel; + drishti::sdk::EyeSegmenter segmenter(sModel); +} diff --git a/examples/drishti_assets/CMakeLists.txt b/examples/drishti_assets/CMakeLists.txt new file mode 100644 index 000000000..f12323a22 --- /dev/null +++ b/examples/drishti_assets/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-drishti_assets) + +hunter_add_package(drishti_assets) +find_package(drishti_assets CONFIG REQUIRED) + +if(NOT EXISTS "${DRISHTI_ASSETS_FACTORY}") + message(FATAL_ERROR "File not found: '${DRISHTI_ASSETS_FACTORY}'") +endif() diff --git a/examples/drishti_faces/CMakeLists.txt b/examples/drishti_faces/CMakeLists.txt new file mode 100644 index 000000000..e898c567c --- /dev/null +++ b/examples/drishti_faces/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-drishti_faces) + +hunter_add_package(drishti_faces) +find_package(drishti_faces CONFIG REQUIRED) + +if(NOT EXISTS "${DRISHTI_FACES_EYE_IMAGE}") + message(FATAL_ERROR "File not found: '${DRISHTI_FACES_EYE_IMAGE}'") +endif() diff --git a/examples/duktape/CMakeLists.txt b/examples/duktape/CMakeLists.txt new file mode 100644 index 000000000..86d23a1e9 --- /dev/null +++ b/examples/duktape/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-duktape) + +# DOCUMENTATION_START { +hunter_add_package(duktape) +find_package(duktape CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC duktape::duktape) +# DOCUMENTATION_END } diff --git a/examples/duktape/boo.cpp b/examples/duktape/boo.cpp new file mode 100644 index 000000000..a24a30387 --- /dev/null +++ b/examples/duktape/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/dynalo/CMakeLists.txt b/examples/dynalo/CMakeLists.txt new file mode 100644 index 000000000..31eaeb04c --- /dev/null +++ b/examples/dynalo/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, Yassine Maddouri +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-dynalo) + +# DOCUMENTATION_START { +hunter_add_package(dynalo) +find_package(dynalo CONFIG REQUIRED) + +add_executable(dynalo-example-loader dynalo-example-loader.cpp) +target_link_libraries(dynalo-example-loader dynalo) +# DOCUMENTATION_END } \ No newline at end of file diff --git a/examples/dynalo/dynalo-example-loader.cpp b/examples/dynalo/dynalo-example-loader.cpp new file mode 100644 index 000000000..443ded275 --- /dev/null +++ b/examples/dynalo/dynalo-example-loader.cpp @@ -0,0 +1,18 @@ +#include + +#include +#include + +// usage: loader "path/to/shared/lib/dir" +int main(int argc, char* argv[]) +{ + // @see https://github.com/maddouri/dynalo + dynalo::library lib(std::string(argv[1]) + "/" + dynalo::to_native_name("shared")); + + auto add_integers = lib.get_function("add_integers"); + auto print_message = lib.get_function("print_message"); + + std::ostringstream oss; + oss << "it works: " << add_integers(1, 2); + print_message(oss.str().c_str()); +} diff --git a/examples/egl/CMakeLists.txt b/examples/egl/CMakeLists.txt new file mode 100644 index 000000000..033ba9086 --- /dev/null +++ b/examples/egl/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-egl) + +find_package(egl REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC egl::egl) diff --git a/examples/egl/foo.cpp b/examples/egl/foo.cpp new file mode 100644 index 000000000..1b4f7e643 --- /dev/null +++ b/examples/egl/foo.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2017, Ruslan Baratov +// All rights reserved. + +#include + +int main() { +} diff --git a/examples/eigen3-nnls/CMakeLists.txt b/examples/eigen3-nnls/CMakeLists.txt new file mode 100644 index 000000000..c24dac2f7 --- /dev/null +++ b/examples/eigen3-nnls/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-eigen3-nnls) + +hunter_add_package(eigen3-nnls) +find_package(eigen3-nnls CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo eigen3-nnls::eigen3-nnls) diff --git a/examples/eigen3-nnls/foo.cpp b/examples/eigen3-nnls/foo.cpp new file mode 100644 index 000000000..a3a6aadea --- /dev/null +++ b/examples/eigen3-nnls/foo.cpp @@ -0,0 +1,5 @@ +#include +#include + +int main() { +} diff --git a/examples/enet/CMakeLists.txt b/examples/enet/CMakeLists.txt new file mode 100644 index 000000000..278405aa1 --- /dev/null +++ b/examples/enet/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(example-enet) + +hunter_add_package(enet) + +find_package(enet CONFIG REQUIRED) + +add_executable(example-enet main.c) +target_link_libraries(example-enet enet::enet) diff --git a/examples/enet/main.c b/examples/enet/main.c new file mode 100644 index 000000000..f9bac8854 --- /dev/null +++ b/examples/enet/main.c @@ -0,0 +1,15 @@ +#include +#include + +int +main (int argc, char ** argv) +{ + if (enet_initialize () != 0) + { + fprintf (stderr, "An error occurred while initializing ENet.\n"); + return EXIT_FAILURE; + } + atexit (enet_deinitialize); + + return 0; +} diff --git a/examples/entityx/CMakeLists.txt b/examples/entityx/CMakeLists.txt new file mode 100644 index 000000000..3df8766df --- /dev/null +++ b/examples/entityx/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-entityx) + +# DOCUMENTATION_START { +hunter_add_package(entityx) +find_package(entityx CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC entityx::entityx) +# DOCUMENTATION_END } diff --git a/examples/entityx/boo.cpp b/examples/entityx/boo.cpp new file mode 100644 index 000000000..7174e7fb8 --- /dev/null +++ b/examples/entityx/boo.cpp @@ -0,0 +1,7 @@ +#include + +int main() { + entityx::EntityX ex; + entityx::Entity entity = ex.entities.create(); + entity.destroy(); +} diff --git a/examples/ethash/CMakeLists.txt b/examples/ethash/CMakeLists.txt new file mode 100644 index 000000000..26c7e3ae8 --- /dev/null +++ b/examples/ethash/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(use-ethash) + +# DOCUMENTATION_START { +hunter_add_package(ethash) +find_package(ethash CONFIG REQUIRED) + +add_executable(use_ethash main.cpp) +target_link_libraries(use_ethash ethash::ethash) +# DOCUMENTATION_END } \ No newline at end of file diff --git a/examples/ethash/main.cpp b/examples/ethash/main.cpp new file mode 100644 index 000000000..db263891c --- /dev/null +++ b/examples/ethash/main.cpp @@ -0,0 +1,7 @@ +#include + +int main() +{ + ethash::calculate_light_cache_num_items(1); + return 0; +} diff --git a/examples/farmhash/CMakeLists.txt b/examples/farmhash/CMakeLists.txt new file mode 100644 index 000000000..4ef57e651 --- /dev/null +++ b/examples/farmhash/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-farmhash) + +hunter_add_package(farmhash) +find_package(farmhash CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo farmhash::farmhash) diff --git a/examples/farmhash/foo.cpp b/examples/farmhash/foo.cpp new file mode 100644 index 000000000..a88950d57 --- /dev/null +++ b/examples/farmhash/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/ffmpeg/CMakeLists.txt b/examples/ffmpeg/CMakeLists.txt new file mode 100644 index 000000000..a89b43529 --- /dev/null +++ b/examples/ffmpeg/CMakeLists.txt @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-ffmpeg) + +# DOCUMENTATION_START { +hunter_add_package(ffmpeg) +find_package(ffmpeg CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries( + boo + PUBLIC + ffmpeg::avcodec + ffmpeg::avformat + ffmpeg::avutil + ffmpeg::swresample + ffmpeg::swscale +) +# DOCUMENTATION_END } diff --git a/examples/ffmpeg/boo.cpp b/examples/ffmpeg/boo.cpp new file mode 100644 index 000000000..102ea46bb --- /dev/null +++ b/examples/ffmpeg/boo.cpp @@ -0,0 +1,7 @@ +#include +#include +#include +#include + +int main() { +} diff --git a/examples/fft2d/CMakeLists.txt b/examples/fft2d/CMakeLists.txt new file mode 100644 index 000000000..e4bf80808 --- /dev/null +++ b/examples/fft2d/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-fft2d) + +hunter_add_package(fft2d) +find_package(fft2d CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo fft2d::fft2d) diff --git a/examples/fft2d/foo.cpp b/examples/fft2d/foo.cpp new file mode 100644 index 000000000..c7551ee0a --- /dev/null +++ b/examples/fft2d/foo.cpp @@ -0,0 +1,59 @@ +// Source : fft2d/sample1/testxg.c (open license) +// +// Reproduce samples for valid link test, since no headers are exported. +// +// This is used as a build test only. + +#include +#include +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + +/* random number generator, 0 <= RND < 1 */ +#define RND(p) ((*(p) = (*(p) * 7141 + 54773) % 259200) * (1.0 / 259200.0)) + +#ifndef NMAX +#define NMAX 8192 +#define NMAXSQRT 64 +#endif + +extern "C" { +void cdft(int, int, double *, int *, double *); +void putdata(int nini, int nend, double *a) +{ + int j, seed = 0; + + for (j = nini; j <= nend; j++) { + a[j] = RND(&seed); + } +} +double errorcheck(int nini, int nend, double scale, double *a) +{ + int j, seed = 0; + double err = 0, e; + + for (j = nini; j <= nend; j++) { + e = RND(&seed) - a[j] * scale; + err = MAX(err, fabs(e)); + } + return err; +} + +} // extern "C" + +int main() +{ + int n = 64, ip[NMAXSQRT + 2]; + double a[NMAX + 1], w[NMAX * 5 / 4], t[NMAX / 2 + 1], err; + + printf("data length n=? (must be 2^m)\n"); + //scanf("%d", &n); + ip[0] = 0; + + /* check of CDFT */ + + putdata(0, n - 1, a); + cdft(n, 1, a, ip, w); + cdft(n, -1, a, ip, w); + return errorcheck(0, n - 1, 2.0 / n, a); +} + diff --git a/examples/flex/CMakeLists.txt b/examples/flex/CMakeLists.txt new file mode 100644 index 000000000..6bc8a3b9a --- /dev/null +++ b/examples/flex/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-flex) + +hunter_add_package(flex) +find_package(FLEX REQUIRED) + +FLEX_TARGET(MyScanner numbers.lex ${CMAKE_CURRENT_BINARY_DIR}/numbers.cpp) +add_executable(main ${FLEX_MyScanner_OUTPUTS}) +target_include_directories(main PUBLIC ${FLEX_INCLUDE_DIRS}) +target_link_libraries(main ${FLEX_LIBRARIES}) diff --git a/examples/flex/numbers.lex b/examples/flex/numbers.lex new file mode 100644 index 000000000..72da2b021 --- /dev/null +++ b/examples/flex/numbers.lex @@ -0,0 +1,145 @@ +/* + * numbers.lex : An example of the definitions and techniques + * for scanning numbers + */ + +%{ +#include + +#define UNSIGNED_LONG_SYM 1 +#define SIGNED_LONG_SYM 2 +#define UNSIGNED_SYM 3 +#define SIGNED_SYM 4 +#define LONG_DOUBLE_SYM 5 +#define FLOAT_SYM 6 + +union _yylval { + long double ylong_double; + float yfloat; + unsigned long yunsigned_long; + unsigned yunsigned; + long ysigned_long; + int ysigned; +} yylval; + +%} + +digit [0-9] +hex_digit [0-9a-fA-F] +oct_digit [0-7] + +exponent [eE][+-]?{digit}+ +i {digit}+ +float_constant ({i}\.{i}?|{i}?\.{i}){exponent}? +hex_constant 0[xX]{hex_digit}+ +oct_constant 0{oct_digit}* +int_constant {digit}+ +long_ext [lL] +unsigned_ext [uU] +float_ext [fF] +ulong_ext {long_ext}{unsigned_ext}|{unsigned_ext}{long_ext} + +%% + +{hex_constant}{ulong_ext} { /* we need to skip the "0x" part */ + sscanf(&yytext[2],"%lx",&yylval.yunsigned_long); + return(UNSIGNED_LONG_SYM); + } +{hex_constant}{long_ext} { + sscanf(&yytext[2],"%lx",&yylval.ysigned_long); + return(SIGNED_LONG_SYM); + } +{hex_constant}{unsigned_ext} { + sscanf(&yytext[2],"%x",&yylval.yunsigned); + return(UNSIGNED_SYM); + } +{hex_constant} { /* use %lx to protect against overflow */ + sscanf(&yytext[2],"%lx",&yylval.ysigned_long); + return(SIGNED_LONG_SYM); + } +{oct_constant}{ulong_ext} { + sscanf(yytext,"%lo",&yylval.yunsigned_long); + return(UNSIGNED_LONG_SYM); + } +{oct_constant}{long_ext} { + sscanf(yytext,"%lo",&yylval.ysigned_long); + return(SIGNED_LONG_SYM); + } +{oct_constant}{unsigned_ext} { + sscanf(yytext,"%o",&yylval.yunsigned); + return(UNSIGNED_SYM); + } +{oct_constant} { /* use %lo to protect against overflow */ + sscanf(yytext,"%lo",&yylval.ysigned_long); + return(SIGNED_LONG_SYM); + } +{int_constant}{ulong_ext} { + sscanf(yytext,"%ld",&yylval.yunsigned_long); + return(UNSIGNED_LONG_SYM); + } +{int_constant}{long_ext} { + sscanf(yytext,"%ld",&yylval.ysigned_long); + return(SIGNED_LONG_SYM); + } +{int_constant}{unsigned_ext} { + sscanf(yytext,"%d",&yylval.yunsigned); + return(UNSIGNED_SYM); + } +{int_constant} { /* use %ld to protect against overflow */ + sscanf(yytext,"%ld",&yylval.ysigned_long); + return(SIGNED_LONG_SYM); + } +{float_constant}{long_ext} { + sscanf(yytext,"%Lf",&yylval.ylong_double); + return(LONG_DOUBLE_SYM); + } +{float_constant}{float_ext} { + sscanf(yytext,"%f",&yylval.yfloat); + return(FLOAT_SYM); + } +{float_constant} { /* use %Lf to protect against overflow */ + sscanf(yytext,"%Lf",&yylval.ylong_double); + return(LONG_DOUBLE_SYM); + } +%% + +int main(void) +{ + int code; + + while((code = yylex())){ + printf("yytext : %s\n",yytext); + switch(code){ + case UNSIGNED_LONG_SYM: + printf("Type of number : UNSIGNED LONG\n"); + printf("Value of number : %lu\n",yylval.yunsigned_long); + break; + case SIGNED_LONG_SYM: + printf("Type of number : SIGNED LONG\n"); + printf("Value of number : %ld\n",yylval.ysigned_long); + break; + case UNSIGNED_SYM: + printf("Type of number : UNSIGNED\n"); + printf("Value of number : %u\n",yylval.yunsigned); + break; + case SIGNED_SYM: + printf("Type of number : SIGNED\n"); + printf("Value of number : %d\n",yylval.ysigned); + break; + case LONG_DOUBLE_SYM: + printf("Type of number : LONG DOUBLE\n"); + printf("Value of number : %Lf\n",yylval.ylong_double); + break; + case FLOAT_SYM: + printf("Type of number : FLOAT\n"); + printf("Value of number : %f\n",yylval.yfloat); + break; + default: + printf("Type of number : UNDEFINED\n"); + printf("Value of number : UNDEFINED\n"); + break; + } + } + return(0); +} + diff --git a/examples/folly/CMakeLists.txt b/examples/folly/CMakeLists.txt new file mode 100644 index 000000000..d1664218e --- /dev/null +++ b/examples/folly/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-folly) + +# DOCUMENTATION_START { +hunter_add_package(folly) +find_package(folly CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC Folly::folly) +# DOCUMENTATION_END } diff --git a/examples/folly/boo.cpp b/examples/folly/boo.cpp new file mode 100644 index 000000000..db2203844 --- /dev/null +++ b/examples/folly/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/foo/CMakeLists.txt b/examples/foo/CMakeLists.txt new file mode 100644 index 000000000..a1a7acabc --- /dev/null +++ b/examples/foo/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-foo) + +# DOCUMENTATION_START { +hunter_add_package(foo) +find_package(foo CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC foo::foo) +# DOCUMENTATION_END } diff --git a/examples/foo/boo.cpp b/examples/foo/boo.cpp new file mode 100644 index 000000000..0ed0fa43b --- /dev/null +++ b/examples/foo/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/forcefeedback/CMakeLists.txt b/examples/forcefeedback/CMakeLists.txt new file mode 100644 index 000000000..97a9c19ce --- /dev/null +++ b/examples/forcefeedback/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-forcefeedback) + +find_package(forcefeedback REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC forcefeedback::forcefeedback) diff --git a/examples/forcefeedback/foo.mm b/examples/forcefeedback/foo.mm new file mode 100644 index 000000000..475410ab2 --- /dev/null +++ b/examples/forcefeedback/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/foundation/CMakeLists.txt b/examples/foundation/CMakeLists.txt new file mode 100644 index 000000000..93297a109 --- /dev/null +++ b/examples/foundation/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-foundation) + +find_package(foundation REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC foundation::foundation) diff --git a/examples/foundation/foo.mm b/examples/foundation/foo.mm new file mode 100644 index 000000000..76a185877 --- /dev/null +++ b/examples/foundation/foo.mm @@ -0,0 +1,5 @@ +#import + +int main() { + NSLog(@"Hello"); +} diff --git a/examples/freetype/boo.cpp b/examples/freetype/boo.cpp new file mode 100644 index 000000000..acce37cc3 --- /dev/null +++ b/examples/freetype/boo.cpp @@ -0,0 +1,18 @@ +#include // std::cout + +#include +#include FT_FREETYPE_H + +int main() { + FT_Library library; + FT_Error error; + + error = FT_Init_FreeType(&library); + if (error) { + std::cerr << "Library initialization failed" << std::endl; + return EXIT_FAILURE; + } + + std::cout << "Success" << std::endl; + return EXIT_SUCCESS; +} diff --git a/examples/frugally-deep/CMakeLists.txt b/examples/frugally-deep/CMakeLists.txt new file mode 100644 index 000000000..91d4db2ba --- /dev/null +++ b/examples/frugally-deep/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-frugally-deep) + +# DOCUMENTATION_START { +hunter_add_package(frugally-deep) +find_package(frugally-deep CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo frugally-deep::fdeep) +# DOCUMENTATION_END } diff --git a/examples/frugally-deep/foo.cpp b/examples/frugally-deep/foo.cpp new file mode 100644 index 000000000..f4e6cad03 --- /dev/null +++ b/examples/frugally-deep/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/gRPC/CMakeLists.txt b/examples/gRPC/CMakeLists.txt new file mode 100644 index 000000000..df59c34de --- /dev/null +++ b/examples/gRPC/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.1) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) +include("../common.cmake") + +project(download-gRPC) + +hunter_add_package(gRPC) + +set(CMAKE_CXX_STANDARD_REQUIRED true) +set(CMAKE_CXX_STANDARD 11) + +find_package(gRPC CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main gRPC::grpc) diff --git a/examples/gRPC/config.cmake b/examples/gRPC/config.cmake new file mode 100644 index 000000000..357b5f875 --- /dev/null +++ b/examples/gRPC/config.cmake @@ -0,0 +1,2 @@ +hunter_config(ZLIB VERSION ${HUNTER_ZLIB_VERSION} + CMAKE_ARGS CMAKE_POSITION_INDEPENDENT_CODE=TRUE) diff --git a/examples/gRPC/main.cpp b/examples/gRPC/main.cpp new file mode 100644 index 000000000..b59b0df96 --- /dev/null +++ b/examples/gRPC/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/gauze/CMakeLists.txt b/examples/gauze/CMakeLists.txt new file mode 100644 index 000000000..d1ae89c7c --- /dev/null +++ b/examples/gauze/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gauze) + +hunter_add_package(gauze) +find_package(gauze CONFIG REQUIRED) + +add_executable(foo foo.cpp) + +gauze_add_test(NAME foo COMMAND foo) diff --git a/examples/gauze/foo.cpp b/examples/gauze/foo.cpp new file mode 100644 index 000000000..bb11dc98a --- /dev/null +++ b/examples/gauze/foo.cpp @@ -0,0 +1,5 @@ +#include + +int gauze_main(int argc, char** argv) { + return EXIT_SUCCESS; +} diff --git a/examples/gemmlowp/CMakeLists.txt b/examples/gemmlowp/CMakeLists.txt new file mode 100644 index 000000000..26a7019e6 --- /dev/null +++ b/examples/gemmlowp/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gemmlowp) + +hunter_add_package(gemmlowp) +find_package(gemmlowp CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo gemmlowp::gemmlowp) diff --git a/examples/gemmlowp/foo.cpp b/examples/gemmlowp/foo.cpp new file mode 100644 index 000000000..9a11d797a --- /dev/null +++ b/examples/gemmlowp/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/getopt/CMakeLists.txt b/examples/getopt/CMakeLists.txt new file mode 100644 index 000000000..5170e29a1 --- /dev/null +++ b/examples/getopt/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-getopt) + +if(MSVC) + hunter_add_package(getopt) + find_package(getopt CONFIG REQUIRED) + + set(getopt_example_libraries getopt::getopt) +endif() + +add_executable(getopt_example main.cpp) +target_link_libraries(getopt_example ${getopt_example_libraries}) + diff --git a/examples/getopt/main.cpp b/examples/getopt/main.cpp new file mode 100644 index 000000000..87a0a7591 --- /dev/null +++ b/examples/getopt/main.cpp @@ -0,0 +1,45 @@ +#include +#include +#include + +int main(int argc, char **argv) +{ + int aflag = 0; + int bflag = 0; + char *cvalue = NULL; + int index; + int c; + + opterr = 0; + while ((c = getopt (argc, argv, "abc:")) != -1) + switch (c) + { + case 'a': + aflag = 1; + break; + case 'b': + bflag = 1; + break; + case 'c': + cvalue = optarg; + break; + case '?': + if (optopt == 'c') + fprintf (stderr, "Option -%c requires an argument.\n", optopt); + else + fprintf (stderr, "Unknown option `-%c'.\n", optopt); + return 1; + default: + abort (); + } + printf ("aflag = %d, bflag = %d, cvalue = %s\n", + aflag, bflag, cvalue); + + for (index = optind; index < argc; index++) + printf ("Non-option argument %s\n", argv[index]); + + return 0; +} + + + diff --git a/examples/giflib/CMakeLists.txt b/examples/giflib/CMakeLists.txt new file mode 100644 index 000000000..7ca42f2d8 --- /dev/null +++ b/examples/giflib/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-giflib) + +hunter_add_package(giflib) +find_package(giflib CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo giflib::giflib) diff --git a/examples/giflib/foo.cpp b/examples/giflib/foo.cpp new file mode 100644 index 000000000..d85b7732d --- /dev/null +++ b/examples/giflib/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/glapi/CMakeLists.txt b/examples/glapi/CMakeLists.txt new file mode 100644 index 000000000..dcc165a95 --- /dev/null +++ b/examples/glapi/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-glapi) + +find_package(glapi REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC glapi::glapi) diff --git a/examples/glapi/foo.cpp b/examples/glapi/foo.cpp new file mode 100644 index 000000000..beaae3276 --- /dev/null +++ b/examples/glapi/foo.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2017, Ruslan Baratov +// All rights reserved. + +#include + +int main() { +} diff --git a/examples/glbinding/CMakeLists.txt b/examples/glbinding/CMakeLists.txt new file mode 100644 index 000000000..d50990535 --- /dev/null +++ b/examples/glbinding/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +cmake_minimum_required(VERSION 3.1) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-glbinding) + +hunter_add_package(glbinding) + +string(COMPARE EQUAL "${glbinding_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Licenses not found") +endif() + +message("glbinding licenses:") +foreach(x ${glbinding_LICENSES}) + message("* ${x}") + if(NOT EXISTS "${glbinding_LICENSES}") + message(FATAL_ERROR "File not found") + endif() +endforeach() + +find_package(glbinding CONFIG REQUIRED) + +# Test double library creation +find_package(glbinding CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo glbinding::glbinding) + +# glbinding needs at least this c++11 feature +target_compile_features(foo PRIVATE cxx_defaulted_move_initializers) diff --git a/examples/glbinding/foo.cpp b/examples/glbinding/foo.cpp new file mode 100644 index 000000000..b0b9c297a --- /dev/null +++ b/examples/glbinding/foo.cpp @@ -0,0 +1,9 @@ +#include +#include + +int main() +{ + std::cout << "OpenGL version: " + << glbinding::Version().toString() + << std::endl; +} diff --git a/examples/gles2/CMakeLists.txt b/examples/gles2/CMakeLists.txt new file mode 100644 index 000000000..310737899 --- /dev/null +++ b/examples/gles2/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gles2) + +find_package(gles2 REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC gles2::gles2) diff --git a/examples/gles2/foo.cpp b/examples/gles2/foo.cpp new file mode 100644 index 000000000..6cacee303 --- /dev/null +++ b/examples/gles2/foo.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2017, Ruslan Baratov +// All rights reserved. + +#include + +int main() { +} diff --git a/examples/gles3/CMakeLists.txt b/examples/gles3/CMakeLists.txt new file mode 100644 index 000000000..9037a8113 --- /dev/null +++ b/examples/gles3/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gles3) + +find_package(gles3 REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC gles3::gles3) diff --git a/examples/gles3/foo.cpp b/examples/gles3/foo.cpp new file mode 100644 index 000000000..eb79372bb --- /dev/null +++ b/examples/gles3/foo.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2017, Ruslan Baratov +// All rights reserved. + +#include + +int main() { +} diff --git a/examples/glib/CMakeLists.txt b/examples/glib/CMakeLists.txt new file mode 100644 index 000000000..e1ee3e42a --- /dev/null +++ b/examples/glib/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-glib) + +hunter_add_package(glib) +find_package(glib-2.0 CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::glib-2.0) diff --git a/examples/glib/foo.cpp b/examples/glib/foo.cpp new file mode 100644 index 000000000..e198db70d --- /dev/null +++ b/examples/glib/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/globjects/CMakeLists.txt b/examples/globjects/CMakeLists.txt new file mode 100644 index 000000000..2ce7176f5 --- /dev/null +++ b/examples/globjects/CMakeLists.txt @@ -0,0 +1,39 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-globjects) + +# DOCUMENTATION_START { +hunter_add_package(globjects) +find_package(globjects CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PRIVATE globjects::globjects) +# DOCUMENTATION_END } + +string(COMPARE EQUAL "${globjects_LICENSES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Licenses not found") +endif() + +message("globjects licenses:") +foreach(x ${globjects_LICENSES}) + message("* ${x}") + if(NOT EXISTS "${globjects_LICENSES}") + message(FATAL_ERROR "File not found") + endif() +endforeach() + +# Test double library creation +find_package(globjects CONFIG REQUIRED) + +# globjects needs at least this c++11 feature +target_compile_features(foo PRIVATE cxx_defaulted_move_initializers) diff --git a/examples/globjects/config.cmake b/examples/globjects/config.cmake new file mode 100644 index 000000000..c602031be --- /dev/null +++ b/examples/globjects/config.cmake @@ -0,0 +1,3 @@ +# DOCUMENTATION_START { +hunter_config(glbinding VERSION "2.1.3-p0") +# DOCUMENTATION_END } diff --git a/examples/globjects/foo.cpp b/examples/globjects/foo.cpp new file mode 100644 index 000000000..80fb430c0 --- /dev/null +++ b/examples/globjects/foo.cpp @@ -0,0 +1,15 @@ +#include +#include + +#include + +int main() +{ + // manage contexts + globjects::init(); + + // print version of unspecified context + std::cout << "Current gl version: " + << globjects::version() + << std::endl; +} diff --git a/examples/glslang/CMakeLists.txt b/examples/glslang/CMakeLists.txt new file mode 100644 index 000000000..f2a9016ac --- /dev/null +++ b/examples/glslang/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-glslang) + +# DOCUMENTATION_START { +hunter_add_package(glslang) +find_package(glslang CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC glslang::glslang) +# DOCUMENTATION_END } diff --git a/examples/glslang/boo.cpp b/examples/glslang/boo.cpp new file mode 100644 index 000000000..139027c2d --- /dev/null +++ b/examples/glslang/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/gst_plugins_bad/CMakeLists.txt b/examples/gst_plugins_bad/CMakeLists.txt new file mode 100644 index 000000000..81a85778a --- /dev/null +++ b/examples/gst_plugins_bad/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gst_plugins_bad) + +hunter_add_package(gst_plugins_bad) +find_package(gstreamer-bad-video-1.0 CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::gstreamer-bad-video-1.0) diff --git a/examples/gst_plugins_bad/foo.cpp b/examples/gst_plugins_bad/foo.cpp new file mode 100644 index 000000000..bbab0dd6f --- /dev/null +++ b/examples/gst_plugins_bad/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/gst_plugins_base/CMakeLists.txt b/examples/gst_plugins_base/CMakeLists.txt new file mode 100644 index 000000000..82215db82 --- /dev/null +++ b/examples/gst_plugins_base/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gst_plugins_base) + +hunter_add_package(gst_plugins_base) +find_package(gstreamer-video-1.0 CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::gstreamer-video-1.0) diff --git a/examples/gst_plugins_base/foo.cpp b/examples/gst_plugins_base/foo.cpp new file mode 100644 index 000000000..608194cfc --- /dev/null +++ b/examples/gst_plugins_base/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/gst_plugins_good/CMakeLists.txt b/examples/gst_plugins_good/CMakeLists.txt new file mode 100644 index 000000000..e48d739ab --- /dev/null +++ b/examples/gst_plugins_good/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gst_plugins_good) + +hunter_add_package(gst_plugins_good) + +add_executable(foo foo.cpp) diff --git a/examples/gst_plugins_good/foo.cpp b/examples/gst_plugins_good/foo.cpp new file mode 100644 index 000000000..b2f997621 --- /dev/null +++ b/examples/gst_plugins_good/foo.cpp @@ -0,0 +1,2 @@ +int main() { +} diff --git a/examples/gst_plugins_ugly/CMakeLists.txt b/examples/gst_plugins_ugly/CMakeLists.txt new file mode 100644 index 000000000..0a34bdf47 --- /dev/null +++ b/examples/gst_plugins_ugly/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gst_plugins_ugly) + +hunter_add_package(gst_plugins_ugly) + +add_executable(foo foo.cpp) diff --git a/examples/gst_plugins_ugly/foo.cpp b/examples/gst_plugins_ugly/foo.cpp new file mode 100644 index 000000000..b2f997621 --- /dev/null +++ b/examples/gst_plugins_ugly/foo.cpp @@ -0,0 +1,2 @@ +int main() { +} diff --git a/examples/gstreamer/CMakeLists.txt b/examples/gstreamer/CMakeLists.txt new file mode 100644 index 000000000..d63990fa4 --- /dev/null +++ b/examples/gstreamer/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-gstreamer) + +hunter_add_package(gstreamer) +find_package(gstreamer-1.0 CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::gstreamer-1.0) diff --git a/examples/gstreamer/foo.cpp b/examples/gstreamer/foo.cpp new file mode 100644 index 000000000..29abd47da --- /dev/null +++ b/examples/gstreamer/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/gumbo/CMakeLists.txt b/examples/gumbo/CMakeLists.txt new file mode 100644 index 000000000..addc9b7b7 --- /dev/null +++ b/examples/gumbo/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-gumbo) + +hunter_add_package(gumbo) + +find_package(gumbo CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main gumbo::gumbo) diff --git a/examples/gumbo/main.cpp b/examples/gumbo/main.cpp new file mode 100644 index 000000000..ae6c22455 --- /dev/null +++ b/examples/gumbo/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/h3/CMakeLists.txt b/examples/h3/CMakeLists.txt new file mode 100644 index 000000000..bd8520582 --- /dev/null +++ b/examples/h3/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-h3) + +hunter_add_package(h3) + +# DOCUMENTATION_START { +find_package(h3 CONFIG REQUIRED) +add_executable(main main.c) +target_link_libraries(main h3::h3) +# DOCUMENTATION_END } diff --git a/examples/h3/main.c b/examples/h3/main.c new file mode 100644 index 000000000..7b144d232 --- /dev/null +++ b/examples/h3/main.c @@ -0,0 +1,8 @@ +#include

    + +int main() +{ + GeoCoord anywhere = {0, 0}; + H3_EXPORT(geoToH3)(&anywhere, -1); + return 0; +} diff --git a/examples/harfbuzz/CMakeLists.txt b/examples/harfbuzz/CMakeLists.txt new file mode 100644 index 000000000..fcd119645 --- /dev/null +++ b/examples/harfbuzz/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-harfbuzz) + +# DOCUMENTATION_START { +hunter_add_package(harfbuzz) +find_package(harfbuzz CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC harfbuzz::harfbuzz) +# DOCUMENTATION_END } diff --git a/examples/harfbuzz/boo.cpp b/examples/harfbuzz/boo.cpp new file mode 100644 index 000000000..627efcec2 --- /dev/null +++ b/examples/harfbuzz/boo.cpp @@ -0,0 +1,5 @@ + +#include "hb.h" + +int main() { +} diff --git a/examples/highwayhash/CMakeLists.txt b/examples/highwayhash/CMakeLists.txt new file mode 100644 index 000000000..755cd5d4e --- /dev/null +++ b/examples/highwayhash/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-highwayhash) + +hunter_add_package(highwayhash) +find_package(highwayhash CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo highwayhash::highwayhash) diff --git a/examples/highwayhash/foo.cpp b/examples/highwayhash/foo.cpp new file mode 100644 index 000000000..8f43a5528 --- /dev/null +++ b/examples/highwayhash/foo.cpp @@ -0,0 +1,12 @@ +#include "highwayhash/sip_hash.h" +#include "highwayhash/state_helpers.h" +#include + +// Mimic single use in tensorflow/tensorflow//core/platform/default/strong_hash.h +inline std::uint64_t StrongKeyedHash(const std::uint64_t (&key)[2], const std::string& s) { + return highwayhash::StringHasher()(key, s); +} + +int main() { + return 0; +} diff --git a/examples/http-parser/CMakeLists.txt b/examples/http-parser/CMakeLists.txt new file mode 100644 index 000000000..c0edb3831 --- /dev/null +++ b/examples/http-parser/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-http-parser) + +# DOCUMENTATION_START { +hunter_add_package(http-parser) +find_package(http-parser CONFIG REQUIRED) +add_executable(main main.c) +target_link_libraries(main http-parser::http_parser) +# DOCUMENTATION_END } diff --git a/examples/http-parser/main.c b/examples/http-parser/main.c new file mode 100644 index 000000000..a122e0f2f --- /dev/null +++ b/examples/http-parser/main.c @@ -0,0 +1,3 @@ +#include + +int main() { return http_parser_version(); } diff --git a/examples/hunter_venv/CMakeLists.txt b/examples/hunter_venv/CMakeLists.txt new file mode 100644 index 000000000..d8ad0eed6 --- /dev/null +++ b/examples/hunter_venv/CMakeLists.txt @@ -0,0 +1,54 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-hunter_venv) + +# DOCUMENTATION_START { +hunter_add_package(hunter_venv) +find_package(hunter_venv CONFIG REQUIRED) + +find_package(Python REQUIRED) + +add_custom_target(python_version ALL Python::Interpreter --version) + +execute_process(COMMAND ${Python_EXECUTABLE} --version RESULT_VARIABLE result) +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } + +# DOCUMENTATION_START_1 { +execute_process( + COMMAND ${Python_EXECUTABLE} -c "import sys" + RESULT_VARIABLE result +) +# DOCUMENTATION_END_1 } +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() + +# DOCUMENTATION_START_2 { +execute_process( + COMMAND ${Python_EXECUTABLE} -c "print ('Hello Hunter!')" + RESULT_VARIABLE result +) +# DOCUMENTATION_END_2 } +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() + +# DOCUMENTATION_START_3 { +execute_process( + COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/script.py + RESULT_VARIABLE result +) +# DOCUMENTATION_END_3 } +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() diff --git a/examples/hunter_venv/script.py b/examples/hunter_venv/script.py new file mode 100644 index 000000000..28942c6ca --- /dev/null +++ b/examples/hunter_venv/script.py @@ -0,0 +1 @@ +print('Hello Hunter! (script)') diff --git a/examples/icu-le-hb/CMakeLists.txt b/examples/icu-le-hb/CMakeLists.txt new file mode 100644 index 000000000..a5cad906f --- /dev/null +++ b/examples/icu-le-hb/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-icu-le-hb) + +# DOCUMENTATION_START { +hunter_add_package(icu-le-hb) +find_package(icu-le-hb CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC icu-le-hb::icu-le-hb) +# DOCUMENTATION_END } diff --git a/examples/icu-le-hb/boo.cpp b/examples/icu-le-hb/boo.cpp new file mode 100644 index 000000000..e2ae08281 --- /dev/null +++ b/examples/icu-le-hb/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/icu-lx/CMakeLists.txt b/examples/icu-lx/CMakeLists.txt new file mode 100644 index 000000000..ac96d0fa1 --- /dev/null +++ b/examples/icu-lx/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-icu-lx) + +# DOCUMENTATION_START { +hunter_add_package(icu-lx) +find_package(icu-lx CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC ICU::lx) +# DOCUMENTATION_END } diff --git a/examples/icu-lx/boo.cpp b/examples/icu-lx/boo.cpp new file mode 100644 index 000000000..a35f01959 --- /dev/null +++ b/examples/icu-lx/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/imagequant/CMakeLists.txt b/examples/imagequant/CMakeLists.txt new file mode 100644 index 000000000..274100f6f --- /dev/null +++ b/examples/imagequant/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libimagequant) + +# DOCUMENTATION_START { +hunter_add_package(imagequant) +find_package(imagequant CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC imagequant::imagequant) +# DOCUMENTATION_END } diff --git a/examples/imagequant/boo.cpp b/examples/imagequant/boo.cpp new file mode 100644 index 000000000..9d9f488c8 --- /dev/null +++ b/examples/imagequant/boo.cpp @@ -0,0 +1,5 @@ +#include + +int main() { + liq_attr *handle = liq_attr_create(); +} diff --git a/examples/imgui/CMakeLists.txt b/examples/imgui/CMakeLists.txt new file mode 100644 index 000000000..081982cb3 --- /dev/null +++ b/examples/imgui/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_imgui) + +# DOCUMENTATION_START { +hunter_add_package(imgui) +find_package(imgui CONFIG REQUIRED) + +add_executable(imgui_test main.cpp) +target_link_libraries(imgui_test imgui::imgui) +# DOCUMENTATION_END } diff --git a/examples/imgui/main.cpp b/examples/imgui/main.cpp new file mode 100644 index 000000000..5dd8deb19 --- /dev/null +++ b/examples/imgui/main.cpp @@ -0,0 +1,34 @@ +#include "imgui.h" +#include + +int main(int, char**) +{ + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + + // Build atlas + unsigned char* tex_pixels = NULL; + int tex_w, tex_h; + io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_w, &tex_h); + + for (int n = 0; n < 50; n++) + { + printf("NewFrame() %d\n", n); + io.DisplaySize = ImVec2(1920, 1080); + io.DeltaTime = 1.0f / 60.0f; + ImGui::NewFrame(); + + static float f = 0.0f; + ImGui::Text("Hello, world!"); + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::ShowDemoWindow(NULL); + + ImGui::Render(); + } + + printf("DestroyContext()\n"); + ImGui::DestroyContext(); + return 0; +} diff --git a/examples/imshow/CMakeLists.txt b/examples/imshow/CMakeLists.txt new file mode 100644 index 000000000..004f80b3c --- /dev/null +++ b/examples/imshow/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-imshow) + +hunter_add_package(imshow) +find_package(imshow CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo imshow::imshow) diff --git a/examples/imshow/foo.cpp b/examples/imshow/foo.cpp new file mode 100644 index 000000000..45c65bc9b --- /dev/null +++ b/examples/imshow/foo.cpp @@ -0,0 +1,45 @@ +#include +#include + +int main(int argc, char * argv[]) +{ + int test[320 * 240]; + unsigned char test8[320 * 240]; + unsigned char test_blur[320 * 240]; + + std::default_random_engine eng; + std::uniform_int_distribution<> dist; + + do + { + for (int i = 0; i < 320 * 240; i++) + { + test[i] = dist(eng); + } + glfw::imshow("test", { test, glfw::IM_8U, 320, 240, 4 }); + for (int i = 0; i < 320 * 240; i++) + { + test8[i] = ((test[i] & 0xFF00 >> 8) + (test[i] & 0xFF0000 >> 16) + (test[i] & 0xFF000000 >> 24))/3; + } + glfw::imshow("test8", { test8, glfw::IM_8U, 320, 240, 1 }); + + for (int y = 1; y < 239; y++) + { + for (int x = 1; x < 319; x++) + { + test_blur[y * 320 + x] = (test8[y * 320 + x-1] + test8[y * 320 + x] + test8[y * 320 + x+1]) / 3; + } + } + for (int y = 1; y < 239; y++) + { + for (int x = 1; x < 319; x++) + { + test_blur[y * 320 + x] = (test_blur[(y - 1) * 320 + x] + test_blur[y * 320 + x] + test_blur[(y + 1) * 320 + x]) / 3; + } + } + glfw::imshow("test_blured", { test_blur, glfw::IM_8U, 320, 240, 1 }); + } + while (glfw::getKey(false) != 'q'); + + return 0; +} diff --git a/examples/inja/CMakeLists.txt b/examples/inja/CMakeLists.txt new file mode 100644 index 000000000..bcc57a113 --- /dev/null +++ b/examples/inja/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-inja) + +hunter_add_package(inja) +find_package(inja CONFIG REQUIRED) + +add_executable(inja inja.cpp) +target_link_libraries(inja inja::inja) diff --git a/examples/inja/inja.cpp b/examples/inja/inja.cpp new file mode 100644 index 000000000..39fe5d83b --- /dev/null +++ b/examples/inja/inja.cpp @@ -0,0 +1,10 @@ +#include +#include + +int main() { + inja::Parser parser = inja::Parser(); + std::string test = "lorem ipsum"; + nlohmann::json result = {{{"type", inja::Parser::Type::String}, {"text", "lorem ipsum"}}}; + bool tested = (parser.parse(test) == result); + return 0; +} diff --git a/examples/intsizeof/CMakeLists.txt b/examples/intsizeof/CMakeLists.txt new file mode 100644 index 000000000..33adec539 --- /dev/null +++ b/examples/intsizeof/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-intsizeof) + +hunter_add_package(intsizeof) +find_package(intsizeof CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo intsizeof::intsizeof) diff --git a/examples/intsizeof/foo.cpp b/examples/intsizeof/foo.cpp new file mode 100644 index 000000000..99028b5a8 --- /dev/null +++ b/examples/intsizeof/foo.cpp @@ -0,0 +1,6 @@ +#include // INTSIZEOF_PTRDIFF +#include // ptrdiff_t + +int main() { + static_assert(INTSIZEOF_PTRDIFF == sizeof(ptrdiff_t), ""); +} diff --git a/examples/intx/CMakeLists.txt b/examples/intx/CMakeLists.txt new file mode 100644 index 000000000..96a217d74 --- /dev/null +++ b/examples/intx/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2019, Pawel Bylica +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(use-intx) + +# DOCUMENTATION_START { +hunter_add_package(intx) +find_package(intx CONFIG REQUIRED) + +add_executable(use_intx main.cpp) +target_link_libraries(use_intx intx::intx) +# DOCUMENTATION_END } diff --git a/examples/intx/main.cpp b/examples/intx/main.cpp new file mode 100644 index 000000000..0c3dbe6b1 --- /dev/null +++ b/examples/intx/main.cpp @@ -0,0 +1,9 @@ +// Copyright(c) 2019, Pawel Bylica + +#include + +int main() +{ + auto r = intx::uint512{1, 0} / intx::uint512{1}; + return static_cast(r); +} diff --git a/examples/iroha-ed25519/CMakeLists.txt b/examples/iroha-ed25519/CMakeLists.txt new file mode 100644 index 000000000..ad88e8ad3 --- /dev/null +++ b/examples/iroha-ed25519/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-iroha-ed25519) + +# DOCUMENTATION_START { +hunter_add_package(iroha-ed25519) +find_package(ed25519 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC iroha::ed25519) +# DOCUMENTATION_END } diff --git a/examples/iroha-ed25519/boo.cpp b/examples/iroha-ed25519/boo.cpp new file mode 100644 index 000000000..2b71072ff --- /dev/null +++ b/examples/iroha-ed25519/boo.cpp @@ -0,0 +1,19 @@ +#include + +int main(int arc, char** argv) { + public_key_t pub; + private_key_t priv; + + ed25519_create_keypair(&priv, &pub); + + const int size = 7; + const char *buff = "ed25519"; + + signature_t sig; + ed25519_sign(&sig, (unsigned char*)buff, size, &pub, &priv); + + ed25519_verify(&sig, (unsigned char*)buff, size, &pub); + // return 1 = ok + + return 0; +} diff --git a/examples/jaegertracing/CMakeLists.txt b/examples/jaegertracing/CMakeLists.txt new file mode 100644 index 000000000..a9136ca41 --- /dev/null +++ b/examples/jaegertracing/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-jaegertracing) + +hunter_add_package(jaegertracing) + +# DOCUMENTATION_START { +find_package(jaegertracing CONFIG REQUIRED) +add_executable(main main.cpp) +target_link_libraries(main jaegertracing::jaegertracing-static) +# DOCUMENTATION_END } diff --git a/examples/jaegertracing/main.cpp b/examples/jaegertracing/main.cpp new file mode 100644 index 000000000..a7af07a05 --- /dev/null +++ b/examples/jaegertracing/main.cpp @@ -0,0 +1,7 @@ +#include + +int main() +{ + jaegertracing::Tracer::make("test", jaegertracing::Config()); + return 0; +} diff --git a/examples/jansson/CMakeLists.txt b/examples/jansson/CMakeLists.txt new file mode 100644 index 000000000..d74778f24 --- /dev/null +++ b/examples/jansson/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-jansson) + +# DOCUMENTATION_START { +hunter_add_package(jansson) +find_package(jansson CONFIG REQUIRED) +add_executable(main main.c) +target_link_libraries(main jansson::jansson) +# DOCUMENTATION_END } diff --git a/examples/jansson/main.c b/examples/jansson/main.c new file mode 100644 index 000000000..39e196cfc --- /dev/null +++ b/examples/jansson/main.c @@ -0,0 +1,9 @@ +#include + +int main() +{ + json_malloc_t malloc_fn; + json_free_t free_fn; + json_get_alloc_funcs(&malloc_fn, &free_fn); + return 0; +} diff --git a/examples/jasper/CMakeLists.txt b/examples/jasper/CMakeLists.txt new file mode 100644 index 000000000..1cab7f5da --- /dev/null +++ b/examples/jasper/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-jasper) + +# DOCUMENTATION_START { +hunter_add_package(jasper) +find_package(jasper CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC jasper::libjasper) +# DOCUMENTATION_END } diff --git a/examples/jasper/boo.cpp b/examples/jasper/boo.cpp new file mode 100644 index 000000000..900696cb4 --- /dev/null +++ b/examples/jasper/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/javascriptcore/CMakeLists.txt b/examples/javascriptcore/CMakeLists.txt new file mode 100644 index 000000000..a34a5c726 --- /dev/null +++ b/examples/javascriptcore/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-javascriptcore) + +find_package(javascriptcore REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC javascriptcore::javascriptcore) diff --git a/examples/javascriptcore/foo.mm b/examples/javascriptcore/foo.mm new file mode 100644 index 000000000..df85a6c68 --- /dev/null +++ b/examples/javascriptcore/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/jo_jpeg/CMakeLists.txt b/examples/jo_jpeg/CMakeLists.txt new file mode 100644 index 000000000..3a6626783 --- /dev/null +++ b/examples/jo_jpeg/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-jo_jpeg) + +hunter_add_package(jo_jpeg) +find_package(jo_jpeg CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo jo_jpeg::jo_jpeg) diff --git a/examples/jo_jpeg/foo.cpp b/examples/jo_jpeg/foo.cpp new file mode 100644 index 000000000..7f1fcad8d --- /dev/null +++ b/examples/jo_jpeg/foo.cpp @@ -0,0 +1,13 @@ +#include + +int main() { + const char *filename = ""; + const void *data = 0; + int width = 0; + int height = 0; + int comp = 0; + int quality = 0; + + bool x = jo_write_jpg(filename, data, width, height, comp, quality); + return x; +} diff --git a/examples/jsoncpp/CMakeLists.txt b/examples/jsoncpp/CMakeLists.txt new file mode 100644 index 000000000..4c5f268ee --- /dev/null +++ b/examples/jsoncpp/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-jsoncpp) + +hunter_add_package(jsoncpp) + +find_package(jsoncpp CONFIG REQUIRED) + +add_executable(version main.cpp) + +if(${HUNTER_jsoncpp_VERSION} VERSION_LESS 1.0.0) + target_link_libraries(version jsoncpp_lib) +else() + target_link_libraries(version jsoncpp_lib_static) +endif() diff --git a/examples/jsoncpp/main.cpp b/examples/jsoncpp/main.cpp new file mode 100644 index 000000000..eb9cadc07 --- /dev/null +++ b/examples/jsoncpp/main.cpp @@ -0,0 +1,10 @@ + + +// Report jsoncpp version + +#include + +int main (void) +{ + return 0; +} diff --git a/examples/kNet/CMakeLists.txt b/examples/kNet/CMakeLists.txt new file mode 100644 index 000000000..022c498ed --- /dev/null +++ b/examples/kNet/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-kNet) + +hunter_add_package(kNet) +find_package(kNet CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC kNet::kNet) diff --git a/examples/kNet/boo.cpp b/examples/kNet/boo.cpp new file mode 100644 index 000000000..06ab3dcd6 --- /dev/null +++ b/examples/kNet/boo.cpp @@ -0,0 +1,5 @@ +#include + +int main() { + kNet::Network network; +} diff --git a/examples/lcms/CMakeLists.txt b/examples/lcms/CMakeLists.txt new file mode 100644 index 000000000..ae68fd2c8 --- /dev/null +++ b/examples/lcms/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-lcms) + +# DOCUMENTATION_START { +hunter_add_package(lcms) +find_package(lcms CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC lcms::lcms) +# DOCUMENTATION_END } diff --git a/examples/lcms/boo.cpp b/examples/lcms/boo.cpp new file mode 100644 index 000000000..ee40140f2 --- /dev/null +++ b/examples/lcms/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/lehrfempp/CMakeLists.txt b/examples/lehrfempp/CMakeLists.txt new file mode 100644 index 000000000..0dd85a781 --- /dev/null +++ b/examples/lehrfempp/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-lehrfempp) + +# DOCUMENTATION_START { +hunter_add_package(lehrfempp) +find_package(lehrfempp CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC LF::lf.base) +# DOCUMENTATION_END } diff --git a/examples/lehrfempp/boo.cpp b/examples/lehrfempp/boo.cpp new file mode 100644 index 000000000..698473175 --- /dev/null +++ b/examples/lehrfempp/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/leveldb/CMakeLists.txt b/examples/leveldb/CMakeLists.txt new file mode 100644 index 000000000..8246d930b --- /dev/null +++ b/examples/leveldb/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-leveldb) + +hunter_add_package(leveldb) + +find_package(leveldb CONFIG REQUIRED) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +add_executable(main main.cpp) +target_link_libraries(main leveldb::leveldb) diff --git a/examples/leveldb/main.cpp b/examples/leveldb/main.cpp new file mode 100644 index 000000000..de2306068 --- /dev/null +++ b/examples/leveldb/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/libcpuid/CMakeLists.txt b/examples/libcpuid/CMakeLists.txt new file mode 100644 index 000000000..5a5a9b7b0 --- /dev/null +++ b/examples/libcpuid/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libcpuid) + +hunter_add_package(libcpuid) +find_package(libcpuid CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC libcpuid::libcpuid) diff --git a/examples/libcpuid/boo.cpp b/examples/libcpuid/boo.cpp new file mode 100644 index 000000000..35a4a10d2 --- /dev/null +++ b/examples/libcpuid/boo.cpp @@ -0,0 +1,7 @@ +#include + +int main() { + uint32_t eax = 0; + uint32_t* regs = 0; + cpu_exec_cpuid(eax, regs); +} diff --git a/examples/libdill/CMakeLists.txt b/examples/libdill/CMakeLists.txt new file mode 100644 index 000000000..76309d354 --- /dev/null +++ b/examples/libdill/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-libevent) + +hunter_add_package(libdill) + +find_package(libdill CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main libdill::dill) diff --git a/examples/libdill/main.cpp b/examples/libdill/main.cpp new file mode 100644 index 000000000..c5d397a1f --- /dev/null +++ b/examples/libdill/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/libevhtp/CMakeLists.txt b/examples/libevhtp/CMakeLists.txt new file mode 100644 index 000000000..187bb33f1 --- /dev/null +++ b/examples/libevhtp/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-libevhtp) + +# DOCUMENTATION_START { +hunter_add_package(libevhtp) +find_package(libevhtp CONFIG REQUIRED) +add_executable(main main.c) +target_link_libraries(main libevhtp::evhtp) +# DOCUMENTATION_END } diff --git a/examples/libevhtp/main.c b/examples/libevhtp/main.c new file mode 100644 index 000000000..8bfefbcb3 --- /dev/null +++ b/examples/libevhtp/main.c @@ -0,0 +1,10 @@ +#include +#include + +int main() +{ + const char* query_str = "?test=true&x=1"; + evhtp_query_t* query = evhtp_parse_query(query_str, strlen(query_str)); + evhtp_query_free(query); + return 0; +} diff --git a/examples/libffi/CMakeLists.txt b/examples/libffi/CMakeLists.txt new file mode 100644 index 000000000..38bfabc88 --- /dev/null +++ b/examples/libffi/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libffi) + +hunter_add_package(libffi) +find_package(libffi CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::libffi) diff --git a/examples/libffi/foo.cpp b/examples/libffi/foo.cpp new file mode 100644 index 000000000..80c58fb5c --- /dev/null +++ b/examples/libffi/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/libigl/CMakeLists.txt b/examples/libigl/CMakeLists.txt new file mode 100644 index 000000000..89abb10b4 --- /dev/null +++ b/examples/libigl/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libigl) + +# DOCUMENTATION_START { +hunter_add_package(libigl) +find_package(libigl CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC igl::core) +# DOCUMENTATION_END } diff --git a/examples/libigl/boo.cpp b/examples/libigl/boo.cpp new file mode 100644 index 000000000..a9e7ec6b2 --- /dev/null +++ b/examples/libigl/boo.cpp @@ -0,0 +1,21 @@ +#include +#include +#include + +#define TUTORIAL_SHARED_PATH "../shared" + +Eigen::MatrixXd V; +Eigen::MatrixXi F; + +int main(int argc, char *argv[]) +{ + // Load a mesh in OFF format + igl::readOFF(TUTORIAL_SHARED_PATH "/cube.off", V, F); + + // Print the vertices and faces matrices + std::cout << "Vertices: " << std::endl << V << std::endl; + std::cout << "Faces: " << std::endl << F << std::endl; + + // Save the mesh in OBJ format + igl::writeOBJ("cube.obj",V,F); +} diff --git a/examples/libjson-rpc-cpp/CMakeLists.txt b/examples/libjson-rpc-cpp/CMakeLists.txt new file mode 100644 index 000000000..3e0ac9980 --- /dev/null +++ b/examples/libjson-rpc-cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") +project(libjson-rpc-cpp-example) + +hunter_add_package(libjson-rpc-cpp) +find_package(libjson-rpc-cpp CONFIG REQUIRED) + +# FIXME: libcrypto does not links to pthread. +find_package(Threads) + +add_executable(${PROJECT_NAME} main.cpp) +target_link_libraries(${PROJECT_NAME} libjson-rpc-cpp::client Threads::Threads) diff --git a/examples/libjson-rpc-cpp/main.cpp b/examples/libjson-rpc-cpp/main.cpp new file mode 100644 index 000000000..da3a6e59e --- /dev/null +++ b/examples/libjson-rpc-cpp/main.cpp @@ -0,0 +1,23 @@ +#include +#include +#include + +int main() +{ + jsonrpc::HttpClient http("http://localhost:8383"); + jsonrpc::Client client(http); + + Json::Value params; + params["name"] = "Peter"; + + try + { + std::cout << client.CallMethod("sayHello", params) << '\n'; + } + catch (jsonrpc::JsonRpcException const& e) + { + std::cerr << e.what() << '\n'; + } + + return 0; +} diff --git a/examples/libmill/CMakeLists.txt b/examples/libmill/CMakeLists.txt new file mode 100644 index 000000000..d994efbab --- /dev/null +++ b/examples/libmill/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.0) + +include("../common.cmake") + +project(download-libevent) + +hunter_add_package(libmill) + +find_package(libmill CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main libmill::mill_s) diff --git a/examples/libmill/main.cpp b/examples/libmill/main.cpp new file mode 100644 index 000000000..8ecf19571 --- /dev/null +++ b/examples/libmill/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/libogg/CMakeLists.txt b/examples/libogg/CMakeLists.txt new file mode 100644 index 000000000..fb08ddb3c --- /dev/null +++ b/examples/libogg/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libogg) + +# DOCUMENTATION_START { +hunter_add_package(libogg) +find_package(libogg CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo libogg::ogg) +# DOCUMENTATION_END } diff --git a/examples/libogg/foo.cpp b/examples/libogg/foo.cpp new file mode 100644 index 000000000..8e8e7a07d --- /dev/null +++ b/examples/libogg/foo.cpp @@ -0,0 +1,4 @@ +// #include (FIXME) + +int main() { +} diff --git a/examples/libpcre/CMakeLists.txt b/examples/libpcre/CMakeLists.txt new file mode 100644 index 000000000..5f4f7dae2 --- /dev/null +++ b/examples/libpcre/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pcre) + +hunter_add_package(libpcre) +find_package(libpcre CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::libpcre) diff --git a/examples/libpcre/foo.cpp b/examples/libpcre/foo.cpp new file mode 100644 index 000000000..22a75a167 --- /dev/null +++ b/examples/libpcre/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/librtmp/CMakeLists.txt b/examples/librtmp/CMakeLists.txt new file mode 100644 index 000000000..8cfaba3e5 --- /dev/null +++ b/examples/librtmp/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-librtmp) + +hunter_add_package(librtmp) +find_package(librtmp CONFIG REQUIRED) + +add_executable(librtmp_example main.cpp) +target_link_libraries(librtmp_example librtmp::librtmp) + diff --git a/examples/librtmp/main.cpp b/examples/librtmp/main.cpp new file mode 100644 index 000000000..756d176e9 --- /dev/null +++ b/examples/librtmp/main.cpp @@ -0,0 +1,14 @@ +#include + +int main(int argc, char **argv) +{ + RTMP *rtmp=RTMP_Alloc(); + + if(!rtmp) + return 1; + + RTMP_Init(rtmp); + RTMP_Free(rtmp); + + return 0; +} diff --git a/examples/libscrypt/CMakeLists.txt b/examples/libscrypt/CMakeLists.txt new file mode 100644 index 000000000..206f88d9f --- /dev/null +++ b/examples/libscrypt/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(libscrypt-test) + +# DOCUMENTATION_START { +hunter_add_package(libscrypt) +find_package(libscrypt CONFIG REQUIRED) + +add_executable(libscrypt_test main.cpp) +target_link_libraries(libscrypt_test libscrypt::scrypt) +# DOCUMENTATION_END } diff --git a/examples/libscrypt/main.cpp b/examples/libscrypt/main.cpp new file mode 100644 index 000000000..619e87bde --- /dev/null +++ b/examples/libscrypt/main.cpp @@ -0,0 +1,20 @@ +#include + +int main() +{ + const uint8_t password[] = "password"; + const uint8_t salt[] = "salt"; + uint8_t output[32]; + + return libscrypt_scrypt( + password, + sizeof(password), + salt, + sizeof(salt), + 1, + 1, + 1, + output, + sizeof(output) + ); +} diff --git a/examples/libunibreak/CMakeLists.txt b/examples/libunibreak/CMakeLists.txt new file mode 100644 index 000000000..f97408481 --- /dev/null +++ b/examples/libunibreak/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libunibreak) + +# DOCUMENTATION_START { +hunter_add_package(libunibreak) +find_package(libunibreak CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC PkgConfig::libunibreak) +# DOCUMENTATION_END } diff --git a/examples/libunibreak/boo.cpp b/examples/libunibreak/boo.cpp new file mode 100644 index 000000000..ad92f719a --- /dev/null +++ b/examples/libunibreak/boo.cpp @@ -0,0 +1,5 @@ + +#include "linebreak.h" + +int main() { +} diff --git a/examples/libusb/CMakeLists.txt b/examples/libusb/CMakeLists.txt new file mode 100644 index 000000000..79645224b --- /dev/null +++ b/examples/libusb/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libusb) + +# DOCUMENTATION_START { +hunter_add_package(libusb) +find_package(libusb-1.0 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC PkgConfig::libusb-1.0) +# DOCUMENTATION_END } diff --git a/examples/libusb/boo.cpp b/examples/libusb/boo.cpp new file mode 100644 index 000000000..b25d7a36d --- /dev/null +++ b/examples/libusb/boo.cpp @@ -0,0 +1,20 @@ +#include + +int main() { + libusb_device **devs; + int r; + ssize_t cnt; + + r = libusb_init(NULL); + if (r < 0) + return r; + + cnt = libusb_get_device_list(NULL, &devs); + if (cnt < 0) + return (int) cnt; + + libusb_free_device_list(devs, 1); + + libusb_exit(NULL); + return 0; +} diff --git a/examples/libuv/CMakeLists.txt b/examples/libuv/CMakeLists.txt new file mode 100644 index 000000000..1c85f589b --- /dev/null +++ b/examples/libuv/CMakeLists.txt @@ -0,0 +1,29 @@ +# Copyright (c) 2017, Aaditya Kalsi +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libuv) + +# download libuv +hunter_add_package(libuv) + +if(NOT EXISTS "${libuv_LICENSES}") + message(FATAL_ERROR "File not found: ${libuv_LICENSES}") +endif() + +message("License: ${libuv_LICENSES}") +message("CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}") + +find_package(libuv CONFIG REQUIRED) +add_executable(example example.c) + +target_link_libraries(example libuv::uv) + +enable_testing() + +add_test(example example) diff --git a/examples/libuv/example.c b/examples/libuv/example.c new file mode 100644 index 000000000..e7794e45d --- /dev/null +++ b/examples/libuv/example.c @@ -0,0 +1,17 @@ +#include +#include +#include +#include + +int main() { + uv_loop_t *loop = malloc(sizeof(uv_loop_t)); + assert(loop); + uv_loop_init(loop); + + printf("Now quitting.\n"); + uv_run(loop, UV_RUN_DEFAULT); + + uv_loop_close(loop); + free(loop); + return 0; +} diff --git a/examples/libxdg-basedir/CMakeLists.txt b/examples/libxdg-basedir/CMakeLists.txt new file mode 100644 index 000000000..2161a8096 --- /dev/null +++ b/examples/libxdg-basedir/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.2) + +include("../common.cmake") + +project(download-libxdg-basedir) + +# DOCUMENTATION_START { +hunter_add_package(libxdg-basedir) +find_package(libxdg-basedir CONFIG REQUIRED) + +add_executable(example example.cpp) +target_link_libraries(example PUBLIC PkgConfig::libxdg-basedir) +# DOCUMENTATION_END } diff --git a/examples/libxdg-basedir/example.cpp b/examples/libxdg-basedir/example.cpp new file mode 100644 index 000000000..413e0465d --- /dev/null +++ b/examples/libxdg-basedir/example.cpp @@ -0,0 +1,8 @@ +#include + +int main() +{ + xdgHandle xdg; + xdgInitHandle(&xdg); + xdgWipeHandle(&xdg); +} diff --git a/examples/libxml2/CMakeLists.txt b/examples/libxml2/CMakeLists.txt new file mode 100644 index 000000000..60d18be98 --- /dev/null +++ b/examples/libxml2/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016, Alexandre Pretyman +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") +project(libxml2-example) + +# DOCUMENTATION_START { +hunter_add_package(libxml2) +find_package(libxml2 CONFIG REQUIRED) + +add_executable(boo main.c) +target_link_libraries(boo PRIVATE libxml2::libxml2) +# DOCUMENTATION_END } diff --git a/examples/libxml2/main.c b/examples/libxml2/main.c new file mode 100644 index 000000000..e5b3e1e50 --- /dev/null +++ b/examples/libxml2/main.c @@ -0,0 +1,8 @@ +#include + +int main(int argc, char **argv) +{ + xmlParseDoc("{}"); + return 0; +} + diff --git a/examples/libzip/CMakeLists.txt b/examples/libzip/CMakeLists.txt new file mode 100644 index 000000000..b68ba64e3 --- /dev/null +++ b/examples/libzip/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-libzip) + +# DOCUMENTATION_START { +hunter_add_package(libzip) +find_package(libzip CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC libzip::zip) +# DOCUMENTATION_END } diff --git a/examples/libzip/boo.cpp b/examples/libzip/boo.cpp new file mode 100644 index 000000000..625e280ba --- /dev/null +++ b/examples/libzip/boo.cpp @@ -0,0 +1,217 @@ +/* + in-memory.c -- modify zip file in memory + Copyright (C) 2014-2018 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include + +#include + +static int +get_data(void **datap, size_t *sizep, const char *archive) { + /* example implementation that reads data from file */ + struct stat st; + FILE *fp; + + if ((fp = fopen(archive, "r")) == NULL) { + if (errno != ENOENT) { + fprintf(stderr, "can't open %s: %s\n", archive, strerror(errno)); + return -1; + } + + *datap = NULL; + *sizep = 0; + + return 0; + } + + if (fstat(fileno(fp), &st) < 0) { + fprintf(stderr, "can't stat %s: %s\n", archive, strerror(errno)); + fclose(fp); + return -1; + } + + if ((*datap = malloc((size_t)st.st_size)) == NULL) { + fprintf(stderr, "can't allocate buffer\n"); + fclose(fp); + return -1; + } + + if (fread(*datap, 1, (size_t)st.st_size, fp) < (size_t)st.st_size) { + fprintf(stderr, "can't read %s: %s\n", archive, strerror(errno)); + free(*datap); + fclose(fp); + return -1; + } + + fclose(fp); + + *sizep = (size_t)st.st_size; + return 0; +} + +static int +modify_archive(zip_t *za) { + /* modify the archive */ + return 0; +} + + +static int +use_data(void *data, size_t size, const char *archive) { + /* example implementation that writes data to file */ + FILE *fp; + + if (data == NULL) { + if (remove(archive) < 0 && errno != ENOENT) { + fprintf(stderr, "can't remove %s: %s\n", archive, strerror(errno)); + return -1; + } + return 0; + } + + if ((fp = fopen(archive, "wb")) == NULL) { + fprintf(stderr, "can't open %s: %s\n", archive, strerror(errno)); + return -1; + } + if (fwrite(data, 1, size, fp) < size) { + fprintf(stderr, "can't write %s: %s\n", archive, strerror(errno)); + fclose(fp); + return -1; + } + if (fclose(fp) < 0) { + fprintf(stderr, "can't write %s: %s\n", archive, strerror(errno)); + return -1; + } + + return 0; +} + + +int +main(int argc, char *argv[]) { + const char *archive; + zip_source_t *src; + zip_t *za; + zip_error_t error; + void *data; + size_t size; + + if (argc < 2) { + fprintf(stderr, "usage: %s archive\n", argv[0]); + return 1; + } + archive = argv[1]; + + /* get buffer with zip archive inside */ + if (get_data(&data, &size, archive) < 0) { + return 1; + } + + zip_error_init(&error); + /* create source from buffer */ + if ((src = zip_source_buffer_create(data, size, 1, &error)) == NULL) { + fprintf(stderr, "can't create source: %s\n", zip_error_strerror(&error)); + free(data); + zip_error_fini(&error); + return 1; + } + + /* open zip archive from source */ + if ((za = zip_open_from_source(src, 0, &error)) == NULL) { + fprintf(stderr, "can't open zip from source: %s\n", zip_error_strerror(&error)); + zip_source_free(src); + zip_error_fini(&error); + return 1; + } + zip_error_fini(&error); + + /* we'll want to read the data back after zip_close */ + zip_source_keep(src); + + /* modify archive */ + modify_archive(za); + + /* close archive */ + if (zip_close(za) < 0) { + fprintf(stderr, "can't close zip archive '%s': %s\n", archive, zip_strerror(za)); + return 1; + } + + + /* copy new archive to buffer */ + + if (zip_source_is_deleted(src)) { + /* new archive is empty, thus no data */ + data = NULL; + } + else { + zip_stat_t zst; + + if (zip_source_stat(src, &zst) < 0) { + fprintf(stderr, "can't stat source: %s\n", zip_error_strerror(zip_source_error(src))); + return 1; + } + + size = zst.size; + + if (zip_source_open(src) < 0) { + fprintf(stderr, "can't open source: %s\n", zip_error_strerror(zip_source_error(src))); + return 1; + } + if ((data = malloc(size)) == NULL) { + fprintf(stderr, "malloc failed: %s\n", strerror(errno)); + zip_source_close(src); + return 1; + } + if ((zip_uint64_t)zip_source_read(src, data, size) < size) { + fprintf(stderr, "can't read data from source: %s\n", zip_error_strerror(zip_source_error(src))); + zip_source_close(src); + free(data); + return 1; + } + zip_source_close(src); + } + + /* we're done with src */ + zip_source_free(src); + + /* use new data */ + use_data(data, size, archive); + + free(data); + + return 0; +} diff --git a/examples/lmdb/CMakeLists.txt b/examples/lmdb/CMakeLists.txt new file mode 100644 index 000000000..c84c89460 --- /dev/null +++ b/examples/lmdb/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-lmdb) + +hunter_add_package(lmdb) +find_package(liblmdb CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo liblmdb::lmdb) + diff --git a/examples/lmdb/foo.cpp b/examples/lmdb/foo.cpp new file mode 100644 index 000000000..93e330ab4 --- /dev/null +++ b/examples/lmdb/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/lmdbxx/CMakeLists.txt b/examples/lmdbxx/CMakeLists.txt new file mode 100644 index 000000000..483e80cc0 --- /dev/null +++ b/examples/lmdbxx/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-lmdbxx) + +hunter_add_package(lmdbxx) + +find_package(lmdbxx CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main lmdbxx::lmdbxx) diff --git a/examples/lmdbxx/main.cpp b/examples/lmdbxx/main.cpp new file mode 100644 index 000000000..0c320955b --- /dev/null +++ b/examples/lmdbxx/main.cpp @@ -0,0 +1,34 @@ +/* This is free and unencumbered software released into the public domain. */ + +#include +#include +#include + +int main() { + /* Create and open the LMDB environment: */ + auto env = lmdb::env::create(); + env.set_mapsize(1UL * 1024UL * 1024UL * 1024UL); /* 1 GiB */ + env.open("./example.mdb", 0, 0664); + + /* Insert some key/value pairs in a write transaction: */ + auto wtxn = lmdb::txn::begin(env); + auto dbi = lmdb::dbi::open(wtxn, nullptr); + dbi.put(wtxn, "username", "jhacker"); + dbi.put(wtxn, "email", "jhacker@example.org"); + dbi.put(wtxn, "fullname", "J. Random Hacker"); + wtxn.commit(); + + /* Fetch key/value pairs in a read-only transaction: */ + auto rtxn = lmdb::txn::begin(env, nullptr, MDB_RDONLY); + auto cursor = lmdb::cursor::open(rtxn, dbi); + std::string key, value; + while (cursor.get(key, value, MDB_NEXT)) { + std::printf("key: '%s', value: '%s'\n", key.c_str(), value.c_str()); + } + cursor.close(); + rtxn.abort(); + + /* The enviroment is closed automatically. */ + + return EXIT_SUCCESS; +} diff --git a/examples/lz4/CMakeLists.txt b/examples/lz4/CMakeLists.txt new file mode 100644 index 000000000..5ccb3bea2 --- /dev/null +++ b/examples/lz4/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-lz4) + +hunter_add_package(lz4) +find_package(lz4 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC lz4::lz4) diff --git a/examples/lz4/boo.cpp b/examples/lz4/boo.cpp new file mode 100644 index 000000000..12e210ff2 --- /dev/null +++ b/examples/lz4/boo.cpp @@ -0,0 +1,13 @@ +#include +#include + +int main() { + const char* source = ""; + char* dest = 0; + int sourceSize = 0; + int maxDestSize = 0; + int acceleration = 0; + + const int result = LZ4_compress_fast (source, dest, sourceSize, maxDestSize, acceleration); + return result; +} diff --git a/examples/lzma/CMakeLists.txt b/examples/lzma/CMakeLists.txt new file mode 100644 index 000000000..976cf11f9 --- /dev/null +++ b/examples/lzma/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-lzma) + +hunter_add_package(lzma) +find_package(lzma CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo lzma::lzma) diff --git a/examples/lzma/foo.cpp b/examples/lzma/foo.cpp new file mode 100644 index 000000000..0691c0a3e --- /dev/null +++ b/examples/lzma/foo.cpp @@ -0,0 +1,6 @@ +#include +#include + +int main() { + std::cout << "lzma version: '" << lzma_version_string() << "'" << std::endl; +} diff --git a/examples/magnum/CMakeLists.txt b/examples/magnum/CMakeLists.txt new file mode 100644 index 000000000..bcf1385d7 --- /dev/null +++ b/examples/magnum/CMakeLists.txt @@ -0,0 +1,34 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-magnum) + +# The part below is adapted from +# https://github.com/mosra/magnum-examples/blob/master/src/primitives/CMakeLists.txt + +project(MagnumPrimitivesExample) + +# DOCUMENTATION_START { +hunter_add_package(magnum) +find_package(Magnum CONFIG REQUIRED + GL + MeshTools + Primitives + Shaders + Sdl2Application) + +add_executable(magnum-primitives PrimitivesExample.cpp) +target_link_libraries(magnum-primitives PRIVATE + Magnum::Application + Magnum::GL + Magnum::Magnum + Magnum::MeshTools + Magnum::Primitives + Magnum::Shaders) +# DOCUMENTATION_END } diff --git a/examples/magnum/PrimitivesExample.cpp b/examples/magnum/PrimitivesExample.cpp new file mode 100644 index 000000000..e1374ff85 --- /dev/null +++ b/examples/magnum/PrimitivesExample.cpp @@ -0,0 +1,146 @@ +// Copied from https://raw.githubusercontent.com/mosra/magnum-examples/master/src/primitives/PrimitivesExample.cpp +/* + This file is part of Magnum. + + Original authors — credit is appreciated but not required: + + 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 — + Vladimír VondruÅ¡ + + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or distribute + this software, either in source code form or as a compiled binary, for any + purpose, commercial or non-commercial, and by any means. + + In jurisdictions that recognize copyright laws, the author or authors of + this software dedicate any and all copyright interest in the software to + the public domain. We make this dedication for the benefit of the public + at large and to the detriment of our heirs and successors. We intend this + dedication to be an overt act of relinquishment in perpetuity of all + present and future rights to this software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 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. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Magnum { namespace Examples { + +using namespace Magnum::Math::Literals; + +class PrimitivesExample: public Platform::Application { + public: + explicit PrimitivesExample(const Arguments& arguments); + + private: + void drawEvent() override; + void mousePressEvent(MouseEvent& event) override; + void mouseReleaseEvent(MouseEvent& event) override; + void mouseMoveEvent(MouseMoveEvent& event) override; + + GL::Buffer _indexBuffer, _vertexBuffer; + GL::Mesh _mesh; + Shaders::Phong _shader; + + Matrix4 _transformation, _projection; + Vector2i _previousMousePosition; + Color3 _color; +}; + +PrimitivesExample::PrimitivesExample(const Arguments& arguments): + Platform::Application{arguments, Configuration{}.setTitle("Magnum Primitives Example")} +{ + GL::Renderer::enable(GL::Renderer::Feature::DepthTest); + GL::Renderer::enable(GL::Renderer::Feature::FaceCulling); + + const Trade::MeshData3D cube = Primitives::cubeSolid(); + + _vertexBuffer.setData(MeshTools::interleave(cube.positions(0), cube.normals(0))); + + Containers::Array indexData; + MeshIndexType indexType; + UnsignedInt indexStart, indexEnd; + std::tie(indexData, indexType, indexStart, indexEnd) = + MeshTools::compressIndices(cube.indices()); + _indexBuffer.setData(indexData); + + _mesh.setPrimitive(cube.primitive()) + .setCount(cube.indices().size()) + .addVertexBuffer(_vertexBuffer, 0, Shaders::Phong::Position{}, + Shaders::Phong::Normal{}) + .setIndexBuffer(_indexBuffer, 0, indexType, indexStart, indexEnd); + + _transformation = + Matrix4::rotationX(30.0_degf)*Matrix4::rotationY(40.0_degf); + _projection = + Matrix4::perspectiveProjection( + 35.0_degf, Vector2{windowSize()}.aspectRatio(), 0.01f, 100.0f)* + Matrix4::translation(Vector3::zAxis(-10.0f)); + _color = Color3::fromHsv(35.0_degf, 1.0f, 1.0f); +} + +void PrimitivesExample::drawEvent() { + GL::defaultFramebuffer.clear( + GL::FramebufferClear::Color|GL::FramebufferClear::Depth); + + _shader.setLightPosition({7.0f, 5.0f, 2.5f}) + .setLightColor(Color3{1.0f}) + .setDiffuseColor(_color) + .setAmbientColor(Color3::fromHsv(_color.hue(), 1.0f, 0.3f)) + .setTransformationMatrix(_transformation) + .setNormalMatrix(_transformation.rotationScaling()) + .setProjectionMatrix(_projection); + _mesh.draw(_shader); + + swapBuffers(); +} + +void PrimitivesExample::mousePressEvent(MouseEvent& event) { + if(event.button() != MouseEvent::Button::Left) return; + + _previousMousePosition = event.position(); + event.setAccepted(); +} + +void PrimitivesExample::mouseReleaseEvent(MouseEvent& event) { + _color = Color3::fromHsv(_color.hue() + 50.0_degf, 1.0f, 1.0f); + + event.setAccepted(); + redraw(); +} + +void PrimitivesExample::mouseMoveEvent(MouseMoveEvent& event) { + if(!(event.buttons() & MouseMoveEvent::Button::Left)) return; + + const Vector2 delta = 3.0f* + Vector2{event.position() - _previousMousePosition}/ + Vector2{GL::defaultFramebuffer.viewport().size()}; + + _transformation = + Matrix4::rotationX(Rad{delta.y()})* + _transformation* + Matrix4::rotationY(Rad{delta.x()}); + + _previousMousePosition = event.position(); + event.setAccepted(); + redraw(); +} + +}} + +MAGNUM_APPLICATION_MAIN(Magnum::Examples::PrimitivesExample) diff --git a/examples/md5/CMakeLists.txt b/examples/md5/CMakeLists.txt new file mode 100644 index 000000000..593495110 --- /dev/null +++ b/examples/md5/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-md5) + +hunter_add_package(md5) +find_package(md5 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC md5::md5) diff --git a/examples/md5/boo.cpp b/examples/md5/boo.cpp new file mode 100644 index 000000000..957c9513d --- /dev/null +++ b/examples/md5/boo.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + md5_state_t x; + md5_init(&x); +} diff --git a/examples/mkl/CMakeLists.txt b/examples/mkl/CMakeLists.txt new file mode 100644 index 000000000..01cd2b86b --- /dev/null +++ b/examples/mkl/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-mkl) + +# DOCUMENTATION_START { +hunter_add_package(mkl) + +include_directories("${MKL_ROOT}/include") + +add_executable(boo boo.cpp) +# DOCUMENTATION_END } diff --git a/examples/mkl/boo.cpp b/examples/mkl/boo.cpp new file mode 100644 index 000000000..a40f7d2b7 --- /dev/null +++ b/examples/mkl/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/mkldnn/CMakeLists.txt b/examples/mkldnn/CMakeLists.txt new file mode 100644 index 000000000..2004fc078 --- /dev/null +++ b/examples/mkldnn/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-mkldnn) + +# DOCUMENTATION_START { +hunter_add_package(mkldnn) +find_package(mkldnn CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC MKLDNN::mkldnn) +# DOCUMENTATION_END } diff --git a/examples/mkldnn/boo.cpp b/examples/mkldnn/boo.cpp new file mode 100644 index 000000000..8ebc5c5bc --- /dev/null +++ b/examples/mkldnn/boo.cpp @@ -0,0 +1,820 @@ +/******************************************************************************* +* Copyright 2016-2018 Intel Corporation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +#include +#include +#include +#include + +#include "mkldnn.hpp" + +using namespace mkldnn; + +using namespace std; + +void simple_net(int times = 100) { + + auto cpu_engine = engine(engine::cpu, 0); + + /* Create a vector primitive to hold the network. For efficienty purpose, + * weights are stored in a separate net to perform reordering only once. */ + std::vector net; + std::vector net_weights; + + const int batch = 1; + + /* AlexNet: conv1 + * {batch, 3, 227, 227} (x) {96, 3, 11, 11} -> {batch, 96, 55, 55} + * strides: {4, 4} + */ + memory::dims conv1_src_tz = { batch, 3, 227, 227 }; + memory::dims conv1_weights_tz = { 96, 3, 11, 11 }; + memory::dims conv1_bias_tz = { 96 }; + memory::dims conv1_dst_tz = { batch, 96, 55, 55 }; + memory::dims conv1_strides = { 4, 4 }; + auto conv1_padding = { 0, 0 }; + + /* Allocate input and output buffers for user data */ + std::vector user_src(batch * 3 * 227 * 227); + std::vector user_dst(batch * 1000); + + /* Allocate and fill buffers for weights and bias */ + std::vector conv1_weights(std::accumulate( + conv1_weights_tz.begin(), conv1_weights_tz.end(), 1, + std::multiplies())); + std::vector conv1_bias(std::accumulate(conv1_bias_tz.begin(), + conv1_bias_tz.end(), 1, std::multiplies())); + + /* create memory for user data */ + auto user_src_memory + = memory({ { { conv1_src_tz }, memory::data_type::f32, + memory::format::nchw }, + cpu_engine }, + user_src.data()); + auto user_weights_memory + = memory({ { { conv1_weights_tz }, memory::data_type::f32, + memory::format::oihw }, + cpu_engine }, + conv1_weights.data()); + auto user_bias_memory = memory( + { { { conv1_bias_tz }, memory::data_type::f32, memory::format::x }, + cpu_engine }, + conv1_bias.data()); + + /* create memory descriptors for convolution data w/ no specified format + */ + auto conv1_src_md = memory::desc( + { conv1_src_tz }, memory::data_type::f32, memory::format::any); + auto conv1_bias_md = memory::desc( + { conv1_bias_tz }, memory::data_type::f32, memory::format::any); + auto conv1_weights_md = memory::desc( + { conv1_weights_tz }, memory::data_type::f32, memory::format::any); + auto conv1_dst_md = memory::desc( + { conv1_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a convolution */ + auto conv1_desc = convolution_forward::desc( + prop_kind::forward_inference, convolution_direct, conv1_src_md, + conv1_weights_md, conv1_bias_md, conv1_dst_md, conv1_strides, + conv1_padding, conv1_padding, padding_kind::zero); + auto conv1_prim_desc + = convolution_forward::primitive_desc(conv1_desc, cpu_engine); + + /* create reorders for data and weights if layout requested by + * convolution is different from NCHW/OIHW */ + auto conv1_src_memory = user_src_memory; + if (memory::primitive_desc(conv1_prim_desc.src_primitive_desc()) + != user_src_memory.get_primitive_desc()) { + conv1_src_memory = memory(conv1_prim_desc.src_primitive_desc()); + net.push_back(reorder(user_src_memory, conv1_src_memory)); + } + + auto conv1_weights_memory = user_weights_memory; + if (memory::primitive_desc(conv1_prim_desc.weights_primitive_desc()) + != user_weights_memory.get_primitive_desc()) { + conv1_weights_memory + = memory(conv1_prim_desc.weights_primitive_desc()); + net_weights.push_back( + reorder(user_weights_memory, conv1_weights_memory)); + } + + auto conv1_dst_memory = memory(conv1_prim_desc.dst_primitive_desc()); + + /* create convolution primitive and add it to net */ + net.push_back(convolution_forward(conv1_prim_desc, conv1_src_memory, + conv1_weights_memory, user_bias_memory, + conv1_dst_memory)); + + /* AlexNet: relu1 + * {batch, 96, 55, 55} -> {batch, 96, 55, 55} + */ + const float negative1_slope = 1.0f; + + /* create relu primitive and add it to net */ + auto relu1_desc = eltwise_forward::desc(prop_kind::forward_inference, + algorithm::eltwise_relu, + conv1_dst_memory.get_primitive_desc().desc(), negative1_slope); + auto relu1_prim_desc + = eltwise_forward::primitive_desc(relu1_desc, cpu_engine); + + net.push_back(eltwise_forward( + relu1_prim_desc, conv1_dst_memory, conv1_dst_memory)); + + /* AlexNet: lrn1 + * {batch, 96, 55, 55} -> {batch, 96, 55, 55} + * local size: 5 + * alpha1: 0.0001 + * beta1: 0.75 + */ + const uint32_t local1_size = 5; + const float alpha1 = 0.0001f; + const float beta1 = 0.75f; + const float k1 = 1.0f; + + /* create lrn primitive and add it to net */ + auto lrn1_desc = lrn_forward::desc(prop_kind::forward_inference, + lrn_across_channels, + conv1_dst_memory.get_primitive_desc().desc(), local1_size, + alpha1, beta1, k1); + auto lrn1_prim_desc + = lrn_forward::primitive_desc(lrn1_desc, cpu_engine); + auto lrn1_dst_memory = memory(lrn1_prim_desc.dst_primitive_desc()); + + net.push_back( + lrn_forward(lrn1_prim_desc, conv1_dst_memory, lrn1_dst_memory)); + + /* AlexNet: pool1 + * {batch, 96, 55, 55} -> {batch, 96, 27, 27} + * kernel: {3, 3} + * strides: {2, 2} + */ + + memory::dims pool1_dst_tz = { batch, 96, 27, 27 }; + memory::dims pool1_kernel = { 3, 3 }; + memory::dims pool1_strides = { 2, 2 }; + auto pool_padding = { 0, 0 }; + + auto pool1_dst_md = memory::desc( + { pool1_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a pooling */ + auto pool1_desc = pooling_forward::desc(prop_kind::forward_inference, + pooling_max, lrn1_dst_memory.get_primitive_desc().desc(), + pool1_dst_md, pool1_strides, pool1_kernel, pool_padding, + pool_padding, padding_kind::zero); + auto pool1_pd = pooling_forward::primitive_desc(pool1_desc, cpu_engine); + auto pool1_dst_memory = memory(pool1_pd.dst_primitive_desc()); + + /* create pooling primitive an add it to net */ + net.push_back( + pooling_forward(pool1_pd, lrn1_dst_memory, pool1_dst_memory)); + + /* AlexNet: conv2 + * {batch, 96, 27, 27} (x) {2, 128, 48, 5, 5} -> {batch, 256, 27, 27} + * strides: {1, 1} + */ + memory::dims conv2_src_tz = { batch, 96, 27, 27 }; + memory::dims conv2_weights_tz = { 2, 128, 48, 5, 5 }; + memory::dims conv2_bias_tz = { 256 }; + memory::dims conv2_dst_tz = { batch, 256, 27, 27 }; + memory::dims conv2_strides = { 1, 1 }; + auto conv2_padding = { 2, 2 }; + + std::vector conv2_weights(std::accumulate( + conv2_weights_tz.begin(), conv2_weights_tz.end(), 1, + std::multiplies())); + std::vector conv2_bias(std::accumulate(conv2_bias_tz.begin(), + conv2_bias_tz.end(), 1, std::multiplies())); + + /* create memory for user data */ + auto conv2_user_weights_memory + = memory({ { { conv2_weights_tz }, memory::data_type::f32, + memory::format::goihw }, + cpu_engine }, + conv2_weights.data()); + auto conv2_user_bias_memory + = memory({ { { conv2_bias_tz }, memory::data_type::f32, + memory::format::x }, + cpu_engine }, + conv2_bias.data()); + + /* create memory descriptors for convolution data w/ no specified format + */ + auto conv2_src_md = memory::desc( + { conv2_src_tz }, memory::data_type::f32, memory::format::any); + auto conv2_bias_md = memory::desc( + { conv2_bias_tz }, memory::data_type::f32, memory::format::any); + auto conv2_weights_md = memory::desc({ conv2_weights_tz }, + memory::data_type::f32, memory::format::any); + auto conv2_dst_md = memory::desc( + { conv2_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a convolution */ + auto conv2_desc = convolution_forward::desc( + prop_kind::forward_inference, convolution_direct, conv2_src_md, + conv2_weights_md, conv2_bias_md, conv2_dst_md, conv2_strides, + conv2_padding, conv2_padding, padding_kind::zero); + auto conv2_prim_desc + = convolution_forward::primitive_desc(conv2_desc, cpu_engine); + + auto conv2_src_memory = pool1_dst_memory; + if (memory::primitive_desc(conv2_prim_desc.src_primitive_desc()) + != conv2_src_memory.get_primitive_desc()) { + conv2_src_memory = memory(conv2_prim_desc.src_primitive_desc()); + net.push_back(reorder(pool1_dst_memory, conv2_src_memory)); + } + + auto conv2_weights_memory = conv2_user_weights_memory; + if (memory::primitive_desc(conv2_prim_desc.weights_primitive_desc()) + != conv2_user_weights_memory.get_primitive_desc()) { + conv2_weights_memory + = memory(conv2_prim_desc.weights_primitive_desc()); + net_weights.push_back( + reorder(conv2_user_weights_memory, conv2_weights_memory)); + } + + auto conv2_dst_memory = memory(conv2_prim_desc.dst_primitive_desc()); + + /* create convolution primitive and add it to net */ + net.push_back(convolution_forward(conv2_prim_desc, conv2_src_memory, + conv2_weights_memory, conv2_user_bias_memory, + conv2_dst_memory)); + + /* AlexNet: relu2 + * {batch, 256, 27, 27} -> {batch, 256, 27, 27} + */ + const float negative2_slope = 1.0f; + + /* create relu primitive and add it to net */ + auto relu2_desc = eltwise_forward::desc(prop_kind::forward_inference, + algorithm::eltwise_relu, + conv2_dst_memory.get_primitive_desc().desc(), negative2_slope); + auto relu2_prim_desc + = eltwise_forward::primitive_desc(relu2_desc, cpu_engine); + + net.push_back(eltwise_forward( + relu2_prim_desc, conv2_dst_memory, conv2_dst_memory)); + + /* AlexNet: lrn2 + * {batch, 256, 27, 27} -> {batch, 256, 27, 27} + * local size: 5 + * alpha2: 0.0001 + * beta2: 0.75 + */ + const uint32_t local2_size = 5; + const float alpha2 = 0.0001f; + const float beta2 = 0.75f; + const float k2 = 1.0f; + + /* create lrn primitive and add it to net */ + auto lrn2_desc = lrn_forward::desc(prop_kind::forward_inference, + lrn_across_channels, + conv2_prim_desc.dst_primitive_desc().desc(), local2_size, + alpha2, beta2, k2); + auto lrn2_prim_desc + = lrn_forward::primitive_desc(lrn2_desc, cpu_engine); + auto lrn2_dst_memory = memory(lrn2_prim_desc.dst_primitive_desc()); + + net.push_back( + lrn_forward(lrn2_prim_desc, conv2_dst_memory, lrn2_dst_memory)); + + /* AlexNet: pool2 + * {batch, 256, 27, 27} -> {batch, 256, 13, 13} + * kernel: {3, 3} + * strides: {2, 2} + */ + + memory::dims pool2_dst_tz = { batch, 256, 13, 13 }; + memory::dims pool2_kernel = { 3, 3 }; + memory::dims pool2_strides = { 2, 2 }; + auto pool2_padding = { 0, 0 }; + + auto pool2_dst_md = memory::desc( + { pool2_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a pooling */ + auto pool2_desc = pooling_forward::desc(prop_kind::forward_inference, + pooling_max, lrn2_dst_memory.get_primitive_desc().desc(), + pool2_dst_md, pool2_strides, pool2_kernel, pool2_padding, + pool2_padding, padding_kind::zero); + auto pool2_pd = pooling_forward::primitive_desc(pool2_desc, cpu_engine); + + auto pool2_dst_memory = memory(pool2_pd.dst_primitive_desc()); + + /* create pooling primitive an add it to net */ + net.push_back( + pooling_forward(pool2_pd, lrn2_dst_memory, pool2_dst_memory)); + + // ------- + /* AlexNet: conv3 + * {batch, 256, 13, 13} (x) {384, 256, 3, 3}; -> {batch, 384, 13, 13}; + * strides: {1, 1} + */ + memory::dims conv3_src_tz = { batch, 256, 13, 13 }; + memory::dims conv3_weights_tz = { 384, 256, 3, 3 }; + memory::dims conv3_bias_tz = { 384 }; + memory::dims conv3_dst_tz = { batch, 384, 13, 13 }; + memory::dims conv3_strides = { 1, 1 }; + auto conv3_padding = { 1, 1 }; + + std::vector conv3_weights(std::accumulate( + conv3_weights_tz.begin(), conv3_weights_tz.end(), 1, + std::multiplies())); + std::vector conv3_bias(std::accumulate(conv3_bias_tz.begin(), + conv3_bias_tz.end(), 1, std::multiplies())); + + /* create memory for user data */ + auto conv3_user_weights_memory + = memory({ { { conv3_weights_tz }, memory::data_type::f32, + memory::format::oihw }, + cpu_engine }, + conv3_weights.data()); + auto conv3_user_bias_memory + = memory({ { { conv3_bias_tz }, memory::data_type::f32, + memory::format::x }, + cpu_engine }, + conv3_bias.data()); + + /* create memory descriptors for convolution data w/ no specified format + */ + auto conv3_src_md = memory::desc( + { conv3_src_tz }, memory::data_type::f32, memory::format::any); + auto conv3_bias_md = memory::desc( + { conv3_bias_tz }, memory::data_type::f32, memory::format::any); + auto conv3_weights_md = memory::desc({ conv3_weights_tz }, + memory::data_type::f32, memory::format::any); + auto conv3_dst_md = memory::desc( + { conv3_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a convolution */ + auto conv3_desc = convolution_forward::desc( + prop_kind::forward_inference, convolution_direct, conv3_src_md, + conv3_weights_md, conv3_bias_md, conv3_dst_md, conv3_strides, + conv3_padding, conv3_padding, padding_kind::zero); + auto conv3_prim_desc + = convolution_forward::primitive_desc(conv3_desc, cpu_engine); + + auto conv3_src_memory = pool2_dst_memory; + if (memory::primitive_desc(conv3_prim_desc.src_primitive_desc()) + != conv3_src_memory.get_primitive_desc()) { + conv3_src_memory = memory(conv3_prim_desc.src_primitive_desc()); + net.push_back(reorder(pool2_dst_memory, conv3_src_memory)); + } + + auto conv3_weights_memory = conv3_user_weights_memory; + if (memory::primitive_desc(conv3_prim_desc.weights_primitive_desc()) + != conv3_user_weights_memory.get_primitive_desc()) { + conv3_weights_memory + = memory(conv3_prim_desc.weights_primitive_desc()); + net_weights.push_back( + reorder(conv3_user_weights_memory, conv3_weights_memory)); + } + + auto conv3_dst_memory = memory(conv3_prim_desc.dst_primitive_desc()); + + /* create convolution primitive and add it to net */ + net.push_back(convolution_forward(conv3_prim_desc, conv3_src_memory, + conv3_weights_memory, conv3_user_bias_memory, + conv3_dst_memory)); + + /* AlexNet: relu3 + * {batch, 384, 13, 13} -> {batch, 384, 13, 13} + */ + const float negative3_slope = 1.0f; + + /* create relu primitive and add it to net */ + auto relu3_desc = eltwise_forward::desc(prop_kind::forward_inference, + algorithm::eltwise_relu, + conv3_dst_memory.get_primitive_desc().desc(), negative3_slope); + auto relu3_prim_desc + = eltwise_forward::primitive_desc(relu3_desc, cpu_engine); + + net.push_back(eltwise_forward( + relu3_prim_desc, conv3_dst_memory, conv3_dst_memory)); + + /* AlexNet: conv4 + * {batch, 384, 13, 13} (x) {2, 192, 192, 3, 3}; -> {batch, 384, 13, + * 13}; + * strides: {1, 1} + */ + memory::dims conv4_src_tz = { batch, 384, 13, 13 }; + memory::dims conv4_weights_tz = { 2, 192, 192, 3, 3 }; + memory::dims conv4_bias_tz = { 384 }; + memory::dims conv4_dst_tz = { batch, 384, 13, 13 }; + memory::dims conv4_strides = { 1, 1 }; + auto conv4_padding = { 1, 1 }; + + std::vector conv4_weights(std::accumulate( + conv4_weights_tz.begin(), conv4_weights_tz.end(), 1, + std::multiplies())); + std::vector conv4_bias(std::accumulate(conv4_bias_tz.begin(), + conv4_bias_tz.end(), 1, std::multiplies())); + + /* create memory for user data */ + auto conv4_user_weights_memory + = memory({ { { conv4_weights_tz }, memory::data_type::f32, + memory::format::goihw }, + cpu_engine }, + conv4_weights.data()); + auto conv4_user_bias_memory + = memory({ { { conv4_bias_tz }, memory::data_type::f32, + memory::format::x }, + cpu_engine }, + conv4_bias.data()); + + /* create memory descriptors for convolution data w/ no specified format + */ + auto conv4_src_md = memory::desc( + { conv4_src_tz }, memory::data_type::f32, memory::format::any); + auto conv4_bias_md = memory::desc( + { conv4_bias_tz }, memory::data_type::f32, memory::format::any); + auto conv4_weights_md = memory::desc({ conv4_weights_tz }, + memory::data_type::f32, memory::format::any); + auto conv4_dst_md = memory::desc( + { conv4_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a convolution */ + auto conv4_desc = convolution_forward::desc( + prop_kind::forward_inference, convolution_direct, conv4_src_md, + conv4_weights_md, conv4_bias_md, conv4_dst_md, conv4_strides, + conv4_padding, conv4_padding, padding_kind::zero); + auto conv4_prim_desc + = convolution_forward::primitive_desc(conv4_desc, cpu_engine); + + auto conv4_src_memory = conv3_dst_memory; + if (memory::primitive_desc(conv4_prim_desc.src_primitive_desc()) + != conv4_src_memory.get_primitive_desc()) { + conv4_src_memory = memory(conv4_prim_desc.src_primitive_desc()); + net.push_back(reorder(conv3_dst_memory, conv4_src_memory)); + } + + auto conv4_weights_memory = conv4_user_weights_memory; + if (memory::primitive_desc(conv4_prim_desc.weights_primitive_desc()) + != conv4_user_weights_memory.get_primitive_desc()) { + conv4_weights_memory + = memory(conv4_prim_desc.weights_primitive_desc()); + net_weights.push_back( + reorder(conv4_user_weights_memory, conv4_weights_memory)); + } + + auto conv4_dst_memory = memory(conv4_prim_desc.dst_primitive_desc()); + + /* create convolution primitive and add it to net */ + net.push_back(convolution_forward(conv4_prim_desc, conv4_src_memory, + conv4_weights_memory, conv4_user_bias_memory, + conv4_dst_memory)); + + /* AlexNet: relu4 + * {batch, 384, 13, 13} -> {batch, 384, 13, 13} + */ + const float negative4_slope = 1.0f; + + /* create relu primitive and add it to net */ + auto relu4_desc = eltwise_forward::desc(prop_kind::forward_inference, + algorithm::eltwise_relu, + conv4_dst_memory.get_primitive_desc().desc(), negative4_slope); + auto relu4_prim_desc + = eltwise_forward::primitive_desc(relu4_desc, cpu_engine); + + net.push_back(eltwise_forward( + relu4_prim_desc, conv4_dst_memory, conv4_dst_memory)); + + /* AlexNet: conv5 + * {batch, 384, 13, 13} (x) {2, 128, 192, 3, 3}; -> {batch, 256, 13, + * 13}; + * strides: {1, 1} + */ + memory::dims conv5_weights_tz = { 2, 128, 192, 3, 3 }; + memory::dims conv5_bias_tz = { 256 }; + memory::dims conv5_dst_tz = { batch, 256, 13, 13 }; + memory::dims conv5_strides = { 1, 1 }; + auto conv5_padding = { 1, 1 }; + + std::vector conv5_weights(std::accumulate( + conv5_weights_tz.begin(), conv5_weights_tz.end(), 1, + std::multiplies())); + std::vector conv5_bias(std::accumulate(conv5_bias_tz.begin(), + conv5_bias_tz.end(), 1, std::multiplies())); + + /* create memory for user data */ + auto conv5_user_weights_memory + = memory({ { { conv5_weights_tz }, memory::data_type::f32, + memory::format::goihw }, + cpu_engine }, + conv5_weights.data()); + auto conv5_user_bias_memory + = memory({ { { conv5_bias_tz }, memory::data_type::f32, + memory::format::x }, + cpu_engine }, + conv5_bias.data()); + + /* create memory descriptors for convolution data w/ no specified format + */ + auto conv5_bias_md = memory::desc( + { conv5_bias_tz }, memory::data_type::f32, memory::format::any); + auto conv5_weights_md = memory::desc({ conv5_weights_tz }, + memory::data_type::f32, memory::format::any); + auto conv5_dst_md = memory::desc( + { conv5_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a convolution */ + auto conv5_desc = convolution_forward::desc( + prop_kind::forward_inference, convolution_direct, + conv4_dst_memory.get_primitive_desc().desc(), conv5_weights_md, + conv5_bias_md, conv5_dst_md, conv5_strides, conv5_padding, + conv5_padding, padding_kind::zero); + auto conv5_prim_desc + = convolution_forward::primitive_desc(conv5_desc, cpu_engine); + + auto conv5_src_memory = conv4_dst_memory; + if (memory::primitive_desc(conv5_prim_desc.src_primitive_desc()) + != conv5_src_memory.get_primitive_desc()) { + conv5_src_memory = memory(conv5_prim_desc.src_primitive_desc()); + net.push_back(reorder(conv4_dst_memory, conv5_src_memory)); + } + + auto conv5_weights_memory = conv5_user_weights_memory; + if (memory::primitive_desc(conv5_prim_desc.weights_primitive_desc()) + != conv5_user_weights_memory.get_primitive_desc()) { + conv5_weights_memory + = memory(conv5_prim_desc.weights_primitive_desc()); + net_weights.push_back( + reorder(conv5_user_weights_memory, conv5_weights_memory)); + } + + auto conv5_dst_memory = memory(conv5_prim_desc.dst_primitive_desc()); + + /* create convolution primitive and add it to net */ + net.push_back(convolution_forward(conv5_prim_desc, conv5_src_memory, + conv5_weights_memory, conv5_user_bias_memory, + conv5_dst_memory)); + + /* AlexNet: relu5 + * {batch, 256, 13, 13} -> {batch, 256, 13, 13} + */ + const float negative5_slope = 1.0f; + + /* create relu primitive and add it to net */ + auto relu5_desc = eltwise_forward::desc(prop_kind::forward_inference, + algorithm::eltwise_relu, + conv5_dst_memory.get_primitive_desc().desc(), negative5_slope); + auto relu5_prim_desc + = eltwise_forward::primitive_desc(relu5_desc, cpu_engine); + + net.push_back(eltwise_forward( + relu5_prim_desc, conv5_dst_memory, conv5_dst_memory)); + + /* AlexNet: pool5 + * {batch, 256, 13, 13} -> {batch, 256, 6, 6} + * kernel: {3, 3} + * strides: {2, 2} + */ + + memory::dims pool5_dst_tz = { batch, 256, 6, 6 }; + memory::dims pool5_kernel = { 3, 3 }; + memory::dims pool5_strides = { 2, 2 }; + auto pool5_padding = { 0, 0 }; + + std::vector pool5_dst(std::accumulate(pool5_dst_tz.begin(), + pool5_dst_tz.end(), 1, std::multiplies())); + + auto pool5_dst_md = memory::desc( + { pool5_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a pooling */ + auto pool5_desc = pooling_forward::desc(prop_kind::forward_inference, + pooling_max, conv5_dst_memory.get_primitive_desc().desc(), + pool5_dst_md, pool5_strides, pool5_kernel, pool5_padding, + pool5_padding, padding_kind::zero); + auto pool5_pd = pooling_forward::primitive_desc(pool5_desc, cpu_engine); + + auto pool5_dst_memory = memory(pool5_pd.dst_primitive_desc()); + + /* create pooling primitive an add it to net */ + net.push_back( + pooling_forward(pool5_pd, conv5_dst_memory, pool5_dst_memory)); + + /** + * fc6 inner product {batch, 256, 6, 6} (x) {4096, 256, 6, 6}-> {batch, + * 4096} + */ + memory::dims fc6_src_tz = { batch, 256, 6, 6 }; + memory::dims fc6_weights_tz = { 4096, 256, 6, 6 }; + memory::dims fc6_bias_tz = { 4096 }; + memory::dims fc6_dst_tz = { batch, 4096 }; + + std::vector fc6_weights(std::accumulate(fc6_weights_tz.begin(), + fc6_weights_tz.end(), 1, std::multiplies())); + std::vector fc6_bias(std::accumulate(fc6_bias_tz.begin(), + fc6_bias_tz.end(), 1, std::multiplies())); + + /* create memory for user data */ + auto fc6_user_weights_memory + = memory({ { { fc6_weights_tz }, memory::data_type::f32, + memory::format::oihw }, + cpu_engine }, + fc6_weights.data()); + + auto fc6_user_bias_memory + = memory({ { { fc6_bias_tz }, memory::data_type::f32, + memory::format::x }, + cpu_engine }, + fc6_bias.data()); + + /* create memory descriptors for convolution data w/ no specified format + */ + auto fc6_src_md = memory::desc( + { fc6_src_tz }, memory::data_type::f32, memory::format::any); + auto fc6_bias_md = memory::desc( + { fc6_bias_tz }, memory::data_type::f32, memory::format::any); + auto fc6_weights_md = memory::desc({ fc6_weights_tz }, + memory::data_type::f32, memory::format::any); + auto fc6_dst_md = memory::desc( + { fc6_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a inner_product */ + auto fc6_desc + = inner_product_forward::desc(prop_kind::forward_inference, + fc6_src_md, fc6_weights_md, fc6_bias_md, fc6_dst_md); + auto fc6_prim_desc + = inner_product_forward::primitive_desc(fc6_desc, cpu_engine); + + auto fc6_src_memory = pool5_dst_memory; + if (memory::primitive_desc(fc6_prim_desc.src_primitive_desc()) + != fc6_src_memory.get_primitive_desc()) { + fc6_src_memory = memory(fc6_prim_desc.src_primitive_desc()); + net.push_back(reorder(pool5_dst_memory, fc6_src_memory)); + } + + auto fc6_weights_memory = fc6_user_weights_memory; + if (memory::primitive_desc(fc6_prim_desc.weights_primitive_desc()) + != fc6_user_weights_memory.get_primitive_desc()) { + fc6_weights_memory = memory(fc6_prim_desc.weights_primitive_desc()); + net_weights.push_back( + reorder(fc6_user_weights_memory, fc6_weights_memory)); + } + + auto fc6_dst_memory = memory(fc6_prim_desc.dst_primitive_desc()); + + /* create convolution primitive and add it to net */ + net.push_back(inner_product_forward(fc6_prim_desc, fc6_src_memory, + fc6_weights_memory, fc6_user_bias_memory, fc6_dst_memory)); + + /** + * fc7 inner product {batch, 4096} (x) {4096, 4096}-> {batch, 4096} + */ + memory::dims fc7_weights_tz = { 4096, 4096 }; + memory::dims fc7_bias_tz = { 4096 }; + memory::dims fc7_dst_tz = { batch, 4096 }; + + std::vector fc7_weights(std::accumulate(fc7_weights_tz.begin(), + fc7_weights_tz.end(), 1, std::multiplies())); + std::vector fc7_bias(std::accumulate(fc7_bias_tz.begin(), + fc7_bias_tz.end(), 1, std::multiplies())); + + /* create memory for user data */ + auto fc7_user_weights_memory + = memory({ { { fc7_weights_tz }, memory::data_type::f32, + memory::format::nc }, + cpu_engine }, + fc7_weights.data()); + + auto fc7_user_bias_memory + = memory({ { { fc7_bias_tz }, memory::data_type::f32, + memory::format::x }, + cpu_engine }, + fc7_bias.data()); + + /* create memory descriptors for convolution data w/ no specified format + */ + auto fc7_bias_md = memory::desc( + { fc7_bias_tz }, memory::data_type::f32, memory::format::any); + auto fc7_weights_md = memory::desc({ fc7_weights_tz }, + memory::data_type::f32, memory::format::any); + auto fc7_dst_md = memory::desc( + { fc7_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a inner_product */ + auto fc7_desc + = inner_product_forward::desc(prop_kind::forward_inference, + fc6_dst_memory.get_primitive_desc().desc(), + fc7_weights_md, fc7_bias_md, fc7_dst_md); + auto fc7_prim_desc + = inner_product_forward::primitive_desc(fc7_desc, cpu_engine); + + auto fc7_weights_memory = fc7_user_weights_memory; + if (memory::primitive_desc(fc7_prim_desc.weights_primitive_desc()) + != fc7_user_weights_memory.get_primitive_desc()) { + fc7_weights_memory = memory(fc7_prim_desc.weights_primitive_desc()); + net.push_back(reorder(fc7_user_weights_memory, fc7_weights_memory)); + } + + auto fc7_dst_memory = memory(fc7_prim_desc.dst_primitive_desc()); + + /* create convolution primitive and add it to net */ + net.push_back(inner_product_forward(fc7_prim_desc, fc6_dst_memory, + fc7_weights_memory, fc7_user_bias_memory, fc7_dst_memory)); + + /** + * fc8 inner product {batch, 4096} (x) {1000, 4096}-> {batch, 1000} + */ + memory::dims fc8_weights_tz = { 1000, 4096 }; + memory::dims fc8_bias_tz = { 1000 }; + memory::dims fc8_dst_tz = { batch, 1000 }; + + std::vector fc8_weights(std::accumulate(fc8_weights_tz.begin(), + fc8_weights_tz.end(), 1, std::multiplies())); + std::vector fc8_bias(std::accumulate(fc8_bias_tz.begin(), + fc8_bias_tz.end(), 1, std::multiplies())); + + /* create memory for user data */ + auto fc8_user_weights_memory + = memory({ { { fc8_weights_tz }, memory::data_type::f32, + memory::format::nc }, + cpu_engine }, + fc8_weights.data()); + + auto fc8_user_bias_memory + = memory({ { { fc8_bias_tz }, memory::data_type::f32, + memory::format::x }, + cpu_engine }, + fc8_bias.data()); + + auto user_dst_memory = memory({ { { fc8_dst_tz }, memory::data_type::f32, + memory::format::nc }, + cpu_engine }, + user_dst.data()); + + /* create memory descriptors for convolution data w/ no specified format + */ + auto fc8_bias_md = memory::desc( + { fc8_bias_tz }, memory::data_type::f32, memory::format::any); + auto fc8_weights_md = memory::desc({ fc8_weights_tz }, + memory::data_type::f32, memory::format::any); + auto fc8_dst_md = memory::desc( + { fc8_dst_tz }, memory::data_type::f32, memory::format::any); + + /* create a inner_product */ + auto fc8_desc + = inner_product_forward::desc(prop_kind::forward_inference, + fc7_dst_memory.get_primitive_desc().desc(), + fc8_weights_md, fc8_bias_md, fc8_dst_md); + auto fc8_prim_desc + = inner_product_forward::primitive_desc(fc8_desc, cpu_engine); + + auto fc8_weights_memory = fc8_user_weights_memory; + if (memory::primitive_desc(fc8_prim_desc.weights_primitive_desc()) + != fc8_user_weights_memory.get_primitive_desc()) { + fc8_weights_memory = memory(fc8_prim_desc.weights_primitive_desc()); + net_weights.push_back( + reorder(fc8_user_weights_memory, fc8_weights_memory)); + } + + auto fc8_dst_memory = memory(fc8_prim_desc.dst_primitive_desc()); + + /* create convolution primitive and add it to net */ + net.push_back(inner_product_forward(fc8_prim_desc, fc7_dst_memory, + fc8_weights_memory, fc8_user_bias_memory, fc8_dst_memory)); + + /* create reorder between internal and user data if it is needed and + * add it to net after pooling */ + if (fc8_dst_memory != user_dst_memory) { + net.push_back(reorder(fc8_dst_memory, user_dst_memory)); + } + + stream(stream::kind::eager).submit(net_weights).wait(); + for (int j = 0; j < times; ++j) { + stream(stream::kind::eager).submit(net).wait(); + } +} + +int main(int argc, char **argv) { + try { + auto begin = chrono::duration_cast( + chrono::steady_clock::now().time_since_epoch()) + .count(); + int times = 1000; + simple_net(times); + auto end = chrono::duration_cast( + chrono::steady_clock::now().time_since_epoch()) + .count(); + cout << "Use time " << (end - begin) / (times + 0.0) << "\n"; + } catch (error &e) { + std::cerr << "status: " << e.status << std::endl; + std::cerr << "message: " << e.message << std::endl; + } + return 0; +} diff --git a/examples/mng/CMakeLists.txt b/examples/mng/CMakeLists.txt new file mode 100644 index 000000000..48d5e8b22 --- /dev/null +++ b/examples/mng/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-mng) + +# DOCUMENTATION_START { +hunter_add_package(mng) +find_package(mng CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC mng::mng) +# DOCUMENTATION_END } diff --git a/examples/mng/boo.cpp b/examples/mng/boo.cpp new file mode 100644 index 000000000..4ca3b6cde --- /dev/null +++ b/examples/mng/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/mojoshader/CMakeLists.txt b/examples/mojoshader/CMakeLists.txt new file mode 100644 index 000000000..38406c79f --- /dev/null +++ b/examples/mojoshader/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-mojoshader) + +hunter_add_package(mojoshader) +find_package(mojoshader CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC mojoshader::mojoshader) diff --git a/examples/mojoshader/boo.cpp b/examples/mojoshader/boo.cpp new file mode 100644 index 000000000..e7cbe794a --- /dev/null +++ b/examples/mojoshader/boo.cpp @@ -0,0 +1,5 @@ +#include + +int main() { + return MOJOSHADER_version(); +} diff --git a/examples/mongoose/CMakeLists.txt b/examples/mongoose/CMakeLists.txt new file mode 100644 index 000000000..fb3178ff2 --- /dev/null +++ b/examples/mongoose/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-mongoose) + +hunter_add_package(mongoose) +find_package(mongoose CONFIG REQUIRED) + +add_executable(mongoose simplest_web_server.c) +target_link_libraries(mongoose mongoose::mongoose) diff --git a/examples/mongoose/simplest_web_server.c b/examples/mongoose/simplest_web_server.c new file mode 100644 index 000000000..297f9b316 --- /dev/null +++ b/examples/mongoose/simplest_web_server.c @@ -0,0 +1,38 @@ +// Copyright (c) 2015 Cesanta Software Limited +// All rights reserved + +#include + +static const char *s_http_port = "8000"; +static struct mg_serve_http_opts s_http_server_opts; + +static void ev_handler(struct mg_connection *nc, int ev, void *p) { + if (ev == MG_EV_HTTP_REQUEST) { + mg_serve_http(nc, (struct http_message *) p, s_http_server_opts); + } +} + +int main(void) { + struct mg_mgr mgr; + struct mg_connection *nc; + + mg_mgr_init(&mgr, NULL); + printf("Starting web server on port %s\n", s_http_port); + nc = mg_bind(&mgr, s_http_port, ev_handler); + if (nc == NULL) { + printf("Failed to create listener\n"); + return 1; + } + + // Set up HTTP server parameters + mg_set_protocol_http_websocket(nc); + s_http_server_opts.document_root = "."; // Serve current directory + s_http_server_opts.enable_directory_listing = "yes"; + + for (;;) { + mg_mgr_poll(&mgr, 1000); + } + mg_mgr_free(&mgr); + + return 0; +} diff --git a/examples/mpark_variant/CMakeLists.txt b/examples/mpark_variant/CMakeLists.txt new file mode 100644 index 000000000..0ae0b00f9 --- /dev/null +++ b/examples/mpark_variant/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +set(CMAKE_CXX_STANDARD 14) + +project(download-mpark_variant) + +hunter_add_package(mpark_variant) + +find_package(mpark_variant CONFIG REQUIRED) + +add_executable(example main.cpp) +target_link_libraries(example mpark_variant) diff --git a/examples/mpark_variant/main.cpp b/examples/mpark_variant/main.cpp new file mode 100644 index 000000000..c8c8d132e --- /dev/null +++ b/examples/mpark_variant/main.cpp @@ -0,0 +1,6 @@ +#include "mpark/variant.hpp" + +int main (void) +{ + return 0; +} diff --git a/examples/mshadow/CMakeLists.txt b/examples/mshadow/CMakeLists.txt new file mode 100644 index 000000000..1e7c021ab --- /dev/null +++ b/examples/mshadow/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-mshadow) + +# DOCUMENTATION_START { +enable_language(CUDA) +include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) + +hunter_add_package(mshadow) +find_package(mshadow CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC mshadow::mshadow) +# DOCUMENTATION_END } diff --git a/examples/mshadow/boo.cpp b/examples/mshadow/boo.cpp new file mode 100644 index 000000000..83f8c0456 --- /dev/null +++ b/examples/mshadow/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/mtplz/CMakeLists.txt b/examples/mtplz/CMakeLists.txt new file mode 100644 index 000000000..2a40f5bbb --- /dev/null +++ b/examples/mtplz/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-mtplz) + +# download boost.compute +hunter_add_package(mtplz) + +# now boost.compute can be used +find_package(mtplz CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo mtplz::mtplz_decode) diff --git a/examples/mtplz/foo.cpp b/examples/mtplz/foo.cpp new file mode 100644 index 000000000..3bda4156b --- /dev/null +++ b/examples/mtplz/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/mxnet/CMakeLists.txt b/examples/mxnet/CMakeLists.txt new file mode 100644 index 000000000..a064319f5 --- /dev/null +++ b/examples/mxnet/CMakeLists.txt @@ -0,0 +1,30 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-mxnet) + +# DOCUMENTATION_START { +hunter_add_package(mxnet) +find_package(mxnet CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC mxnet::mxnet) +# DOCUMENTATION_END } + +# To test 'boo' executable: +# +# > cd _testing/_builds/.../ +# > ls boo +# boo +# > wget https://raw.githubusercontent.com/apache/incubator-mxnet/5b86701f2bad8ea5d9b0fc1df88ef0077a70ffb8/cpp-package/example/get_data.sh +# > chmod +x get_data.sh +# > ./get_data.sh +# > LD_LIBRARY_PATH=/.../hunter/_testing/Hunter/_Base/.../Install/lib ./boo 10 diff --git a/examples/mxnet/boo.cpp b/examples/mxnet/boo.cpp new file mode 100644 index 000000000..83c659c70 --- /dev/null +++ b/examples/mxnet/boo.cpp @@ -0,0 +1,263 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/*! + */ +#include +#include +#include +#include +#include +#include "mxnet-cpp/MxNetCpp.h" + +using namespace mxnet::cpp; + +class Lenet { + public: + Lenet() + : ctx_cpu(Context(DeviceType::kCPU, 0)), +#if MXNET_USE_CPU + ctx_dev(Context(DeviceType::kCPU, 0)) +#else + ctx_dev(Context(DeviceType::kGPU, 0)) +#endif + {} + + void Run(int max_epoch) { + /* + * LeCun, Yann, Leon Bottou, Yoshua Bengio, and Patrick Haffner. + * "Gradient-based learning applied to document recognition." + * Proceedings of the IEEE (1998) + * */ + + /*define the symbolic net*/ + Symbol data = Symbol::Variable("data"); + Symbol data_label = Symbol::Variable("data_label"); + Symbol conv1_w("conv1_w"), conv1_b("conv1_b"); + Symbol conv2_w("conv2_w"), conv2_b("conv2_b"); + Symbol conv3_w("conv3_w"), conv3_b("conv3_b"); + Symbol fc1_w("fc1_w"), fc1_b("fc1_b"); + Symbol fc2_w("fc2_w"), fc2_b("fc2_b"); + + Symbol conv1 = + Convolution("conv1", data, conv1_w, conv1_b, Shape(5, 5), 20); + Symbol tanh1 = Activation("tanh1", conv1, ActivationActType::kTanh); + Symbol pool1 = Pooling("pool1", tanh1, Shape(2, 2), PoolingPoolType::kMax, + false, false, PoolingPoolingConvention::kValid, Shape(2, 2)); + + Symbol conv2 = Convolution("conv2", pool1, conv2_w, conv2_b, + Shape(5, 5), 50); + Symbol tanh2 = Activation("tanh2", conv2, ActivationActType::kTanh); + Symbol pool2 = Pooling("pool2", tanh2, Shape(2, 2), PoolingPoolType::kMax, + false, false, PoolingPoolingConvention::kValid, Shape(2, 2)); + + Symbol conv3 = Convolution("conv3", pool2, conv3_w, conv3_b, + Shape(2, 2), 500); + Symbol tanh3 = Activation("tanh3", conv3, ActivationActType::kTanh); + Symbol pool3 = Pooling("pool3", tanh3, Shape(2, 2), PoolingPoolType::kMax, + false, false, PoolingPoolingConvention::kValid, Shape(1, 1)); + + Symbol flatten = Flatten("flatten", pool3); + Symbol fc1 = FullyConnected("fc1", flatten, fc1_w, fc1_b, 500); + Symbol tanh4 = Activation("tanh4", fc1, ActivationActType::kTanh); + Symbol fc2 = FullyConnected("fc2", tanh4, fc2_w, fc2_b, 10); + + Symbol lenet = SoftmaxOutput("softmax", fc2, data_label); + + for (auto s : lenet.ListArguments()) { + LG << s; + } + + /*setup basic configs*/ + int val_fold = 1; + int W = 28; + int H = 28; + int batch_size = 42; + float learning_rate = 1e-4; + float weight_decay = 1e-4; + + /*prepare the data*/ + std::vector data_vec, label_vec; + size_t data_count = GetData(&data_vec, &label_vec); + const float *dptr = data_vec.data(); + const float *lptr = label_vec.data(); + NDArray data_array = NDArray(Shape(data_count, 1, W, H), ctx_cpu, + false); // store in main memory, and copy to + // device memory while training + NDArray label_array = + NDArray(Shape(data_count), ctx_cpu, + false); // it's also ok if just store them all in device memory + data_array.SyncCopyFromCPU(dptr, data_count * W * H); + label_array.SyncCopyFromCPU(lptr, data_count); + data_array.WaitToRead(); + label_array.WaitToRead(); + + size_t train_num = data_count * (1 - val_fold / 10.0); + train_data = data_array.Slice(0, train_num); + train_label = label_array.Slice(0, train_num); + val_data = data_array.Slice(train_num, data_count); + val_label = label_array.Slice(train_num, data_count); + + LG << "here read fin"; + + /*init some of the args*/ + // map args_map; + args_map["data"] = data_array.Slice(0, batch_size).Copy(ctx_dev); + args_map["data_label"] = label_array.Slice(0, batch_size).Copy(ctx_dev); + NDArray::WaitAll(); + + LG << "here slice fin"; + /* + * we can also feed in some of the args other than the input all by + * ourselves, + * fc2-w , fc1-b for example: + * */ + // args_map["fc2_w"] = + // NDArray(mshadow::Shape2(500, 4 * 4 * 50), ctx_dev, false); + // NDArray::SampleGaussian(0, 1, &args_map["fc2_w"]); + // args_map["fc1_b"] = NDArray(mshadow::Shape1(10), ctx_dev, false); + // args_map["fc1_b"] = 0; + + lenet.InferArgsMap(ctx_dev, &args_map, args_map); + Optimizer* opt = OptimizerRegistry::Find("ccsgd"); + opt->SetParam("momentum", 0.9) + ->SetParam("rescale_grad", 1.0) + ->SetParam("clip_gradient", 10) + ->SetParam("lr", learning_rate) + ->SetParam("wd", weight_decay); + + Executor *exe = lenet.SimpleBind(ctx_dev, args_map); + auto arg_names = lenet.ListArguments(); + + for (int ITER = 0; ITER < max_epoch; ++ITER) { + size_t start_index = 0; + while (start_index < train_num) { + if (start_index + batch_size > train_num) { + start_index = train_num - batch_size; + } + args_map["data"] = + train_data.Slice(start_index, start_index + batch_size) + .Copy(ctx_dev); + args_map["data_label"] = + train_label.Slice(start_index, start_index + batch_size) + .Copy(ctx_dev); + start_index += batch_size; + NDArray::WaitAll(); + + exe->Forward(true); + exe->Backward(); + // Update parameters + for (size_t i = 0; i < arg_names.size(); ++i) { + if (arg_names[i] == "data" || arg_names[i] == "data_label") continue; + opt->Update(i, exe->arg_arrays[i], exe->grad_arrays[i]); + } + } + + LG << "Iter " << ITER + << ", accuracy: " << ValAccuracy(batch_size * 10, lenet); + } + delete exe; + } + + private: + Context ctx_cpu; + Context ctx_dev; + std::map args_map; + NDArray train_data; + NDArray train_label; + NDArray val_data; + NDArray val_label; + + size_t GetData(std::vector *data, std::vector *label) { + const char *train_data_path = "./data/mnist_data/mnist_train.csv"; + std::ifstream inf(train_data_path); + std::string line; + inf >> line; // ignore the header + size_t _N = 0; + while (inf >> line) { + for (auto &c : line) c = (c == ',') ? ' ' : c; + std::stringstream ss; + ss << line; + float _data; + ss >> _data; + label->push_back(_data); + while (ss >> _data) data->push_back(_data / 256.0); + _N++; + } + inf.close(); + return _N; + } + + float ValAccuracy(int batch_size, Symbol lenet) { + size_t val_num = val_data.GetShape()[0]; + + size_t correct_count = 0; + size_t all_count = 0; + + size_t start_index = 0; + while (start_index < val_num) { + if (start_index + batch_size > val_num) { + start_index = val_num - batch_size; + } + args_map["data"] = + val_data.Slice(start_index, start_index + batch_size).Copy(ctx_dev); + args_map["data_label"] = + val_label.Slice(start_index, start_index + batch_size).Copy(ctx_dev); + start_index += batch_size; + NDArray::WaitAll(); + + Executor *exe = lenet.SimpleBind(ctx_dev, args_map); + exe->Forward(false); + + const auto &out = exe->outputs; + NDArray out_cpu = out[0].Copy(ctx_cpu); + NDArray label_cpu = + val_label.Slice(start_index - batch_size, start_index).Copy(ctx_cpu); + + NDArray::WaitAll(); + + const mx_float *dptr_out = out_cpu.GetData(); + const mx_float *dptr_label = label_cpu.GetData(); + for (int i = 0; i < batch_size; ++i) { + float label = dptr_label[i]; + int cat_num = out_cpu.GetShape()[1]; + float p_label = 0, max_p = dptr_out[i * cat_num]; + for (int j = 0; j < cat_num; ++j) { + float p = dptr_out[i * cat_num + j]; + if (max_p < p) { + p_label = j; + max_p = p; + } + } + if (label == p_label) correct_count++; + } + all_count += batch_size; + + delete exe; + } + return correct_count * 1.0 / all_count; + } +}; + +int main(int argc, char const *argv[]) { + Lenet lenet; + lenet.Run(argc > 1 ? strtol(argv[1], NULL, 10) : 100000); + MXNotifyShutdown(); + return 0; +} diff --git a/examples/mxnet/config.cmake b/examples/mxnet/config.cmake new file mode 100644 index 000000000..b476aecd1 --- /dev/null +++ b/examples/mxnet/config.cmake @@ -0,0 +1,16 @@ +# DOCUMENTATION_START { +# config.cmake + +hunter_config(OpenCV VERSION 3.4.3-p4) +# DOCUMENTATION_END } + +# See 'tvm' example +if(APPLE AND XCODE) + hunter_config( + LLVM + VERSION + ${HUNTER_LLVM_VERSION} + CMAKE_ARGS + LLVM_BUILD_EXTERNAL_COMPILER_RT=ON + ) +endif() diff --git a/examples/nanoflann/CMakeLists.txt b/examples/nanoflann/CMakeLists.txt new file mode 100644 index 000000000..be909130e --- /dev/null +++ b/examples/nanoflann/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-nanoflann) + +hunter_add_package(nanoflann) +find_package(nanoflann CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo nanoflann::nanoflann) diff --git a/examples/nanoflann/foo.cpp b/examples/nanoflann/foo.cpp new file mode 100644 index 000000000..c9da6a300 --- /dev/null +++ b/examples/nanoflann/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/nanosvg/CMakeLists.txt b/examples/nanosvg/CMakeLists.txt new file mode 100644 index 000000000..d1daca212 --- /dev/null +++ b/examples/nanosvg/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-nanosvg) +# DOCUMENTATION_START { +hunter_add_package(nanosvg) +find_package(nanosvg CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main PUBLIC nanosvg::nanosvg) +# DOCUMENTATION_END } diff --git a/examples/nanosvg/main.cpp b/examples/nanosvg/main.cpp new file mode 100644 index 000000000..da3b0f201 --- /dev/null +++ b/examples/nanosvg/main.cpp @@ -0,0 +1,11 @@ +#include + +#define NANOSVG_IMPLEMENTATION +#include + +// See https://github.com/memononen/nanosvg/tree/master/example +// for further examples. +int main() { + NSVGimage image; + (void)image; +} diff --git a/examples/ncnn/CMakeLists.txt b/examples/ncnn/CMakeLists.txt new file mode 100644 index 000000000..c372a22ed --- /dev/null +++ b/examples/ncnn/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-ncnn) + +# DOCUMENTATION_START { +hunter_add_package(ncnn) +find_package(ncnn CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC ncnn::ncnn) +# DOCUMENTATION_END } diff --git a/examples/ncnn/boo.cpp b/examples/ncnn/boo.cpp new file mode 100644 index 000000000..92b9f58a3 --- /dev/null +++ b/examples/ncnn/boo.cpp @@ -0,0 +1,8 @@ +#include + +int main() { + ncnn::Net squeezenet; + squeezenet.load_param("squeezenet_v1.1.param"); + squeezenet.load_model("squeezenet_v1.1.bin"); + return 0; +} diff --git a/examples/ncursesw/CMakeLists.txt b/examples/ncursesw/CMakeLists.txt new file mode 100644 index 000000000..372cd3415 --- /dev/null +++ b/examples/ncursesw/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-ncurses) + +# DOCUMENTATION_START { +hunter_add_package(ncursesw) +find_package(ncursesw CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC PkgConfig::ncursesw) +# DOCUMENTATION_END } diff --git a/examples/ncursesw/boo.cpp b/examples/ncursesw/boo.cpp new file mode 100644 index 000000000..a8c6cc597 --- /dev/null +++ b/examples/ncursesw/boo.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +int main() { + WINDOW * mainwin; + + /* Initialize ncurses */ + + if ( (mainwin = initscr()) == NULL ) { + fprintf(stderr, "Error initialising ncurses.\n"); + exit(EXIT_FAILURE); + } + + /* Display "Hello, world!" in the centre of the + screen, call refresh() to show our changes, and + sleep() for a few seconds to get the full screen effect */ + + mvaddstr(13, 33, "Hello, world!"); + refresh(); + sleep(3); + + /* Clean up after ourselves */ + + delwin(mainwin); + endwin(); + refresh(); + + return EXIT_SUCCESS; +} diff --git a/examples/nlohmann_fifo_map/CMakeLists.txt b/examples/nlohmann_fifo_map/CMakeLists.txt new file mode 100644 index 000000000..03f1beafe --- /dev/null +++ b/examples/nlohmann_fifo_map/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-nlohmann_fifo_map) + +# DOCUMENTATION_START { +hunter_add_package(nlohmann_fifo_map) +find_package(nlohmann_fifo_map CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main PUBLIC nlohmann_fifo_map::fifo_map) +# DOCUMENTATION_END } diff --git a/examples/nlohmann_fifo_map/main.cpp b/examples/nlohmann_fifo_map/main.cpp new file mode 100644 index 000000000..2b5492024 --- /dev/null +++ b/examples/nlohmann_fifo_map/main.cpp @@ -0,0 +1,38 @@ +#include +#include + +// for convenience +using nlohmann::fifo_map; + +int main() { + // create fifo_map with template arguments + fifo_map m; + + // add elements + m[2] = "two"; + m[3] = "three"; + m[1] = "one"; + + // output the map; will print + // 2: two + // 3: three + // 1: one + for (auto x : m) { + std::cout << x.first << ": " << x.second << "\n"; + } + + // delete an element + m.erase(2); + + // re-add element + m[2] = "zwei"; + + // output the map; will print + // 3: three + // 1: one + // 2: zwei + for (auto x : m) { + std::cout << x.first << ": " << x.second << "\n"; + } +} + diff --git a/examples/nlohmann_json/CMakeLists.txt b/examples/nlohmann_json/CMakeLists.txt new file mode 100644 index 000000000..ad4055d7e --- /dev/null +++ b/examples/nlohmann_json/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required (VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(dowload-nlohmann-json) + +# DOCUMENTATION_START { +hunter_add_package(nlohmann_json) +find_package(nlohmann_json CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main PUBLIC nlohmann_json::nlohmann_json) +# DOCUMENTATION_END } diff --git a/examples/nlohmann_json/main.cpp b/examples/nlohmann_json/main.cpp new file mode 100644 index 000000000..1031b42f5 --- /dev/null +++ b/examples/nlohmann_json/main.cpp @@ -0,0 +1,27 @@ +#include +#include + +int main (int argc, char** argv) { + + // for convenience + using json = nlohmann::json; + + json j2 = { + {"pi", 3.141}, + {"happy", true}, + {"name", "Niels"}, + {"nothing", nullptr}, + {"answer", { + {"everything", 42} + }}, + {"list", {1, 0, 2}}, + {"object", { + {"currency", "USD"}, + {"value", 42.99} + }} + }; + + std::cout << j2 << std::endl; + + return 0; +} diff --git a/examples/nsync/CMakeLists.txt b/examples/nsync/CMakeLists.txt new file mode 100644 index 000000000..730719d6d --- /dev/null +++ b/examples/nsync/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-nsync) + +hunter_add_package(nsync) +find_package(nsync CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo nsync::nsync) diff --git a/examples/nsync/foo.cpp b/examples/nsync/foo.cpp new file mode 100644 index 000000000..9f176988d --- /dev/null +++ b/examples/nsync/foo.cpp @@ -0,0 +1,4 @@ +#include "nsync/nsync.h" + +int main() { +} diff --git a/examples/oniguruma/CMakeLists.txt b/examples/oniguruma/CMakeLists.txt new file mode 100644 index 000000000..40627cb44 --- /dev/null +++ b/examples/oniguruma/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-oniguruma) + +# DOCUMENTATION_START { +hunter_add_package(oniguruma) +find_package(oniguruma CONFIG REQUIRED) +add_executable(main main.c) +target_link_libraries(main oniguruma::onig) +# DOCUMENTATION_END } diff --git a/examples/oniguruma/main.c b/examples/oniguruma/main.c new file mode 100644 index 000000000..f81323d9e --- /dev/null +++ b/examples/oniguruma/main.c @@ -0,0 +1,9 @@ +#include + +int main() +{ + const char* version; + version = onig_version(); + (void) version; + return 0; +} diff --git a/examples/onmt/CMakeLists.txt b/examples/onmt/CMakeLists.txt new file mode 100644 index 000000000..08c66f3a3 --- /dev/null +++ b/examples/onmt/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(foo) + +hunter_add_package(onmt) +find_package(onmt CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo onmt::onmt) diff --git a/examples/onmt/foo.cpp b/examples/onmt/foo.cpp new file mode 100644 index 000000000..cac1e343e --- /dev/null +++ b/examples/onmt/foo.cpp @@ -0,0 +1,14 @@ +#include + +#include + +int main() +{ + // Create a new Translator object. + auto translator = onmt::TranslatorFactory::build("enfr_model_release.t7"); + + // Translate a tokenized sentence. + std::cout << translator->translate("Hello world !") << std::endl; + + return 0; +} diff --git a/examples/opengles/CMakeLists.txt b/examples/opengles/CMakeLists.txt new file mode 100644 index 000000000..9b97f7b8b --- /dev/null +++ b/examples/opengles/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-opengles) + +find_package(opengles REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC opengles::opengles) diff --git a/examples/opengles/foo.mm b/examples/opengles/foo.mm new file mode 100644 index 000000000..d4f181770 --- /dev/null +++ b/examples/opengles/foo.mm @@ -0,0 +1,18 @@ +#import + +#include // std::stringstream + +static void check_gl_error() +{ + auto e = glGetError(); + if (e != GL_NO_ERROR) + { + std::stringstream ss; + ss << "OpenGL error: " << int(e); + throw std::runtime_error(ss.str()); + } +} + +int main() { + check_gl_error(); +} diff --git a/examples/opentracing-cpp/CMakeLists.txt b/examples/opentracing-cpp/CMakeLists.txt new file mode 100644 index 000000000..d06010dce --- /dev/null +++ b/examples/opentracing-cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-opentracing-cpp) + +set(CMAKE_CXX_STANDARD_REQUIRED true) +set(CMAKE_CXX_STANDARD 11) + +hunter_add_package(opentracing-cpp) + +find_package(OpenTracing CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main OpenTracing::opentracing-static) diff --git a/examples/opentracing-cpp/main.cpp b/examples/opentracing-cpp/main.cpp new file mode 100644 index 000000000..ea9e88420 --- /dev/null +++ b/examples/opentracing-cpp/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/osmesa/CMakeLists.txt b/examples/osmesa/CMakeLists.txt new file mode 100644 index 000000000..762d73212 --- /dev/null +++ b/examples/osmesa/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-osmesa) + +find_package(osmesa REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC osmesa::osmesa) diff --git a/examples/osmesa/foo.cpp b/examples/osmesa/foo.cpp new file mode 100644 index 000000000..afc6765c8 --- /dev/null +++ b/examples/osmesa/foo.cpp @@ -0,0 +1,7 @@ +// Copyright (c) 2017, Ruslan Baratov +// All rights reserved. + +#include + +int main() { +} diff --git a/examples/pcg/CMakeLists.txt b/examples/pcg/CMakeLists.txt new file mode 100644 index 000000000..76c934862 --- /dev/null +++ b/examples/pcg/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-pcg) + +hunter_add_package(pcg) + +# DOCUMENTATION_START { +find_package(pcg CONFIG REQUIRED) +add_executable(main main.c) +target_link_libraries(main pcg::pcg_random) +# DOCUMENTATION_END } diff --git a/examples/pcg/main.c b/examples/pcg/main.c new file mode 100644 index 000000000..d174b5ecf --- /dev/null +++ b/examples/pcg/main.c @@ -0,0 +1,10 @@ +#include +#include + +int main() +{ + pcg32_random_t state; + uint64_t seed[2]; + pcg32_srandom_r(&state, seed[0], seed[1]); + return 0; +} diff --git a/examples/pcre2/CMakeLists.txt b/examples/pcre2/CMakeLists.txt new file mode 100644 index 000000000..05fd02a65 --- /dev/null +++ b/examples/pcre2/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pcre2) + +# DOCUMENTATION_START { +hunter_add_package(pcre2) +find_package(PCRE2 CONFIG REQUIRED) + +add_executable(boo boo.c) +target_link_libraries(boo PUBLIC PCRE2::pcre2-8) +# DOCUMENTATION_END } diff --git a/examples/pcre2/boo.c b/examples/pcre2/boo.c new file mode 100644 index 000000000..1f8eb7a00 --- /dev/null +++ b/examples/pcre2/boo.c @@ -0,0 +1,45 @@ +// https://c-programming-blog.blogspot.com/2015/05/pcre2-simple-sample-program.html + +#include +#include + +int main(int argc, char *argv[]) { + if(argc < 3) { + printf("usage: %s pattern string\n", argv[0]); + return 0; + } + pcre2_code *re; + pcre2_match_data *match_data; + // size_t erroffset; + // size_t *ovector; + PCRE2_SIZE erroffset, *ovector; + int errorcode; + int rc; + PCRE2_SPTR pattern = argv[1]; + PCRE2_SPTR value = argv[2]; + re = pcre2_compile(pattern, -1, 0, &errorcode, &erroffset, NULL); + if (re == NULL) { + PCRE2_UCHAR8 buffer[120]; + (void)pcre2_get_error_message(errorcode, buffer, 120); + /* Handle error */ + return 0; + } + match_data = pcre2_match_data_create(20, NULL); + rc = pcre2_match(re, value, -1, 0, 0, match_data, NULL); + if (rc <= 0) + printf("No matchx\n"); + else { + ovector = pcre2_get_ovector_pointer(match_data); + printf( "Match succeeded at offset %zu\n", ovector[0] ); + /* Use ovector to get matched strings */ + PCRE2_SIZE i; + for(i = 0; i < rc; i++) { + PCRE2_SPTR start = value + ovector[2*i]; + PCRE2_SIZE slen = ovector[2*i+1] - ovector[2*i]; + printf( "%2d: %.*s\n", i, (int)slen, (char *)start ); + break; + } + } + pcre2_match_data_free(match_data); + pcre2_code_free(re); +} diff --git a/examples/pegtl/CMakeLists.txt b/examples/pegtl/CMakeLists.txt new file mode 100644 index 000000000..8f011f273 --- /dev/null +++ b/examples/pegtl/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(pgtl-example) + +# DOCUMENTATION_START { +hunter_add_package(pegtl) +find_package(pegtl CONFIG REQUIRED) + +add_executable(pex boo.cpp) +target_link_libraries(pex PUBLIC taocpp::pegtl) +# DOCUMENTATION_END } diff --git a/examples/pegtl/boo.cpp b/examples/pegtl/boo.cpp new file mode 100644 index 000000000..721aa232e --- /dev/null +++ b/examples/pegtl/boo.cpp @@ -0,0 +1,47 @@ +// Copyright (c) 2014-2018 Dr. Colin Hirsch and Daniel Frey +// Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ + +#include +#include + +#include + +namespace pegtl = tao::TAO_PEGTL_NAMESPACE; + +namespace hello +{ + // clang-format off + struct prefix : pegtl::string< 'H', 'e', 'l', 'l', 'o', ',', ' ' > {}; + struct name : pegtl::plus< pegtl::alpha > {}; + struct grammar : pegtl::must< prefix, name, pegtl::one< '!' >, pegtl::eof > {}; + // clang-format on + + template< typename Rule > + struct action + : pegtl::nothing< Rule > + { + }; + + template<> + struct action< name > + { + template< typename Input > + static void apply( const Input& in, std::string& v ) + { + v = in.string(); + } + }; + +} // namespace hello + +int main( int argc, char** argv ) +{ + if( argc > 1 ) { + std::string name; + + pegtl::argv_input<> in( argv, 1 ); + pegtl::parse< hello::grammar, hello::action >( in, name ); + + std::cout << "Good bye, " << name << "!" << std::endl; + } +} \ No newline at end of file diff --git a/examples/pip_GitPython/CMakeLists.txt b/examples/pip_GitPython/CMakeLists.txt new file mode 100644 index 000000000..73c363ff2 --- /dev/null +++ b/examples/pip_GitPython/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_GitPython) + +# DOCUMENTATION_START { +hunter_add_package(pip_GitPython) +find_package(pip_GitPython CONFIG REQUIRED) + +set(test_command "import git") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_astroid/CMakeLists.txt b/examples/pip_astroid/CMakeLists.txt new file mode 100644 index 000000000..6b60464b1 --- /dev/null +++ b/examples/pip_astroid/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_astroid) + +# DOCUMENTATION_START { +hunter_add_package(pip_astroid) +find_package(pip_astroid CONFIG REQUIRED) + +set(test_command "import astroid") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_boto3/CMakeLists.txt b/examples/pip_boto3/CMakeLists.txt new file mode 100644 index 000000000..7e9b274a1 --- /dev/null +++ b/examples/pip_boto3/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_boto3) + +# DOCUMENTATION_START { +hunter_add_package(pip_boto3) +find_package(pip_boto3 CONFIG REQUIRED) + +set(test_command "import boto3") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_botocore/CMakeLists.txt b/examples/pip_botocore/CMakeLists.txt new file mode 100644 index 000000000..1e83ad743 --- /dev/null +++ b/examples/pip_botocore/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_botocore) + +# DOCUMENTATION_START { +hunter_add_package(pip_botocore) +find_package(pip_botocore CONFIG REQUIRED) + +set(test_command "import botocore") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_certifi/CMakeLists.txt b/examples/pip_certifi/CMakeLists.txt new file mode 100644 index 000000000..e9acef898 --- /dev/null +++ b/examples/pip_certifi/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_certifi) + +# DOCUMENTATION_START { +hunter_add_package(pip_certifi) +find_package(pip_certifi CONFIG REQUIRED) + +set(test_command "import certifi") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_chardet/CMakeLists.txt b/examples/pip_chardet/CMakeLists.txt new file mode 100644 index 000000000..98ef25e03 --- /dev/null +++ b/examples/pip_chardet/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_chardet) + +# DOCUMENTATION_START { +hunter_add_package(pip_chardet) +find_package(pip_chardet CONFIG REQUIRED) + +set(test_command "import chardet") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_cpplint/CMakeLists.txt b/examples/pip_cpplint/CMakeLists.txt new file mode 100644 index 000000000..f2a2ba7f1 --- /dev/null +++ b/examples/pip_cpplint/CMakeLists.txt @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_cpplint) + +# DOCUMENTATION_START { +hunter_add_package(pip_cpplint) +find_package(pip_cpplint CONFIG REQUIRED) + +execute_process( + COMMAND + ${Python_EXECUTABLE} -m cpplint --help + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_decorator/CMakeLists.txt b/examples/pip_decorator/CMakeLists.txt new file mode 100644 index 000000000..56aeab6c9 --- /dev/null +++ b/examples/pip_decorator/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_decorator) + +# DOCUMENTATION_START { +hunter_add_package(pip_decorator) +find_package(pip_decorator CONFIG REQUIRED) + +set(test_command "import decorator") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_gitdb/CMakeLists.txt b/examples/pip_gitdb/CMakeLists.txt new file mode 100644 index 000000000..019a15fde --- /dev/null +++ b/examples/pip_gitdb/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_gitdb) + +# DOCUMENTATION_START { +hunter_add_package(pip_gitdb) +find_package(pip_gitdb CONFIG REQUIRED) + +set(test_command "import gitdb") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_idna/CMakeLists.txt b/examples/pip_idna/CMakeLists.txt new file mode 100644 index 000000000..3ba997ac6 --- /dev/null +++ b/examples/pip_idna/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_idna) + +# DOCUMENTATION_START { +hunter_add_package(pip_idna) +find_package(pip_idna CONFIG REQUIRED) + +set(test_command "import idna") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_jmespath/CMakeLists.txt b/examples/pip_jmespath/CMakeLists.txt new file mode 100644 index 000000000..e451c3fcb --- /dev/null +++ b/examples/pip_jmespath/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_jmespath) + +# DOCUMENTATION_START { +hunter_add_package(pip_jmespath) +find_package(pip_jmespath CONFIG REQUIRED) + +set(test_command "import jmespath") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_lazy-object-proxy/CMakeLists.txt b/examples/pip_lazy-object-proxy/CMakeLists.txt new file mode 100644 index 000000000..349429b34 --- /dev/null +++ b/examples/pip_lazy-object-proxy/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_lazy-object-proxy) + +# DOCUMENTATION_START { +hunter_add_package(pip_lazy-object-proxy) +find_package(pip_lazy-object-proxy CONFIG REQUIRED) + +set(test_command "import lazy_object_proxy") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_nose-timer/CMakeLists.txt b/examples/pip_nose-timer/CMakeLists.txt new file mode 100644 index 000000000..ac80234ca --- /dev/null +++ b/examples/pip_nose-timer/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_nose-timer) + +# DOCUMENTATION_START { +hunter_add_package(pip_nose-timer) +find_package(pip_nose-timer CONFIG REQUIRED) + +set(test_command "import nosetimer") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_nose/CMakeLists.txt b/examples/pip_nose/CMakeLists.txt new file mode 100644 index 000000000..b446c44c6 --- /dev/null +++ b/examples/pip_nose/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_nose) + +# DOCUMENTATION_START { +hunter_add_package(pip_nose) +find_package(pip_nose CONFIG REQUIRED) + +set(test_command "import nose") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_numpy/CMakeLists.txt b/examples/pip_numpy/CMakeLists.txt new file mode 100644 index 000000000..54c48bf3d --- /dev/null +++ b/examples/pip_numpy/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_numpy) + +# DOCUMENTATION_START { +hunter_add_package(pip_numpy) +find_package(pip_numpy CONFIG REQUIRED) + +set(test_command "import numpy") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_pylint/CMakeLists.txt b/examples/pip_pylint/CMakeLists.txt new file mode 100644 index 000000000..a7b671785 --- /dev/null +++ b/examples/pip_pylint/CMakeLists.txt @@ -0,0 +1,26 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_pylint) + +# DOCUMENTATION_START { +hunter_add_package(pip_pylint) +find_package(pip_pylint CONFIG REQUIRED) + +execute_process( + COMMAND + ${Python_EXECUTABLE} -m pylint --help + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_python-dateutil/CMakeLists.txt b/examples/pip_python-dateutil/CMakeLists.txt new file mode 100644 index 000000000..c80cd9e51 --- /dev/null +++ b/examples/pip_python-dateutil/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_python-dateutil) + +# DOCUMENTATION_START { +hunter_add_package(pip_python-dateutil) +find_package(pip_python-dateutil CONFIG REQUIRED) + +set(test_command "import dateutil") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_requests/CMakeLists.txt b/examples/pip_requests/CMakeLists.txt new file mode 100644 index 000000000..70c7c444f --- /dev/null +++ b/examples/pip_requests/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_requests) + +# DOCUMENTATION_START { +hunter_add_package(pip_requests) +find_package(pip_requests CONFIG REQUIRED) + +set(test_command "import requests") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_six/CMakeLists.txt b/examples/pip_six/CMakeLists.txt new file mode 100644 index 000000000..1db83676f --- /dev/null +++ b/examples/pip_six/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_six) + +# DOCUMENTATION_START { +hunter_add_package(pip_six) +find_package(pip_six CONFIG REQUIRED) + +set(test_command "import six") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_smmap/CMakeLists.txt b/examples/pip_smmap/CMakeLists.txt new file mode 100644 index 000000000..ce3a22c68 --- /dev/null +++ b/examples/pip_smmap/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_smmap) + +# DOCUMENTATION_START { +hunter_add_package(pip_smmap) +find_package(pip_smmap CONFIG REQUIRED) + +set(test_command "import smmap") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_urllib3/CMakeLists.txt b/examples/pip_urllib3/CMakeLists.txt new file mode 100644 index 000000000..430937015 --- /dev/null +++ b/examples/pip_urllib3/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_urllib3) + +# DOCUMENTATION_START { +hunter_add_package(pip_urllib3) +find_package(pip_urllib3 CONFIG REQUIRED) + +set(test_command "import urllib3") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pip_wrapt/CMakeLists.txt b/examples/pip_wrapt/CMakeLists.txt new file mode 100644 index 000000000..8184922ea --- /dev/null +++ b/examples/pip_wrapt/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.12) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pip_wrapt) + +# DOCUMENTATION_START { +hunter_add_package(pip_wrapt) +find_package(pip_wrapt CONFIG REQUIRED) + +set(test_command "import wrapt") + +execute_process( + COMMAND + ${Python_EXECUTABLE} -c ${test_command} + RESULT_VARIABLE + result +) + +if(NOT result EQUAL "0") + message(FATAL_ERROR "Failed") +endif() +# DOCUMENTATION_END } diff --git a/examples/pluginlib/CMakeLists.txt b/examples/pluginlib/CMakeLists.txt new file mode 100644 index 000000000..dd00cba78 --- /dev/null +++ b/examples/pluginlib/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pluginlib) + +# DOCUMENTATION_START { +hunter_add_package(pluginlib) +find_package(catkin CONFIG REQUIRED COMPONENTS pluginlib) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/pluginlib/main.cpp b/examples/pluginlib/main.cpp new file mode 100644 index 000000000..a697cb1ac --- /dev/null +++ b/examples/pluginlib/main.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/pluginlib/package.xml b/examples/pluginlib/package.xml new file mode 100644 index 000000000..c5161f150 --- /dev/null +++ b/examples/pluginlib/package.xml @@ -0,0 +1,12 @@ + + download-pluginlib + 0.0.0 + + This package provides foo capability. + + Krasimir Georgiev + BSD + + catkin + + diff --git a/examples/prometheus-cpp/CMakeLists.txt b/examples/prometheus-cpp/CMakeLists.txt new file mode 100644 index 000000000..fa247f6e1 --- /dev/null +++ b/examples/prometheus-cpp/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-prometheus-cpp) + +# DOCUMENTATION_START { +hunter_add_package(prometheus-cpp) +find_package(prometheus-cpp CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC prometheus-cpp::pull) +# DOCUMENTATION_END } diff --git a/examples/prometheus-cpp/boo.cpp b/examples/prometheus-cpp/boo.cpp new file mode 100644 index 000000000..343c4f196 --- /dev/null +++ b/examples/prometheus-cpp/boo.cpp @@ -0,0 +1,8 @@ +#include + +int main() { + using namespace prometheus; + + // create an http server running on port 8080 + Exposer exposer{"127.0.0.1:8080"}; +} diff --git a/examples/protobuf-c/CMakeLists.txt b/examples/protobuf-c/CMakeLists.txt new file mode 100644 index 000000000..cb6af334e --- /dev/null +++ b/examples/protobuf-c/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-protobuf-c) + +# DOCUMENTATION_START { +hunter_add_package(Protobuf) +find_package(Protobuf CONFIG REQUIRED) +hunter_add_package(protobuf-c) +find_package(protobuf-c CONFIG REQUIRED) +add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/person.pb-c.c" + "${CMAKE_CURRENT_BINARY_DIR}/person.pb-c.h" + COMMAND protobuf::protoc + ARGS --plugin=$ + --c_out=${CMAKE_CURRENT_BINARY_DIR} + person.proto + DEPENDS person.proto protobuf::protoc protobuf-c::protoc-gen-c + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +add_executable(main main.c + "${CMAKE_CURRENT_BINARY_DIR}/person.pb-c.c" + "${CMAKE_CURRENT_BINARY_DIR}/person.pb-c.h") +target_include_directories(main PUBLIC + $) +target_link_libraries(main protobuf-c::protobuf-c) +# DOCUMENTATION_END } diff --git a/examples/protobuf-c/main.c b/examples/protobuf-c/main.c new file mode 100644 index 000000000..fcd0d1f81 --- /dev/null +++ b/examples/protobuf-c/main.c @@ -0,0 +1,8 @@ +#include +#include "person.pb-c.h" + +int main() +{ + Person person = PERSON__INIT; + return (int) protobuf_c_version_number(); +} diff --git a/examples/protobuf-c/person.proto b/examples/protobuf-c/person.proto new file mode 100644 index 000000000..bb377fbd5 --- /dev/null +++ b/examples/protobuf-c/person.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +message Person { + string first_name = 1; + string last_name = 2; + uint32 age = 3; +} diff --git a/examples/pugixml/CMakeLists.txt b/examples/pugixml/CMakeLists.txt new file mode 100644 index 000000000..f0eef9bc4 --- /dev/null +++ b/examples/pugixml/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-pugixml) + +# download pugixml +hunter_add_package(pugixml) + +# now pugixml can be used +find_package(pugixml CONFIG REQUIRED) + +set(CMAKE_CXX_STANDARD 11) +set(CXX_STANDARD_REQUIRED ON) +add_executable(example main.cpp) +target_link_libraries(example pugixml) diff --git a/examples/pugixml/main.cpp b/examples/pugixml/main.cpp new file mode 100644 index 000000000..492aaa3a1 --- /dev/null +++ b/examples/pugixml/main.cpp @@ -0,0 +1,10 @@ +#include +#include +#include + +int main(int argc, char *argv[]) { + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file("test.xml"); + assert(result); + assert(strcmp(doc.child_value("root"), "Hello world!") == 0); +} diff --git a/examples/pybind11/CMakeLists.txt b/examples/pybind11/CMakeLists.txt new file mode 100644 index 000000000..27789941a --- /dev/null +++ b/examples/pybind11/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-pybind11) + +hunter_add_package(pybind11) + +find_package(pybind11 CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main pybind11::pybind11 pybind11::embed pybind11::module) diff --git a/examples/pybind11/main.cpp b/examples/pybind11/main.cpp new file mode 100644 index 000000000..2578341b9 --- /dev/null +++ b/examples/pybind11/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/qhull/CMakeLists.txt b/examples/qhull/CMakeLists.txt new file mode 100644 index 000000000..1de5297be --- /dev/null +++ b/examples/qhull/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-qhull) + +# DOCUMENTATION_START { +hunter_add_package(qhull) +find_package(qhull CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo qhull::libqhull) +# DOCUMENTATION_END } diff --git a/examples/qhull/boo.cpp b/examples/qhull/boo.cpp new file mode 100644 index 000000000..fc0f5d202 --- /dev/null +++ b/examples/qhull/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/qt-camera/config.cmake b/examples/qt-camera/config.cmake new file mode 100644 index 000000000..1228c75a4 --- /dev/null +++ b/examples/qt-camera/config.cmake @@ -0,0 +1,50 @@ +string(COMPARE EQUAL "${CMAKE_SYSTEM_NAME}" "Linux" is_linux) + +if(is_linux) + set( + dependencies + drm + glib + gst_plugins_bad + gst_plugins_base + gst_plugins_good + gst_plugins_ugly + gstreamer + ice + libffi + libogg + libpcre + pciaccess + sm + util_linux + x11 + xau + xcb + xcursor + xdamage + xext + xfixes + xi + xinerama + xrandr + xrender + xshmfence + xxf86vm + Jpeg + ) + foreach(pkg ${dependencies}) + hunter_config( + ${pkg} + VERSION ${HUNTER_${pkg}_VERSION} + CMAKE_ARGS BUILD_SHARED_LIBS=ON + ) + endforeach() + + hunter_config( + Qt + VERSION ${HUNTER_Qt_VERSION} + CMAKE_ARGS + QT_WITH_GSTREAMER=ON + BUILD_SHARED_LIBS=ON + ) +endif() diff --git a/examples/qt-camera/env.sh b/examples/qt-camera/env.sh new file mode 100644 index 000000000..f8d57b8f9 --- /dev/null +++ b/examples/qt-camera/env.sh @@ -0,0 +1,4 @@ +export GST_PLUGIN_PATH=@QT_ROOT@/lib/gstreamer-1.0 +export GST_PLUGIN_SCANNER=1 +export LD_LIBRARY_PATH=@QT_ROOT@/lib +export QT_DEBUG_PLUGINS=1 diff --git a/examples/qt-camera/qt.conf b/examples/qt-camera/qt.conf new file mode 100644 index 000000000..eda41e5ae --- /dev/null +++ b/examples/qt-camera/qt.conf @@ -0,0 +1,3 @@ +[Paths] + +Plugins = "@QT_ROOT@/plugins" diff --git a/examples/quickjs/CMakeLists.txt b/examples/quickjs/CMakeLists.txt new file mode 100644 index 000000000..52864fa5f --- /dev/null +++ b/examples/quickjs/CMakeLists.txt @@ -0,0 +1,30 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-quickjs) + +# DOCUMENTATION_START { +hunter_add_package(quickjs) +find_package(quickjs CONFIG REQUIRED) + +add_executable(run-test262 run-test262.c) +target_link_libraries(run-test262 PRIVATE quickjs::quickjs) +# DOCUMENTATION_END } + +include(CheckLibraryExists) +check_library_exists(m "pow" "" __math_system_library) + +if(__math_system_library) + target_link_libraries(run-test262 PRIVATE m) +endif() + +target_link_libraries(run-test262 PRIVATE ${CMAKE_DL_LIBS}) + +find_package(Threads REQUIRED) +target_link_libraries(run-test262 PRIVATE Threads::Threads) diff --git a/examples/quickjs/cutils.h b/examples/quickjs/cutils.h new file mode 100644 index 000000000..fdbf44a88 --- /dev/null +++ b/examples/quickjs/cutils.h @@ -0,0 +1,292 @@ +/* + * C utilities + * + * Copyright (c) 2017 Fabrice Bellard + * Copyright (c) 2018 Charlie Gordon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * 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. + */ +#ifndef CUTILS_H +#define CUTILS_H + +#include +#include + +/* set if CPU is big endian */ +#undef WORDS_BIGENDIAN + +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#define force_inline inline __attribute__((always_inline)) +#define no_inline __attribute__((noinline)) + +#define xglue(x, y) x ## y +#define glue(x, y) xglue(x, y) +#define stringify(s) tostring(s) +#define tostring(s) #s + +#ifndef offsetof +#define offsetof(type, field) ((size_t) &((type *)0)->field) +#endif +#ifndef countof +#define countof(x) (sizeof(x) / sizeof((x)[0])) +#endif + +typedef int BOOL; + +#ifndef FALSE +enum { + FALSE = 0, + TRUE = 1, +}; +#endif + +void pstrcpy(char *buf, int buf_size, const char *str); +char *pstrcat(char *buf, int buf_size, const char *s); +int strstart(const char *str, const char *val, const char **ptr); +int has_suffix(const char *str, const char *suffix); + +static inline int max_int(int a, int b) +{ + if (a > b) + return a; + else + return b; +} + +static inline int min_int(int a, int b) +{ + if (a < b) + return a; + else + return b; +} + +static inline uint32_t max_uint32(uint32_t a, uint32_t b) +{ + if (a > b) + return a; + else + return b; +} + +static inline uint32_t min_uint32(uint32_t a, uint32_t b) +{ + if (a < b) + return a; + else + return b; +} + +static inline int64_t max_int64(int64_t a, int64_t b) +{ + if (a > b) + return a; + else + return b; +} + +static inline int64_t min_int64(int64_t a, int64_t b) +{ + if (a < b) + return a; + else + return b; +} + +/* WARNING: undefined if a = 0 */ +static inline int clz32(unsigned int a) +{ + return __builtin_clz(a); +} + +/* WARNING: undefined if a = 0 */ +static inline int clz64(uint64_t a) +{ + return __builtin_clzll(a); +} + +/* WARNING: undefined if a = 0 */ +static inline int ctz32(unsigned int a) +{ + return __builtin_ctz(a); +} + +/* WARNING: undefined if a = 0 */ +static inline int ctz64(uint64_t a) +{ + return __builtin_ctzll(a); +} + +struct __attribute__((packed)) packed_u64 { + uint64_t v; +}; + +struct __attribute__((packed)) packed_u32 { + uint32_t v; +}; + +struct __attribute__((packed)) packed_u16 { + uint16_t v; +}; + +static inline uint64_t get_u64(const uint8_t *tab) +{ + return ((const struct packed_u64 *)tab)->v; +} + +static inline int64_t get_i64(const uint8_t *tab) +{ + return (int64_t)((const struct packed_u64 *)tab)->v; +} + +static inline void put_u64(uint8_t *tab, uint64_t val) +{ + ((struct packed_u64 *)tab)->v = val; +} + +static inline uint32_t get_u32(const uint8_t *tab) +{ + return ((const struct packed_u32 *)tab)->v; +} + +static inline int32_t get_i32(const uint8_t *tab) +{ + return (int32_t)((const struct packed_u32 *)tab)->v; +} + +static inline void put_u32(uint8_t *tab, uint32_t val) +{ + ((struct packed_u32 *)tab)->v = val; +} + +static inline uint32_t get_u16(const uint8_t *tab) +{ + return ((const struct packed_u16 *)tab)->v; +} + +static inline int32_t get_i16(const uint8_t *tab) +{ + return (int16_t)((const struct packed_u16 *)tab)->v; +} + +static inline void put_u16(uint8_t *tab, uint16_t val) +{ + ((struct packed_u16 *)tab)->v = val; +} + +static inline uint32_t get_u8(const uint8_t *tab) +{ + return *tab; +} + +static inline int32_t get_i8(const uint8_t *tab) +{ + return (int8_t)*tab; +} + +static inline void put_u8(uint8_t *tab, uint8_t val) +{ + *tab = val; +} + +static inline uint16_t bswap16(uint16_t x) +{ + return (x >> 8) | (x << 8); +} + +static inline uint32_t bswap32(uint32_t v) +{ + return ((v & 0xff000000) >> 24) | ((v & 0x00ff0000) >> 8) | + ((v & 0x0000ff00) << 8) | ((v & 0x000000ff) << 24); +} + +static inline uint64_t bswap64(uint64_t v) +{ + return ((v & ((uint64_t)0xff << (7 * 8))) >> (7 * 8)) | + ((v & ((uint64_t)0xff << (6 * 8))) >> (5 * 8)) | + ((v & ((uint64_t)0xff << (5 * 8))) >> (3 * 8)) | + ((v & ((uint64_t)0xff << (4 * 8))) >> (1 * 8)) | + ((v & ((uint64_t)0xff << (3 * 8))) << (1 * 8)) | + ((v & ((uint64_t)0xff << (2 * 8))) << (3 * 8)) | + ((v & ((uint64_t)0xff << (1 * 8))) << (5 * 8)) | + ((v & ((uint64_t)0xff << (0 * 8))) << (7 * 8)); +} + +/* XXX: should take an extra argument to pass slack information to the caller */ +typedef void *DynBufReallocFunc(void *opaque, void *ptr, size_t size); + +typedef struct DynBuf { + uint8_t *buf; + size_t size; + size_t allocated_size; + BOOL error; /* true if a memory allocation error occurred */ + DynBufReallocFunc *realloc_func; + void *opaque; /* for realloc_func */ +} DynBuf; + +void dbuf_init(DynBuf *s); +void dbuf_init2(DynBuf *s, void *opaque, DynBufReallocFunc *realloc_func); +int dbuf_realloc(DynBuf *s, size_t new_size); +int dbuf_write(DynBuf *s, size_t offset, const uint8_t *data, size_t len); +int dbuf_put(DynBuf *s, const uint8_t *data, size_t len); +int dbuf_put_self(DynBuf *s, size_t offset, size_t len); +int dbuf_putc(DynBuf *s, uint8_t c); +int dbuf_putstr(DynBuf *s, const char *str); +static inline int dbuf_put_u16(DynBuf *s, uint16_t val) +{ + return dbuf_put(s, (uint8_t *)&val, 2); +} +static inline int dbuf_put_u32(DynBuf *s, uint32_t val) +{ + return dbuf_put(s, (uint8_t *)&val, 4); +} +static inline int dbuf_put_u64(DynBuf *s, uint64_t val) +{ + return dbuf_put(s, (uint8_t *)&val, 8); +} +int __attribute__((format(printf, 2, 3))) dbuf_printf(DynBuf *s, + const char *fmt, ...); +void dbuf_free(DynBuf *s); +static inline BOOL dbuf_error(DynBuf *s) { + return s->error; +} + +#define UTF8_CHAR_LEN_MAX 6 + +int unicode_to_utf8(uint8_t *buf, unsigned int c); +int unicode_from_utf8(const uint8_t *p, int max_len, const uint8_t **pp); + +static inline int from_hex(int c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + else if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + else + return -1; +} + +void rqsort(void *base, size_t nmemb, size_t size, + int (*cmp)(const void *, const void *, void *), + void *arg); + +#endif /* CUTILS_H */ diff --git a/examples/quickjs/list.h b/examples/quickjs/list.h new file mode 100644 index 000000000..0a1bc5a49 --- /dev/null +++ b/examples/quickjs/list.h @@ -0,0 +1,100 @@ +/* + * Linux klist like system + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * 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. + */ +#ifndef LIST_H +#define LIST_H + +#ifndef NULL +#include +#endif + +struct list_head { + struct list_head *prev; + struct list_head *next; +}; + +#define LIST_HEAD_INIT(el) { &(el), &(el) } + +/* return the pointer of type 'type *' containing 'el' as field 'member' */ +#define list_entry(el, type, member) \ + ((type *)((uint8_t *)(el) - offsetof(type, member))) + +static inline void init_list_head(struct list_head *head) +{ + head->prev = head; + head->next = head; +} + +/* insert 'el' between 'prev' and 'next' */ +static inline void __list_add(struct list_head *el, + struct list_head *prev, struct list_head *next) +{ + prev->next = el; + el->prev = prev; + el->next = next; + next->prev = el; +} + +/* add 'el' at the head of the list 'head' (= after element head) */ +static inline void list_add(struct list_head *el, struct list_head *head) +{ + __list_add(el, head, head->next); +} + +/* add 'el' at the end of the list 'head' (= before element head) */ +static inline void list_add_tail(struct list_head *el, struct list_head *head) +{ + __list_add(el, head->prev, head); +} + +static inline void list_del(struct list_head *el) +{ + struct list_head *prev, *next; + prev = el->prev; + next = el->next; + prev->next = next; + next->prev = prev; + el->prev = NULL; /* fail safe */ + el->next = NULL; /* fail safe */ +} + +static inline int list_empty(struct list_head *el) +{ + return el->next == el; +} + +#define list_for_each(el, head) \ + for(el = (head)->next; el != (head); el = el->next) + +#define list_for_each_safe(el, el1, head) \ + for(el = (head)->next, el1 = el->next; el != (head); \ + el = el1, el1 = el->next) + +#define list_for_each_prev(el, head) \ + for(el = (head)->prev; el != (head); el = el->prev) + +#define list_for_each_prev_safe(el, el1, head) \ + for(el = (head)->prev, el1 = el->prev; el != (head); \ + el = el1, el1 = el->prev) + +#endif /* LIST_H */ diff --git a/examples/quickjs/run-test262.c b/examples/quickjs/run-test262.c new file mode 100644 index 000000000..7fdcd4e63 --- /dev/null +++ b/examples/quickjs/run-test262.c @@ -0,0 +1,2002 @@ +/* + * ECMA Test 262 Runner for QuickJS + * + * Copyright (c) 2017-2018 Fabrice Bellard + * Copyright (c) 2017-2018 Charlie Gordon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * 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. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "cutils.h" +#include "list.h" + +/* enable test262 thread support to test SharedArrayBuffer and Atomics */ +#define CONFIG_AGENT +/* cross-realm tests (not supported yet) */ +//#define CONFIG_REALM + +#define CMD_NAME "run-test262" + +typedef struct namelist_t { + char **array; + int count; + int size; + unsigned int sorted : 1; +} namelist_t; + +namelist_t test_list; +namelist_t exclude_list; +namelist_t exclude_dir_list; + +FILE *outfile; +enum test_mode_t { + TEST_DEFAULT_NOSTRICT, /* run tests as nostrict unless test is flagged as strictonly */ + TEST_DEFAULT_STRICT, /* run tests as strict unless test is flagged as nostrict */ + TEST_NOSTRICT, /* run tests as nostrict, skip strictonly tests */ + TEST_STRICT, /* run tests as strict, skip nostrict tests */ + TEST_ALL, /* run tests in both strict and nostrict, unless restricted by spec */ +} test_mode = TEST_DEFAULT_NOSTRICT; +int skip_async; +int skip_module; +int new_style; +int dump_memory; +int stats_count; +JSMemoryUsage stats_all, stats_avg, stats_min, stats_max; +char *stats_min_filename; +char *stats_max_filename; +int verbose; +char *harness_dir; +char *harness_exclude; +char *harness_features; +char *harness_skip_features; +char *error_filename; +char *error_file; +FILE *error_out; +char *report_filename; +int update_errors; +int test_count, test_failed, test_index, test_skipped, test_excluded; +int new_errors, changed_errors, fixed_errors; + +void warning(const char *, ...) __attribute__((__format__(__printf__, 1, 2))); +void fatal(int, const char *, ...) __attribute__((__format__(__printf__, 2, 3))); + +void warning(const char *fmt, ...) +{ + va_list ap; + + fflush(stdout); + fprintf(stderr, "%s: ", CMD_NAME); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fputc('\n', stderr); +} + +void fatal(int errcode, const char *fmt, ...) +{ + va_list ap; + + fflush(stdout); + fprintf(stderr, "%s: ", CMD_NAME); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fputc('\n', stderr); + + exit(errcode); +} + +void perror_exit(int errcode, const char *s) +{ + fflush(stdout); + fprintf(stderr, "%s: ", CMD_NAME); + perror(s); + exit(errcode); +} + +char *strdup_len(const char *str, int len) +{ + char *p = malloc(len + 1); + memcpy(p, str, len); + p[len] = '\0'; + return p; +} + +static inline int str_equal(const char *a, const char *b) { + return !strcmp(a, b); +} + +char *str_append(char **pp, const char *sep, const char *str) { + char *res, *p; + size_t len = 0; + p = *pp; + if (p) { + len = strlen(p) + strlen(sep); + } + res = malloc(len + strlen(str) + 1); + if (p) { + strcpy(res, p); + strcat(res, sep); + } + strcpy(res + len, str); + free(p); + return *pp = res; +} + +char *str_strip(char *p) +{ + size_t len = strlen(p); + while (len > 0 && isspace((unsigned char)p[len - 1])) + p[--len] = '\0'; + while (isspace((unsigned char)*p)) + p++; + return p; +} + +int has_prefix(const char *str, const char *prefix) +{ + return !strncmp(str, prefix, strlen(prefix)); +} + +char *skip_prefix(const char *str, const char *prefix) +{ + int i; + for (i = 0;; i++) { + if (prefix[i] == '\0') { /* skip the prefix */ + str += i; + break; + } + if (str[i] != prefix[i]) + break; + } + return (char *)str; +} + +char *get_basename(const char *filename) +{ + char *p; + + p = strrchr(filename, '/'); + if (!p) + return NULL; + return strdup_len(filename, p - filename); +} + +char *compose_path(const char *path, const char *name) +{ + int path_len, name_len; + char *d, *q; + + if (!path || path[0] == '\0' || *name == '/') { + d = strdup(name); + } else { + path_len = strlen(path); + name_len = strlen(name); + d = malloc(path_len + 1 + name_len + 1); + if (d) { + q = d; + memcpy(q, path, path_len); + q += path_len; + if (path[path_len - 1] != '/') + *q++ = '/'; + memcpy(q, name, name_len + 1); + } + } + return d; +} + +int namelist_cmp(const char *a, const char *b) +{ + /* compare strings in modified lexicographical order */ + for (;;) { + int ca = (unsigned char)*a++; + int cb = (unsigned char)*b++; + if (isdigit(ca) && isdigit(cb)) { + int na = ca - '0'; + int nb = cb - '0'; + while (isdigit(ca = (unsigned char)*a++)) + na = na * 10 + ca - '0'; + while (isdigit(cb = (unsigned char)*b++)) + nb = nb * 10 + cb - '0'; + if (na < nb) + return -1; + if (na > nb) + return +1; + } + if (ca < cb) + return -1; + if (ca > cb) + return +1; + if (ca == '\0') + return 0; + } +} + +int namelist_cmp_indirect(const void *a, const void *b) +{ + return namelist_cmp(*(const char **)a, *(const char **)b); +} + +void namelist_sort(namelist_t *lp) +{ + int i, count; + if (lp->count > 1) { + qsort(lp->array, lp->count, sizeof(*lp->array), namelist_cmp_indirect); + /* remove duplicates */ + for (count = i = 1; i < lp->count; i++) { + if (namelist_cmp(lp->array[count - 1], lp->array[i]) == 0) { + free(lp->array[i]); + } else { + lp->array[count++] = lp->array[i]; + } + } + lp->count = count; + } + lp->sorted = 1; +} + +int namelist_find(namelist_t *lp, const char *name) +{ + int a, b, m, cmp; + + if (!lp->sorted) { + namelist_sort(lp); + } + for (a = 0, b = lp->count; a < b;) { + m = a + (b - a) / 2; + cmp = namelist_cmp(lp->array[m], name); + if (cmp < 0) + a = m + 1; + else if (cmp > 0) + b = m; + else + return m; + } + return -1; +} + +void namelist_add(namelist_t *lp, const char *base, const char *name) +{ + char *s; + + s = compose_path(base, name); + if (!s) + goto fail; + if (lp->count == lp->size) { + size_t newsize = lp->size + (lp->size >> 1) + 4; + char **a = realloc(lp->array, sizeof(lp->array[0]) * newsize); + if (!a) + goto fail; + lp->array = a; + lp->size = newsize; + } + lp->array[lp->count] = s; + lp->count++; + return; +fail: + fatal(1, "allocation failure\n"); +} + +void namelist_load(namelist_t *lp, const char *filename) +{ + char buf[1024]; + char *base_name; + FILE *f; + + f = fopen(filename, "rb"); + if (!f) { + perror_exit(1, filename); + } + base_name = get_basename(filename); + + while (fgets(buf, sizeof(buf), f) != NULL) { + char *p = str_strip(buf); + if (*p == '#' || *p == ';' || *p == '\0') + continue; /* line comment */ + + namelist_add(lp, base_name, p); + } + free(base_name); + fclose(f); +} + +void namelist_add_from_error_file(namelist_t *lp, const char *file) +{ + const char *p, *p0; + char *pp; + + for (p = file; (p = strstr(p, ".js:")) != NULL; p++) { + for (p0 = p; p0 > file && p0[-1] != '\n'; p0--) + continue; + pp = strdup_len(p0, p + 3 - p0); + namelist_add(lp, NULL, pp); + free(pp); + } +} + +void namelist_free(namelist_t *lp) +{ + while (lp->count > 0) { + free(lp->array[--lp->count]); + } + free(lp->array); + lp->array = NULL; + lp->size = 0; +} + +static int add_test_file(const char *filename, const struct stat *ptr, int flag) +{ + namelist_t *lp = &test_list; + if (has_suffix(filename, ".js") && !has_suffix(filename, "_FIXTURE.js")) + namelist_add(lp, NULL, filename); + return 0; +} + +/* find js files from the directory tree and sort the list */ +static void enumerate_tests(const char *path) +{ + namelist_t *lp = &test_list; + int start = lp->count; + ftw(path, add_test_file, 100); + qsort(lp->array + start, lp->count - start, sizeof(*lp->array), + namelist_cmp_indirect); +} + +static JSValue js_print(JSContext *ctx, JSValueConst this_val, + int argc, JSValueConst *argv) +{ + int i; + const char *str; + + if (outfile) { + for (i = 0; i < argc; i++) { + if (i != 0) + fputc(' ', outfile); + str = JS_ToCString(ctx, argv[i]); + if (!str) + return JS_EXCEPTION; + fputs(str, outfile); + JS_FreeCString(ctx, str); + } + fputc('\n', outfile); + } + return JS_UNDEFINED; +} + +static JSValue js_detachArrayBuffer(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + JS_DetachArrayBuffer(ctx, argv[0]); + return JS_UNDEFINED; +} + +static JSValue js_evalScript(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + const char *str; + int len; + JSValue ret; + str = JS_ToCStringLen(ctx, &len, argv[0], FALSE); + if (!str) + return JS_EXCEPTION; + ret = JS_Eval(ctx, str, len, "", JS_EVAL_TYPE_GLOBAL); + JS_FreeCString(ctx, str); + return ret; +} + +#ifdef CONFIG_AGENT + +#include + +typedef struct { + struct list_head link; + pthread_t tid; + char *script; + JSValue broadcast_func; + BOOL broadcast_pending; + JSValue broadcast_sab; /* in the main context */ + uint8_t *broadcast_sab_buf; + size_t broadcast_sab_size; + int32_t broadcast_val; +} Test262Agent; + +typedef struct { + struct list_head link; + char *str; +} AgentReport; + +static JSValue add_helpers1(JSContext *ctx); +static void add_helpers(JSContext *ctx); + +static pthread_mutex_t agent_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t agent_cond = PTHREAD_COND_INITIALIZER; +/* list of Test262Agent.link */ +static struct list_head agent_list = LIST_HEAD_INIT(agent_list); + +static pthread_mutex_t report_mutex = PTHREAD_MUTEX_INITIALIZER; +/* list of AgentReport.link */ +static struct list_head report_list = LIST_HEAD_INIT(report_list); + +static void *agent_start(void *arg) +{ + Test262Agent *agent = arg; + JSRuntime *rt; + JSContext *ctx; + JSValue ret_val; + int ret; + + rt = JS_NewRuntime(); + if (rt == NULL) { + fatal(1, "JS_NewRuntime failure"); + } + ctx = JS_NewContext(rt); + if (ctx == NULL) { + JS_FreeRuntime(rt); + fatal(1, "JS_NewContext failure"); + } + JS_SetContextOpaque(ctx, agent); + JS_SetRuntimeInfo(rt, "agent"); + JS_SetCanBlock(rt, TRUE); + + add_helpers(ctx); + ret_val = JS_Eval(ctx, agent->script, strlen(agent->script), + "", JS_EVAL_TYPE_GLOBAL); + free(agent->script); + agent->script = NULL; + if (JS_IsException(ret_val)) + js_std_dump_error(ctx); + JS_FreeValue(ctx, ret_val); + + for(;;) { + JSContext *ctx1; + ret = JS_ExecutePendingJob(JS_GetRuntime(ctx), &ctx1); + if (ret < 0) { + js_std_dump_error(ctx); + break; + } else if (ret == 0) { + if (JS_IsUndefined(agent->broadcast_func)) { + break; + } else { + JSValue args[2]; + + pthread_mutex_lock(&agent_mutex); + while (!agent->broadcast_pending) { + pthread_cond_wait(&agent_cond, &agent_mutex); + } + + agent->broadcast_pending = FALSE; + pthread_cond_signal(&agent_cond); + + pthread_mutex_unlock(&agent_mutex); + + args[0] = JS_NewArrayBuffer(ctx, agent->broadcast_sab_buf, + agent->broadcast_sab_size, + NULL, NULL, TRUE); + args[1] = JS_NewInt32(ctx, agent->broadcast_val); + ret_val = JS_Call(ctx, agent->broadcast_func, JS_UNDEFINED, + 2, (JSValueConst *)args); + JS_FreeValue(ctx, args[0]); + JS_FreeValue(ctx, args[1]); + if (JS_IsException(ret_val)) + js_std_dump_error(ctx); + JS_FreeValue(ctx, ret_val); + JS_FreeValue(ctx, agent->broadcast_func); + agent->broadcast_func = JS_UNDEFINED; + } + } + } + JS_FreeValue(ctx, agent->broadcast_func); + + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + return NULL; +} + +static JSValue js_agent_start(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + const char *script; + Test262Agent *agent; + + if (JS_GetContextOpaque(ctx) != NULL) + return JS_ThrowTypeError(ctx, "cannot be called inside an agent"); + + script = JS_ToCString(ctx, argv[0]); + if (!script) + return JS_EXCEPTION; + agent = malloc(sizeof(*agent)); + memset(agent, 0, sizeof(*agent)); + agent->broadcast_func = JS_UNDEFINED; + agent->broadcast_sab = JS_UNDEFINED; + agent->script = strdup(script); + JS_FreeCString(ctx, script); + list_add_tail(&agent->link, &agent_list); + pthread_create(&agent->tid, NULL, agent_start, agent); + return JS_UNDEFINED; +} + +static void js_agent_free(JSContext *ctx) +{ + struct list_head *el, *el1; + Test262Agent *agent; + + list_for_each_safe(el, el1, &agent_list) { + agent = list_entry(el, Test262Agent, link); + pthread_join(agent->tid, NULL); + JS_FreeValue(ctx, agent->broadcast_sab); + list_del(&agent->link); + free(agent); + } +} + +static JSValue js_agent_leaving(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + Test262Agent *agent = JS_GetContextOpaque(ctx); + if (!agent) + return JS_ThrowTypeError(ctx, "must be called inside an agent"); + /* nothing to do */ + return JS_UNDEFINED; +} + +static BOOL is_broadcast_pending(void) +{ + struct list_head *el; + Test262Agent *agent; + list_for_each(el, &agent_list) { + agent = list_entry(el, Test262Agent, link); + if (agent->broadcast_pending) + return TRUE; + } + return FALSE; +} + +static JSValue js_agent_broadcast(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + JSValueConst sab = argv[0]; + struct list_head *el; + Test262Agent *agent; + uint8_t *buf; + size_t buf_size; + int32_t val; + + if (JS_GetContextOpaque(ctx) != NULL) + return JS_ThrowTypeError(ctx, "cannot be called inside an agent"); + + buf = JS_GetArrayBuffer(ctx, &buf_size, sab); + if (!buf) + return JS_EXCEPTION; + if (JS_ToInt32(ctx, &val, argv[1])) + return JS_EXCEPTION; + + /* broadcast the values and wait until all agents have started + calling their callbacks */ + pthread_mutex_lock(&agent_mutex); + list_for_each(el, &agent_list) { + agent = list_entry(el, Test262Agent, link); + agent->broadcast_pending = TRUE; + /* the shared array buffer is used by the thread, so increment + its refcount */ + agent->broadcast_sab = JS_DupValue(ctx, sab); + agent->broadcast_sab_buf = buf; + agent->broadcast_sab_size = buf_size; + agent->broadcast_val = val; + } + pthread_cond_broadcast(&agent_cond); + + while (is_broadcast_pending()) { + pthread_cond_wait(&agent_cond, &agent_mutex); + } + pthread_mutex_unlock(&agent_mutex); + return JS_UNDEFINED; +} + +static JSValue js_agent_receiveBroadcast(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + Test262Agent *agent = JS_GetContextOpaque(ctx); + if (!agent) + return JS_ThrowTypeError(ctx, "must be called inside an agent"); + if (!JS_IsFunction(ctx, argv[0])) + return JS_ThrowTypeError(ctx, "expecting function"); + JS_FreeValue(ctx, agent->broadcast_func); + agent->broadcast_func = JS_DupValue(ctx, argv[0]); + return JS_UNDEFINED; +} + +static JSValue js_agent_sleep(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + uint32_t duration; + if (JS_ToUint32(ctx, &duration, argv[0])) + return JS_EXCEPTION; + usleep(duration * 1000); + return JS_UNDEFINED; +} + +static JSValue js_agent_monotonicNow(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return JS_NewInt64(ctx, (uint64_t)ts.tv_sec * 1000 + + (ts.tv_nsec / 1000000)); +} + +static JSValue js_agent_getReport(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + AgentReport *rep; + JSValue ret; + + pthread_mutex_lock(&report_mutex); + if (list_empty(&report_list)) { + rep = NULL; + } else { + rep = list_entry(report_list.next, AgentReport, link); + list_del(&rep->link); + } + pthread_mutex_unlock(&report_mutex); + if (rep) { + ret = JS_NewString(ctx, rep->str); + free(rep->str); + free(rep); + } else { + ret = JS_NULL; + } + return ret; +} + +static JSValue js_agent_report(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + const char *str; + AgentReport *rep; + + str = JS_ToCString(ctx, argv[0]); + if (!str) + return JS_EXCEPTION; + rep = malloc(sizeof(*rep)); + rep->str = strdup(str); + JS_FreeCString(ctx, str); + + pthread_mutex_lock(&report_mutex); + list_add_tail(&rep->link, &report_list); + pthread_mutex_unlock(&report_mutex); + return JS_UNDEFINED; +} + +static const JSCFunctionListEntry js_agent_funcs[] = { + /* only in main */ + JS_CFUNC_DEF("start", 1, js_agent_start ), + JS_CFUNC_DEF("getReport", 0, js_agent_getReport ), + JS_CFUNC_DEF("broadcast", 2, js_agent_broadcast ), + /* only in agent */ + JS_CFUNC_DEF("report", 1, js_agent_report ), + JS_CFUNC_DEF("leaving", 0, js_agent_leaving ), + JS_CFUNC_DEF("receiveBroadcast", 1, js_agent_receiveBroadcast ), + /* in both */ + JS_CFUNC_DEF("sleep", 1, js_agent_sleep ), + JS_CFUNC_DEF("monotonicNow", 0, js_agent_monotonicNow ), +}; + +static JSValue js_new_agent(JSContext *ctx) +{ + JSValue agent; + agent = JS_NewObject(ctx); + JS_SetPropertyFunctionList(ctx, agent, js_agent_funcs, + countof(js_agent_funcs)); + return agent; +} +#endif + +#ifdef CONFIG_REALM +static JSValue js_createRealm(JSContext *ctx, JSValue this_val, + int argc, JSValue *argv) +{ + JSContext *ctx1; + /* XXX: the context is not freed, need a refcount */ + ctx1 = JS_NewContext(JS_GetRuntime(ctx)); + if (!ctx1) + return JS_ThrowOutOfMemory(ctx); + return add_helpers1(ctx1); +} +#endif + +static JSValue add_helpers1(JSContext *ctx) +{ + JSValue global_obj; + JSValue obj262; + + global_obj = JS_GetGlobalObject(ctx); + + JS_SetPropertyStr(ctx, global_obj, "print", + JS_NewCFunction(ctx, js_print, "print", 1)); + + /* $262 special object used by the tests */ + obj262 = JS_NewObject(ctx); + JS_SetPropertyStr(ctx, obj262, "detachArrayBuffer", + JS_NewCFunction(ctx, js_detachArrayBuffer, + "detachArrayBuffer", 1)); + JS_SetPropertyStr(ctx, obj262, "evalScript", + JS_NewCFunction(ctx, js_evalScript, + "evalScript", 1)); + JS_SetPropertyStr(ctx, obj262, "codePointRange", + JS_NewCFunction(ctx, js_string_codePointRange, + "codePointRange", 2)); +#ifdef CONFIG_AGENT + JS_SetPropertyStr(ctx, obj262, "agent", js_new_agent(ctx)); +#endif + +#ifdef CONFIG_REALM + JS_SetPropertyStr(ctx, obj262, "global", + JS_DupValue(ctx, global_obj)); + + JS_SetPropertyStr(ctx, obj262, "createRealm", + JS_NewCFunction(ctx, js_createRealm, + "createRealm", 0)); +#endif + + JS_SetPropertyStr(ctx, global_obj, "$262", JS_DupValue(ctx, obj262)); + + JS_FreeValue(ctx, global_obj); + return obj262; +} + +static void add_helpers(JSContext *ctx) +{ + JS_FreeValue(ctx, add_helpers1(ctx)); +} + +static char *load_file(const char *filename, size_t *lenp) +{ + char *buf; + size_t buf_len; + buf = (char *)js_load_file(NULL, &buf_len, filename); + if (!buf) + perror_exit(1, filename); + if (lenp) + *lenp = buf_len; + return buf; +} + +static JSModuleDef *js_module_loader_test(JSContext *ctx, + const char *module_name, void *opaque) +{ + size_t buf_len; + uint8_t *buf; + JSModuleDef *m; + JSValue func_val; + + buf = js_load_file(ctx, &buf_len, module_name); + if (!buf) { + JS_ThrowReferenceError(ctx, "could not load module filename '%s'", + module_name); + return NULL; + } + + /* compile the module */ + func_val = JS_Eval(ctx, (char *)buf, buf_len, module_name, + JS_EVAL_TYPE_MODULE | JS_EVAL_FLAG_COMPILE_ONLY); + js_free(ctx, buf); + if (JS_IsException(func_val)) + return NULL; + /* the module is already referenced, so we must free it */ + m = JS_VALUE_GET_PTR(func_val); + JS_FreeValue(ctx, func_val); + return m; +} + +int is_line_sep(char c) +{ + return (c == '\0' || c == '\n' || c == '\r'); +} + +char *find_line(const char *str, const char *line) +{ + if (str) { + const char *p; + int len = strlen(line); + for (p = str; (p = strstr(p, line)) != NULL; p += len + 1) { + if ((p == str || is_line_sep(p[-1])) && is_line_sep(p[len])) + return (char *)p; + } + } + return NULL; +} + +int is_word_sep(char c) +{ + return (c == '\0' || isspace((unsigned char)c) || c == ','); +} + +char *find_word(const char *str, const char *word) +{ + const char *p; + int len = strlen(word); + if (str && len) { + for (p = str; (p = strstr(p, word)) != NULL; p += len) { + if ((p == str || is_word_sep(p[-1])) && is_word_sep(p[len])) + return (char *)p; + } + } + return NULL; +} + +/* handle exclude directories */ +void update_exclude_dirs(void) +{ + namelist_t *lp = &test_list; + namelist_t *ep = &exclude_list; + namelist_t *dp = &exclude_dir_list; + char *name; + int i, j, count; + + /* split directpries from exclude_list */ + for (count = i = 0; i < ep->count; i++) { + name = ep->array[i]; + if (has_suffix(name, "/")) { + namelist_add(dp, NULL, name); + free(name); + } else { + ep->array[count++] = name; + } + } + ep->count = count; + + namelist_sort(dp); + + /* filter out excluded directories */ + for (count = i = 0; i < lp->count; i++) { + name = lp->array[i]; + for (j = 0; j < dp->count; j++) { + if (has_prefix(name, dp->array[j])) { + test_excluded++; + free(name); + name = NULL; + break; + } + } + if (name) { + lp->array[count++] = name; + } + } + lp->count = count; +} + +void load_config(const char *filename) +{ + char buf[1024]; + FILE *f; + char *base_name; + enum { + SECTION_NONE = 0, + SECTION_CONFIG, + SECTION_EXCLUDE, + SECTION_FEATURES, + SECTION_TESTS, + } section = SECTION_NONE; + int lineno = 0; + + f = fopen(filename, "rb"); + if (!f) { + perror_exit(1, filename); + } + base_name = get_basename(filename); + + while (fgets(buf, sizeof(buf), f) != NULL) { + char *p, *q; + lineno++; + p = str_strip(buf); + if (*p == '#' || *p == ';' || *p == '\0') + continue; /* line comment */ + + if (*p == "[]"[0]) { + /* new section */ + p++; + p[strcspn(p, "]")] = '\0'; + if (str_equal(p, "config")) + section = SECTION_CONFIG; + else if (str_equal(p, "exclude")) + section = SECTION_EXCLUDE; + else if (str_equal(p, "features")) + section = SECTION_FEATURES; + else if (str_equal(p, "tests")) + section = SECTION_TESTS; + else + section = SECTION_NONE; + continue; + } + q = strchr(p, '='); + if (q) { + /* setting: name=value */ + *q++ = '\0'; + q = str_strip(q); + } + switch (section) { + case SECTION_CONFIG: + if (!q) { + printf("%s:%d: syntax error\n", filename, lineno); + continue; + } + if (str_equal(p, "style")) { + new_style = str_equal(q, "new"); + continue; + } + if (str_equal(p, "testdir")) { + char *testdir = compose_path(base_name, q); + enumerate_tests(testdir); + free(testdir); + continue; + } + if (str_equal(p, "harnessdir")) { + harness_dir = compose_path(base_name, q); + continue; + } + if (str_equal(p, "harnessexclude")) { + str_append(&harness_exclude, " ", q); + continue; + } + if (str_equal(p, "features")) { + str_append(&harness_features, " ", q); + continue; + } + if (str_equal(p, "skip-features")) { + str_append(&harness_skip_features, " ", q); + continue; + } + if (str_equal(p, "mode")) { + if (str_equal(q, "default") || str_equal(q, "default-nostrict")) + test_mode = TEST_DEFAULT_NOSTRICT; + else if (str_equal(q, "default-strict")) + test_mode = TEST_DEFAULT_STRICT; + else if (str_equal(q, "nostrict")) + test_mode = TEST_NOSTRICT; + else if (str_equal(q, "strict")) + test_mode = TEST_STRICT; + else if (str_equal(q, "all") || str_equal(q, "both")) + test_mode = TEST_ALL; + else + fatal(2, "unknown test mode: %s", q); + continue; + } + if (str_equal(p, "strict")) { + if (str_equal(q, "skip") || str_equal(q, "no")) + test_mode = TEST_NOSTRICT; + continue; + } + if (str_equal(p, "nostrict")) { + if (str_equal(q, "skip") || str_equal(q, "no")) + test_mode = TEST_STRICT; + continue; + } + if (str_equal(p, "async")) { + skip_async = !str_equal(q, "yes"); + continue; + } + if (str_equal(p, "module")) { + skip_module = !str_equal(q, "yes"); + continue; + } + if (str_equal(p, "verbose")) { + verbose = str_equal(q, "yes"); + continue; + } + if (str_equal(p, "errorfile")) { + error_filename = compose_path(base_name, q); + continue; + } + if (str_equal(p, "excludefile")) { + char *path = compose_path(base_name, q); + namelist_load(&exclude_list, path); + free(path); + continue; + } + if (str_equal(p, "reportfile")) { + report_filename = compose_path(base_name, q); + continue; + } + case SECTION_EXCLUDE: + namelist_add(&exclude_list, base_name, p); + break; + case SECTION_FEATURES: + if (!q || str_equal(q, "yes")) + str_append(&harness_features, " ", p); + else + str_append(&harness_skip_features, " ", p); + break; + case SECTION_TESTS: + namelist_add(&test_list, base_name, p); + break; + default: + /* ignore settings in other sections */ + break; + } + } + fclose(f); + free(base_name); +} + +char *find_error(const char *filename, int *pline, int is_strict) +{ + if (error_file) { + size_t len = strlen(filename); + const char *p, *q, *r; + int line; + + for (p = error_file; (p = strstr(p, filename)) != NULL; p += len) { + if ((p == error_file || p[-1] == '\n' || p[-1] == '(') && p[len] == ':') { + q = p + len; + line = 1; + if (*q == ':') { + line = strtol(q + 1, (char**)&q, 10); + if (*q == ':') + q++; + } + while (*q == ' ') { + q++; + } + /* check strict mode indicator */ + if (!strstart(q, "strict mode: ", &q) != !is_strict) + continue; + r = q = skip_prefix(q, "unexpected error: "); + r += strcspn(r, "\n"); + while (r[0] == '\n' && r[1] && strncmp(r + 1, filename, 8)) { + r++; + r += strcspn(r, "\n"); + } + if (pline) + *pline = line; + return strdup_len(q, r - q); + } + } + } + return NULL; +} + +int skip_comments(const char *str, int line, int *pline) +{ + const char *p; + int c; + + p = str; + while ((c = (unsigned char)*p++) != '\0') { + if (isspace(c)) { + if (c == '\n') + line++; + continue; + } + if (c == '/' && *p == '/') { + while (*++p && *p != '\n') + continue; + continue; + } + if (c == '/' && *p == '*') { + for (p += 1; *p; p++) { + if (*p == '\n') { + line++; + continue; + } + if (*p == '*' && p[1] == '/') { + p += 2; + break; + } + } + continue; + } + break; + } + if (pline) + *pline = line; + + return p - str; +} + +int longest_match(const char *str, const char *find, int pos, int *ppos, int line, int *pline) +{ + int len, maxlen; + + maxlen = 0; + + if (*find) { + const char *p; + for (p = str + pos; *p; p++) { + if (*p == *find) { + for (len = 1; p[len] && p[len] == find[len]; len++) + continue; + if (len > maxlen) { + maxlen = len; + if (ppos) + *ppos = p - str; + if (pline) + *pline = line; + if (!find[len]) + break; + } + } + if (*p == '\n') + line++; + } + } + return maxlen; +} + +static int eval_buf(JSContext *ctx, const char *buf, size_t buf_len, + const char *filename, int is_test, int is_negative, + const char *error_type, FILE *outfile, int eval_flags, + int is_async) +{ + JSValue res_val, exception_val; + int ret, error_line, pos, pos_line; + BOOL is_error, has_error_line; + const char *error_name; + + pos = skip_comments(buf, 1, &pos_line); + error_line = pos_line; + has_error_line = FALSE; + exception_val = JS_UNDEFINED; + error_name = NULL; + + res_val = JS_Eval(ctx, buf, buf_len, filename, eval_flags); + + if (is_async && !JS_IsException(res_val)) { + JS_FreeValue(ctx, res_val); + for(;;) { + JSContext *ctx1; + ret = JS_ExecutePendingJob(JS_GetRuntime(ctx), &ctx1); + if (ret < 0) { + res_val = JS_EXCEPTION; + break; + } else if (ret == 0) { + JSValue global; + /* test if the test called $DONE() */ + global = JS_GetGlobalObject(ctx); + res_val = JS_GetPropertyStr(ctx, global, "$async_done"); + JS_FreeValue(ctx, global); + if (!JS_IsException(res_val) && JS_IsUndefined(res_val)) { + res_val = JS_ThrowTypeError(ctx, "$DONE() not called"); + } + break; + } + } + } + + if (JS_IsException(res_val)) { + exception_val = JS_GetException(ctx); + is_error = JS_IsError(ctx, exception_val); + /* XXX: should get the filename and line number */ + if (outfile) { + if (!is_error) + fprintf(outfile, "%sThrow: ", (eval_flags & JS_EVAL_FLAG_STRICT) ? + "strict mode: " : ""); + js_print(ctx, JS_NULL, 1, &exception_val); + } + if (is_error) { + JSValue name, stack; + const char *stack_str; + + name = JS_GetPropertyStr(ctx, exception_val, "name"); + error_name = JS_ToCString(ctx, name); + stack = JS_GetPropertyStr(ctx, exception_val, "stack"); + if (!JS_IsUndefined(stack)) { + stack_str = JS_ToCString(ctx, stack); + if (stack_str) { + const char *p; + int len; + + if (outfile) + fprintf(outfile, "%s", stack_str); + + len = strlen(filename); + p = strstr(stack_str, filename); + if (p != NULL && p[len] == ':') { + error_line = atoi(p + len + 1); + has_error_line = TRUE; + } + JS_FreeCString(ctx, stack_str); + } + } + JS_FreeValue(ctx, stack); + JS_FreeValue(ctx, name); + } + if (is_negative) { + ret = 0; + if (error_type) { + char *error_class; + const char *msg; + + msg = JS_ToCString(ctx, exception_val); + error_class = strdup_len(msg, strcspn(msg, ":")); + if (!str_equal(error_class, error_type)) + ret = -1; + free(error_class); + JS_FreeCString(ctx, msg); + } + } else { + ret = -1; + } + } else { + if (is_negative) + ret = -1; + else + ret = 0; + } + + if (verbose && is_test) { + JSValue msg_val = JS_UNDEFINED; + const char *msg = NULL; + int s_line; + char *s = find_error(filename, &s_line, eval_flags & JS_EVAL_FLAG_STRICT); + const char *strict_mode = (eval_flags & JS_EVAL_FLAG_STRICT) ? "strict mode: " : ""; + + if (!JS_IsUndefined(exception_val)) { + msg_val = JS_ToString(ctx, exception_val); + msg = JS_ToCString(ctx, msg_val); + } + if (is_negative) { // expect error + if (ret == 0) { + if (msg && s && + (str_equal(s, "expected error") || + strstart(s, "unexpected error type:", NULL) || + str_equal(s, msg))) { // did not have error yet + if (!has_error_line) { + longest_match(buf, msg, pos, &pos, pos_line, &error_line); + } + printf("%s:%d: %sOK, now has error %s\n", + filename, error_line, strict_mode, msg); + fixed_errors++; + } + } else { + if (!s) { // not yet reported + if (msg) { + fprintf(error_out, "%s:%d: %sunexpected error type: %s\n", + filename, error_line, strict_mode, msg); + } else { + fprintf(error_out, "%s:%d: %sexpected error\n", + filename, error_line, strict_mode); + } + new_errors++; + } + } + } else { // should not have error + if (msg) { + if (!s || !str_equal(s, msg)) { + if (!has_error_line) { + char *p = skip_prefix(msg, "Test262 Error: "); + if (strstr(p, "Test case returned non-true value!")) { + longest_match(buf, "runTestCase", pos, &pos, pos_line, &error_line); + } else { + longest_match(buf, p, pos, &pos, pos_line, &error_line); + } + } + fprintf(error_out, "%s:%d: %s%s%s\n", filename, error_line, strict_mode, + error_file ? "unexpected error: " : "", msg); + + if (s && (!str_equal(s, msg) || error_line != s_line)) { + printf("%s:%d: %sprevious error: %s\n", filename, s_line, strict_mode, s); + changed_errors++; + } else { + new_errors++; + } + } + } else { + if (s) { + printf("%s:%d: %sOK, fixed error: %s\n", filename, s_line, strict_mode, s); + fixed_errors++; + } + } + } + JS_FreeValue(ctx, msg_val); + JS_FreeCString(ctx, msg); + free(s); + } + JS_FreeCString(ctx, error_name); + JS_FreeValue(ctx, exception_val); + JS_FreeValue(ctx, res_val); + return ret; +} + +static int eval_file(JSContext *ctx, const char *base, const char *p, + int eval_flags) +{ + char *buf; + size_t buf_len; + char *filename = compose_path(base, p); + + buf = load_file(filename, &buf_len); + if (!buf) { + warning("cannot load %s", filename); + goto fail; + } + if (eval_buf(ctx, buf, buf_len, filename, FALSE, FALSE, NULL, stderr, + eval_flags, FALSE)) { + warning("error evaluating %s", filename); + goto fail; + } + free(buf); + free(filename); + return 0; + +fail: + free(buf); + free(filename); + return 1; +} + +char *extract_desc(const char *buf, char style) +{ + const char *p, *desc_start; + char *desc; + int len; + + p = buf; + while (*p != '\0') { + if (p[0] == '/' && p[1] == '*' && p[2] == style && p[3] != '/') { + p += 3; + desc_start = p; + while (*p != '\0' && (p[0] != '*' || p[1] != '/')) + p++; + if (*p == '\0') { + warning("Expecting end of desc comment"); + return NULL; + } + len = p - desc_start; + desc = malloc(len + 1); + memcpy(desc, desc_start, len); + desc[len] = '\0'; + return desc; + } else { + p++; + } + } + return NULL; +} + +static char *find_tag(char *desc, const char *tag, int *state) +{ + char *p; + p = strstr(desc, tag); + if (p) { + p += strlen(tag); + *state = 0; + } + return p; +} + +static char *get_option(char **pp, int *state) +{ + char *p, *p0, *option = NULL; + if (*pp) { + for (p = *pp;; p++) { + switch (*p) { + case '[': + *state += 1; + continue; + case ']': + *state -= 1; + if (*state > 0) + continue; + p = NULL; + break; + case ' ': + case '\t': + case '\r': + case ',': + case '-': + continue; + case '\n': + if (*state > 0 || p[1] == ' ') + continue; + p = NULL; + break; + case '\0': + p = NULL; + break; + default: + p0 = p; + p += strcspn(p0, " \t\r\n,]"); + option = strdup_len(p0, p - p0); + break; + } + break; + } + *pp = p; + } + return option; +} + +void update_stats(JSRuntime *rt, const char *filename) { + JSMemoryUsage stats; + JS_ComputeMemoryUsage(rt, &stats); + if (stats_count++ == 0) { + stats_avg = stats_all = stats_min = stats_max = stats; + stats_min_filename = strdup(filename); + stats_max_filename = strdup(filename); + } else { + if (stats_max.malloc_size < stats.malloc_size) { + stats_max = stats; + free(stats_max_filename); + stats_max_filename = strdup(filename); + } + if (stats_min.malloc_size > stats.malloc_size) { + stats_min = stats; + free(stats_min_filename); + stats_min_filename = strdup(filename); + } + +#define update(f) stats_avg.f = (stats_all.f += stats.f) / stats_count + update(malloc_count); + update(malloc_size); + update(memory_used_count); + update(memory_used_size); + update(atom_count); + update(atom_size); + update(str_count); + update(str_size); + update(obj_count); + update(obj_size); + update(prop_count); + update(prop_size); + update(shape_count); + update(shape_size); + update(js_func_count); + update(js_func_size); + update(js_func_code_size); + update(js_func_pc2line_count); + update(js_func_pc2line_size); + update(c_func_count); + update(array_count); + update(fast_array_count); + update(fast_array_elements); + } +#undef update +} + +int run_test_buf(const char *filename, char *harness, namelist_t *ip, + char *buf, size_t buf_len, const char* error_type, + int eval_flags, BOOL is_negative, BOOL is_async, + BOOL can_block) +{ + JSRuntime *rt; + JSContext *ctx; + int i, ret; + + rt = JS_NewRuntime(); + if (rt == NULL) { + fatal(1, "JS_NewRuntime failure"); + } + ctx = JS_NewContext(rt); + if (ctx == NULL) { + JS_FreeRuntime(rt); + fatal(1, "JS_NewContext failure"); + } + JS_SetRuntimeInfo(rt, filename); + + JS_SetCanBlock(rt, can_block); + + /* loader for ES6 modules */ + JS_SetModuleLoaderFunc(rt, NULL, js_module_loader_test, NULL); + + add_helpers(ctx); + + /* add backtrace if the isError property is present in a thrown + object */ + JS_EnableIsErrorProperty(ctx, TRUE); + + /* a few tests use it, probably a bug in the tests */ + { + JSValue global_obj = JS_GetGlobalObject(ctx); + JS_DefinePropertyValueStr(ctx, global_obj, "global", + global_obj, + JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE); + } + + for (i = 0; i < ip->count; i++) { + if (eval_file(ctx, harness, ip->array[i], + JS_EVAL_TYPE_GLOBAL | JS_EVAL_FLAG_STRIP)) { + fatal(1, "error including %s for %s", ip->array[i], filename); + } + } + + ret = eval_buf(ctx, buf, buf_len, filename, TRUE, is_negative, + error_type, outfile, eval_flags, is_async); + ret = (ret != 0); + + if (dump_memory) { + update_stats(rt, filename); + } +#ifdef CONFIG_AGENT + js_agent_free(ctx); +#endif + JS_FreeContext(ctx); + JS_FreeRuntime(rt); + + test_count++; + if (ret) { + test_failed++; + if (outfile) { + /* do not output a failure number to minimize diff */ + fprintf(outfile, " FAILED\n"); + } + } + return ret; +} + +int run_test(const char *filename, int index) +{ + char harnessbuf[1024]; + char *harness; + char *buf; + size_t buf_len; + char *desc, *p; + char *error_type; + int ret, eval_flags, use_strict, use_nostrict; + BOOL is_negative, is_nostrict, is_onlystrict, is_async, is_module, skip; + BOOL can_block; + namelist_t include_list = { 0 }, *ip = &include_list; + + is_nostrict = is_onlystrict = is_negative = is_async = is_module = skip = FALSE; + can_block = TRUE; + error_type = NULL; + buf = load_file(filename, &buf_len); + + harness = harness_dir; + + if (new_style) { + if (!harness) { + p = strstr(filename, "test/"); + if (p) { + snprintf(harnessbuf, sizeof(harnessbuf), "%.*s%s", + (int)(p - filename), filename, "harness"); + } + harness = harnessbuf; + } + namelist_add(ip, NULL, "sta.js"); + namelist_add(ip, NULL, "assert.js"); + /* extract the YAML frontmatter */ + desc = extract_desc(buf, '-'); + if (desc) { + char *ifile, *option; + int state; + p = find_tag(desc, "includes:", &state); + if (p) { + while ((ifile = get_option(&p, &state)) != NULL) { + // skip unsupported harness files + if (find_word(harness_exclude, ifile)) { + skip |= 1; + } else { + namelist_add(ip, NULL, ifile); + } + free(ifile); + } + } + p = find_tag(desc, "flags:", &state); + if (p) { + while ((option = get_option(&p, &state)) != NULL) { + if (str_equal(option, "noStrict")) { + is_nostrict = TRUE; + skip |= (test_mode == TEST_STRICT); + } + else if (str_equal(option, "onlyStrict")) { + is_onlystrict = TRUE; + skip |= (test_mode == TEST_NOSTRICT); + } + else if (str_equal(option, "async")) { + is_async = TRUE; + skip |= skip_async; + } + else if (str_equal(option, "module")) { + is_module = TRUE; + skip |= skip_module; + } + else if (str_equal(option, "CanBlockIsFalse")) { + can_block = FALSE; + } + free(option); + } + } + p = find_tag(desc, "negative:", &state); + if (p) { + /* XXX: should extract the phase */ + char *q = find_tag(p, "type:", &state); + if (q) { + while (isspace(*q)) + q++; + error_type = strdup_len(q, strcspn(q, " \n")); + } + is_negative = TRUE; + } + p = find_tag(desc, "features:", &state); + if (p) { + while ((option = get_option(&p, &state)) != NULL) { + if (find_word(harness_features, option)) { + /* feature is enabled */ + } else if (find_word(harness_skip_features, option)) { + /* skip disabled feature */ + skip |= 1; + } else { + /* feature is not listed: skip and warn */ + printf("%s:%d: unknown feature: %s\n", filename, 1, option); + skip |= 1; + } + free(option); + } + } + free(desc); + } + if (is_async) + namelist_add(ip, NULL, "doneprintHandle.js"); + } else { + char *ifile; + + if (!harness) { + p = strstr(filename, "test/"); + if (p) { + snprintf(harnessbuf, sizeof(harnessbuf), "%.*s%s", + (int)(p - filename), filename, "test/harness"); + } + harness = harnessbuf; + } + + namelist_add(ip, NULL, "sta.js"); + + /* include extra harness files */ + for (p = buf; (p = strstr(p, "$INCLUDE(\"")) != NULL; p++) { + p += 10; + ifile = strdup_len(p, strcspn(p, "\"")); + // skip unsupported harness files + if (find_word(harness_exclude, ifile)) { + skip |= 1; + } else { + namelist_add(ip, NULL, ifile); + } + free(ifile); + } + + /* locate the old style configuration comment */ + desc = extract_desc(buf, '*'); + if (desc) { + if (strstr(desc, "@noStrict")) { + is_nostrict = TRUE; + skip |= (test_mode == TEST_STRICT); + } + if (strstr(desc, "@onlyStrict")) { + is_onlystrict = TRUE; + skip |= (test_mode == TEST_NOSTRICT); + } + if (strstr(desc, "@negative")) { + /* XXX: should extract the regex to check error type */ + is_negative = TRUE; + } + free(desc); + } + } + + if (outfile && index >= 0) { + fprintf(outfile, "%d: %s%s%s%s%s%s%s\n", index, filename, + is_nostrict ? " @noStrict" : "", + is_onlystrict ? " @onlyStrict" : "", + is_async ? " async" : "", + is_module ? " module" : "", + is_negative ? " @negative" : "", + skip ? " SKIPPED" : ""); + fflush(outfile); + } + + use_strict = use_nostrict = 0; + switch (test_mode) { + case TEST_DEFAULT_NOSTRICT: + if (is_onlystrict) + use_strict = 1; + else + use_nostrict = 1; + break; + case TEST_DEFAULT_STRICT: + if (is_nostrict) + use_nostrict = 1; + else + use_strict = 1; + break; + case TEST_NOSTRICT: + if (!is_onlystrict) + use_nostrict = 1; + break; + case TEST_STRICT: + if (!is_nostrict) + use_strict = 1; + break; + case TEST_ALL: + if (!is_nostrict) + use_strict = 1; + if (!is_onlystrict) + use_nostrict = 1; + break; + } + + if (skip || use_strict + use_nostrict == 0) { + test_skipped++; + ret = -2; + } else { + clock_t clocks; + + if (is_module) { + eval_flags = JS_EVAL_TYPE_MODULE; + } else { + eval_flags = JS_EVAL_TYPE_GLOBAL; + } + clocks = clock(); + ret = 0; + if (use_nostrict) { + ret = run_test_buf(filename, harness, ip, buf, buf_len, + error_type, eval_flags, is_negative, is_async, + can_block); + } + if (use_strict) { + ret |= run_test_buf(filename, harness, ip, buf, buf_len, + error_type, eval_flags | JS_EVAL_FLAG_STRICT, + is_negative, is_async, can_block); + } + clocks = clock() - clocks; + if (outfile && index >= 0 && clocks >= CLOCKS_PER_SEC / 10) { + /* output timings for tests that take more than 100 ms */ + fprintf(outfile, " time: %d ms\n", (int)(clocks * 1000LL / CLOCKS_PER_SEC)); + } + } + namelist_free(&include_list); + free(error_type); + free(buf); + + return ret; +} + +clock_t last_clock; + +void show_progress(int force) { + clock_t t = clock(); + if (force || !last_clock || (t - last_clock) > CLOCKS_PER_SEC / 20) { + last_clock = t; + /* output progress indicator: erase end of line and return to col 0 */ + fprintf(stderr, "%d/%d/%d\033[K\r", + test_failed, test_count, test_skipped); + fflush(stderr); + } +} + +void run_test_dir_list(namelist_t *lp, int start_index, int stop_index) +{ + int i; + + namelist_sort(lp); + for (i = 0; i < lp->count; i++) { + const char *p = lp->array[i]; + if (namelist_find(&exclude_list, p) >= 0) { + test_excluded++; + } else if (test_index < start_index) { + test_skipped++; + } else if (stop_index >= 0 && test_index > stop_index) { + test_skipped++; + } else { + run_test(p, test_index); + show_progress(FALSE); + } + test_index++; + } + show_progress(TRUE); +} + +void help(void) +{ + printf("usage: run-test262 [options] {-f file ... | [dir_list] [index range]}\n" + "-h help\n" + "-a run tests in strict and nostrict modes\n" + "-m print memory usage summary\n" + "-n use new style harness\n" + "-s run tests in strict mode, skip @nostrict tests\n" + "-u update error file\n" + "-v verbose: output error messages\n" + "-c file read configuration from 'file'\n" + "-d dir run all test files in directory tree 'dir'\n" + "-e file load the known errors from 'file'\n" + "-f file execute single test from 'file'\n" + "-r file set the report file name (default=none)\n" + "-x file exclude tests listed in 'file'\n"); + exit(1); +} + +char *get_opt_arg(const char *option, char *arg) +{ + if (!arg) { + fatal(2, "missing argument for option %s", option); + } + return arg; +} + +int main(int argc, char **argv) +{ + int optind, start_index, stop_index; + BOOL is_dir_list; + BOOL only_check_errors = FALSE; + const char *filename; + +#if !defined(_WIN32) + /* Date tests assume California local time */ + setenv("TZ", "America/Los_Angeles", 1); +#endif + + /* cannot use getopt because we want to pass the command line to + the script */ + optind = 1; + is_dir_list = TRUE; + while (optind < argc) { + char *arg = argv[optind]; + if (*arg != '-') + break; + optind++; + if (str_equal(arg, "-h")) { + help(); + } else if (str_equal(arg, "-m")) { + dump_memory++; + } else if (str_equal(arg, "-n")) { + new_style++; + } else if (str_equal(arg, "-s")) { + test_mode = TEST_STRICT; + } else if (str_equal(arg, "-a")) { + test_mode = TEST_ALL; + } else if (str_equal(arg, "-u")) { + update_errors++; + } else if (str_equal(arg, "-v")) { + verbose++; + } else if (str_equal(arg, "-c")) { + load_config(get_opt_arg(arg, argv[optind++])); + } else if (str_equal(arg, "-d")) { + enumerate_tests(get_opt_arg(arg, argv[optind++])); + } else if (str_equal(arg, "-e")) { + error_filename = get_opt_arg(arg, argv[optind++]); + } else if (str_equal(arg, "-x")) { + namelist_load(&exclude_list, get_opt_arg(arg, argv[optind++])); + } else if (str_equal(arg, "-f")) { + is_dir_list = FALSE; + } else if (str_equal(arg, "-r")) { + report_filename = get_opt_arg(arg, argv[optind++]); + } else if (str_equal(arg, "-E")) { + only_check_errors = TRUE; + } else { + fatal(1, "unknown option: %s", arg); + break; + } + } + + if (optind >= argc && !test_list.count) + help(); + + error_out = stdout; + if (error_filename) { + error_file = load_file(error_filename, NULL); + if (only_check_errors && error_file) { + namelist_free(&test_list); + namelist_add_from_error_file(&test_list, error_file); + } + if (update_errors) { + free(error_file); + error_file = NULL; + error_out = fopen(error_filename, "w"); + if (!error_out) { + perror_exit(1, error_filename); + } + } + } + + update_exclude_dirs(); + + if (is_dir_list) { + if (optind < argc && !isdigit(argv[optind][0])) { + filename = argv[optind++]; + namelist_load(&test_list, filename); + } + start_index = 0; + stop_index = -1; + if (optind < argc) { + start_index = atoi(argv[optind++]); + if (optind < argc) { + stop_index = atoi(argv[optind++]); + } + } + if (!report_filename || str_equal(report_filename, "none")) { + outfile = NULL; + } else if (str_equal(report_filename, "-")) { + outfile = stdout; + } else { + outfile = fopen(report_filename, "wb"); + if (!outfile) { + perror_exit(1, report_filename); + } + } + run_test_dir_list(&test_list, start_index, stop_index); + + if (outfile && outfile != stdout) { + fclose(outfile); + outfile = NULL; + } + } else { + outfile = stdout; + while (optind < argc) { + run_test(argv[optind++], -1); + } + } + + if (dump_memory) { + if (dump_memory > 1 && stats_count > 1) { + printf("\nMininum memory statistics for %s:\n\n", stats_min_filename); + JS_DumpMemoryUsage(stdout, &stats_min, NULL); + printf("\nMaximum memory statistics for %s:\n\n", stats_max_filename); + JS_DumpMemoryUsage(stdout, &stats_max, NULL); + } + printf("\nAverage memory statistics for %d tests:\n\n", stats_count); + JS_DumpMemoryUsage(stdout, &stats_avg, NULL); + printf("\n"); + } + + if (is_dir_list) { + fprintf(stderr, "Result: %d/%d error%s", + test_failed, test_count, test_count != 1 ? "s" : ""); + if (test_excluded) + fprintf(stderr, ", %d excluded", test_excluded); + if (test_skipped) + fprintf(stderr, ", %d skipped", test_skipped); + if (error_file) { + if (new_errors) + fprintf(stderr, ", %d new", new_errors); + if (changed_errors) + fprintf(stderr, ", %d changed", changed_errors); + if (fixed_errors) + fprintf(stderr, ", %d fixed", fixed_errors); + } + fprintf(stderr, "\n"); + } + + if (error_out && error_out != stdout) { + fclose(error_out); + error_out = NULL; + } + + namelist_free(&test_list); + namelist_free(&exclude_list); + namelist_free(&exclude_dir_list); + free(harness_dir); + free(harness_features); + free(harness_exclude); + free(error_file); + + return 0; +} diff --git a/examples/rabit/CMakeLists.txt b/examples/rabit/CMakeLists.txt new file mode 100644 index 000000000..8083cf5cc --- /dev/null +++ b/examples/rabit/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-rabit) + +# DOCUMENTATION_START { +hunter_add_package(rabit) +find_package(rabit CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC rabit::rabit) +# DOCUMENTATION_END } diff --git a/examples/rabit/foo.cpp b/examples/rabit/foo.cpp new file mode 100644 index 000000000..d216d03b7 --- /dev/null +++ b/examples/rabit/foo.cpp @@ -0,0 +1,11 @@ +#include + +int main(int argc, char *argv[]) +{ + if (argc < 3) + { + printf("Usage: \n"); + return 0; + } + rabit::Init(argc, argv); +} diff --git a/examples/rang/CMakeLists.txt b/examples/rang/CMakeLists.txt new file mode 100644 index 000000000..078f2edc3 --- /dev/null +++ b/examples/rang/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-rang) + +# DOCUMENTATION_START { +hunter_add_package(rang) +find_package(rang CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC rang::rang) +# DOCUMENTATION_END } diff --git a/examples/rang/boo.cpp b/examples/rang/boo.cpp new file mode 100644 index 000000000..f64dc4f25 --- /dev/null +++ b/examples/rang/boo.cpp @@ -0,0 +1,8 @@ +#include + +int main() +{ + std::cout << "Plain old text" + << rang::style::bold << "Rang styled text!!" + << rang::style::reset << std::endl; +} diff --git a/examples/range-v3/CMakeLists.txt b/examples/range-v3/CMakeLists.txt new file mode 100644 index 000000000..773556f7e --- /dev/null +++ b/examples/range-v3/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-range-v3) + +# DOCUMENTATION_START { +hunter_add_package(range-v3) +find_package(range-v3 CONFIG REQUIRED) + +add_executable(comprehensions comprehensions.cpp) +target_link_libraries(comprehensions PUBLIC range-v3) +# DOCUMENTATION_END } diff --git a/examples/range-v3/comprehensions.cpp b/examples/range-v3/comprehensions.cpp new file mode 100644 index 000000000..e4f7e6be8 --- /dev/null +++ b/examples/range-v3/comprehensions.cpp @@ -0,0 +1,129 @@ +// Range v3 library +// +// Copyright Eric Niebler 2013-2014 +// +// Use, modification and distribution is subject to the +// Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// Project home: https://github.com/ericniebler/range-v3 +// + +#include +#include +#include + +using namespace ranges; + +int main() +{ + // Define an infinite range containing all the Pythagorean triples: + auto triples = + view::for_each(view::ints(1), [](int z) + { + return view::for_each(view::ints(1, z + 1), [=](int x) + { + return view::for_each(view::ints(x, z + 1), [=](int y) + { + return yield_if(x*x + y * y == z * z, std::make_tuple(x, y, z)); + }); + }); + }); + + //// This alternate syntax also works: + //auto triples = ints(1) >>= [] (int z) { return + // ints(1, z+1) >>= [=](int x) { return + // ints(x, z+1) >>= [=](int y) { return + // yield_if(x*x + y*y == z*z, + // std::make_tuple(x, y, z)); };}; }; + + // Display the first 100 triples + RANGES_FOR(auto triple, triples | view::take(100)) + { + std::cout << '(' + << std::get<0>(triple) << ',' + << std::get<1>(triple) << ',' + << std::get<2>(triple) << ')' << '\n'; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Benchmark Code +//////////////////////////////////////////////////////////////////////////////////////////////////// + +class timer +{ +private: + std::chrono::high_resolution_clock::time_point start_; +public: + timer() + { + reset(); + } + void reset() + { + start_ = std::chrono::high_resolution_clock::now(); + } + std::chrono::milliseconds elapsed() const + { + return std::chrono::duration_cast( + std::chrono::high_resolution_clock::now() - start_); + } + friend std::ostream &operator<<(std::ostream &sout, timer const &t) + { + return sout << t.elapsed().count() << "ms"; + } +}; + +void benchmark() +{ + // Define an infinite range containing all the Pythagorean triples: + auto triples = + view::for_each(view::ints(1), [](int z) + { + return view::for_each(view::ints(1, z + 1), [=](int x) + { + return view::for_each(view::ints(x, z + 1), [=](int y) + { + return yield_if(x*x + y * y == z * z, std::make_tuple(x, y, z)); + }); + }); + }); + + static constexpr int max_triples = 3000; + + timer t; + int result = 0; + RANGES_FOR(auto triple, triples | view::take(max_triples)) + { + int i, j, k; + std::tie(i, j, k) = triple; + result += (i + j + k); + } + std::cout << t << '\n'; + std::cout << result << '\n'; + + result = 0; + int found = 0; + t.reset(); + for (int z = 1;; ++z) + { + for (int x = 1; x <= z; ++x) + { + for (int y = x; y <= z; ++y) + { + if (x*x + y * y == z * z) + { + result += (x + y + z); + ++found; + if (found == max_triples) + goto done; + } + } + } + } +done: + std::cout << t << '\n'; + std::cout << result << '\n'; +} diff --git a/examples/re2/CMakeLists.txt b/examples/re2/CMakeLists.txt new file mode 100644 index 000000000..c72b8bf3a --- /dev/null +++ b/examples/re2/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-re2) + +hunter_add_package(re2) +find_package(RE2 CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo RE2::re2) diff --git a/examples/re2/foo.cpp b/examples/re2/foo.cpp new file mode 100644 index 000000000..50e8ee41c --- /dev/null +++ b/examples/re2/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/readline/CMakeLists.txt b/examples/readline/CMakeLists.txt new file mode 100644 index 000000000..99c6d85e3 --- /dev/null +++ b/examples/readline/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-readline) + +# DOCUMENTATION_START { +hunter_add_package(readline) +find_package(readline REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC readline::readline) +# DOCUMENTATION_END } diff --git a/examples/readline/boo.cpp b/examples/readline/boo.cpp new file mode 100644 index 000000000..e7a1a9ba4 --- /dev/null +++ b/examples/readline/boo.cpp @@ -0,0 +1,8 @@ +#include +#include + +int main() { + char *answer = readline("What is your name? "); + + printf("Hello, %s!\n", answer); +} diff --git a/examples/recastnavigation/CMakeLists.txt b/examples/recastnavigation/CMakeLists.txt new file mode 100644 index 000000000..e18437d0a --- /dev/null +++ b/examples/recastnavigation/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-recastnavigation) + +hunter_add_package(recastnavigation) +find_package(recastnavigation CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries( + boo + PUBLIC + recastnavigation::detour + recastnavigation::detour_crowd + recastnavigation::detour_tile_cache + recastnavigation::recast +) diff --git a/examples/recastnavigation/boo.cpp b/examples/recastnavigation/boo.cpp new file mode 100644 index 000000000..4b8518e25 --- /dev/null +++ b/examples/recastnavigation/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/rocksdb/CMakeLists.txt b/examples/rocksdb/CMakeLists.txt new file mode 100644 index 000000000..5ef28588d --- /dev/null +++ b/examples/rocksdb/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(rocksdb-test) + +# DOCUMENTATION_START { +hunter_add_package(rocksdb) +find_package(RocksDB CONFIG REQUIRED) + +add_executable(rocksdb-test test.cpp) +target_link_libraries(rocksdb-test PUBLIC RocksDB::rocksdb) +# DOCUMENTATION_END } diff --git a/examples/rocksdb/test.cpp b/examples/rocksdb/test.cpp new file mode 100644 index 000000000..60316f9cb --- /dev/null +++ b/examples/rocksdb/test.cpp @@ -0,0 +1,8 @@ +#include + +int main() +{ + rocksdb::Slice slice; + std::string str = slice.ToString(); + return static_cast(str.size()); +} diff --git a/examples/ros/CMakeLists.txt b/examples/ros/CMakeLists.txt new file mode 100644 index 000000000..abbb9f350 --- /dev/null +++ b/examples/ros/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros) + +# DOCUMENTATION_START { +hunter_add_package(ros) +find_package(catkin CONFIG REQUIRED COMPONENTS roslib) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/ros/main.cpp b/examples/ros/main.cpp new file mode 100644 index 000000000..fe32937d5 --- /dev/null +++ b/examples/ros/main.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/ros/package.xml b/examples/ros/package.xml new file mode 100644 index 000000000..5f5b7327f --- /dev/null +++ b/examples/ros/package.xml @@ -0,0 +1,11 @@ + + download_ros + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_comm/CMakeLists.txt b/examples/ros_comm/CMakeLists.txt new file mode 100644 index 000000000..7fa7ebb63 --- /dev/null +++ b/examples/ros_comm/CMakeLists.txt @@ -0,0 +1,22 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_comm) + +# DOCUMENTATION_START { + +hunter_add_package(ros_comm) +find_package(catkin CONFIG REQUIRED COMPONENTS roscpp + rosbag rosbag_storage topic_tools message_filters roslz4 xmlrpcpp) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/ros_comm/main.cpp b/examples/ros_comm/main.cpp new file mode 100644 index 000000000..93be9321b --- /dev/null +++ b/examples/ros_comm/main.cpp @@ -0,0 +1,17 @@ +#include +#include "ros/ros.h" +#include "ros/callback_queue_interface.h" +#include "rosbag/player.h" +#include "rosbag/bag.h" +#include "rosbag/bag_player.h" +#include "topic_tools/shape_shifter.h" +#include "message_filters/time_synchronizer.h" +#include "roslz4/lz4s.h" +#include "xmlrpcpp/XmlRpc.h" + +int main() { + ros::Time::init(); + ros::Duration(3).sleep(); + std::cout << "Done" << std::endl; + return 0; +} diff --git a/examples/ros_comm/package.xml b/examples/ros_comm/package.xml new file mode 100644 index 000000000..289f87395 --- /dev/null +++ b/examples/ros_comm/package.xml @@ -0,0 +1,11 @@ + + download_ros_comm + 0.0.0 + + This package provides foo capability. + + Krasimir Georgiev + BSD + + catkin + diff --git a/examples/ros_comm_msgs/CMakeLists.txt b/examples/ros_comm_msgs/CMakeLists.txt new file mode 100644 index 000000000..ecb2ae46f --- /dev/null +++ b/examples/ros_comm_msgs/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_comm_msgs) + +# DOCUMENTATION_START { + +hunter_add_package(ros_comm_msgs) +find_package(catkin CONFIG REQUIRED COMPONENTS rosgraph_msgs std_srvs) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +target_include_directories(main PRIVATE ${catkin_INCLUDE_DIRS}) + +# DOCUMENTATION_END } diff --git a/examples/ros_comm_msgs/main.cpp b/examples/ros_comm_msgs/main.cpp new file mode 100644 index 000000000..8aae19173 --- /dev/null +++ b/examples/ros_comm_msgs/main.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/ros_comm_msgs/package.xml b/examples/ros_comm_msgs/package.xml new file mode 100644 index 000000000..2dda96b57 --- /dev/null +++ b/examples/ros_comm_msgs/package.xml @@ -0,0 +1,11 @@ + + download_ros_comm_msgs + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_common_msgs/CMakeLists.txt b/examples/ros_common_msgs/CMakeLists.txt new file mode 100644 index 000000000..8439cfd1f --- /dev/null +++ b/examples/ros_common_msgs/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_common_msgs) + +# DOCUMENTATION_START { + +hunter_add_package(ros_common_msgs) +find_package(catkin CONFIG REQUIRED + COMPONENTS std_msgs actionlib_msgs geometry_msgs diagnostic_msgs nav_msgs + sensor_msgs shape_msgs stereo_msgs trajectory_msgs visualization_msgs) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) + +# DOCUMENTATION_END } diff --git a/examples/ros_common_msgs/main.cpp b/examples/ros_common_msgs/main.cpp new file mode 100644 index 000000000..ee22b1e6f --- /dev/null +++ b/examples/ros_common_msgs/main.cpp @@ -0,0 +1,5 @@ +#include +#include + +int main() { +} diff --git a/examples/ros_common_msgs/package.xml b/examples/ros_common_msgs/package.xml new file mode 100644 index 000000000..ab0b576c9 --- /dev/null +++ b/examples/ros_common_msgs/package.xml @@ -0,0 +1,11 @@ + + download_ros_common_msgs + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_console_bridge/CMakeLists.txt b/examples/ros_console_bridge/CMakeLists.txt new file mode 100644 index 000000000..6f077f9c3 --- /dev/null +++ b/examples/ros_console_bridge/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-ros_console_bridge) + +# DOCUMENTATION_START { +hunter_add_package(ros_console_bridge) +find_package(console_bridge CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC ros::console_bridge) +# DOCUMENTATION_END } diff --git a/examples/ros_console_bridge/boo.cpp b/examples/ros_console_bridge/boo.cpp new file mode 100644 index 000000000..a0f3f00e5 --- /dev/null +++ b/examples/ros_console_bridge/boo.cpp @@ -0,0 +1,8 @@ +#include +#include + +int main() { + console_bridge::setLogLevel(console_bridge::CONSOLE_BRIDGE_LOG_INFO); + int level = console_bridge::getLogLevel(); + std::cout << level; +} diff --git a/examples/ros_environment/CMakeLists.txt b/examples/ros_environment/CMakeLists.txt new file mode 100644 index 000000000..d376a8e38 --- /dev/null +++ b/examples/ros_environment/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_environment) + +# DOCUMENTATION_START { +hunter_add_package(ros_environment) +find_package(catkin CONFIG REQUIRED COMPONENTS ros_environment) + +catkin_package() +# DOCUMENTATION_END } diff --git a/examples/ros_environment/package.xml b/examples/ros_environment/package.xml new file mode 100644 index 000000000..b7600be95 --- /dev/null +++ b/examples/ros_environment/package.xml @@ -0,0 +1,11 @@ + + download_ros_environment + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_gencpp/CMakeLists.txt b/examples/ros_gencpp/CMakeLists.txt new file mode 100644 index 000000000..713f392f8 --- /dev/null +++ b/examples/ros_gencpp/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_gencpp) + +# DOCUMENTATION_START { +hunter_add_package(ros_gencpp) +find_package(catkin CONFIG REQUIRED COMPONENTS gencpp) + +add_message_files(FILES dummy.msg) +generate_messages() + +catkin_package() +# DOCUMENTATION_END } diff --git a/examples/ros_gencpp/msg/dummy.msg b/examples/ros_gencpp/msg/dummy.msg new file mode 100644 index 000000000..a5e08b524 --- /dev/null +++ b/examples/ros_gencpp/msg/dummy.msg @@ -0,0 +1 @@ +uint32 field diff --git a/examples/ros_gencpp/package.xml b/examples/ros_gencpp/package.xml new file mode 100644 index 000000000..8bdbe66c9 --- /dev/null +++ b/examples/ros_gencpp/package.xml @@ -0,0 +1,11 @@ + + download_ros_gencpp + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_geneus/CMakeLists.txt b/examples/ros_geneus/CMakeLists.txt new file mode 100644 index 000000000..6bca71b05 --- /dev/null +++ b/examples/ros_geneus/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_geneus) + +# DOCUMENTATION_START { +hunter_add_package(ros_geneus) +find_package(catkin CONFIG REQUIRED COMPONENTS geneus) + +add_message_files(FILES dummy.msg) +generate_messages() + +catkin_package() + +# DOCUMENTATION_END } diff --git a/examples/ros_geneus/msg/dummy.msg b/examples/ros_geneus/msg/dummy.msg new file mode 100644 index 000000000..a5e08b524 --- /dev/null +++ b/examples/ros_geneus/msg/dummy.msg @@ -0,0 +1 @@ +uint32 field diff --git a/examples/ros_geneus/package.xml b/examples/ros_geneus/package.xml new file mode 100644 index 000000000..2ca4db7b3 --- /dev/null +++ b/examples/ros_geneus/package.xml @@ -0,0 +1,11 @@ + + download_ros_geneus + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_genlisp/CMakeLists.txt b/examples/ros_genlisp/CMakeLists.txt new file mode 100644 index 000000000..7de506cd9 --- /dev/null +++ b/examples/ros_genlisp/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_genlisp) + +# DOCUMENTATION_START { +hunter_add_package(ros_genlisp) +find_package(catkin CONFIG REQUIRED COMPONENTS genlisp) + +add_message_files(FILES dummy.msg) +generate_messages() + +catkin_package() +# DOCUMENTATION_END } diff --git a/examples/ros_genlisp/msg/dummy.msg b/examples/ros_genlisp/msg/dummy.msg new file mode 100644 index 000000000..a5e08b524 --- /dev/null +++ b/examples/ros_genlisp/msg/dummy.msg @@ -0,0 +1 @@ +uint32 field diff --git a/examples/ros_genlisp/package.xml b/examples/ros_genlisp/package.xml new file mode 100644 index 000000000..50627cd53 --- /dev/null +++ b/examples/ros_genlisp/package.xml @@ -0,0 +1,11 @@ + + download_ros_genlisp + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_genmsg/CMakeLists.txt b/examples/ros_genmsg/CMakeLists.txt new file mode 100644 index 000000000..9cdea58e9 --- /dev/null +++ b/examples/ros_genmsg/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_genmsg) + +# DOCUMENTATION_START { +hunter_add_package(ros_genmsg) +find_package(catkin CONFIG REQUIRED COMPONENTS genmsg) + +add_message_files(FILES dummy.msg) +generate_messages() + +catkin_package() +# DOCUMENTATION_END } diff --git a/examples/ros_genmsg/msg/dummy.msg b/examples/ros_genmsg/msg/dummy.msg new file mode 100644 index 000000000..e69de29bb diff --git a/examples/ros_genmsg/package.xml b/examples/ros_genmsg/package.xml new file mode 100644 index 000000000..45614252e --- /dev/null +++ b/examples/ros_genmsg/package.xml @@ -0,0 +1,11 @@ + + download_ros_genmsg + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_gennodejs/CMakeLists.txt b/examples/ros_gennodejs/CMakeLists.txt new file mode 100644 index 000000000..e7bede1e3 --- /dev/null +++ b/examples/ros_gennodejs/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_gennodejs) + +# DOCUMENTATION_START { +hunter_add_package(ros_gennodejs) +find_package(catkin CONFIG REQUIRED COMPONENTS gennodejs) + +add_message_files(FILES dummy.msg) +generate_messages() + +catkin_package() +# DOCUMENTATION_END } diff --git a/examples/ros_gennodejs/msg/dummy.msg b/examples/ros_gennodejs/msg/dummy.msg new file mode 100644 index 000000000..a5e08b524 --- /dev/null +++ b/examples/ros_gennodejs/msg/dummy.msg @@ -0,0 +1 @@ +uint32 field diff --git a/examples/ros_gennodejs/package.xml b/examples/ros_gennodejs/package.xml new file mode 100644 index 000000000..ad6e53c51 --- /dev/null +++ b/examples/ros_gennodejs/package.xml @@ -0,0 +1,11 @@ + + download_ros_gennodejs + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_genpy/CMakeLists.txt b/examples/ros_genpy/CMakeLists.txt new file mode 100644 index 000000000..7f2a0acb5 --- /dev/null +++ b/examples/ros_genpy/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_genpy) + +# DOCUMENTATION_START { +hunter_add_package(ros_genpy) +find_package(catkin CONFIG REQUIRED COMPONENTS genpy) + +add_message_files(FILES dummy.msg) +generate_messages() + +catkin_package() +# DOCUMENTATION_END } diff --git a/examples/ros_genpy/msg/dummy.msg b/examples/ros_genpy/msg/dummy.msg new file mode 100644 index 000000000..a5e08b524 --- /dev/null +++ b/examples/ros_genpy/msg/dummy.msg @@ -0,0 +1 @@ +uint32 field diff --git a/examples/ros_genpy/package.xml b/examples/ros_genpy/package.xml new file mode 100644 index 000000000..5c5c8ed9a --- /dev/null +++ b/examples/ros_genpy/package.xml @@ -0,0 +1,11 @@ + + download_ros_genpy + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_message_generation/CMakeLists.txt b/examples/ros_message_generation/CMakeLists.txt new file mode 100644 index 000000000..c4778f4dc --- /dev/null +++ b/examples/ros_message_generation/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_message_generation) + +# DOCUMENTATION_START { +hunter_add_package(ros_message_generation) +find_package(catkin CONFIG REQUIRED COMPONENTS message_generation) + +add_message_files(FILES dummy.msg) +generate_messages() + +catkin_package() +# DOCUMENTATION_END } diff --git a/examples/ros_message_generation/msg/dummy.msg b/examples/ros_message_generation/msg/dummy.msg new file mode 100644 index 000000000..a5e08b524 --- /dev/null +++ b/examples/ros_message_generation/msg/dummy.msg @@ -0,0 +1 @@ +uint32 field diff --git a/examples/ros_message_generation/package.xml b/examples/ros_message_generation/package.xml new file mode 100644 index 000000000..864e60ff2 --- /dev/null +++ b/examples/ros_message_generation/package.xml @@ -0,0 +1,11 @@ + + download_ros_message_generation + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_message_runtime/CMakeLists.txt b/examples/ros_message_runtime/CMakeLists.txt new file mode 100644 index 000000000..6badbb329 --- /dev/null +++ b/examples/ros_message_runtime/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_message_runtime) + +# DOCUMENTATION_START { +hunter_add_package(ros_message_runtime) +find_package(catkin CONFIG REQUIRED COMPONENTS message_runtime) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ros::rostime) +# DOCUMENTATION_END } diff --git a/examples/ros_message_runtime/main.cpp b/examples/ros_message_runtime/main.cpp new file mode 100644 index 000000000..f9a71ed5f --- /dev/null +++ b/examples/ros_message_runtime/main.cpp @@ -0,0 +1,10 @@ +#include +#include +#include + +int main() { + ros::Time::init(); + ros::Duration(3).sleep(); + std::cout << "Done" << std::endl; + return 0; +} diff --git a/examples/ros_message_runtime/package.xml b/examples/ros_message_runtime/package.xml new file mode 100644 index 000000000..0cf8dd114 --- /dev/null +++ b/examples/ros_message_runtime/package.xml @@ -0,0 +1,11 @@ + + download_ros_message_runtime + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/ros_std_msgs/CMakeLists.txt b/examples/ros_std_msgs/CMakeLists.txt new file mode 100644 index 000000000..965186ce9 --- /dev/null +++ b/examples/ros_std_msgs/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_ros_std_msgs) + +# DOCUMENTATION_START { +hunter_add_package(ros_std_msgs) +find_package(catkin CONFIG REQUIRED COMPONENTS std_msgs) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/ros_std_msgs/main.cpp b/examples/ros_std_msgs/main.cpp new file mode 100644 index 000000000..c5b576aa9 --- /dev/null +++ b/examples/ros_std_msgs/main.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/ros_std_msgs/package.xml b/examples/ros_std_msgs/package.xml new file mode 100644 index 000000000..308ce12d3 --- /dev/null +++ b/examples/ros_std_msgs/package.xml @@ -0,0 +1,11 @@ + + download_ros_std_msgs + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/rosconsole/CMakeLists.txt b/examples/rosconsole/CMakeLists.txt new file mode 100644 index 000000000..ebbdcb987 --- /dev/null +++ b/examples/rosconsole/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-rosconsole) + +# DOCUMENTATION_START { +hunter_add_package(rosconsole) +find_package(catkin CONFIG REQUIRED COMPONENTS rosconsole) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/rosconsole/main.cpp b/examples/rosconsole/main.cpp new file mode 100644 index 000000000..bfc86f72e --- /dev/null +++ b/examples/rosconsole/main.cpp @@ -0,0 +1,4 @@ +#include "ros/console.h" + +int main() { +} diff --git a/examples/rosconsole/package.xml b/examples/rosconsole/package.xml new file mode 100644 index 000000000..863b3b4f8 --- /dev/null +++ b/examples/rosconsole/package.xml @@ -0,0 +1,12 @@ + + download-rosconsole + 0.0.0 + + This package provides foo capability. + + Krasimir Georgiev + BSD + + catkin + + diff --git a/examples/roscpp_core/CMakeLists.txt b/examples/roscpp_core/CMakeLists.txt new file mode 100644 index 000000000..4087b937b --- /dev/null +++ b/examples/roscpp_core/CMakeLists.txt @@ -0,0 +1,22 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_roscpp_core) + +# DOCUMENTATION_START { + +hunter_add_package(roscpp_core) +find_package(catkin CONFIG REQUIRED COMPONENTS cpp_common rostime + roscpp_serialization roscpp_traits) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/roscpp_core/main.cpp b/examples/roscpp_core/main.cpp new file mode 100644 index 000000000..f9a71ed5f --- /dev/null +++ b/examples/roscpp_core/main.cpp @@ -0,0 +1,10 @@ +#include +#include +#include + +int main() { + ros::Time::init(); + ros::Duration(3).sleep(); + std::cout << "Done" << std::endl; + return 0; +} diff --git a/examples/roscpp_core/package.xml b/examples/roscpp_core/package.xml new file mode 100644 index 000000000..55dcdbfd3 --- /dev/null +++ b/examples/roscpp_core/package.xml @@ -0,0 +1,11 @@ + + download_roscpp_core + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/rospack/CMakeLists.txt b/examples/rospack/CMakeLists.txt new file mode 100644 index 000000000..750ec1c53 --- /dev/null +++ b/examples/rospack/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_rospack) + +# DOCUMENTATION_START { + +hunter_add_package(rospack) +find_package(catkin CONFIG REQUIRED COMPONENTS rospack) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/rospack/main.cpp b/examples/rospack/main.cpp new file mode 100644 index 000000000..33e2b2ae3 --- /dev/null +++ b/examples/rospack/main.cpp @@ -0,0 +1,8 @@ +#include +#include + +int main() { + rospack::Rospack rp; + std::cout << rp.usage() << std::endl; + return 0; +} diff --git a/examples/rospack/package.xml b/examples/rospack/package.xml new file mode 100644 index 000000000..0425d2938 --- /dev/null +++ b/examples/rospack/package.xml @@ -0,0 +1,11 @@ + + download_rospack + 0.0.0 + + This package provides foo capability. + + Lukas Solanka + BSD + + catkin + diff --git a/examples/s3/CMakeLists.txt b/examples/s3/CMakeLists.txt new file mode 100644 index 000000000..fbb5b2bc2 --- /dev/null +++ b/examples/s3/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-s3) + +# DOCUMENTATION_START { +hunter_add_package(s3) +find_package(s3 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC s3::s3) +# DOCUMENTATION_END } diff --git a/examples/s3/boo.cpp b/examples/s3/boo.cpp new file mode 100644 index 000000000..1c6dfcba4 --- /dev/null +++ b/examples/s3/boo.cpp @@ -0,0 +1,9 @@ +#include + +int main() { + const char *userAgentInfo = ""; + int flags = 0; + const char *defaultS3HostName = ""; + + S3Status result = S3_initialize(userAgentInfo, flags, defaultS3HostName); +} diff --git a/examples/sds/CMakeLists.txt b/examples/sds/CMakeLists.txt new file mode 100644 index 000000000..a29405a41 --- /dev/null +++ b/examples/sds/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-sds) + +hunter_add_package(sds) + +find_package(sds CONFIG REQUIRED) + +add_executable(main main.c) +target_link_libraries(main sds::sds) diff --git a/examples/sds/main.c b/examples/sds/main.c new file mode 100644 index 000000000..5183c178e --- /dev/null +++ b/examples/sds/main.c @@ -0,0 +1,10 @@ +#include +#include + +int main() +{ + sds my_string = sdsnew("Hello World!"); + printf("%s\n", my_string); + sdsfree(my_string); + return 0; +} diff --git a/examples/sentencepiece/CMakeLists.txt b/examples/sentencepiece/CMakeLists.txt new file mode 100644 index 000000000..671fa83bd --- /dev/null +++ b/examples/sentencepiece/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-sentencepiece) + +# DOCUMENTATION_START { +hunter_add_package(sentencepiece) +find_package(sentencepiece CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC sentencepiece::sentencepiece) +# DOCUMENTATION_END } diff --git a/examples/sentencepiece/boo.cpp b/examples/sentencepiece/boo.cpp new file mode 100644 index 000000000..745d5e48f --- /dev/null +++ b/examples/sentencepiece/boo.cpp @@ -0,0 +1,15 @@ +// https://github.com/google/sentencepiece/blob/master/doc/api.md#load-sentencepiece-model + +#include +#include + +int main() +{ + sentencepiece::SentencePieceProcessor processor; + const auto status = processor.Load("//path/to/model.model"); + if (!status.ok()) + { + std::cerr << status.ToString() << std::endl; + // error + } +} diff --git a/examples/shaka_player_embedded/CMakeLists.txt b/examples/shaka_player_embedded/CMakeLists.txt new file mode 100644 index 000000000..fb1c78015 --- /dev/null +++ b/examples/shaka_player_embedded/CMakeLists.txt @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-shaka_player_embedded) + +if(IOS) + # We need Obj-C + set(sources boo.mm) +else() + set(sources boo.cpp) +endif() + +# DOCUMENTATION_START { +hunter_add_package(shaka_player_embedded) +find_package(shaka_player_embedded CONFIG REQUIRED) + +add_executable(boo ${sources}) +target_link_libraries(boo PUBLIC shaka_player_embedded::shaka_player_embedded) +# DOCUMENTATION_END } + +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + # Workaround for GNU linker cyclic dependencies + target_link_libraries( + boo + PUBLIC + "-Wl,--start-group" + v8::v8_base + v8::v8_init + v8::v8_initializers + v8::v8_libbase + v8::v8_libplatform + v8::v8_libsampler + v8::v8_nosnapshot + "-Wl,--end-group" + ) +endif() + +target_compile_definitions(boo PRIVATE OS_POSIX) + +hunter_add_package(gflags) +find_package(gflags CONFIG REQUIRED) +target_link_libraries(boo PRIVATE gflags) diff --git a/examples/shaka_player_embedded/boo.cpp b/examples/shaka_player_embedded/boo.cpp new file mode 100644 index 000000000..a8156cdf3 --- /dev/null +++ b/examples/shaka_player_embedded/boo.cpp @@ -0,0 +1,229 @@ +// Copyright 2016 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include +#include +#include +#include +#include + +#ifdef OS_POSIX +# include +#endif + +#ifdef USING_V8 +# include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include + +using shaka::JsManager; +using shaka::Player; +using shaka::SdlFrameDrawer; +using shaka::Video; + +#ifndef SHAKA_SDL_UTILS +# error "This demo requires SDL utils" +#endif + +namespace { + +#ifndef OS_IOS +std::string DirName(const char* arg0) { +# ifdef OS_POSIX + std::string copy = arg0; + return dirname(©[0]); +# else +# error "Not implemented for Windows" +# endif +} +#endif // !OS_IOS + + +DEFINE_bool(muted, false, "Don't play any audio"); +#ifdef USING_V8 +DEFINE_string(v8_flags, "", "Pass the given flags to V8."); +#endif + + +class DemoApp : shaka::Player::Client { + public: + DemoApp(const char* exe_name) + : window_(nullptr), + renderer_(nullptr), + js_engine_(GetOptions(exe_name)), + video_(&js_engine_), + player_(&js_engine_) {} + + ~DemoApp() override { + // The destructors will automatically shut everything down. + } + + bool Run() { + if (!SetupWindow()) + return false; + if (!InitializePlayer(FLAGS_muted)) + return false; + if (!LoadAsset()) + return false; + + MainLoop(); + return true; + } + + private: + JsManager::StartupOptions GetOptions(const char* exe_name) { + JsManager::StartupOptions opts; +#ifdef OS_IOS + opts.dynamic_data_dir = std::string(getenv("HOME")) + "/Library"; + opts.static_data_dir = "./Frameworks/ShakaPlayerEmbedded.framework"; + opts.is_static_relative_to_bundle = true; +#else + opts.static_data_dir = opts.dynamic_data_dir = DirName(exe_name); +#endif + return opts; + } + + bool SetupWindow() { + const int width = 640; + const int height = 480; + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) { + LOG(ERROR) << "Error initializing SDL: " << SDL_GetError(); + return false; + } + + window_ = + SDL_CreateWindow("Shaka Player Embedded Demo", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, width, height, + SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL); + if (!window_) { + LOG(ERROR) << "Error creating window: " << SDL_GetError(); + return false; + } + renderer_ = SDL_CreateRenderer(window_, -1, 0); + if (!renderer_) { + LOG(ERROR) << "Error getting renderer: " << SDL_GetError(); + return false; + } + drawer_.SetRenderer(renderer_); + + return true; + } + + bool InitializePlayer(bool is_muted) { + video_.Initialize(); + if (is_muted) + video_.SetMuted(true); + + const auto init_results = player_.Initialize(&video_, this); + if (init_results.has_error()) { + LOG(ERROR) << "Error in initialize: " << init_results.error(); + return false; + } + + return true; + } + + bool LoadAsset() { + const std::string uri = + "//storage.googleapis.com/shaka-demo-assets/sintel-mp4-only/dash.mpd"; + auto results = player_.Load(uri); + if (results.has_error()) { + LOG(ERROR) << "Error in load: " << results.error(); + return false; + } + + video_.Play(); + return true; + } + + void MainLoop() { + while (true) { + SDL_Event ev; + if (SDL_PollEvent(&ev) && ev.type == SDL_QUIT) + break; + + SDL_RenderClear(renderer_); + + double delay = 1.0 / 60; + auto frame = video_.DrawFrame(&delay); + SDL_Texture* texture = drawer_.Draw(&frame); + if (texture) { + const int video_width = frame.width(); + const int video_height = frame.height(); + + int win_width, win_height; + SDL_GetWindowSize(window_, &win_width, &win_height); + shaka::ShakaRect rect = shaka::FitVideoToWindow( + video_width, video_height, win_width, win_height); + SDL_Rect sdl_rect = { + .x = rect.x, .y = rect.y, .w = rect.w, .h = rect.h}; + SDL_RenderCopy(renderer_, texture, nullptr, &sdl_rect); + } + SDL_RenderPresent(renderer_); + + SDL_Delay(delay * 1000); + } + } + + ////////////////////////////////////////////////////////////////////////////// + // shaka::Player::Client implementation + + void OnError(const shaka::Error& err) override { + // This is called from a background thread. + LOG(ERROR) << "Error from Player:" << err; + } + + void OnBuffering(bool buffering) override { + // This is called from a background thread. + LOG(INFO) << "Buffering status change from Player:" << buffering; + } + ////////////////////////////////////////////////////////////////////////////// + + SDL_Window* window_; + SDL_Renderer* renderer_; + + JsManager js_engine_; + Video video_; + Player player_; + SdlFrameDrawer drawer_; +}; + +} // namespace + + +int main(int argc, char** argv) { + // Init flags and logging. + FLAGS_alsologtostderr = true; + gflags::ParseCommandLineFlags(&argc, &argv, true); + google::InitGoogleLogging(argv[0]); + +#ifdef USING_V8 + v8::V8::SetFlagsFromString(FLAGS_v8_flags.c_str(), FLAGS_v8_flags.length()); +#endif + + DemoApp demo(argv[0]); + return demo.Run() ? 0 : 1; +} diff --git a/examples/shaka_player_embedded/boo.mm b/examples/shaka_player_embedded/boo.mm new file mode 100644 index 000000000..bca766031 --- /dev/null +++ b/examples/shaka_player_embedded/boo.mm @@ -0,0 +1 @@ +#include "boo.cpp" diff --git a/examples/shaka_player_embedded/config.cmake b/examples/shaka_player_embedded/config.cmake new file mode 100644 index 000000000..4808f91d4 --- /dev/null +++ b/examples/shaka_player_embedded/config.cmake @@ -0,0 +1,21 @@ +# DOCUMENTATION_START { +hunter_config( + CURL + VERSION ${HUNTER_CURL_VERSION} + CMAKE_ARGS CMAKE_USE_BORINGSSL=ON +) + +hunter_config( + v8 + VERSION 3.29.86-90da229-p0 +) +# DOCUMENTATION_END } + +if(IOS) + # Test only compile/link, not real layout + hunter_config( + shaka_player_embedded + VERSION ${HUNTER_shaka_player_embedded_VERSION} + CMAKE_ARGS SHAKA_PLAYER_EMBEDDED_IOS_FRAMEWORK=OFF + ) +endif() diff --git a/examples/sleef/CMakeLists.txt b/examples/sleef/CMakeLists.txt new file mode 100644 index 000000000..94b0408ec --- /dev/null +++ b/examples/sleef/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.2) + +include("../common.cmake") + +project(download-sleef) + +# DOCUMENTATION_START { +hunter_add_package(sleef) +find_package(sleef CONFIG REQUIRED) +add_executable(main main.c) +target_link_libraries(main sleef::sleef) +# DOCUMENTATION_END } diff --git a/examples/sleef/main.c b/examples/sleef/main.c new file mode 100644 index 000000000..02f72fb0d --- /dev/null +++ b/examples/sleef/main.c @@ -0,0 +1,8 @@ +#include +#include + +int main() { + double lu35 = Sleef_log_u35(35.0); + + return 0; +} diff --git a/examples/soil/CMakeLists.txt b/examples/soil/CMakeLists.txt new file mode 100644 index 000000000..817c255f3 --- /dev/null +++ b/examples/soil/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.2) + +include("../common.cmake") + +project(download-soil) + +# DOCUMENTATION_START { +hunter_add_package(soil) +find_package(soil CONFIG REQUIRED) +add_executable(main main.c) +target_link_libraries(main soil::soil) +# DOCUMENTATION_END } diff --git a/examples/soil/main.c b/examples/soil/main.c new file mode 100644 index 000000000..ea687aa8b --- /dev/null +++ b/examples/soil/main.c @@ -0,0 +1,29 @@ +#include +#include + +const unsigned char image[] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x08, 0x06, 0x00, 0x00, 0x00, 0x8D, 0x6F, 0x26, + 0xE5, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4B, 0x47, 0x44, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xA0, + 0xBD, 0xA7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, + 0x00, 0x2E, 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, + 0x07, 0xE2, 0x0C, 0x1A, 0x13, 0x27, 0x38, 0x81, 0xAB, 0x5D, 0x01, 0x00, 0x00, 0x00, 0x2C, 0x49, + 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xE0, 0xCD, 0x62, 0xB8, 0xCD, 0xC0, 0xC0, 0xC0, 0x80, 0x44, + 0xEF, 0x62, 0x82, 0x31, 0x18, 0x90, 0x00, 0x13, 0x03, 0x03, 0x03, 0xC3, 0xE7, 0x69, 0x0C, 0x6E, + 0x0C, 0x84, 0x00, 0x23, 0x5B, 0xDF, 0xD1, 0xDB, 0xE8, 0x82, 0x00, 0x54, 0x88, 0x09, 0x0F, 0x5F, + 0x6F, 0x81, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; + +int main() { + int w, h; + unsigned char* data = SOIL_load_image_from_memory(image, sizeof(image)/sizeof(image[0]), &w, &h, 0, SOIL_LOAD_RGBA); + + if(data == NULL){ + printf("error\n"); + return 1; + } + + SOIL_free_image_data(data); + printf("ok\n"); + return 0; +} diff --git a/examples/sources_for_android_sdk_packer/CMakeLists.txt b/examples/sources_for_android_sdk_packer/CMakeLists.txt new file mode 100644 index 000000000..4904b1121 --- /dev/null +++ b/examples/sources_for_android_sdk_packer/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-sources_for_android_sdk_packer) + +# DOCUMENTATION_START { +hunter_add_package(sources_for_android_sdk_packer) +# DOCUMENTATION_END } diff --git a/examples/spirv-cross/CMakeLists.txt b/examples/spirv-cross/CMakeLists.txt new file mode 100644 index 000000000..8388fca2e --- /dev/null +++ b/examples/spirv-cross/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-spirv-cross) + +# DOCUMENTATION_START { +hunter_add_package(spirv-cross) +find_package(spirv_cross_core CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC spirv-cross-core) +# DOCUMENTATION_END } diff --git a/examples/spirv-cross/boo.cpp b/examples/spirv-cross/boo.cpp new file mode 100644 index 000000000..896b9f2b8 --- /dev/null +++ b/examples/spirv-cross/boo.cpp @@ -0,0 +1,4 @@ +#include "spirv_cross.hpp" + +int main() { +} diff --git a/examples/sqlite3/CMakeLists.txt b/examples/sqlite3/CMakeLists.txt new file mode 100644 index 000000000..e6338530b --- /dev/null +++ b/examples/sqlite3/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-sqlite3) + +# DOCUMENTATION_START { +hunter_add_package(sqlite3) +find_package(sqlite3 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC sqlite3::sqlite3) +# DOCUMENTATION_END } diff --git a/examples/sqlite3/boo.cpp b/examples/sqlite3/boo.cpp new file mode 100644 index 000000000..cb3dcb01c --- /dev/null +++ b/examples/sqlite3/boo.cpp @@ -0,0 +1,9 @@ +#include + +int main() { + const char* db_name = "db_name"; + + sqlite3* db; + sqlite3_open(db_name, &db); + sqlite3_close(db); +} diff --git a/examples/sse2neon/CMakeLists.txt b/examples/sse2neon/CMakeLists.txt new file mode 100644 index 000000000..f23572cc8 --- /dev/null +++ b/examples/sse2neon/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-sse2neon) +hunter_add_package(sse2neon) +find_package(sse2neon CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo sse2neon::sse2neon) diff --git a/examples/sse2neon/foo.cpp b/examples/sse2neon/foo.cpp new file mode 100644 index 000000000..bc63f4240 --- /dev/null +++ b/examples/sse2neon/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/stanhull/CMakeLists.txt b/examples/stanhull/CMakeLists.txt new file mode 100644 index 000000000..e9da625be --- /dev/null +++ b/examples/stanhull/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-stanhull) + +hunter_add_package(stanhull) +find_package(stanhull CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC stanhull::stanhull) diff --git a/examples/stanhull/boo.cpp b/examples/stanhull/boo.cpp new file mode 100644 index 000000000..0d79b3385 --- /dev/null +++ b/examples/stanhull/boo.cpp @@ -0,0 +1,15 @@ +#include + +int main() { + StanHull::HullLibrary library; + + StanHull::HullResult x; + StanHull::HullError hull_error = library.ReleaseResult(x); + + if (hull_error == StanHull::QE_OK) { + return 0; + } + else { + return 1; + } +} diff --git a/examples/state_machine/CMakeLists.txt b/examples/state_machine/CMakeLists.txt new file mode 100644 index 000000000..603822b80 --- /dev/null +++ b/examples/state_machine/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-state_machine) + +hunter_add_package(state_machine) +find_package(state_machine CONFIG REQUIRED) + +add_executable(sm foo.cpp) +target_link_libraries(sm state_machine) diff --git a/examples/state_machine/foo.cpp b/examples/state_machine/foo.cpp new file mode 100644 index 000000000..8e3fe881a --- /dev/null +++ b/examples/state_machine/foo.cpp @@ -0,0 +1,30 @@ +#include +#include + +struct Foo: public State +{ + void update(float dt) override + { + std::cout << "(updated)" << std::endl; + } + + void draw(float dt) override + { + std::cout << "(drawed)" << std::endl; + } +}; + +int main() +{ + StateMachine machine; + + machine.push_state(); + + machine.update(0.0f); + + machine.pop_state(); + + machine.update(0.0f); + + return 0; +} diff --git a/examples/stb/CMakeLists.txt b/examples/stb/CMakeLists.txt new file mode 100644 index 000000000..a87f91787 --- /dev/null +++ b/examples/stb/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-stb) + +hunter_add_package(stb) +find_package(stb CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC stb::stb) diff --git a/examples/stb/boo.cpp b/examples/stb/boo.cpp new file mode 100644 index 000000000..b46a113d7 --- /dev/null +++ b/examples/stb/boo.cpp @@ -0,0 +1,7 @@ +#include +#include +#include +#include + +int main() { +} diff --git a/examples/stdext-path/CMakeLists.txt b/examples/stdext-path/CMakeLists.txt new file mode 100644 index 000000000..a2049a682 --- /dev/null +++ b/examples/stdext-path/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-stdext-path) + +# DOCUMENTATION_START { +hunter_add_package(stdext-path) +find_package(stdext-path CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC stdext-path::stdext-path) +# DOCUMENTATION_END } diff --git a/examples/stdext-path/boo.cpp b/examples/stdext-path/boo.cpp new file mode 100644 index 000000000..3de163228 --- /dev/null +++ b/examples/stdext-path/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/stormlib/CMakeLists.txt b/examples/stormlib/CMakeLists.txt new file mode 100644 index 000000000..7a6bc7f5a --- /dev/null +++ b/examples/stormlib/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(example-stormlib) + +hunter_add_package(stormlib) + +find_package(stormlib CONFIG REQUIRED) + +add_executable(example-stormlib main.cpp) +target_link_libraries(example-stormlib stormlib::stormlib) diff --git a/examples/stormlib/main.cpp b/examples/stormlib/main.cpp new file mode 100644 index 000000000..de49f7706 --- /dev/null +++ b/examples/stormlib/main.cpp @@ -0,0 +1,65 @@ +#include +#include + +int ExtractFile(char * szArchiveName, char * szArchivedFile, char * szFileName) +{ + HANDLE hMpq = NULL; // Open archive handle + HANDLE hFile = NULL; // Archived file handle + FILE* handle = NULL; // Disk file handle + int nError = ERROR_SUCCESS; // Result value + + // Open an archive, e.g. "d2music.mpq" + if(nError == ERROR_SUCCESS) + { + if(!SFileOpenArchive(szArchiveName, 0, STREAM_FLAG_READ_ONLY, &hMpq)) + nError = GetLastError(); + } + + // Open a file in the archive, e.g. "data\global\music\Act1\tristram.wav" + if(nError == ERROR_SUCCESS) + { + if (!SFileOpenFileEx(hMpq, szArchivedFile, 0, &hFile)) + nError = GetLastError(); + } + + // Create the target file + if(nError == ERROR_SUCCESS) + { + handle = fopen(szFileName, "wb"); + if (!handle) + nError = -1; + } + + // Read the file from the archive + if(nError == ERROR_SUCCESS) + { + char szBuffer[0x10000]; + DWORD dwBytes = 1; + + while(dwBytes > 0) + { + SFileReadFile(hFile, szBuffer, sizeof(szBuffer), &dwBytes, NULL); + if (dwBytes > 0) + fwrite(szBuffer, 1, dwBytes, handle); + } + } + + // Cleanup and exit + if (handle != NULL) + fclose(handle); + if(hFile != NULL) + SFileCloseFile(hFile); + if(hMpq != NULL) + SFileCloseArchive(hMpq); + + return nError; +} + +int main(int argc, char** argv) +{ + if (argc != 4) + return -1; + + int err = ExtractFile(argv[1], argv[2], argv[3]); + return err; +} diff --git a/examples/sugar/CMakeLists.txt b/examples/sugar/CMakeLists.txt new file mode 100644 index 000000000..8d928232a --- /dev/null +++ b/examples/sugar/CMakeLists.txt @@ -0,0 +1,30 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-sugar) + +# DOCUMENTATION_START { +hunter_add_package(sugar) +find_package(sugar CONFIG REQUIRED) + +sugar_include(boo) +# DOCUMENTATION_END } + +message("BOO_SOURCES: ${BOO_SOURCES}") + +include(sugar_status_print) + +option(SUGAR_STATUS_PRINT "Print info" ON) +sugar_status_print("sugar downloaded!") + +if(NOT EXISTS "${sugar_LICENSES}") + message(FATAL_ERROR "File not found: '${sugar_LICENSES}'") +endif() + +message("License: '${sugar_LICENSES}'") diff --git a/examples/sugar/boo/boo.cpp b/examples/sugar/boo/boo.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/examples/sugar/boo/sugar.cmake b/examples/sugar/boo/sugar.cmake new file mode 100644 index 000000000..c3ec7ef41 --- /dev/null +++ b/examples/sugar/boo/sugar.cmake @@ -0,0 +1,4 @@ +sugar_files( + BOO_SOURCES + boo.cpp +) diff --git a/examples/tacopie/CMakeLists.txt b/examples/tacopie/CMakeLists.txt new file mode 100644 index 000000000..0712b019b --- /dev/null +++ b/examples/tacopie/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-tacopie) + +# download tacopie +hunter_add_package(tacopie) + +# now tacopie can be used +find_package(tacopie CONFIG REQUIRED) + +add_executable(foo foo.cpp) +set_property(TARGET foo PROPERTY CXX_STANDARD 11) + +target_link_libraries(foo tacopie::tacopie) diff --git a/examples/tacopie/foo.cpp b/examples/tacopie/foo.cpp new file mode 100644 index 000000000..acb881cac --- /dev/null +++ b/examples/tacopie/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/taocpp-json/CMakeLists.txt b/examples/taocpp-json/CMakeLists.txt new file mode 100644 index 000000000..71af1138b --- /dev/null +++ b/examples/taocpp-json/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(taocpp-json) + +# DOCUMENTATION_START { +hunter_add_package(taocpp-json) +find_package(taocpp-json REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC taocpp::json) +# DOCUMENTATION_END } diff --git a/examples/taocpp-json/boo.cpp b/examples/taocpp-json/boo.cpp new file mode 100644 index 000000000..f0999a783 --- /dev/null +++ b/examples/taocpp-json/boo.cpp @@ -0,0 +1,56 @@ +// Copyright (c) 2018-2019 Dr. Colin Hirsch and Daniel Frey +// Please see LICENSE for license or visit https://github.com/taocpp/json/ + +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace tao::json +{ + template< typename Consumer, std::uint64_t Min, std::uint64_t Max > + struct validate_integer + : public Consumer + { + static_assert( Max >= Min ); + static_assert( Max <= std::uint64_t( ( std::numeric_limits< std::int64_t >::max )() ), "Max may not be larger than 2^63-1" ); + + using Consumer::Consumer; + + void number( const std::int64_t v ) + { + if( ( v < std::int64_t( Min ) ) || ( v > std::int64_t( Max ) ) ) { + throw std::runtime_error( "integer range violated: " + std::to_string( v ) ); // NOLINT + } + Consumer::number( v ); + } + + void number( const std::uint64_t v ) + { + if( ( v < Min ) || ( v > Max ) ) { + throw std::runtime_error( "unsigned range violated: " + std::to_string( v ) ); // NOLINT + } + Consumer::number( v ); + } + + void number( const double v ) noexcept( noexcept( std::declval< Consumer >().number( v ) ) ) + { + Consumer::number( v ); + } + }; + +} // namespace tao::json + +int main( int /*unused*/, char** /*unused*/ ) +{ + tao::json::value v = { { "a", 20 }, { "b", 30 } }; + tao::json::validate_integer< tao::json::events::discard, 10, 40 > consumer; + tao::json::events::from_value( consumer, v ); + return 0; +} \ No newline at end of file diff --git a/examples/tcl/CMakeLists.txt b/examples/tcl/CMakeLists.txt new file mode 100644 index 000000000..4085646d6 --- /dev/null +++ b/examples/tcl/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(test_tcl) + +# DOCUMENTATION_START { +hunter_add_package(tcl) +find_package(tcl REQUIRED) + +add_executable(tcl_test tcl_test.c) +target_link_libraries(tcl_test PUBLIC tcl::tcl) +# DOCUMENTATION_END } diff --git a/examples/tcl/tcl_test.c b/examples/tcl/tcl_test.c new file mode 100644 index 000000000..789a5573f --- /dev/null +++ b/examples/tcl/tcl_test.c @@ -0,0 +1,17 @@ +#include +#include + +int main (int argc, char *argv[]) { + + Tcl_Interp *myinterp; + char *action = "set a [expr 5 * 8]; puts $a"; + int status; + + printf ("Your Program will run ... \n"); + + myinterp = Tcl_CreateInterp(); + status = Tcl_Eval(myinterp,action); + + printf ("Your Program has completed\n"); +} + diff --git a/examples/termcolor/CMakeLists.txt b/examples/termcolor/CMakeLists.txt new file mode 100644 index 000000000..a2cb25766 --- /dev/null +++ b/examples/termcolor/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required (VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-termcolor) + +# DOCUMENTATION_START { +hunter_add_package(termcolor) +find_package(termcolor CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main PUBLIC termcolor::termcolor) +# DOCUMENTATION_END } diff --git a/examples/termcolor/main.cpp b/examples/termcolor/main.cpp new file mode 100644 index 000000000..9dd2f7fe9 --- /dev/null +++ b/examples/termcolor/main.cpp @@ -0,0 +1,14 @@ +#include "termcolor/termcolor.hpp" + +#include + +using namespace termcolor; + + +int main(int, char**) +{ + std::cout << blue << on_green << "Blue in Green" << reset << " is the third tune on Miles " + "Davis' 1959 album, Kind of " << blue << "Blue." << reset << std::endl; + + return 0; +} diff --git a/examples/tf/CMakeLists.txt b/examples/tf/CMakeLists.txt new file mode 100644 index 000000000..090f78ae6 --- /dev/null +++ b/examples/tf/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_tf) + +# DOCUMENTATION_START { + +hunter_add_package(tf) +find_package(catkin CONFIG REQUIRED COMPONENTS tf) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/tf/main.cpp b/examples/tf/main.cpp new file mode 100644 index 000000000..c3e0b75a4 --- /dev/null +++ b/examples/tf/main.cpp @@ -0,0 +1,9 @@ +#include +#include "tf/tf.h" + +int main() { + ros::Time::init(); + ros::Duration(3).sleep(); + std::cout << "Done" << std::endl; + return 0; +} diff --git a/examples/tf/package.xml b/examples/tf/package.xml new file mode 100644 index 000000000..70cc3eb64 --- /dev/null +++ b/examples/tf/package.xml @@ -0,0 +1,11 @@ + + download_tf + 0.0.0 + + This package provides foo capability. + + Krasimir Georgiev + BSD + + catkin + diff --git a/examples/tf2/CMakeLists.txt b/examples/tf2/CMakeLists.txt new file mode 100644 index 000000000..5376477f1 --- /dev/null +++ b/examples/tf2/CMakeLists.txt @@ -0,0 +1,22 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_tf2) + +# DOCUMENTATION_START { + +hunter_add_package(tf2) +find_package(catkin CONFIG REQUIRED COMPONENTS tf2_msgs + tf2 tf2_ros tf2_eigen tf2_bullet tf2_sensor_msgs) + +catkin_package() + +add_executable(main main.cpp) +target_link_libraries(main ${catkin_LIBRARIES}) +# DOCUMENTATION_END } diff --git a/examples/tf2/main.cpp b/examples/tf2/main.cpp new file mode 100644 index 000000000..5f80df103 --- /dev/null +++ b/examples/tf2/main.cpp @@ -0,0 +1,14 @@ +#include +#include "tf2_msgs/TFMessage.h" +#include "tf2/transform_storage.h" +#include "tf2_ros/transform_listener.h" +#include "tf2_eigen/tf2_eigen.h" +#include "tf2_bullet/tf2_bullet.h" +#include "tf2_sensor_msgs/tf2_sensor_msgs.h" + +int main() { + ros::Time::init(); + ros::Duration(3).sleep(); + std::cout << "Done" << std::endl; + return 0; +} diff --git a/examples/tf2/package.xml b/examples/tf2/package.xml new file mode 100644 index 000000000..eff070a10 --- /dev/null +++ b/examples/tf2/package.xml @@ -0,0 +1,11 @@ + + download_tf2 + 0.0.0 + + This package provides foo capability. + + Krasimir Georgiev + BSD + + catkin + diff --git a/examples/thrift/CMakeLists.txt b/examples/thrift/CMakeLists.txt new file mode 100644 index 000000000..ed08bd356 --- /dev/null +++ b/examples/thrift/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.1) + +include("../common.cmake") + +project(download-thrift) + +hunter_add_package(thrift) + +find_package(thrift CONFIG REQUIRED) + +add_executable(main main.cpp) +target_link_libraries(main thrift::thrift_static) diff --git a/examples/thrift/main.cpp b/examples/thrift/main.cpp new file mode 100644 index 000000000..9d13730a6 --- /dev/null +++ b/examples/thrift/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() +{ + return 0; +} diff --git a/examples/tinyxml2/CMakeLists.txt b/examples/tinyxml2/CMakeLists.txt new file mode 100644 index 000000000..df5b8f7e2 --- /dev/null +++ b/examples/tinyxml2/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-tinyxml2) + +# DOCUMENTATION_START { +hunter_add_package(tinyxml2) +find_package(tinyxml2 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC tinyxml2) +# DOCUMENTATION_END } diff --git a/examples/tinyxml2/boo.cpp b/examples/tinyxml2/boo.cpp new file mode 100644 index 000000000..96190657b --- /dev/null +++ b/examples/tinyxml2/boo.cpp @@ -0,0 +1,8 @@ +#include + +int main() { + tinyxml2::XMLDocument doc; + doc.LoadFile("dummy.xml"); + + return 0; +} diff --git a/examples/tmxparser/CMakeLists.txt b/examples/tmxparser/CMakeLists.txt new file mode 100644 index 000000000..86f3e7709 --- /dev/null +++ b/examples/tmxparser/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-tmxparser) + +# DOCUMENTATION_START { +hunter_add_package(tmxparser) +find_package(tmxparser CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC tmxparser) +# DOCUMENTATION_END } diff --git a/examples/tmxparser/boo.cpp b/examples/tmxparser/boo.cpp new file mode 100644 index 000000000..66d479be9 --- /dev/null +++ b/examples/tmxparser/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/toluapp/CMakeLists.txt b/examples/toluapp/CMakeLists.txt new file mode 100644 index 000000000..6c47efc3f --- /dev/null +++ b/examples/toluapp/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +set(TESTING_CONFIG_OPT FILEPATH "${CMAKE_CURRENT_LIST_DIR}/config.cmake") + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-toluapp) + +# DOCUMENTATION_START { +hunter_add_package(toluapp) +find_package(toluapp CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC toluapp::toluapp) +# DOCUMENTATION_END } diff --git a/examples/toluapp/boo.cpp b/examples/toluapp/boo.cpp new file mode 100644 index 000000000..b065e2b0b --- /dev/null +++ b/examples/toluapp/boo.cpp @@ -0,0 +1,9 @@ +#include + +int main() { + lua_State* state(0); + void* user_type(0); + const char* name = ""; + + tolua_pushusertype(state, user_type, name); +} diff --git a/examples/toluapp/config.cmake b/examples/toluapp/config.cmake new file mode 100644 index 000000000..49b32dc6c --- /dev/null +++ b/examples/toluapp/config.cmake @@ -0,0 +1,4 @@ +# DOCUMENTATION_START { +# config.cmake +hunter_config(Lua VERSION 5.1.5-p3) +# DOCUMENTATION_END } diff --git a/examples/tomcrypt/CMakeLists.txt b/examples/tomcrypt/CMakeLists.txt new file mode 100644 index 000000000..ce1d582f1 --- /dev/null +++ b/examples/tomcrypt/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(example-libtomcrypt) + +hunter_add_package(tomcrypt) + +find_package(tomcrypt CONFIG REQUIRED) + +add_executable(example-libtomcrypt main.c) +target_link_libraries(example-libtomcrypt tomcrypt::tomcrypt) diff --git a/examples/tomcrypt/main.c b/examples/tomcrypt/main.c new file mode 100644 index 000000000..effca9d29 --- /dev/null +++ b/examples/tomcrypt/main.c @@ -0,0 +1,40 @@ +#include +int main(void) +{ + unsigned char buffer[100], hash[MAXBLOCKSIZE]; + int idx, x; + hash_state md; + + /* register hashes .... */ + if (register_hash(&md5_desc) == -1) { + printf("Error registering MD5.\n"); + return -1; + } + + /* register other hashes ... */ + /* prompt for name and strip newline */ + printf("Enter hash name: \n"); + fgets(buffer, sizeof(buffer), stdin); + buffer[strlen(buffer) - 1] = 0; + + /* get hash index */ + idx = find_hash(buffer); + if (idx == -1) { + printf("Invalid hash name!\n"); + return -1; + } + + /* hash input until blank line */ + hash_descriptor[idx].init(&md); + while (fgets(buffer, sizeof(buffer), stdin) != NULL) + hash_descriptor[idx].process(&md, buffer, strlen(buffer)); + + hash_descriptor[idx].done(&md, hash); + + /* dump to screen */ + for (x = 0; x < hash_descriptor[idx].hashsize; x++) + printf("%02x ", hash[x]); + + printf("\n"); + return 0; +} diff --git a/examples/tommath/CMakeLists.txt b/examples/tommath/CMakeLists.txt new file mode 100644 index 000000000..e6f219cd9 --- /dev/null +++ b/examples/tommath/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(example-libtommath) + +hunter_add_package(tommath) + +find_package(tommath CONFIG REQUIRED) + +add_executable(example-libtommath main.c) +target_link_libraries(example-libtommath tommath::tommath) diff --git a/examples/tommath/main.c b/examples/tommath/main.c new file mode 100644 index 000000000..e270f03a4 --- /dev/null +++ b/examples/tommath/main.c @@ -0,0 +1,987 @@ +#include +#include + +#ifdef IOWNANATHLON +#include +#define SLEEP sleep(4) +#else +#define SLEEP +#endif + +/* + * Configuration + */ +#ifndef LTM_DEMO_TEST_VS_MTEST +#define LTM_DEMO_TEST_VS_MTEST 1 +#endif + +#ifndef LTM_DEMO_TEST_REDUCE_2K_L +/* This test takes a moment so we disable it by default, but it can be: + * 0 to disable testing + * 1 to make the test with P = 2^1024 - 0x2A434 B9FDEC95 D8F9D550 FFFFFFFF FFFFFFFF + * 2 to make the test with P = 2^2048 - 0x1 00000000 00000000 00000000 00000000 4945DDBF 8EA2A91D 5776399B B83E188F + */ +#define LTM_DEMO_TEST_REDUCE_2K_L 0 +#endif + +#ifdef LTM_DEMO_REAL_RAND +#define LTM_DEMO_RAND_SEED time(NULL) +#else +#define LTM_DEMO_RAND_SEED 23 +#endif + +#include "tommath.h" + +void ndraw(mp_int * a, char *name) +{ + char buf[16000]; + + printf("%s: ", name); + mp_toradix(a, buf, 10); + printf("%s\n", buf); + mp_toradix(a, buf, 16); + printf("0x%s\n", buf); +} + +#if LTM_DEMO_TEST_VS_MTEST +static void draw(mp_int * a) +{ + ndraw(a, ""); +} +#endif + + +unsigned long lfsr = 0xAAAAAAAAUL; + +int lbit(void) +{ + if (lfsr & 0x80000000UL) { + lfsr = ((lfsr << 1) ^ 0x8000001BUL) & 0xFFFFFFFFUL; + return 1; + } else { + lfsr <<= 1; + return 0; + } +} + +#if defined(LTM_DEMO_REAL_RAND) && !defined(_WIN32) +static FILE* fd_urandom; +#endif +int myrng(unsigned char *dst, int len, void *dat) +{ + int x; + (void)dat; +#if defined(LTM_DEMO_REAL_RAND) + if (!fd_urandom) { +#if !defined(_WIN32) + fprintf(stderr, "\nno /dev/urandom\n"); +#endif + } + else { + return fread(dst, 1, len, fd_urandom); + } +#endif + for (x = 0; x < len; ) { + unsigned int r = (unsigned int)rand(); + do { + dst[x++] = r & 0xFF; + r >>= 8; + } while((r != 0) && (x < len)); + } + return len; +} + +#if LTM_DEMO_TEST_VS_MTEST != 0 +static void _panic(int l) +{ + fprintf(stderr, "\n%d: fgets failed\n", l); + exit(EXIT_FAILURE); +} +#endif + +mp_int a, b, c, d, e, f; + +static void _cleanup(void) +{ + mp_clear_multi(&a, &b, &c, &d, &e, &f, NULL); + printf("\n"); + +#ifdef LTM_DEMO_REAL_RAND + if(fd_urandom) + fclose(fd_urandom); +#endif +} +struct mp_sqrtmod_prime_st { + unsigned long p; + unsigned long n; + mp_digit r; +}; +struct mp_sqrtmod_prime_st sqrtmod_prime[] = { + { 5, 14, 3 }, + { 7, 9, 4 }, + { 113, 2, 62 } +}; +struct mp_jacobi_st { + unsigned long n; + int c[16]; +}; +struct mp_jacobi_st jacobi[] = { + { 3, { 1, -1, 0, 1, -1, 0, 1, -1, 0, 1, -1, 0, 1, -1, 0, 1 } }, + { 5, { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1, 0, 1, -1, -1, 1, 0 } }, + { 7, { 1, -1, 1, -1, -1, 0, 1, 1, -1, 1, -1, -1, 0, 1, 1, -1 } }, + { 9, { -1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1 } }, +}; + +char cmd[4096], buf[4096]; +int main(void) +{ + unsigned rr; + int cnt, ix; +#if LTM_DEMO_TEST_VS_MTEST + unsigned long expt_n, add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, + gcd_n, lcm_n, inv_n, div2_n, mul2_n, add_d_n, sub_d_n; + char* ret; +#else + unsigned long s, t; + unsigned long long q, r; + mp_digit mp; + int i, n, err, should; +#endif + + if (mp_init_multi(&a, &b, &c, &d, &e, &f, NULL)!= MP_OKAY) + return EXIT_FAILURE; + + atexit(_cleanup); + +#if defined(LTM_DEMO_REAL_RAND) + if (!fd_urandom) { + fd_urandom = fopen("/dev/urandom", "r"); + if (!fd_urandom) { +#if !defined(_WIN32) + fprintf(stderr, "\ncould not open /dev/urandom\n"); +#endif + } + } +#endif + srand(LTM_DEMO_RAND_SEED); + +#ifdef MP_8BIT + printf("Digit size 8 Bit \n"); +#endif +#ifdef MP_16BIT + printf("Digit size 16 Bit \n"); +#endif +#ifdef MP_32BIT + printf("Digit size 32 Bit \n"); +#endif +#ifdef MP_64BIT + printf("Digit size 64 Bit \n"); +#endif + printf("Size of mp_digit: %u\n", (unsigned int)sizeof(mp_digit)); + printf("Size of mp_word: %u\n", (unsigned int)sizeof(mp_word)); + printf("DIGIT_BIT: %d\n", DIGIT_BIT); + printf("MP_PREC: %d\n", MP_PREC); + +#if LTM_DEMO_TEST_VS_MTEST == 0 + // trivial stuff + mp_set_int(&a, 5); + mp_neg(&a, &b); + if (mp_cmp(&a, &b) != MP_GT) { + return EXIT_FAILURE; + } + if (mp_cmp(&b, &a) != MP_LT) { + return EXIT_FAILURE; + } + mp_neg(&a, &a); + if (mp_cmp(&b, &a) != MP_EQ) { + return EXIT_FAILURE; + } + mp_abs(&a, &b); + if (mp_isneg(&b) != MP_NO) { + return EXIT_FAILURE; + } + mp_add_d(&a, 1, &b); + mp_add_d(&a, 6, &b); + + + mp_set_int(&a, 0); + mp_set_int(&b, 1); + if ((err = mp_jacobi(&a, &b, &i)) != MP_OKAY) { + printf("Failed executing mp_jacobi(0 | 1) %s.\n", mp_error_to_string(err)); + return EXIT_FAILURE; + } + if (i != 1) { + printf("Failed trivial mp_jacobi(0 | 1) %d != 1\n", i); + return EXIT_FAILURE; + } + for (cnt = 0; cnt < (int)(sizeof(jacobi)/sizeof(jacobi[0])); ++cnt) { + mp_set_int(&b, jacobi[cnt].n); + /* only test positive values of a */ + for (n = -5; n <= 10; ++n) { + mp_set_int(&a, abs(n)); + should = MP_OKAY; + if (n < 0) { + mp_neg(&a, &a); + /* Until #44 is fixed the negative a's must fail */ + should = MP_VAL; + } + if ((err = mp_jacobi(&a, &b, &i)) != should) { + printf("Failed executing mp_jacobi(%d | %lu) %s.\n", n, jacobi[cnt].n, mp_error_to_string(err)); + return EXIT_FAILURE; + } + if (err == MP_OKAY && i != jacobi[cnt].c[n + 5]) { + printf("Failed trivial mp_jacobi(%d | %lu) %d != %d\n", n, jacobi[cnt].n, i, jacobi[cnt].c[n + 5]); + return EXIT_FAILURE; + } + } + } + + // test mp_get_int + printf("\n\nTesting: mp_get_int"); + for (i = 0; i < 1000; ++i) { + t = ((unsigned long) rand () * rand () + 1) & 0xFFFFFFFF; + mp_set_int (&a, t); + if (t != mp_get_int (&a)) { + printf ("\nmp_get_int() bad result!"); + return EXIT_FAILURE; + } + } + mp_set_int(&a, 0); + if (mp_get_int(&a) != 0) { + printf("\nmp_get_int() bad result!"); + return EXIT_FAILURE; + } + mp_set_int(&a, 0xffffffff); + if (mp_get_int(&a) != 0xffffffff) { + printf("\nmp_get_int() bad result!"); + return EXIT_FAILURE; + } + + printf("\n\nTesting: mp_get_long\n"); + for (i = 0; i < (int)(sizeof(unsigned long)*CHAR_BIT) - 1; ++i) { + t = (1ULL << (i+1)) - 1; + if (!t) + t = -1; + printf(" t = 0x%lx i = %d\r", t, i); + do { + if (mp_set_long(&a, t) != MP_OKAY) { + printf("\nmp_set_long() error!"); + return EXIT_FAILURE; + } + s = mp_get_long(&a); + if (s != t) { + printf("\nmp_get_long() bad result! 0x%lx != 0x%lx", s, t); + return EXIT_FAILURE; + } + t <<= 1; + } while(t); + } + + printf("\n\nTesting: mp_get_long_long\n"); + for (i = 0; i < (int)(sizeof(unsigned long long)*CHAR_BIT) - 1; ++i) { + r = (1ULL << (i+1)) - 1; + if (!r) + r = -1; + printf(" r = 0x%llx i = %d\r", r, i); + do { + if (mp_set_long_long(&a, r) != MP_OKAY) { + printf("\nmp_set_long_long() error!"); + return EXIT_FAILURE; + } + q = mp_get_long_long(&a); + if (q != r) { + printf("\nmp_get_long_long() bad result! 0x%llx != 0x%llx", q, r); + return EXIT_FAILURE; + } + r <<= 1; + } while(r); + } + + // test mp_sqrt + printf("\n\nTesting: mp_sqrt\n"); + for (i = 0; i < 1000; ++i) { + printf ("%6d\r", i); + fflush (stdout); + n = (rand () & 15) + 1; + mp_rand (&a, n); + if (mp_sqrt (&a, &b) != MP_OKAY) { + printf ("\nmp_sqrt() error!"); + return EXIT_FAILURE; + } + mp_n_root_ex (&a, 2, &c, 0); + mp_n_root_ex (&a, 2, &d, 1); + if (mp_cmp_mag (&c, &d) != MP_EQ) { + printf ("\nmp_n_root_ex() bad result!"); + return EXIT_FAILURE; + } + if (mp_cmp_mag (&b, &c) != MP_EQ) { + printf ("mp_sqrt() bad result!\n"); + return EXIT_FAILURE; + } + } + + printf("\n\nTesting: mp_is_square\n"); + for (i = 0; i < 1000; ++i) { + printf ("%6d\r", i); + fflush (stdout); + + /* test mp_is_square false negatives */ + n = (rand () & 7) + 1; + mp_rand (&a, n); + mp_sqr (&a, &a); + if (mp_is_square (&a, &n) != MP_OKAY) { + printf ("\nfn:mp_is_square() error!"); + return EXIT_FAILURE; + } + if (n == 0) { + printf ("\nfn:mp_is_square() bad result!"); + return EXIT_FAILURE; + } + + /* test for false positives */ + mp_add_d (&a, 1, &a); + if (mp_is_square (&a, &n) != MP_OKAY) { + printf ("\nfp:mp_is_square() error!"); + return EXIT_FAILURE; + } + if (n == 1) { + printf ("\nfp:mp_is_square() bad result!"); + return EXIT_FAILURE; + } + + } + printf("\n\n"); + + // r^2 = n (mod p) + for (i = 0; i < (int)(sizeof(sqrtmod_prime)/sizeof(sqrtmod_prime[0])); ++i) { + mp_set_int(&a, sqrtmod_prime[i].p); + mp_set_int(&b, sqrtmod_prime[i].n); + if (mp_sqrtmod_prime(&b, &a, &c) != MP_OKAY) { + printf("Failed executing %d. mp_sqrtmod_prime\n", (i+1)); + return EXIT_FAILURE; + } + if (mp_cmp_d(&c, sqrtmod_prime[i].r) != MP_EQ) { + printf("Failed %d. trivial mp_sqrtmod_prime\n", (i+1)); + ndraw(&c, "r"); + return EXIT_FAILURE; + } + } + + /* test for size */ + for (ix = 10; ix < 128; ix++) { + printf ("Testing (not safe-prime): %9d bits \r", ix); + fflush (stdout); + err = mp_prime_random_ex (&a, 8, ix, + (rand () & 1) ? 0 : LTM_PRIME_2MSB_ON, myrng, + NULL); + if (err != MP_OKAY) { + printf ("failed with err code %d\n", err); + return EXIT_FAILURE; + } + if (mp_count_bits (&a) != ix) { + printf ("Prime is %d not %d bits!!!\n", mp_count_bits (&a), ix); + return EXIT_FAILURE; + } + } + printf("\n"); + + for (ix = 16; ix < 128; ix++) { + printf ("Testing ( safe-prime): %9d bits \r", ix); + fflush (stdout); + err = mp_prime_random_ex ( + &a, 8, ix, ((rand () & 1) ? 0 : LTM_PRIME_2MSB_ON) | LTM_PRIME_SAFE, + myrng, NULL); + if (err != MP_OKAY) { + printf ("failed with err code %d\n", err); + return EXIT_FAILURE; + } + if (mp_count_bits (&a) != ix) { + printf ("Prime is %d not %d bits!!!\n", mp_count_bits (&a), ix); + return EXIT_FAILURE; + } + /* let's see if it's really a safe prime */ + mp_sub_d (&a, 1, &a); + mp_div_2 (&a, &a); + mp_prime_is_prime (&a, 8, &cnt); + if (cnt != MP_YES) { + printf ("sub is not prime!\n"); + return EXIT_FAILURE; + } + } + + printf("\n\n"); + + // test montgomery + printf("Testing: montgomery...\n"); + for (i = 1; i <= 10; i++) { + if (i == 10) + i = 1000; + printf(" digit size: %2d\r", i); + fflush(stdout); + for (n = 0; n < 1000; n++) { + mp_rand(&a, i); + a.dp[0] |= 1; + + // let's see if R is right + mp_montgomery_calc_normalization(&b, &a); + mp_montgomery_setup(&a, &mp); + + // now test a random reduction + for (ix = 0; ix < 100; ix++) { + mp_rand(&c, 1 + abs(rand()) % (2*i)); + mp_copy(&c, &d); + mp_copy(&c, &e); + + mp_mod(&d, &a, &d); + mp_montgomery_reduce(&c, &a, mp); + mp_mulmod(&c, &b, &a, &c); + + if (mp_cmp(&c, &d) != MP_EQ) { +printf("d = e mod a, c = e MOD a\n"); +mp_todecimal(&a, buf); printf("a = %s\n", buf); +mp_todecimal(&e, buf); printf("e = %s\n", buf); +mp_todecimal(&d, buf); printf("d = %s\n", buf); +mp_todecimal(&c, buf); printf("c = %s\n", buf); +printf("compare no compare!\n"); return EXIT_FAILURE; } + /* only one big montgomery reduction */ + if (i > 10) + { + n = 1000; + ix = 100; + } + } + } + } + + printf("\n\n"); + + mp_read_radix(&a, "123456", 10); + mp_toradix_n(&a, buf, 10, 3); + printf("a == %s\n", buf); + mp_toradix_n(&a, buf, 10, 4); + printf("a == %s\n", buf); + mp_toradix_n(&a, buf, 10, 30); + printf("a == %s\n", buf); + + +#if 0 + for (;;) { + fgets(buf, sizeof(buf), stdin); + mp_read_radix(&a, buf, 10); + mp_prime_next_prime(&a, 5, 1); + mp_toradix(&a, buf, 10); + printf("%s, %lu\n", buf, a.dp[0] & 3); + } +#endif + + /* test mp_cnt_lsb */ + printf("\n\nTesting: mp_cnt_lsb"); + mp_set(&a, 1); + for (ix = 0; ix < 1024; ix++) { + if (mp_cnt_lsb (&a) != ix) { + printf ("Failed at %d, %d\n", ix, mp_cnt_lsb (&a)); + return EXIT_FAILURE; + } + mp_mul_2 (&a, &a); + } + +/* test mp_reduce_2k */ + printf("\n\nTesting: mp_reduce_2k\n"); + for (cnt = 3; cnt <= 128; ++cnt) { + mp_digit tmp; + + mp_2expt (&a, cnt); + mp_sub_d (&a, 2, &a); /* a = 2**cnt - 2 */ + + printf ("\r %4d bits", cnt); + printf ("(%d)", mp_reduce_is_2k (&a)); + mp_reduce_2k_setup (&a, &tmp); + printf ("(%lu)", (unsigned long) tmp); + for (ix = 0; ix < 1000; ix++) { + if (!(ix & 127)) { + printf ("."); + fflush (stdout); + } + mp_rand (&b, (cnt / DIGIT_BIT + 1) * 2); + mp_copy (&c, &b); + mp_mod (&c, &a, &c); + mp_reduce_2k (&b, &a, 2); + if (mp_cmp (&c, &b)) { + printf ("FAILED\n"); + return EXIT_FAILURE; + } + } + } + +/* test mp_div_3 */ + printf("\n\nTesting: mp_div_3...\n"); + mp_set(&d, 3); + for (cnt = 0; cnt < 10000;) { + mp_digit r2; + + if (!(++cnt & 127)) + { + printf("%9d\r", cnt); + fflush(stdout); + } + mp_rand(&a, abs(rand()) % 128 + 1); + mp_div(&a, &d, &b, &e); + mp_div_3(&a, &c, &r2); + + if (mp_cmp(&b, &c) || mp_cmp_d(&e, r2)) { + printf("\nmp_div_3 => Failure\n"); + } + } + printf("\nPassed div_3 testing"); + +/* test the DR reduction */ + printf("\n\nTesting: mp_dr_reduce...\n"); + for (cnt = 2; cnt < 32; cnt++) { + printf ("\r%d digit modulus", cnt); + mp_grow (&a, cnt); + mp_zero (&a); + for (ix = 1; ix < cnt; ix++) { + a.dp[ix] = MP_MASK; + } + a.used = cnt; + a.dp[0] = 3; + + mp_rand (&b, cnt - 1); + mp_copy (&b, &c); + + rr = 0; + do { + if (!(rr & 127)) { + printf ("."); + fflush (stdout); + } + mp_sqr (&b, &b); + mp_add_d (&b, 1, &b); + mp_copy (&b, &c); + + mp_mod (&b, &a, &b); + mp_dr_setup(&a, &mp), + mp_dr_reduce (&c, &a, mp); + + if (mp_cmp (&b, &c) != MP_EQ) { + printf ("Failed on trial %u\n", rr); + return EXIT_FAILURE; + } + } while (++rr < 500); + printf (" passed"); + fflush (stdout); + } + +#if LTM_DEMO_TEST_REDUCE_2K_L +/* test the mp_reduce_2k_l code */ +#if LTM_DEMO_TEST_REDUCE_2K_L == 1 +/* first load P with 2^1024 - 0x2A434 B9FDEC95 D8F9D550 FFFFFFFF FFFFFFFF */ + mp_2expt(&a, 1024); + mp_read_radix(&b, "2A434B9FDEC95D8F9D550FFFFFFFFFFFFFFFF", 16); + mp_sub(&a, &b, &a); +#elif LTM_DEMO_TEST_REDUCE_2K_L == 2 +/* p = 2^2048 - 0x1 00000000 00000000 00000000 00000000 4945DDBF 8EA2A91D 5776399B B83E188F */ + mp_2expt(&a, 2048); + mp_read_radix(&b, + "1000000000000000000000000000000004945DDBF8EA2A91D5776399BB83E188F", + 16); + mp_sub(&a, &b, &a); +#else +#error oops +#endif + + mp_todecimal(&a, buf); + printf("\n\np==%s\n", buf); +/* now mp_reduce_is_2k_l() should return */ + if (mp_reduce_is_2k_l(&a) != 1) { + printf("mp_reduce_is_2k_l() return 0, should be 1\n"); + return EXIT_FAILURE; + } + mp_reduce_2k_setup_l(&a, &d); + /* now do a million square+1 to see if it varies */ + mp_rand(&b, 64); + mp_mod(&b, &a, &b); + mp_copy(&b, &c); + printf("Testing: mp_reduce_2k_l..."); + fflush(stdout); + for (cnt = 0; cnt < (int)(1UL << 20); cnt++) { + mp_sqr(&b, &b); + mp_add_d(&b, 1, &b); + mp_reduce_2k_l(&b, &a, &d); + mp_sqr(&c, &c); + mp_add_d(&c, 1, &c); + mp_mod(&c, &a, &c); + if (mp_cmp(&b, &c) != MP_EQ) { + printf("mp_reduce_2k_l() failed at step %d\n", cnt); + mp_tohex(&b, buf); + printf("b == %s\n", buf); + mp_tohex(&c, buf); + printf("c == %s\n", buf); + return EXIT_FAILURE; + } + } + printf("...Passed\n"); +#endif /* LTM_DEMO_TEST_REDUCE_2K_L */ + +#else + + div2_n = mul2_n = inv_n = expt_n = lcm_n = gcd_n = add_n = + sub_n = mul_n = div_n = sqr_n = mul2d_n = div2d_n = cnt = add_d_n = + sub_d_n = 0; + + /* force KARA and TOOM to enable despite cutoffs */ + KARATSUBA_SQR_CUTOFF = KARATSUBA_MUL_CUTOFF = 8; + TOOM_SQR_CUTOFF = TOOM_MUL_CUTOFF = 16; + + for (;;) { + /* randomly clear and re-init one variable, this has the affect of triming the alloc space */ + switch (abs(rand()) % 7) { + case 0: + mp_clear(&a); + mp_init(&a); + break; + case 1: + mp_clear(&b); + mp_init(&b); + break; + case 2: + mp_clear(&c); + mp_init(&c); + break; + case 3: + mp_clear(&d); + mp_init(&d); + break; + case 4: + mp_clear(&e); + mp_init(&e); + break; + case 5: + mp_clear(&f); + mp_init(&f); + break; + case 6: + break; /* don't clear any */ + } + + + printf + ("%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu/%4lu ", + add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n, gcd_n, lcm_n, + expt_n, inv_n, div2_n, mul2_n, add_d_n, sub_d_n); + ret=fgets(cmd, 4095, stdin); if(!ret){_panic(__LINE__);} + cmd[strlen(cmd) - 1] = 0; + printf("%-6s ]\r", cmd); + fflush(stdout); + if (!strcmp(cmd, "mul2d")) { + ++mul2d_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + sscanf(buf, "%d", &rr); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + + mp_mul_2d(&a, rr, &a); + a.sign = b.sign; + if (mp_cmp(&a, &b) != MP_EQ) { + printf("mul2d failed, rr == %d\n", rr); + draw(&a); + draw(&b); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "div2d")) { + ++div2d_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + sscanf(buf, "%d", &rr); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + + mp_div_2d(&a, rr, &a, &e); + a.sign = b.sign; + if (a.used == b.used && a.used == 0) { + a.sign = b.sign = MP_ZPOS; + } + if (mp_cmp(&a, &b) != MP_EQ) { + printf("div2d failed, rr == %d\n", rr); + draw(&a); + draw(&b); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "add")) { + ++add_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&c, buf, 64); + mp_copy(&a, &d); + mp_add(&d, &b, &d); + if (mp_cmp(&c, &d) != MP_EQ) { + printf("add %lu failure!\n", add_n); + draw(&a); + draw(&b); + draw(&c); + draw(&d); + return EXIT_FAILURE; + } + + /* test the sign/unsigned storage functions */ + + rr = mp_signed_bin_size(&c); + mp_to_signed_bin(&c, (unsigned char *) cmd); + memset(cmd + rr, rand() & 255, sizeof(cmd) - rr); + mp_read_signed_bin(&d, (unsigned char *) cmd, rr); + if (mp_cmp(&c, &d) != MP_EQ) { + printf("mp_signed_bin failure!\n"); + draw(&c); + draw(&d); + return EXIT_FAILURE; + } + + + rr = mp_unsigned_bin_size(&c); + mp_to_unsigned_bin(&c, (unsigned char *) cmd); + memset(cmd + rr, rand() & 255, sizeof(cmd) - rr); + mp_read_unsigned_bin(&d, (unsigned char *) cmd, rr); + if (mp_cmp_mag(&c, &d) != MP_EQ) { + printf("mp_unsigned_bin failure!\n"); + draw(&c); + draw(&d); + return EXIT_FAILURE; + } + + } else if (!strcmp(cmd, "sub")) { + ++sub_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&c, buf, 64); + mp_copy(&a, &d); + mp_sub(&d, &b, &d); + if (mp_cmp(&c, &d) != MP_EQ) { + printf("sub %lu failure!\n", sub_n); + draw(&a); + draw(&b); + draw(&c); + draw(&d); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "mul")) { + ++mul_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&c, buf, 64); + mp_copy(&a, &d); + mp_mul(&d, &b, &d); + if (mp_cmp(&c, &d) != MP_EQ) { + printf("mul %lu failure!\n", mul_n); + draw(&a); + draw(&b); + draw(&c); + draw(&d); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "div")) { + ++div_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&c, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&d, buf, 64); + + mp_div(&a, &b, &e, &f); + if (mp_cmp(&c, &e) != MP_EQ || mp_cmp(&d, &f) != MP_EQ) { + printf("div %lu %d, %d, failure!\n", div_n, mp_cmp(&c, &e), + mp_cmp(&d, &f)); + draw(&a); + draw(&b); + draw(&c); + draw(&d); + draw(&e); + draw(&f); + return EXIT_FAILURE; + } + + } else if (!strcmp(cmd, "sqr")) { + ++sqr_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + mp_copy(&a, &c); + mp_sqr(&c, &c); + if (mp_cmp(&b, &c) != MP_EQ) { + printf("sqr %lu failure!\n", sqr_n); + draw(&a); + draw(&b); + draw(&c); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "gcd")) { + ++gcd_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&c, buf, 64); + mp_copy(&a, &d); + mp_gcd(&d, &b, &d); + d.sign = c.sign; + if (mp_cmp(&c, &d) != MP_EQ) { + printf("gcd %lu failure!\n", gcd_n); + draw(&a); + draw(&b); + draw(&c); + draw(&d); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "lcm")) { + ++lcm_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&c, buf, 64); + mp_copy(&a, &d); + mp_lcm(&d, &b, &d); + d.sign = c.sign; + if (mp_cmp(&c, &d) != MP_EQ) { + printf("lcm %lu failure!\n", lcm_n); + draw(&a); + draw(&b); + draw(&c); + draw(&d); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "expt")) { + ++expt_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&c, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&d, buf, 64); + mp_copy(&a, &e); + mp_exptmod(&e, &b, &c, &e); + if (mp_cmp(&d, &e) != MP_EQ) { + printf("expt %lu failure!\n", expt_n); + draw(&a); + draw(&b); + draw(&c); + draw(&d); + draw(&e); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "invmod")) { + ++inv_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&c, buf, 64); + mp_invmod(&a, &b, &d); + mp_mulmod(&d, &a, &b, &e); + if (mp_cmp_d(&e, 1) != MP_EQ) { + printf("inv [wrong value from MPI?!] failure\n"); + draw(&a); + draw(&b); + draw(&c); + draw(&d); + draw(&e); + mp_gcd(&a, &b, &e); + draw(&e); + return EXIT_FAILURE; + } + + } else if (!strcmp(cmd, "div2")) { + ++div2_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + mp_div_2(&a, &c); + if (mp_cmp(&c, &b) != MP_EQ) { + printf("div_2 %lu failure\n", div2_n); + draw(&a); + draw(&b); + draw(&c); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "mul2")) { + ++mul2_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + mp_mul_2(&a, &c); + if (mp_cmp(&c, &b) != MP_EQ) { + printf("mul_2 %lu failure\n", mul2_n); + draw(&a); + draw(&b); + draw(&c); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "add_d")) { + ++add_d_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + sscanf(buf, "%d", &ix); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + mp_add_d(&a, ix, &c); + if (mp_cmp(&b, &c) != MP_EQ) { + printf("add_d %lu failure\n", add_d_n); + draw(&a); + draw(&b); + draw(&c); + printf("d == %d\n", ix); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "sub_d")) { + ++sub_d_n; + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&a, buf, 64); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + sscanf(buf, "%d", &ix); + ret=fgets(buf, 4095, stdin); if(!ret){_panic(__LINE__);} + mp_read_radix(&b, buf, 64); + mp_sub_d(&a, ix, &c); + if (mp_cmp(&b, &c) != MP_EQ) { + printf("sub_d %lu failure\n", sub_d_n); + draw(&a); + draw(&b); + draw(&c); + printf("d == %d\n", ix); + return EXIT_FAILURE; + } + } else if (!strcmp(cmd, "exit")) { + printf("\nokay, exiting now\n"); + break; + } + } +#endif + return 0; +} + +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ + diff --git a/examples/tvm/CMakeLists.txt b/examples/tvm/CMakeLists.txt new file mode 100644 index 000000000..082ebd9b2 --- /dev/null +++ b/examples/tvm/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +set(TESTING_CONFIG_OPT FILEPATH ${CMAKE_CURRENT_LIST_DIR}/config.cmake) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-tvm) + +# DOCUMENTATION_START { +hunter_add_package(tvm) +find_package(tvm CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC tvm::tvm_runtime) +# DOCUMENTATION_END } + +if(IOS OR ANDROID OR WIN32) + # tvm::tvm_runtime only +else() + if(NOT TARGET tvm::tvm_topi) + message(FATAL_ERROR "tvm::tvm_topi target is missing") + endif() +endif() diff --git a/examples/tvm/boo.cpp b/examples/tvm/boo.cpp new file mode 100644 index 000000000..21bcd8319 --- /dev/null +++ b/examples/tvm/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/tvm/config.cmake b/examples/tvm/config.cmake new file mode 100644 index 000000000..18b7123a8 --- /dev/null +++ b/examples/tvm/config.cmake @@ -0,0 +1,15 @@ +# https://github.com/ruslo/hunter/pull/943#issuecomment-321534754 + +# DOCUMENTATION_START { +# config.cmake + +if(APPLE AND XCODE) + hunter_config( + LLVM + VERSION + ${HUNTER_LLVM_VERSION} + CMAKE_ARGS + LLVM_BUILD_EXTERNAL_COMPILER_RT=ON + ) +endif() +# DOCUMENTATION_END } diff --git a/examples/type_safe/CMakeLists.txt b/examples/type_safe/CMakeLists.txt new file mode 100644 index 000000000..c8c5277a2 --- /dev/null +++ b/examples/type_safe/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2016 Alexey Ulyanov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-type_safe) +set(CMAKE_CXX_STANDARD 11) + +hunter_add_package(type_safe) +find_package(type_safe CONFIG REQUIRED) + +set(SOURCES main.cpp) + +add_executable(type_safe_example ${SOURCES}) +target_link_libraries(type_safe_example type_safe) diff --git a/examples/type_safe/main.cpp b/examples/type_safe/main.cpp new file mode 100644 index 000000000..6f2e3f313 --- /dev/null +++ b/examples/type_safe/main.cpp @@ -0,0 +1,125 @@ +// Copyright (C) 2016-2017 Jonathan Müller +// This file is subject to the license terms in the LICENSE file +// found in the top-level directory of this distribution. + +#include +#include +#include + +#include +#include +#include + +namespace ts = type_safe; + +// type safe back function +// impossible to forget precondition +ts::optional back(const std::string& str) +{ + return str.empty() ? ts::nullopt : ts::make_optional(str.back()); +} + +// some imaginary lookup function +ts::optional lookup(int c) +{ + // simulate lookup + return c == 'T' ? ts::nullopt : ts::make_optional(c + 1); +} + +// task: get last character of string, +// convert it to upper case +// look it up +// and return the integer or 0 if there is no integer + +// this is how'd you do it with std::optional +int task_std(const std::string& str) +{ + auto c = back(str); + if (!c) + return 0; + auto upper_case = std::toupper(c.value()); + auto result = lookup(upper_case); + return result.value_or(0); +} + +// this is how'd you do it with the monadic functionality +// there is no need for branches and no errors possible +// it generates identical assembler code +int task_monadic(const std::string& str) +{ + return back(str) + // map takes a functor and applies it to the stored value, if there is any + // the result is another optional with possibly different type + .map(static_cast(&std::toupper)) + // now we map lookup + // as lookup returns already an optional itself, + // it won't wrap the result in another optional + .map(lookup) + // value_or() as usual + .value_or(0); +} + +// a visitor for an optional +// this again makes branches unnecessary +struct visitor +{ + template + void operator()(const T& val) + { + std::cout << val << '\n'; + } + + void operator()(ts::nullopt_t) + { + std::cout << "nothing :(\n"; + } +}; + +int main() +{ + std::cout << task_std("Hello World") << ' ' << task_monadic("Hello World") << '\n'; + std::cout << task_std("Hallo Welt") << ' ' << task_monadic("Hallo Welt") << '\n'; + std::cout << task_std("") << ' ' << task_monadic("") << '\n'; + + // visit an optional + ts::optional opt(45); + ts::visit(visitor{}, opt); + opt.reset(); + ts::visit(visitor{}, opt); + + // savely manipulate the value if there is one + // with() is an inplace map() + // and thus more efficient if you do not need to change the type + ts::with(opt, [](int& i) { + std::cout << "got: " << i << '\n'; + ++i; + }); + + // an optional reference + // basically a pointer, but provides the funcionality of optional + ts::optional_ref ref; + + int a = 42; + ref = ts::ref(a); // assignment rebinds + std::cout << ref.value() << '\n'; + + ref.value() = 0; + std::cout << a << '\n'; + + int b = 5; + ref.value_or(b)++; + std::cout << a << ' ' << b << '\n'; + + ref = nullptr; // assign nullptr as additional way to reset + + // an optional reference to const + ts::optional_ref ref_const(ref); + + // create optional_ref from pointer + auto ptr = ts::opt_ref(&a); + auto ptr_const = ts::opt_cref(&a); + + /// transform an optional_ref to an optional by copying + auto ptr_transformed = ts::copy(ptr); // there is also ts::move() to move the value + std::cout << ptr_transformed.value() << '\n'; +} \ No newline at end of file diff --git a/examples/units/CMakeLists.txt b/examples/units/CMakeLists.txt new file mode 100644 index 000000000..bc8e720d7 --- /dev/null +++ b/examples/units/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.9) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-units) + +# DOCUMENTATION_START { +hunter_add_package(units) +find_package(units CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC units::units) +# DOCUMENTATION_END } diff --git a/examples/units/boo.cpp b/examples/units/boo.cpp new file mode 100644 index 000000000..981877ecb --- /dev/null +++ b/examples/units/boo.cpp @@ -0,0 +1,13 @@ +#include +#include + +using namespace std; +using namespace units::literals; +using units::length::meter_t; + +int main() { + + meter_t a = 3_m; + meter_t b = 4_m; + cout << a * b << endl; +} diff --git a/examples/utf8/CMakeLists.txt b/examples/utf8/CMakeLists.txt new file mode 100644 index 000000000..70a83a02f --- /dev/null +++ b/examples/utf8/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-utf8) + +# DOCUMENTATION_START { +hunter_add_package(utf8) +find_package(utf8 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC utf8::utf8) +# DOCUMENTATION_END } diff --git a/examples/utf8/boo.cpp b/examples/utf8/boo.cpp new file mode 100644 index 000000000..279697373 --- /dev/null +++ b/examples/utf8/boo.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include +using namespace std; +int main(int argc, char** argv) +{ + if (argc != 2) { + cout << "\nUsage: docsample filename\n"; + return 0; + } + + const char* test_file_path = argv[1]; + // Open the test file (contains UTF-8 encoded text) + ifstream fs8(test_file_path); + if (!fs8.is_open()) { + cout << "Could not open " << test_file_path << endl; + return 0; + } + + unsigned line_count = 1; + string line; + // Play with all the lines in the file + while (getline(fs8, line)) { + // check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function) + string::iterator end_it = utf8::find_invalid(line.begin(), line.end()); + if (end_it != line.end()) { + cout << "Invalid UTF-8 encoding detected at line " << line_count << "\n"; + cout << "This part is fine: " << string(line.begin(), end_it) << "\n"; + } + + // Get the line length (at least for the valid part) + int length = utf8::distance(line.begin(), end_it); + cout << "Length of line " << line_count << " is " << length << "\n"; + + // Convert it to utf-16 + vector utf16line; + utf8::utf8to16(line.begin(), end_it, back_inserter(utf16line)); + + // And back to utf-8 + string utf8line; + utf8::utf16to8(utf16line.begin(), utf16line.end(), back_inserter(utf8line)); + + // Confirm that the conversion went OK: + if (utf8line != string(line.begin(), end_it)) + cout << "Error in UTF-16 conversion at line: " << line_count << "\n"; + + line_count++; + } + return 0; +} diff --git a/examples/util_linux/CMakeLists.txt b/examples/util_linux/CMakeLists.txt new file mode 100644 index 000000000..300b2279d --- /dev/null +++ b/examples/util_linux/CMakeLists.txt @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-util_linux) + +hunter_add_package(util_linux) + +find_package(blkid CONFIG REQUIRED) +find_package(fdisk CONFIG REQUIRED) +find_package(mount CONFIG REQUIRED) +find_package(smartcols CONFIG REQUIRED) +find_package(uuid CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries( + foo + PUBLIC + PkgConfig::blkid + PkgConfig::fdisk + PkgConfig::mount + PkgConfig::smartcols + PkgConfig::uuid +) diff --git a/examples/util_linux/foo.cpp b/examples/util_linux/foo.cpp new file mode 100644 index 000000000..a16341f3b --- /dev/null +++ b/examples/util_linux/foo.cpp @@ -0,0 +1,8 @@ +#include +#include +#include +#include +#include + +int main() { +} diff --git a/examples/v8/CMakeLists.txt b/examples/v8/CMakeLists.txt new file mode 100644 index 000000000..ee2dcda61 --- /dev/null +++ b/examples/v8/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-v8) + +# DOCUMENTATION_START { +hunter_add_package(v8) +find_package(v8 CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries( + boo + PUBLIC + v8::v8_libplatform + v8::v8_libbase + v8::v8_base + v8::v8_nosnapshot + v8::v8_init + v8::v8_initializers + v8::v8_libsampler +) +# DOCUMENTATION_END } diff --git a/examples/v8/boo.cpp b/examples/v8/boo.cpp new file mode 100644 index 000000000..cf5f0fb45 --- /dev/null +++ b/examples/v8/boo.cpp @@ -0,0 +1,103 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include + +#include +#include + +int main(int argc, char* argv[]) { + // Initialize V8. + v8::V8::InitializeICUDefaultLocation(argv[0]); + v8::V8::InitializeExternalStartupData(argv[0]); + std::unique_ptr platform = v8::platform::NewDefaultPlatform(); + v8::V8::InitializePlatform(platform.get()); + v8::V8::Initialize(); + + // Create a new Isolate and make it the current one. + v8::Isolate::CreateParams create_params; + + create_params.array_buffer_allocator = + v8::ArrayBuffer::Allocator::NewDefaultAllocator(); + v8::Isolate* isolate = v8::Isolate::New(create_params); + { + v8::Isolate::Scope isolate_scope(isolate); + + // Create a stack-allocated handle scope. + v8::HandleScope handle_scope(isolate); + + // Create a new context. + v8::Local context = v8::Context::New(isolate); + + // Enter the context for compiling and running the hello world script. + v8::Context::Scope context_scope(context); + + { + // Create a string containing the JavaScript source code. + v8::Local source = + v8::String::NewFromUtf8(isolate, "'Hello' + ', World!'", + v8::NewStringType::kNormal) + .ToLocalChecked(); + + // Compile the source code. + v8::Local script = + v8::Script::Compile(context, source).ToLocalChecked(); + + // Run the script to get the result. + v8::Local result = script->Run(context).ToLocalChecked(); + + // Convert the result to an UTF8 string and print it. + v8::String::Utf8Value utf8(isolate, result); + printf("%s\n", *utf8); + } + + { + // Use the JavaScript API to generate a WebAssembly module. + // + // |bytes| contains the binary format for the following module: + // + // (func (export "add") (param i32 i32) (result i32) + // get_local 0 + // get_local 1 + // i32.add) + // + const char* csource = R"( + let bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x07, 0x01, + 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07, + 0x07, 0x01, 0x03, 0x61, 0x64, 0x64, 0x00, 0x00, 0x0a, 0x09, 0x01, + 0x07, 0x00, 0x20, 0x00, 0x20, 0x01, 0x6a, 0x0b + ]); + let module = new WebAssembly.Module(bytes); + let instance = new WebAssembly.Instance(module); + instance.exports.add(3, 4); + )"; + + // Create a string containing the JavaScript source code. + v8::Local source = + v8::String::NewFromUtf8(isolate, csource, v8::NewStringType::kNormal) + .ToLocalChecked(); + + // Compile the source code. + v8::Local script = + v8::Script::Compile(context, source).ToLocalChecked(); + + // Run the script to get the result. + v8::Local result = script->Run(context).ToLocalChecked(); + + // Convert the result to a uint32 and print it. + uint32_t number = result->Uint32Value(context).ToChecked(); + printf("3 + 4 = %u\n", number); + } + } + + // Dispose the isolate and tear down V8. + isolate->Dispose(); + v8::V8::Dispose(); + v8::V8::ShutdownPlatform(); + delete create_params.array_buffer_allocator; + return 0; +} diff --git a/examples/vectorial/CMakeLists.txt b/examples/vectorial/CMakeLists.txt new file mode 100644 index 000000000..55f9ce74a --- /dev/null +++ b/examples/vectorial/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-vectorial) + +# DOCUMENTATION_START { +hunter_add_package(vectorial) +find_package(vectorial CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC vectorial::vectorial) +# DOCUMENTATION_END } diff --git a/examples/vectorial/boo.cpp b/examples/vectorial/boo.cpp new file mode 100644 index 000000000..f6dc1e010 --- /dev/null +++ b/examples/vectorial/boo.cpp @@ -0,0 +1,11 @@ +#include +#include + +int main(){ + using vectorial::vec4f; + using vectorial::normalize; + + vec4f v = normalize( vec4f(1,2,3,4)); + float z = v.z(); + std::cout << "z: " << z << std::endl; +} diff --git a/examples/videotoolbox/CMakeLists.txt b/examples/videotoolbox/CMakeLists.txt new file mode 100644 index 000000000..2ffeddffa --- /dev/null +++ b/examples/videotoolbox/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-videotoolbox) + +find_package(videotoolbox REQUIRED) + +add_executable(foo foo.mm) +target_link_libraries(foo PUBLIC videotoolbox::videotoolbox) diff --git a/examples/videotoolbox/foo.mm b/examples/videotoolbox/foo.mm new file mode 100644 index 000000000..b1e43f082 --- /dev/null +++ b/examples/videotoolbox/foo.mm @@ -0,0 +1,4 @@ +#import + +int main() { +} diff --git a/examples/vorbis/CMakeLists.txt b/examples/vorbis/CMakeLists.txt new file mode 100644 index 000000000..dea91608f --- /dev/null +++ b/examples/vorbis/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-vorbis) + +# DOCUMENTATION_START { +hunter_add_package(vorbis) +find_package(vorbis CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC vorbis::vorbis) +# DOCUMENTATION_END } diff --git a/examples/vorbis/boo.cpp b/examples/vorbis/boo.cpp new file mode 100644 index 000000000..fbb4dd4cc --- /dev/null +++ b/examples/vorbis/boo.cpp @@ -0,0 +1,5 @@ + +#include + +int main() { +} diff --git a/examples/wt/CMakeLists.txt b/examples/wt/CMakeLists.txt new file mode 100644 index 000000000..c7d4287ba --- /dev/null +++ b/examples/wt/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download_wt) + +# DOCUMENTATION_START { +hunter_add_package(wt) +find_package(wt CONFIG REQUIRED) + +add_executable(wt_test main.cpp) +target_link_libraries(wt_test Wt::Wt Wt::HTTP) +# DOCUMENTATION_END } diff --git a/examples/wt/main.cpp b/examples/wt/main.cpp new file mode 100644 index 000000000..bd2ade36e --- /dev/null +++ b/examples/wt/main.cpp @@ -0,0 +1,27 @@ +#include + +class TestApp: public Wt::WApplication +{ +public: + TestApp(const Wt::WEnvironment& env); + +private: +}; + +TestApp::TestApp(const Wt::WEnvironment& env) + : Wt::WApplication(env) +{ + setTitle("TestApp"); +} + +std::unique_ptr createApplication(const Wt::WEnvironment& env) +{ + return std::make_unique(env); +} + +int main(int argc, char **argv) +{ + return Wt::WRun(argc, argv, [](const Wt::WEnvironment &env) { + return Wt::cpp14::make_unique(env); + }); +} diff --git a/examples/wyrm/CMakeLists.txt b/examples/wyrm/CMakeLists.txt new file mode 100644 index 000000000..94cbe9a86 --- /dev/null +++ b/examples/wyrm/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-wyrm) + +# DOCUMENTATION_START { +hunter_add_package(wyrm) +find_package(wyrm CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC wyrm::wyrm) +# DOCUMENTATION_END } diff --git a/examples/wyrm/boo.cpp b/examples/wyrm/boo.cpp new file mode 100644 index 000000000..ade9480ec --- /dev/null +++ b/examples/wyrm/boo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/x11/foo.cpp b/examples/x11/foo.cpp new file mode 100644 index 000000000..70c062b4f --- /dev/null +++ b/examples/x11/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/x264/CMakeLists.txt b/examples/x264/CMakeLists.txt new file mode 100644 index 000000000..893c6cfd7 --- /dev/null +++ b/examples/x264/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2017, Alexandre Pretyman + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(x264-example) + +# DOCUMENTATION_START { +hunter_add_package(x264) +find_package(x264 CONFIG REQUIRED) + +add_executable(boo example.c) +target_link_libraries(boo PRIVATE PkgConfig::x264) +# DOCUMENTATION_END } diff --git a/examples/x264/example.c b/examples/x264/example.c new file mode 100644 index 000000000..0fb7fbdb2 --- /dev/null +++ b/examples/x264/example.c @@ -0,0 +1,140 @@ +/***************************************************************************** + * example.c: libx264 API usage example + ***************************************************************************** + * Copyright (C) 2014-2017 x264 project + * + * Authors: Anton Mitrofanov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@x264.com. + *****************************************************************************/ + +#ifdef _WIN32 +#include /* _setmode() */ +#include /* _O_BINARY */ +#endif + +#include +#include +#include + +#define FAIL_IF_ERROR( cond, ... )\ +do\ +{\ + if( cond )\ + {\ + fprintf( stderr, __VA_ARGS__ );\ + goto fail;\ + }\ +} while( 0 ) + +int main( int argc, char **argv ) +{ + int width, height; + x264_param_t param; + x264_picture_t pic; + x264_picture_t pic_out; + x264_t *h; + int i_frame = 0; + int i_frame_size; + x264_nal_t *nal; + int i_nal; + +#ifdef _WIN32 + _setmode( _fileno( stdin ), _O_BINARY ); + _setmode( _fileno( stdout ), _O_BINARY ); + _setmode( _fileno( stderr ), _O_BINARY ); +#endif + + FAIL_IF_ERROR( !(argc > 1), "Example usage: example 352x288 output.h264\n" ); + FAIL_IF_ERROR( 2 != sscanf( argv[1], "%dx%d", &width, &height ), "resolution not specified or incorrect\n" ); + + /* Get default params for preset/tuning */ + if( x264_param_default_preset( ¶m, "medium", NULL ) < 0 ) + goto fail; + + /* Configure non-default params */ + param.i_csp = X264_CSP_I420; + param.i_width = width; + param.i_height = height; + param.b_vfr_input = 0; + param.b_repeat_headers = 1; + param.b_annexb = 1; + + /* Apply profile restrictions. */ + if( x264_param_apply_profile( ¶m, "high" ) < 0 ) + goto fail; + + if( x264_picture_alloc( &pic, param.i_csp, param.i_width, param.i_height ) < 0 ) + goto fail; +#undef fail +#define fail fail2 + + h = x264_encoder_open( ¶m ); + if( !h ) + goto fail; +#undef fail +#define fail fail3 + + int luma_size = width * height; + int chroma_size = luma_size / 4; + /* Encode frames */ + for( ;; i_frame++ ) + { + /* Read input frame */ + if( fread( pic.img.plane[0], 1, luma_size, stdin ) != luma_size ) + break; + if( fread( pic.img.plane[1], 1, chroma_size, stdin ) != chroma_size ) + break; + if( fread( pic.img.plane[2], 1, chroma_size, stdin ) != chroma_size ) + break; + + pic.i_pts = i_frame; + i_frame_size = x264_encoder_encode( h, &nal, &i_nal, &pic, &pic_out ); + if( i_frame_size < 0 ) + goto fail; + else if( i_frame_size ) + { + if( !fwrite( nal->p_payload, i_frame_size, 1, stdout ) ) + goto fail; + } + } + /* Flush delayed frames */ + while( x264_encoder_delayed_frames( h ) ) + { + i_frame_size = x264_encoder_encode( h, &nal, &i_nal, NULL, &pic_out ); + if( i_frame_size < 0 ) + goto fail; + else if( i_frame_size ) + { + if( !fwrite( nal->p_payload, i_frame_size, 1, stdout ) ) + goto fail; + } + } + + x264_encoder_close( h ); + x264_picture_clean( &pic ); + return 0; + +#undef fail +fail3: + x264_encoder_close( h ); +fail2: + x264_picture_clean( &pic ); +fail: + return -1; +} diff --git a/examples/xau/foo.cpp b/examples/xau/foo.cpp new file mode 100644 index 000000000..b2f997621 --- /dev/null +++ b/examples/xau/foo.cpp @@ -0,0 +1,2 @@ +int main() { +} diff --git a/examples/xcb/foo.cpp b/examples/xcb/foo.cpp new file mode 100644 index 000000000..b2f997621 --- /dev/null +++ b/examples/xcb/foo.cpp @@ -0,0 +1,2 @@ +int main() { +} diff --git a/examples/xi/CMakeLists.txt b/examples/xi/CMakeLists.txt new file mode 100644 index 000000000..cc4d4f917 --- /dev/null +++ b/examples/xi/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-xi) + +hunter_add_package(xi) +find_package(xi CONFIG REQUIRED) + +add_executable(foo foo.cpp) +target_link_libraries(foo PUBLIC PkgConfig::xi) diff --git a/examples/xi/foo.cpp b/examples/xi/foo.cpp new file mode 100644 index 000000000..7d046f935 --- /dev/null +++ b/examples/xi/foo.cpp @@ -0,0 +1,4 @@ +#include + +int main() { +} diff --git a/examples/xxhash/CMakeLists.txt b/examples/xxhash/CMakeLists.txt new file mode 100644 index 000000000..2e416442f --- /dev/null +++ b/examples/xxhash/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-xxhash) + +# DOCUMENTATION_START { +hunter_add_package(xxhash) +find_package(xxhash CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC xxhash) +# DOCUMENTATION_END } diff --git a/examples/xxhash/boo.cpp b/examples/xxhash/boo.cpp new file mode 100644 index 000000000..250427d80 --- /dev/null +++ b/examples/xxhash/boo.cpp @@ -0,0 +1,8 @@ +#include + +int main() { + XXH64_state_t* state = XXH64_createState(); + XXH64_update(state, "hello", 5); + XXH64_digest(state); + return 0; +} diff --git a/examples/yaml-cpp/CMakeLists.txt b/examples/yaml-cpp/CMakeLists.txt new file mode 100644 index 000000000..49849ff21 --- /dev/null +++ b/examples/yaml-cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-yaml-cpp) + +hunter_add_package(yaml-cpp) + +find_package(yaml-cpp CONFIG REQUIRED) + + +add_executable(parse parse.cpp) +target_link_libraries(parse yaml-cpp::yaml-cpp) diff --git a/examples/yaml-cpp/parse.cpp b/examples/yaml-cpp/parse.cpp new file mode 100644 index 000000000..ed9db4bbf --- /dev/null +++ b/examples/yaml-cpp/parse.cpp @@ -0,0 +1,61 @@ +#include +#include +#include + +#include "yaml-cpp/eventhandler.h" +#include "yaml-cpp/yaml.h" // IWYU pragma: keep + +struct Params { + bool hasFile; + std::string fileName; +}; + +Params ParseArgs(int argc, char** argv) { + Params p; + + std::vector args(argv + 1, argv + argc); + + return p; +} + +class NullEventHandler : public YAML::EventHandler { + public: + virtual void OnDocumentStart(const YAML::Mark&) {} + virtual void OnDocumentEnd() {} + + virtual void OnNull(const YAML::Mark&, YAML::anchor_t) {} + virtual void OnAlias(const YAML::Mark&, YAML::anchor_t) {} + virtual void OnScalar(const YAML::Mark&, const std::string&, YAML::anchor_t, + const std::string&) {} + + virtual void OnSequenceStart(const YAML::Mark&, const std::string&, + YAML::anchor_t) {} + virtual void OnSequenceEnd() {} + + virtual void OnMapStart(const YAML::Mark&, const std::string&, + YAML::anchor_t) {} + virtual void OnMapEnd() {} +}; + +void parse(std::istream& input) { + try { + YAML::Node doc = YAML::Load(input); + std::cout << doc << "\n"; + } catch (const YAML::Exception& e) { + std::cerr << e.what() << "\n"; + } +} + +int main(int argc, char** argv) { + Params p = ParseArgs(argc, argv); + + if (argc > 1) { + std::ifstream fin; + fin.open(argv[1]); + parse(fin); + } else { + parse(std::cin); + } + + return 0; +} diff --git a/examples/zip/CMakeLists.txt b/examples/zip/CMakeLists.txt new file mode 100644 index 000000000..01acb0b62 --- /dev/null +++ b/examples/zip/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2019, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.2) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(download-zip) + +# DOCUMENTATION_START { +hunter_add_package(zip) +find_package(zip CONFIG REQUIRED) + +add_executable(boo boo.cpp) +target_link_libraries(boo PUBLIC zip::zip) +# DOCUMENTATION_END } diff --git a/examples/zip/boo.cpp b/examples/zip/boo.cpp new file mode 100644 index 000000000..5ddb0a6a7 --- /dev/null +++ b/examples/zip/boo.cpp @@ -0,0 +1,9 @@ +#include + +int main() { + struct zip_t *zip = zip_open("dummy", ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); + + zip_close(zip); + + return 0; +} diff --git a/examples/zookeeper/CMakeLists.txt b/examples/zookeeper/CMakeLists.txt new file mode 100644 index 000000000..c7f766ece --- /dev/null +++ b/examples/zookeeper/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.0) + +# Emulate HunterGate: +# * https://github.com/hunter-packages/gate +include("../common.cmake") + +project(example-zookeeper) + +hunter_add_package(zookeeper) + +find_package(zookeeper CONFIG REQUIRED) + +add_executable(cli main.c) +target_link_libraries(cli zookeeper::zookeeper_mt) +#target_link_libraries(cli zookeeper::zookeeper_st) # if you want the single-threaded lib instead diff --git a/examples/zookeeper/main.c b/examples/zookeeper/main.c new file mode 100644 index 000000000..d58345708 --- /dev/null +++ b/examples/zookeeper/main.c @@ -0,0 +1,697 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * cli.c is a example/sample C client shell for ZooKeeper. It contains + * basic shell functionality which exercises some of the features of + * the ZooKeeper C client API. It is not a full fledged client and is + * not meant for production usage - see the Java client shell for a + * fully featured shell. + */ + +#include +#include +#include +#include +#include + +#ifndef WIN32 +#include +#include +#include +#else +//#include "winport.h" +//#include <-- can't include, conflicting definitions of close() +int read(int _FileHandle, void * _DstBuf, unsigned int _MaxCharCount); +int write(int _Filehandle, const void * _Buf, unsigned int _MaxCharCount); +#define ctime_r(tctime, buffer) ctime_s (buffer, 40, tctime) +#endif + +#include +#include +#include + +#ifdef YCA +#include +#endif + +#define _LL_CAST_ (long long) + +static zhandle_t *zh; +static clientid_t myid; +static const char *clientIdFile = 0; +struct timeval startTime; +static char cmd[1024]; +static int batchMode=0; + +static int to_send=0; +static int sent=0; +static int recvd=0; + +static int shutdownThisThing=0; + +static __attribute__ ((unused)) void +printProfileInfo(struct timeval start, struct timeval end, int thres, + const char* msg) +{ + int delay=(end.tv_sec*1000+end.tv_usec/1000)- + (start.tv_sec*1000+start.tv_usec/1000); + if(delay>thres) + fprintf(stderr,"%s: execution time=%dms\n",msg,delay); +} + +static const char* state2String(int state){ + if (state == 0) + return "CLOSED_STATE"; + if (state == ZOO_CONNECTING_STATE) + return "CONNECTING_STATE"; + if (state == ZOO_ASSOCIATING_STATE) + return "ASSOCIATING_STATE"; + if (state == ZOO_CONNECTED_STATE) + return "CONNECTED_STATE"; + if (state == ZOO_EXPIRED_SESSION_STATE) + return "EXPIRED_SESSION_STATE"; + if (state == ZOO_AUTH_FAILED_STATE) + return "AUTH_FAILED_STATE"; + + return "INVALID_STATE"; +} + +static const char* type2String(int state){ + if (state == ZOO_CREATED_EVENT) + return "CREATED_EVENT"; + if (state == ZOO_DELETED_EVENT) + return "DELETED_EVENT"; + if (state == ZOO_CHANGED_EVENT) + return "CHANGED_EVENT"; + if (state == ZOO_CHILD_EVENT) + return "CHILD_EVENT"; + if (state == ZOO_SESSION_EVENT) + return "SESSION_EVENT"; + if (state == ZOO_NOTWATCHING_EVENT) + return "NOTWATCHING_EVENT"; + + return "UNKNOWN_EVENT_TYPE"; +} + +void watcher(zhandle_t *zzh, int type, int state, const char *path, + void* context) +{ + /* Be careful using zh here rather than zzh - as this may be mt code + * the client lib may call the watcher before zookeeper_init returns */ + + fprintf(stderr, "Watcher %s state = %s", type2String(type), state2String(state)); + if (path && strlen(path) > 0) { + fprintf(stderr, " for path %s", path); + } + fprintf(stderr, "\n"); + + if (type == ZOO_SESSION_EVENT) { + if (state == ZOO_CONNECTED_STATE) { + const clientid_t *id = zoo_client_id(zzh); + if (myid.client_id == 0 || myid.client_id != id->client_id) { + myid = *id; + fprintf(stderr, "Got a new session id: 0x%llx\n", + _LL_CAST_ myid.client_id); + if (clientIdFile) { + FILE *fh = fopen(clientIdFile, "w"); + if (!fh) { + perror(clientIdFile); + } else { + int rc = fwrite(&myid, sizeof(myid), 1, fh); + if (rc != sizeof(myid)) { + perror("writing client id"); + } + fclose(fh); + } + } + } + } else if (state == ZOO_AUTH_FAILED_STATE) { + fprintf(stderr, "Authentication failure. Shutting down...\n"); + zookeeper_close(zzh); + shutdownThisThing=1; + zh=0; + } else if (state == ZOO_EXPIRED_SESSION_STATE) { + fprintf(stderr, "Session expired. Shutting down...\n"); + zookeeper_close(zzh); + shutdownThisThing=1; + zh=0; + } + } +} + +void dumpStat(const struct Stat *stat) { + char tctimes[40]; + char tmtimes[40]; + time_t tctime; + time_t tmtime; + + if (!stat) { + fprintf(stderr,"null\n"); + return; + } + tctime = stat->ctime/1000; + tmtime = stat->mtime/1000; + + ctime_r(&tmtime, tmtimes); + ctime_r(&tctime, tctimes); + + fprintf(stderr, "\tctime = %s\tczxid=%llx\n" + "\tmtime=%s\tmzxid=%llx\n" + "\tversion=%x\taversion=%x\n" + "\tephemeralOwner = %llx\n", + tctimes, _LL_CAST_ stat->czxid, tmtimes, + _LL_CAST_ stat->mzxid, + (unsigned int)stat->version, (unsigned int)stat->aversion, + _LL_CAST_ stat->ephemeralOwner); +} + +void my_string_completion(int rc, const char *name, const void *data) { + fprintf(stderr, "[%s]: rc = %d\n", (char*)(data==0?"null":data), rc); + if (!rc) { + fprintf(stderr, "\tname = %s\n", name); + } + if(batchMode) + shutdownThisThing=1; +} + +void my_string_completion_free_data(int rc, const char *name, const void *data) { + my_string_completion(rc, name, data); + free((void*)data); +} + +void my_data_completion(int rc, const char *value, int value_len, + const struct Stat *stat, const void *data) { + struct timeval tv; + int sec; + int usec; + gettimeofday(&tv, 0); + sec = tv.tv_sec - startTime.tv_sec; + usec = tv.tv_usec - startTime.tv_usec; + fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); + fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); + if (value) { + fprintf(stderr, " value_len = %d\n", value_len); + assert(write(2, value, value_len) == value_len); + } + fprintf(stderr, "\nStat:\n"); + dumpStat(stat); + free((void*)data); + if(batchMode) + shutdownThisThing=1; +} + +void my_silent_data_completion(int rc, const char *value, int value_len, + const struct Stat *stat, const void *data) { + recvd++; + fprintf(stderr, "Data completion %s rc = %d\n",(char*)data,rc); + free((void*)data); + if (recvd==to_send) { + fprintf(stderr,"Recvd %d responses for %d requests sent\n",recvd,to_send); + if(batchMode) + shutdownThisThing=1; + } +} + +void my_strings_completion(int rc, const struct String_vector *strings, + const void *data) { + struct timeval tv; + int sec; + int usec; + int i; + + gettimeofday(&tv, 0); + sec = tv.tv_sec - startTime.tv_sec; + usec = tv.tv_usec - startTime.tv_usec; + fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); + fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); + if (strings) + for (i=0; i < strings->count; i++) { + fprintf(stderr, "\t%s\n", strings->data[i]); + } + free((void*)data); + gettimeofday(&tv, 0); + sec = tv.tv_sec - startTime.tv_sec; + usec = tv.tv_usec - startTime.tv_usec; + fprintf(stderr, "time = %d msec\n", sec*1000 + usec/1000); + if(batchMode) + shutdownThisThing=1; +} + +void my_strings_stat_completion(int rc, const struct String_vector *strings, + const struct Stat *stat, const void *data) { + my_strings_completion(rc, strings, data); + dumpStat(stat); + if(batchMode) + shutdownThisThing=1; +} + +void my_void_completion(int rc, const void *data) { + fprintf(stderr, "%s: rc = %d\n", (char*)data, rc); + free((void*)data); + if(batchMode) + shutdownThisThing=1; +} + +void my_stat_completion(int rc, const struct Stat *stat, const void *data) { + fprintf(stderr, "%s: rc = %d Stat:\n", (char*)data, rc); + dumpStat(stat); + free((void*)data); + if(batchMode) + shutdownThisThing=1; +} + +void my_silent_stat_completion(int rc, const struct Stat *stat, + const void *data) { + // fprintf(stderr, "State completion: [%s] rc = %d\n", (char*)data, rc); + sent++; + free((void*)data); +} + +static void sendRequest(const char* data) { + zoo_aset(zh, "/od", data, strlen(data), -1, my_silent_stat_completion, + strdup("/od")); + zoo_aget(zh, "/od", 1, my_silent_data_completion, strdup("/od")); +} + +void od_completion(int rc, const struct Stat *stat, const void *data) { + int i; + fprintf(stderr, "od command response: rc = %d Stat:\n", rc); + dumpStat(stat); + // send a whole bunch of requests + recvd=0; + sent=0; + to_send=200; + for (i=0; i\n"); + fprintf(stderr, " delete \n"); + fprintf(stderr, " set \n"); + fprintf(stderr, " get \n"); + fprintf(stderr, " ls \n"); + fprintf(stderr, " ls2 \n"); + fprintf(stderr, " sync \n"); + fprintf(stderr, " exists \n"); + fprintf(stderr, " wexists \n"); + fprintf(stderr, " myid\n"); + fprintf(stderr, " verbose\n"); + fprintf(stderr, " addauth \n"); + fprintf(stderr, " quit\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " prefix the command with the character 'a' to run the command asynchronously.\n"); + fprintf(stderr, " run the 'verbose' command to toggle verbose logging.\n"); + fprintf(stderr, " i.e. 'aget /foo' to get /foo asynchronously\n"); + } else if (startsWith(line, "verbose")) { + if (verbose) { + verbose = 0; + zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); + fprintf(stderr, "logging level set to WARN\n"); + } else { + verbose = 1; + zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG); + fprintf(stderr, "logging level set to DEBUG\n"); + } + } else if (startsWith(line, "get ")) { + line += 4; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + + rc = zoo_aget(zh, line, 1, my_data_completion, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "set ")) { + char *ptr; + line += 4; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + ptr = strchr(line, ' '); + if (!ptr) { + fprintf(stderr, "No data found after path\n"); + return; + } + *ptr = '\0'; + ptr++; + if (async) { + rc = zoo_aset(zh, line, ptr, strlen(ptr), -1, my_stat_completion, + strdup(line)); + } else { + struct Stat stat; + rc = zoo_set2(zh, line, ptr, strlen(ptr), -1, &stat); + } + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "ls ")) { + line += 3; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + gettimeofday(&startTime, 0); + rc= zoo_aget_children(zh, line, 1, my_strings_completion, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "ls2 ")) { + line += 4; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + gettimeofday(&startTime, 0); + rc= zoo_aget_children2(zh, line, 1, my_strings_stat_completion, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "create ")) { + int flags = 0; + line += 7; + if (line[0] == '+') { + line++; + if (line[0] == 'e') { + flags |= ZOO_EPHEMERAL; + line++; + } + if (line[0] == 's') { + flags |= ZOO_SEQUENCE; + line++; + } + line++; + } + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + fprintf(stderr, "Creating [%s] node\n", line); +// { +// struct ACL _CREATE_ONLY_ACL_ACL[] = {{ZOO_PERM_CREATE, ZOO_ANYONE_ID_UNSAFE}}; +// struct ACL_vector CREATE_ONLY_ACL = {1,_CREATE_ONLY_ACL_ACL}; +// rc = zoo_acreate(zh, line, "new", 3, &CREATE_ONLY_ACL, flags, +// my_string_completion, strdup(line)); +// } + rc = zoo_acreate(zh, line, "new", 3, &ZOO_OPEN_ACL_UNSAFE, flags, + my_string_completion_free_data, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "delete ")) { + line += 7; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + if (async) { + rc = zoo_adelete(zh, line, -1, my_void_completion, strdup(line)); + } else { + rc = zoo_delete(zh, line, -1); + } + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "sync ")) { + line += 5; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } + rc = zoo_async(zh, line, my_string_completion_free_data, strdup(line)); + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "wexists ")) { +#ifdef THREADED + struct Stat stat; +#endif + line += 8; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } +#ifndef THREADED + rc = zoo_awexists(zh, line, watcher, (void*) 0, my_stat_completion, strdup(line)); +#else + rc = zoo_wexists(zh, line, watcher, (void*) 0, &stat); +#endif + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (startsWith(line, "exists ")) { +#ifdef THREADED + struct Stat stat; +#endif + line += 7; + if (line[0] != '/') { + fprintf(stderr, "Path must start with /, found: %s\n", line); + return; + } +#ifndef THREADED + rc = zoo_aexists(zh, line, 1, my_stat_completion, strdup(line)); +#else + rc = zoo_exists(zh, line, 1, &stat); +#endif + if (rc) { + fprintf(stderr, "Error %d for %s\n", rc, line); + } + } else if (strcmp(line, "myid") == 0) { + printf("session Id = %llx\n", _LL_CAST_ zoo_client_id(zh)->client_id); + } else if (strcmp(line, "reinit") == 0) { + zookeeper_close(zh); + // we can't send myid to the server here -- zookeeper_close() removes + // the session on the server. We must start anew. + zh = zookeeper_init(hostPort, watcher, 30000, 0, 0, 0); + } else if (startsWith(line, "quit")) { + fprintf(stderr, "Quitting...\n"); + shutdownThisThing=1; + } else if (startsWith(line, "od")) { + const char val[]="fire off"; + fprintf(stderr, "Overdosing...\n"); + rc = zoo_aset(zh, "/od", val, sizeof(val)-1, -1, od_completion, 0); + if (rc) + fprintf(stderr, "od command failed: %d\n", rc); + } else if (startsWith(line, "addauth ")) { + char *ptr; + line += 8; + ptr = strchr(line, ' '); + if (ptr) { + *ptr = '\0'; + ptr++; + } + zoo_add_auth(zh, line, ptr, ptr ? strlen(ptr) : 0, NULL, NULL); + } +} + +int main(int argc, char **argv) { +#ifndef THREADED + fd_set rfds, wfds, efds; + int processed=0; +#endif + char buffer[4096]; + char p[2048]; +#ifdef YCA + char *cert=0; + char appId[64]; +#endif + int bufoff = 0; + FILE *fh; + + if (argc < 2) { + fprintf(stderr, + "USAGE %s zookeeper_host_list [clientid_file|cmd:(ls|ls2|create|od|...)]\n", + argv[0]); + fprintf(stderr, + "Version: ZooKeeper cli (c client) version %d.%d.%d\n", + ZOO_MAJOR_VERSION, + ZOO_MINOR_VERSION, + ZOO_PATCH_VERSION); + return 2; + } + if (argc > 2) { + if(strncmp("cmd:",argv[2],4)==0){ + size_t cmdlen = strlen(argv[2]); + if (cmdlen > sizeof(cmd)) { + fprintf(stderr, + "Command length %zu exceeds max length of %zu\n", + cmdlen, + sizeof(cmd)); + return 2; + } + strncpy(cmd, argv[2]+4, sizeof(cmd)); + batchMode=1; + fprintf(stderr,"Batch mode: %s\n",cmd); + }else{ + clientIdFile = argv[2]; + fh = fopen(clientIdFile, "r"); + if (fh) { + if (fread(&myid, sizeof(myid), 1, fh) != sizeof(myid)) { + memset(&myid, 0, sizeof(myid)); + } + fclose(fh); + } + } + } +#ifdef YCA + strcpy(appId,"yahoo.example.yca_test"); + cert = yca_get_cert_once(appId); + if(cert!=0) { + fprintf(stderr,"Certificate for appid [%s] is [%s]\n",appId,cert); + strncpy(p,cert,sizeof(p)-1); + free(cert); + } else { + fprintf(stderr,"Certificate for appid [%s] not found\n",appId); + strcpy(p,"dummy"); + } +#else + strcpy(p, "dummy"); +#endif + verbose = 0; + zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); + zoo_deterministic_conn_order(1); // enable deterministic order + hostPort = argv[1]; + zh = zookeeper_init(hostPort, watcher, 30000, &myid, 0, 0); + if (!zh) { + return errno; + } + +#ifdef YCA + if(zoo_add_auth(zh,"yca",p,strlen(p),0,0)!=ZOK) + return 2; +#endif + +#ifdef THREADED + while(!shutdownThisThing) { + int rc; + int len = sizeof(buffer) - bufoff -1; + if (len <= 0) { + fprintf(stderr, "Can't handle lines that long!\n"); + exit(2); + } + rc = read(0, buffer+bufoff, len); + if (rc <= 0) { + fprintf(stderr, "bye\n"); + shutdownThisThing=1; + break; + } + bufoff += rc; + buffer[bufoff] = '\0'; + while (strchr(buffer, '\n')) { + char *ptr = strchr(buffer, '\n'); + *ptr = '\0'; + processline(buffer); + ptr++; + memmove(buffer, ptr, strlen(ptr)+1); + bufoff = 0; + } + } +#else + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + while (!shutdownThisThing) { + int fd; + int interest; + int events; + struct timeval tv; + int rc; + zookeeper_interest(zh, &fd, &interest, &tv); + if (fd != -1) { + if (interest&ZOOKEEPER_READ) { + FD_SET(fd, &rfds); + } else { + FD_CLR(fd, &rfds); + } + if (interest&ZOOKEEPER_WRITE) { + FD_SET(fd, &wfds); + } else { + FD_CLR(fd, &wfds); + } + } else { + fd = 0; + } + FD_SET(0, &rfds); + rc = select(fd+1, &rfds, &wfds, &efds, &tv); + events = 0; + if (rc > 0) { + if (FD_ISSET(fd, &rfds)) { + events |= ZOOKEEPER_READ; + } + if (FD_ISSET(fd, &wfds)) { + events |= ZOOKEEPER_WRITE; + } + } + if(batchMode && processed==0){ + //batch mode + processline(cmd); + processed=1; + } + if (FD_ISSET(0, &rfds)) { + int rc; + int len = sizeof(buffer) - bufoff -1; + if (len <= 0) { + fprintf(stderr, "Can't handle lines that long!\n"); + exit(2); + } + rc = read(0, buffer+bufoff, len); + if (rc <= 0) { + fprintf(stderr, "bye\n"); + break; + } + bufoff += rc; + buffer[bufoff] = '\0'; + while (strchr(buffer, '\n')) { + char *ptr = strchr(buffer, '\n'); + *ptr = '\0'; + processline(buffer); + ptr++; + memmove(buffer, ptr, strlen(ptr)+1); + bufoff = 0; + } + } + zookeeper_process(zh, events); + } +#endif + if (to_send!=0) + fprintf(stderr,"Recvd %d responses for %d requests sent\n",recvd,sent); + zookeeper_close(zh); + return 0; +} diff --git a/maintenance/convert_wiki.py b/maintenance/convert_wiki.py new file mode 100644 index 000000000..c78986fc5 --- /dev/null +++ b/maintenance/convert_wiki.py @@ -0,0 +1,129 @@ +import os +import subprocess + +# hardcoded paths +HUNTER_DIR='..' +WIKI_DIR=os.path.join(HUNTER_DIR, '..', 'hunter.wiki') +PACKAGES_DIR=os.path.join(HUNTER_DIR, 'cmake/projects') + +# get all wiki entries +wiki_filenames = [x for x in os.listdir(WIKI_DIR) if x.startswith('pkg.') and x.endswith('.md')] +wiki_entries = [x[4:-3] for x in wiki_filenames] + +# get all hunter package entries +pkg_entries = [x for x in os.listdir(PACKAGES_DIR) if os.path.isdir(os.path.join(PACKAGES_DIR, x))] +pkg_entries_lower = [x.lower() for x in pkg_entries] + +# packages both in hunter and wiki +pkg_match = [x for x in pkg_entries if x.lower() in wiki_entries] +# packages only in hunter +pkg_only_hunter = [x for x in pkg_entries if x not in pkg_match] +# packages only in wiki +pkg_only_wiki = [x for x in wiki_entries if x not in pkg_entries_lower] + +# output directories +packages_dir = 'packages' +pkg_dir = 'packages/pkg' +tmp_dir = 'packages/tmp' +only_hunter_dir = 'packages/only_hunter' +only_wiki_dir = 'packages/only_wiki' + +# create if not exist +for d in [packages_dir, pkg_dir, tmp_dir, only_hunter_dir, only_wiki_dir]: + if not os.path.exists(d): + os.mkdir(d) + +# header for rst files +header_format_string = """.. spelling:: + + {} + +.. _pkg.{}: + +{} +{} + +""" + +template_string = """.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + +""" + +def append_file(f, input_file): + with open(input_file, 'r') as tmp: + for line in tmp.readlines(): + if line.startswith('.. code::'): + if line[9:] == ' yml\n': + line = '.. code-block::' + ' yaml\n' + else: + line = '.. code-block::' + line[9:] + f.write(line) + +# convert matching entries +for entry in pkg_match: + source_md = os.path.join(WIKI_DIR, 'pkg.' + entry.lower() + '.md') + tmp_rst = os.path.join(tmp_dir, entry + '.rst') + target_rst = os.path.join(pkg_dir, entry + '.rst') + + underscores = "=" * len(entry) + header = header_format_string.format(entry, entry, entry, underscores) + #print(header) + cmd = ['pandoc', source_md, '-o', tmp_rst] + print("cmd: ", cmd) + subprocess.call(cmd) + + with open(target_rst, 'w') as f: + f.write(header) + append_file(f, tmp_rst) + +# create dummy entries for packages only in hunter +for entry in pkg_only_hunter: + source_md = os.path.join(WIKI_DIR, 'pkg.' + entry.lower() + '.md') + tmp_rst = os.path.join(tmp_dir, entry + '.rst') + target_rst = os.path.join(only_hunter_dir, entry + '.rst') + + underscores = "=" * len(entry) + header = header_format_string.format(entry, entry, entry, underscores) + #print(header) + + with open(target_rst, 'w') as f: + f.write(header) + f.write(template_string) + +# convert wiki entry, put in extra folder +for entry in pkg_only_wiki: + source_md = os.path.join(WIKI_DIR, 'pkg.' + entry + '.md') + tmp_rst = os.path.join(tmp_dir, entry + '.rst') + target_rst = os.path.join(only_wiki_dir, entry + '.rst') + + underscores = "=" * len(entry) + header = header_format_string.format(entry, entry, entry, underscores) + #print(header) + cmd = ['pandoc', source_md, '-o', tmp_rst] + print("cmd: ", cmd) + subprocess.call(cmd) + + with open(target_rst, 'w') as f: + f.write(header) + f.write("File only available in wiki.\n" + "Please merge with hunter-package entry\n\n") + append_file(f, tmp_rst) + +print("pkg_match entries: ", len(pkg_match)) +print("pkg_only_hunter entries: ", len(pkg_only_hunter)) +print("pkg_only_wiki entries: ", len(pkg_only_wiki)) \ No newline at end of file diff --git a/maintenance/docs_create_missing_stubs.py b/maintenance/docs_create_missing_stubs.py new file mode 100644 index 000000000..2ca73c257 --- /dev/null +++ b/maintenance/docs_create_missing_stubs.py @@ -0,0 +1,78 @@ +import os +import subprocess + +# hardcoded paths +HUNTER_DIR='..' +PACKAGES_DIR=os.path.join(HUNTER_DIR, 'cmake/projects') +DOCS_PKG_DIR=os.path.join(HUNTER_DIR, 'docs', 'packages', 'pkg') + +# get all wiki entries +docs_filenames = [x for x in os.listdir(DOCS_PKG_DIR) if x.endswith('.rst')] +docs_entries = [x[:-4] for x in docs_filenames] + +# get all hunter package entries +pkg_entries = [x for x in os.listdir(PACKAGES_DIR) if os.path.isdir(os.path.join(PACKAGES_DIR, x))] +pkg_entries_lower = [x.lower() for x in pkg_entries] + +# packages both in hunter and wiki +pkg_match = [x for x in pkg_entries if x in docs_entries] +# packages only in hunter +pkg_only_hunter = [x for x in pkg_entries if x not in pkg_match] + +# output directories +packages_dir = 'packages' +only_hunter_dir = 'packages/only_hunter' + +# create if not exist +for d in [packages_dir, only_hunter_dir]: + if not os.path.exists(d): + os.mkdir(d) + +# header for rst files +header_format_string = """.. spelling:: + + {} + +.. index:: unsorted ; {} + +.. _pkg.{}: + +{} +{} +""" + +template_string = """ +.. warning:: + + This page is a template and contains no real information. + Please send pull request with real description. + +- `__FIXME__ Official `__ +- `__FIXME__ Hunterized `__ +- `__FIXME__ Example `__ +- Available since `__FIXME__ vX.Y.Z `__ +- Added by `__FIXME__ `__ (`__FIXME__ pr-N `__) + +.. code-block:: cmake + + hunter_add_package(__FIXME__) + find_package(__FIXME__ CONFIG REQUIRED) + target_link_libraries(foo __FIXME__::__FIXME__) + +""" + + +# create dummy entries for packages only in hunter +for entry in pkg_only_hunter: + target_rst = os.path.join(only_hunter_dir, entry + '.rst') + + underscores = "=" * len(entry) + header = header_format_string.format(entry, entry, entry, entry, underscores) + #print(header) + + with open(target_rst, 'w') as f: + f.write(header) + f.write(template_string) + +print("pkg_match entries: ", len(pkg_match)) +print("pkg_only_hunter entries: ", len(pkg_only_hunter)) diff --git a/maintenance/download_package_for_server.sh b/maintenance/download_package_for_server.sh new file mode 100755 index 000000000..d28d48950 --- /dev/null +++ b/maintenance/download_package_for_server.sh @@ -0,0 +1,145 @@ +#!/bin/bash +set -e # exit on error + +function print_synopsis { + echo "$0 [options]" + echo " -h, --help print this help message and exit." + echo " --URL original URL to download from" + echo " --SHA1 SHA1 of the archive to download" + echo " --PACKAGE name of the package to download" + echo " --VERSION version of the package to download" + echo " -o,--output-dir output directory to create structure and download file into" +} + +# https://stackoverflow.com/a/14203146 +# Use -gt 1 to consume two arguments per pass in the loop (e.g. each +# argument has a corresponding value to go with it). +# Use -gt 0 to consume one or more arguments per pass in the loop (e.g. +# some arguments don't have a corresponding value to go with it such +# as in the --default example). +# note: if this is set to -gt 0 the /etc/hosts part is not recognized ( may be a bug ) +while [[ $# -gt 0 ]] +do + key="$1" +case $key in + -h|--help) + print_synopsis + exit 0 + ;; + --URL) + if [[ $# -lt 2 ]]; then + echo "'$key' needs one argument" + echo "" + print_synopsis + exit 1 + fi + pkg_url="$2" + shift # past argument + ;; + --SHA1) + if [[ $# -lt 2 ]]; then + echo "'$key' needs one argument" + echo "" + print_synopsis + exit 1 + fi + pkg_sha1="$2" + shift # past argument + ;; + --PACKAGE) + if [[ $# -lt 2 ]]; then + echo "'$key' needs one argument" + echo "" + print_synopsis + exit 1 + fi + pkg_name="$2" + shift # past argument + ;; + --VERSION) + if [[ $# -lt 2 ]]; then + echo "'$key' needs one argument" + echo "" + print_synopsis + exit 1 + fi + pkg_version="$2" + shift # past argument + ;; + -o|--output-dir) + if [[ $# -lt 2 ]]; then + echo "'$key' needs one argument" + echo "" + print_synopsis + exit 1 + fi + output_dir="$2" + shift # past argument + ;; + *) + # unknown option + echo "error: unknown option '$key'" + echo "" + print_synopsis + exit 1 + ;; +esac +shift # past argument or value +done + +# check for mandatory parameter +if [ -z ${pkg_url+x} ]; then + echo "parameter '--URL' is mandatory" + echo "" + print_synopsis + exit 1 +fi +if [ -z ${pkg_sha1+x} ]; then + echo "parameter '--SHA1' is mandatory" + echo "" + print_synopsis + exit 1 +fi +if [ -z ${pkg_name+x} ]; then + echo "parameter '--PACKAGE' is mandatory" + echo "" + print_synopsis + exit 1 +fi +if [ -z ${pkg_version+x} ]; then + echo "parameter '--VERSION' is mandatory" + echo "" + print_synopsis + exit 1 +fi + +# if output directory is set check if it exists +if [ ! -z ${output_dir+x} ]; then + if [ ! -d "${output_dir}" ]; then + echo "output directory does not exist: \"${output_dir}\"" + exit 1 + fi + # let output dir end with / + case ${output_dir} in + */) + # echo "all good, nothing to do" + ;; + *) + output_dir="${output_dir}/" + ;; + esac +fi + +# show every executed command +set -x + +# use first 7 characters of SHA1 as archive-ID +pkg_archive_id="${pkg_sha1:0:7}" +# define directory structure +pkg_target_structure="${output_dir}${pkg_name}/${pkg_version}/${pkg_archive_id}" +# extract filename from download URL +pkg_target_filename=$(basename "$pkg_url" | sed -e 's/[!@#$%^&*?]/_/g') + +mkdir -p "$pkg_target_structure" +wget "$pkg_url" -O "${pkg_target_structure}/${pkg_target_filename}" --no-check-certificate + diff --git a/maintenance/graphs/module_dependencies2dot.sh b/maintenance/graphs/module_dependencies2dot.sh new file mode 100755 index 000000000..95e3ecf11 --- /dev/null +++ b/maintenance/graphs/module_dependencies2dot.sh @@ -0,0 +1,154 @@ +#!/bin/bash +set -e + +#################### +# global variables # +#################### + +# to keep the graph simple the following modules are omited +excluded_modules=( + hunter_status_print + hunter_status_debug + hunter_user_error + hunter_internal_error + hunter_fatal_error + hunter_wiki + hunter_assert_not_empty_string +) + +# array of already processed modules +processed_modules=() + + +############# +# functions # +############# + +# function to print usage message +function print_usage() { + echo "Usage:" + echo "${1} module-file" + echo " module-file ... module file to parse (assumed to end with .cmake)" +} + + +# check if a given module is already processed +function is_processed_module { + local _mod="$1" + local is_processed=1 #false + for proc_mod in "${processed_modules[@]}" + do + #echo "compare ${proc_mod} with ${_mod}" + if [ "$proc_mod" == "${_mod}" ]; then + local is_processed=0 #true + break + fi + done + return $is_processed +} + +# check if a given module is one of the excluded ones +function is_excluded_module { + #return 1 + local _mod="$1" + local is_excluded=1 #false + for excluded in "${excluded_modules[@]}" + do + if [ "$excluded" == "${_mod}" ]; then + local is_excluded=0 #true + break + fi + done + return $is_excluded +} + +# recursively (DFS) print module dependencies +function print_dependencies { + local _mod="$1" + local _mod_dir="$2" + local _mod_file="${_mod_dir}/${_mod}.cmake" + #echo "processing: ${_mod}" + + # don't print excluded modules + if is_excluded_module ${_mod} ; then + return + fi + + # stop recursion if module was printed before + if is_processed_module ${_mod} ; then + return + fi + + # add current module to proccessed modules + processed_modules+=($_mod) + + # list of included hunter modules + local all_deps=$(awk -F'[()]' '/^include\(hunter_/ {print $2;}' "${_mod_file}") + + # print module dependencies + local dep_printed=false + for dep in ${all_deps[@]} + do + if ! is_excluded_module ${dep} ; then + echo " ${_mod} -> ${dep}" + local dep_printed=true + # recurse deeper + print_dependencies ${dep} "${_mod_dir}" + fi + done + # if module is a leaf (no dependencies) just print the node itself + if [ "${dep_printed}" = false ]; then + echo " ${_mod}" + fi +} + + +######## +# main # +######## + +# module file is mandatory +if [ -z "$1" ]; then + echo "argument error: module-file is mandatory!" + print_usage $0 + exit 1 +fi + +# modules dir +modules_dir=$(dirname "$1") +# module filename +root_module_file=$(basename "$1") + +# module to process +root_module="${root_module_file%.cmake}" + +# subdirectories to keep working dir clean +DOT_DIR="_dot" +PNG_DIR="_png" +# base name of files to create +dot_basename="dep_graph_${root_module}" +# name of dot-file to create +DOT_FILE="${DOT_DIR}/${dot_basename}.dot" +# name of png-file to create +PNG_FILE="${PNG_DIR}/${dot_basename}.png" + +# create subdirs if needed +if [ ! -d "${DOT_DIR}" ]; then + mkdir "${DOT_DIR}" +fi +if [ ! -d "${PNG_DIR}" ]; then + mkdir "${PNG_DIR}" +fi + +# process root module and print output into dot-file +( +echo "digraph dep_graph_${root_module} {" +print_dependencies ${root_module} "${modules_dir}" +echo "}" +) > "${DOT_FILE}" + +# convert created dot-file to png +echo "convert dotfile to png" +dot -Tpng ${DOT_FILE} -o ${PNG_FILE} +echo "done" + diff --git a/maintenance/graphs/modules2dot.sh b/maintenance/graphs/modules2dot.sh new file mode 100755 index 000000000..d5ce564e4 --- /dev/null +++ b/maintenance/graphs/modules2dot.sh @@ -0,0 +1,121 @@ +#!/bin/bash +set -e + +#################### +# global variables # +#################### + +# subdirectories to keep working dir clean +DOT_DIR="_dot" +PNG_DIR="_png" +# base name of files to create +dot_basename="modules" +# name of dot-file to create +DOT_FILE="${DOT_DIR}/${dot_basename}.dot" +# name of png-file to create +PNG_FILE="${PNG_DIR}/${dot_basename}.png" + +# to keep the graph simple the following modules are omited +excluded_modules=( + hunter_status_print + hunter_status_debug + hunter_print_cmd + hunter_user_error + hunter_internal_error + hunter_fatal_error + hunter_wiki + hunter_assert_not_empty_string + hunter_assert_empty_string + hunter_lock_directory + hunter_make_directory + hunter_sleep_before_download +) + + +############# +# functions # +############# + +# function to print usage message +function print_usage() { + echo "Usage:" + echo "${1} module-dir" + echo " module-dir ... path to folder which contains hunter module files (for example ../../cmake/modules)" +} + +# check if a given module is one of the excluded ones +function is_excluded_module { + #return 1 + local _mod="$1" + local is_excluded=1 #false + for excluded in "${excluded_modules[@]}" + do + if [ "$excluded" == "${_mod}" ]; then + local is_excluded=0 #true + break + fi + done + return $is_excluded +} + + +######## +# main # +######## + +# module directory is mandatory +if [ -z "$1" ]; then + echo "argument error: module-dir is mandatory!" + print_usage $0 + exit 1 +fi + +# modules dir +modules_dir="$1" + +# create subdirs if needed +if [ ! -d "${DOT_DIR}" ]; then + mkdir "${DOT_DIR}" +fi +if [ ! -d "${PNG_DIR}" ]; then + mkdir "${PNG_DIR}" +fi + +echo "digraph hunter_modules {" > ${DOT_FILE} +hunter_modules="${modules_dir}/hunter_*.cmake" +echo "expanding ${hunter_modules}" +for mod_file_full in $hunter_modules +do + # module filename + mod_file=$(basename "$mod_file_full") + # module name + module="${mod_file%.cmake}" + echo "process module: ${module}" + + # don't draw excluded modules + if is_excluded_module ${module} ; then + continue + fi + + # list of included hunter modules + all_deps=$(awk -F'[()]' '/^include\(hunter_/ {print $2;}' "${modules_dir}/${mod_file}") + + # print module dependencies + dep_printed=false + for dep in ${all_deps[@]} + do + if ! is_excluded_module ${dep} ; then + echo " ${module} -> ${dep}" >> "${DOT_FILE}" + dep_printed=true + fi + done + # if module has no dependencies just print the module itself + if [ "${dep_printed}" = false ]; then + echo " ${module}" >> "${DOT_FILE}" + fi +done +echo "}" >> ${DOT_FILE} + +echo "convert dotfile to png" +dot -Tpng ${DOT_FILE} -o ${PNG_FILE} +echo "done" diff --git a/maintenance/local-upload/llvm/linux/gcc.sh b/maintenance/local-upload/llvm/linux/gcc.sh new file mode 100755 index 000000000..a0c3ccebe --- /dev/null +++ b/maintenance/local-upload/llvm/linux/gcc.sh @@ -0,0 +1,18 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=gcc +PROJECT_DIR=examples/LLVM ./jenkins.py --clear-except-download --upload +# } + +echo "Done" diff --git a/maintenance/local-upload/llvm/osx/run-osx-10-11-make.sh b/maintenance/local-upload/llvm/osx/run-osx-10-11-make.sh new file mode 100755 index 000000000..58e81a85b --- /dev/null +++ b/maintenance/local-upload/llvm/osx/run-osx-10-11-make.sh @@ -0,0 +1,18 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=osx-10-11-make # same as 'libcxx' on Travis +PROJECT_DIR=examples/LLVM ./jenkins.py --clear-except-download --upload +# } + +echo "Done" diff --git a/maintenance/local-upload/llvm/win/run-win-vs-14-2015-sdk-8-1.bat b/maintenance/local-upload/llvm/win/run-win-vs-14-2015-sdk-8-1.bat new file mode 100644 index 000000000..266871724 --- /dev/null +++ b/maintenance/local-upload/llvm/win/run-win-vs-14-2015-sdk-8-1.bat @@ -0,0 +1,5 @@ +REM { +set TOOLCHAIN=vs-14-2015-sdk-8-1 +set PROJECT_DIR=examples/LLVM +.\jenkins.py --upload --clear-except-download || exit /b 1 +REM } diff --git a/maintenance/local-upload/opencv/ios-nocodesign-11-4-dep-9-3-arm64.sh b/maintenance/local-upload/opencv/ios-nocodesign-11-4-dep-9-3-arm64.sh new file mode 100755 index 000000000..e626a8535 --- /dev/null +++ b/maintenance/local-upload/opencv/ios-nocodesign-11-4-dep-9-3-arm64.sh @@ -0,0 +1,16 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../.." + +# { +export TOOLCHAIN=ios-nocodesign-11-4-dep-9-3-arm64 +PROJECT_DIR=examples/OpenCV-extra ./jenkins.py --clear-except-download --upload +# } diff --git a/maintenance/local-upload/opencv/ios-nocodesign-11-4-dep-9-3-armv7.sh b/maintenance/local-upload/opencv/ios-nocodesign-11-4-dep-9-3-armv7.sh new file mode 100755 index 000000000..e90189461 --- /dev/null +++ b/maintenance/local-upload/opencv/ios-nocodesign-11-4-dep-9-3-armv7.sh @@ -0,0 +1,16 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../.." + +# { +export TOOLCHAIN=ios-nocodesign-11-4-dep-9-3-armv7 +PROJECT_DIR=examples/OpenCV-extra ./jenkins.py --clear-except-download --upload +# } diff --git a/maintenance/local-upload/qt/linux/android.sh b/maintenance/local-upload/qt/linux/android.sh new file mode 100755 index 000000000..a7abd2652 --- /dev/null +++ b/maintenance/local-upload/qt/linux/android.sh @@ -0,0 +1,22 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } +[ "${ANDROID_NDK_r16b}" = "" ] && { echo "ANDROID_NDK_r16b is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=android-ndk-r16b-api-24-arm64-v8a-clang-libcxx14 +PROJECT_DIR=examples/qt-widgets ./jenkins.py --clear-except-download +PROJECT_DIR=examples/qt-camera ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-qml ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-location ./jenkins.py --upload --nocreate +# } + +echo "Done" diff --git a/maintenance/local-upload/qt/linux/clang.sh b/maintenance/local-upload/qt/linux/clang.sh new file mode 100755 index 000000000..6664f1a36 --- /dev/null +++ b/maintenance/local-upload/qt/linux/clang.sh @@ -0,0 +1,21 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=clang-cxx17 +PROJECT_DIR=examples/qt-widgets ./jenkins.py --clear-except-download +PROJECT_DIR=examples/qt-qml ./jenkins.py --nocreate +# PROJECT_DIR=examples/qt-location ./jenkins.py --nocreate # Broken (see .travis.yml) +PROJECT_DIR=examples/qt-camera ./jenkins.py --upload --nocreate +# } + +echo "Done" diff --git a/maintenance/local-upload/qt/linux/gcc.sh b/maintenance/local-upload/qt/linux/gcc.sh new file mode 100755 index 000000000..d9f73678e --- /dev/null +++ b/maintenance/local-upload/qt/linux/gcc.sh @@ -0,0 +1,21 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=gcc-7-cxx17 +PROJECT_DIR=examples/qt-widgets ./jenkins.py --clear-except-download +PROJECT_DIR=examples/qt-camera ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-qml ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-location ./jenkins.py --upload --nocreate +# } + +echo "Done" diff --git a/maintenance/local-upload/qt/osx/ios.sh b/maintenance/local-upload/qt/osx/ios.sh new file mode 100755 index 000000000..fbee1c86a --- /dev/null +++ b/maintenance/local-upload/qt/osx/ios.sh @@ -0,0 +1,19 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=ios-nocodesign-11-2-dep-9-3-armv7 +PROJECT_DIR=examples/qt-widgets ./jenkins.py --clear-except-download +PROJECT_DIR=examples/qt-camera ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-qml ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-location ./jenkins.py --upload --nocreate +# } diff --git a/maintenance/local-upload/qt/osx/osx-make.sh b/maintenance/local-upload/qt/osx/osx-make.sh new file mode 100755 index 000000000..5ba429733 --- /dev/null +++ b/maintenance/local-upload/qt/osx/osx-make.sh @@ -0,0 +1,21 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=osx-10-13-make-cxx14 +PROJECT_DIR=examples/qt-widgets ./jenkins.py --clear-except-download +PROJECT_DIR=examples/qt-camera ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-qml ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-location ./jenkins.py --upload --nocreate +# } + +echo "Done" diff --git a/maintenance/local-upload/qt/osx/osx.sh b/maintenance/local-upload/qt/osx/osx.sh new file mode 100755 index 000000000..b57e9de77 --- /dev/null +++ b/maintenance/local-upload/qt/osx/osx.sh @@ -0,0 +1,21 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=osx-10-13-cxx14 +PROJECT_DIR=examples/qt-widgets ./jenkins.py --clear-except-download +PROJECT_DIR=examples/qt-camera ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-qml ./jenkins.py --nocreate +PROJECT_DIR=examples/qt-location ./jenkins.py --upload --nocreate +# } + +echo "Done" diff --git a/maintenance/local-upload/qt/win/run-win-mingw.bat b/maintenance/local-upload/qt/win/run-win-mingw.bat new file mode 100644 index 000000000..e65990fbb --- /dev/null +++ b/maintenance/local-upload/qt/win/run-win-mingw.bat @@ -0,0 +1,13 @@ +REM { +set TOOLCHAIN=mingw-cxx17 +set PROJECT_DIR=examples/qt-widgets +.\jenkins.py --clear-except-download || exit /b 1 +set PROJECT_DIR=examples/qt-core +.\jenkins.py --nocreate || exit /b 1 +set PROJECT_DIR=examples/qt-qml +.\jenkins.py --nocreate || exit /b 1 +set PROJECT_DIR=examples/qt-location +.\jenkins.py --nocreate || exit /b 1 +set PROJECT_DIR=examples/qt-camera +.\jenkins.py --upload --nocreate || exit /b 1 +REM } diff --git a/maintenance/local-upload/qt/win/run-win-vs-14-2015-sdk-8-1.bat b/maintenance/local-upload/qt/win/run-win-vs-14-2015-sdk-8-1.bat new file mode 100644 index 000000000..77be08fc7 --- /dev/null +++ b/maintenance/local-upload/qt/win/run-win-vs-14-2015-sdk-8-1.bat @@ -0,0 +1,13 @@ +REM { +set TOOLCHAIN=vs-14-2015-sdk-8-1 +set PROJECT_DIR=examples/qt-widgets +.\jenkins.py --clear-except-download || exit /b 1 +set PROJECT_DIR=examples/qt-core +.\jenkins.py --nocreate || exit /b 1 +set PROJECT_DIR=examples/qt-qml +.\jenkins.py --nocreate || exit /b 1 +set PROJECT_DIR=examples/qt-location +.\jenkins.py --nocreate || exit /b 1 +set PROJECT_DIR=examples/qt-camera +.\jenkins.py --upload --nocreate || exit /b 1 +REM } diff --git a/maintenance/local-upload/urho3d/osx/ios.sh b/maintenance/local-upload/urho3d/osx/ios.sh new file mode 100755 index 000000000..3acec5502 --- /dev/null +++ b/maintenance/local-upload/urho3d/osx/ios.sh @@ -0,0 +1,16 @@ +#!/bin/bash -e + +set -x + +[ "${GITHUB_USER_PASSWORD}" = "" ] && { echo "GITHUB_USER_PASSWORD is not set"; exit 1; } + +export GITHUB_USER_PASSWORD + +THIS_SCRIPT_DIR=`dirname "${BASH_SOURCE[0]}"` + +cd "${THIS_SCRIPT_DIR}/../../../.." + +# { +export TOOLCHAIN=ios-nocodesign-10-3 +PROJECT_DIR=examples/Urho3D ./jenkins.py --clear-except-download --upload +# } diff --git a/maintenance/upload-password-template.cmake b/maintenance/upload-password-template.cmake new file mode 100644 index 000000000..9afd12fb6 --- /dev/null +++ b/maintenance/upload-password-template.cmake @@ -0,0 +1,6 @@ +hunter_upload_password( + REPO_OWNER "ingenue" + REPO "hunter-cache" + USERNAME "ingenue" + PASSWORD "$ENV{GITHUB_USER_PASSWORD}" +) diff --git a/scripts/append-boost-config-macros.cmake.in b/scripts/append-boost-config-macros.cmake.in new file mode 100644 index 000000000..38909c731 --- /dev/null +++ b/scripts/append-boost-config-macros.cmake.in @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.0) + +# run at the boost source root +set(boost_user_config_file "boost/config/user.hpp") + +foreach(s @BOOST_CONFIG_MACROS@) + unset(append_str) + if("${s}" MATCHES "^([^=]+)=(.+)" ) + set(append_str "#define ${CMAKE_MATCH_1} ${CMAKE_MATCH_2}") + else() + set(append_str "#define ${s}") + endif() + if(append_str) + message("-- append '${append_str}' to '${boost_user_config_file}'") + file(APPEND "${boost_user_config_file}" "\n${append_str}\n") + endif() +endforeach() diff --git a/scripts/clean-boost-configs.cmake b/scripts/clean-boost-configs.cmake new file mode 100644 index 000000000..c61083501 --- /dev/null +++ b/scripts/clean-boost-configs.cmake @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.2) + +if("${installdir}" STREQUAL "") + message(FATAL_ERROR "installdir is empty") +endif() + +if(NOT EXISTS "${installdir}") + message(FATAL_ERROR "installdir doesn't exist") +endif() + +if(NOT IS_DIRECTORY "${installdir}") + message(FATAL_ERROR "installdir is not a directory") +endif() + +file( + GLOB_RECURSE + configs_to_remove + "${installdir}/lib/cmake/Boost-*/BoostConfig.cmake" +) + +foreach(file_to_remove ${configs_to_remove}) + file(REMOVE "${file_to_remove}") +endforeach() diff --git a/scripts/find_python.cmake b/scripts/find_python.cmake new file mode 100644 index 000000000..95e30034a --- /dev/null +++ b/scripts/find_python.cmake @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.0) + +find_package(PythonInterp 3 QUIET) + +if(NOT PYTHONINTERP_FOUND) + message(FATAL_ERROR "Python not found") +endif() + +message(${PYTHON_EXECUTABLE}) diff --git a/scripts/link-all.cmake b/scripts/link-all.cmake new file mode 100644 index 000000000..f39ac1e38 --- /dev/null +++ b/scripts/link-all.cmake @@ -0,0 +1,106 @@ +cmake_minimum_required(VERSION 3.0) + +string(COMPARE EQUAL "${HUNTER_INSTALL_PREFIX}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "HUNTER_INSTALL_PREFIX is empty") +endif() + +if(NOT EXISTS "${HUNTER_INSTALL_PREFIX}") + message(FATAL_ERROR "Directory not exists: ${HUNTER_INSTALL_PREFIX}") +endif() + +string(COMPARE EQUAL "${LIST_OF_FILES}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "LIST_OF_FILES is empty") +endif() + +if(NOT EXISTS "${LIST_OF_FILES}") + message(FATAL_ERROR "File not exists: ${LIST_OF_FILES}") +endif() + +string(COMPARE EQUAL "${SHELL_LINK_SCRIPT}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "SHELL_LINK_SCRIPT is empty") +endif() + +if(NOT EXISTS "${SHELL_LINK_SCRIPT}") + message(FATAL_ERROR "File not exists: ${SHELL_LINK_SCRIPT}") +endif() + +string(COMPARE EQUAL "${CELLAR_RAW_DIRECTORY}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "CELLAR_RAW_DIRECTORY is empty") +endif() + +if(NOT EXISTS "${CELLAR_RAW_DIRECTORY}") + message(FATAL_ERROR "Directory not found: ${CELLAR_RAW_DIRECTORY}") +endif() + +string(COMPARE EQUAL "${PYTHON_LINK_SCRIPT}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "PYTHON_LINK_SCRIPT is empty") +endif() + +if(NOT EXISTS "${PYTHON_LINK_SCRIPT}") + message(FATAL_ERROR "File not exists: ${PYTHON_LINK_SCRIPT}") +endif() + +find_package(PythonInterp 3 QUIET) +if(PYTHONINTERP_FOUND) + message("Link files using Python: ${PYTHON_EXECUTABLE}") + set( + cmd + "${PYTHON_EXECUTABLE}" + "${PYTHON_LINK_SCRIPT}" + "--list" + "${LIST_OF_FILES}" + "--cellar" + "${CELLAR_RAW_DIRECTORY}" + "--dest" + "${HUNTER_INSTALL_PREFIX}" + ) + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${CELLAR_RAW_DIRECTORY}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + ) + if(NOT result EQUAL 0) + message( + WARNING + "Python script failed: ${cmd}, ${result}, ${output}, ${error}" + "(may help: https://stackoverflow.com/a/2009505/2288008)" + ) + else() + return() + endif() +endif() + +set(shell "/bin/bash") +if(EXISTS "${shell}") + message("Link files using shell: ${shell}") + set(cmd "${shell}" "${SHELL_LINK_SCRIPT}" "${HUNTER_INSTALL_PREFIX}") + execute_process( + COMMAND ${cmd} + WORKING_DIRECTORY "${CELLAR_RAW_DIRECTORY}" + RESULT_VARIABLE result + OUTPUT_VARIABLE output + ERROR_VARIABLE error + ) + if(NOT result EQUAL 0) + message( + FATAL_ERROR + "Shell script failed: ${cmd}, ${result}, ${output}, ${error}" + ) + endif() + return() +endif() + +message("Copy files") +file(STRINGS "${LIST_OF_FILES}" files) +foreach(x ${files}) + set(full_dst_path "${HUNTER_INSTALL_PREFIX}/${x}") + get_filename_component(dst_dir "${full_dst_path}" DIRECTORY) + file(COPY "${CELLAR_RAW_DIRECTORY}/${x}" DESTINATION "${dst_dir}") +endforeach() diff --git a/scripts/link-all.py b/scripts/link-all.py new file mode 100644 index 000000000..737ccba4e --- /dev/null +++ b/scripts/link-all.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 + +import argparse +import os +import sys +import multiprocessing + +parser = argparse.ArgumentParser(description='File link script') + +parser.add_argument('--list', required=True) +parser.add_argument('--cellar', required=True) +parser.add_argument('--dest', required=True) + +cmd_args = parser.parse_args() + +src_list = [] +with open(cmd_args.list, 'r') as f: + for line in f: + src_list.append(line.strip()) + +list_len = len(src_list) +proc_num = multiprocessing.cpu_count() +files_per_job = list_len // proc_num + +def job(job_index): + try: + begin_ind = files_per_job * job_index + end_ind = files_per_job * (job_index + 1) + last_job = (job_index == proc_num - 1) + if last_job: + end_ind = list_len + for i in range(begin_ind, end_ind): + filename = src_list[i] + link_from = os.path.join(cmd_args.cellar, filename) + link_to = os.path.join(cmd_args.dest, filename) + os.link(link_from, link_to) + return 0 + except Exception as exc: + print('Exception caught: {}'.format(exc)) + return 1 + +def run_link(): + pool = multiprocessing.Pool(processes=proc_num) + result = pool.map(job, range(proc_num)) + pool.close() + pool.join() + + if 1 in result: + sys.exit('Some job failed') + +if __name__ == '__main__': + run_link() diff --git a/scripts/pkgconfig-export-targets.cmake.in b/scripts/pkgconfig-export-targets.cmake.in new file mode 100644 index 000000000..9dc099fe8 --- /dev/null +++ b/scripts/pkgconfig-export-targets.cmake.in @@ -0,0 +1,22 @@ +# ---------------------------------------------------------------------- +# Auto creation of CMake targets from pkg-config +# +# Copyright (C) 2017 Alexandre Pretyman. All rights reserved. +# +# ---------------------------------------------------------------------- + +include(hunter_pkgconfig_export_target) + +hunter_pkgconfig_export_target("@PKG_CONFIG_MODULE@" "@PKG_GENERATE_SHARED@") + +foreach(_hunter_deps @DEPENDS_ON_PACKAGES@) + find_package("${_hunter_deps}" CONFIG REQUIRED) + + set_property( + TARGET + "PkgConfig::@PKG_CONFIG_MODULE@" + APPEND + PROPERTY + INTERFACE_LINK_LIBRARIES "PkgConfig::${_hunter_deps}" + ) +endforeach() diff --git a/scripts/upload-cache-to-github.py b/scripts/upload-cache-to-github.py new file mode 100755 index 000000000..390aeef0b --- /dev/null +++ b/scripts/upload-cache-to-github.py @@ -0,0 +1,598 @@ +#!/usr/bin/env python3 +from __future__ import print_function + +import argparse +import hashlib +import json +import os +import requests +import sys +import time + +if os.getenv('HUNTER_GIT_EXECUTABLE'): + os.environ["GIT_PYTHON_GIT_EXECUTABLE"] = os.getenv('HUNTER_GIT_EXECUTABLE') + +try: + import git +except ImportError as exc: + print("Import failed with error: {}".format(exc)) + print("Possible fixes:") + print(" * Install gitpython module: 'pip install gitpython'") + print(" * Set environment variable HUNTER_GIT_EXECUTABLE") + sys.exit(1) + +class Error(Exception): + pass + +def sleep_time(attempt): + if attempt <= 0: + raise Exception('Unexpected') + if attempt == 1: + return 0 + if attempt == 2: + return 15 + if attempt == 3: + return 60 + if attempt == 4: + return 90 + if attempt == 5: + return 300 + return 1200 + +def retry(func_in): + def func_out(*args, **kwargs): + retry_max = 10 + i = 0 + while True: + i = i + 1 + try: + return func_in(*args, **kwargs) + except Error as err: + # Treat Errors as fatal and do not retry. + # Also explicitly flush message to avoid "no output" issue on some CIs. + print('Error:\n {}'.format(err)) + sys.stdout.flush() + raise err + except Exception as exc: + if i > retry_max: + raise exc + print('Operation failed. Exception:\n {}'.format(exc)) + sec = sleep_time(i) + print('Retry #{} (of {}) after {} seconds'.format(i, retry_max, sec)) + sys.stdout.flush() + time.sleep(sec) + return func_out + +class Github: + def __init__(self, username, password, repo_owner, repo): + self.repo_owner = repo_owner + self.repo = repo + self.username = username + self.password = password + self.auth = requests.auth.HTTPBasicAuth(username, password) + self.simple_request() + + @retry + def simple_request(self): + print('Processing simple request') + r = requests.get('https://api.github.com', auth=self.auth) + if not r.ok: + sys.exit('Simple request fails. Check your password.') + + limit = int(r.headers['X-RateLimit-Remaining']) + print('GitHub Limit: {}'.format(limit)) + if limit == 0: + raise Exception('GitHub limit is 0') + print('Simple request pass') + + @retry + def get_release_by_tag(self, tagname): + print('Get release-id by tag `{}`'.format(tagname)) + # https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name + # GET /repos/:owner/:repo/releases/tags/:tag + + url = 'https://api.github.com/repos/{}/{}/releases/tags/{}'.format( + self.repo_owner, + self.repo, + tagname + ) + + r = requests.get(url, auth=self.auth) + if r.status_code == 404: + # Create release if not exists + # https://developer.github.com/v3/repos/releases/#create-a-release + # POST /repos/:owner/:repo/releases + + post_url = 'https://api.github.com/repos/{}/{}/releases'.format( + self.repo_owner, + self.repo, + ) + tag_data = "{" + '"tag_name": "{}"'.format(tagname) + "}" + r = requests.post(post_url, data=tag_data, auth=self.auth) + repo_name = "https://github.com/{}/{}".format( + self.repo_owner, self.repo + ) + if r.status_code == 404: + raise Error( + "Repository not found '{}' or user '{}' has no access to it". + format(repo_name, self.username) + ) + if r.status_code == 422: + raise Error( + "Please create at least one file in repository '{}'". + format(repo_name) + ) + if not r.status_code == 201: + raise Error("Unexpected status code: {}".format(r.status_code)) + if not r.ok: + raise Error("Can't create release tag {}".format(tagname)) + r = requests.get(url, auth=self.auth) + + if not r.ok: + raise Exception( + 'Get release id failed. Status code: {}. Requested url: {}'.format( + r.status_code, url)) + + release_id = r.json()['id'] + upload_url = r.json()['upload_url'] + uri_template_vars = '{?name,label}' + if uri_template_vars not in upload_url: + raise Exception('Unsupported upload URI template: {}'.format(upload_url)) + upload_url = upload_url.replace(uri_template_vars, '?name={}') + print('Release id: {}'.format(release_id)) + print('Upload URL: {}'.format(upload_url)) + return release_id, upload_url + + @retry + def find_asset_id_by_name(self, release_id, name): + # https://developer.github.com/v3/repos/releases/#list-assets-for-a-release + # GET /repos/:owner/:repo/releases/:id/assets + + page_number = 1 + keep_searching = True + + while keep_searching: + url = 'https://api.github.com/repos/{}/{}/releases/{}/assets?page={}'.format( + self.repo_owner, + self.repo, + release_id, + page_number + ) + + print('Requesting URL: {}'.format(url)) + r = requests.get(url, auth=self.auth) + if not r.ok: + raise Exception('Getting list of assets failed. Requested url: {}'.format(url)) + + json = r.json() + + for x in json: + if name == x['name']: + return x['id'] + + if not json: + keep_searching = False + + page_number = page_number + 1 + + return None + + @retry + def delete_asset_by_id(self, asset_id, asset_name): + # https://developer.github.com/v3/repos/releases/#delete-a-release-asset + # DELETE /repos/:owner/:repo/releases/assets/:id + + url = 'https://api.github.com/repos/{}/{}/releases/assets/{}'.format( + self.repo_owner, + self.repo, + asset_id + ) + + r = requests.delete(url, auth=self.auth) + if r.status_code == 204: + print('Asset removed: {}'.format(asset_name)) + else: + raise Exception('Deletion of asset failed: {}'.format(asset_name)) + + def delete_asset_if_exists(self, release_id, asset_name): + asset_id = self.find_asset_id_by_name(release_id, asset_name) + if not asset_id: + print('Asset not exists: {}'.format(asset_name)) + return + self.delete_asset_by_id(asset_id, asset_name) + + def upload_bzip_once(self, url, local_path): + headers = {'Content-Type': 'application/x-bzip2'} + file_to_upload = open(local_path, 'rb') + r = requests.post(url, data=file_to_upload, headers=headers, auth=self.auth) + if not r.ok: + raise Exception('Upload of file failed') + + @retry + def upload_bzip(self, url, local_path, release_id, asset_name): + print('Uploading:\n {}\n -> {}'.format(local_path, url)) + try: + self.upload_bzip_once(url, local_path) + except Exception as exc: + print('Exception catched while uploading, removing asset...') + self.delete_asset_if_exists(release_id, asset_name) + raise exc + + def upload_raw_file(self, local_path): + asset_name = hashlib.sha1(open(local_path, 'rb').read()).hexdigest() + + tagname = 'cache-{}'.format(asset_name[0:7]) + asset_name = asset_name + '.tar.bz2' + + release_id, upload_url = self.get_release_by_tag(tagname) + + # https://developer.github.com/v3/repos/releases/#upload-a-release-asset + # POST to upload_url received in the release description + # in get_release_by_tag() + + url = upload_url.format(asset_name) + self.upload_bzip(url, local_path, release_id, asset_name) + +class CacheEntry: + def __init__(self, cache_done_path, cache_dir): + self.cache_dir = cache_dir + self.cache_raw = os.path.join(self.cache_dir, 'raw') + self.cache_done_path = cache_done_path + if not os.path.exists(cache_done_path): + raise Exception('File not exists: {}'.format(cache_done_path)) + self.cache_done_dir = os.path.dirname(self.cache_done_path) + self.from_server = os.path.join(self.cache_done_dir, 'from.server') + self.cache_sha1 = os.path.join(self.cache_done_dir, 'cache.sha1') + + def entry_from_server(self): + return os.path.exists(self.from_server) + + def upload_raw(self, github): + sha1 = open(self.cache_sha1, 'r').read() + if sha1 == '': + sys.exit('File with no content: {}'.format(self.cache_sha1)) + raw = os.path.join(self.cache_raw, sha1 + '.tar.bz2') + if os.path.exists(raw): + github.upload_raw_file(raw) + + # else: + # FIXME (old GitHub API upload): https://travis-ci.org/ingenue/hunter/jobs/347888167 + # New Git-based upload: 'from.server' not present for old cache + + def touch_from_server(self): + open(self.from_server, 'w') + +class Cache: + def __init__(self, cache_dir): + self.cache_meta = os.path.join(cache_dir, 'meta') + self.repo = git.Repo.init(self.cache_meta) + + self.entries = self.create_entries(cache_dir) + self.remove_entries_from_server() + + def create_entries(self, cache_dir): + print('Searching for CACHE.DONE files in directory:\n {}\n'.format(cache_dir)) + + entries = [] + for x in self.repo.untracked_files: + if x.endswith('CACHE.DONE'): + entries.append(CacheEntry(os.path.join(self.cache_meta, x), cache_dir)) + print('Found {} files'.format(len(entries))) + return entries + + def remove_entries_from_server(self): + new_entries = [] + for i in self.entries: + if not i.entry_from_server(): + new_entries.append(i) + self.entries = new_entries + + def upload_raw(self, github): + for i in self.entries: + i.upload_raw(github) + + def make_commit_message(self): + message = 'Uploading cache info\n\n' + + env_list = [] + job_url = '' + + if os.getenv('TRAVIS') == 'true': + # * https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables + message += 'Travis:\n' + job_url = 'https://travis-ci.org/{}/jobs/{}'.format( + os.getenv('TRAVIS_REPO_SLUG'), + os.getenv('TRAVIS_JOB_ID') + ) + + env_list += [ + 'TRAVIS_BRANCH', + 'TRAVIS_BUILD_ID', + 'TRAVIS_BUILD_NUMBER', + 'TRAVIS_JOB_ID', + 'TRAVIS_JOB_NUMBER', + 'TRAVIS_OS_NAME', + 'TRAVIS_REPO_SLUG' + ] + + if os.getenv('APPVEYOR') == 'True': + # * http://www.appveyor.com/docs/environment-variables + message += 'AppVeyor:\n' + job_url = 'https://ci.appveyor.com/project/{}/{}/build/{}/job/{}'.format( + os.getenv('APPVEYOR_ACCOUNT_NAME'), + os.getenv('APPVEYOR_PROJECT_SLUG'), + os.getenv('APPVEYOR_BUILD_VERSION'), + os.getenv('APPVEYOR_JOB_ID') + ) + env_list += [ + 'APPVEYOR_ACCOUNT_NAME', + 'APPVEYOR_PROJECT_ID', + 'APPVEYOR_PROJECT_NAME', + 'APPVEYOR_PROJECT_SLUG', + 'APPVEYOR_BUILD_ID', + 'APPVEYOR_BUILD_NUMBER', + 'APPVEYOR_BUILD_VERSION', + 'APPVEYOR_JOB_ID', + 'APPVEYOR_JOB_NAME', + 'APPVEYOR_REPO_BRANCH' + ] + + # Store some info about build + for env_name in env_list: + env_value = os.getenv(env_name) + if env_value: + message += ' {}: {}\n'.format(env_name, env_value) + + if job_url: + message += '\n Job URL: {}\n'.format(job_url) + + return message + + def try_to_push(self, main_remote, main_remote_url_pull, github): + try: + main_remote.set_url( + 'https://{}:{}@github.com/{}/{}'.format( + github.username, + github.password, + github.repo_owner, + github.repo + ) + ) + fetch_result = main_remote.pull( + allow_unrelated_histories=True, + strategy='recursive', + strategy_option='ours', + rebase=True, + depth=1 + ) + main_remote.set_url(main_remote_url_pull) + for x in fetch_result: + if x.flags & x.REJECTED: + print('Pull rejected') + return False + if x.flags & x.ERROR: + print('Pull error') + return False + except Exception as exc: + print("Pull failed: {}".format(exc)) + return False + + try: + main_remote.set_url( + 'https://{}:{}@github.com/{}/{}'.format( + github.username, + github.password, + github.repo_owner, + github.repo + ) + ) + push_result = main_remote.push() + main_remote.set_url(main_remote_url_pull) + for x in push_result: + if x.flags & x.ERROR: + print('Push error') + return False + if x.flags & x.REJECTED: + print('Push rejected') + return False + if x.flags & x.REMOTE_FAILURE: + print('Push remote failure') + return False + if x.flags & x.REMOTE_REJECTED: + print('Push remote rejected') + return False + except: + # No exceptions expected, exit to avoid leakage of token + sys.exit('Unexpected exception') + + return True + + def upload_meta(self, github, cache_dir): + config = self.repo.config_writer() + config.set_value( + "user", + "email", + "{}@users.noreply.github.com".format(github.username) + ) + config.set_value("user", "name", github.username) + if sys.platform == "win32": + config.set_value("core", "autocrlf", "input") + config.release() + + if self.repo.is_dirty(untracked_files=True): + print('Adding untracked files:') + add_list = [] + + for x in self.repo.untracked_files: + to_add = False + if x.endswith('toolchain.info'): + to_add = True + elif x.endswith('args.cmake'): + to_add = True + elif x.endswith('types.info'): + to_add = True + elif x.endswith('internal_deps.id'): + to_add = True + elif x.endswith('basic-deps.info'): + to_add = True + elif x.endswith('basic-deps.DONE'): + to_add = True + elif x.endswith('cache.sha1'): + to_add = True + elif x.endswith('deps.info'): + to_add = True + elif x.endswith('CACHE.DONE'): + to_add = True + elif x.endswith('SHA1'): + to_add = True + + if to_add: + print(' * {}'.format(x)) + add_list.append(x) + + sys.stdout.flush() + + self.repo.index.add(add_list) + self.repo.index.commit(self.make_commit_message()) + + main_branch_found = False + for branch in self.repo.branches: + if branch.name == 'master': + main_branch_found = True + + if not main_branch_found: + self.repo.git.branch('master') + + main_remote_found = False + for remote in self.repo.remotes: + if remote.name == 'origin': + main_remote_found = True + main_remote = remote + + main_remote_url_pull = 'https://github.com/{}/{}'.format( + github.repo_owner, github.repo + ) + + if not main_remote_found: + main_remote = self.repo.create_remote('origin', main_remote_url_pull) + + retry_max = 10 + + fetch_ok = False + + for i in range(1, retry_max): + try: + if fetch_ok: + break + print('Fetch remote (attempt #{})'.format(i)) + sys.stdout.flush() + + main_remote.set_url( + 'https://{}:{}@github.com/{}/{}'.format( + github.username, + github.password, + github.repo_owner, + github.repo + ) + ) + main_remote.fetch(depth=1) + main_remote.set_url(main_remote_url_pull) + fetch_ok = True + except Exception as exc: + print('Exception {}'.format(exc)) + + if not fetch_ok: + sys.exit('Fetch failed') + + self.repo.heads.master.set_tracking_branch(main_remote.refs.master) + + success = False + + for i in range(1, retry_max): + print("Attempt #{}".format(i)) + success = self.try_to_push(main_remote, main_remote_url_pull, github) + if success: + break + sec = sleep_time(i) + print('Retry #{} (of {}) after {} seconds'.format(i, retry_max, sec)) + sys.stdout.flush() + time.sleep(sec) + + if success: + print("Done") + else: + sys.exit("Can't push") + + def touch_from_server(self): + for i in self.entries: + i.touch_from_server() + +parser = argparse.ArgumentParser( + description='Script for uploading Hunter cache files to GitHub' +) + +parser.add_argument( + '--username', + required=True, + help='Username' +) + +parser.add_argument( + '--password', + required=True, + help='Password' +) + +parser.add_argument( + '--repo-owner', + required=True, + help='Repository owner' +) + +parser.add_argument( + '--repo', + required=True, + help='Repository name' +) + +parser.add_argument( + '--cache-dir', + required=True, + help='Hunter cache directory, e.g. /home/user/.hunter/_Base/Cache' +) + +args = parser.parse_args() + +cache_dir = os.path.normpath(args.cache_dir) + +# Some tests don't produce cache for some toolchains: +# * https://travis-ci.org/ingenue/hunter/jobs/185550289 +if not os.path.exists(cache_dir): + print("*** WARNING *** Cache directory '{}' not found, skipping...".format(cache_dir)) + sys.exit() + +if not os.path.isdir(cache_dir): + raise Exception('Not a directory: {}'.format(cache_dir)) + +if os.path.split(cache_dir)[1] != 'Cache': + raise Exception('Cache directory path should ends with Cache: {}'.format(cache_dir)) + +cache = Cache(cache_dir) + +password = args.password + +if password == '' or password is None: + raise Exception('No password provided') + +github = Github( + username = args.username, + password = password, + repo_owner = args.repo_owner, + repo = args.repo +) + +cache.upload_raw(github) + +cache.upload_meta(github, cache_dir) +print('Touch from.server files') +cache.touch_from_server() diff --git a/tests/append-boost-config-macros/CMakeLists.txt b/tests/append-boost-config-macros/CMakeLists.txt new file mode 100644 index 000000000..bcae0d3e0 --- /dev/null +++ b/tests/append-boost-config-macros/CMakeLists.txt @@ -0,0 +1,180 @@ +cmake_minimum_required(VERSION 3.0) + +include("../../examples/common.cmake") +include(hunter_parse_boost_config_macros) +project(test-append-boost-config-macros-script) + +set(HUNTER_GLOBAL_SCRIPT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../scripts") +set(BOOST_CONFIG_ROOT "${CMAKE_CURRENT_BINARY_DIR}/boost/config") +set(BOOST_USER_CONFIG "${BOOST_CONFIG_ROOT}/user.hpp") + +function(test_append_boost_config_macros expected_boost_user_config_content) + + hunter_parse_boost_config_macros(BOOST_CONFIG_MACROS ${ARGN}) + configure_file( + "${HUNTER_GLOBAL_SCRIPT_DIR}/append-boost-config-macros.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/append-boost-config-macros.cmake" + @ONLY + ) + + file(MAKE_DIRECTORY "${BOOST_CONFIG_ROOT}") + file(WRITE "${BOOST_USER_CONFIG}" "") + execute_process( + COMMAND + "${CMAKE_COMMAND}" -P append-boost-config-macros.cmake + WORKING_DIRECTORY + "${CMAKE_CURRENT_BINARY_DIR}" + ) + file(READ "${BOOST_USER_CONFIG}" boost_user_config_content) + string( + COMPARE NOTEQUAL + "${boost_user_config_content}" + "${expected_boost_user_config_content}" + diff + ) + if(diff) + message( + FATAL_ERROR "TEST FAIL: ${ARGN}\n" + "boost user config content:\n" + "${boost_user_config_content}\n" + "expected:\n" + "${expected_boost_user_config_content}\n" + ) + else() + message("TEST PASS: ${ARGN}") + endif() +endfunction(test_append_boost_config_macros) + +test_append_boost_config_macros( +[=[ + +#define BOOST_REGEX_MATCH_EXTRA + +#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS + +#define BOOST_MPL_LIMIT_LIST_SIZE 3 +]=] +CONFIG_MACRO=BOOST_REGEX_MATCH_EXTRA;BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS +CONFIG_MACRO_BOOST_MPL_LIMIT_LIST_SIZE=3 +) + +test_append_boost_config_macros( +[=[ + +#define BOOST_MPL_LIMIT_LIST_SIZE 3 + +#define BOOST_REGEX_MATCH_EXTRA + +#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS +]=] +CONFIG_MACRO_BOOST_MPL_LIMIT_LIST_SIZE=3 +CONFIG_MACRO=BOOST_REGEX_MATCH_EXTRA;BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS +) + +test_append_boost_config_macros("" "") + +test_append_boost_config_macros( +[=[ + +#define CM1 +]=] +CONFIG_MACRO=CM1 +) + +test_append_boost_config_macros( +[=[ + +#define CM1 + +#define CM2 +]=] +CONFIG_MACRO=CM1;CM2 +) + +test_append_boost_config_macros( +[=[ + +#define CM1 + +#define CM2 +]=] +CONFIG_MACRO=CM1 CM2 +) + +test_append_boost_config_macros( +[=[ + +#define CM1 1 +]=] +CONFIG_MACRO_CM1=1 +) + +test_append_boost_config_macros( +[=[ + +#define CM1 1 + +#define CM2 1 +]=] +CONFIG_MACRO_CM1=1 CONFIG_MACRO_CM2=1 +) + +test_append_boost_config_macros( +[=[ + +#define CM3 + +#define CM4 + +#define CM1 1 + +#define CM2 1 +]=] +CONFIG_MACRO=CM3;CM4 CONFIG_MACRO_CM1=1 CONFIG_MACRO_CM2=1 +) + +test_append_boost_config_macros( +[=[ + +#define CM1 1 + +#define CM2 1 + +#define CM3 + +#define CM4 +]=] +CONFIG_MACRO_CM1=1 CONFIG_MACRO_CM2=1 CONFIG_MACRO=CM3;CM4 +) + +test_append_boost_config_macros( +[=[ + +#define CM1 1 + +#define CM2 1 + +#define CM3 + +#define CM4 + +#define CM5 +]=] +CONFIG_MACRO_CM1=1 IGNORED1=1 IGNORED2=2 CONFIG_MACRO_CM2=1 +CONFIG_MACRO=CM3;CM4 CM5 IGNORED3=3 IGNORED4 +) + +test_append_boost_config_macros( +[=[ + +#define CM1 "with spaces" + +#define CM2 2 + +#define CM3 + +#define CM4 +]=] +"CONFIG_MACRO_CM1=\"with spaces\"" +CONFIG_MACRO_CM2=2 CONFIG_MACRO=CM3;CM4 +) diff --git a/tests/hunter_check_toolchain_definition/CMakeLists.txt b/tests/hunter_check_toolchain_definition/CMakeLists.txt new file mode 100644 index 000000000..896fb5c04 --- /dev/null +++ b/tests/hunter_check_toolchain_definition/CMakeLists.txt @@ -0,0 +1,43 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +include("../../examples/common.cmake") +project(TestModuleHunterCheckToolchainDefinition) + +# We should call at least one 'hunter_add_package' to trigger toolchain-id +# calculation +hunter_add_package(Sugar) + +include(hunter_check_toolchain_definition) + +hunter_check_toolchain_definition( + NAME __cplusplus + DEFINED is_defined + VALUE value +) + +if(NOT is_defined) + message(FATAL_ERROR "Not defined") +endif() + +string(COMPARE EQUAL "${value}" "" is_empty) +if(is_empty) + message(FATAL_ERROR "Is empty") +endif() + +hunter_check_toolchain_definition( + NAME __this_is_not_a_macro + DEFINED is_defined + VALUE value +) + +if(is_defined) + message(FATAL_ERROR "Is defined") +endif() + +string(COMPARE EQUAL "${value}" "" is_empty) +if(NOT is_empty) + message(FATAL_ERROR "Not empty: '${value}'") +endif() diff --git a/tests/hunter_create_args_file/test_11 b/tests/hunter_create_args_file/test_11 new file mode 100644 index 000000000..31d6cd42e --- /dev/null +++ b/tests/hunter_create_args_file/test_11 @@ -0,0 +1 @@ +set("A" "--foo=1" CACHE INTERNAL "") diff --git a/tests/hunter_create_args_file/test_12 b/tests/hunter_create_args_file/test_12 new file mode 100644 index 000000000..071d0ed72 --- /dev/null +++ b/tests/hunter_create_args_file/test_12 @@ -0,0 +1,3 @@ +set("A" "--boo=1" CACHE INTERNAL "") +set("A" "${A}" "2" CACHE INTERNAL "") +set("A" "${A}" "3" CACHE INTERNAL "") diff --git a/tests/hunter_create_args_file/test_13 b/tests/hunter_create_args_file/test_13 new file mode 100644 index 000000000..ec140cdb6 --- /dev/null +++ b/tests/hunter_create_args_file/test_13 @@ -0,0 +1,6 @@ +set("A" "--boo=1" CACHE INTERNAL "") +set("A" "${A}" "2" CACHE INTERNAL "") +set("A" "${A}" "3" CACHE INTERNAL "") +set("A" "${A}" "--foo=3" CACHE INTERNAL "") +set("A" "${A}" "4" CACHE INTERNAL "") +set("A" "${A}" "5" CACHE INTERNAL "") diff --git a/tests/hunter_create_args_file/test_14 b/tests/hunter_create_args_file/test_14 new file mode 100644 index 000000000..1db1921ce --- /dev/null +++ b/tests/hunter_create_args_file/test_14 @@ -0,0 +1,5 @@ +set("A" "1" CACHE INTERNAL "") +set("B" "--a" CACHE INTERNAL "") +set("B" "${B}" "--b" CACHE INTERNAL "") +set("B" "${B}" "--c=1,2,3,4" CACHE INTERNAL "") +set("C" "777" CACHE INTERNAL "") diff --git a/tests/hunter_init_not_found_counter/CMakeLists.txt b/tests/hunter_init_not_found_counter/CMakeLists.txt new file mode 100644 index 000000000..f0c6dd391 --- /dev/null +++ b/tests/hunter_init_not_found_counter/CMakeLists.txt @@ -0,0 +1,48 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +include("../../examples/common.cmake") +project(TestModuleHunterHunterInitNotFoundCounter) + +include(hunter_init_not_found_counter) + +### +set(HUNTER_USE_CACHE_SERVERS YES) +hunter_init_not_found_counter(NEEDED counter 1) +string(COMPARE EQUAL "${NEEDED}" "2" is_good) +if(NOT is_good) + message(FATAL_ERROR "Unexpected: ${NEEDED}") +endif() +string(COMPARE EQUAL "${counter}" "0" is_good) +if(NOT is_good) + message(FATAL_ERROR "Unexpected: ${counter}") +endif() + +### +set(HUNTER_USE_CACHE_SERVERS ONLY) +hunter_init_not_found_counter(NEEDED counter 1) +string(COMPARE EQUAL "${NEEDED}" "4" is_good) +if(NOT is_good) + message(FATAL_ERROR "Unexpected: ${NEEDED}") +endif() +string(COMPARE EQUAL "${counter}" "0" is_good) +if(NOT is_good) + message(FATAL_ERROR "Unexpected: ${counter}") +endif() + +### +set(HUNTER_USE_CACHE_SERVERS ONLY) +hunter_init_not_found_counter(NEEDED counter 3) +string(COMPARE EQUAL "${NEEDED}" "12" is_good) +if(NOT is_good) + message(FATAL_ERROR "Unexpected: ${NEEDED}") +endif() +string(COMPARE EQUAL "${counter}" "0" is_good) +if(NOT is_good) + message(FATAL_ERROR "Unexpected: ${counter}") +endif() + +### +message("PASSED") diff --git a/tests/hunter_standard_flag/CMakeLists.txt b/tests/hunter_standard_flag/CMakeLists.txt new file mode 100644 index 000000000..01d68dfc0 --- /dev/null +++ b/tests/hunter_standard_flag/CMakeLists.txt @@ -0,0 +1,176 @@ +# Copyright (c) 2017, Pawel Bylica +# All rights reserved. + +cmake_minimum_required(VERSION 3.0) + +include("../../examples/common.cmake") + +project(TestStandardFlag) + +include(hunter_get_lang_standard_flag) + +macro(check LANG EXPECTED) + set(flag "invalid") + hunter_get_lang_standard_flag(${LANG} flag) + string(COMPARE EQUAL "${flag}" "${EXPECTED}" is_correct) + if(NOT is_correct) + message(FATAL_ERROR "Expected '${EXPECTED}' standard ${LANG} flag, got '${flag}'") + endif() +endmacro() + +unset(CMAKE_CXX_STANDARD CACHE) +unset(CMAKE_CXX_STANDARD_REQUIRED CACHE) +unset(CMAKE_CXX_EXTENSIONS CACHE) +unset(CMAKE_C_STANDARD CACHE) +unset(CMAKE_C_STANDARD_REQUIRED CACHE) +unset(CMAKE_C_EXTENSIONS CACHE) + +check(CXX "") +check(C "") + +if(CMAKE_CXX98_EXTENSION_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 98) + unset(CMAKE_CXX_EXTENSIONS) + check(CXX "${CMAKE_CXX98_EXTENSION_COMPILE_OPTION}") + set(CMAKE_CXX_EXTENSIONS On) + check(CXX "${CMAKE_CXX98_EXTENSION_COMPILE_OPTION}") +endif() + +if(CMAKE_CXX98_STANDARD_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 98) + set(CMAKE_CXX_EXTENSIONS Off) + check(CXX "${CMAKE_CXX98_STANDARD_COMPILE_OPTION}") +endif() + +if(CMAKE_CXX11_EXTENSION_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 11) + unset(CMAKE_CXX_EXTENSIONS) + check(CXX "${CMAKE_CXX11_EXTENSION_COMPILE_OPTION}") + set(CMAKE_CXX_EXTENSIONS On) + check(CXX "${CMAKE_CXX11_EXTENSION_COMPILE_OPTION}") +endif() + +if(CMAKE_CXX11_STANDARD_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_EXTENSIONS Off) + check(CXX "${CMAKE_CXX11_STANDARD_COMPILE_OPTION}") +endif() + +if(CMAKE_CXX14_EXTENSION_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 14) + unset(CMAKE_CXX_EXTENSIONS) + check(CXX "${CMAKE_CXX14_EXTENSION_COMPILE_OPTION}") + set(CMAKE_CXX_EXTENSIONS On) + check(CXX "${CMAKE_CXX14_EXTENSION_COMPILE_OPTION}") +endif() + +if(CMAKE_CXX14_STANDARD_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_EXTENSIONS Off) + check(CXX "${CMAKE_CXX14_STANDARD_COMPILE_OPTION}") +endif() + +if(CMAKE_CXX17_EXTENSION_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 17) + unset(CMAKE_CXX_EXTENSIONS) + check(CXX "${CMAKE_CXX17_EXTENSION_COMPILE_OPTION}") + set(CMAKE_CXX_EXTENSIONS On) + check(CXX "${CMAKE_CXX17_EXTENSION_COMPILE_OPTION}") +endif() + +if(CMAKE_CXX17_STANDARD_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_EXTENSIONS Off) + check(CXX "${CMAKE_CXX17_STANDARD_COMPILE_OPTION}") +endif() + +if(CMAKE_C90_EXTENSION_COMPILE_OPTION) + set(CMAKE_C_STANDARD 90) + unset(CMAKE_C_EXTENSIONS) + check(C "${CMAKE_C90_EXTENSION_COMPILE_OPTION}") + set(CMAKE_C_EXTENSIONS On) + check(C "${CMAKE_C90_EXTENSION_COMPILE_OPTION}") +endif() + +if(CMAKE_C90_STANDARD_COMPILE_OPTION) + set(CMAKE_C_STANDARD 90) + set(CMAKE_C_EXTENSIONS Off) + check(C "${CMAKE_C90_STANDARD_COMPILE_OPTION}") +endif() + +if(CMAKE_C99_EXTENSION_COMPILE_OPTION) + set(CMAKE_C_STANDARD 99) + unset(CMAKE_C_EXTENSIONS) + check(C "${CMAKE_C99_EXTENSION_COMPILE_OPTION}") + set(CMAKE_C_EXTENSIONS On) + check(C "${CMAKE_C99_EXTENSION_COMPILE_OPTION}") +endif() + +if(CMAKE_C99_STANDARD_COMPILE_OPTION) + set(CMAKE_C_STANDARD 99) + set(CMAKE_C_EXTENSIONS Off) + check(C "${CMAKE_C99_STANDARD_COMPILE_OPTION}") +endif() + +if(CMAKE_C11_EXTENSION_COMPILE_OPTION) + set(CMAKE_C_STANDARD 11) + unset(CMAKE_C_EXTENSIONS) + check(C "${CMAKE_C11_EXTENSION_COMPILE_OPTION}") + set(CMAKE_C_EXTENSIONS On) + check(C "${CMAKE_C11_EXTENSION_COMPILE_OPTION}") +endif() + +if(CMAKE_C11_STANDARD_COMPILE_OPTION) + set(CMAKE_C_STANDARD 11) + set(CMAKE_C_EXTENSIONS Off) + check(C "${CMAKE_C11_STANDARD_COMPILE_OPTION}") +endif() + + +# Expect decay to lower standard + +if(CMAKE_CXX14_STANDARD_COMPILE_OPTION AND NOT CMAKE_CXX17_STANDARD_COMPILE_OPTION) + # Decay to c++14 + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_EXTENSIONS Off) + check(CXX "${CMAKE_CXX14_STANDARD_COMPILE_OPTION}") +endif() + +if(CMAKE_CXX11_STANDARD_COMPILE_OPTION AND NOT CMAKE_CXX14_STANDARD_COMPILE_OPTION) + # Decay to c++11 + set(CMAKE_CXX_EXTENSIONS Off) + set(CMAKE_CXX_STANDARD 17) + check(CXX "${CMAKE_CXX11_STANDARD_COMPILE_OPTION}") + set(CMAKE_CXX_STANDARD 14) + check(CXX "${CMAKE_CXX11_STANDARD_COMPILE_OPTION}") +endif() + +if(CMAKE_C99_STANDARD_COMPILE_OPTION AND NOT CMAKE_C11_STANDARD_COMPILE_OPTION) + # Decay to c99 + set(CMAKE_C_STANDARD 11) + set(CMAKE_C_EXTENSIONS Off) + check(CXX "${CMAKE_C99_STANDARD_COMPILE_OPTION}") +endif() + + +# Restricted standard +set(CMAKE_CXX_STANDARD_REQUIRED True) +set(CMAKE_C_STANDARD_REQUIRED True) + +if(CMAKE_CXX14_STANDARD_COMPILE_OPTION AND NOT CMAKE_CXX17_STANDARD_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_EXTENSIONS Off) + check(CXX "") +endif() + +if(CMAKE_CXX11_STANDARD_COMPILE_OPTION AND NOT CMAKE_CXX14_STANDARD_COMPILE_OPTION) + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_EXTENSIONS Off) + check(CXX "") +endif() + +if(CMAKE_C99_STANDARD_COMPILE_OPTION AND NOT CMAKE_C11_STANDARD_COMPILE_OPTION) + set(CMAKE_C_STANDARD 11) + set(CMAKE_C_EXTENSIONS Off) + check(C "") +endif() From 98300e06b457342059dae6ed728e3d0a41d8086f Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 10:22:41 +0100 Subject: [PATCH 03/30] Adding TLS... --- examples/hdf5/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 9a4534793..47baf2271 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -9,6 +9,8 @@ include("../common.cmake") project(download-hdf5) +option(HUNTER_TLS_VERIFY ON) + hunter_add_package(hdf5) find_package(ZLIB CONFIG REQUIRED) From 27bca93df4c0d3308298b6c8f0bfa89603c4deb5 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 10:33:40 +0100 Subject: [PATCH 04/30] Adding hdf5 dir --- examples/hdf5/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 47baf2271..1401a9eba 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -11,6 +11,8 @@ project(download-hdf5) option(HUNTER_TLS_VERIFY ON) +set(hdf5_DIR $ENV{hdf5_ROOT}) + hunter_add_package(hdf5) find_package(ZLIB CONFIG REQUIRED) From 99dcb8baeeb0c62c2f2cede5f60a1ea9a437e677 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 10:44:02 +0100 Subject: [PATCH 05/30] set CMake prefix pat --- examples/hdf5/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 1401a9eba..5fe00b18a 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -11,7 +11,7 @@ project(download-hdf5) option(HUNTER_TLS_VERIFY ON) -set(hdf5_DIR $ENV{hdf5_ROOT}) +set(CMAKE_PREFIX_PATH $ENV{hdf5_ROOT}) hunter_add_package(hdf5) From 232f18cf748a73af8d69c882ea6d523e55a54e89 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 11:46:25 +0100 Subject: [PATCH 06/30] Updated cmake requirements --- examples/common.cmake | 1 + examples/hdf5/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/common.cmake b/examples/common.cmake index 79588471b..9f5c07e17 100644 --- a/examples/common.cmake +++ b/examples/common.cmake @@ -42,3 +42,4 @@ get_filename_component(TESTING_URL "${TESTING_URL}" ABSOLUTE) ### HunterGate module HunterGate(URL "${TESTING_URL}" SHA1 "${TESTING_SHA1}" ${TESTING_CONFIG_OPT}) + diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 5fe00b18a..7e8350c2a 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -1,7 +1,7 @@ # Copyright (c) 2015, Oliver Daniell # All rights reserved. -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.2) # Emulate HunterGate: # * https://github.com/hunter-packages/gate From 38eb4e51f28f64a4c6f4768d9b74ac0dcccf2b2c Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 11:51:15 +0100 Subject: [PATCH 07/30] Updated gate --- gate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gate b/gate index abd2dc7ba..072cb88ba 160000 --- a/gate +++ b/gate @@ -1 +1 @@ -Subproject commit abd2dc7bac9df33a4c1aede579b2ed151c8115e2 +Subproject commit 072cb88baa41306b1bde0ad29dddb3e3c2821484 From 0654ff78aa46fc5e0760765b233ccfd7a575a8e2 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 11:55:10 +0100 Subject: [PATCH 08/30] Updated cmakelist --- examples/hdf5/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 7e8350c2a..62abceaf0 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -9,10 +9,6 @@ include("../common.cmake") project(download-hdf5) -option(HUNTER_TLS_VERIFY ON) - -set(CMAKE_PREFIX_PATH $ENV{hdf5_ROOT}) - hunter_add_package(hdf5) find_package(ZLIB CONFIG REQUIRED) From ad680d0e16475e99b6cc59350cbf4e196cfa68ad Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 4 Oct 2019 11:55:42 +0100 Subject: [PATCH 09/30] reset gate --- gate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gate b/gate index 072cb88ba..379df7e59 160000 --- a/gate +++ b/gate @@ -1 +1 @@ -Subproject commit 072cb88baa41306b1bde0ad29dddb3e3c2821484 +Subproject commit 379df7e59876cdb8938c15b3c1467258db3ef9db From c48c6f66d87d977dcaf1e13adba69f416ed02d54 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Tue, 15 Oct 2019 14:23:57 +0100 Subject: [PATCH 10/30] Updated example Updated CI files --- .travis.yml | 2 +- appveyor.yml | 100 ++++++++++++++++++++++++++--------- examples/hdf5/CMakeLists.txt | 8 +-- examples/hdf5/h5_write.c | 16 +++--- 4 files changed, 88 insertions(+), 38 deletions(-) diff --git a/.travis.yml b/.travis.yml index 97506cbb8..8ac6ca1f7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -100,7 +100,7 @@ install: - if [[ "`uname`" == "Linux" ]]; then travis_retry easy_install3 --user requests==2.10.0; fi # Install latest Polly toolchains and scripts - - wget https://github.com/ruslo/polly/archive/master.zip + - wget https://github.com/cpp-pm/polly/archive/master.zip - unzip master.zip - POLLY_ROOT="`pwd`/polly-master" - export PATH="${POLLY_ROOT}/bin:${PATH}" diff --git a/appveyor.yml b/appveyor.yml index 479ba6640..9e907820c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,83 +11,133 @@ environment: # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1053/job/l4ud1nf8pbo11tkh #- TOOLCHAIN: "default" # PROJECT_DIR: examples\hdf5 - + # HUNTER_BINARY_DIR: C:\__BIN + # HUNTER_ROOT: C:\.HUNTER + #- TOOLCHAIN: "ninja-vs-15-2017-win64-cxx17" # PROJECT_DIR: examples\hdf5 - + # HUNTER_BINARY_DIR: C:\__BIN + # HUNTER_ROOT: C:\.HUNTER + #- TOOLCHAIN: "ninja-vs-15-2017-win64" # PROJECT_DIR: examples\hdf5 - + # HUNTER_BINARY_DIR: C:\__BIN + # HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "ninja-vs-14-2015-win64" PROJECT_DIR: examples\hdf5 + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER - TOOLCHAIN: "ninja-vs-12-2013-win64" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "nmake-vs-15-2017-win64-cxx17" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "nmake-vs-15-2017-win64" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "nmake-vs-12-2013-win64" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "nmake-vs-12-2013" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-10-2010" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-11-2012" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-12-2013-win64" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-12-2013-xp" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-12-2013" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + # FIXME: # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1053/job/l4ud1nf8pbo11tkh - TOOLCHAIN: "vs-14-2015" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-14-2015-win64" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-15-2017" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-15-2017-win64" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-16-2019" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-16-2019-win64" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "vs-9-2008" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "mingw" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "mingw-cxx14" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + - TOOLCHAIN: "mingw-cxx17" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + # FIXME: # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1053/job/mtnnis065ibe658y - TOOLCHAIN: "msys" PROJECT_DIR: examples\hdf5 - + HUNTER_BINARY_DIR: C:\__BIN + HUNTER_ROOT: C:\.HUNTER + install: # Python 3 - cmd: set PATH=C:\Python34-x64;C:\Python34-x64\Scripts;%PATH% @@ -97,7 +147,7 @@ install: - cmd: pip install gitpython # Install latest Polly toolchains and scripts - - cmd: appveyor DownloadFile https://github.com/ruslo/polly/archive/master.zip + - cmd: appveyor DownloadFile https://github.com/cpp-pm/polly/archive/master.zip - cmd: 7z x master.zip - cmd: set POLLY_ROOT=%cd%\polly-master diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 62abceaf0..a3dd95baf 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -1,14 +1,16 @@ # Copyright (c) 2015, Oliver Daniell # All rights reserved. -cmake_minimum_required(VERSION 3.2) +cmake_minimum_required(VERSION 3.10) # Emulate HunterGate: # * https://github.com/hunter-packages/gate include("../common.cmake") -project(download-hdf5) +project(download-hdf5 C CXX) +hunter_add_package(ZLIB) +hunter_add_package(szip) hunter_add_package(hdf5) find_package(ZLIB CONFIG REQUIRED) @@ -16,4 +18,4 @@ find_package(szip CONFIG REQUIRED) find_package(hdf5 CONFIG REQUIRED) add_executable(foo h5_write.c) -target_link_libraries(foo hdf5) +target_link_libraries(foo hdf5::hdf5-static) diff --git a/examples/hdf5/h5_write.c b/examples/hdf5/h5_write.c index 2d8421aa0..1a7cfe74e 100644 --- a/examples/hdf5/h5_write.c +++ b/examples/hdf5/h5_write.c @@ -5,12 +5,10 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* @@ -40,8 +38,8 @@ main (void) * Data and output buffer initialization. */ for(j = 0; j < NX; j++) - for(i = 0; i < NY; i++) - data[j][i] = i + j; + for(i = 0; i < NY; i++) + data[j][i] = i + j; /* * 0 1 2 3 4 5 * 1 2 3 4 5 6 @@ -77,7 +75,7 @@ main (void) * datatype and default dataset creation properties. */ dataset = H5Dcreate2(file, DATASETNAME, datatype, dataspace, - H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Write the data to the dataset using default transfer properties. From 7dc0afd1645e0392737169baa6ba38d322dc2e2b Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Tue, 15 Oct 2019 14:35:54 +0100 Subject: [PATCH 11/30] Adding policy cmake version --- examples/hdf5/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index a3dd95baf..01e12e12b 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -2,6 +2,7 @@ # All rights reserved. cmake_minimum_required(VERSION 3.10) +cmake_policy(VERSION 3.10) # Emulate HunterGate: # * https://github.com/hunter-packages/gate From 2c7d9f5964aacff59ac84497477a54a4b7f783f2 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Tue, 15 Oct 2019 14:42:51 +0100 Subject: [PATCH 12/30] setting CMP0074 explicitely --- examples/hdf5/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 01e12e12b..9ca159c17 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -2,7 +2,7 @@ # All rights reserved. cmake_minimum_required(VERSION 3.10) -cmake_policy(VERSION 3.10) +cmake_policy(SET CMP0074 NEW) # Emulate HunterGate: # * https://github.com/hunter-packages/gate From 0aba7dced22c19030821a99ff8128e37114e9510 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Tue, 15 Oct 2019 15:24:05 +0100 Subject: [PATCH 13/30] updated travis --- .travis.yml | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8ac6ca1f7..45a5209a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,17 +16,14 @@ addons: sources: - ubuntu-toolchain-r-test packages: - - python3 - - # python3-pip package is not available, use 'easy_install3': - # * https://github.com/travis-ci/apt-package-whitelist/issues/768 + - python3-pip - python3-setuptools # easy_install3 # https://github.com/travis-ci-tester/travis-test-clang-cxx-11 - - libstdc++-4.8-dev + - libstdc++-7-dev # https://github.com/travis-ci-tester/travis-test-gcc-cxx-11 - - g++-4.8 + - g++-7 env: global: @@ -40,26 +37,28 @@ matrix: - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx - os: linux - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=gcc-4-8 + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=gcc-7 + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=gcc-7-cxx14-pic # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859218 # - os: linux # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859220 - # - os: linux - # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze-cxx14 # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859221 - # - os: linux - # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=sanitize-address + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=sanitize-address - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=sanitize-leak # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859223 - # - os: linux - # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=sanitize-thread + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=sanitize-thread # } @@ -71,7 +70,11 @@ matrix: - os: osx env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx - os: osx - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-11 + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-13-make-cxx14 + - os: osx + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-13-cxx14 + - os: osx + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=ios-nocodesign-11-4-dep-9-3 # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164878134 # - os: osx @@ -91,13 +94,23 @@ install: # Info about OS - uname -a + # Info about available disk space + - df -h $HOME + + # Disable autoupdate + # * https://github.com/Homebrew/brew/blob/7d31a70373edae4d8e78d91a4cbc05324bebc3ba/Library/Homebrew/manpages/brew.1.md.erb#L202 + - export HOMEBREW_NO_AUTO_UPDATE=1 + # Install Python 3 + - if [[ "`uname`" == "Darwin" ]]; then travis_retry brew upgrade python || echo "Ignoring failure..."; fi - if [[ "`uname`" == "Darwin" ]]; then travis_retry brew install python3; fi # Install Python package 'requests' # 'easy_install3' is not installed by 'brew install python3' on OS X 10.9 Maverick - if [[ "`uname`" == "Darwin" ]]; then pip3 install requests; fi - - if [[ "`uname`" == "Linux" ]]; then travis_retry easy_install3 --user requests==2.10.0; fi + - if [[ "`uname`" == "Darwin" ]]; then pip3 install gitpython; fi + - if [[ "`uname`" == "Linux" ]]; then travis_retry pip3 install --user requests; fi + - if [[ "`uname`" == "Linux" ]]; then travis_retry pip3 install --user gitpython; fi # Install latest Polly toolchains and scripts - wget https://github.com/cpp-pm/polly/archive/master.zip From 4b3322a1074d5fbbf360c268786ed99ac71ec353 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Tue, 15 Oct 2019 16:04:24 +0100 Subject: [PATCH 14/30] Added new toolchains --- .travis.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 45a5209a1..587b4eeb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,6 +36,16 @@ matrix: env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=default - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-cxx14 + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-cxx14-pic + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-fpic + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-fpic-static-std + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-fpic-static-std-cxx14 - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=gcc-7 - os: linux @@ -47,7 +57,7 @@ matrix: # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859220 - os: linux - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze-cxx14 + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859221 - os: linux @@ -64,16 +74,22 @@ matrix: # OSX { - os: osx + osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=default - os: osx + osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=libcxx - os: osx + osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx - os: osx + osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-13-make-cxx14 - os: osx + osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-13-cxx14 - os: osx + osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=ios-nocodesign-11-4-dep-9-3 # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164878134 From c2f39b4aa925c08838c9ee70080db3928bafa4ef Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Tue, 15 Oct 2019 16:48:39 +0100 Subject: [PATCH 15/30] Added explicit link to szip & ZLIB --- .travis.yml | 4 ++-- examples/hdf5/CMakeLists.txt | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 587b4eeb4..ceeda9734 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,8 +56,8 @@ matrix: # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859220 - - os: linux - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze + #- os: linux + # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859221 - os: linux diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 9ca159c17..c7c49f8a1 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -1,6 +1,3 @@ -# Copyright (c) 2015, Oliver Daniell -# All rights reserved. - cmake_minimum_required(VERSION 3.10) cmake_policy(SET CMP0074 NEW) @@ -19,4 +16,4 @@ find_package(szip CONFIG REQUIRED) find_package(hdf5 CONFIG REQUIRED) add_executable(foo h5_write.c) -target_link_libraries(foo hdf5::hdf5-static) +target_link_libraries(foo hdf5::hdf5-static ${SZIP_LIBRARIES} ${SZIP_LIBRARIES}) From fc53a866d6d62db36132ea7e0cc93ba256d1aef7 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Tue, 15 Oct 2019 17:43:15 +0100 Subject: [PATCH 16/30] find dependencies in hdf5 --- examples/hdf5/CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index c7c49f8a1..ec9866ef5 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -7,8 +7,6 @@ include("../common.cmake") project(download-hdf5 C CXX) -hunter_add_package(ZLIB) -hunter_add_package(szip) hunter_add_package(hdf5) find_package(ZLIB CONFIG REQUIRED) @@ -16,4 +14,4 @@ find_package(szip CONFIG REQUIRED) find_package(hdf5 CONFIG REQUIRED) add_executable(foo h5_write.c) -target_link_libraries(foo hdf5::hdf5-static ${SZIP_LIBRARIES} ${SZIP_LIBRARIES}) +target_link_libraries(foo hdf5::hdf5-static) From 4f8dde2b491400f1c8609c724834bbc80cf434e7 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Wed, 16 Oct 2019 11:29:48 +0100 Subject: [PATCH 17/30] Updated hdf5 lib --- cmake/configs/default.cmake | 2 +- cmake/projects/hdf5/hunter.cmake | 13 +++++++++++++ examples/hdf5/CMakeLists.txt | 1 - 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cmake/configs/default.cmake b/cmake/configs/default.cmake index 82cede5ec..a63fea549 100644 --- a/cmake/configs/default.cmake +++ b/cmake/configs/default.cmake @@ -279,7 +279,7 @@ hunter_default_version(gumbo VERSION 0.10.1) hunter_default_version(h3 VERSION 3.0.7) hunter_default_version(half VERSION 1.1.0-p1) hunter_default_version(harfbuzz VERSION 1.7.6-p2) -hunter_default_version(hdf5 VERSION 1.10.5-hp1) +hunter_default_version(hdf5 VERSION 1.10.5-hp2) hunter_default_version(highwayhash VERSION 0.0.0) hunter_default_version(http-parser VERSION 2.8.0) hunter_default_version(hunter_venv VERSION 1.0.1) diff --git a/cmake/projects/hdf5/hunter.cmake b/cmake/projects/hdf5/hunter.cmake index b923f5800..210b21faf 100644 --- a/cmake/projects/hdf5/hunter.cmake +++ b/cmake/projects/hdf5/hunter.cmake @@ -32,6 +32,19 @@ hunter_add_version( ) + +hunter_add_version( + PACKAGE_NAME + hdf5 + VERSION + "1.10.5-hp2" + URL + "https://github.com/cpp-pm/hdf5/archive/1.10.5-hp2.tar.gz" + SHA1 + "5ced64e504b5061c2db425a2e4ae0c28bb706571" +) + + hunter_cmake_args( hdf5 CMAKE_ARGS diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index ec9866ef5..033d4c8df 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -1,5 +1,4 @@ cmake_minimum_required(VERSION 3.10) -cmake_policy(SET CMP0074 NEW) # Emulate HunterGate: # * https://github.com/hunter-packages/gate From fbbb1ddef1803cdd20e2f0eca89a836b32cfc987 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Wed, 16 Oct 2019 15:12:31 +0100 Subject: [PATCH 18/30] updated hdf5 & toolchains --- .travis.yml | 9 +++++++++ cmake/configs/default.cmake | 2 +- cmake/projects/hdf5/hunter.cmake | 14 +++++++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ceeda9734..c8b216bd8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -91,6 +91,15 @@ matrix: - os: osx osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=ios-nocodesign-11-4-dep-9-3 + + - os: osx + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=default + - os: osx + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=libcxx + - os: osx + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx + - os: osx + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-11 # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164878134 # - os: osx diff --git a/cmake/configs/default.cmake b/cmake/configs/default.cmake index a63fea549..5c2cf2b2b 100644 --- a/cmake/configs/default.cmake +++ b/cmake/configs/default.cmake @@ -279,7 +279,7 @@ hunter_default_version(gumbo VERSION 0.10.1) hunter_default_version(h3 VERSION 3.0.7) hunter_default_version(half VERSION 1.1.0-p1) hunter_default_version(harfbuzz VERSION 1.7.6-p2) -hunter_default_version(hdf5 VERSION 1.10.5-hp2) +hunter_default_version(hdf5 VERSION 1.10.5-hp3) hunter_default_version(highwayhash VERSION 0.0.0) hunter_default_version(http-parser VERSION 2.8.0) hunter_default_version(hunter_venv VERSION 1.0.1) diff --git a/cmake/projects/hdf5/hunter.cmake b/cmake/projects/hdf5/hunter.cmake index 210b21faf..613628ae6 100644 --- a/cmake/projects/hdf5/hunter.cmake +++ b/cmake/projects/hdf5/hunter.cmake @@ -31,8 +31,6 @@ hunter_add_version( "eaa00311ee9e61e34a71d0258bc9a76c8f24001a" ) - - hunter_add_version( PACKAGE_NAME hdf5 @@ -41,9 +39,19 @@ hunter_add_version( URL "https://github.com/cpp-pm/hdf5/archive/1.10.5-hp2.tar.gz" SHA1 - "5ced64e504b5061c2db425a2e4ae0c28bb706571" + "9061212757196109437412d80885b9219bfc0ceb" ) +hunter_add_version( + PACKAGE_NAME + hdf5 + VERSION + "1.10.5-hp3" + URL + "https://github.com/cpp-pm/hdf5/archive/1.10.5-hp3.tar.gz" + SHA1 + "968876aee5af1edf70ce352b6d94fd5ffac338bf" +) hunter_cmake_args( hdf5 From 2977fdc483254baffea7d992553fc00f28c4f318 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Wed, 16 Oct 2019 16:28:45 +0100 Subject: [PATCH 19/30] updated toolchains for Mac OS --- .travis.yml | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/.travis.yml b/.travis.yml index c8b216bd8..62e8375de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,23 +50,10 @@ matrix: env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=gcc-7 - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=gcc-7-cxx14-pic - - # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859218 - # - os: linux - # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon - - # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859220 - #- os: linux - # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze - - # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859221 - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=sanitize-address - - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=sanitize-leak - - # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859223 - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=sanitize-thread @@ -74,47 +61,18 @@ matrix: # OSX { - os: osx - osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=default - os: osx - osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=libcxx - os: osx - osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx - os: osx - osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-13-make-cxx14 - os: osx - osx_image: xcode9.4 env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-13-cxx14 - - os: osx - osx_image: xcode9.4 - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=ios-nocodesign-11-4-dep-9-3 - - - os: osx - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=default - - os: osx - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=libcxx - - os: osx - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx - os: osx env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=osx-10-11 - # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164878134 - # - os: osx - # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=ios-nocodesign-9-3 - - # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859218 - # - os: osx - # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon - - # FIXME: https://travis-ci.org/ingenue/hunter/jobs/164859220 - # - os: osx - # env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze - - # } - install: # Info about OS - uname -a From 2a727aec0e462db91a6fadec08c0e71901d68c9d Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Thu, 17 Oct 2019 15:21:01 +0100 Subject: [PATCH 20/30] added appveyor_build_worker_images --- appveyor.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 9e907820c..3eeab907f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,56 +28,67 @@ environment: PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - TOOLCHAIN: "ninja-vs-12-2013-win64" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 - TOOLCHAIN: "nmake-vs-15-2017-win64-cxx17" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - TOOLCHAIN: "nmake-vs-15-2017-win64" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - TOOLCHAIN: "nmake-vs-12-2013-win64" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 - TOOLCHAIN: "nmake-vs-12-2013" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 - TOOLCHAIN: "vs-10-2010" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2010 - TOOLCHAIN: "vs-11-2012" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2012 - TOOLCHAIN: "vs-12-2013-win64" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 - TOOLCHAIN: "vs-12-2013-xp" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 - TOOLCHAIN: "vs-12-2013" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 # FIXME: # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1053/job/l4ud1nf8pbo11tkh @@ -85,36 +96,43 @@ environment: PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - TOOLCHAIN: "vs-14-2015-win64" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - TOOLCHAIN: "vs-15-2017" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - TOOLCHAIN: "vs-15-2017-win64" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - TOOLCHAIN: "vs-16-2019" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - TOOLCHAIN: "vs-16-2019-win64" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - TOOLCHAIN: "vs-9-2008" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN HUNTER_ROOT: C:\.HUNTER + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2008 - TOOLCHAIN: "mingw" PROJECT_DIR: examples\hdf5 From 491aa02eb97268d18cc5747511a25b19d4dff0b2 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Thu, 17 Oct 2019 17:04:10 +0100 Subject: [PATCH 21/30] updated hdf5 with lowcase szip_FOUND --- cmake/configs/default.cmake | 2 +- cmake/projects/hdf5/hunter.cmake | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/cmake/configs/default.cmake b/cmake/configs/default.cmake index 5c2cf2b2b..41bdba2f0 100644 --- a/cmake/configs/default.cmake +++ b/cmake/configs/default.cmake @@ -279,7 +279,7 @@ hunter_default_version(gumbo VERSION 0.10.1) hunter_default_version(h3 VERSION 3.0.7) hunter_default_version(half VERSION 1.1.0-p1) hunter_default_version(harfbuzz VERSION 1.7.6-p2) -hunter_default_version(hdf5 VERSION 1.10.5-hp3) +hunter_default_version(hdf5 VERSION 1.10.5-hp4) hunter_default_version(highwayhash VERSION 0.0.0) hunter_default_version(http-parser VERSION 2.8.0) hunter_default_version(hunter_venv VERSION 1.0.1) diff --git a/cmake/projects/hdf5/hunter.cmake b/cmake/projects/hdf5/hunter.cmake index 613628ae6..f2c27e93f 100644 --- a/cmake/projects/hdf5/hunter.cmake +++ b/cmake/projects/hdf5/hunter.cmake @@ -53,6 +53,17 @@ hunter_add_version( "968876aee5af1edf70ce352b6d94fd5ffac338bf" ) +hunter_add_version( + PACKAGE_NAME + hdf5 + VERSION + "1.10.5-hp4" + URL + "https://github.com/cpp-pm/hdf5/archive/1.10.5-hp4.tar.gz" + SHA1 + "212fe7ae2e39a9fd3cd771aabc5ddedf31c5daa4" +) + hunter_cmake_args( hdf5 CMAKE_ARGS From 4b485232d02c6f964055bc46e1b09fb68f913000 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 18 Oct 2019 10:02:48 +0100 Subject: [PATCH 22/30] changed to higher case lib name --- .travis.yml | 2 ++ examples/hdf5/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 62e8375de..7f0a50d48 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,6 +38,8 @@ matrix: env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-cxx14 + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-lto - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-cxx14-pic - os: linux diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 033d4c8df..94b4835e1 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -10,7 +10,7 @@ hunter_add_package(hdf5) find_package(ZLIB CONFIG REQUIRED) find_package(szip CONFIG REQUIRED) -find_package(hdf5 CONFIG REQUIRED) +find_package(HDF5 CONFIG REQUIRED) add_executable(foo h5_write.c) target_link_libraries(foo hdf5::hdf5-static) From 3dc884d61801ee1ae757a853710a4c6f8bb86f5a Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 18 Oct 2019 10:50:00 +0100 Subject: [PATCH 23/30] Added analyze toolchain updated hdf5 --- .travis.yml | 2 ++ cmake/configs/default.cmake | 2 +- cmake/projects/hdf5/hunter.cmake | 13 +++++++++++++ examples/hdf5/CMakeLists.txt | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7f0a50d48..d08211448 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,6 +36,8 @@ matrix: env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=default - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-cxx14 - os: linux diff --git a/cmake/configs/default.cmake b/cmake/configs/default.cmake index 41bdba2f0..b13229ee5 100644 --- a/cmake/configs/default.cmake +++ b/cmake/configs/default.cmake @@ -279,7 +279,7 @@ hunter_default_version(gumbo VERSION 0.10.1) hunter_default_version(h3 VERSION 3.0.7) hunter_default_version(half VERSION 1.1.0-p1) hunter_default_version(harfbuzz VERSION 1.7.6-p2) -hunter_default_version(hdf5 VERSION 1.10.5-hp4) +hunter_default_version(hdf5 VERSION 1.10.5-hp5) hunter_default_version(highwayhash VERSION 0.0.0) hunter_default_version(http-parser VERSION 2.8.0) hunter_default_version(hunter_venv VERSION 1.0.1) diff --git a/cmake/projects/hdf5/hunter.cmake b/cmake/projects/hdf5/hunter.cmake index f2c27e93f..15a46610c 100644 --- a/cmake/projects/hdf5/hunter.cmake +++ b/cmake/projects/hdf5/hunter.cmake @@ -64,6 +64,19 @@ hunter_add_version( "212fe7ae2e39a9fd3cd771aabc5ddedf31c5daa4" ) + +hunter_add_version( + PACKAGE_NAME + hdf5 + VERSION + "1.10.5-hp5" + URL + "https://github.com/cpp-pm/hdf5/archive/1.10.5-hp5.tar.gz" + SHA1 + "3e9c4bddabd03102bab681d997edb38f7a7844a0" +) + + hunter_cmake_args( hdf5 CMAKE_ARGS diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 94b4835e1..033d4c8df 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -10,7 +10,7 @@ hunter_add_package(hdf5) find_package(ZLIB CONFIG REQUIRED) find_package(szip CONFIG REQUIRED) -find_package(HDF5 CONFIG REQUIRED) +find_package(hdf5 CONFIG REQUIRED) add_executable(foo h5_write.c) target_link_libraries(foo hdf5::hdf5-static) From a710fa2556286a402a966e5696aa00be5f32e1bb Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Fri, 18 Oct 2019 16:39:56 +0100 Subject: [PATCH 24/30] updated example based on hdf5 example --- .travis.yml | 3 +-- examples/hdf5/CMakeLists.txt | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index d08211448..16a0ec880 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,7 @@ addons: packages: - python3-pip - python3-setuptools # easy_install3 + - binutils # https://github.com/travis-ci-tester/travis-test-clang-cxx-11 - libstdc++-7-dev @@ -36,8 +37,6 @@ matrix: env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=default - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx - - os: linux - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=analyze - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-cxx14 - os: linux diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 033d4c8df..0fe2ab925 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -10,7 +10,17 @@ hunter_add_package(hdf5) find_package(ZLIB CONFIG REQUIRED) find_package(szip CONFIG REQUIRED) -find_package(hdf5 CONFIG REQUIRED) + +set (LIB_TYPE STATIC) # or SHARED +string(TOLOWER ${LIB_TYPE} SEARCH_TYPE) + +find_package (HDF5 NAMES hdf5 COMPONENTS C ${SEARCH_TYPE}) + +set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${HDF5_INCLUDE_DIR}") +set (LINK_LIBS ${LINK_LIBS} ${HDF5_C_${LIB_TYPE}_LIBRARY}) add_executable(foo h5_write.c) -target_link_libraries(foo hdf5::hdf5-static) +target_link_libraries(foo ${LINK_LIBS}) + + + From 1673574493b0b835ec4493289572f3759fe286d5 Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Mon, 21 Oct 2019 09:38:23 +0100 Subject: [PATCH 25/30] updating include dir --- examples/hdf5/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 0fe2ab925..693e2baf4 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -16,7 +16,10 @@ string(TOLOWER ${LIB_TYPE} SEARCH_TYPE) find_package (HDF5 NAMES hdf5 COMPONENTS C ${SEARCH_TYPE}) -set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${HDF5_INCLUDE_DIR}") +message("{HDF5_INCLUDE_DIR} is ${HDF5_INCLUDE_DIR}) +message("{HDF5_INSTALL_INCLUDE_DIR} is ${HDF5_INSTALL_INCLUDE_DIR}) + +set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${HDF5_INSTALL_INCLUDE_DIR}") set (LINK_LIBS ${LINK_LIBS} ${HDF5_C_${LIB_TYPE}_LIBRARY}) add_executable(foo h5_write.c) From 09d0474aee2164024ad1e8bcabcdfcea494777cb Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Mon, 21 Oct 2019 09:46:58 +0100 Subject: [PATCH 26/30] Removed old toolchains --- appveyor.yml | 18 ------------------ examples/hdf5/CMakeLists.txt | 6 +++++- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 3eeab907f..0cd0777a6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -60,18 +60,6 @@ environment: HUNTER_ROOT: C:\.HUNTER APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 - - TOOLCHAIN: "vs-10-2010" - PROJECT_DIR: examples\hdf5 - HUNTER_BINARY_DIR: C:\__BIN - HUNTER_ROOT: C:\.HUNTER - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2010 - - - TOOLCHAIN: "vs-11-2012" - PROJECT_DIR: examples\hdf5 - HUNTER_BINARY_DIR: C:\__BIN - HUNTER_ROOT: C:\.HUNTER - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2012 - - TOOLCHAIN: "vs-12-2013-win64" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN @@ -128,12 +116,6 @@ environment: HUNTER_ROOT: C:\.HUNTER APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - - TOOLCHAIN: "vs-9-2008" - PROJECT_DIR: examples\hdf5 - HUNTER_BINARY_DIR: C:\__BIN - HUNTER_ROOT: C:\.HUNTER - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2008 - - TOOLCHAIN: "mingw" PROJECT_DIR: examples\hdf5 HUNTER_BINARY_DIR: C:\__BIN diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 693e2baf4..f635e98bd 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -18,8 +18,12 @@ find_package (HDF5 NAMES hdf5 COMPONENTS C ${SEARCH_TYPE}) message("{HDF5_INCLUDE_DIR} is ${HDF5_INCLUDE_DIR}) message("{HDF5_INSTALL_INCLUDE_DIR} is ${HDF5_INSTALL_INCLUDE_DIR}) +message("{INCLUDE_INSTALL_DIR} is ${INCLUDE_INSTALL_DIR}) -set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${HDF5_INSTALL_INCLUDE_DIR}") +message("{hdf5_INCLUDE_DIR} is ${hdf5_INCLUDE_DIR}) +message("{hdf5_INSTALL_INCLUDE_DIR} is ${hdf5_INSTALL_INCLUDE_DIR}) + +set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${INCLUDE_INSTALL_DIR}") set (LINK_LIBS ${LINK_LIBS} ${HDF5_C_${LIB_TYPE}_LIBRARY}) add_executable(foo h5_write.c) From 3f4ddf63fc8e5c94a2d6d34c069705442299133a Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Mon, 21 Oct 2019 14:56:58 +0100 Subject: [PATCH 27/30] fixed strings --- examples/hdf5/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index f635e98bd..56c5bd2a0 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -16,12 +16,12 @@ string(TOLOWER ${LIB_TYPE} SEARCH_TYPE) find_package (HDF5 NAMES hdf5 COMPONENTS C ${SEARCH_TYPE}) -message("{HDF5_INCLUDE_DIR} is ${HDF5_INCLUDE_DIR}) -message("{HDF5_INSTALL_INCLUDE_DIR} is ${HDF5_INSTALL_INCLUDE_DIR}) -message("{INCLUDE_INSTALL_DIR} is ${INCLUDE_INSTALL_DIR}) +message("{HDF5_INCLUDE_DIR} is ${HDF5_INCLUDE_DIR}") +message("{HDF5_INSTALL_INCLUDE_DIR} is ${HDF5_INSTALL_INCLUDE_DIR}") +message("{INCLUDE_INSTALL_DIR} is ${INCLUDE_INSTALL_DIR}") -message("{hdf5_INCLUDE_DIR} is ${hdf5_INCLUDE_DIR}) -message("{hdf5_INSTALL_INCLUDE_DIR} is ${hdf5_INSTALL_INCLUDE_DIR}) +message("{hdf5_INCLUDE_DIR} is ${hdf5_INCLUDE_DIR}") +message("{hdf5_INSTALL_INCLUDE_DIR} is ${hdf5_INSTALL_INCLUDE_DIR}") set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${INCLUDE_INSTALL_DIR}") set (LINK_LIBS ${LINK_LIBS} ${HDF5_C_${LIB_TYPE}_LIBRARY}) From 0afe65532de6481174a49a68b3c4b4185d92208a Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Mon, 21 Oct 2019 15:27:31 +0100 Subject: [PATCH 28/30] displaying all variables --- examples/hdf5/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index 56c5bd2a0..c35f18cf7 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -16,6 +16,12 @@ string(TOLOWER ${LIB_TYPE} SEARCH_TYPE) find_package (HDF5 NAMES hdf5 COMPONENTS C ${SEARCH_TYPE}) +get_cmake_property(_variableNames VARIABLES) +list (SORT _variableNames) +foreach (_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") +endforeach() + message("{HDF5_INCLUDE_DIR} is ${HDF5_INCLUDE_DIR}") message("{HDF5_INSTALL_INCLUDE_DIR} is ${HDF5_INSTALL_INCLUDE_DIR}") message("{INCLUDE_INSTALL_DIR} is ${INCLUDE_INSTALL_DIR}") From d08f75d9b70f4d93db1413e130a0bad2d6806f9a Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Mon, 21 Oct 2019 17:47:10 +0100 Subject: [PATCH 29/30] Passed HDF5_DIR to example project --- examples/hdf5/CMakeLists.txt | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/examples/hdf5/CMakeLists.txt b/examples/hdf5/CMakeLists.txt index c35f18cf7..53467ce0b 100644 --- a/examples/hdf5/CMakeLists.txt +++ b/examples/hdf5/CMakeLists.txt @@ -14,20 +14,9 @@ find_package(szip CONFIG REQUIRED) set (LIB_TYPE STATIC) # or SHARED string(TOLOWER ${LIB_TYPE} SEARCH_TYPE) -find_package (HDF5 NAMES hdf5 COMPONENTS C ${SEARCH_TYPE}) - -get_cmake_property(_variableNames VARIABLES) -list (SORT _variableNames) -foreach (_variableName ${_variableNames}) - message(STATUS "${_variableName}=${${_variableName}}") -endforeach() +set(ENV{HDF5_DIR} "$ENV{HDF5_ROOT}/cmake/hdf5") -message("{HDF5_INCLUDE_DIR} is ${HDF5_INCLUDE_DIR}") -message("{HDF5_INSTALL_INCLUDE_DIR} is ${HDF5_INSTALL_INCLUDE_DIR}") -message("{INCLUDE_INSTALL_DIR} is ${INCLUDE_INSTALL_DIR}") - -message("{hdf5_INCLUDE_DIR} is ${hdf5_INCLUDE_DIR}") -message("{hdf5_INSTALL_INCLUDE_DIR} is ${hdf5_INSTALL_INCLUDE_DIR}") +find_package (HDF5 NAMES hdf5 COMPONENTS C ${SEARCH_TYPE}) set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${INCLUDE_INSTALL_DIR}") set (LINK_LIBS ${LINK_LIBS} ${HDF5_C_${LIB_TYPE}_LIBRARY}) From ebaab74c8695df153073de783f0297ef8e4b0cee Mon Sep 17 00:00:00 2001 From: Thomas Guerneve Date: Tue, 22 Oct 2019 09:18:32 +0100 Subject: [PATCH 30/30] added lto toolchain on linux Removed failing mingwins --- .travis.yml | 4 ++-- appveyor.yml | 22 ---------------------- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/.travis.yml b/.travis.yml index 16a0ec880..3275f9da2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,8 +39,6 @@ matrix: env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-libstdcxx - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-cxx14 - - os: linux - env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-lto - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-cxx14-pic - os: linux @@ -49,6 +47,8 @@ matrix: env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-fpic-static-std - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=clang-fpic-static-std-cxx14 + - os: linux + env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=gcc-lto - os: linux env: PROJECT_DIR=examples/hdf5 TOOLCHAIN=gcc-7 - os: linux diff --git a/appveyor.yml b/appveyor.yml index 0cd0777a6..add182a63 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -116,28 +116,6 @@ environment: HUNTER_ROOT: C:\.HUNTER APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - - TOOLCHAIN: "mingw" - PROJECT_DIR: examples\hdf5 - HUNTER_BINARY_DIR: C:\__BIN - HUNTER_ROOT: C:\.HUNTER - - - TOOLCHAIN: "mingw-cxx14" - PROJECT_DIR: examples\hdf5 - HUNTER_BINARY_DIR: C:\__BIN - HUNTER_ROOT: C:\.HUNTER - - - TOOLCHAIN: "mingw-cxx17" - PROJECT_DIR: examples\hdf5 - HUNTER_BINARY_DIR: C:\__BIN - HUNTER_ROOT: C:\.HUNTER - - # FIXME: - # * https://ci.appveyor.com/project/ingenue/hunter/build/1.0.1053/job/mtnnis065ibe658y - - TOOLCHAIN: "msys" - PROJECT_DIR: examples\hdf5 - HUNTER_BINARY_DIR: C:\__BIN - HUNTER_ROOT: C:\.HUNTER - install: # Python 3 - cmd: set PATH=C:\Python34-x64;C:\Python34-x64\Scripts;%PATH%

    3e-SDq?s2wHB9? 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 literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images/create-server.png b/docs/user-guides/hunter-user/images/create-server.png new file mode 100644 index 0000000000000000000000000000000000000000..923a20daba80b685d1754f5b42140ec99e4ccc5d GIT binary patch literal 25853 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 literal 0 HcmV?d00001 diff --git a/docs/user-guides/hunter-user/images/travis-owner.png b/docs/user-guides/hunter-user/images/travis-owner.png new file mode 100644 index 0000000000000000000000000000000000000000..cad896224f8df58443dce11976bf915be63b6dcf GIT binary patch literal 46123 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

    us$vZz$Zf%AMv$ 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 + * Including it with some URL/SHA1 (`example `__) + * Adding ``hunter_add_package`` commands (`example `__) + +* **Test** your changes. Add temporary release to Hunter system and + check that ``hunter_add_package(foo)`` is actually working. Do it at least + for one toolchain :ref:`locally ` but of course it will be + better if you test all of them :ref:`remotely `. + +Note that I'm not willing and can't maintain all packages in practice. Therefore +I do add all developers to the team **if they ask to**. If you want to be +a **maintainer**, keep eye on changes, pull requests, be responsible for review +and releases - let me know. + +Also note that Hunter is designed to have **zero maintenance** for such tasks, +since you can add ``HUNTER_ENABLED=OFF`` option at the top of the project +to skip all package management stuff (see :doc:`/overview/compatibility`). It +means you can push branch ``hunter`` to upstream without affecting +functionality of the project. As a summary it may sounds strange, but the final +goal of this organization is to have no forks of packages at all. + +.. _"new package" label: https://github.com/ruslo/hunter/issues?q=is%3Aopen+is%3Aissue+label%3A%22new+package%22 diff --git a/docs/creating-new/update.rst b/docs/creating-new/update.rst new file mode 100644 index 000000000..15ee620b4 --- /dev/null +++ b/docs/creating-new/update.rst @@ -0,0 +1,136 @@ +.. Copyright (c) 2017, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + diff + +Update package +-------------- + +.. note:: + + If package lives in https://github.com/hunter-packages, it should be + released there first. Check :doc:`Patch sources ` + section. + +Create branch for working on package update: + +.. code-block:: none + + [hunter]> git checkout master + [hunter]> git checkout -b pr.hunter_box_1 + +Calculate SHA1 of release: + +.. code-block:: none + + > wget https://github.com/hunterbox/hunter_box_1/archive/v1.0.1.tar.gz + > openssl sha1 v1.0.1.tar.gz + SHA1(v1.0.1.tar.gz)= 10d046eec6c8b0aabd28bd3d1b99faf6beeb226b + +Add URL and SHA1 to corresponding ``hunter.cmake``: + +.. literalinclude:: hunter-NEW.cmake + :diff: hunter.cmake + +.. hint:: + + Put new ``hunter_add_version`` at the bottom of file, diff will look + prettier in this case. + +Update default version in ``cmake/configs/default.cmake``: + +.. literalinclude:: default-NEW.cmake + :diff: default.cmake + +Commit changes: + +.. code-block:: none + + [hunter]> git add cmake/projects/hunter_box_1/hunter.cmake + [hunter]> git add cmake/configs/default.cmake + [hunter]> git commit -m "Update 'hunter_box_1' to v1.0.1" + +Testing +======= + +.. note:: + + Check :ref:`Create package: CI testing ` page for registering + services and branches/remotes description. + +Fetch latest CI configs, you may need to run ``git pull`` if you have +``pkg.hunter_box_1`` locally: + +.. code-block:: none + + [hunter]> git fetch ci + [hunter]> git checkout pkg.hunter_box_1 + [hunter]> git pull + +If the package has not been updated in some time, the CI toolchains +may have fallen out of date. It is preferable to keep the CI +configuration in sync with the working defaults from ``pkg.template`` +to make sure the package will build with recent compilers and to help +ensure cache hits for any required Hunter managed dependencies. + +.. code-block:: none + + [hunter]> git checkout pkg.template + [hunter]> git pull + [hunter]> git checkout pkg.hunter_box_1 + [hunter]> git merge pkg.template + +Create temporary branch ``test.hunter_box_1`` for testing basing on +``pkg.hunter_box_1``: + +.. code-block:: none + + [hunter]> git checkout -b test.hunter_box_1 + +Merge it with ``hunter_box_1`` package updates: + +.. code-block:: none + + [hunter]> git merge pr.hunter_box_1 + +Push changes to your Hunter fork remote to start tests: + +.. code-block:: none + + [hunter]> git push -u origin test.hunter_box_1 + +.. image:: /creating-new/images/pr-update-version.png + :align: center + :alt: Branches + +Add toolchains +============== + +If new version of package fix some build: + +* Add new version to ``master`` +* Tests against **old** set of toolchains +* New version merged to master +* Send pull request to ``pkg.hunter_box_1`` to enable **new** toolchains + +Remove toolchains +================= + +If new version broke some toolchain: + +* Disable toolchains in ``pkg.hunter_box_1`` +* Add new version to ``master`` +* Tests against **new** set of toolchains without broken + +Submit the pull request to Hunter +================================= + +Once the tests are passing, and all required toolchain modifications have been applied to the ``ci`` fork in ``pkg.hunter_box_1`` via pull requests (see above), the original package update in ``pr.hunter_box_1`` should then be pushed to your Hunter fork (``origin`` in above discussions): + +.. code-block:: none + + [hunter]> git push -u origin pr.hunter_box_1 + +Finally, a pull request should be opened to send the package update to the main Hunter repository, as illustrated in the previous section pull request `screen shot `__ (see `example `__). diff --git a/docs/creating-new/yed/branches.graphml b/docs/creating-new/yed/branches.graphml new file mode 100644 index 000000000..331084a82 --- /dev/null +++ b/docs/creating-new/yed/branches.graphml @@ -0,0 +1,711 @@ + + + + + + + + + + + + + + + + + + + + + + + master + + + + + + + + + + + + + + + + + + + pkg.template + + + + + + + + + + + + + + + + + + + pkg.<name> + + + + + + + + + + + + + + + + + + + upload.<name> + + + + + + + + + + + + + + + + + + + Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ruslo/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .travis.yml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test 'examples/foo' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .travis.yml/appveyor.yml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test 'examples/<name>' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .travis.yml/appveyor.yml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Upload '<name>' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .travis.yml/appveyor.yml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/creating-new/yed/pr-update-version.graphml b/docs/creating-new/yed/pr-update-version.graphml new file mode 100644 index 000000000..e99e76877 --- /dev/null +++ b/docs/creating-new/yed/pr-update-version.graphml @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + master + + + + + + + + + + + + + + + + + + + pkg.template + + + + + + + + + + + + + + + + + + + pkg.hunter_box_1 + + + + + + + + + + + + + + + + + + + ruslo/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + upload.hunter_box_1 + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pr.hunter_box_1 + + + + + + + + + + + + + + + + + + + test.hunter_box_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/creating-new/yed/pull-request-testing.graphml b/docs/creating-new/yed/pull-request-testing.graphml new file mode 100644 index 000000000..006bfe830 --- /dev/null +++ b/docs/creating-new/yed/pull-request-testing.graphml @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + master + + + + + + + + + + + + + + + + + + + pkg.template + + + + + + + + + + + + + + + + + + + pkg.hunter_box_1 + + + + + + + + + + + + + + + + + + + ruslo/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pr.hunter_box_1 + + + + + + + + + + + + + + + + + + + pkg.hunter_box_1.pr-N + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/creating-new/yed/pull-request.graphml b/docs/creating-new/yed/pull-request.graphml new file mode 100644 index 000000000..6a38275c4 --- /dev/null +++ b/docs/creating-new/yed/pull-request.graphml @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + + + + + + + + + + master + + + + + + + + + + + + + + + + + + + pkg.template + + + + + + + + + + + + + + + + + + + pkg.<name> + + + + + + + + + + + + + + + + + + + upload.<name> + + + + + + + + + + + + + + + + + + + ruslo/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ingenue/hunter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pr.hunter_box_1 + + + + + + + + + + + + + + + + + + + pr.pkg.hunter_box_1 + + + + + + + + + + + + + + + + + + + test.hunter_box_1 + + + + + + + + + + + + + + + + + + + + Temporary branch. +No pull request with +this change. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/faq/android-studio-breakpoint.png b/docs/faq/android-studio-breakpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..db5a90eff2b985f299042f386472701e24a57d52 GIT binary patch literal 129211 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 z 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 V3Q&=ji23hFFFLt9k}h0J{vXwZ@`nHb literal 0 HcmV?d00001 diff --git a/docs/faq/android-studio-debugger.png b/docs/faq/android-studio-debugger.png new file mode 100644 index 0000000000000000000000000000000000000000..79de2d18e3ebbd865affcfbf358f1ed68f91f1a8 GIT binary patch literal 155179 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Ú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 b8*kt+i_%gH!9k8-ppT@eoJhHlf&c#j8=h2^ literal 0 HcmV?d00001 diff --git a/docs/faq/android-studio-hello-jni.png b/docs/faq/android-studio-hello-jni.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1ce09ae4fd5c4d185d25239a78363eca80c364 GIT binary patch literal 267835 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

  • ~L>@6Ok$vw2X#ar1TU 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 TSpxo?5{{yrs%(jjiQj(!X(#}U literal 0 HcmV?d00001 diff --git a/docs/creating-new/images/pr-with-package.png b/docs/creating-new/images/pr-with-package.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3e47a73d3f638947e6936d51d60532bbe7ee20 GIT binary patch literal 30959 zcmce-2{fDiw?EqVZOhw1wN8wAEHo)LdhznqrP2 z2vQU!#ugC~(VB_Gm>`n;qwnvWv+n=gbMODGd)9r{vYzLW@35c!-NR?^@BT(TGScNb ze)0IBLx;E?KDhVz(4oVdhYtN2_1B;5{{%fEFR*Wa_&wIWbEsnA(h~dSi1Tg3+lLNS z$Di1@JIa1P=Ka9Z@6e%B9S47ZbbA$p*!^BVym$LaknL*AZl+*ob`b>D4gIozn5Nrb z`~1C&@?=qFum(1w$fNJ$^EHn5nyYO&LiFDAz=>xr5w|&N8o27)9w1^(@Uk z!i=Y}i92*CmvtF;_~7C5p&p@w``3c0FZIoU+60T!50^n;NCM6l<(| z4X7|S`3F(Z-AqnHv5yk}44CMY)x#Xxi>zeK5|?iZ(`FUsrJvS!Jc+#U4@rMN?@Azb zD{1Tu3J(Z>A5@#$+LUctilYk$lT79ao2}cO3ejJo6997X?ng_m!V8Ivb3Tjxb20Na zTST;Xk@nC5O-TkbAoNUBsgXh(!%JJ4WnAq=c)tn>9xf189equg5?bhCyng}G*3n>= zllrusFaPF7Ve;Fa@EJ}1k44)>P`CB9j}oyyYn}MPA3vERC&*zP=h|=HLBK?Qb4*V2 zrXCdnYyPFZRK-kxpN%k$EY)yS7I%>g;hB2xQX z?SRqJyDKoOpxuQ{?d;&*C1=J=9axjNUaHmomXpkC;~$hTS7mGhrq)NA?#_Ee0{C*0 z0;a8vivf{i+QHqtz@0TB2*{(hdsmpbpJJnQPMpr$gF*X_>1z4gj|Gj5bZ!bo1>_zM zCw3`STKR7R2KGKM88fEFyWjY)XVKR7zE#RM`*s)A#AXajnI=d>Qb`1AcfAIB?UONR z#(N{O0@5`iH==Ezx_rpSfzysk;tu<{@x~Z_`&)M}v1I*}PTYmfeU$;`Q2GL}dTnW& zSMUi+fprJ+3GT49Bx_r+B%%%pODYeT zpyeotMT_8sA**1bM#rqfpsBWoGP4xvP^s+#)l~MTYD+)mx%X2dUp#`-7D7WeF;1$}5JURTUCe4`1KR%TvW24pVotL_T#s=6^>l-Nc{OXq}k zX+N!53nz?BPfrx_%~n%JSTtH4G}kVP(XOuThnU665|Syydvn}_XgSuG&Aif_E%5Wg zEA*9Ca9dANjwpSFL>L#hM49yAw0W0{U^ zSRyrxGI^2k%LiujHqKx33o6iQ#=3Qiv>6@GtsUye)q!=MdLGQnqjZCZI_ z@R_C_wX!(=@pAr5ygn;^qWY%}zoT>6rW+9=+^mA%yP%AIq-EIE)lO6`*;6?%gK~`q zA&9{U2WcEkj-Ib=dnR_oVbHcx0VxnqWikaM&%N~_-jHJ%)b&RB!IX}^GNi7f2Wx(f zp)pe)I}z{BI~dz0h_xqG?&eD@yB(+=t%P8drd^go5(ZS z>|h&M21t9L8z1b?T|949N9jQcmYLYIC8xwz-JaYY86tgzYm z=0KC(Poq4A{9G8+ATYDD=6hOy5HE%-QEL!t1F}T}$sp)*tiHiZ-OY|i5=CJS(KP5i4WWY6qNM(B}K?stmZdlNi&Q!0$ije-X_%tIh@w zY~Br>{TUMVSdizV>*DJXjWbQq`p$yjihkz6%!L%Fkn^RUR=8L6gKRd_r4rpXJ3wkw zn5P9C*u7|nP|hs<$s3<(He2i!zIT=8C6ets#_u(TR(o2wxpVOC27K%ZAyUxL`+RO0 z`@3oT6dZ&Y2D3o0;<4I}tl0-|)T1j6wp4KZ=utT9En|`*+sqo)W#%%g2ICYBMSZ{b zw6@v77eDG!k{G%b5Vb|)hYK3LDr|K`UDw7kz3&gaRG8l{+-GDB%p7=YIm??5s8sHc zeS7UT>p)HE1eS0uQ}|9v3Tbo5JTx8B!&T%cMhq?6z>hnIWRf!kKOu5K*W7H#?On{DJ!Av>&j{sdEd|o;P%n-ic1sKdrP~(K^7mggnyF$ zHn`(A9C)#m_YeW4#6nt=8NQ%3Y-{Ow(BM%uMpomqI*A(}K@>(0Kdgn@_G72$f--Qk z^6)Ne$&5cFg9Jov`dQBH$TH{AQj;n;@VghggAbd%Zlw>GUX0v_%-YqMCX+IS3$f&V zgRy6$UaBW{z0O7o2o63vN$|UEZm|yeGvES#|Kl#c>}O@nZ{YAO#3h+T6o4!R3f_0l z-fy%9E}kcYH6R_9dk$Zg0F2A~)VO1y6xiu5+g6)yLkbF;8NS&W=hnIS96@=qJ6?lb zb{_3dVw5R(Szlnhu9>OU56EN!^Ll2&x3tGETJJhA{1TV+s52@C^OR=;dqcFG80dEl z^o8lfV#C{Zrpz#08)2Ciy3#h3aDa^1^rVu^=C8N9gm-1V8T5#{C%>&;$SM|g?qUjC zUN)wlou8lFe7wVqyWd$w zPOOvA9iGDqT7pcnI9tHJfQD}3PDGAL-()GEd+$U2sQj`pC@nu;qp+D3M*)U1BT2B+ zQAfv4CXrZVKUf0yp^am9%nm86GrFc>-WUv})fBELX@hkow!HRMv-SzxVS6aBjEzG$ z&Sy0db%4!`6Rz-w&NUVFw0`>~4)YsjV6Y3Bt>%o;WItKPe38ISvDxx$zns0QoAe|s zp#>CBufAfgg?KigyJf5)!V0L^)IIMEqoy2I&rY(jkqF`igfeS*wqq#=1!zj*{j$%uWM6~86;5Nc_|9INvv#HF?OpVb8%JJ zhG6$k)DRN_06lLPN4SA&5h$1vCqdQ3n9-Mgdxl#1Ae$L~g7ta1GI(b|7pUNM;MEK+ z&OD&L3Mqb`@BD=KBOls4r0=<05A(+fVEEF&VD_(a7mYdS)EUU6RA%_DEgci%Xv|mx z!>B^ZR3#ir8?mOru#SlYdR|P3Y4w2mk}p&{u^UWoD7bf8bT(ukI6?4}D-;O>YAkos zqtGy^H8zfg;!e>eiff10PrmVXU)AKl->tDZt56ZpdMB0J1h?aiZGkq--$XlgS09kL z$Tg!+&A7WVDmpH!!g~0lq$qT@Z&Nk{N=r;rX9Bcz5Kyy3+`L(gC$skgG~bj!%%N7x zK5bp=*#PGF43}m(A|V@*TKnw(sZc5kR`i8ALb6Clcc1uS=V01*HG@)lja3nnio>dTpiUJKaG5ZmJk$ zICLDQv8H1dKHeU3aO22R!<~qYY?rHdd^T*z+F9bx^fTt7FTv13Q#R1!#^{Jl^C@js z`yebhWB0GinLAtjm6khO7>LxV4_XiV;`*3F{1uRpq2}NA^0~nkT)eO{4w>c&Q_IbD z_$Rb^3DOSxKw7!``)!eJQGIR;}Ou_J!vMQW1AzSlB;t6X9dd?*R@SYI*a|!-qeAw>$LW+~5E0P%GC5LEQLK zw*Zvu4(jZ%Hjr;PIqBOrm==6O0j9O=dQ>VroOu*Gg&b{O7Q|Cf_BS$)_K#!*CHbBn z?eu282+mW=tB6k1sv?}*I%+N4TDzLI&O~o*b2(u9Y-p{rmFi1*@}@&aOVCRh9`i>J zjeIsiq)Fw%<^lWrsk}};Sr0BsdB*lU^Ws&YVPfo%A#?iNe28{Znl$Uy@jCUD# z%@D?$y_eqT6VI(L-_4w&)tGF4;=2NQu|D)SPBv4!h=vVeM`U*qUMG8|B0(^oD|9W0 zRpn)z-%_UJ6&yDF;Q8?T$cY|X&qFD|fN$gssn6|Mn=$v?TB}VpM$)X`NZed4rrTS{ z)PK@1IU^j#s*i2Ju2ebh=Gs%f!o{gnzQ%$jeY8iLr&Zd*IjIR>^sBrn@5VRW<0!9D zzBdm<2mUIpvp?)PEQ7z_r`44I`Gd@T-xs8W=SoD;qR+(?asxBjMcElFImM+jJH#nk zg6+qkayUARIgX%A307ul86Fc7l`7ts6IPE`dqRrRP1|tm8}(}LnksKx4LtsI02k*k`@a9x^fl*u z>X+=!23mUSs+1B*An$i&7F(ACCs#-fyNM6y$LOyT8&SZ1$@HuySK7m-rYZ?B`RB&a>R0-@DD%AdEiY zop1>9cH1c(T(Xt77YB|gZX&J8n9hd{bb z{7y3WPU%%`!%ua8{A_c5EF~Ye2wHnr{*iXsm(BB_)JL1L>CJmXWa;=OvCNIxjFe1A z!8Sv8vjBrIn;cGaUg!ReFz&f^z;RKojI`amKF_=R$!~k__cCaiv7`Z|9%4N#-!<>) zFVU5GLaB=aV#!_h31*k=S$Ye@OHNUY;mBr`FF$UjbaFcBblDm&!jSYu>L?e_YqudwrH-fCBuVsDAEVuvV{^6V1cNxvFG_|HM7D1#;icGg$06ys#kf3S1)VqQwYs)3l zcFv(DpTC=A^!JX6h8E#Gt^as&pV(E>)VzmP54fB&G2~U zpLnEn%BbMC$wa{ZL%)`fi0`OYDr#zE?s&hwD?ZTtF zc%9HF=d|3?I~MjdEZ(QG4ld~5WJeP-#jfijEU>c3SWZDHrR7Ic+3>L~--YV|gxX|& znQKzqS^B{!8E>8L$**&XfpBq?$XLE7g6ogxHf%WqB#}~2u+kGx#xAlh zsVi35Q-E(lSxH{>yo1KvfL^+t9Tb)zm-WF`pb_Qi?cy#>-K;@(Bg zH(+r-+Qw4tXO-*u5^B|O5LMJ)i;~03mAT`Qd$tjl_mRBG2_T^7=SjAjuM;G!Hnll+ z#7=cy#|nHR6}ZYwCd9EBw}-wh#b38y&;JWZ`NVH8Azd*&kTTMetPAijas8b8>zC~? zqIF$56IPyRX3K}x#MDooXu23p`VI`RM$9RyU0Ah#WYJtUZeN@5rzNHlkV45mUcy7r zz3p|g_=D+GZE_IAgU!A5Ulp?FkUyh6gFKd*e=#4JrvS1!=5kIXv@ee}1(vK7=7(MT z;IwM;Ey`2*dmNF+OXl)cKtlliO+RVOFJ}DKO&i5{ra3vBtw*U>Hhu@gv)8At9Pd8 z_Si#bVZTo(9=CF%v?i|!eAeZVY3cRVz?J$bm)+cCvJkfdH+-=N01sb>?j z=}JYo>0J+-wiBmhWbBI7HGk4K6XipTPjzZeAY6wUo$owUY<@CEz@z+%tY1g(Z~ zkE>gn6Ro{V6rP4-q_PB~yiBesJ|6L>q!n6eO{bQX4u_pXY*Wv_qnht z;&)CL4i^}{EBqc*UtzU|iRmiU9Ti;+HFHyJdgAtDVBTL;r{85L$`i0S?xFMOa(;99 zb!&bDbzF9wf9U#{BOmeb#A$#zTge6mX>CVCk zoX7LuDsA4>|LR)`ZY+%v4ZGYzaJ+1RT1<0Ekg1wD??U~Dq9^Fo>p$?{X%>+9=*ja{dM zWdmj&*EI76OpE;B$*sF-NL{^x-ZJK2M~$2lp)E-)e>rz5AoA%AoWV??-Ew-~5upTQy)b50EX-{{Xyw z@qdhvx25u>+GaqM9G*766^86Iq(JUgs;Aeg9W|0_e4gZ*4$s*FR^$uQcg zFrn3tvNo2TWcNYmbTxp(kL%2tGtOn!U{dNgj}5Tj@>Mz`Kk~|$u&NSu3{Nq5dzUA@-;v(8al!VAX(wRLHcd=kZYDlssT4LPoFtM$2vH8dEn|X_txHy z7*ac|!5r4B<)AZPZF}7B+`C6|6AQ}xYw9$cD%XG7TP13WTue87_wHSoOpnl+*uJax z?tN`d1;xL+@5Cb_Vh_|u=-v~pIdfeDDT~?d5D>I0Hjx4 z8*4st`PWwu6Lvc3S4K5*sw*52CmLB-(w1vx2~~Q2A(SM^!`GRS_V>N421Wu2NttA9 z)eIheGqGn08vT+{J>%tomg-LEm>79B1TWLhtUaj}m~t$}zF+^eh|%PQG!k@u1tN=D z-rGg8zNbDYV@-$wrcjHt`mc52e3q(J^W*EtYGTUFH#-kkxqqV`)yt-S{(yS&dwr@} zn>K^whlY|QEQhL@`zPjIyqf031&EgrDV=O8=DsXDbQ9bEALv%NiNm0kaL}bvVpWfA za@u2;73`ph6oSD9)WG7Lo9(O9KEDPUK&)&5Xb{c} zi$QbV=UzH1NDlagUP^^MXu#$Ht+ivkbsye+)vi(&Y+e4pe|q{(pDhA4ux@^grq-WE zEQjf&ayJKoNI|;T$=y}F5aH}OqrOqv{w8vPxhZ4Jb#(5GxZO(S6t$XXpmlfjaqu(+ zEx*EpZ22rX$XurAQwHSbRE$`5tI83#OA$=>??$83-4~Zu`!Wzo==o%l`!61)V?`^A zTeC-`LT5|G`*OCob@k?A%Y%>I`5J{6?wL}{1EH5YMZ4p`{{7j2DeB^UuD6I@gdZhT z{#qGg!CE_fHiaa~(kq$tWAwv5GODe|oKu{k+j-N3z4_JGbDHLHGycM3LTZ}-@G2YL zCae5?C0)@`99k}c!_A7jpEbe`FSQ+W3SCM)*mR_JYbA)$zoQKQAwnMkUJX9tKJsi3 zX-ko;Tn?T2qvjR@W?$s|kLZ{x?#$f}(X1&X&BB7#^q}omfBFk%N5P)8a))Mv;>Vrq zrEtPpfzA1ne`sv{GF1ku(l(?PruKKtZCZaRFBfbmyCD+G<0tL)$f5GqJ~fte8&VWY zyNt61il+TH&7NQYef2>LUY;29zWP>Gph^AqFU>UK#>lhb>GcloFo&^Y&V##qxSH9q z92pGnWU4b}Ib3e#NWmoUsRh7pbKIu+RAH-k=^V-Y<^tb#CA{!NzID`yG&|qLgDh7} z35e3W9AZQ8Yq9YmgT4Az>cqpRT)f?$vQIh`$9Ua%NoA4|GZBF$+F`Q5kO;%TF_t z6AQ6uKD_nKpUWy`+c_z4G6I-$qoBiNq;Yq>Xrm;r|LVKoQe6c%xDk_cD>?KV@dGkC zJ;&94c{G3?+|OrVQQZOBI#sP%_t|^RM|ILwRlC3W_$Uui)6BImB3egm^^3K*h-{+^Ir2bzu`SN zhqmRBNSk{J@w9DLWSWodWFN-)4mU{l0ftkMS{wPz8SW3jT^Tmn+SL5*-3^>F+8r~x zF(I5?PCio4#NfDr$l^m}jb?w~qtz120Zzlr_~4)yh0p(ymVOQ( z$D{9w5?kG4PXdXLrIw@Q8Y~_II!zQXJUN!8fg7k&XN>FBiK9q4H&b)kV7iilMZjl0 zXPy1i>P6XAkcxOs)HGk0an++59klnx z_1o`Me4PCe&^_D&3HVI{UCLHxTMJe1#YGEU?EXeCUPwqu7O)>emgPjuy+rjZ2rPc|(&+YDr*?ySeZ&8qTU?ylz_>V%UGM$H9%a$kWWA6ZHJ^&M zKw0|(jdoagMov>0?UGC9>uqkA#?Q;A(^3iT%TW~bn4I*Nu7^5A7r7uN9v9<`Y9ZUk zRfy%|fy1J=^Hd)GmLi4gI9co6Paqm)a_6pP>Je6*enst1TRu;=m45t*I65{c!e#m` zH4>UkI2N55oqUcKr9A5QHTMo~I%jx${wA$Zm|%WJL?K`K?K4&5q~(ch;G9$i$+d0L zyW4E~L-W>;n=UU8qjMn4 zqnko9{a0p`g+kh zD{UHGi1^7|a)#9mZmhy;xe@QKzi)D%`_h*0Aef@x98y)3TBE=3Yk9tbju6&t>`5*b zcu|gizV2b^=v@BDZ}3~%Xt|CIzN_Q7Yw&L6<`}84eD|o0%mVF@rS0cLd)u56z3U-Y zN|RF5QyA?~tK`bZ@FW@aH=X966gLIlNriO^G0qoxcXW7DC+?dgQ(jV0{bxF_WfE$}r;2BOUzDZS>UUy#f0*^`D%+{r`jh`xsVsv}9&eURX)5W(N7GeJV zYljSf{DXbmPKD39a~Bybc|XYBe>b@`o@69yg~ZwRl|`F2(ZtbKb0k&%^y88*mrmU) zDpGwo^8Bi4og$BU^4&si7cILLA$zc;j6ZB=s!7o)Z0oOypNI}?`T3-9|0gGAG};Ud ziECv7m5Q>zZHqkux$HHwXi=FBrOS$K5&bd7B!K_2a{?*O_hhUrOGO`6uyMgl`r7LN zxvF`OI=276v12OEQ(s*Q4W5e^7CL@h+?^=&ZmI5Hu*ryOtWD1nSjlH=-(cnW^P0XV z|1;A0p=<|W{puBFg6UUqa>{nud66O+iu za~P-Ge|4wi6vtR|`9E;^KhU6OX(9v8h>WxUPm})#RE-JtahF~ z%7RKPR0Y=k7vQ+7?dPa$oZ$5ru=`8)?2Rer!Aybwrg#_Ns(=( zb`|D3bgPzamtU+cj&({(ZR?g~V``zX$sbpufdE{r9s3lK5arFCwviq5R|t$l~h>ah#}#NMItU(w?CkPSgGx)Ig+RjEmRG zKkZ{VJyd&a^%1Ze52+#tUt68zVN6vUL$k>7y=cUxW-0huw%B%LT7!wLI2{PTBzvM0 z9PkPRGuxCr2j|!XZ<o_e9TT^+7A)n zkS*(h9BIXKIp1xnGDY^cv-y7AvbNLRsPe4SVu+2*ae^StSQ0rPqFk1SU43+cEg5G$ z0uYpoD*=6qe}IP=cjDsESGk;VRV+?zaQqeT1ye+lxfl_Nmnkwtnv}& zs#w?{!Rr}`ap|jYwP410UWsV|{f zPCZvgoh_kBE-{HMATW)tq-ft_gtWalkW`WRzJHS_)XiP-Vl)$64#esnMTQh#w!Qd^E5tr*O3zzG6~QV?3;@gw!)9lX(4iyRK%jzlUu$l?IUJ3H7=$Xh$pZQW(@b{EvqSn1HPjb zpI^x!bujVaA%YbK)P&W&RlMhGfnL(c>L(U;7=?{(zi5+E&M)xTDWI9RLnzP|3BMsC z^6Luz6Nm+6P%lNn&&~m-YVwTA;z4fP4^UgN{PNU3tp|f9Eozz}PQYryUQcVYCuc;% zQsiZ2hQFTD_Xo4xaDD2i!aldQGTE5Hycptm11{~F58!ievmyve5 zvZJNmx(sWgzVoTEw|lO#T>I%2QZxk@6M>c%chY|7yxl^z2lRGNL`PvLk3M zH(MvK01M?Cr_7a~MTMW2JPUs!rKxWl2+4_Xl*x{A7}YR4nt5Wh!|F%4<6ou$2HbAj zGOQfNJ!*U1NKj2{qxmYN3{a6`UF%jd7lfb@AD3o2R(3qL_5YhMEqj$?RevEMxc{Z^ z$^w^@cI(bh4WuRZqD^dk9`X}VcWR>*1++qbLbz9VfRSt?F7D12XP1sJnguYS+$`^S ztJ)tc+KLVi)r(i@8n*;6@-`zS6D+x*y6~K4f>4O?SrPoUDC*-}fX&abffefCxERTm zS)#=^a}x=1+4WC3z|Qh!aEEvetTjtuvd0a`J4@53=HVglDUWGDk%G5 zHjHa}j-r7e_`%VI$bBj0uOaMAVBUZBR}glF@ZQ&RR}Nf)h)Chz|9Ck0qik1ta7jF1 zC-c~s!R`Or<^69%On(-qm#YT~3qYjCB@YG_p$>_5ch$S&9YuofvNM%obX_oMO1I(n zz*$$gg;nbz#PDNNS6?ZA_C)Z51lT#q-~E1p8XWNzn)Fl6>?Eim)AK>Zzp4=w{;7@o zzm#zwR2U!n|5Bdt|DL~P(+(zvK`3P9`jeFtwLdKnICGEG*x}XscLIKvGSAMRib6P% zCpDq_-`prIE$kfVfu|-{-(9Kq5`s2VW|HO(zjl`xSNa!UkntYpCwH=^Or@YPG>>Tz%cOQ<2|LrySA6Ul!^C7(7UZpD{nJ9f`iUpUqS~EiN|5AJ~7rzL_Bv&uQ&kz^Vn8sp-K(d4iQ&r04veH)$r3Ny%nHC02!Jl8Qm|F^~I6Y_dEF)TpOpK876j;8Tj{CHF%U{OE6XoocPQJd6 zDnpbz;N?Bk@X@5~iPT`_5bcWP7tbf3oKSxXe^#ctVe~UhY5j@Ea3xIn?0fI-+e7S{ zkWcjUxO@JKdb;NC%dN-53|=Wb^0*WGu!!7PI=fwyG1V|f30ZMsTtIM57{1E}-wP%h zV_S^>L~hj44ea>ZVwEgbo-&(4ymMLtrZ%1hFmBlZATn;ZFG_3I$Xcl^wZ+2c`YU0e zG{X#lrbOLji3H&S-pagz*$guelkhhVZnOQ z*HZ=`JFISYQ=9KPf8BW7i^|VL%yp7V7ej+%3Ka?l0Cm&b%S1`aU+>;245Vk0R=2U} zi3zE)rzQQ{>?(&~yTI51zxPe=G6QNhJXg=b4>?nA!F_#LF*iNQ7do55KRiCwBPde2 zxo=ERk1d&=I}{+>BZbdtK;^ESLkahs9`*!PG|CEdmYBYes)HXERJ&CAtW06U)2=FW zSf=Y@)cY!wUT)cFuy8)(J(mp#wH_cy2)ilUv8R(}@P>4fG_L6tsRUrRrRvhSp#W8zd|ep<=NfzetW~S2D{)wA0?08gwHE zykt<7H%=~ov-rAvF%%RNc-|qK(nRm%>$gr&ee+I5A!~P#lwAs!RsmnME^5$kJv)GMpMeo+;ExcW7MynMoW_)Yr6W$PY5mWE&8K# z_tl5;I+`>lG87W+{bwUy#**V)kQTTHa_xc~d3de+$_ePcKDSgPK8$eD;n$c1_k&R0 zB7G$D$#GHL{^i*B?ik!rRAYtuFJ0G}4Q%txrz1XhYtkA;ds=sT4R>!tn5iDYlRd4I z7tou`<;LZA>UXWQ)F$j-6HLYG?HBSbrEjVlxLOx1O^@$nT(DT!Uk_wU%08D_+*|ye zRz0%?QR~`{MQ|&btS;MOcKVESD&qrb)y%Bo+j5U#UWMso!9MC0G(GV87Vl~UJW?4q zioQQHpn2EdOQ2#oJhwiDC<7ncz{KRO1=`)|(V{$b+T}AFeOV!R3eZ<3zwvnSl)FFp z9;(wt^s!K!cjWEG`gnp;LOSxaJJOZVZsnY>c{saqs1fqLY&k+zIfwOr4|(1I=mpwm zj+-@+-}SZ)&@67~KeupPeE5)BKR3m;D&afduXTK1^bd%)^6%VH!H<#dbaY(dMWl85 zdzblGZYuLzkg_d?<-xbq0=j@L7?<| zV^_--_A*R<`RMuG+^QhUYW63-L70cDBTHZFWyjIa6JDR=V@OckTM5?*JZ|r!ia$lU zw-X+9ljoc}GpuX6YHI8a&5kGVMJKG&9gK@A)X(Zu!x(*2mBOtzIXWIUZy86~zs}C* zd$M?Qpk5Ir*V=KVbm2!^^}3?Mqp{@>=8?npdcE1}fXYi;NCkwR7WP**azaKe+ee-F zj23X>wlRA#v)I*(b61mrp`(sXSx>S)mR9Ug;pOb|tTsorDWlx2pF~eC&u3<___1cS zH-pftXjsW{obRX=+-u6bFU)B99BP{6+gUz>+E!CjHX3aJ1AYW9-ZG0^9hN}O2UsiH zUJPdExEtww`my)!H-wx<@Y&N{z?WO2z76Tr3s_@KUB}b}^qrq|lcSamcAkabC@%ko z2|B)hzl#zNRtuO)kd|7IZ`y-U=PIipc{uJNLSmS$f;+BMVE|OAePwoTYW@G00<~jW0%qKVjBJ!RTxf!)^ z9Y%ttS-Um$$PH(Y^ImD+vUg;~~!sDm_GWkL`5@Q@f8&Df_{bc}n(qE|VG+ z?Aq(8aWCG5UG35Ow0r%LzHny(sk&~SI5phm(4rSKj}iE~C*hkR?v7&nqjBf|KY;Up ziMZMx8dKRAbB$Wf)nCHQ)v0Q| zSIB>GEtnSG%OkGZnl*@K6u*8o$|09pyTRL|(2apVWII*Z4;+i;b1LySfa9 zs5mqf%>=U^^z9SMJZpOYnE8vQ4yL47K)1#}26M6Ffobo>wc*$Z>%V9pPO|4}i{Lc; zdObgXXL$IqE_YL$kb2PcBZ(4>{_}@Z8&Xo+DBkyRaTygO_qE<(-Yd!;L=<|LpeyA7 zTfB?yp)J*bq?R76SYHG+OcY`}Sr3^T(=0s>mL(#*T#&Ot0_4&5w!@;3iq~|f#+SDd}aMJ3@t!FPlA6*c_7fgIYLETe7R{-2$kh!(d!(EMsBhqAu zyODXr4xGBw*pIyk@2%V`%sdR>!BOkrMR>}_WFMM{$*cr=G}~OGV(heczrjg=>NXaDb*u>wbMkFuG-MV35g+SYi(X$6n3aY57A!O-E zsdQTD8_|3ez|*8>s^sB;%)MB8_2p2HT+|?m6W!vAg}v47KDDd{&yc>P-r)SK^mTa7 zL4ElbgBJ&_dIm|bi^<1D@ie`oCNl3y#1?mj!QT_U{msv>pvsLsbQ#Wf(<&IV2^=d% zzRLKKKq9h*h#iTxwE9@Mvc=!tz5>5iIJwwwgT7euJoV6C)gpMGX$HI0=IfDUeA7WUS>?Towrmi054-AorB8;{^#1*Ol6Do8Eie7b z<>`+Q=c6xM606f4);0KLP~3=fqq`PKB?mg4y{3`3rON*O5Vu!%3t( z&G%9`ed@p{v@{$9xq{2AoSZx@zu|G|AvFR;i)Rm`wu+BsM?c#REq^QQ4%rEkIxv5* zKZA<$jY$*G>=Bx{+u=3ypj|6y`pa+xTdZ7Z!m8fW3?OSq_T8_}C z@4PtR^fhEqqGoOM)j`q$`)@YU>ay`r#sn3j?2gu@H(9l=Z1*d_HU1UZs!+9Bfdy+L zgRu&CQ8|LyM4qs`DuW_Qk?8tZh!FJd`EM(cG zR%g!eq=L9T@^2%Aamv2ai){o9@}y0@eGnP`v($!DiC!IE!_;>U@ z{EfEoR864u8gxjq(ppmk{A@?EsK2pvYJYws8+tyGceGIbD&6O6$jgJRfR9yIAT9!2 zFr4rOLXB(bo?3tG6m6cJ41?i-b*>8vcM-kcY&S=P>%4>fY0)wXtO#?yR~%kXHT}2Y zHiM_wQL{h9Nw(Uyy(QR0;2`s2-=0Xy^SEh1)#ZkRWE-C*B6<2nr*acpW_`DdwJ>u$ zUTyvbuY6uZ{-g2dB+{G0pE>_Q&X0AEtdtg(Qe1&a10@UrCE;s~cBsE{hjzy2#QR$J zt8?Y5jIy8muMTP{(n+vNnH2F~6EK+iiYd5ECPh@l9;SzgtRLQ2b^*9w*jq^HAYOQc zURyrT;+iPP)MbTQd~Yse^9jsNu{2#5sJ)#@yl}obRHvVq8&D!lW}iB#180TZiG8GA z0YdLs*E=S*n0a6Xj$gn(j3cnOT)uw2g1d`%+391hElvUIy%@Mse0a4d9<4T2ZIl?Y z(-%(uLM3{RvzL?1YfUSA41c4D2WvE&JVsfYRyJ%0J`W5Vo|hf-*js}HEr3_ACFp%0gGFWqCnBx&@F4gV&SI2Db~^ntkf>hB;WKDf-#oKy{q{m;w~Y-^DtDKp@sjhNwE#v-NrZ8o0%oy6!a?Q{Xkbl16_U zs9y&7M~_De2Mj9M=N=785@E-)r%;kn8P0t~+e=p<+uyaqE0QJx1bK7&qdVtkWp@4T z+$N4lW3GDhYs#;WJTJO-lPG=TjV-+}sb-%`HG`|fM^5I5u*24}75>3ktcbj`tbT{Z zW19H2_s_eU$7^Z04%H)V_p@8%yn=gdD;M8;+v0>TIm-<)cO61PH^78CxEAFyJBxj= z=JLBeT24SQ2#@n9BHE`QNbu^sMn{RuVi7*1r`1BrO%A9tCFwCSm~GTA0(?7|*JAU{ z{ATQ;A^23T)7|=YQq8?qy)nE9)~RQFHPQAI-Sm029=~B=e4xYXV5=i?jw=T17cBLF zI`ys8aD0xm`2s0JPi2D4+$SFHPFcNsr(*V-oBK*e$5I+~xkyJzjFuGkQXnU&niG(Sq3cLKk=*jl?qQ$S^;8F*KGDc5Xlk=g~ z*hYw%zsjV4pZ8s|kt##JNvu#{?o4UzfVX1^EH}CBx^)cmiGRluX#0`MN@^fZb@97Y zC3hW|lby~JXPd+OlpGx33Vm^A_f|H^d0qjMLe1KmFX)nMIeJ_5TU-Fb#-h6?&MsoW z`e)H!$fWST{!fh|?WG+lnIJv~A(?fsWxU1i7e^dZ$x( zG9sv@_~Kaldk}CqQtdZsU#+O!x&cAaNi9~_>Mh=XB+9$-bq{K)?>D}lsI%wkRG@EM z=by>X*tmH6-q+_J4h-q8!a-6ukc@|^BOEHf?j`&rET@N27YQ}X=`BD*d&ax~fP$}b zW96I~&GmT7B$P4}8MT@E{tW_C6d~ z;N&F$g0eMw4t+23c~Q7>H;l9z7;&9fR;no>K4rqc+Wt{v(2~%f^ib0ZMB{I1p1?*g6+~lEQxFA`9VK!E7fX&>E5wyZviz z@?|*^t(G_{Er~%31bVh^7xWVWh8Li@T9PEIrp95`?UftrAfQocuSl&UZeZRiWj8t! zW!a02k}Fls1Hoia!7UG9*@dZzY; zYo(AU!yqXj@=wae?KJQE^`vTOtSytE9Wwo8JpxZ5$oY@zZ9ijg%?g+wU_d;&;)kNg z97*;UMS#g<%L#{j&G-3fUMaBFj~!NSoxx3XY*vvn8y5n3Nrdx@;Gj_6fm^o%%= zNy#;-e*Uf7AGJSTeTOOynwbwblDeo(bB=%5$oMkPRmk)!7|=2d?8I8;q9eQOU%zWN1xqKAwVOJIKvG+r*X-C)nsYf5+|2 zhB2-yl_vJ9mplw_MqLkQV3mdOmGqAZg&OJgk=>o8enFk{AhPksA+ zpWpL)p5uL<!^&y%i@E zy?!-H*b;bHFl(PWGK9V{&E=1?77r?C;#H*y!pbo%MqXi{&9?wx+20KY+2L+be!$r4 z7#_$9sVANa+h(ZlXs5+3^I(;uv$H{yL7XT*r^Phf*xf8aT`7Wp;<&#!u z#*H5%GDITo-53Yg!{i6A+@PR|7Y-T5XvT=&oe5Wn9WG+vtCvh2bBzyd+miw8UPlO3 zuvv@%N2RN8Rz^n<1QRv$`OasmU=4t+zI6Y&9W}WzitK>tPo_2ZRCvd8=2&kpP1IV! zi$7{tcT1C2%yX!(6C<_IRTNLfRV};~v26u{4`8=8Xi+r> zb_Q!Tg7A4CrjBF#LOu|-Jc=`ObRc8e@TcCXxD*$eu+H-Xz<+0V66>-*(01L)LgN?5M>k|n67&^;G6ZmAWP)@xxCEe( zctilkzyBB%A~&p7)Gs)kRO#fokn@@PGX*6V4}>MZiU`>20}R`l~z&i`WI z;E|I@e~M^(uCYR^pQ>3OmEG(n>_26`oH@- z0-{ZcU8!1P`lV?M+JQSf&pMNyb^_5s1hMuZppMKk)Uok+KcIN2y_&C4` z>jzw6!2e3@T6zt1nU1@?z;z+D0mGzZ?DG4>IU6$NlQ{ih_szBCqNcThpwaLl_%vnz z1x)C~F77OW#;oPa9i^WLCj^VnBZ3AP&C;X&4oO7WK-@N^%Q+Y>BmS~j$-JZyKYpWrSMYoDSj4wfA!S4Lm2ji5rY`OI z`uu^MePtHd4k3PEq$bp^kL{e@D*&biz{xo`&!?_kPPd(x+%&~b zMAyRGc)gWP^^z*>Xe=p~US(iZ%Pcy)d6~Cmu(-QS9!2isaO%;mD~m?&ics*(_2sm2 zi;)ez(kKse7z$f73aWz7ehVW$N9=Zkmb77^5^+KY8KxH=W!3pQ)Hmw^6OGOejN8MW z1f~02sZPWSg>NoQ2)#zE@`oW!pv%c{PRNZA3@rF?_}OIwG?n zM$C+Nk9njJY~Uh^zb4QvquGPPqu<4Mn6C;_LAAna>KEAYh?LGoUG$MW=g9w}P+7HXA}jh``E%@ffu>VEF1Fw2{7ws*D= zVtJ`4>b^>t*?hI(qbJAVPIU=xT@@AjxoD4Wm(8I-%-osapDz<^rZ>quCTiShRd0F2 z5D3tGs=`J5pTN4xl7!V1WRnz-(D&+SoIAwg`3*N%W~Z71=93?Jb7_MEmh~2 z-kd0X@meM#J=U?Z>Km@PTi$bP%*r4({XXiXoVisf3MM>hxwCI)qvlG2US`3r+eGAn z6pe_BABSQ)YxO{!9z%g^2Q`KAGIg2=G}PrpvoE!tZY1B6n&N(h`cuS}3P^=skjb?U z$GI3vlmNCukhOFJg$gbx(wsOGOQca)r4Bv1K;N%mYtNP)%#M7pK|kj}PBA z5QW1KuBSOQJlo8j>bUoK)k}lS8C>-(d4l`X`)!nNnm+hU>0FS~h4sNJ%CLtHhZ$C~ zRsd>M0LFU2Fy{H|vzA5|IXt8uvtcu%)xC7>HOhE%wPQNMI+MbTKaRx~l(1DrpVE4F z4@#&wen?%TPmN#!cGM2QSPIi0TUkcC*gk{C>^Zpz(-MJlc*-$MZPM8(dY?r^f!!m8 z?2L9iGfpF)m=AG%dO_(InEF2M_E7VVs#I{4KPHYx~sq z1z+&`JPp04%`tio!uwP)LU*t>-sKoNCzyEO*s6R7AtFQ90ju|GDBi)P74WIwk;-o8 zd%MS-WrcTL?bi6#XAGJ|#8i{#U-5X2-=}Fma_d8$kf6KR&&K(YU6y|o%!_WUl8VN5 zp{Isg%Jg1OM!KAML*0@&F`id4N7E|;tY}|8(U?P?pVlzqUAaMuI?pAQp z%_+TY!FwyIOh)d@lf2&CI!m)bVVz@IQaR@$Dr+%m@7nsi*D>3=e^ggNV!oa&;4{(7 zI17-axvzw06knwB8iyH^ABQ6k2A}LmGmMW^pPhzkk&NBoOQ!g~wuzSG48lWOHT(+R8@khB5H$)dSC*C{6F{`68NPOc;ksvv@f{&}r=Rj$yj5-T> zheJ&!xa2q~W<$M@JlE!qb|nPMLTS0>k;V zvf+o*iRnJir0Dl&yZ24)P+^2hd*9buB(9}76}zN(spos@4Q%D!)xMGsfVo9|2c>AkxuFml;I)BOz=$uiMG_iJHmS|GY`qtn5zqF8qaIbJ zHpx(CxTkK9M<3boWMAlL)YW#yc8(EcHC+}w6|&O!4SZd7U^S+|=Cr`O z>3UXsP2Q!z00WjU1DJ_-ZxYFtdAUMqxg$6t7+QXDGf9$oG z;e&Ez2@k3TmA%48>uphG2P&PV&XO(mqUb1Vrxe@wT=z?Xec49Wa>vozH_(@huj!Ue zwDq4!ZWb$ge&o4yu)GTGq7R3`M_28g!w8SxOTa>^maE&PyHF%$hRvr| zYNS zdY`!y5tW+G)=os71gc?lHGp>sO)i?2T3rF+$m6N-fVFDs*Cb_cQD_zEk;?pNcp@H-4n%$}JbK9(- zO&qxIgbDTA7Qh^ANe80v$diQlRbk+gZK@~t;%!git{7IUO@W&@{yjGdte3m2v|xH) z011^tbnD-S4O1C6M;jt~69e3VP;oL82!*K^P~0<3CMe-YtmydpV_=QeN+C6GD%gwB z1MnxD8%~E1rW-CzmPxs;tVDwpYdos370R`<+=5h4`I7UslBrpI%o#b^2p`I&OCEK3 zoQQ^o@Md0&Ye4|kx6!^+!=t{NkVtRtxTe%5S&2JrIl33E<$KRuZSrH;~+Xx z`whD>^>s06(F&=ttQ{$%ao{S2MIJr3`j;hOEgz9^w$=UM=i(Dw2Pc8WHcAG-S1kBw z>YDb7d)sldj}%MwS;yu;-u};lJey6rbGe)|Y0uJmABUshOl0cpd#5zAEs}`U|i};D#THH~=oqk`8q~4QrPmWs66i z#o+ncwJSeOd<4!JkBS2a!MobEpKr6~b}BG=xy9($nE;X2!|bYkoYRBnAEPV|XmsSj%EJX@C4i?0`uhKLVhmo(*c^$guB^;nGb|wToC(%#>VS-tP%GYr9@cfeNk>J z@2_dj0G&A-P8$fDtwGWOM z1L~OqBHzheT~K%zH^S8YVXZW>4KtXnY*R4SSq!sTH-An8k8BeZf*K-1E;-sd!N$B1 z9C6>nM75r7QYYK^l^WOVA1w}q2ae2P=#9f397UITp8y5PfL77v<&kPLTj4TDp7k)r zWEb-xP~B*x;bx}#<48xVr5G(=&tM_f(1#tSd9VhJ5f1u5PhmI)y*Uyf*XTJhQZ26W zIr7!W2!zrQt!aCvy6`W<$y_?2?R@C%ABiIf{y5$Sw=l4{v%Bc}>x44DMblGh#Tqs= zLecI*8W_1uA8<@%Oc6$^y-?j+Xa*#pG+HyQ5jJ_){|{RL$^$;1Xn$uo{9R7Hj97s(y>C9Ln+i*1_)Yw%g-O{ z=+J&cC)$Ouw=U!=4GZBV-}ns@UB=gm(5Eg-XXA`3vrEnM!ZBMFE7>{o@1epQbD7*v z*oPX)MRX*zI*y24!!E6dBtnHp`PkPx3volv<82%#&OaL}o2|yyM_FN`RoapvTSxff z3ef3YbBDAZj`w}a-trl95%?-o&&L~16#Y*0N60x=%T`-Hp*H*6`x zdd(@q{XUUxELB>4=!UtNsyS{R!^)|#U`>1Pq`(-@1q`yRv(I}!dWM!HUnjZ5c(VY( zE`<41_uqUt_{Tt7+dLIae#K|M{%%a6^4T@Q1JH-dVbbJx6<%grwYSG#1=n@-IF)2$ z{T@o!%$=t#Y5JWQ-O#R%TFWM;)+N!pP_ku819okyBhbOl%p|^YUBAah(lpZGCz*48 zhUFm-qDr}J*OW6m-qoOtKZC=D{lh%(3^r)PCRA$68%7BgR}ATv#603s+6M@Z1VMyN zl)8Z+wSJ)Z7r~DG!Jc-9G=WG7csDES-i#1h-{v(Iu;DA}8eDT1=6m-M*?Otc!^tW) zhXTwdvp*@2LN)7<=dWaqKeSxoQy6@0M!kWpS^iL<=RiN@Kp!R1O{>t1hFxbT$Q*9QJT zxqhj~HOP{k;|K6@y`3Lz8%^!+N9?zP$Ed3fY8KD}t_sf}MBMC6S z_H2=-Ifpf^V(-xHiSt4-Z#ctv!(vs?zN9ZS_*MdRrL#G76 zy*LuaPsmZV81QvM>G`rjPgny~7r;`AGrMYFs#JHmPb;FYjUTYZ(M}1T>Fd zt)Uf8j$1w_dM!B&1cYyn+g3#&_7US=fd%^&R=^A-kd=ymhn~jv{$n7JMm6A}L}y?es;-wiibo%F z2}q#ZGky-z3~dF~@Mo*@{pvGi(t$x}!#`7cuMiX_o`5qT0o5CT6&d&5(eV?{>qyNT znMfL;S<)8QzbRV0Z3sFW;hkuIdLNP=z4}V{7aaEZ z!o_9I6BRrmoe0P0O-ihIwH5uQYL58b$J}umHu2XXHrCG_xXy8zgwE=k) ziC*{Y{vxWw|4N!n+8CVAO+%29z%Cj=)5Zm)Z}5$RXYDB1E=9Ssp~F_grWu}(7_37Y zU_uqhgLDq&l(_^C-mFOTE$PtI#MMf)o{*$Jt??V{#JS{Xf~s&umf-!1m8UcT{Po4^ ze+eTln5Quk1>CekTbS0@SuleDl#R)8+f3cNQ{04_vR}@E3XnP4uy zIkVL|fs9KCd7 z7--|V^H;cB*nX2@E?mK(rb@WASBq`gyFMIUa#LWe`Eo}M9LS@~ zl9WvMho@vxWVd2``5(WzG%wCdj;$s%L6)6JoW#pdo9%c0?s?CXv?XSXo5Hp%H7@w| zC-+j8uHYwu$LEtNj4{*{{Y~kMK*ziPWQ{TXiCcTy_rI_f4WH)7p)3EZHI8WLw3{5` z@PBb->HKOXb4}`Bt#OZTE;mI`)BdRipRjg3-}0Iy zppkf+&~)zmluowogw=sSRllp}m(3jAB{nHJ$D_%O&FfLpu1gMpFK$!<`gWkl>#PLC z1tCkq@*3)4;*=QrT=DTxF; zM$k>kSKBqLd?36r;X&sk@~6p-RiQe;AhFWRH@6CAmtfXhnZ<5^Y6f5okq=oc29_ZZ z%bwc+MWB?lv0(_=ldax9o^Oo`qMp5Mq__(P#8y4z=RZ~-Wv{hNz+j6u#akQ0HuW|| zUphInVUVRQfm+uxN-bL!Dpiunvniwj?^`4p`MkYI0s^vP%$(1U4Jetn)$KJ|mOI(#F-S5L z7%_0ENr|bIP?Bknt(4lE-5Hqy@`!;in+e>N=@yPV;BZl(DX< zxTQ9OV~0BEnz%5Ixie4X`P!q`8Wbuc-KN7!FZMZezOD*fi*cF#$@q&Fn0SKmE0ob zOUf~W#=vQ8pH&KiiR=C1(XH#B%t0Zmu?1D=#C?UuA*xqg0enXI%}z-6>b;jBVaDLR z__Wu@@1+66PR`6w*Q!eaZFBm}KC;VTSE_mcii5>7ZUh($8(;KYKZuS~_hE&*>gy0)_sA}_M5eF$X?@SGT?K#Hv=NqM3`)eMk6TD6P zhYYmT6!`H4FN*te53H3WC${kffa<3#K@-Y0DJndH%07hfIjR`xLa&{#OsreIDCHO_ z`Q|_bP)K0ZUnmA8>;P0UugbI;SeE8Ato?G?d9q!5J27d{?$YfM{$WqDwiMYKwSEel zLqbwZX?uGVEggTjY5({kd2N#vG=+NgzEtk0 z@g<8Nk5ysQYU^$^A9td{ny|sI`;AI~BN%`JrR6bEvsY@sn$Q(_u{1WHt1u7}n%P*? zw3Hu+Df!bXjbZ|$tI+h16)pcHv0v6rfjp?``FPK6VdB6SGH!yGj>X`H}Ra;trryJV>+Hb9x*LV z2jz%!LJ)7thB_lkU8tGhg;3mRG;VGqj3tsD>)ganSg1Q&;a7V=g)A z#f%jXDa~p1kpn2FbJ{cCRXfbTdn2#l(s(DmJ3esQA!S`=;+)v31EHuPnSEUx`vr7* z*>&r#0k1V6v%LDD?7cxMV`F%^WA#Q7zs8-T>RN{%17+J7jryYqki`1a#**(b-M9^A zBevdAXXkJ$eI{nAC7$V*bMp>nPXIR8PP-r*DNf&v*^e)}pzcU}1=9UV--_vQpDd z3~SYQllUw-65n4A(W}qdQU0B=svSH@1{(TAlKwi%Op9JCOV}2X&H00Pc`n}`sA=)i9CX=8aVX7lY+xJM=lJ$^|#$7VYko=M8t_m2+!CRQs?D+FpW6v*4>{uNZYjjrTu zub{mzyPf91{}WQ&ig#hI?rqZAMb}ezoPG^rDMf#>FO;Wswth5AZp8>U<1TS!s{8Z( zgRK2OMFp(1c z&m}z85Ky$6ef8LjZc}vvr=r6U z4#PSkt|G})2BiO_oID%d(K92K&642m*x?Ku6tn*RkG{71@6(R|`5`LiOyfE;CR5~0 V!~V193|Z|kHMBIS(7PP_e*jI{Zwmkb literal 0 HcmV?d00001 diff --git a/docs/creating-new/images/pr-with-tests.png b/docs/creating-new/images/pr-with-tests.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7e9213eb6b203e9e11f10c6cc137aeab309ef8 GIT binary patch literal 32292 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 RK-czYsq3qisy=@4KLGYB-wyx) literal 0 HcmV?d00001 diff --git a/docs/creating-new/images/pull-request-testing.png b/docs/creating-new/images/pull-request-testing.png new file mode 100644 index 0000000000000000000000000000000000000000..6e6e9455a4c7be7765e8a88cd7d4f7cd1800fe65 GIT binary patch literal 24709 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