From b15b682fc54c35c30a6252ebaa6ce0a9d6d80406 Mon Sep 17 00:00:00 2001 From: designerror Date: Sun, 23 Jul 2017 21:52:10 +0300 Subject: [PATCH 001/133] Update README.md --- README.md | 90 +++++++++++++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index ce64082..fdea7cb 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Build **Building WebDAV Client from sources** -```bash +```ShellSession $ git clone https://github.com/designerror/webdav-client-cpp $ cd webdav-client-cpp $ cmake -H. -B_builds # -DCMAKE_INSTALL_PREFIX=install @@ -38,7 +38,7 @@ $ cmake --build _builds --target install Documentation === -```bash +```ShellSession $ cd docs $ doxygen doxygen.conf $ open html/index.html @@ -47,65 +47,63 @@ $ open html/index.html Usage examples === -```c++ +```C++ #include #include #include int main() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "webdav_login"}, - {"webdav_password", "webdav_password"} - }; - // additional keys: - // - webdav_root - // - cert_path, key_path - // - proxy_hostname, proxy_login, proxy_password + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_login", "webdav_login"}, + {"webdav_password", "webdav_password"} + }; + // additional keys: + // - webdav_root + // - cert_path, key_path + // - proxy_hostname, proxy_login, proxy_password - std::shared_ptr client(WebDAV::Client::Init(options)); + std::shared_ptr client(WebDAV::Client::Init(options)); - auto check_connection = client->check(); - std::cout << "test connection with WebDAV drive is " - << (check_connection ? "" : "not ") - << "successful"<< std::endl; + auto check_connection = client->check(); + std::cout << "test connection with WebDAV drive is " + << (check_connection ? "" : "not ") + << "successful"<< std::endl; - auto is_directory = client->is_dir("/path/to/remote/resource"); - std::cout << "remote resource is " - << (is_directory ? "" : "not ") - << "directory" << std::endl; + auto is_directory = client->is_dir("/path/to/remote/resource"); + std::cout << "remote resource is " + << (is_directory ? "" : "not ") + << "directory" << std::endl; - client->create_directory("/path/to/remote/directory/"); - client->clean("/path/to/remote/directory/"); + client->create_directory("/path/to/remote/directory/"); + client->clean("/path/to/remote/directory/"); - std::cout << "On WebDAV-disk available free space: " - << client->free_size() - << std::endl; + std::cout << "On WebDAV-disk available free space: " + << client->free_size() + << std::endl; - std::cout << "remote_directory_name"; - for(auto& resource_name : client->list("/path/to/remote/directory/")) - { - std::cout << "\t" << "-" << resource_name; - } - std::cout << std::endl; + std::cout << "remote_directory_name"; + for(auto& resource_name : client->list("/path/to/remote/directory/")) { + std::cout << "\t" << "-" << resource_name; + } + std::cout << std::endl; - client->download("/path/to/remote/file", "/path/to/local/file"); - client->clean("/path/to/remote/file"); - client->upload("/path/to/remote/file", "/path/to/local/file"); + client->download("/path/to/remote/file", "/path/to/local/file"); + client->clean("/path/to/remote/file"); + client->upload("/path/to/remote/file", "/path/to/local/file"); - auto meta_info = client->info("/path/to/remote/resource"); - for(auto& field : meta_info) - { - std::cout << field.first << ":" << "\t" << field.second; - } - std::cout << std::endl; + auto meta_info = client->info("/path/to/remote/resource"); + for(auto& field : meta_info) { + std::cout << field.first << ":" << "\t" << field.second; + } + std::cout << std::endl; - client->copy("/path/to/remote/file1", "/path/to/remote/file2"); - client->move("/path/to/remote/file1", "/path/to/remote/file3"); + client->copy("/path/to/remote/file1", "/path/to/remote/file2"); + client->move("/path/to/remote/file1", "/path/to/remote/file3"); - client->async_upload("/path/to/remote/file", "/path/to/local/file"); - client->async_download("/path/to/remote/file", "/path/to/local/file"); + client->async_upload("/path/to/remote/file", "/path/to/local/file"); + client->async_download("/path/to/remote/file", "/path/to/local/file"); } ``` From f40857bb5c89cae0f7d566a0b6da7c1863466e16 Mon Sep 17 00:00:00 2001 From: designerror Date: Sun, 23 Jul 2017 21:54:47 +0300 Subject: [PATCH 002/133] Update README.md --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index fdea7cb..8be72f7 100644 --- a/README.md +++ b/README.md @@ -68,21 +68,21 @@ int main() std::shared_ptr client(WebDAV::Client::Init(options)); auto check_connection = client->check(); - std::cout << "test connection with WebDAV drive is " - << (check_connection ? "" : "not ") - << "successful"<< std::endl; + std::cout << "test connection with WebDAV drive is " + << (check_connection ? "" : "not ") + << "successful"<< std::endl; auto is_directory = client->is_dir("/path/to/remote/resource"); - std::cout << "remote resource is " - << (is_directory ? "" : "not ") - << "directory" << std::endl; + std::cout << "remote resource is " + << (is_directory ? "" : "not ") + << "directory" << std::endl; client->create_directory("/path/to/remote/directory/"); client->clean("/path/to/remote/directory/"); - std::cout << "On WebDAV-disk available free space: " - << client->free_size() - << std::endl; + std::cout << "On WebDAV-disk available free space: " + << client->free_size() + << std::endl; std::cout << "remote_directory_name"; for(auto& resource_name : client->list("/path/to/remote/directory/")) { From 49b87dac87375f680f10a1e1a42119d743170d74 Mon Sep 17 00:00:00 2001 From: designerror Date: Sun, 23 Jul 2017 22:46:55 +0300 Subject: [PATCH 003/133] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8be72f7..ed1cac7 100644 --- a/README.md +++ b/README.md @@ -69,20 +69,20 @@ int main() auto check_connection = client->check(); std::cout << "test connection with WebDAV drive is " - << (check_connection ? "" : "not ") - << "successful"<< std::endl; + << (check_connection ? "" : "not ") + << "successful"<< std::endl; auto is_directory = client->is_dir("/path/to/remote/resource"); std::cout << "remote resource is " - << (is_directory ? "" : "not ") - << "directory" << std::endl; + << (is_directory ? "" : "not ") + << "directory" << std::endl; client->create_directory("/path/to/remote/directory/"); client->clean("/path/to/remote/directory/"); std::cout << "On WebDAV-disk available free space: " - << client->free_size() - << std::endl; + << client->free_size() + << std::endl; std::cout << "remote_directory_name"; for(auto& resource_name : client->list("/path/to/remote/directory/")) { From cd5107d5ce4af1d3accaee5376d4b20aaf52cd7e Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sun, 23 Jul 2017 23:41:13 +0300 Subject: [PATCH 004/133] fixed #17 --- sources/client.cpp | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/sources/client.cpp b/sources/client.cpp index 7aedf17..efd8da1 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -436,11 +436,11 @@ namespace WebDAV document.load_buffer(data.buffer, (size_t)data.size); - pugi::xml_node multistatus = document.select_single_node("d:multistatus").node(); - pugi::xml_node response = multistatus.select_single_node("d:response").node(); - pugi::xml_node propstat = response.select_single_node("d:propstat").node(); - prop = propstat.select_single_node("d:prop").node(); - pugi::xml_node quota_available_bytes = prop.select_single_node("d:quota-available-bytes").node(); + pugi::xml_node multistatus = document.select_single_node("*[local-name()='multistatus']").node(); + pugi::xml_node response = multistatus.select_single_node("*[local-name()='response']").node(); + pugi::xml_node propstat = response.select_single_node("*[local-name()='propstat']").node(); + prop = propstat.select_single_node("*[local-name()='prop']").node(); + pugi::xml_node quota_available_bytes = prop.select_single_node("*[local-name()='quota-available-bytes']").node(); std::string free_size_text = quota_available_bytes.first_child().value(); auto free_size = atol(free_size_text.c_str()); @@ -504,24 +504,24 @@ namespace WebDAV pugi::xml_document document; document.load_buffer(data.buffer, (size_t)data.size); - auto multistatus = document.select_single_node("d:multistatus").node(); - auto responses = multistatus.select_nodes("d:response"); + auto multistatus = document.select_single_node("*[local-name()='multistatus']").node(); + auto responses = multistatus.select_nodes("*[local-name()='response']"); for (auto response : responses) { - pugi::xml_node href = response.node().select_single_node("d:href").node(); + pugi::xml_node href = response.node().select_single_node("*[local-name()='href']").node(); std::string encode_file_name = href.first_child().value(); std::string resource_path = curl_unescape(encode_file_name.c_str(), (int)encode_file_name.length()); auto target_path = target_urn.path(); auto target_path_without_sep = std::string(target_path, 0, target_path.rfind("/") + 1); auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind("/") + 1); if (resource_path_without_sep.compare(target_path_without_sep) == 0) { - auto propstat = response.node().select_single_node("d:propstat").node(); - auto prop = propstat.select_single_node("d:prop").node(); - auto creation_date = prop.select_single_node("d:creationdate").node(); - auto display_name = prop.select_single_node("d:displayname").node(); - auto content_length = prop.select_single_node("d:getcontentlength").node(); - auto modified_date = prop.select_single_node("d:getlastmodified").node(); - auto resource_type = prop.select_single_node("d:resourcetype").node(); + auto propstat = response.node().select_single_node("*[local-name()='propstat']").node(); + auto prop = propstat.select_single_node("*[local-name()='prop']").node(); + auto creation_date = prop.select_single_node("*[local-name()='creationdate']").node(); + auto display_name = prop.select_single_node("*[local-name()='displayname']").node(); + auto content_length = prop.select_single_node("*[local-name()='getcontentlength']").node(); + auto modified_date = prop.select_single_node("*[local-name()='getlastmodified']").node(); + auto resource_type = prop.select_single_node("*[local-name()='resourcetype']").node(); dict_t information = { { "created", creation_date.first_child().value() }, @@ -585,11 +585,11 @@ namespace WebDAV pugi::xml_document document; document.load_buffer(data.buffer, (size_t)data.size); - auto multistatus = document.select_single_node("d:multistatus").node(); - auto responses = multistatus.select_nodes("d:response"); + auto multistatus = document.select_single_node("*[local-name()='multistatus']").node(); + auto responses = multistatus.select_nodes("*[local-name()='response']"); for (auto response : responses) { - pugi::xml_node href = response.node().select_single_node("d:href").node(); + pugi::xml_node href = response.node().select_single_node("*[local-name()='href']").node(); std::string encode_file_name = href.first_child().value(); std::string resource_path = curl_unescape(encode_file_name.c_str(), (int)encode_file_name.length()); auto target_path = target_urn.path(); From 60321a2385988c0ec12269ead44e34616258ffc0 Mon Sep 17 00:00:00 2001 From: designerror Date: Mon, 24 Jul 2017 00:27:57 +0300 Subject: [PATCH 005/133] Update appveyor.yml --- appveyor.yml | 40 +++++----------------------------------- 1 file changed, 5 insertions(+), 35 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index ebf6129..f4f178b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,10 +8,7 @@ environment: configuration: - plain -# - shared - -install: - - set INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%\build + - shared before_build: - ps: >- @@ -32,36 +29,9 @@ before_build: } - ps: $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS")) - call "%VSCOMNTOOLS%\..\..\VC\vcvarsall.bat" %VCVARS_PLATFORM% - - git submodule update --init - - echo "build openssl" - - cd vendor\openssl - - if not exist build (mkdir build && cd build) else (rmdir /S/Q build && mkdir build && cd build) - - perl ..\Configure %TARGET% no-asm no-idea no-unit-test %SHARED% --prefix=%INSTALL_PREFIX% --openssldir=%INSTALL_PREFIX%\ssl - - nmake - - nmake install - - cd ..\.. - - echo "build curl" - - cd curl - - if not exist build (mkdir build && cd build) else (rmdir /S/Q build && mkdir build && cd build) - - cmake .. -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=%INSTALL_PREFIX% -DCURL_STATICLIB:BOOL=%BUILD_SHARED% -DBUILD_TESTING:BOOL=OFF -DBUILD_CURL_EXE:BOOL=OFF -DCURL_DISABLE_LDAP:BOOL=ON -DCURL_DISABLE_LDAPS=ON - - nmake - - nmake install - - cd ..\.. - - echo "build pugixml" - - cd pugixml - - if not exist build (mkdir build && cd build) else (rmdir /S/Q build && mkdir build && cd build) - - cmake .. -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=%INSTALL_PREFIX% -DBUILD_SHARED_LIBS=%BUILD_SHARED% - - nmake - - nmake install - - cd ..\.. build_script: - - cd %INSTALL_PREFIX% - - set CURL_INCLUDE_DIR=%INSTALL_PREFIX%\include - - set CURL_LIBRARY=%INSTALL_PREFIX%\lib\libcurl.lib - - set CMAKE_PUGIXML_FLAGS=-DPUGIXML_LIBRARY=%INSTALL_PREFIX%\lib\pugixml.lib -DPUGIXML_INCLUDE_DIR=%INSTALL_PREFIX%\include - - set CMAKE_CURL_FLAGS=-DCURL_STATICLIB:BOOL=%BUILD_SHARED% -DCURL_INCLUDE_DIR:STRING=%CURL_INCLUDE_DIR% -DCURL_LIBRARY=%CURL_LIBRARY% - - set CMAKE_OPENSSL_FLAGS=-DOPENSSL_LIBRARIES=%INSTALL_PREFIX%\lib\libcrypto.lib;%INSTALL_PREFIX%\lib\libssl.lib - - cmake .. -G "NMake Makefiles" %CMAKE_PUGIXML_FLAGS% %CMAKE_CURL_FLAGS% %CMAKE_OPENSSL_FLAGS% -DBUILD_SHARED_LIBS=%BUILD_SHARED% - - nmake - - nmake install +- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install +- cmake --build _builds +- cmake --build _builds --target test -- ARGS=--verbose +- cmake --build _builds --target install From 3867dbbada09c1b1c13dc6565608b4f7df17486b Mon Sep 17 00:00:00 2001 From: designerror Date: Mon, 24 Jul 2017 00:40:58 +0300 Subject: [PATCH 006/133] Update ChangeLog.md --- ChangeLog.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 87 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 641c505..de016cc 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,87 @@ - * Tue Nov 8 2016 Changes between 1.0.1 and 1.0.0 - - Added ability to work with resources that take place in his name. - - Replaced deprecated curl_escape function to curl_easy_escape. - - Moved the release of resources to the method WebDAV::Client::Cleanup -``` +# Change Log + +## [Unreleased](https://github.com/designerror/webdav-client-cpp/tree/HEAD) + +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.2...HEAD) + +**Fixed bugs:** + +- Handling of XML namespaces in PROPFIND responds [\#17](https://github.com/designerror/webdav-client-cpp/issues/17) + +**Merged pull requests:** + +- fixed \#17 [\#21](https://github.com/designerror/webdav-client-cpp/pull/21) ([designerror](https://github.com/designerror)) + +## [v1.0.2](https://github.com/designerror/webdav-client-cpp/tree/v1.0.2) (2017-07-23) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.1-hunter-p1...v1.0.2) + +**Fixed bugs:** + +- ::list returns the name of the root directory [\#19](https://github.com/designerror/webdav-client-cpp/issues/19) + +**Merged pull requests:** + +- fixed \#19 [\#20](https://github.com/designerror/webdav-client-cpp/pull/20) ([designerror](https://github.com/designerror)) + +## [v1.0.1-hunter-p1](https://github.com/designerror/webdav-client-cpp/tree/v1.0.1-hunter-p1) (2017-03-20) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.1-hunter...v1.0.1-hunter-p1) + +## [v1.0.1-hunter](https://github.com/designerror/webdav-client-cpp/tree/v1.0.1-hunter) (2017-03-17) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.1...v1.0.1-hunter) + +## [v1.0.1](https://github.com/designerror/webdav-client-cpp/tree/v1.0.1) (2016-11-08) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.0...v1.0.1) + +**Merged pull requests:** + +- Update client.hpp [\#15](https://github.com/designerror/webdav-client-cpp/pull/15) ([designerror](https://github.com/designerror)) + +## [v1.0.0](https://github.com/designerror/webdav-client-cpp/tree/v1.0.0) (2016-10-22) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.9...v1.0.0) + +**Merged pull requests:** + +- Update .travis.yml [\#14](https://github.com/designerror/webdav-client-cpp/pull/14) ([designerror](https://github.com/designerror)) +- ifndef/define xxx\_H and final/or\_virt\_destructor [\#13](https://github.com/designerror/webdav-client-cpp/pull/13) ([x10mind](https://github.com/x10mind)) +- Update build\_requirements.unix.sh [\#10](https://github.com/designerror/webdav-client-cpp/pull/10) ([designerror](https://github.com/designerror)) +- Update .travis.yml [\#9](https://github.com/designerror/webdav-client-cpp/pull/9) ([designerror](https://github.com/designerror)) +- Update README.md [\#8](https://github.com/designerror/webdav-client-cpp/pull/8) ([designerror](https://github.com/designerror)) +- fix some bugs for building on macOS [\#7](https://github.com/designerror/webdav-client-cpp/pull/7) ([x10mind](https://github.com/x10mind)) +- Update README.md [\#6](https://github.com/designerror/webdav-client-cpp/pull/6) ([x10mind](https://github.com/x10mind)) + +## [v0.9.9](https://github.com/designerror/webdav-client-cpp/tree/v0.9.9) (2016-10-14) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.8...v0.9.9) + +**Merged pull requests:** + +- Update .travis.yml [\#4](https://github.com/designerror/webdav-client-cpp/pull/4) ([x10mind](https://github.com/x10mind)) + +## [v0.9.8](https://github.com/designerror/webdav-client-cpp/tree/v0.9.8) (2016-10-12) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.7...v0.9.8) + +## [v0.9.7](https://github.com/designerror/webdav-client-cpp/tree/v0.9.7) (2016-10-12) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.6...v0.9.7) + +## [v0.9.6](https://github.com/designerror/webdav-client-cpp/tree/v0.9.6) (2016-10-11) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.5...v0.9.6) + +**Closed issues:** + +- bug [\#2](https://github.com/designerror/webdav-client-cpp/issues/2) + +## [v0.9.5](https://github.com/designerror/webdav-client-cpp/tree/v0.9.5) (2016-04-06) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.4...v0.9.5) + +## [v0.9.4](https://github.com/designerror/webdav-client-cpp/tree/v0.9.4) (2016-04-06) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.3...v0.9.4) + +## [v0.9.3](https://github.com/designerror/webdav-client-cpp/tree/v0.9.3) (2016-04-05) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.2...v0.9.3) + +## [v0.9.2](https://github.com/designerror/webdav-client-cpp/tree/v0.9.2) (2016-04-05) +[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.1...v0.9.2) + +## [v0.9.1](https://github.com/designerror/webdav-client-cpp/tree/v0.9.1) (2015-07-15) + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* From cffa7acfae471674d54f3de2a2ac9d8c6940cd8b Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 24 Jul 2017 21:05:30 +0300 Subject: [PATCH 007/133] fixed #18 --- CMakeLists.txt | 15 +++ examples/cli/cli.cpp | 131 ++++++++++++++++++++++ examples/client/check.cpp | 23 +++- examples/client/copy.cpp | 31 +++-- examples/client/download.cpp | 48 +++++--- examples/client/info.cpp | 38 +++++-- examples/client/init.cpp | 13 ++- examples/client/list.cpp | 35 ++++-- examples/client/mkdir.cpp | 4 +- examples/client/move.cpp | 11 +- examples/client/{clean.cpp => remove.cpp} | 2 +- examples/client/upload.cpp | 91 ++++++++------- include/webdav/client.hpp | 4 +- sources/client.cpp | 47 +++++++- sources/urn.cpp | 4 + sources/urn.hpp | 7 +- 16 files changed, 391 insertions(+), 113 deletions(-) create mode 100644 examples/cli/cli.cpp rename examples/client/{clean.cpp => remove.cpp} (97%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f50add..946d4ab 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") option(BUILD_TESTS "Build tests" OFF) +option(BUILD_EXAMPLES "Build Examples" OFF) option(BUILD_PKGCONFIG "Build in PKGCONFIG mode" OFF) hunter_add_package(OpenSSL) @@ -84,4 +85,18 @@ if(BUILD_TESTS) add_test(NAME check COMMAND check "-s" "-r" "compact" "--use-colour" "yes") endif() +if(BUILD_EXAMPLES) + file(GLOB EXAMPLE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/examples/*/*.cpp") + foreach(EXAMPLE_SOURCE ${EXAMPLE_SOURCES}) + get_filename_component(EXAMPLE_NAME ${EXAMPLE_SOURCE} NAME_WE) + set(EXAMPLE_TARGET_NAME example_${EXAMPLE_NAME}) + add_executable(${EXAMPLE_TARGET_NAME} ${EXAMPLE_SOURCE}) + target_link_libraries(${EXAMPLE_TARGET_NAME} ${PROJECT_NAME}) + set_target_properties(${EXAMPLE_TARGET_NAME} PROPERTIES OUTPUT_NAME ${EXAMPLE_NAME}) + install(TARGETS ${EXAMPLE_TARGET_NAME} + RUNTIME DESTINATION bin + ) + endforeach(EXAMPLE_SOURCE ${EXAMPLE_SOURCES}) +endif() + include(CPackConfig.cmake) diff --git a/examples/cli/cli.cpp b/examples/cli/cli.cpp new file mode 100644 index 0000000..738d9d7 --- /dev/null +++ b/examples/cli/cli.cpp @@ -0,0 +1,131 @@ +/*#*************************************************************************** +# __ __ _____ _____ +# Project | | | | | \ / ___| +# | |__| | | |\ \ / / +# | | | | ) ) ( ( +# | /\ | | |/ / \ \___ +# \_/ \_/ |_____/ \_____| +# +# Copyright (C) 2016, The WDC Project, , et al. +# +# This software is licensed as described in the file LICENSE, which +# you should have received as part of this distribution. +# +# 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 LICENSE file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +############################################################################*/ + +#include +#include + +using dict_t = std::map; +using strings_t = std::vector; + +auto operator<<(std::ostream& out, const dict_t& dict) -> std::ostream& { + for(auto& item : dict) { + out << item.first << ": " << item.second << std::endl; + } + return out; +} + +auto operator<<(std::ostream& out, const strings_t& dict) -> std::ostream& { + for(auto& item : dict) { + out << "- " << item << std::endl; + } + return out; +} + +int main(int argc, char * argv[]) { + + try { + + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); + + if (hostname_ptr == nullptr) { + throw std::runtime_error("undefined WEBDAV_HOSTNAME environment variable"); + } + if (username_ptr == nullptr) { + throw std::runtime_error("undefined WEBDAV_USERNAME environment variable"); + } + if (password_ptr == nullptr) { + throw std::runtime_error("undefined WEBDAV_PASSWORD environment variable"); + } + + if (argc < 2) { + throw std::invalid_argument("command"); + } + + if (argc < 3) { + throw std::invalid_argument("resource"); + } + + std::string command = argv[1]; + std::string remote_resource = argv[2]; + + std::map options = { + {"webdav_hostname", hostname_ptr}, + {"webdav_login", username_ptr}, + {"webdav_password", password_ptr} + }; + + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } + + std::unique_ptr client(WebDAV::Client::Init(options)); + + if (command == "check") { + bool is_existed = client->check(remote_resource); + std::cout << "Resource: " << remote_resource << " is " << (is_existed ? "" : "not ") << "existed" + << std::endl; + } else if (command == "copy") { + if (argc < 4) { + throw std::invalid_argument("to"); + } + std::string target_resource = argv[3]; + client->copy(remote_resource, target_resource); + } else if (command == "download") { + if (argc < 4) { + throw std::invalid_argument("to"); + } + std::string target_resource = argv[3]; + client->download(remote_resource, target_resource); + } else if (command == "info") { + auto info = client->info(remote_resource); + std::cout << info << std::endl; + } else if (command == "list") { + auto list = client->list(remote_resource); + std::cout << list << std::endl; + } else if (command == "mkdir") { + client->create_directory(remote_resource); + } else if (command == "move") { + if (argc < 4) { + throw std::invalid_argument("to"); + } + std::string target_resource = argv[3]; + client->move(remote_resource, target_resource); + } else if (command == "remove") { + client->clean(remote_resource); + } else if (command == "upload") { + if (argc < 4) { + throw std::invalid_argument("from"); + } + std::string target_resource = argv[3]; + client->upload(remote_resource, target_resource); + } + } + catch (std::invalid_argument& error) { + std::cout << "use: []" << std::endl; + } + catch (std::runtime_error& error) { + std::cout << error.what() << std::endl; + } +} \ No newline at end of file diff --git a/examples/client/check.cpp b/examples/client/check.cpp index 27f175e..80b3bb6 100644 --- a/examples/client/check.cpp +++ b/examples/client/check.cpp @@ -24,14 +24,27 @@ int main() { + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); + + if (hostname_ptr == nullptr) return -1; + if (username_ptr == nullptr) return -1; + if (password_ptr == nullptr) return -1; + std::map options = { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, - { "webdav_password", "{webdav_password}" } + { "webdav_hostname", hostname_ptr }, + { "webdav_login", username_ptr }, + { "webdav_password", password_ptr } }; - std::unique_ptr client(WebDAV::Client::Init(options)); + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } + + std::unique_ptr client(WebDAV::Client::Init(options)); auto remote_resources = { "existing_file.dat", @@ -44,7 +57,7 @@ int main() { for (auto remote_resource : remote_resources) { bool is_existed = client->check(remote_resource); - std::cout << "Resource: " << remote_resource << " is " << is_existed ? "" : "not " << "existed" << std::endl; + std::cout << "Resource: " << remote_resource << " is " << (is_existed ? "" : "not ") << "existed" << std::endl; } } diff --git a/examples/client/copy.cpp b/examples/client/copy.cpp index ff9e29c..115f1fd 100644 --- a/examples/client/copy.cpp +++ b/examples/client/copy.cpp @@ -22,26 +22,41 @@ #include -std::ostream resources_to_string(std::vector & resources) +#include + +std::string resources_to_string(std::vector & resources) { - std::ostream stream; + std::stringstream stream; for (auto resource : resources) { stream << "\t" << "- " << resource << std::endl; } - return stream; + return stream.str(); } int main() { + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); + + if (hostname_ptr == nullptr) return -1; + if (username_ptr == nullptr) return -1; + if (password_ptr == nullptr) return -1; + std::map options = { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, - { "webdav_password", "{webdav_password}" } + { "webdav_hostname", hostname_ptr }, + { "webdav_login", username_ptr }, + { "webdav_password", password_ptr } }; - std::unique_ptr client(WebDAV::Client::Init(options)); + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } + + std::unique_ptr client(WebDAV::Client::Init(options)); auto remote_file = "file.dat"; auto remote_directory = "dir/"; @@ -49,7 +64,7 @@ int main() { auto copy_remote_file = "file2.dat"; auto copy_remote_directory = "dir2/"; - auto resources = client.list(); + auto resources = client->list(); std::cout << "\"/\" resource contain:" << std::endl; std::cout << resources_to_string(resources) << std::endl; diff --git a/examples/client/download.cpp b/examples/client/download.cpp index de9b87e..a56be0d 100644 --- a/examples/client/download.cpp +++ b/examples/client/download.cpp @@ -22,6 +22,8 @@ #include +#include + //! [download_to_file] void download_to_file() @@ -33,13 +35,13 @@ void download_to_file() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; + std::string remote_file = "dir/file.dat"; auto local_file = "/home/user/Downloads/file.dat"; bool is_downloaded = client->download(remote_file, local_file); - std::cout << remote_file << " resource is" << is_downloaded ? "" : "not" << "downloaded" << std::endl; + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; } /// dir/file.dat resource is downloaded @@ -57,14 +59,14 @@ void async_download_to_file() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; - auto local_file = "/home/user/Downloads/file.dat"; + std::string remote_file = "dir/file.dat"; + std::string local_file = "/home/user/Downloads/file.dat"; client->async_download(remote_file, local_file, [remote_file](bool is_downloaded) { - std::cout << remote_file << " resource is" << is_downloaded ? "" : "not" << "downloaded" << std::endl; + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; }); } @@ -83,15 +85,15 @@ void download_to_buffer() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; + std::string remote_file = "dir/file.dat"; char * buffer_ptr = nullptr; - long long int buffer_size = 0; + unsigned long long buffer_size = 0; - bool is_downloaded = client->download(remote_file, buffer_ptr, buffer_size); + bool is_downloaded = client->download_to(remote_file, buffer_ptr, buffer_size); - std::cout << remote_file << " resource is" << is_downloaded ? "" : "not" << "downloaded" << std::endl; + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; } /// dir/file.dat resource is downloaded @@ -102,6 +104,7 @@ void download_to_buffer() void async_download_to_buffer() { + /* std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, @@ -109,16 +112,17 @@ void async_download_to_buffer() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; + std::string remote_file = "dir/file.dat"; char * buffer_ptr = nullptr; - long long int buffer_size = 0; + unsigned long long buffer_size = 0; client->async_download(remote_file, buffer_ptr, buffer_size, [remote_file](bool is_downloaded) { - std::cout << remote_file << " resource is" << is_downloaded ? "" : "not" << "downloaded" << std::endl; + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; }); + */ } /// dir/file.dat resource is downloaded @@ -138,14 +142,22 @@ void download_from_stream() std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; + std::string remote_file = "dir/file.dat"; std::ofstream stream("/home/user/Downloads/file.dat"); bool is_downloaded = client->download_to(remote_file, stream); - std::cout << remote_file << " resource is" << is_downloaded ? "" : "not" << "downloaded" << std::endl; + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; } /// dir/file.dat resource is downloaded //! [download_from_stream] + +int main() { + download_to_file(); + download_to_buffer(); + async_download_to_file(); + async_download_to_buffer(); + download_from_stream(); +} diff --git a/examples/client/info.cpp b/examples/client/info.cpp index f64c048..e5d2855 100644 --- a/examples/client/info.cpp +++ b/examples/client/info.cpp @@ -22,26 +22,40 @@ #include -std::ostream info_to_string(std::map & info) -{ - std::ostream stream; - for (auto option :info) - { +#include + +std::string info_to_string(std::map & info) { + + std::stringstream stream; + for (auto& option : info){ stream << "/t" << option.first << ": " << option.second << std::endl; } - return stream; + return stream.str(); } int main() { + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); + + if (hostname_ptr == nullptr) return -1; + if (username_ptr == nullptr) return -1; + if (password_ptr == nullptr) return -1; + std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, - { "webdav_password", "{webdav_password}" } - }; + { + { "webdav_hostname", hostname_ptr }, + { "webdav_login", username_ptr }, + { "webdav_password", password_ptr } + }; + + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); auto remote_resources = { "existing_file.dat", diff --git a/examples/client/init.cpp b/examples/client/init.cpp index c5e2f17..b1de870 100644 --- a/examples/client/init.cpp +++ b/examples/client/init.cpp @@ -22,6 +22,8 @@ #include +#include + std::map base_options = { { "webdav_hostname", "https://webdav.yandex.ru" }, @@ -48,14 +50,13 @@ std::map options_with_cert = { "key_path", "/etc/ssl/private/client.key" } }; -std::ostream options_to_string(std::map & options) -{ - std::ostream stream; +std::string options_to_string(const std::map & options) { + std::stringstream stream; for (auto option :options) { stream << "\t" << option.first << ": " << option.second << std::endl; } - return stream; + return stream.str(); } int main() { @@ -71,8 +72,8 @@ int main() { bool is_connected = client->check(); std::cout << "Client with options: " << std::endl; std::cout << options_to_string(options); - std::cout << " is " << is_connected ? " " : "not " << "connected" << std::endl; - std::cout << endl; + std::cout << " is " << (is_connected ? " " : "not ") << "connected" << std::endl; + std::cout << std::endl; } } diff --git a/examples/client/list.cpp b/examples/client/list.cpp index 0fe0f1d..dd0f37a 100644 --- a/examples/client/list.cpp +++ b/examples/client/list.cpp @@ -22,35 +22,50 @@ #include -std::ostream resources_to_string(std::vector & resources) +#include + +std::string resources_to_string(std::vector & resources) { - std::ostream stream; - for (auto resource : resources) - { - stream << "\t" << "- " << resource << std::endl; + std::stringstream ss; + for (auto& resource : resources){ + ss << "\t" << "- " << resource << std::endl; } - return stream; + return ss.str(); } int main() { + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); + + if (hostname_ptr == nullptr) return -1; + if (username_ptr == nullptr) return -1; + if (password_ptr == nullptr) return -1; + std::map options = { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, - { "webdav_password", "{webdav_password}" } + { "webdav_hostname", hostname_ptr }, + { "webdav_login", username_ptr }, + { "webdav_password", password_ptr } }; + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } + std::unique_ptr client(WebDAV::Client::Init(options)); auto remote_resources = { + "/", "existing_file.dat", "not_existing_file.dat", "existing_directory", "not_existing_directory" }; - for (auto remote_resource : remote_resources) { + for (auto& remote_resource : remote_resources) { auto resources = client->list(remote_resource); std::cout << remote_resource << " resource contain:" << std::endl; std::cout << resources_to_string(resources); diff --git a/examples/client/mkdir.cpp b/examples/client/mkdir.cpp index a98d2cc..c73618c 100644 --- a/examples/client/mkdir.cpp +++ b/examples/client/mkdir.cpp @@ -41,13 +41,13 @@ int main() { for (auto remote_directory : remote_directories) { bool is_created = client->create_directory(remote_directory); - std::cout << "Directory: " << remote_directory << " is " << is_existed ? "" : "not " << "created" << std::endl; + std::cout << "Directory: " << remote_directory << " is " << (is_created ? "" : "not ") << "created" << std::endl; } auto remote_directory = "not_existing_directory/new_directory"; bool recursive = true; bool is_created = client->create_directory("not_existing_directory/new_directory", recursive); - std::cout << "Directory: " << remote_directory << " is " << is_existed ? "" : "not " << "created" << std::endl; + std::cout << "Directory: " << remote_directory << " is " << (is_created ? "" : "not ") << "created" << std::endl; } /// Directory: existing_directory is created diff --git a/examples/client/move.cpp b/examples/client/move.cpp index 500197a..abcfd0d 100644 --- a/examples/client/move.cpp +++ b/examples/client/move.cpp @@ -22,14 +22,15 @@ #include -std::ostream resources_to_string(std::vector & resources) -{ - std::ostream stream; +#include + +std::string resources_to_string(const std::vector & resources) { + std::stringstream stream; for (auto resource : resources) { stream << "\t" << "- " << resource << std::endl; } - return stream; + return stream.str(); } int main() { @@ -55,7 +56,7 @@ int main() { client->move(remote_file, new_remote_file); client->move(remote_directory, new_remote_directory); - resources = client.list(); + resources = client->list(); std::cout << "\"/\" resource contain:" << std::endl; std::cout << resources_to_string(resources) << std::endl; } diff --git a/examples/client/clean.cpp b/examples/client/remove.cpp similarity index 97% rename from examples/client/clean.cpp rename to examples/client/remove.cpp index 36eb6a1..c7fab47 100644 --- a/examples/client/clean.cpp +++ b/examples/client/remove.cpp @@ -45,7 +45,7 @@ int main() { for (auto remote_resource : remote_resources) { bool is_clean = client->clean(remote_resource); - std::cout << "Resource: " << remote_resource << " is " << is_clean ? "" : "not " << "clean" << std::endl; + std::cout << "Resource: " << remote_resource << " is " << (is_clean ? "" : "not ") << "clean" << std::endl; } } diff --git a/examples/client/upload.cpp b/examples/client/upload.cpp index eb6b505..c85e489 100644 --- a/examples/client/upload.cpp +++ b/examples/client/upload.cpp @@ -22,6 +22,8 @@ #include +#include + //! [upload_from_file] void upload_from_file() @@ -34,14 +36,14 @@ void upload_from_file() }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; - auto local_file = "/home/user/Downloads/file.dat"; + std::string remote_file = "dir/file.dat"; + std::string local_file = "/home/user/Downloads/file.dat"; bool is_uploaded = client->upload(remote_file, local_file); - std::cout << remote_file << " resource is" << is_uploaded ? "" : "not" << "uploaded" << std::endl; + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; } /// dir/file.dat resource is uploaded @@ -53,20 +55,20 @@ void upload_from_file() void async_upload_from_file() { std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_login", "{webdav_login}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; - auto local_file = "/home/user/Downloads/file.dat"; + std::string remote_file = "dir/file.dat"; + std::string local_file = "/home/user/Downloads/file.dat"; client->async_upload(remote_file, local_file, [remote_file](bool is_uploaded) { - std::cout << remote_file << " resource is" << is_uploaded ? "" : "not" << "uploaded" << std::endl; + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; }); } @@ -79,21 +81,21 @@ void async_upload_from_file() void upload_from_buffer() { std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_login", "{webdav_login}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; + std::string remote_file = "dir/file.dat"; char * buffer_ptr = nullptr; - long long int buffer_size = 0; + unsigned long long buffer_size = 0; - bool is_uploaded = client->upload(remote_file, buffer_ptr, buffer_size); + bool is_uploaded = client->upload_from(remote_file, buffer_ptr, buffer_size); - std::cout << remote_file << " resource is" << is_uploaded ? "" : "not" << "uploaded" << std::endl; + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; } /// dir/file.dat resource is uploaded @@ -104,23 +106,24 @@ void upload_from_buffer() void async_upload_from_buffer() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, - {"webdav_password", "{webdav_password}"} - }; + /*std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_login", "{webdav_login}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; + std::string remote_file = "dir/file.dat"; char * buffer_ptr = nullptr; - long long int buffer_size = 0; + unsigned long long buffer_size = 0; client->async_upload(remote_file, buffer_ptr, buffer_size, [remote_file](bool is_uploaded) { - std::cout << remote_file << " resource is" << is_uploaded ? "" : "not" << "uploaded" << std::endl; + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; }); + */ } /// dir/file.dat resource is uploaded @@ -132,22 +135,30 @@ void async_upload_from_buffer() void upload_from_stream() { std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_login", "{webdav_login}"}, + {"webdav_password", "{webdav_password}"} + }; std::unique_ptr client(WebDAV::Client::Init(options)); - auto remote_file = "dir/file.dat"; + std::string remote_file = "dir/file.dat"; std::ifstream stream("/home/user/Downloads/file.dat"); bool is_uploaded = client->upload_from(remote_file, stream); - std::cout << remote_file << " resource is" << is_uploaded ? "" : "not" << "uploaded" << std::endl; + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; } /// dir/file.dat resource is uploaded //! [upload_from_stream] + +int main() { + upload_from_file(); + upload_from_buffer(); + upload_from_stream(); + async_upload_from_file(); + async_upload_from_buffer(); +} diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 9b7c993..896ed92 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -168,7 +168,7 @@ namespace WebDAV auto download_to( const std::string& remote_file, char * & buffer_ptr, - unsigned long long int & buffer_size, + unsigned long long & buffer_size, progress_t progress = nullptr ) const noexcept -> bool; @@ -224,7 +224,7 @@ namespace WebDAV auto upload_from( const std::string& remote_file, char * buffer_ptr, - unsigned long long int buffer_size, + unsigned long long buffer_size, progress_t progress = nullptr ) const noexcept -> bool; diff --git a/sources/client.cpp b/sources/client.cpp index efd8da1..55aac68 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -180,6 +180,9 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0L); request.set(CURLOPT_WRITEDATA, (size_t)&file_stream); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Write::stream); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif if (progress != nullptr) { request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); request.set(CURLOPT_NOPROGRESS, 0L); @@ -217,6 +220,9 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0L); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif if (progress != nullptr) { request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); request.set(CURLOPT_NOPROGRESS, 0L); @@ -254,6 +260,9 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0L); request.set(CURLOPT_WRITEDATA, (size_t)&stream); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Write::stream); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif if (progress != nullptr) { request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); request.set(CURLOPT_NOPROGRESS, 0L); @@ -297,6 +306,9 @@ namespace WebDAV request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); request.set(CURLOPT_WRITEDATA, (size_t)&response); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif if (progress != nullptr) { request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); request.set(CURLOPT_NOPROGRESS, 0L); @@ -336,6 +348,9 @@ namespace WebDAV request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); request.set(CURLOPT_WRITEDATA, (size_t)&response); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif if (progress != nullptr) { request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); request.set(CURLOPT_NOPROGRESS, 0L); @@ -375,6 +390,9 @@ namespace WebDAV request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); request.set(CURLOPT_WRITEDATA, (size_t)&response); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif if (progress != nullptr) { request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); request.set(CURLOPT_NOPROGRESS, 0L); @@ -430,6 +448,9 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif auto is_performed = request.perform(); if (!is_performed) return 0; @@ -470,6 +491,9 @@ namespace WebDAV request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif return request.perform(); } @@ -497,13 +521,18 @@ namespace WebDAV request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); - +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif bool is_performed = request.perform(); if (!is_performed) return dict_t(); pugi::xml_document document; document.load_buffer(data.buffer, (size_t)data.size); +#ifndef NDEBUG + document.save(std::cout); +#endif auto multistatus = document.select_single_node("*[local-name()='multistatus']").node(); auto responses = multistatus.select_nodes("*[local-name()='response']"); for (auto response : responses) @@ -544,6 +573,7 @@ namespace WebDAV auto information = this->info(remote_resource); auto resource_type = information["type"]; bool is_directory = resource_type.compare("d:collection") == 0; + is_directory |= resource_type.compare("D:collection") == 0; return is_directory; } @@ -576,6 +606,9 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif bool is_performed = request.perform(); @@ -678,6 +711,9 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "MKCOL"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif return request.perform(); } @@ -706,6 +742,9 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "MOVE"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif return request.perform(); } @@ -734,6 +773,9 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "COPY"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif return request.perform(); } @@ -807,6 +849,9 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "DELETE"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); +#ifndef NDEBUG + request.set(CURLOPT_VERBOSE, 1); +#endif return request.perform(); } diff --git a/sources/urn.cpp b/sources/urn.cpp index 04c2148..e77f219 100644 --- a/sources/urn.cpp +++ b/sources/urn.cpp @@ -193,3 +193,7 @@ namespace WebDAV { } } } + +auto operator<<(std::ostream& stream, const WebDAV::Urn::Path& path) -> std::ostream& { + return stream << path.path(); +} \ No newline at end of file diff --git a/sources/urn.hpp b/sources/urn.hpp index 009510f..18703e9 100644 --- a/sources/urn.hpp +++ b/sources/urn.hpp @@ -22,14 +22,14 @@ #ifndef WEBDAV_URN_H #define WEBDAV_URN_H -#pragma once +#include #include using std::string; namespace WebDAV { - namespace Urn { + namespace Urn { class Path { @@ -61,8 +61,9 @@ namespace WebDAV auto operator==(const Path& rhs) const -> bool; }; - } } +auto operator<<(std::ostream& stream, const WebDAV::Urn::Path& path) -> std::ostream&; + #endif From 51f02cf7a8d3c9f4150f32f06b15fdf088d177da Mon Sep 17 00:00:00 2001 From: designerror Date: Mon, 24 Jul 2017 21:28:18 +0300 Subject: [PATCH 008/133] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c404f71..ccbc66a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ matrix: env: COMPILER="clang++-3.6" script: -- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install +- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release - cmake --build _builds - cmake --build _builds --target test -- ARGS=--verbose - cmake --build _builds --target install From 041a7d7895c777258206364111ffa6f78c2022ce Mon Sep 17 00:00:00 2001 From: designerror Date: Mon, 24 Jul 2017 21:37:01 +0300 Subject: [PATCH 009/133] Update CMakeLists.txt --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 946d4ab..b6b0752 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,15 +24,15 @@ cmake_minimum_required(VERSION 3.1) include("cmake/HunterGate.cmake") HunterGate( - URL "https://github.com/designerror/hunter/archive/v0.18.14.23.tar.gz" - SHA1 "4ba5c303245faed28548d4a47f496cf645cf67ed" + URL "https://github.com/ruslo/hunter/archive/v0.19.39.tar.gz" + SHA1 "3973bc272a54ec30fe366dbbb793c840516733bc" ) project(wdc) set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 0) -set(WDC_VERSION_PATCH 2) +set(WDC_VERSION_PATCH 3) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) set(CMAKE_CXX_STANDARD 11) From 32c7d9c4fc798d658a9f3f1dedbf9fb90c0181f2 Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 09:51:42 +0300 Subject: [PATCH 010/133] Update CMakeLists.txt --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b6b0752..c910873 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,15 +24,15 @@ cmake_minimum_required(VERSION 3.1) include("cmake/HunterGate.cmake") HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.19.39.tar.gz" - SHA1 "3973bc272a54ec30fe366dbbb793c840516733bc" + URL "https://github.com/ruslo/hunter/archive/v0.19.45.tar.gz" + SHA1 "56b690cd9bf54de1099727672b8525a4102f124f" ) project(wdc) set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 0) -set(WDC_VERSION_PATCH 3) +set(WDC_VERSION_PATCH 4) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) set(CMAKE_CXX_STANDARD 11) From b40de85ded523e15fb6fdadfb4b55fd1710df545 Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 10:48:28 +0300 Subject: [PATCH 011/133] Update appveyor.yml --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f4f178b..545b395 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -31,7 +31,7 @@ before_build: - call "%VSCOMNTOOLS%\..\..\VC\vcvarsall.bat" %VCVARS_PLATFORM% build_script: -- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install +- cmake -H. -B_builds -DCMAKE_INSTALL_PREFIX=install - cmake --build _builds -- cmake --build _builds --target test -- ARGS=--verbose +- cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build _builds --target RUN_TESTS - cmake --build _builds --target install From 81a6501bfeee8b17b867030ccc815cc9ced7c6df Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 11:03:33 +0300 Subject: [PATCH 012/133] [skip travis-ci] --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 545b395..f2d8986 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -33,5 +33,5 @@ before_build: build_script: - cmake -H. -B_builds -DCMAKE_INSTALL_PREFIX=install - cmake --build _builds -- cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build _builds --target RUN_TESTS +- cmake --build _builds --target RUN_TESTS - cmake --build _builds --target install From fad1d25d20434bd07ef7036afec0d58d61d24598 Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 11:12:03 +0300 Subject: [PATCH 013/133] Update .travis.yml --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index ccbc66a..38d7d53 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,12 @@ addons: - ccache - clang-3.6 - gcc-5 + - cmake-data + - cmake sources: - llvm-toolchain-trusty-3.6 - ubuntu-toolchain-r-test + - george-edison55-precise-backports matrix: include: From ad6ef564a6528b19a3b4e63bbcf4312c8d39ed7e Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 11:23:05 +0300 Subject: [PATCH 014/133] [skip appveyor] --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 38d7d53..f7213b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,9 +11,9 @@ addons: - cmake-data - cmake sources: + - george-edison55-precise-backports - llvm-toolchain-trusty-3.6 - ubuntu-toolchain-r-test - - george-edison55-precise-backports matrix: include: From 381b12e882513009500d8d9271421dec388c726f Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 11:25:58 +0300 Subject: [PATCH 015/133] Update appveyor.yml --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index f2d8986..0ecdcf7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -31,7 +31,7 @@ before_build: - call "%VSCOMNTOOLS%\..\..\VC\vcvarsall.bat" %VCVARS_PLATFORM% build_script: -- cmake -H. -B_builds -DCMAKE_INSTALL_PREFIX=install +- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release - cmake --build _builds - cmake --build _builds --target RUN_TESTS - cmake --build _builds --target install From 58d862efb8e3007357d00b64c0df26047daee544 Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 11:36:40 +0300 Subject: [PATCH 016/133] Update appveyor.yml --- appveyor.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 0ecdcf7..1a0d191 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -33,5 +33,7 @@ before_build: build_script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release - cmake --build _builds +- cmake --build _builds --target help - cmake --build _builds --target RUN_TESTS - cmake --build _builds --target install + From 917ef1d94870293bbd6915180dea4a6b5f6dc771 Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 11:37:12 +0300 Subject: [PATCH 017/133] Update CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c910873..5ed631c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ # ############################################################################ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.3) include("cmake/HunterGate.cmake") HunterGate( From 98ca725f2e43711a4baa1468c1cc0ebb43a0f378 Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 11:44:01 +0300 Subject: [PATCH 018/133] Update .travis.yml [skip appveyor] --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f7213b1..bb67a6e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ addons: - cmake-data - cmake sources: - - george-edison55-precise-backports + - george-edison55/cmake-3.x - llvm-toolchain-trusty-3.6 - ubuntu-toolchain-r-test From aa6bd3970c02f5e055050f9ad8d88b2557d56b8d Mon Sep 17 00:00:00 2001 From: designerror Date: Wed, 26 Jul 2017 11:56:02 +0300 Subject: [PATCH 019/133] Update .travis.yml --- .travis.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index bb67a6e..1c45ebb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,10 +8,7 @@ addons: - ccache - clang-3.6 - gcc-5 - - cmake-data - - cmake sources: - - george-edison55/cmake-3.x - llvm-toolchain-trusty-3.6 - ubuntu-toolchain-r-test @@ -30,8 +27,16 @@ matrix: compiler: clang-3.6 env: COMPILER="clang++-3.6" +install: +- wget https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz +- tar xf cmake-3.8.2.tar.gz +- cd cmake-3.8.2 +- ./configure +- make +- sudo make install + script: -- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release +- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug - cmake --build _builds - cmake --build _builds --target test -- ARGS=--verbose - cmake --build _builds --target install From 1bf420a7526e66afc46e4a6e92cf2c1bcdebed1c Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 12:35:20 +0300 Subject: [PATCH 020/133] fixed #25 --- CMakeLists.txt | 5 +++++ sources/client.cpp | 30 +++++++++++++++--------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ed631c..6aa4c7f 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,11 @@ option(BUILD_TESTS "Build tests" OFF) option(BUILD_EXAMPLES "Build Examples" OFF) option(BUILD_PKGCONFIG "Build in PKGCONFIG mode" OFF) +option(WDC_VERBOSE "Print verbose information" OFF) +if(WDC_VERBOSE) + add_definitions(-DWDC_VERBOSE) +endif() + hunter_add_package(OpenSSL) hunter_add_package(CURL) hunter_add_package(pugixml) diff --git a/sources/client.cpp b/sources/client.cpp index 55aac68..162d638 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -180,7 +180,7 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0L); request.set(CURLOPT_WRITEDATA, (size_t)&file_stream); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Write::stream); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { @@ -220,7 +220,7 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0L); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { @@ -260,7 +260,7 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0L); request.set(CURLOPT_WRITEDATA, (size_t)&stream); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Write::stream); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { @@ -306,7 +306,7 @@ namespace WebDAV request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); request.set(CURLOPT_WRITEDATA, (size_t)&response); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { @@ -348,7 +348,7 @@ namespace WebDAV request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); request.set(CURLOPT_WRITEDATA, (size_t)&response); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { @@ -390,7 +390,7 @@ namespace WebDAV request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); request.set(CURLOPT_WRITEDATA, (size_t)&response); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { @@ -448,7 +448,7 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -491,7 +491,7 @@ namespace WebDAV request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -521,7 +521,7 @@ namespace WebDAV request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif bool is_performed = request.perform(); @@ -530,7 +530,7 @@ namespace WebDAV pugi::xml_document document; document.load_buffer(data.buffer, (size_t)data.size); -#ifndef NDEBUG +#ifdef WDC_VERBOSE document.save(std::cout); #endif auto multistatus = document.select_single_node("*[local-name()='multistatus']").node(); @@ -606,7 +606,7 @@ namespace WebDAV request.set(CURLOPT_HEADER, 0); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -711,7 +711,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "MKCOL"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -742,7 +742,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "MOVE"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -773,7 +773,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "COPY"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -849,7 +849,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "DELETE"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); -#ifndef NDEBUG +#ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif From db745d7382930b4cd0bd6721049f2367b9dbbc0d Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 12:39:23 +0300 Subject: [PATCH 021/133] Update .travis.yml --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1c45ebb..8c911da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,9 +31,9 @@ install: - wget https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz - tar xf cmake-3.8.2.tar.gz - cd cmake-3.8.2 -- ./configure -- make -- sudo make install +- ./configure > /dev/null +- make > /dev/null +- sudo make install > /dev/null script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug From fe1bb308f1522bf7fa451cf055245d4e3e98fd4d Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 15:31:37 +0300 Subject: [PATCH 022/133] fixed #26 --- CMakeLists.txt | 10 +-- include/webdav/client.hpp | 2 +- sources/client.cpp | 10 ++- tests/check.cpp | 22 +++++-- tests/clean.cpp | 43 ++++++++++--- tests/config.hpp | 50 --------------- tests/download.cpp | 26 ++++++-- tests/fixture.cpp | 107 ++++++++++++++++++++++++++++++++ tests/{stdafx.h => fixture.hpp} | 30 ++++++--- tests/list.cpp | 107 +++++++++++++++++++------------- tests/main.cpp | 4 +- tests/stdafx.cpp | 23 ------- tests/upload.cpp | 48 ++++++++++---- 13 files changed, 310 insertions(+), 172 deletions(-) delete mode 100644 tests/config.hpp create mode 100644 tests/fixture.cpp rename tests/{stdafx.h => fixture.hpp} (61%) delete mode 100644 tests/stdafx.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6aa4c7f..571150f 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,21 +51,23 @@ endif() hunter_add_package(OpenSSL) hunter_add_package(CURL) hunter_add_package(pugixml) +hunter_add_package(Boost COMPONENTS system filesystem) find_package(OpenSSL REQUIRED) find_package(CURL CONFIG REQUIRED) find_package(pugixml CONFIG REQUIRED) +find_package(Boost CONFIG REQUIRED system filesystem) file(GLOB ${PROJECT_NAME}_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/sources/*.cpp") include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/) add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCES}) -target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) +target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml Boost::filesystem Boost::system) target_include_directories(${PROJECT_NAME} PUBLIC - $ - $ + $ + $ ) install(TARGETS ${PROJECT_NAME} @@ -86,7 +88,7 @@ if(BUILD_TESTS) enable_testing() file(GLOB ${PROJECT_NAME}_TEST_SOURCES tests/*.cpp) add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) - target_link_libraries(check ${PROJECT_NAME} ${DEPENDS_LIBRARIES}) + target_link_libraries(check ${PROJECT_NAME}) add_test(NAME check COMMAND check "-s" "-r" "compact" "--use-colour" "yes") endif() diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 896ed92..dbd8186 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -102,7 +102,7 @@ namespace WebDAV /// Checks whether the resource directory /// \param[in] remote_resource /// - auto is_dir(const std::string& remote_resource) const noexcept -> bool; + auto is_directory(const std::string& remote_resource) const noexcept -> bool; /// /// List a remote directory diff --git a/sources/client.cpp b/sources/client.cpp index 162d638..40ab301 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -568,13 +568,13 @@ namespace WebDAV } bool - Client::is_dir(const std::string& remote_resource) const noexcept + Client::is_directory(const std::string& remote_resource) const noexcept { auto information = this->info(remote_resource); auto resource_type = information["type"]; - bool is_directory = resource_type.compare("d:collection") == 0; - is_directory |= resource_type.compare("D:collection") == 0; - return is_directory; + bool is_dir = resource_type.compare("d:collection") == 0; + is_dir |= resource_type.compare("D:collection") == 0; + return is_dir; } strings_t @@ -584,8 +584,6 @@ namespace WebDAV bool is_existed = this->check(remote_directory); if (!is_existed) return strings_t(); - bool is_directory = this->is_dir(remote_directory); - if (!is_directory) return strings_t(); auto target_urn = Path(clientImpl->webdav_root, true) + remote_directory; target_urn = Path(target_urn.path(), true); diff --git a/tests/check.cpp b/tests/check.cpp index 1695223..63d782f 100644 --- a/tests/check.cpp +++ b/tests/check.cpp @@ -20,19 +20,29 @@ # ############################################################################*/ -#include "stdafx.h" #include "catch.hpp" +#include "fixture.hpp" + +#include SCENARIO("Client must check an existing remote resources", "[check]") { + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto dirname = fixture::get_dir_name(); + auto filename = fixture::get_file_name(); + + CAPTURE(dirname); + CAPTURE(filename); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("An existing remote resource") { - std::string existing_file = "file.dat"; - std::string existing_directory = "dir/"; + std::string existing_file = filename; + std::string existing_directory = dirname; - client->upload_from(existing_file, (char *)file_content.c_str(), file_content.length()); + client->upload_from(existing_file, (char *)content.c_str(), content.length()); client->create_directory(existing_directory); WHEN("Check for existence of an existing remote file") { @@ -63,6 +73,8 @@ SCENARIO("Client must check an existing remote resources", "[check]") { SCENARIO("Client must check not an existing remote resources", "[check]") { + auto options = fixture::get_options(); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("Not an existing remote resource") { @@ -94,4 +106,4 @@ SCENARIO("Client must check not an existing remote resources", "[check]") { } } } -} \ No newline at end of file +} diff --git a/tests/clean.cpp b/tests/clean.cpp index 34a0083..c7b4338 100644 --- a/tests/clean.cpp +++ b/tests/clean.cpp @@ -20,19 +20,29 @@ # ############################################################################*/ -#include "stdafx.h" #include "catch.hpp" +#include "fixture.hpp" + +#include SCENARIO("Client must clean an existing remote resources", "[clean]") { + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto dirname = fixture::get_dir_name(); + auto filename = fixture::get_file_name(); + + CAPTURE(dirname); + CAPTURE(filename); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("An existing remote resource") { - std::string existing_file = "file.dat"; - std::string existing_directory = "existing_directory/"; + std::string existing_file = filename; + std::string existing_directory = dirname; - client->upload_from(existing_file, (char *)file_content.c_str(), file_content.length()); + client->upload_from(existing_file, (char *)content.c_str(), content.length()); client->create_directory(existing_directory); WHEN("Clean an existing remote file") { @@ -65,6 +75,8 @@ SCENARIO("Client must clean an existing remote resources", "[clean]") { SCENARIO("Client must clean not an existing remote resources", "[clean]") { + auto options = fixture::get_options(); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("Not an existing remote resource") { @@ -102,16 +114,22 @@ SCENARIO("Client must clean not an existing remote resources", "[clean]") { SCENARIO("Client must clean not an empty remote directories", "[clean]") { + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto dirname = fixture::get_dir_name(); + + CAPTURE(dirname); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("Not an empty remote directory") { - std::string not_empty_directory = "not_empty_directory/"; - std::string attached_file = "not_empty_directory/attached_file.dat"; - std::string attached_directory = "not_empty_directory/attached_directory/"; + std::string not_empty_directory = dirname; + std::string attached_file = not_empty_directory + "/" + "attached_file.dat"; + std::string attached_directory = not_empty_directory + "/" + "attached_directory/"; client->create_directory(not_empty_directory); - client->upload_from(attached_file, (char *)file_content.c_str(), file_content.length()); + client->upload_from(attached_file, (char *)content.c_str(), content.length()); client->create_directory(attached_directory); WHEN("Clean not an empty directory") { @@ -136,11 +154,16 @@ SCENARIO("Client must clean not an empty remote directories", "[clean]") { SCENARIO("Client must clean a remote directory", "[clean]") { + auto options = fixture::get_options(); + auto dirname = fixture::get_dir_name(); + + CAPTURE(dirname); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("An existing directory") { - std::string directory_name = "directory"; + std::string directory_name = dirname; client->create_directory(directory_name); WHEN("Clean directory by a name") { @@ -155,4 +178,4 @@ SCENARIO("Client must clean a remote directory", "[clean]") { } } } -} \ No newline at end of file +} diff --git a/tests/config.hpp b/tests/config.hpp deleted file mode 100644 index 7031195..0000000 --- a/tests/config.hpp +++ /dev/null @@ -1,50 +0,0 @@ -/*#*************************************************************************** -# __ __ _____ _____ -# Project | | | | | \ / ___| -# | |__| | | |\ \ / / -# | | | | ) ) ( ( -# | /\ | | |/ / \ \___ -# \_/ \_/ |_____/ \_____| -# -# Copyright (C) 2016, The WDC Project, , et al. -# -# This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. -# -# 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 LICENSE file. -# -# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -# KIND, either express or implied. -# -############################################################################*/ - -//#define WITH_PROXY - -#include - -static std::map options_with_proxy = -{ - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "webdav.test.login" }, - { "webdav_password", "webdav.test.password" }, - { "proxy_hostname", "{proxy_hostname}" }, - { "proxy_login", "{proxy_login}" }, - { "proxy_password", "{proxy_password}" } -}; - -static std::map options_without_proxy = -{ - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "webdav.test.login" }, - { "webdav_password", "webdav.test.password" } -}; - -#ifdef WITH_PROXY -static std::map options = options_with_proxy; -#else -static std::map options = options_without_proxy; -#endif - -static std::string file_content = "static std::wstring file_content = L\"static std::wstring file_content = ...\";"; diff --git a/tests/download.cpp b/tests/download.cpp index 3b2d597..fc34a6d 100644 --- a/tests/download.cpp +++ b/tests/download.cpp @@ -20,17 +20,25 @@ # ############################################################################*/ -#include "stdafx.h" #include "catch.hpp" +#include "fixture.hpp" + +#include SCENARIO("Client must download into buffer", "[download][buffer]") { + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); + + CAPTURE(filename); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("A buffer") { - std::string source_buffer = "content of the buffer"; - std::string remote_resource = "file.dat"; + std::string source_buffer = content; + std::string remote_resource = filename; auto buffer_pointer = const_cast(source_buffer.c_str()); unsigned long long buffer_size = (source_buffer.length() + 1)* sizeof(source_buffer.c_str()[0]); @@ -56,14 +64,20 @@ SCENARIO("Client must download into buffer", "[download][buffer]") { SCENARIO("Client must download stream", "[download][stream]") { + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); + + CAPTURE(filename); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("A stream") { std::stringstream destination_stream; - std::stringstream source_stream("content of the stream"); - std::string remote_resource = "file.dat"; + std::stringstream source_stream(content); + std::string remote_resource = filename; auto is_success = client->upload_from(remote_resource, source_stream); REQUIRE(is_success); @@ -86,4 +100,4 @@ SCENARIO("Client must download stream", "[download][stream]") { } } } -} \ No newline at end of file +} diff --git a/tests/fixture.cpp b/tests/fixture.cpp new file mode 100644 index 0000000..75f7184 --- /dev/null +++ b/tests/fixture.cpp @@ -0,0 +1,107 @@ +/*#*************************************************************************** +# __ __ _____ _____ +# Project | | | | | \ / ___| +# | |__| | | |\ \ / / +# | | | | ) ) ( ( +# | /\ | | |/ / \ \___ +# \_/ \_/ |_____/ \_____| +# +# Copyright (C) 2016, The WDC Project, , et al. +# +# This software is licensed as described in the file LICENSE, which +# you should have received as part of this distribution. +# +# 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 LICENSE file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +############################################################################*/ + +#include +#include +#include + +#include +#include +#include + +#include "fixture.hpp" + +using dict_t = std::map; + +std::string file_ext = ".txt"; +std::string file_content = "static std::wstring file_content = L\"static std::wstring file_content = ...\";"; +std::string buff_content = "static std::wstring buff_content = L\"static std::wstring buff_content = ...\";"; + +namespace fixture +{ + auto get_file_content() -> std::string { + return file_content; + } + + auto get_buff_content() -> std::string { + return buff_content; + } + + auto get_file_name() -> std::string { + + boost::uuids::random_generator gen; + boost::uuids::uuid id = gen(); + auto ciid = to_string(id); + return ciid + file_ext;; + } + + auto get_dir_name() -> std::string { + + boost::uuids::random_generator gen; + boost::uuids::uuid id = gen(); + auto ciid = to_string(id); + return ciid; + } + + auto get_options() -> dict_t { + + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); + + if (hostname_ptr == nullptr) { + throw std::runtime_error("undefined WEBDAV_HOSTNAME environment variable"); + } + if (username_ptr == nullptr) { + throw std::runtime_error("undefined WEBDAV_USERNAME environment variable"); + } + if (password_ptr == nullptr) { + throw std::runtime_error("undefined WEBDAV_PASSWORD environment variable"); + } + + std::map options = { + {"webdav_hostname", hostname_ptr}, + {"webdav_login", username_ptr}, + {"webdav_password", password_ptr} + }; + + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } + + auto proxy_hostname_ptr = std::getenv("PROXY_HOSTNAME"); + auto proxy_username_ptr = std::getenv("PROXY_USERNAME"); + auto proxy_password_ptr = std::getenv("PROXY_PASSWORD"); + + if (proxy_hostname_ptr != nullptr) { + options["proxy_hostname"] = proxy_hostname_ptr; + } + if (proxy_username_ptr != nullptr) { + options["proxy_login"] = proxy_username_ptr; + } + if (proxy_password_ptr != nullptr && proxy_username_ptr != nullptr) { + options["proxy_password"] = proxy_password_ptr; + } + return options; + } +} diff --git a/tests/stdafx.h b/tests/fixture.hpp similarity index 61% rename from tests/stdafx.h rename to tests/fixture.hpp index b62a11b..cc59ef4 100644 --- a/tests/stdafx.h +++ b/tests/fixture.hpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -20,11 +20,25 @@ # ############################################################################*/ -#pragma once +#include +#include +#include -#include -#include -#include +#include +#include +#include -#include -#include "config.hpp" +using dict_t = std::map; + +namespace fixture +{ + auto get_file_content() -> std::string; + + auto get_buff_content() -> std::string; + + auto get_file_name() -> std::string; + + auto get_dir_name() -> std::string; + + auto get_options() -> dict_t; +} diff --git a/tests/list.cpp b/tests/list.cpp index 58bb223..0737aae 100644 --- a/tests/list.cpp +++ b/tests/list.cpp @@ -20,88 +20,107 @@ # ############################################################################*/ -#include "stdafx.h" #include "catch.hpp" +#include "fixture.hpp" + +#include SCENARIO("Client must list a remote files and a remote directories", "[list]") { - std::unique_ptr client(WebDAV::Client::Init(options)); + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto dirname = fixture::get_dir_name(); - GIVEN("A remote directory with 5 files and 5 directories") { + CAPTURE(dirname); - std::string root = "dir_with_files_and_dirs/"; + std::unique_ptr client(WebDAV::Client::Init(options)); - std::string template_filename = "file"; - std::string template_dirname = "dir"; + GIVEN("A remote directory with 5 files and 5 directories") { - CHECK(client->clean(root)); - REQUIRE(client->create_directory(root)); + std::string root = dirname; - for (auto i = 1; i <= 5; ++i) - { - auto number = std::to_string(i); - auto directory = root + template_dirname + number; - auto file = root + template_filename + number; - client->create_directory(directory); - client->upload_from(file, (char *)file_content.c_str(), file_content.length()); - } + std::string template_filename = "file"; + std::string template_dirname = "dir"; + + CHECK(client->clean(root)); + REQUIRE(client->create_directory(root)); - WHEN("List the directory") { + for (auto i = 1; i <= 5; ++i) + { + auto number = std::to_string(i); + auto directory = root + "/" + template_dirname + number; + auto file = root + "/"+ template_filename + number; + client->create_directory(directory); + client->upload_from(file, (char *)content.c_str(), content.length()); + } - auto resources = client->list(root); + WHEN("List the directory") { - THEN("Get 10 resources") { + auto resources = client->list(root); - CHECK(resources.size() == 10); - } + THEN("Get 10 resources") { + + CHECK(resources.size() == 10); + } + } } - } } SCENARIO("Client can not list a remote file", "[list][file]") { - std::unique_ptr client(WebDAV::Client::Init(options)); + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); + + CAPTURE(filename); - GIVEN("An existing remote file") { + std::unique_ptr client(WebDAV::Client::Init(options)); - std::string existing_file = "file.dat"; + GIVEN("An existing remote file") { - client->upload_from(existing_file, (char *)file_content.c_str(), file_content.length()); + std::string existing_file = filename; - WHEN("List content of the file") { + client->upload_from(existing_file, (char *)content.c_str(), content.length()); - REQUIRE(client->check(existing_file)); + WHEN("List content of the file") { - auto resources = client->list(existing_file); + REQUIRE(client->check(existing_file)); - THEN("Get an empty list") { + auto resources = client->list(existing_file); - CHECK(resources.empty()); - } + THEN("Get an empty list") { + + CHECK(resources.empty()); + } + } } - } } SCENARIO("Client can list an empty remote directory", "[list][empty]") { - std::unique_ptr client(WebDAV::Client::Init(options)); + auto options = fixture::get_options(); + auto dirname = fixture::get_dir_name(); + + CAPTURE(dirname); + + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("An empty remote directory") { - std::string empty_directory = "empty_directory/"; + std::string empty_directory = dirname; - client->create_directory(empty_directory); + client->create_directory(empty_directory); - WHEN("List content of the directory") { + WHEN("List content of the directory") { - REQUIRE(client->check(empty_directory)); + REQUIRE(client->check(empty_directory)); - auto resources = client->list(empty_directory); + auto resources = client->list(empty_directory); - THEN("Get an empty list") { + THEN("Get an empty list") { - CHECK(resources.empty()); - } + CHECK(resources.empty()); + } + } } - } -} \ No newline at end of file +} diff --git a/tests/main.cpp b/tests/main.cpp index 2c8a2ca..47e82c8 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -20,7 +20,5 @@ # ############################################################################*/ -#include "stdafx.h" - #define CATCH_CONFIG_MAIN -#include "catch.hpp" \ No newline at end of file +#include "catch.hpp" diff --git a/tests/stdafx.cpp b/tests/stdafx.cpp deleted file mode 100644 index f1f22fc..0000000 --- a/tests/stdafx.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/*#*************************************************************************** -# __ __ _____ _____ -# Project | | | | | \ / ___| -# | |__| | | |\ \ / / -# | | | | ) ) ( ( -# | /\ | | |/ / \ \___ -# \_/ \_/ |_____/ \_____| -# -# Copyright (C) 2016, The WDC Project, , et al. -# -# This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. -# -# 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 LICENSE file. -# -# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -# KIND, either express or implied. -# -############################################################################*/ - -#include "stdafx.h" \ No newline at end of file diff --git a/tests/upload.cpp b/tests/upload.cpp index 88feeb2..2d22164 100644 --- a/tests/upload.cpp +++ b/tests/upload.cpp @@ -20,20 +20,29 @@ # ############################################################################*/ -#include "stdafx.h" #include "catch.hpp" +#include "fixture.hpp" + +#include + +#include SCENARIO("Client must upload buffer", "[upload][buffer]") { + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); + + CAPTURE(filename); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("A buffer") { - std::string buffer = "content of the buffer"; - std::string remote_resource = "file.dat"; + std::string remote_resource = filename; - auto buffer_pointer = const_cast(buffer.c_str()); - auto buffer_size = buffer.length() * sizeof(buffer.c_str()[0]); + auto buffer_pointer = const_cast(content.c_str()); + auto buffer_size = content.length() * sizeof(content.c_str()[0]); WHEN("Upload the buffer") { @@ -51,14 +60,20 @@ SCENARIO("Client must upload buffer", "[upload][buffer]") { } } -SCENARIO("Client must upload stream", "[upload][string][stream]") { +SCENARIO("Client must upload string stream", "[upload][string][stream]") { + + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); + + CAPTURE(filename); std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("A stream") { - std::stringstream stream("content of the stream"); - std::string remote_resource = "file.dat"; + std::stringstream stream(content); + std::string remote_resource = filename; WHEN("Upload the stream") { @@ -78,19 +93,28 @@ SCENARIO("Client must upload stream", "[upload][string][stream]") { SCENARIO("Client must upload file stream", "[upload][file][stream]") { + auto options = fixture::get_options(); + auto content = fixture::get_file_content(); + auto filename = fixture::get_file_name(); + + CAPTURE(filename); + std::unique_ptr client(WebDAV::Client::Init(options)); GIVEN("A stream") { - std::fstream stream("C:\\Users\\host\\Downloads\\libyaml-master.zip", std::ios::binary | std::ios::in | std::ios::out); - std::string remote_resource = "libyaml-master.zip"; + std::ofstream out(filename); + out << content; + + std::ifstream in(filename, std::ios::binary); + std::string remote_resource = filename; WHEN("Upload the stream") { REQUIRE(client->clean(remote_resource)); REQUIRE(!client->check(remote_resource)); - auto is_success = client->upload_from(remote_resource, stream); + auto is_success = client->upload_from(remote_resource, in); THEN("stream must be uploaded") { @@ -99,4 +123,4 @@ SCENARIO("Client must upload file stream", "[upload][file][stream]") { } } } -} \ No newline at end of file +} From c7f3bb32189d7d6e349780d59d9f8741be2948ca Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 15:50:51 +0300 Subject: [PATCH 023/133] Update README.md [skip ci] --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ed1cac7..99dfdba 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ WebDAV Client === -[![version](https://img.shields.io/badge/version-1.0.2-brightgreen.svg)](https://github.com/designerror/webdav-client-cpp/releases/tag/v1.0.2) +[![version](https://img.shields.io/badge/version-1.0.4-brightgreen.svg)](https://github.com/designerror/webdav-client-cpp/releases/tag/v1.0.4) [![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -[![Build Status](https://travis-ci.org/designerror/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/designerror/webdav-client-cpp) -[![Build status](https://ci.appveyor.com/api/projects/status/l0nwebsyxwcc3lcs?svg=true)](https://ci.appveyor.com/project/designerror/webdav-client-cpp) +[![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) +[![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) Package ```WebDAV Client``` provides easy and convenient to work with WebDAV-servers: From 11d410be645ed758b624fd63f484a5b4c1df05fc Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 15:51:56 +0300 Subject: [PATCH 024/133] Update appveyor.yml [skip travis] --- appveyor.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 1a0d191..70e3851 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,10 +1,16 @@ platform: - x86 - x64 - + environment: - matrix: - - VSVER: 14 + WEBDAV_HOSTNAME: + secure: qMCWqchDp72RftbP5uTufNPtD0/7Jla3VJ/Yx3Xuwyc= + WEBDAV_USERNAME: + secure: 4IlY8dVOhjsf+RWnameAyQ2ELLifB2T1agRXsJ08pGE= + WEBDAV_PASSWORD: + secure: 4Us1bf4SKdfTiKKp6TcBf4Mtw/aRVv6sTvGc0SpSNmU= +build: + verbosity: minimal configuration: - plain From 2dcdc562f6b29767c9055dc2fa8d30b880990393 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 15:55:38 +0300 Subject: [PATCH 025/133] Update appveyor.yml [skip travis] --- appveyor.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 70e3851..b2c98fe 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,8 +1,10 @@ platform: - - x86 - - x64 +- x86 +- x64 environment: + matrix: + - VSVER: 14 WEBDAV_HOSTNAME: secure: qMCWqchDp72RftbP5uTufNPtD0/7Jla3VJ/Yx3Xuwyc= WEBDAV_USERNAME: @@ -13,8 +15,8 @@ build: verbosity: minimal configuration: - - plain - - shared +- plain +- shared before_build: - ps: >- From 72454735a1e7c88b266574271ea47428bed0a18e Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 15:56:49 +0300 Subject: [PATCH 026/133] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8c911da..a42cc18 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,7 @@ install: - cd cmake-3.8.2 - ./configure > /dev/null - make > /dev/null -- sudo make install > /dev/null +- make install > /dev/null script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug From 45de009a47b067be303d2e2fdbbd34f59b4eac8e Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 16:12:08 +0300 Subject: [PATCH 027/133] Update appveyor.yml [skip travis] --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index b2c98fe..d854cc0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -41,7 +41,6 @@ before_build: build_script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release - cmake --build _builds -- cmake --build _builds --target help - cmake --build _builds --target RUN_TESTS - cmake --build _builds --target install From 1583a47a78efecf92f621ffde0f00068dcaa752a Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 16:28:50 +0300 Subject: [PATCH 028/133] Update .travis.yml --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index a42cc18..a35f56e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,12 +28,12 @@ matrix: env: COMPILER="clang++-3.6" install: -- wget https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz -- tar xf cmake-3.8.2.tar.gz -- cd cmake-3.8.2 -- ./configure > /dev/null -- make > /dev/null -- make install > /dev/null +- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; + wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.sh; + chmod +x cmake-3.8.2-Linux-x86_64.sh; + ./cmake-3.8.2-Linux-x86_64.sh; + fi +- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; brew install cmake; fi script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug From b0db523b173fea0a3a4fe86027a528e372a21ad6 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 16:31:11 +0300 Subject: [PATCH 029/133] Update .travis.yml --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a35f56e..6fc5fc1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,12 +28,12 @@ matrix: env: COMPILER="clang++-3.6" install: -- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; +- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.sh; chmod +x cmake-3.8.2-Linux-x86_64.sh; ./cmake-3.8.2-Linux-x86_64.sh; fi -- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; brew install cmake; fi +- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install cmake; fi script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug From deeaa74ccdbb5aeab2f66c2a828c2799e985be67 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 16:39:06 +0300 Subject: [PATCH 030/133] Update .travis.yml [skip appveyour] --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6fc5fc1..601497e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,6 @@ install: chmod +x cmake-3.8.2-Linux-x86_64.sh; ./cmake-3.8.2-Linux-x86_64.sh; fi -- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install cmake; fi script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug From 4242d96ef8054de4c8128ace6d0eeaa869300ac4 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 16:54:56 +0300 Subject: [PATCH 031/133] Update .travis.yml [skip appveyor] --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 601497e..e9cc16a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,9 +29,8 @@ matrix: install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.sh; - chmod +x cmake-3.8.2-Linux-x86_64.sh; - ./cmake-3.8.2-Linux-x86_64.sh; + wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz; + tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C test/ --strip-components=1; fi script: From 0a86a5f49791ed1a6a75bb886eab2c601222fef5 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 16:57:20 +0300 Subject: [PATCH 032/133] Update .travis.yml [skip appveyor] --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e9cc16a..1eb80c9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,7 +30,7 @@ matrix: install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz; - tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C test/ --strip-components=1; + tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; fi script: From 8142bcfe65be6a395d9dc61389fc1a698721a000 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 17:05:39 +0300 Subject: [PATCH 033/133] Update .travis.yml [skip appveyor] --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1eb80c9..0ee2d96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: generic cache: ccache dist: trusty +sudo: required addons: apt: @@ -30,7 +31,7 @@ matrix: install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz; - tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; + sudo tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; fi script: From 05de245eca1953b952514eaf75320736096bea47 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 17:18:38 +0300 Subject: [PATCH 034/133] Update .travis.yml [skip appveyor] --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0ee2d96..179aedf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,10 @@ install: sudo tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; fi +cache: + directories: + - $HOME/.hunter + script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug - cmake --build _builds From 11837b13a8753fe1f0c07c4b4da241f4c55c0c1f Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 17:25:54 +0300 Subject: [PATCH 035/133] fixed bug with openssl --- CMakeLists.txt | 1 + cmake/Hunter/config.cmake | 1 + cmake/HunterGate.cmake | 509 +------------------------------------- 3 files changed, 3 insertions(+), 508 deletions(-) create mode 100644 cmake/Hunter/config.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 571150f..6ff6497 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ include("cmake/HunterGate.cmake") HunterGate( URL "https://github.com/ruslo/hunter/archive/v0.19.45.tar.gz" SHA1 "56b690cd9bf54de1099727672b8525a4102f124f" + LOCAL ) project(wdc) diff --git a/cmake/Hunter/config.cmake b/cmake/Hunter/config.cmake new file mode 100644 index 0000000..3550326 --- /dev/null +++ b/cmake/Hunter/config.cmake @@ -0,0 +1 @@ +hunter_config(OpenSSL VERSION 1.0.2j) diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake index 99882d2..3550326 100644 --- a/cmake/HunterGate.cmake +++ b/cmake/HunterGate.cmake @@ -1,508 +1 @@ -# Copyright (c) 2013-2015, 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.0) -# -# 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 - -cmake_minimum_required(VERSION 3.0) # Minimum for Hunter -include(CMakeParseArguments) # cmake_parse_arguments - -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_WIKI "https://github.com/ruslo/hunter/wiki") - -function(hunter_gate_status_print) - foreach(print_message ${ARGV}) - if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) - message(STATUS "[hunter] ${print_message}") - endif() - endforeach() -endfunction() - -function(hunter_gate_status_debug) - foreach(print_message ${ARGV}) - if(HUNTER_STATUS_DEBUG) - string(TIMESTAMP timestamp) - message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") - endif() - endforeach() -endfunction() - -function(hunter_gate_wiki wiki_page) - message("------------------------------ WIKI -------------------------------") - message(" ${HUNTER_WIKI}/${wiki_page}") - 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_wiki("error.internal") -endfunction() - -function(hunter_gate_fatal_error) - cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}") - string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki) - if(have_no_wiki) - hunter_gate_internal_error("Expected wiki") - 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_wiki("${hunter_WIKI}") -endfunction() - -function(hunter_gate_user_error) - hunter_gate_fatal_error(${ARGV} WIKI "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) - - if(EXISTS "${root}/cmake/Hunter") - set(hunter_self "${root}") - else() - set( - hunter_self - "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" - ) - endif() - - 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" - WIKI "error.detect.hunter.root" - ) -endfunction() - -macro(hunter_gate_lock dir) - if(NOT HUNTER_SKIP_LOCK) - if("${CMAKE_VERSION}" VERSION_LESS "3.2") - hunter_gate_fatal_error( - "Can't lock, upgrade to CMake 3.2 or use HUNTER_SKIP_LOCK" - WIKI "error.can.not.lock" - ) - endif() - hunter_gate_status_debug("Locking directory: ${dir}") - file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) - hunter_gate_status_debug("Lock done") - endif() -endmacro() - -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}" - WIKI "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_lock("${dir}") - 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.0)\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" - " 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}") - set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}") - else() - # 'toolchain_arg' can't be empty - set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") - endif() - - execute_process( - COMMAND "${CMAKE_COMMAND}" "-H${dir}" "-B${build_dir}" "-G${CMAKE_GENERATOR}" "${toolchain_arg}" - WORKING_DIRECTORY "${dir}" - RESULT_VARIABLE download_result - ${logging_params} - ) - - if(NOT download_result EQUAL 0) - hunter_gate_internal_error("Configure project failed") - 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() - 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_LIST_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}" - WIKI "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!)" - WIKI "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") - if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") - # Hunter downloaded manually (e.g. by 'git clone') - set(_unused "xxxxxxxxxx") - set(HUNTER_GATE_SHA1 "${_unused}") - set(HUNTER_GATE_VERSION "${_unused}") - else() - 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() - endif() - include("${_master_location}") - set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) - endif() -endmacro() +hunter_config(OpenSSL VERSION 1.0.2j) From 0d9d4d3d8a179ca527f713e43a12a86914e11f4a Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 17:32:17 +0300 Subject: [PATCH 036/133] fixed bug with openssl --- cmake/HunterGate.cmake | 509 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 508 insertions(+), 1 deletion(-) diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake index 3550326..99882d2 100644 --- a/cmake/HunterGate.cmake +++ b/cmake/HunterGate.cmake @@ -1 +1,508 @@ -hunter_config(OpenSSL VERSION 1.0.2j) +# Copyright (c) 2013-2015, 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.0) +# +# 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 + +cmake_minimum_required(VERSION 3.0) # Minimum for Hunter +include(CMakeParseArguments) # cmake_parse_arguments + +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_WIKI "https://github.com/ruslo/hunter/wiki") + +function(hunter_gate_status_print) + foreach(print_message ${ARGV}) + if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) + message(STATUS "[hunter] ${print_message}") + endif() + endforeach() +endfunction() + +function(hunter_gate_status_debug) + foreach(print_message ${ARGV}) + if(HUNTER_STATUS_DEBUG) + string(TIMESTAMP timestamp) + message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") + endif() + endforeach() +endfunction() + +function(hunter_gate_wiki wiki_page) + message("------------------------------ WIKI -------------------------------") + message(" ${HUNTER_WIKI}/${wiki_page}") + 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_wiki("error.internal") +endfunction() + +function(hunter_gate_fatal_error) + cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}") + string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki) + if(have_no_wiki) + hunter_gate_internal_error("Expected wiki") + 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_wiki("${hunter_WIKI}") +endfunction() + +function(hunter_gate_user_error) + hunter_gate_fatal_error(${ARGV} WIKI "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) + + if(EXISTS "${root}/cmake/Hunter") + set(hunter_self "${root}") + else() + set( + hunter_self + "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" + ) + endif() + + 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" + WIKI "error.detect.hunter.root" + ) +endfunction() + +macro(hunter_gate_lock dir) + if(NOT HUNTER_SKIP_LOCK) + if("${CMAKE_VERSION}" VERSION_LESS "3.2") + hunter_gate_fatal_error( + "Can't lock, upgrade to CMake 3.2 or use HUNTER_SKIP_LOCK" + WIKI "error.can.not.lock" + ) + endif() + hunter_gate_status_debug("Locking directory: ${dir}") + file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) + hunter_gate_status_debug("Lock done") + endif() +endmacro() + +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}" + WIKI "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_lock("${dir}") + 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.0)\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" + " 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}") + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}") + else() + # 'toolchain_arg' can't be empty + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") + endif() + + execute_process( + COMMAND "${CMAKE_COMMAND}" "-H${dir}" "-B${build_dir}" "-G${CMAKE_GENERATOR}" "${toolchain_arg}" + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error("Configure project failed") + 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() + 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_LIST_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}" + WIKI "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!)" + WIKI "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") + if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") + # Hunter downloaded manually (e.g. by 'git clone') + set(_unused "xxxxxxxxxx") + set(HUNTER_GATE_SHA1 "${_unused}") + set(HUNTER_GATE_VERSION "${_unused}") + else() + 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() + endif() + include("${_master_location}") + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() +endmacro() From a4a398e9177f1ea7c3690f10db14298ae1adc026 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 18:14:44 +0300 Subject: [PATCH 037/133] Update README.md [skip ci] --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 99dfdba..e1049d1 100644 --- a/README.md +++ b/README.md @@ -72,9 +72,9 @@ int main() << (check_connection ? "" : "not ") << "successful"<< std::endl; - auto is_directory = client->is_dir("/path/to/remote/resource"); + auto is_dir = client->is_directory("/path/to/remote/resource"); std::cout << "remote resource is " - << (is_directory ? "" : "not ") + << (is_dir ? "" : "not ") << "directory" << std::endl; client->create_directory("/path/to/remote/directory/"); From 982c0a40de4c3272ebc869511aa7dab1be026c55 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 18:31:23 +0300 Subject: [PATCH 038/133] Update .travis.yml [skip appveyor] --- .travis.yml | 52 +++++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/.travis.yml b/.travis.yml index 179aedf..671bfdb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,48 +1,42 @@ language: generic -cache: ccache dist: trusty sudo: required addons: - apt: - packages: - - ccache - - clang-3.6 - - gcc-5 - sources: - - llvm-toolchain-trusty-3.6 - - ubuntu-toolchain-r-test + apt: + packages: + - clang-3.6 + - gcc-5 + sources: + - llvm-toolchain-trusty-3.6 + - ubuntu-toolchain-r-test matrix: - include: - - os: linux - compiler: gcc-5 - env: COMPILER="g++-5" - - os: linux - compiler: clang-3.6 - env: COMPILER="clang++-3.6" - - os: osx - compiler: gcc-5 - env: COMPILER="g++-5" - - os: osx - compiler: clang-3.6 - env: COMPILER="clang++-3.6" + include: + - os: linux + compiler: gcc-5 + env: COMPILER="g++-5" + - os: linux + compiler: clang-3.6 + env: COMPILER="clang++-3.6" + - os: osx + compiler: gcc-5 + env: COMPILER="g++-5" + - os: osx + compiler: clang-3.6 + env: COMPILER="clang++-3.6" install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz; - sudo tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; + wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz; + sudo tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; fi cache: directories: - - $HOME/.hunter + - $HOME/.hunter script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug - cmake --build _builds - cmake --build _builds --target test -- ARGS=--verbose -- cmake --build _builds --target install - -after_success: - - bash <(curl -s https://codecov.io/bash) From ab505d6a3f7c28d9336bf5c3562a282de66fca6a Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 19:21:01 +0300 Subject: [PATCH 039/133] Update .travis.yml [skip appveyor] --- .travis.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 671bfdb..5110d88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,10 @@ language: generic dist: trusty sudo: required +git: + depth: 1 + submodules: false + addons: apt: packages: @@ -19,9 +23,6 @@ matrix: - os: linux compiler: clang-3.6 env: COMPILER="clang++-3.6" - - os: osx - compiler: gcc-5 - env: COMPILER="g++-5" - os: osx compiler: clang-3.6 env: COMPILER="clang++-3.6" From 651b0b4054df841b139db8739a68262e429c5232 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 19:49:05 +0300 Subject: [PATCH 040/133] fixed #27 --- CMakeLists.txt | 18 +++++++++++------- README.md | 4 ++-- examples/client/check.cpp | 2 +- examples/client/copy.cpp | 2 +- examples/client/download.cpp | 10 +++++----- examples/client/info.cpp | 2 +- examples/client/init.cpp | 8 ++++---- examples/client/list.cpp | 2 +- examples/client/mkdir.cpp | 2 +- examples/client/move.cpp | 2 +- examples/client/remove.cpp | 2 +- examples/client/size.cpp | 2 +- examples/client/upload.cpp | 10 +++++----- include/webdav/client.hpp | 4 ++-- sources/client.cpp | 12 ++++++------ sources/request.cpp | 18 +++++++++--------- tests/fixture.cpp | 4 ++-- 17 files changed, 54 insertions(+), 50 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ff6497..c14e229 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,21 +50,18 @@ if(WDC_VERBOSE) endif() hunter_add_package(OpenSSL) -hunter_add_package(CURL) -hunter_add_package(pugixml) -hunter_add_package(Boost COMPONENTS system filesystem) - find_package(OpenSSL REQUIRED) +hunter_add_package(CURL) find_package(CURL CONFIG REQUIRED) +hunter_add_package(pugixml) find_package(pugixml CONFIG REQUIRED) -find_package(Boost CONFIG REQUIRED system filesystem) file(GLOB ${PROJECT_NAME}_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/sources/*.cpp") include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/) add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCES}) -target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml Boost::filesystem Boost::system) +target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) target_include_directories(${PROJECT_NAME} PUBLIC $ @@ -86,10 +83,17 @@ if(BUILD_PKGCONFIG) endif() if(BUILD_TESTS) + hunter_add_package(Boost COMPONENTS system filesystem) + find_package(Boost CONFIG REQUIRED system filesystem) + hunter_add_package(Catch) + find_package(Catch CONFIG REQUIRED) + enable_testing() + file(GLOB ${PROJECT_NAME}_TEST_SOURCES tests/*.cpp) add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) - target_link_libraries(check ${PROJECT_NAME}) + target_link_libraries(check ${PROJECT_NAME} Catch::Catch Boost::filesystem Boost::system) + add_test(NAME check COMMAND check "-s" "-r" "compact" "--use-colour" "yes") endif() diff --git a/README.md b/README.md index e1049d1..192af95 100644 --- a/README.md +++ b/README.md @@ -57,13 +57,13 @@ int main() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "webdav_login"}, + {"webdav_username", "webdav_username"}, {"webdav_password", "webdav_password"} }; // additional keys: // - webdav_root // - cert_path, key_path - // - proxy_hostname, proxy_login, proxy_password + // - proxy_hostname, proxy_username, proxy_password std::shared_ptr client(WebDAV::Client::Init(options)); diff --git a/examples/client/check.cpp b/examples/client/check.cpp index 80b3bb6..07d0020 100644 --- a/examples/client/check.cpp +++ b/examples/client/check.cpp @@ -36,7 +36,7 @@ int main() { std::map options = { { "webdav_hostname", hostname_ptr }, - { "webdav_login", username_ptr }, + { "webdav_username", username_ptr }, { "webdav_password", password_ptr } }; diff --git a/examples/client/copy.cpp b/examples/client/copy.cpp index 115f1fd..cb3adbe 100644 --- a/examples/client/copy.cpp +++ b/examples/client/copy.cpp @@ -48,7 +48,7 @@ int main() { std::map options = { { "webdav_hostname", hostname_ptr }, - { "webdav_login", username_ptr }, + { "webdav_username", username_ptr }, { "webdav_password", password_ptr } }; diff --git a/examples/client/download.cpp b/examples/client/download.cpp index a56be0d..1cf9488 100644 --- a/examples/client/download.cpp +++ b/examples/client/download.cpp @@ -31,7 +31,7 @@ void download_to_file() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; @@ -55,7 +55,7 @@ void async_download_to_file() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; @@ -81,7 +81,7 @@ void download_to_buffer() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; @@ -108,7 +108,7 @@ void async_download_to_buffer() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; @@ -136,7 +136,7 @@ void download_from_stream() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; diff --git a/examples/client/info.cpp b/examples/client/info.cpp index e5d2855..ed3bc39 100644 --- a/examples/client/info.cpp +++ b/examples/client/info.cpp @@ -47,7 +47,7 @@ int main() { std::map options = { { "webdav_hostname", hostname_ptr }, - { "webdav_login", username_ptr }, + { "webdav_username", username_ptr }, { "webdav_password", password_ptr } }; diff --git a/examples/client/init.cpp b/examples/client/init.cpp index b1de870..0d0be14 100644 --- a/examples/client/init.cpp +++ b/examples/client/init.cpp @@ -27,24 +27,24 @@ std::map base_options = { { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, + { "webdav_username", "{webdav_username}" }, { "webdav_password", "{webdav_password}" } }; std::map options_with_proxy = { { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, + { "webdav_username", "{webdav_username}" }, { "webdav_password", "{webdav_password}" }, { "proxy_hostname", "https://10.0.0.1:8080" }, - { "proxy_login", "{proxy_login}" }, + { "proxy_username", "{proxy_username}" }, { "proxy_password", "{proxy_password}" } }; std::map options_with_cert = { { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, + { "webdav_username", "{webdav_username}" }, { "webdav_password", "{webdav_password}" }, { "cert_path", "/etc/ssl/certs/client.crt" }, { "key_path", "/etc/ssl/private/client.key" } diff --git a/examples/client/list.cpp b/examples/client/list.cpp index dd0f37a..e87b7f8 100644 --- a/examples/client/list.cpp +++ b/examples/client/list.cpp @@ -47,7 +47,7 @@ int main() { std::map options = { { "webdav_hostname", hostname_ptr }, - { "webdav_login", username_ptr }, + { "webdav_username", username_ptr }, { "webdav_password", password_ptr } }; diff --git a/examples/client/mkdir.cpp b/examples/client/mkdir.cpp index c73618c..8e2c1d0 100644 --- a/examples/client/mkdir.cpp +++ b/examples/client/mkdir.cpp @@ -27,7 +27,7 @@ int main() { std::map options = { { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, + { "webdav_username", "{webdav_username}" }, { "webdav_password", "{webdav_password}" } }; diff --git a/examples/client/move.cpp b/examples/client/move.cpp index abcfd0d..fd3eb3a 100644 --- a/examples/client/move.cpp +++ b/examples/client/move.cpp @@ -38,7 +38,7 @@ int main() { std::map options = { { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, + { "webdav_username", "{webdav_username}" }, { "webdav_password", "{webdav_password}" } }; diff --git a/examples/client/remove.cpp b/examples/client/remove.cpp index c7fab47..df04af7 100644 --- a/examples/client/remove.cpp +++ b/examples/client/remove.cpp @@ -27,7 +27,7 @@ int main() { std::map options = { { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, + { "webdav_username", "{webdav_username}" }, { "webdav_password", "{webdav_password}" } }; diff --git a/examples/client/size.cpp b/examples/client/size.cpp index e112de4..b09e215 100644 --- a/examples/client/size.cpp +++ b/examples/client/size.cpp @@ -27,7 +27,7 @@ int main() { std::map options = { { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_login", "{webdav_login}" }, + { "webdav_username", "{webdav_username}" }, { "webdav_password", "{webdav_password}" } }; diff --git a/examples/client/upload.cpp b/examples/client/upload.cpp index c85e489..7b1f099 100644 --- a/examples/client/upload.cpp +++ b/examples/client/upload.cpp @@ -31,7 +31,7 @@ void upload_from_file() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; @@ -57,7 +57,7 @@ void async_upload_from_file() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; @@ -83,7 +83,7 @@ void upload_from_buffer() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; @@ -109,7 +109,7 @@ void async_upload_from_buffer() /*std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; @@ -137,7 +137,7 @@ void upload_from_stream() std::map options = { {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "{webdav_login}"}, + {"webdav_username", "{webdav_username}"}, {"webdav_password", "{webdav_password}"} }; diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index dbd8186..c470cfd 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -56,10 +56,10 @@ namespace WebDAV /// /// \param[in] webdav_hostname /// \param[in] webdav_root - /// \param[in] webdav_login + /// \param[in] webdav_username /// \param[in] webdav_password /// \param[in] proxy_hostname - /// \param[in] proxy_login + /// \param[in] proxy_username /// \param[in] proxy_password /// \param[in] cert_path /// \param[in] key_path diff --git a/sources/client.cpp b/sources/client.cpp index 40ab301..7086079 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -50,11 +50,11 @@ namespace WebDAV std::string webdav_hostname; std::string webdav_root; - std::string webdav_login; + std::string webdav_username; std::string webdav_password; std::string proxy_hostname; - std::string proxy_login; + std::string proxy_username; std::string proxy_password; std::string cert_path; @@ -118,11 +118,11 @@ namespace WebDAV { this->webdav_hostname = get(options, "webdav_hostname"); this->webdav_root = get(options, "webdav_root"); - this->webdav_login = get(options, "webdav_login"); + this->webdav_username = get(options, "webdav_username"); this->webdav_password = get(options, "webdav_password"); this->proxy_hostname = get(options, "proxy_hostname"); - this->proxy_login = get(options, "proxy_login"); + this->proxy_username = get(options, "proxy_username"); this->proxy_password = get(options, "proxy_password"); this->cert_path = get(options, "cert_path"); @@ -144,10 +144,10 @@ namespace WebDAV { { "webdav_hostname", this->webdav_hostname }, { "webdav_root", this->webdav_root }, - { "webdav_login", this->webdav_login }, + { "webdav_username", this->webdav_username }, { "webdav_password", this->webdav_password }, { "proxy_hostname", this->proxy_hostname }, - { "proxy_login", this->proxy_login }, + { "proxy_username", this->proxy_username }, { "proxy_password", this->proxy_password }, { "cert_path", this->cert_path }, { "key_path", this->key_path }, diff --git a/sources/request.cpp b/sources/request.cpp index 5d536b2..10a3939 100644 --- a/sources/request.cpp +++ b/sources/request.cpp @@ -35,11 +35,11 @@ namespace WebDAV Request::Request(dict_t&& options_) : options(options_) { auto webdav_hostname = get(options, "webdav_hostname"); - auto webdav_login = get(options, "webdav_login"); + auto webdav_username = get(options, "webdav_username"); auto webdav_password = get(options, "webdav_password"); auto proxy_hostname = get(options, "proxy_hostname"); - auto proxy_login = get(options, "proxy_login"); + auto proxy_username = get(options, "proxy_username"); auto proxy_password = get(options, "proxy_password"); auto cert_path = get(options, "cert_path"); @@ -66,7 +66,7 @@ namespace WebDAV this->set(CURLOPT_URL, (char *)webdav_hostname.c_str()); this->set(CURLOPT_HTTPAUTH, (int)CURLAUTH_BASIC); - auto token = webdav_login + ":" + webdav_password; + auto token = webdav_username + ":" + webdav_password; this->set(CURLOPT_USERPWD, (char *)token.c_str()); if (!this->proxy_enabled()) return; @@ -74,15 +74,15 @@ namespace WebDAV this->set(CURLOPT_PROXY, (char *)proxy_hostname.c_str()); this->set(CURLOPT_PROXYAUTH, (int)CURLAUTH_BASIC); - if (proxy_login.empty()) return; + if (proxy_username.empty()) return; if (proxy_password.empty()) { - this->set(CURLOPT_PROXYUSERNAME, (char *)proxy_login.c_str()); + this->set(CURLOPT_PROXYUSERNAME, (char *)proxy_username.c_str()); } else { - token = proxy_login + ":" + proxy_password; + token = proxy_username + ":" + proxy_password; this->set(CURLOPT_PROXYUSERPWD, (char *)token.c_str()); } } @@ -107,13 +107,13 @@ namespace WebDAV bool Request::proxy_enabled() const noexcept { auto proxy_hostname = get(options, "proxy_hostname"); - auto proxy_login = get(options, "proxy_login"); + auto proxy_username = get(options, "proxy_username"); auto proxy_password = get(options, "proxy_password"); bool proxy_hostname_presented = !proxy_hostname.empty(); if (!proxy_hostname_presented) return false; - bool proxy_login_presented = !proxy_login.empty(); + bool proxy_username_presented = !proxy_username.empty(); bool proxy_password_presented = !proxy_password.empty(); - if (proxy_password_presented && !proxy_login_presented) return false; + if (proxy_password_presented && !proxy_username_presented) return false; return true; } diff --git a/tests/fixture.cpp b/tests/fixture.cpp index 75f7184..383da36 100644 --- a/tests/fixture.cpp +++ b/tests/fixture.cpp @@ -81,7 +81,7 @@ namespace fixture std::map options = { {"webdav_hostname", hostname_ptr}, - {"webdav_login", username_ptr}, + {"webdav_username", username_ptr}, {"webdav_password", password_ptr} }; @@ -97,7 +97,7 @@ namespace fixture options["proxy_hostname"] = proxy_hostname_ptr; } if (proxy_username_ptr != nullptr) { - options["proxy_login"] = proxy_username_ptr; + options["proxy_username"] = proxy_username_ptr; } if (proxy_password_ptr != nullptr && proxy_username_ptr != nullptr) { options["proxy_password"] = proxy_password_ptr; From 7a24da51f2e89283f2c25f5b89877390c916d7c5 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 19:58:38 +0300 Subject: [PATCH 041/133] updating docs --- docs/doxygen.conf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/doxygen.conf b/docs/doxygen.conf index 588138f..c1ae0b0 100644 --- a/docs/doxygen.conf +++ b/docs/doxygen.conf @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "webdavclient" +PROJECT_NAME = "WebDAV Client" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = +OUTPUT_DIRECTORY = docs # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -743,7 +743,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT = ../README.md ../include/webdav +INPUT = README.md include # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -811,7 +811,7 @@ EXCLUDE_SYMBOLS = # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = ../examples +EXAMPLE_PATH = examples # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -1917,7 +1917,7 @@ SEARCH_INCLUDES = YES # preprocessor. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = ../examples +INCLUDE_PATH = examples # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the From 060492f14c508067de9f25491fe010e7656a8319 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 20:08:02 +0300 Subject: [PATCH 042/133] added documentation [skip ci] --- docs/doxygen.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/doxygen.conf b/docs/doxygen.conf index c1ae0b0..67c67ca 100644 --- a/docs/doxygen.conf +++ b/docs/doxygen.conf @@ -743,7 +743,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT = README.md include +INPUT = README.md include/webdav # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses From bafdd97452e353d162e26aae3a6abcbb2b12e202 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 20:31:01 +0300 Subject: [PATCH 043/133] added documentation --- docs/doxygen.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/doxygen.conf b/docs/doxygen.conf index 67c67ca..4cbc510 100644 --- a/docs/doxygen.conf +++ b/docs/doxygen.conf @@ -398,7 +398,7 @@ LOOKUP_CACHE_SIZE = 0 # normally produced when WARNINGS is set to YES. # The default value is: NO. -EXTRACT_ALL = NO +EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class will # be included in the documentation. @@ -487,7 +487,7 @@ INTERNAL_DOCS = NO # and Mac users are advised to set this option to NO. # The default value is: system dependent. -CASE_SENSE_NAMES = YES +CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES the @@ -1779,7 +1779,7 @@ MAN_LINKS = NO # captures the structure of the code including all documentation. # The default value is: NO. -GENERATE_XML = NO +GENERATE_XML = YES # The XML_OUTPUT tag is used to specify where the XML pages will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -1808,7 +1808,7 @@ XML_DTD = # The default value is: YES. # This tag requires that the tag GENERATE_XML is set to YES. -XML_PROGRAMLISTING = YES +XML_PROGRAMLISTING = NO #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output From 1263b8f86da8a40e8158507016f6802b3155395b Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 20:53:52 +0300 Subject: [PATCH 044/133] Update appveyor.yml [skip travis] --- appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index d854cc0..ee2ede4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -38,6 +38,9 @@ before_build: - ps: $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS")) - call "%VSCOMNTOOLS%\..\..\VC\vcvarsall.bat" %VCVARS_PLATFORM% +cache: +- 'C:\.hunter' + build_script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release - cmake --build _builds From 7f3d93a738915447826366cba4b017f101e863ad Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 21:23:02 +0300 Subject: [PATCH 045/133] remove deprecated code using --- sources/client.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/sources/client.cpp b/sources/client.cpp index 7086079..89a9c45 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -457,11 +457,11 @@ namespace WebDAV document.load_buffer(data.buffer, (size_t)data.size); - pugi::xml_node multistatus = document.select_single_node("*[local-name()='multistatus']").node(); - pugi::xml_node response = multistatus.select_single_node("*[local-name()='response']").node(); - pugi::xml_node propstat = response.select_single_node("*[local-name()='propstat']").node(); - prop = propstat.select_single_node("*[local-name()='prop']").node(); - pugi::xml_node quota_available_bytes = prop.select_single_node("*[local-name()='quota-available-bytes']").node(); + pugi::xml_node multistatus = document.select_node("*[local-name()='multistatus']").node(); + pugi::xml_node response = multistatus.select_node("*[local-name()='response']").node(); + pugi::xml_node propstat = response.select_node("*[local-name()='propstat']").node(); + prop = propstat.select_node("*[local-name()='prop']").node(); + pugi::xml_node quota_available_bytes = prop.select_node("*[local-name()='quota-available-bytes']").node(); std::string free_size_text = quota_available_bytes.first_child().value(); auto free_size = atol(free_size_text.c_str()); @@ -533,24 +533,24 @@ namespace WebDAV #ifdef WDC_VERBOSE document.save(std::cout); #endif - auto multistatus = document.select_single_node("*[local-name()='multistatus']").node(); + auto multistatus = document.select_node("*[local-name()='multistatus']").node(); auto responses = multistatus.select_nodes("*[local-name()='response']"); for (auto response : responses) { - pugi::xml_node href = response.node().select_single_node("*[local-name()='href']").node(); + pugi::xml_node href = response.node().select_node("*[local-name()='href']").node(); std::string encode_file_name = href.first_child().value(); std::string resource_path = curl_unescape(encode_file_name.c_str(), (int)encode_file_name.length()); auto target_path = target_urn.path(); auto target_path_without_sep = std::string(target_path, 0, target_path.rfind("/") + 1); auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind("/") + 1); if (resource_path_without_sep.compare(target_path_without_sep) == 0) { - auto propstat = response.node().select_single_node("*[local-name()='propstat']").node(); - auto prop = propstat.select_single_node("*[local-name()='prop']").node(); - auto creation_date = prop.select_single_node("*[local-name()='creationdate']").node(); - auto display_name = prop.select_single_node("*[local-name()='displayname']").node(); - auto content_length = prop.select_single_node("*[local-name()='getcontentlength']").node(); - auto modified_date = prop.select_single_node("*[local-name()='getlastmodified']").node(); - auto resource_type = prop.select_single_node("*[local-name()='resourcetype']").node(); + auto propstat = response.node().select_node("*[local-name()='propstat']").node(); + auto prop = propstat.select_node("*[local-name()='prop']").node(); + auto creation_date = prop.select_node("*[local-name()='creationdate']").node(); + auto display_name = prop.select_node("*[local-name()='displayname']").node(); + auto content_length = prop.select_node("*[local-name()='getcontentlength']").node(); + auto modified_date = prop.select_node("*[local-name()='getlastmodified']").node(); + auto resource_type = prop.select_node("*[local-name()='resourcetype']").node(); dict_t information = { { "created", creation_date.first_child().value() }, @@ -616,11 +616,11 @@ namespace WebDAV pugi::xml_document document; document.load_buffer(data.buffer, (size_t)data.size); - auto multistatus = document.select_single_node("*[local-name()='multistatus']").node(); + auto multistatus = document.select_node("*[local-name()='multistatus']").node(); auto responses = multistatus.select_nodes("*[local-name()='response']"); for (auto response : responses) { - pugi::xml_node href = response.node().select_single_node("*[local-name()='href']").node(); + pugi::xml_node href = response.node().select_node("*[local-name()='href']").node(); std::string encode_file_name = href.first_child().value(); std::string resource_path = curl_unescape(encode_file_name.c_str(), (int)encode_file_name.length()); auto target_path = target_urn.path(); From 8419213e488d53aa4e9190243b006fe7c6896a61 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 21:24:47 +0300 Subject: [PATCH 046/133] move catch into hunter package --- tests/catch.hpp | 10525 ------------------------------------------- tests/check.cpp | 5 +- tests/clean.cpp | 4 +- tests/download.cpp | 5 +- tests/fixture.hpp | 5 - tests/list.cpp | 5 +- tests/main.cpp | 2 +- tests/upload.cpp | 5 +- 8 files changed, 11 insertions(+), 10545 deletions(-) delete mode 100644 tests/catch.hpp diff --git a/tests/catch.hpp b/tests/catch.hpp deleted file mode 100644 index b3ef370..0000000 --- a/tests/catch.hpp +++ /dev/null @@ -1,10525 +0,0 @@ -/* - * Catch v1.5.7 - * Generated: 2016-09-27 10:45:46.824849 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under 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) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - -#define TWOBLUECUBES_CATCH_HPP_INCLUDED - -#ifdef __clang__ -# pragma clang system_header -#elif defined __GNUC__ -# pragma GCC system_header -#endif - -// #included from: internal/catch_suppress_warnings.h - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(push) -# pragma warning(disable: 161 1682) -# else // __ICC -# pragma clang diagnostic ignored "-Wglobal-constructors" -# pragma clang diagnostic ignored "-Wvariadic-macros" -# pragma clang diagnostic ignored "-Wc99-extensions" -# pragma clang diagnostic ignored "-Wunused-variable" -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wpadded" -# pragma clang diagnostic ignored "-Wc++98-compat" -# pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -# pragma clang diagnostic ignored "-Wswitch-enum" -# pragma clang diagnostic ignored "-Wcovered-switch-default" -# endif -#elif defined __GNUC__ -# pragma GCC diagnostic ignored "-Wvariadic-macros" -# pragma GCC diagnostic ignored "-Wunused-variable" -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wpadded" -#endif -#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) -# define CATCH_IMPL -#endif - -#ifdef CATCH_IMPL -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// #included from: internal/catch_notimplemented_exception.h -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED - -// #included from: catch_common.h -#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED - -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#ifdef CATCH_CONFIG_COUNTER -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) -#else -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) -#endif - -#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr -#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) - -#include -#include -#include - -// #included from: catch_compiler_capabilities.h -#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED - -// Detect a number of compiler features - mostly C++11/14 conformance - by compiler -// The following features are defined: -// -// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported? -// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported? -// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods -// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported? -// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported -// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported? -// CATCH_CONFIG_CPP11_OVERRIDE : is override supported? -// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) - -// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported? - -// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? -// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? -// **************** -// Note to maintainers: if new toggles are added please document them -// in configuration.md, too -// **************** - -// In general each macro has a _NO_ form -// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11 - -#ifdef __cplusplus - -# if __cplusplus >= 201103L -# define CATCH_CPP11_OR_GREATER -# endif - -# if __cplusplus >= 201402L -# define CATCH_CPP14_OR_GREATER -# endif - -#endif - -#ifdef __clang__ - -# if __has_feature(cxx_nullptr) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# if __has_feature(cxx_noexcept) -# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# endif - -# if defined(CATCH_CPP11_OR_GREATER) -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) -# endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// Borland -#ifdef __BORLANDC__ - -#endif // __BORLANDC__ - -//////////////////////////////////////////////////////////////////////////////// -// EDG -#ifdef __EDG_VERSION__ - -#endif // __EDG_VERSION__ - -//////////////////////////////////////////////////////////////////////////////// -// Digital Mars -#ifdef __DMC__ - -#endif // __DMC__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) && defined(CATCH_CPP11_OR_GREATER) -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "GCC diagnostic ignored \"-Wparentheses\"" ) -# endif - -// - otherwise more recent versions define __cplusplus >= 201103L -// and will get picked up below - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1600) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) -#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// - -// Use variadic macros if the compiler supports them -#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ - ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ - ( defined __GNUC__ && __GNUC__ >= 3 ) || \ - ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) - -#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS - -#endif - -// Use __COUNTER__ if the compiler supports it -#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \ - ( defined __GNUC__ && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 ) || \ - ( defined __clang__ && __clang_major__ >= 3 ) - -#define CATCH_INTERNAL_CONFIG_COUNTER - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// catch all support for C++11 -#if defined(CATCH_CPP11_OR_GREATER) - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) -# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -# define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM -# define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM -# endif - -# ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE -# define CATCH_INTERNAL_CONFIG_CPP11_TUPLE -# endif - -# ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS -# define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS -# endif - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) -# define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG -# endif - -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) -# define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE -# endif -# if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) -# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -# endif - -#endif // __cplusplus >= 201103L - -// Now set the actual defines based on the above + anything the user has configured -#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_NULLPTR -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_NOEXCEPT -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_GENERATED_METHODS -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_IS_ENUM -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_TUPLE -#endif -#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS) -# define CATCH_CONFIG_VARIADIC_MACROS -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_LONG_LONG -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_OVERRIDE -#endif -#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11) -# define CATCH_CONFIG_CPP11_UNIQUE_PTR -#endif -#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) -# define CATCH_CONFIG_COUNTER -#endif - -#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS -#endif - -// noexcept support: -#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) -# define CATCH_NOEXCEPT noexcept -# define CATCH_NOEXCEPT_IS(x) noexcept(x) -#else -# define CATCH_NOEXCEPT throw() -# define CATCH_NOEXCEPT_IS(x) -#endif - -// nullptr support -#ifdef CATCH_CONFIG_CPP11_NULLPTR -# define CATCH_NULL nullptr -#else -# define CATCH_NULL NULL -#endif - -// override support -#ifdef CATCH_CONFIG_CPP11_OVERRIDE -# define CATCH_OVERRIDE override -#else -# define CATCH_OVERRIDE -#endif - -// unique_ptr support -#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR -# define CATCH_AUTO_PTR( T ) std::unique_ptr -#else -# define CATCH_AUTO_PTR( T ) std::auto_ptr -#endif - -namespace Catch { - - struct IConfig; - - struct CaseSensitive { enum Choice { - Yes, - No - }; }; - - class NonCopyable { -#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - NonCopyable( NonCopyable const& ) = delete; - NonCopyable( NonCopyable && ) = delete; - NonCopyable& operator = ( NonCopyable const& ) = delete; - NonCopyable& operator = ( NonCopyable && ) = delete; -#else - NonCopyable( NonCopyable const& info ); - NonCopyable& operator = ( NonCopyable const& ); -#endif - - protected: - NonCopyable() {} - virtual ~NonCopyable(); - }; - - class SafeBool { - public: - typedef void (SafeBool::*type)() const; - - static type makeSafe( bool value ) { - return value ? &SafeBool::trueValue : 0; - } - private: - void trueValue() const {} - }; - - template - inline void deleteAll( ContainerT& container ) { - typename ContainerT::const_iterator it = container.begin(); - typename ContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete *it; - } - template - inline void deleteAllValues( AssociativeContainerT& container ) { - typename AssociativeContainerT::const_iterator it = container.begin(); - typename AssociativeContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete it->second; - } - - bool startsWith( std::string const& s, std::string const& prefix ); - bool endsWith( std::string const& s, std::string const& suffix ); - bool contains( std::string const& s, std::string const& infix ); - void toLowerInPlace( std::string& s ); - std::string toLower( std::string const& s ); - std::string trim( std::string const& str ); - bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); - - struct pluralise { - pluralise( std::size_t count, std::string const& label ); - - friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); - - std::size_t m_count; - std::string m_label; - }; - - struct SourceLineInfo { - - SourceLineInfo(); - SourceLineInfo( char const* _file, std::size_t _line ); - SourceLineInfo( SourceLineInfo const& other ); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - SourceLineInfo( SourceLineInfo && ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo& operator = ( SourceLineInfo && ) = default; -# endif - bool empty() const; - bool operator == ( SourceLineInfo const& other ) const; - bool operator < ( SourceLineInfo const& other ) const; - - std::string file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // This is just here to avoid compiler warnings with macro constants and boolean literals - inline bool isTrue( bool value ){ return value; } - inline bool alwaysTrue() { return true; } - inline bool alwaysFalse() { return false; } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); - - void seedRng( IConfig const& config ); - unsigned int rngSeed(); - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() { - return std::string(); - } - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) -#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); - -#include - -namespace Catch { - - class NotImplementedException : public std::exception - { - public: - NotImplementedException( SourceLineInfo const& lineInfo ); - NotImplementedException( NotImplementedException const& ) {} - - virtual ~NotImplementedException() CATCH_NOEXCEPT {} - - virtual const char* what() const CATCH_NOEXCEPT; - - private: - std::string m_what; - SourceLineInfo m_lineInfo; - }; - -} // end namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) - -// #included from: internal/catch_context.h -#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED - -// #included from: catch_interfaces_generators.h -#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED - -#include - -namespace Catch { - - struct IGeneratorInfo { - virtual ~IGeneratorInfo(); - virtual bool moveNext() = 0; - virtual std::size_t getCurrentIndex() const = 0; - }; - - struct IGeneratorsForTest { - virtual ~IGeneratorsForTest(); - - virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; - virtual bool moveNext() = 0; - }; - - IGeneratorsForTest* createGeneratorsForTest(); - -} // end namespace Catch - -// #included from: catch_ptr.hpp -#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - // An intrusive reference counting smart pointer. - // T must implement addRef() and release() methods - // typically implementing the IShared interface - template - class Ptr { - public: - Ptr() : m_p( CATCH_NULL ){} - Ptr( T* p ) : m_p( p ){ - if( m_p ) - m_p->addRef(); - } - Ptr( Ptr const& other ) : m_p( other.m_p ){ - if( m_p ) - m_p->addRef(); - } - ~Ptr(){ - if( m_p ) - m_p->release(); - } - void reset() { - if( m_p ) - m_p->release(); - m_p = CATCH_NULL; - } - Ptr& operator = ( T* p ){ - Ptr temp( p ); - swap( temp ); - return *this; - } - Ptr& operator = ( Ptr const& other ){ - Ptr temp( other ); - swap( temp ); - return *this; - } - void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } - T* get() const{ return m_p; } - T& operator*() const { return *m_p; } - T* operator->() const { return m_p; } - bool operator !() const { return m_p == CATCH_NULL; } - operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); } - - private: - T* m_p; - }; - - struct IShared : NonCopyable { - virtual ~IShared(); - virtual void addRef() const = 0; - virtual void release() const = 0; - }; - - template - struct SharedImpl : T { - - SharedImpl() : m_rc( 0 ){} - - virtual void addRef() const { - ++m_rc; - } - virtual void release() const { - if( --m_rc == 0 ) - delete this; - } - - mutable unsigned int m_rc; - }; - -} // end namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#include -#include -#include - -namespace Catch { - - class TestCase; - class Stream; - struct IResultCapture; - struct IRunner; - struct IGeneratorsForTest; - struct IConfig; - - struct IContext - { - virtual ~IContext(); - - virtual IResultCapture* getResultCapture() = 0; - virtual IRunner* getRunner() = 0; - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; - virtual bool advanceGeneratorsForCurrentTest() = 0; - virtual Ptr getConfig() const = 0; - }; - - struct IMutableContext : IContext - { - virtual ~IMutableContext(); - virtual void setResultCapture( IResultCapture* resultCapture ) = 0; - virtual void setRunner( IRunner* runner ) = 0; - virtual void setConfig( Ptr const& config ) = 0; - }; - - IContext& getCurrentContext(); - IMutableContext& getCurrentMutableContext(); - void cleanUpContext(); - Stream createStream( std::string const& streamName ); - -} - -// #included from: internal/catch_test_registry.hpp -#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED - -// #included from: catch_interfaces_testcase.h -#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED - -#include - -namespace Catch { - - class TestSpec; - - struct ITestCase : IShared { - virtual void invoke () const = 0; - protected: - virtual ~ITestCase(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; - }; - - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); - std::vector const& getAllTestCasesSorted( IConfig const& config ); - -} - -namespace Catch { - -template -class MethodTestCase : public SharedImpl { - -public: - MethodTestCase( void (C::*method)() ) : m_method( method ) {} - - virtual void invoke() const { - C obj; - (obj.*m_method)(); - } - -private: - virtual ~MethodTestCase() {} - - void (C::*m_method)(); -}; - -typedef void(*TestFunction)(); - -struct NameAndDesc { - NameAndDesc( const char* _name = "", const char* _description= "" ) - : name( _name ), description( _description ) - {} - - const char* name; - const char* description; -}; - -void registerTestCase - ( ITestCase* testCase, - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ); - -struct AutoReg { - - AutoReg - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - - template - AutoReg - ( void (C::*method)(), - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - registerTestCase - ( new MethodTestCase( method ), - className, - nameAndDesc, - lineInfo ); - } - - ~AutoReg(); - -private: - AutoReg( AutoReg const& ); - void operator= ( AutoReg const& ); -}; - -void registerTestCaseFunction - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ - static void TestName(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ - static void TestName() - #define INTERNAL_CATCH_TESTCASE( ... ) \ - INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ - namespace{ \ - struct TestName : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void TestName::test() - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ - INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ - Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); - -#else - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \ - static void TestName(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - static void TestName() - #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ - namespace{ \ - struct TestCaseName : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void TestCaseName::test() - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ - INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc ) - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \ - Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); -#endif - -// #included from: internal/catch_capture.hpp -#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED - -// #included from: catch_result_builder.h -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED - -// #included from: catch_result_type.h -#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED - -namespace Catch { - - // ResultWas::OfType enum - struct ResultWas { enum OfType { - Unknown = -1, - Ok = 0, - Info = 1, - Warning = 2, - - FailureBit = 0x10, - - ExpressionFailed = FailureBit | 1, - ExplicitFailure = FailureBit | 2, - - Exception = 0x100 | FailureBit, - - ThrewException = Exception | 1, - DidntThrowException = Exception | 2, - - FatalErrorCondition = 0x200 | FailureBit - - }; }; - - inline bool isOk( ResultWas::OfType resultType ) { - return ( resultType & ResultWas::FailureBit ) == 0; - } - inline bool isJustInfo( int flags ) { - return flags == ResultWas::Info; - } - - // ResultDisposition::Flags enum - struct ResultDisposition { enum Flags { - Normal = 0x01, - - ContinueOnFailure = 0x02, // Failures fail test, but execution continues - FalseTest = 0x04, // Prefix expression with ! - SuppressFail = 0x08 // Failures are reported but do not fail the test - }; }; - - inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { - return static_cast( static_cast( lhs ) | static_cast( rhs ) ); - } - - inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } - inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } - inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } - -} // end namespace Catch - -// #included from: catch_assertionresult.h -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED - -#include - -namespace Catch { - - struct AssertionInfo - { - AssertionInfo() {} - AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ); - - std::string macroName; - SourceLineInfo lineInfo; - std::string capturedExpression; - ResultDisposition::Flags resultDisposition; - }; - - struct AssertionResultData - { - AssertionResultData() : resultType( ResultWas::Unknown ) {} - - std::string reconstructedExpression; - std::string message; - ResultWas::OfType resultType; - }; - - class AssertionResult { - public: - AssertionResult(); - AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); - ~AssertionResult(); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - AssertionResult( AssertionResult const& ) = default; - AssertionResult( AssertionResult && ) = default; - AssertionResult& operator = ( AssertionResult const& ) = default; - AssertionResult& operator = ( AssertionResult && ) = default; -# endif - - bool isOk() const; - bool succeeded() const; - ResultWas::OfType getResultType() const; - bool hasExpression() const; - bool hasMessage() const; - std::string getExpression() const; - std::string getExpressionInMacro() const; - bool hasExpandedExpression() const; - std::string getExpandedExpression() const; - std::string getMessage() const; - SourceLineInfo getSourceInfo() const; - std::string getTestMacroName() const; - - protected: - AssertionInfo m_info; - AssertionResultData m_resultData; - }; - -} // end namespace Catch - -// #included from: catch_matchers.hpp -#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED - -namespace Catch { -namespace Matchers { - namespace Impl { - - namespace Generic { - template class AllOf; - template class AnyOf; - template class Not; - } - - template - struct Matcher : SharedImpl - { - typedef ExpressionT ExpressionType; - - virtual ~Matcher() {} - virtual Ptr clone() const = 0; - virtual bool match( ExpressionT const& expr ) const = 0; - virtual std::string toString() const = 0; - - Generic::AllOf operator && ( Matcher const& other ) const; - Generic::AnyOf operator || ( Matcher const& other ) const; - Generic::Not operator ! () const; - }; - - template - struct MatcherImpl : Matcher { - - virtual Ptr > clone() const { - return Ptr >( new DerivedT( static_cast( *this ) ) ); - } - }; - - namespace Generic { - template - class Not : public MatcherImpl, ExpressionT> { - public: - explicit Not( Matcher const& matcher ) : m_matcher(matcher.clone()) {} - Not( Not const& other ) : m_matcher( other.m_matcher ) {} - - virtual bool match( ExpressionT const& expr ) const CATCH_OVERRIDE { - return !m_matcher->match( expr ); - } - - virtual std::string toString() const CATCH_OVERRIDE { - return "not " + m_matcher->toString(); - } - private: - Ptr< Matcher > m_matcher; - }; - - template - class AllOf : public MatcherImpl, ExpressionT> { - public: - - AllOf() {} - AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} - - AllOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( !m_matchers[i]->match( expr ) ) - return false; - return true; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " and "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - AllOf operator && ( Matcher const& other ) const { - AllOf allOfExpr( *this ); - allOfExpr.add( other ); - return allOfExpr; - } - - private: - std::vector > > m_matchers; - }; - - template - class AnyOf : public MatcherImpl, ExpressionT> { - public: - - AnyOf() {} - AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} - - AnyOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( m_matchers[i]->match( expr ) ) - return true; - return false; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " or "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - AnyOf operator || ( Matcher const& other ) const { - AnyOf anyOfExpr( *this ); - anyOfExpr.add( other ); - return anyOfExpr; - } - - private: - std::vector > > m_matchers; - }; - - } // namespace Generic - - template - Generic::AllOf Matcher::operator && ( Matcher const& other ) const { - Generic::AllOf allOfExpr; - allOfExpr.add( *this ); - allOfExpr.add( other ); - return allOfExpr; - } - - template - Generic::AnyOf Matcher::operator || ( Matcher const& other ) const { - Generic::AnyOf anyOfExpr; - anyOfExpr.add( *this ); - anyOfExpr.add( other ); - return anyOfExpr; - } - - template - Generic::Not Matcher::operator ! () const { - return Generic::Not( *this ); - } - - namespace StdString { - - inline std::string makeString( std::string const& str ) { return str; } - inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } - - struct CasedString - { - CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_str( adjustString( str ) ) - {} - std::string adjustString( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No - ? toLower( str ) - : str; - - } - std::string toStringSuffix() const - { - return m_caseSensitivity == CaseSensitive::No - ? " (case insensitive)" - : ""; - } - CaseSensitive::Choice m_caseSensitivity; - std::string m_str; - }; - - struct Equals : MatcherImpl { - Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) - : m_data( str, caseSensitivity ) - {} - Equals( Equals const& other ) : m_data( other.m_data ){} - - virtual ~Equals(); - - virtual bool match( std::string const& expr ) const { - return m_data.m_str == m_data.adjustString( expr );; - } - virtual std::string toString() const { - return "equals: \"" + m_data.m_str + "\"" + m_data.toStringSuffix(); - } - - CasedString m_data; - }; - - struct Contains : MatcherImpl { - Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) - : m_data( substr, caseSensitivity ){} - Contains( Contains const& other ) : m_data( other.m_data ){} - - virtual ~Contains(); - - virtual bool match( std::string const& expr ) const { - return m_data.adjustString( expr ).find( m_data.m_str ) != std::string::npos; - } - virtual std::string toString() const { - return "contains: \"" + m_data.m_str + "\"" + m_data.toStringSuffix(); - } - - CasedString m_data; - }; - - struct StartsWith : MatcherImpl { - StartsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) - : m_data( substr, caseSensitivity ){} - - StartsWith( StartsWith const& other ) : m_data( other.m_data ){} - - virtual ~StartsWith(); - - virtual bool match( std::string const& expr ) const { - return startsWith( m_data.adjustString( expr ), m_data.m_str ); - } - virtual std::string toString() const { - return "starts with: \"" + m_data.m_str + "\"" + m_data.toStringSuffix(); - } - - CasedString m_data; - }; - - struct EndsWith : MatcherImpl { - EndsWith( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) - : m_data( substr, caseSensitivity ){} - EndsWith( EndsWith const& other ) : m_data( other.m_data ){} - - virtual ~EndsWith(); - - virtual bool match( std::string const& expr ) const { - return endsWith( m_data.adjustString( expr ), m_data.m_str ); - } - virtual std::string toString() const { - return "ends with: \"" + m_data.m_str + "\"" + m_data.toStringSuffix(); - } - - CasedString m_data; - }; - } // namespace StdString - } // namespace Impl - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - template - inline Impl::Generic::Not Not( Impl::Matcher const& m ) { - return Impl::Generic::Not( m ); - } - - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ).add( m3 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ).add( m3 ); - } - - inline Impl::StdString::Equals Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { - return Impl::StdString::Equals( str, caseSensitivity ); - } - inline Impl::StdString::Equals Equals( const char* str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { - return Impl::StdString::Equals( Impl::StdString::makeString( str ), caseSensitivity ); - } - inline Impl::StdString::Contains Contains( std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { - return Impl::StdString::Contains( substr, caseSensitivity ); - } - inline Impl::StdString::Contains Contains( const char* substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ) { - return Impl::StdString::Contains( Impl::StdString::makeString( substr ), caseSensitivity ); - } - inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { - return Impl::StdString::StartsWith( substr ); - } - inline Impl::StdString::StartsWith StartsWith( const char* substr ) { - return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { - return Impl::StdString::EndsWith( substr ); - } - inline Impl::StdString::EndsWith EndsWith( const char* substr ) { - return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); - } - -} // namespace Matchers - -using namespace Matchers; - -} // namespace Catch - -namespace Catch { - - struct TestFailureException{}; - - template class ExpressionLhs; - - struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; - - struct CopyableStream { - CopyableStream() {} - CopyableStream( CopyableStream const& other ) { - oss << other.oss.str(); - } - CopyableStream& operator=( CopyableStream const& other ) { - oss.str(""); - oss << other.oss.str(); - return *this; - } - std::ostringstream oss; - }; - - class ResultBuilder { - public: - ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition, - char const* secondArg = "" ); - - template - ExpressionLhs operator <= ( T const& operand ); - ExpressionLhs operator <= ( bool value ); - - template - ResultBuilder& operator << ( T const& value ) { - m_stream.oss << value; - return *this; - } - - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - - ResultBuilder& setResultType( ResultWas::OfType result ); - ResultBuilder& setResultType( bool result ); - ResultBuilder& setLhs( std::string const& lhs ); - ResultBuilder& setRhs( std::string const& rhs ); - ResultBuilder& setOp( std::string const& op ); - - void endExpression(); - - std::string reconstructExpression() const; - AssertionResult build() const; - - void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); - void captureResult( ResultWas::OfType resultType ); - void captureExpression(); - void captureExpectedException( std::string const& expectedMessage ); - void captureExpectedException( Matchers::Impl::Matcher const& matcher ); - void handleResult( AssertionResult const& result ); - void react(); - bool shouldDebugBreak() const; - bool allowThrows() const; - - private: - AssertionInfo m_assertionInfo; - AssertionResultData m_data; - struct ExprComponents { - ExprComponents() : testFalse( false ) {} - bool testFalse; - std::string lhs, rhs, op; - } m_exprComponents; - CopyableStream m_stream; - - bool m_shouldDebugBreak; - bool m_shouldThrow; - }; - -} // namespace Catch - -// Include after due to circular dependency: -// #included from: catch_expression_lhs.hpp -#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED - -// #included from: catch_evaluate.hpp -#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4389) // '==' : signed/unsigned mismatch -#endif - -#include - -namespace Catch { -namespace Internal { - - enum Operator { - IsEqualTo, - IsNotEqualTo, - IsLessThan, - IsGreaterThan, - IsLessThanOrEqualTo, - IsGreaterThanOrEqualTo - }; - - template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; - template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; - template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; - - template - inline T& opCast(T const& t) { return const_cast(t); } - -// nullptr_t support based on pull request #154 from Konstantin Baumann -#ifdef CATCH_CONFIG_CPP11_NULLPTR - inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } -#endif // CATCH_CONFIG_CPP11_NULLPTR - - // So the compare overloads can be operator agnostic we convey the operator as a template - // enum, which is used to specialise an Evaluator for doing the comparison. - template - class Evaluator{}; - - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs) { - return bool( opCast( lhs ) == opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) != opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) < opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) > opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) >= opCast( rhs ) ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return bool( opCast( lhs ) <= opCast( rhs ) ); - } - }; - - template - bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // This level of indirection allows us to specialise for integer types - // to avoid signed/ unsigned warnings - - // "base" overload - template - bool compare( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // unsigned X to int - template bool compare( unsigned int lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // unsigned X to long - template bool compare( unsigned int lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // int to unsigned X - template bool compare( int lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // long to unsigned X - template bool compare( long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long (when comparing against NULL) - template bool compare( long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - - // pointer to int (when comparing against NULL) - template bool compare( int lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, int rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG - // long long to unsigned X - template bool compare( long long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned long long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // unsigned long long to X - template bool compare( unsigned long long lhs, int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, long long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( unsigned long long lhs, char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long long (when comparing against NULL) - template bool compare( long long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } -#endif // CATCH_CONFIG_CPP11_LONG_LONG - -#ifdef CATCH_CONFIG_CPP11_NULLPTR - // pointer to nullptr_t (when comparing against nullptr) - template bool compare( std::nullptr_t, T* rhs ) { - return Evaluator::evaluate( nullptr, rhs ); - } - template bool compare( T* lhs, std::nullptr_t ) { - return Evaluator::evaluate( lhs, nullptr ); - } -#endif // CATCH_CONFIG_CPP11_NULLPTR - -} // end of namespace Internal -} // end of namespace Catch - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -// #included from: catch_tostring.h -#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED - -#include -#include -#include -#include -#include - -#ifdef __OBJC__ -// #included from: catch_objc_arc.hpp -#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED - -#import - -#ifdef __has_feature -#define CATCH_ARC_ENABLED __has_feature(objc_arc) -#else -#define CATCH_ARC_ENABLED 0 -#endif - -void arcSafeRelease( NSObject* obj ); -id performOptionalSelector( id obj, SEL sel ); - -#if !CATCH_ARC_ENABLED -inline void arcSafeRelease( NSObject* obj ) { - [obj release]; -} -inline id performOptionalSelector( id obj, SEL sel ) { - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; - return nil; -} -#define CATCH_UNSAFE_UNRETAINED -#define CATCH_ARC_STRONG -#else -inline void arcSafeRelease( NSObject* ){} -inline id performOptionalSelector( id obj, SEL sel ) { -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" -#endif - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - return nil; -} -#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained -#define CATCH_ARC_STRONG __strong -#endif - -#endif - -#ifdef CATCH_CONFIG_CPP11_TUPLE -#include -#endif - -#ifdef CATCH_CONFIG_CPP11_IS_ENUM -#include -#endif - -namespace Catch { - -// Why we're here. -template -std::string toString( T const& value ); - -// Built in overloads - -std::string toString( std::string const& value ); -std::string toString( std::wstring const& value ); -std::string toString( const char* const value ); -std::string toString( char* const value ); -std::string toString( const wchar_t* const value ); -std::string toString( wchar_t* const value ); -std::string toString( int value ); -std::string toString( unsigned long value ); -std::string toString( unsigned int value ); -std::string toString( const double value ); -std::string toString( const float value ); -std::string toString( bool value ); -std::string toString( char value ); -std::string toString( signed char value ); -std::string toString( unsigned char value ); - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG -std::string toString( long long value ); -std::string toString( unsigned long long value ); -#endif - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ); -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ); - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ); - std::string toString( NSObject* const& nsObject ); -#endif - -namespace Detail { - - extern const std::string unprintableString; - - struct BorgType { - template BorgType( T const& ); - }; - - struct TrueType { char sizer[1]; }; - struct FalseType { char sizer[2]; }; - - TrueType& testStreamable( std::ostream& ); - FalseType testStreamable( FalseType ); - - FalseType operator<<( std::ostream const&, BorgType const& ); - - template - struct IsStreamInsertable { - static std::ostream &s; - static T const&t; - enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; - }; - -#if defined(CATCH_CONFIG_CPP11_IS_ENUM) - template::value - > - struct EnumStringMaker - { - static std::string convert( T const& ) { return unprintableString; } - }; - - template - struct EnumStringMaker - { - static std::string convert( T const& v ) - { - return ::Catch::toString( - static_cast::type>(v) - ); - } - }; -#endif - template - struct StringMakerBase { -#if defined(CATCH_CONFIG_CPP11_IS_ENUM) - template - static std::string convert( T const& v ) - { - return EnumStringMaker::convert( v ); - } -#else - template - static std::string convert( T const& ) { return unprintableString; } -#endif - }; - - template<> - struct StringMakerBase { - template - static std::string convert( T const& _value ) { - std::ostringstream oss; - oss << _value; - return oss.str(); - } - }; - - std::string rawMemoryToString( const void *object, std::size_t size ); - - template - inline std::string rawMemoryToString( const T& object ) { - return rawMemoryToString( &object, sizeof(object) ); - } - -} // end namespace Detail - -template -struct StringMaker : - Detail::StringMakerBase::value> {}; - -template -struct StringMaker { - template - static std::string convert( U* p ) { - if( !p ) - return "NULL"; - else - return Detail::rawMemoryToString( p ); - } -}; - -template -struct StringMaker { - static std::string convert( R C::* p ) { - if( !p ) - return "NULL"; - else - return Detail::rawMemoryToString( p ); - } -}; - -namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ); -} - -//template -//struct StringMaker > { -// static std::string convert( std::vector const& v ) { -// return Detail::rangeToString( v.begin(), v.end() ); -// } -//}; - -template -std::string toString( std::vector const& v ) { - return Detail::rangeToString( v.begin(), v.end() ); -} - -#ifdef CATCH_CONFIG_CPP11_TUPLE - -// toString for tuples -namespace TupleDetail { - template< - typename Tuple, - std::size_t N = 0, - bool = (N < std::tuple_size::value) - > - struct ElementPrinter { - static void print( const Tuple& tuple, std::ostream& os ) - { - os << ( N ? ", " : " " ) - << Catch::toString(std::get(tuple)); - ElementPrinter::print(tuple,os); - } - }; - - template< - typename Tuple, - std::size_t N - > - struct ElementPrinter { - static void print( const Tuple&, std::ostream& ) {} - }; - -} - -template -struct StringMaker> { - - static std::string convert( const std::tuple& tuple ) - { - std::ostringstream os; - os << '{'; - TupleDetail::ElementPrinter>::print( tuple, os ); - os << " }"; - return os.str(); - } -}; -#endif // CATCH_CONFIG_CPP11_TUPLE - -namespace Detail { - template - std::string makeString( T const& value ) { - return StringMaker::convert( value ); - } -} // end namespace Detail - -/// \brief converts any type to a string -/// -/// The default template forwards on to ostringstream - except when an -/// ostringstream overload does not exist - in which case it attempts to detect -/// that and writes {?}. -/// Overload (not specialise) this template for custom typs that you don't want -/// to provide an ostream overload for. -template -std::string toString( T const& value ) { - return StringMaker::convert( value ); -} - - namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ) { - std::ostringstream oss; - oss << "{ "; - if( first != last ) { - oss << Catch::toString( *first ); - for( ++first ; first != last ; ++first ) - oss << ", " << Catch::toString( *first ); - } - oss << " }"; - return oss.str(); - } -} - -} // end namespace Catch - -namespace Catch { - -// Wraps the LHS of an expression and captures the operator and RHS (if any) - -// wrapping them all in a ResultBuilder object -template -class ExpressionLhs { - ExpressionLhs& operator = ( ExpressionLhs const& ); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - ExpressionLhs& operator = ( ExpressionLhs && ) = delete; -# endif - -public: - ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {} -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - ExpressionLhs( ExpressionLhs const& ) = default; - ExpressionLhs( ExpressionLhs && ) = default; -# endif - - template - ResultBuilder& operator == ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator != ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator < ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator > ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator <= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator >= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator == ( bool rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator != ( bool rhs ) { - return captureExpression( rhs ); - } - - void endExpression() { - bool value = m_lhs ? true : false; - m_rb - .setLhs( Catch::toString( value ) ) - .setResultType( value ) - .endExpression(); - } - - // Only simple binary expressions are allowed on the LHS. - // If more complex compositions are required then place the sub expression in parentheses - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - -private: - template - ResultBuilder& captureExpression( RhsT const& rhs ) { - return m_rb - .setResultType( Internal::compare( m_lhs, rhs ) ) - .setLhs( Catch::toString( m_lhs ) ) - .setRhs( Catch::toString( rhs ) ) - .setOp( Internal::OperatorTraits::getName() ); - } - -private: - ResultBuilder& m_rb; - T m_lhs; -}; - -} // end namespace Catch - - -namespace Catch { - - template - inline ExpressionLhs ResultBuilder::operator <= ( T const& operand ) { - return ExpressionLhs( *this, operand ); - } - - inline ExpressionLhs ResultBuilder::operator <= ( bool value ) { - return ExpressionLhs( *this, value ); - } - -} // namespace Catch - -// #included from: catch_message.h -#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED - -#include - -namespace Catch { - - struct MessageInfo { - MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ); - - std::string macroName; - SourceLineInfo lineInfo; - ResultWas::OfType type; - std::string message; - unsigned int sequence; - - bool operator == ( MessageInfo const& other ) const { - return sequence == other.sequence; - } - bool operator < ( MessageInfo const& other ) const { - return sequence < other.sequence; - } - private: - static unsigned int globalCount; - }; - - struct MessageBuilder { - MessageBuilder( std::string const& macroName, - SourceLineInfo const& lineInfo, - ResultWas::OfType type ) - : m_info( macroName, lineInfo, type ) - {} - - template - MessageBuilder& operator << ( T const& value ) { - m_stream << value; - return *this; - } - - MessageInfo m_info; - std::ostringstream m_stream; - }; - - class ScopedMessage { - public: - ScopedMessage( MessageBuilder const& builder ); - ScopedMessage( ScopedMessage const& other ); - ~ScopedMessage(); - - MessageInfo m_info; - }; - -} // end namespace Catch - -// #included from: catch_interfaces_capture.h -#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - class AssertionResult; - struct AssertionInfo; - struct SectionInfo; - struct SectionEndInfo; - struct MessageInfo; - class ScopedMessageBuilder; - struct Counts; - - struct IResultCapture { - - virtual ~IResultCapture(); - - virtual void assertionEnded( AssertionResult const& result ) = 0; - virtual bool sectionStarted( SectionInfo const& sectionInfo, - Counts& assertions ) = 0; - virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; - virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; - virtual void pushScopedMessage( MessageInfo const& message ) = 0; - virtual void popScopedMessage( MessageInfo const& message ) = 0; - - virtual std::string getCurrentTestName() const = 0; - virtual const AssertionResult* getLastResult() const = 0; - - virtual void handleFatalErrorCondition( std::string const& message ) = 0; - }; - - IResultCapture& getResultCapture(); -} - -// #included from: catch_debugger.h -#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED - -// #included from: catch_platform.h -#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED - -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_MAC -#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_IPHONE -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CATCH_PLATFORM_WINDOWS -#endif - -#include - -namespace Catch{ - - bool isDebuggerActive(); - void writeToDebugConsole( std::string const& text ); -} - -#ifdef CATCH_PLATFORM_MAC - - // The following code snippet based on: - // http://cocoawithlove.com/2008/03/break-into-debugger.html - #ifdef DEBUG - #if defined(__ppc64__) || defined(__ppc__) - #define CATCH_BREAK_INTO_DEBUGGER() \ - if( Catch::isDebuggerActive() ) { \ - __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ - : : : "memory","r0","r3","r4" ); \ - } - #else - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} - #endif - #endif - -#elif defined(_MSC_VER) - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) void __stdcall DebugBreak(); - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); } -#endif - -#ifndef CATCH_BREAK_INTO_DEBUGGER -#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); -#endif - -// #included from: catch_interfaces_runner.h -#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED - -namespace Catch { - class TestCase; - - struct IRunner { - virtual ~IRunner(); - virtual bool aborting() const = 0; - }; -} - -/////////////////////////////////////////////////////////////////////////////// -// In the event of a failure works out if the debugger needs to be invoked -// and/or an exception thrown and takes appropriate action. -// This needs to be done as a macro so the debugger will stop in the user -// source code rather than in Catch library code -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ - resultBuilder.react(); - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - ( __catchResult <= expr ).endExpression(); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && !!(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( !Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS( expr, resultDisposition, matcher, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( ... ) { \ - __catchResult.captureExpectedException( matcher ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( exceptionType ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#else - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << log + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_INFO( log, macroName ) \ - Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ - try { \ - std::string matcherAsString = (matcher).toString(); \ - __catchResult \ - .setLhs( Catch::toString( arg ) ) \ - .setRhs( matcherAsString == Catch::Detail::unprintableString ? #matcher : matcherAsString ) \ - .setOp( "matches" ) \ - .setResultType( (matcher).match( arg ) ); \ - __catchResult.captureExpression(); \ - } catch( ... ) { \ - __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -// #included from: internal/catch_section.h -#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED - -// #included from: catch_section_info.h -#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED - -// #included from: catch_totals.hpp -#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED - -#include - -namespace Catch { - - struct Counts { - Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} - - Counts operator - ( Counts const& other ) const { - Counts diff; - diff.passed = passed - other.passed; - diff.failed = failed - other.failed; - diff.failedButOk = failedButOk - other.failedButOk; - return diff; - } - Counts& operator += ( Counts const& other ) { - passed += other.passed; - failed += other.failed; - failedButOk += other.failedButOk; - return *this; - } - - std::size_t total() const { - return passed + failed + failedButOk; - } - bool allPassed() const { - return failed == 0 && failedButOk == 0; - } - bool allOk() const { - return failed == 0; - } - - std::size_t passed; - std::size_t failed; - std::size_t failedButOk; - }; - - struct Totals { - - Totals operator - ( Totals const& other ) const { - Totals diff; - diff.assertions = assertions - other.assertions; - diff.testCases = testCases - other.testCases; - return diff; - } - - Totals delta( Totals const& prevTotals ) const { - Totals diff = *this - prevTotals; - if( diff.assertions.failed > 0 ) - ++diff.testCases.failed; - else if( diff.assertions.failedButOk > 0 ) - ++diff.testCases.failedButOk; - else - ++diff.testCases.passed; - return diff; - } - - Totals& operator += ( Totals const& other ) { - assertions += other.assertions; - testCases += other.testCases; - return *this; - } - - Counts assertions; - Counts testCases; - }; -} - -namespace Catch { - - struct SectionInfo { - SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description = std::string() ); - - std::string name; - std::string description; - SourceLineInfo lineInfo; - }; - - struct SectionEndInfo { - SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) - : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) - {} - - SectionInfo sectionInfo; - Counts prevAssertions; - double durationInSeconds; - }; - -} // end namespace Catch - -// #included from: catch_timer.h -#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED - -#ifdef CATCH_PLATFORM_WINDOWS -typedef unsigned long long uint64_t; -#else -#include -#endif - -namespace Catch { - - class Timer { - public: - Timer() : m_ticks( 0 ) {} - void start(); - unsigned int getElapsedMicroseconds() const; - unsigned int getElapsedMilliseconds() const; - double getElapsedSeconds() const; - - private: - uint64_t m_ticks; - }; - -} // namespace Catch - -#include - -namespace Catch { - - class Section : NonCopyable { - public: - Section( SectionInfo const& info ); - ~Section(); - - // This indicates whether the section should be executed or not - operator bool() const; - - private: - SectionInfo m_info; - - std::string m_name; - Counts m_assertions; - bool m_sectionIncluded; - Timer m_timer; - }; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_SECTION( ... ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) -#else - #define INTERNAL_CATCH_SECTION( name, desc ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) -#endif - -// #included from: internal/catch_generators.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - -template -struct IGenerator { - virtual ~IGenerator() {} - virtual T getValue( std::size_t index ) const = 0; - virtual std::size_t size () const = 0; -}; - -template -class BetweenGenerator : public IGenerator { -public: - BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} - - virtual T getValue( std::size_t index ) const { - return m_from+static_cast( index ); - } - - virtual std::size_t size() const { - return static_cast( 1+m_to-m_from ); - } - -private: - - T m_from; - T m_to; -}; - -template -class ValuesGenerator : public IGenerator { -public: - ValuesGenerator(){} - - void add( T value ) { - m_values.push_back( value ); - } - - virtual T getValue( std::size_t index ) const { - return m_values[index]; - } - - virtual std::size_t size() const { - return m_values.size(); - } - -private: - std::vector m_values; -}; - -template -class CompositeGenerator { -public: - CompositeGenerator() : m_totalSize( 0 ) {} - - // *** Move semantics, similar to auto_ptr *** - CompositeGenerator( CompositeGenerator& other ) - : m_fileInfo( other.m_fileInfo ), - m_totalSize( 0 ) - { - move( other ); - } - - CompositeGenerator& setFileInfo( const char* fileInfo ) { - m_fileInfo = fileInfo; - return *this; - } - - ~CompositeGenerator() { - deleteAll( m_composed ); - } - - operator T () const { - size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); - - typename std::vector*>::const_iterator it = m_composed.begin(); - typename std::vector*>::const_iterator itEnd = m_composed.end(); - for( size_t index = 0; it != itEnd; ++it ) - { - const IGenerator* generator = *it; - if( overallIndex >= index && overallIndex < index + generator->size() ) - { - return generator->getValue( overallIndex-index ); - } - index += generator->size(); - } - CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); - return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so - } - - void add( const IGenerator* generator ) { - m_totalSize += generator->size(); - m_composed.push_back( generator ); - } - - CompositeGenerator& then( CompositeGenerator& other ) { - move( other ); - return *this; - } - - CompositeGenerator& then( T value ) { - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( value ); - add( valuesGen ); - return *this; - } - -private: - - void move( CompositeGenerator& other ) { - std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); - m_totalSize += other.m_totalSize; - other.m_composed.clear(); - } - - std::vector*> m_composed; - std::string m_fileInfo; - size_t m_totalSize; -}; - -namespace Generators -{ - template - CompositeGenerator between( T from, T to ) { - CompositeGenerator generators; - generators.add( new BetweenGenerator( from, to ) ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3 ){ - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3, T val4 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - valuesGen->add( val4 ); - generators.add( valuesGen ); - return generators; - } - -} // end namespace Generators - -using namespace Generators; - -} // end namespace Catch - -#define INTERNAL_CATCH_LINESTR2( line ) #line -#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) - -#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) - -// #included from: internal/catch_interfaces_exception.h -#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED - -#include -#include - -// #included from: catch_interfaces_registry_hub.h -#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - struct ITestCaseRegistry; - struct IExceptionTranslatorRegistry; - struct IExceptionTranslator; - struct IReporterRegistry; - struct IReporterFactory; - - struct IRegistryHub { - virtual ~IRegistryHub(); - - virtual IReporterRegistry const& getReporterRegistry() const = 0; - virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; - }; - - struct IMutableRegistryHub { - virtual ~IMutableRegistryHub(); - virtual void registerReporter( std::string const& name, Ptr const& factory ) = 0; - virtual void registerListener( Ptr const& factory ) = 0; - virtual void registerTest( TestCase const& testInfo ) = 0; - virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; - }; - - IRegistryHub& getRegistryHub(); - IMutableRegistryHub& getMutableRegistryHub(); - void cleanUp(); - std::string translateActiveException(); - -} - -namespace Catch { - - typedef std::string(*exceptionTranslateFunction)(); - - struct IExceptionTranslator; - typedef std::vector ExceptionTranslators; - - struct IExceptionTranslator { - virtual ~IExceptionTranslator(); - virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; - }; - - struct IExceptionTranslatorRegistry { - virtual ~IExceptionTranslatorRegistry(); - - virtual std::string translateActiveException() const = 0; - }; - - class ExceptionTranslatorRegistrar { - template - class ExceptionTranslator : public IExceptionTranslator { - public: - - ExceptionTranslator( std::string(*translateFunction)( T& ) ) - : m_translateFunction( translateFunction ) - {} - - virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE { - try { - if( it == itEnd ) - throw; - else - return (*it)->translate( it+1, itEnd ); - } - catch( T& ex ) { - return m_translateFunction( ex ); - } - } - - protected: - std::string(*m_translateFunction)( T& ); - }; - - public: - template - ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { - getMutableRegistryHub().registerTranslator - ( new ExceptionTranslator( translateFunction ) ); - } - }; -} - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ - static std::string translatorName( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ - static std::string translatorName( signature ) - -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) - -// #included from: internal/catch_approx.hpp -#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED - -#include -#include - -namespace Catch { -namespace Detail { - - class Approx { - public: - explicit Approx ( double value ) - : m_epsilon( std::numeric_limits::epsilon()*100 ), - m_scale( 1.0 ), - m_value( value ) - {} - - Approx( Approx const& other ) - : m_epsilon( other.m_epsilon ), - m_scale( other.m_scale ), - m_value( other.m_value ) - {} - - static Approx custom() { - return Approx( 0 ); - } - - Approx operator()( double value ) { - Approx approx( value ); - approx.epsilon( m_epsilon ); - approx.scale( m_scale ); - return approx; - } - - friend bool operator == ( double lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); - } - - friend bool operator == ( Approx const& lhs, double rhs ) { - return operator==( rhs, lhs ); - } - - friend bool operator != ( double lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - friend bool operator != ( Approx const& lhs, double rhs ) { - return !operator==( rhs, lhs ); - } - - Approx& epsilon( double newEpsilon ) { - m_epsilon = newEpsilon; - return *this; - } - - Approx& scale( double newScale ) { - m_scale = newScale; - return *this; - } - - std::string toString() const { - std::ostringstream oss; - oss << "Approx( " << Catch::toString( m_value ) << " )"; - return oss.str(); - } - - private: - double m_epsilon; - double m_scale; - double m_value; - }; -} - -template<> -inline std::string toString( Detail::Approx const& value ) { - return value.toString(); -} - -} // end namespace Catch - -// #included from: internal/catch_interfaces_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED - -// #included from: catch_tag_alias.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED - -#include - -namespace Catch { - - struct TagAlias { - TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} - - std::string tag; - SourceLineInfo lineInfo; - }; - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } -// #included from: catch_option.hpp -#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED - -namespace Catch { - - // An optional type - template - class Option { - public: - Option() : nullableValue( CATCH_NULL ) {} - Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) - {} - Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL ) - {} - - ~Option() { - reset(); - } - - Option& operator= ( Option const& _other ) { - if( &_other != this ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); - } - return *this; - } - Option& operator = ( T const& _value ) { - reset(); - nullableValue = new( storage ) T( _value ); - return *this; - } - - void reset() { - if( nullableValue ) - nullableValue->~T(); - nullableValue = CATCH_NULL; - } - - T& operator*() { return *nullableValue; } - T const& operator*() const { return *nullableValue; } - T* operator->() { return nullableValue; } - const T* operator->() const { return nullableValue; } - - T valueOr( T const& defaultValue ) const { - return nullableValue ? *nullableValue : defaultValue; - } - - bool some() const { return nullableValue != CATCH_NULL; } - bool none() const { return nullableValue == CATCH_NULL; } - - bool operator !() const { return nullableValue == CATCH_NULL; } - operator SafeBool::type() const { - return SafeBool::makeSafe( some() ); - } - - private: - T* nullableValue; - char storage[sizeof(T)]; - }; - -} // end namespace Catch - -namespace Catch { - - struct ITagAliasRegistry { - virtual ~ITagAliasRegistry(); - virtual Option find( std::string const& alias ) const = 0; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; - - static ITagAliasRegistry const& get(); - }; - -} // end namespace Catch - -// These files are included here so the single_include script doesn't put them -// in the conditionally compiled sections -// #included from: internal/catch_test_case_info.h -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED - -#include -#include - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - struct ITestCase; - - struct TestCaseInfo { - enum SpecialProperties{ - None = 0, - IsHidden = 1 << 1, - ShouldFail = 1 << 2, - MayFail = 1 << 3, - Throws = 1 << 4 - }; - - TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ); - - TestCaseInfo( TestCaseInfo const& other ); - - friend void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ); - - bool isHidden() const; - bool throws() const; - bool okToFail() const; - bool expectedToFail() const; - - std::string name; - std::string className; - std::string description; - std::set tags; - std::set lcaseTags; - std::string tagsAsString; - SourceLineInfo lineInfo; - SpecialProperties properties; - }; - - class TestCase : public TestCaseInfo { - public: - - TestCase( ITestCase* testCase, TestCaseInfo const& info ); - TestCase( TestCase const& other ); - - TestCase withName( std::string const& _newName ) const; - - void invoke() const; - - TestCaseInfo const& getTestCaseInfo() const; - - void swap( TestCase& other ); - bool operator == ( TestCase const& other ) const; - bool operator < ( TestCase const& other ) const; - TestCase& operator = ( TestCase const& other ); - - private: - Ptr test; - }; - - TestCase makeTestCase( ITestCase* testCase, - std::string const& className, - std::string const& name, - std::string const& description, - SourceLineInfo const& lineInfo ); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - - -#ifdef __OBJC__ -// #included from: internal/catch_objc.hpp -#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED - -#import - -#include - -// NB. Any general catch headers included here must be included -// in catch.hpp first to make sure they are included by the single -// header for non obj-usage - -/////////////////////////////////////////////////////////////////////////////// -// This protocol is really only here for (self) documenting purposes, since -// all its methods are optional. -@protocol OcFixture - -@optional - --(void) setUp; --(void) tearDown; - -@end - -namespace Catch { - - class OcMethod : public SharedImpl { - - public: - OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} - - virtual void invoke() const { - id obj = [[m_cls alloc] init]; - - performOptionalSelector( obj, @selector(setUp) ); - performOptionalSelector( obj, m_sel ); - performOptionalSelector( obj, @selector(tearDown) ); - - arcSafeRelease( obj ); - } - private: - virtual ~OcMethod() {} - - Class m_cls; - SEL m_sel; - }; - - namespace Detail{ - - inline std::string getAnnotation( Class cls, - std::string const& annotationName, - std::string const& testCaseName ) { - NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; - SEL sel = NSSelectorFromString( selStr ); - arcSafeRelease( selStr ); - id value = performOptionalSelector( cls, sel ); - if( value ) - return [(NSString*)value UTF8String]; - return ""; - } - } - - inline size_t registerTestMethods() { - size_t noTestMethods = 0; - int noClasses = objc_getClassList( CATCH_NULL, 0 ); - - Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); - objc_getClassList( classes, noClasses ); - - for( int c = 0; c < noClasses; c++ ) { - Class cls = classes[c]; - { - u_int count; - Method* methods = class_copyMethodList( cls, &count ); - for( u_int m = 0; m < count ; m++ ) { - SEL selector = method_getName(methods[m]); - std::string methodName = sel_getName(selector); - if( startsWith( methodName, "Catch_TestCase_" ) ) { - std::string testCaseName = methodName.substr( 15 ); - std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); - std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); - const char* className = class_getName( cls ); - - getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); - noTestMethods++; - } - } - free(methods); - } - } - return noTestMethods; - } - - namespace Matchers { - namespace Impl { - namespace NSStringMatchers { - - template - struct StringHolder : MatcherImpl{ - StringHolder( NSString* substr ) : m_substr( [substr copy] ){} - StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} - StringHolder() { - arcSafeRelease( m_substr ); - } - - NSString* m_substr; - }; - - struct Equals : StringHolder { - Equals( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str isEqualToString:m_substr]; - } - - virtual std::string toString() const { - return "equals string: " + Catch::toString( m_substr ); - } - }; - - struct Contains : StringHolder { - Contains( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location != NSNotFound; - } - - virtual std::string toString() const { - return "contains string: " + Catch::toString( m_substr ); - } - }; - - struct StartsWith : StringHolder { - StartsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == 0; - } - - virtual std::string toString() const { - return "starts with: " + Catch::toString( m_substr ); - } - }; - struct EndsWith : StringHolder { - EndsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == [str length] - [m_substr length]; - } - - virtual std::string toString() const { - return "ends with: " + Catch::toString( m_substr ); - } - }; - - } // namespace NSStringMatchers - } // namespace Impl - - inline Impl::NSStringMatchers::Equals - Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } - - inline Impl::NSStringMatchers::Contains - Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } - - inline Impl::NSStringMatchers::StartsWith - StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } - - inline Impl::NSStringMatchers::EndsWith - EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } - - } // namespace Matchers - - using namespace Matchers; - -} // namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define OC_TEST_CASE( name, desc )\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ -{\ -return @ name; \ -}\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ -{ \ -return @ desc; \ -} \ --(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) - -#endif - -#ifdef CATCH_IMPL -// #included from: internal/catch_impl.hpp -#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED - -// Collect all the implementation files together here -// These are the equivalent of what would usually be cpp files - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wweak-vtables" -#endif - -// #included from: ../catch_session.hpp -#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED - -// #included from: internal/catch_commandline.hpp -#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED - -// #included from: catch_config.hpp -#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED - -// #included from: catch_test_spec_parser.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_test_spec.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_wildcard_pattern.hpp -#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED - -namespace Catch -{ - class WildcardPattern { - enum WildcardPosition { - NoWildcard = 0, - WildcardAtStart = 1, - WildcardAtEnd = 2, - WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd - }; - - public: - - WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_wildcard( NoWildcard ), - m_pattern( adjustCase( pattern ) ) - { - if( startsWith( m_pattern, "*" ) ) { - m_pattern = m_pattern.substr( 1 ); - m_wildcard = WildcardAtStart; - } - if( endsWith( m_pattern, "*" ) ) { - m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); - m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); - } - } - virtual ~WildcardPattern(); - virtual bool matches( std::string const& str ) const { - switch( m_wildcard ) { - case NoWildcard: - return m_pattern == adjustCase( str ); - case WildcardAtStart: - return endsWith( adjustCase( str ), m_pattern ); - case WildcardAtEnd: - return startsWith( adjustCase( str ), m_pattern ); - case WildcardAtBothEnds: - return contains( adjustCase( str ), m_pattern ); - } - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunreachable-code" -#endif - throw std::logic_error( "Unknown enum" ); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - } - private: - std::string adjustCase( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; - } - CaseSensitive::Choice m_caseSensitivity; - WildcardPosition m_wildcard; - std::string m_pattern; - }; -} - -#include -#include - -namespace Catch { - - class TestSpec { - struct Pattern : SharedImpl<> { - virtual ~Pattern(); - virtual bool matches( TestCaseInfo const& testCase ) const = 0; - }; - class NamePattern : public Pattern { - public: - NamePattern( std::string const& name ) - : m_wildcardPattern( toLower( name ), CaseSensitive::No ) - {} - virtual ~NamePattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return m_wildcardPattern.matches( toLower( testCase.name ) ); - } - private: - WildcardPattern m_wildcardPattern; - }; - - class TagPattern : public Pattern { - public: - TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} - virtual ~TagPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); - } - private: - std::string m_tag; - }; - - class ExcludedPattern : public Pattern { - public: - ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} - virtual ~ExcludedPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } - private: - Ptr m_underlyingPattern; - }; - - struct Filter { - std::vector > m_patterns; - - bool matches( TestCaseInfo const& testCase ) const { - // All patterns in a filter must match for the filter to be a match - for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) { - if( !(*it)->matches( testCase ) ) - return false; - } - return true; - } - }; - - public: - bool hasFilters() const { - return !m_filters.empty(); - } - bool matches( TestCaseInfo const& testCase ) const { - // A TestSpec matches if any filter matches - for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) - if( it->matches( testCase ) ) - return true; - return false; - } - - private: - std::vector m_filters; - - friend class TestSpecParser; - }; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestSpecParser { - enum Mode{ None, Name, QuotedName, Tag }; - Mode m_mode; - bool m_exclusion; - std::size_t m_start, m_pos; - std::string m_arg; - TestSpec::Filter m_currentFilter; - TestSpec m_testSpec; - ITagAliasRegistry const* m_tagAliases; - - public: - TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} - - TestSpecParser& parse( std::string const& arg ) { - m_mode = None; - m_exclusion = false; - m_start = std::string::npos; - m_arg = m_tagAliases->expandAliases( arg ); - for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - visitChar( m_arg[m_pos] ); - if( m_mode == Name ) - addPattern(); - return *this; - } - TestSpec testSpec() { - addFilter(); - return m_testSpec; - } - private: - void visitChar( char c ) { - if( m_mode == None ) { - switch( c ) { - case ' ': return; - case '~': m_exclusion = true; return; - case '[': return startNewMode( Tag, ++m_pos ); - case '"': return startNewMode( QuotedName, ++m_pos ); - default: startNewMode( Name, m_pos ); break; - } - } - if( m_mode == Name ) { - if( c == ',' ) { - addPattern(); - addFilter(); - } - else if( c == '[' ) { - if( subString() == "exclude:" ) - m_exclusion = true; - else - addPattern(); - startNewMode( Tag, ++m_pos ); - } - } - else if( m_mode == QuotedName && c == '"' ) - addPattern(); - else if( m_mode == Tag && c == ']' ) - addPattern(); - } - void startNewMode( Mode mode, std::size_t start ) { - m_mode = mode; - m_start = start; - } - std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } - template - void addPattern() { - std::string token = subString(); - if( startsWith( token, "exclude:" ) ) { - m_exclusion = true; - token = token.substr( 8 ); - } - if( !token.empty() ) { - Ptr pattern = new T( token ); - if( m_exclusion ) - pattern = new TestSpec::ExcludedPattern( pattern ); - m_currentFilter.m_patterns.push_back( pattern ); - } - m_exclusion = false; - m_mode = None; - } - void addFilter() { - if( !m_currentFilter.m_patterns.empty() ) { - m_testSpec.m_filters.push_back( m_currentFilter ); - m_currentFilter = TestSpec::Filter(); - } - } - }; - inline TestSpec parseTestSpec( std::string const& arg ) { - return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -// #included from: catch_interfaces_config.h -#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct Verbosity { enum Level { - NoOutput = 0, - Quiet, - Normal - }; }; - - struct WarnAbout { enum What { - Nothing = 0x00, - NoAssertions = 0x01 - }; }; - - struct ShowDurations { enum OrNot { - DefaultForReporter, - Always, - Never - }; }; - struct RunTests { enum InWhatOrder { - InDeclarationOrder, - InLexicographicalOrder, - InRandomOrder - }; }; - struct UseColour { enum YesOrNo { - Auto, - Yes, - No - }; }; - - class TestSpec; - - struct IConfig : IShared { - - virtual ~IConfig(); - - virtual bool allowThrows() const = 0; - virtual std::ostream& stream() const = 0; - virtual std::string name() const = 0; - virtual bool includeSuccessfulResults() const = 0; - virtual bool shouldDebugBreak() const = 0; - virtual bool warnAboutMissingAssertions() const = 0; - virtual int abortAfter() const = 0; - virtual bool showInvisibles() const = 0; - virtual ShowDurations::OrNot showDurations() const = 0; - virtual TestSpec const& testSpec() const = 0; - virtual RunTests::InWhatOrder runOrder() const = 0; - virtual unsigned int rngSeed() const = 0; - virtual UseColour::YesOrNo useColour() const = 0; - }; -} - -// #included from: catch_stream.h -#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED - -// #included from: catch_streambuf.h -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase() CATCH_NOEXCEPT; - }; -} - -#include -#include -#include - -namespace Catch { - - std::ostream& cout(); - std::ostream& cerr(); - - struct IStream { - virtual ~IStream() CATCH_NOEXCEPT; - virtual std::ostream& stream() const = 0; - }; - - class FileStream : public IStream { - mutable std::ofstream m_ofs; - public: - FileStream( std::string const& filename ); - virtual ~FileStream() CATCH_NOEXCEPT; - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; - - class CoutStream : public IStream { - mutable std::ostream m_os; - public: - CoutStream(); - virtual ~CoutStream() CATCH_NOEXCEPT; - - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; - - class DebugOutStream : public IStream { - CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf; - mutable std::ostream m_os; - public: - DebugOutStream(); - virtual ~DebugOutStream() CATCH_NOEXCEPT; - - public: // IStream - virtual std::ostream& stream() const CATCH_OVERRIDE; - }; -} - -#include -#include -#include -#include -#include - -#ifndef CATCH_CONFIG_CONSOLE_WIDTH -#define CATCH_CONFIG_CONSOLE_WIDTH 80 -#endif - -namespace Catch { - - struct ConfigData { - - ConfigData() - : listTests( false ), - listTags( false ), - listReporters( false ), - listTestNamesOnly( false ), - showSuccessfulTests( false ), - shouldDebugBreak( false ), - noThrow( false ), - showHelp( false ), - showInvisibles( false ), - filenamesAsTags( false ), - abortAfter( -1 ), - rngSeed( 0 ), - verbosity( Verbosity::Normal ), - warnings( WarnAbout::Nothing ), - showDurations( ShowDurations::DefaultForReporter ), - runOrder( RunTests::InDeclarationOrder ), - useColour( UseColour::Auto ) - {} - - bool listTests; - bool listTags; - bool listReporters; - bool listTestNamesOnly; - - bool showSuccessfulTests; - bool shouldDebugBreak; - bool noThrow; - bool showHelp; - bool showInvisibles; - bool filenamesAsTags; - - int abortAfter; - unsigned int rngSeed; - - Verbosity::Level verbosity; - WarnAbout::What warnings; - ShowDurations::OrNot showDurations; - RunTests::InWhatOrder runOrder; - UseColour::YesOrNo useColour; - - std::string outputFilename; - std::string name; - std::string processName; - - std::vector reporterNames; - std::vector testsOrTags; - }; - - class Config : public SharedImpl { - private: - Config( Config const& other ); - Config& operator = ( Config const& other ); - virtual void dummy(); - public: - - Config() - {} - - Config( ConfigData const& data ) - : m_data( data ), - m_stream( openStream() ) - { - if( !data.testsOrTags.empty() ) { - TestSpecParser parser( ITagAliasRegistry::get() ); - for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) - parser.parse( data.testsOrTags[i] ); - m_testSpec = parser.testSpec(); - } - } - - virtual ~Config() { - } - - std::string const& getFilename() const { - return m_data.outputFilename ; - } - - bool listTests() const { return m_data.listTests; } - bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } - bool listTags() const { return m_data.listTags; } - bool listReporters() const { return m_data.listReporters; } - - std::string getProcessName() const { return m_data.processName; } - - bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } - - std::vector getReporterNames() const { return m_data.reporterNames; } - - int abortAfter() const { return m_data.abortAfter; } - - TestSpec const& testSpec() const { return m_testSpec; } - - bool showHelp() const { return m_data.showHelp; } - bool showInvisibles() const { return m_data.showInvisibles; } - - // IConfig interface - virtual bool allowThrows() const { return !m_data.noThrow; } - virtual std::ostream& stream() const { return m_stream->stream(); } - virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } - virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } - virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } - virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } - virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; } - virtual unsigned int rngSeed() const { return m_data.rngSeed; } - virtual UseColour::YesOrNo useColour() const { return m_data.useColour; } - - private: - - IStream const* openStream() { - if( m_data.outputFilename.empty() ) - return new CoutStream(); - else if( m_data.outputFilename[0] == '%' ) { - if( m_data.outputFilename == "%debug" ) - return new DebugOutStream(); - else - throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename ); - } - else - return new FileStream( m_data.outputFilename ); - } - ConfigData m_data; - - CATCH_AUTO_PTR( IStream const ) m_stream; - TestSpec m_testSpec; - }; - -} // end namespace Catch - -// #included from: catch_clara.h -#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED - -// Use Catch's value for console width (store Clara's off to the side, if present) -#ifdef CLARA_CONFIG_CONSOLE_WIDTH -#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH -#undef CLARA_CONFIG_CONSOLE_WIDTH -#endif -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -// Declare Clara inside the Catch namespace -#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { -// #included from: ../external/clara.h - -// Version 0.0.2.4 - -// Only use header guard if we are not using an outer namespace -#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) - -#ifndef STITCH_CLARA_OPEN_NAMESPACE -#define TWOBLUECUBES_CLARA_H_INCLUDED -#define STITCH_CLARA_OPEN_NAMESPACE -#define STITCH_CLARA_CLOSE_NAMESPACE -#else -#define STITCH_CLARA_CLOSE_NAMESPACE } -#endif - -#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE - -// ----------- #included from tbc_text_format.h ----------- - -// Only use header guard if we are not using an outer namespace -#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) -#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -#define TBC_TEXT_FORMAT_H_INCLUDED -#endif - -#include -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TBC_TEXT_FORMAT_H_INCLUDED - -// ----------- end of #include from tbc_text_format.h ----------- -// ........... back in clara.h - -#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE - -// ----------- #included from clara_compilers.h ----------- - -#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED -#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED - -// Detect a number of compiler features - mostly C++11/14 conformance - by compiler -// The following features are defined: -// -// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported? -// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported? -// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods -// CLARA_CONFIG_CPP11_OVERRIDE : is override supported? -// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr) - -// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported? - -// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported? - -// In general each macro has a _NO_ form -// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11 - -#ifdef __clang__ - -#if __has_feature(cxx_nullptr) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -#if __has_feature(cxx_noexcept) -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -// - otherwise more recent versions define __cplusplus >= 201103L -// and will get picked up below - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1600) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015)) -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// catch all support for C++11 -#if defined(__cplusplus) && __cplusplus >= 201103L - -#define CLARA_CPP11_OR_GREATER - -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) -#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR -#endif - -#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT -#endif - -#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS -#endif - -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) -#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE -#endif -#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) -#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR -#endif - -#endif // __cplusplus >= 201103L - -// Now set the actual defines based on the above + anything the user has configured -#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_NULLPTR -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_NOEXCEPT -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_GENERATED_METHODS -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_OVERRIDE -#endif -#if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11) -#define CLARA_CONFIG_CPP11_UNIQUE_PTR -#endif - -// noexcept support: -#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT) -#define CLARA_NOEXCEPT noexcept -# define CLARA_NOEXCEPT_IS(x) noexcept(x) -#else -#define CLARA_NOEXCEPT throw() -# define CLARA_NOEXCEPT_IS(x) -#endif - -// nullptr support -#ifdef CLARA_CONFIG_CPP11_NULLPTR -#define CLARA_NULL nullptr -#else -#define CLARA_NULL NULL -#endif - -// override support -#ifdef CLARA_CONFIG_CPP11_OVERRIDE -#define CLARA_OVERRIDE override -#else -#define CLARA_OVERRIDE -#endif - -// unique_ptr support -#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR -# define CLARA_AUTO_PTR( T ) std::unique_ptr -#else -# define CLARA_AUTO_PTR( T ) std::auto_ptr -#endif - -#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED - -// ----------- end of #include from clara_compilers.h ----------- -// ........... back in clara.h - -#include -#include -#include - -#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CLARA_PLATFORM_WINDOWS -#endif - -// Use optional outer namespace -#ifdef STITCH_CLARA_OPEN_NAMESPACE -STITCH_CLARA_OPEN_NAMESPACE -#endif - -namespace Clara { - - struct UnpositionalTag {}; - - extern UnpositionalTag _; - -#ifdef CLARA_CONFIG_MAIN - UnpositionalTag _; -#endif - - namespace Detail { - -#ifdef CLARA_CONSOLE_WIDTH - const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - using namespace Tbc; - - inline bool startsWith( std::string const& str, std::string const& prefix ) { - return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; - } - - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - - template struct IsBool { static const bool value = false; }; - template<> struct IsBool { static const bool value = true; }; - - template - void convertInto( std::string const& _source, T& _dest ) { - std::stringstream ss; - ss << _source; - ss >> _dest; - if( ss.fail() ) - throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); - } - inline void convertInto( std::string const& _source, std::string& _dest ) { - _dest = _source; - } - inline void convertInto( std::string const& _source, bool& _dest ) { - std::string sourceLC = _source; - std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); - if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) - _dest = true; - else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) - _dest = false; - else - throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); - } - - template - struct IArgFunction { - virtual ~IArgFunction() {} -#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS - IArgFunction() = default; - IArgFunction( IArgFunction const& ) = default; -#endif - virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual bool takesArg() const = 0; - virtual IArgFunction* clone() const = 0; - }; - - template - class BoundArgFunction { - public: - BoundArgFunction() : functionObj( CLARA_NULL ) {} - BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} - BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {} - BoundArgFunction& operator = ( BoundArgFunction const& other ) { - IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL; - delete functionObj; - functionObj = newFunctionObj; - return *this; - } - ~BoundArgFunction() { delete functionObj; } - - void set( ConfigT& config, std::string const& value ) const { - functionObj->set( config, value ); - } - bool takesArg() const { return functionObj->takesArg(); } - - bool isSet() const { - return functionObj != CLARA_NULL; - } - private: - IArgFunction* functionObj; - }; - - template - struct NullBinder : IArgFunction{ - virtual void set( C&, std::string const& ) const {} - virtual bool takesArg() const { return true; } - virtual IArgFunction* clone() const { return new NullBinder( *this ); } - }; - - template - struct BoundDataMember : IArgFunction{ - BoundDataMember( M C::* _member ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - convertInto( stringValue, p.*member ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } - M C::* member; - }; - template - struct BoundUnaryMethod : IArgFunction{ - BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - (p.*member)( value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } - void (C::*member)( M ); - }; - template - struct BoundNullaryMethod : IArgFunction{ - BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - (p.*member)(); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } - void (C::*member)(); - }; - - template - struct BoundUnaryFunction : IArgFunction{ - BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - function( obj ); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } - void (*function)( C& ); - }; - - template - struct BoundBinaryFunction : IArgFunction{ - BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - function( obj, value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } - void (*function)( C&, T ); - }; - - } // namespace Detail - - inline std::vector argsToVector( int argc, char const* const* const argv ) { - std::vector args( static_cast( argc ) ); - for( std::size_t i = 0; i < static_cast( argc ); ++i ) - args[i] = argv[i]; - - return args; - } - - class Parser { - enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional }; - Mode mode; - std::size_t from; - bool inQuotes; - public: - - struct Token { - enum Type { Positional, ShortOpt, LongOpt }; - Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} - Type type; - std::string data; - }; - - Parser() : mode( None ), from( 0 ), inQuotes( false ){} - - void parseIntoTokens( std::vector const& args, std::vector& tokens ) { - const std::string doubleDash = "--"; - for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i ) - parseIntoTokens( args[i], tokens); - } - - void parseIntoTokens( std::string const& arg, std::vector& tokens ) { - for( std::size_t i = 0; i <= arg.size(); ++i ) { - char c = arg[i]; - if( c == '"' ) - inQuotes = !inQuotes; - mode = handleMode( i, c, arg, tokens ); - } - } - Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - switch( mode ) { - case None: return handleNone( i, c ); - case MaybeShortOpt: return handleMaybeShortOpt( i, c ); - case ShortOpt: - case LongOpt: - case SlashOpt: return handleOpt( i, c, arg, tokens ); - case Positional: return handlePositional( i, c, arg, tokens ); - default: throw std::logic_error( "Unknown mode" ); - } - } - - Mode handleNone( std::size_t i, char c ) { - if( inQuotes ) { - from = i; - return Positional; - } - switch( c ) { - case '-': return MaybeShortOpt; -#ifdef CLARA_PLATFORM_WINDOWS - case '/': from = i+1; return SlashOpt; -#endif - default: from = i; return Positional; - } - } - Mode handleMaybeShortOpt( std::size_t i, char c ) { - switch( c ) { - case '-': from = i+1; return LongOpt; - default: from = i; return ShortOpt; - } - } - Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - if( std::string( ":=\0", 3 ).find( c ) == std::string::npos ) - return mode; - - std::string optName = arg.substr( from, i-from ); - if( mode == ShortOpt ) - for( std::size_t j = 0; j < optName.size(); ++j ) - tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) ); - else if( mode == SlashOpt && optName.size() == 1 ) - tokens.push_back( Token( Token::ShortOpt, optName ) ); - else - tokens.push_back( Token( Token::LongOpt, optName ) ); - return None; - } - Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector& tokens ) { - if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos ) - return mode; - - std::string data = arg.substr( from, i-from ); - tokens.push_back( Token( Token::Positional, data ) ); - return None; - } - }; - - template - struct CommonArgProperties { - CommonArgProperties() {} - CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} - - Detail::BoundArgFunction boundField; - std::string description; - std::string detail; - std::string placeholder; // Only value if boundField takes an arg - - bool takesArg() const { - return !placeholder.empty(); - } - void validate() const { - if( !boundField.isSet() ) - throw std::logic_error( "option not bound" ); - } - }; - struct OptionArgProperties { - std::vector shortNames; - std::string longName; - - bool hasShortName( std::string const& shortName ) const { - return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); - } - bool hasLongName( std::string const& _longName ) const { - return _longName == longName; - } - }; - struct PositionalArgProperties { - PositionalArgProperties() : position( -1 ) {} - int position; // -1 means non-positional (floating) - - bool isFixedPositional() const { - return position != -1; - } - }; - - template - class CommandLine { - - struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { - Arg() {} - Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} - - using CommonArgProperties::placeholder; // !TBD - - std::string dbgName() const { - if( !longName.empty() ) - return "--" + longName; - if( !shortNames.empty() ) - return "-" + shortNames[0]; - return "positional args"; - } - std::string commands() const { - std::ostringstream oss; - bool first = true; - std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); - for(; it != itEnd; ++it ) { - if( first ) - first = false; - else - oss << ", "; - oss << "-" << *it; - } - if( !longName.empty() ) { - if( !first ) - oss << ", "; - oss << "--" << longName; - } - if( !placeholder.empty() ) - oss << " <" << placeholder << ">"; - return oss.str(); - } - }; - - typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr; - - friend void addOptName( Arg& arg, std::string const& optName ) - { - if( optName.empty() ) - return; - if( Detail::startsWith( optName, "--" ) ) { - if( !arg.longName.empty() ) - throw std::logic_error( "Only one long opt may be specified. '" - + arg.longName - + "' already specified, now attempting to add '" - + optName + "'" ); - arg.longName = optName.substr( 2 ); - } - else if( Detail::startsWith( optName, "-" ) ) - arg.shortNames.push_back( optName.substr( 1 ) ); - else - throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); - } - friend void setPositionalArg( Arg& arg, int position ) - { - arg.position = position; - } - - class ArgBuilder { - public: - ArgBuilder( Arg* arg ) : m_arg( arg ) {} - - // Bind a non-boolean data member (requires placeholder string) - template - void bind( M C::* field, std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - m_arg->placeholder = placeholder; - } - // Bind a boolean data member (no placeholder required) - template - void bind( bool C::* field ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - } - - // Bind a method taking a single, non-boolean argument (requires a placeholder string) - template - void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - m_arg->placeholder = placeholder; - } - - // Bind a method taking a single, boolean argument (no placeholder string required) - template - void bind( void (C::* unaryMethod)( bool ) ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - } - - // Bind a method that takes no arguments (will be called if opt is present) - template - void bind( void (C::* nullaryMethod)() ) { - m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); - } - - // Bind a free function taking a single argument - the object to operate on (no placeholder string required) - template - void bind( void (* unaryFunction)( C& ) ) { - m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); - } - - // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) - template - void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); - m_arg->placeholder = placeholder; - } - - ArgBuilder& describe( std::string const& description ) { - m_arg->description = description; - return *this; - } - ArgBuilder& detail( std::string const& detail ) { - m_arg->detail = detail; - return *this; - } - - protected: - Arg* m_arg; - }; - - class OptBuilder : public ArgBuilder { - public: - OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} - OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} - - OptBuilder& operator[]( std::string const& optName ) { - addOptName( *ArgBuilder::m_arg, optName ); - return *this; - } - }; - - public: - - CommandLine() - : m_boundProcessName( new Detail::NullBinder() ), - m_highestSpecifiedArgPosition( 0 ), - m_throwOnUnrecognisedTokens( false ) - {} - CommandLine( CommandLine const& other ) - : m_boundProcessName( other.m_boundProcessName ), - m_options ( other.m_options ), - m_positionalArgs( other.m_positionalArgs ), - m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), - m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) - { - if( other.m_floatingArg.get() ) - m_floatingArg.reset( new Arg( *other.m_floatingArg ) ); - } - - CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { - m_throwOnUnrecognisedTokens = shouldThrow; - return *this; - } - - OptBuilder operator[]( std::string const& optName ) { - m_options.push_back( Arg() ); - addOptName( m_options.back(), optName ); - OptBuilder builder( &m_options.back() ); - return builder; - } - - ArgBuilder operator[]( int position ) { - m_positionalArgs.insert( std::make_pair( position, Arg() ) ); - if( position > m_highestSpecifiedArgPosition ) - m_highestSpecifiedArgPosition = position; - setPositionalArg( m_positionalArgs[position], position ); - ArgBuilder builder( &m_positionalArgs[position] ); - return builder; - } - - // Invoke this with the _ instance - ArgBuilder operator[]( UnpositionalTag ) { - if( m_floatingArg.get() ) - throw std::logic_error( "Only one unpositional argument can be added" ); - m_floatingArg.reset( new Arg() ); - ArgBuilder builder( m_floatingArg.get() ); - return builder; - } - - template - void bindProcessName( M C::* field ) { - m_boundProcessName = new Detail::BoundDataMember( field ); - } - template - void bindProcessName( void (C::*_unaryMethod)( M ) ) { - m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); - } - - void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { - typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; - std::size_t maxWidth = 0; - for( it = itBegin; it != itEnd; ++it ) - maxWidth = (std::max)( maxWidth, it->commands().size() ); - - for( it = itBegin; it != itEnd; ++it ) { - Detail::Text usage( it->commands(), Detail::TextAttributes() - .setWidth( maxWidth+indent ) - .setIndent( indent ) ); - Detail::Text desc( it->description, Detail::TextAttributes() - .setWidth( width - maxWidth - 3 ) ); - - for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { - std::string usageCol = i < usage.size() ? usage[i] : ""; - os << usageCol; - - if( i < desc.size() && !desc[i].empty() ) - os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) - << desc[i]; - os << "\n"; - } - } - } - std::string optUsage() const { - std::ostringstream oss; - optUsage( oss ); - return oss.str(); - } - - void argSynopsis( std::ostream& os ) const { - for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { - if( i > 1 ) - os << " "; - typename std::map::const_iterator it = m_positionalArgs.find( i ); - if( it != m_positionalArgs.end() ) - os << "<" << it->second.placeholder << ">"; - else if( m_floatingArg.get() ) - os << "<" << m_floatingArg->placeholder << ">"; - else - throw std::logic_error( "non consecutive positional arguments with no floating args" ); - } - // !TBD No indication of mandatory args - if( m_floatingArg.get() ) { - if( m_highestSpecifiedArgPosition > 1 ) - os << " "; - os << "[<" << m_floatingArg->placeholder << "> ...]"; - } - } - std::string argSynopsis() const { - std::ostringstream oss; - argSynopsis( oss ); - return oss.str(); - } - - void usage( std::ostream& os, std::string const& procName ) const { - validate(); - os << "usage:\n " << procName << " "; - argSynopsis( os ); - if( !m_options.empty() ) { - os << " [options]\n\nwhere options are: \n"; - optUsage( os, 2 ); - } - os << "\n"; - } - std::string usage( std::string const& procName ) const { - std::ostringstream oss; - usage( oss, procName ); - return oss.str(); - } - - ConfigT parse( std::vector const& args ) const { - ConfigT config; - parseInto( args, config ); - return config; - } - - std::vector parseInto( std::vector const& args, ConfigT& config ) const { - std::string processName = args[0]; - std::size_t lastSlash = processName.find_last_of( "/\\" ); - if( lastSlash != std::string::npos ) - processName = processName.substr( lastSlash+1 ); - m_boundProcessName.set( config, processName ); - std::vector tokens; - Parser parser; - parser.parseIntoTokens( args, tokens ); - return populate( tokens, config ); - } - - std::vector populate( std::vector const& tokens, ConfigT& config ) const { - validate(); - std::vector unusedTokens = populateOptions( tokens, config ); - unusedTokens = populateFixedArgs( unusedTokens, config ); - unusedTokens = populateFloatingArgs( unusedTokens, config ); - return unusedTokens; - } - - std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - std::vector errors; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); - for(; it != itEnd; ++it ) { - Arg const& arg = *it; - - try { - if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || - ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { - if( arg.takesArg() ) { - if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) - errors.push_back( "Expected argument to option: " + token.data ); - else - arg.boundField.set( config, tokens[++i].data ); - } - else { - arg.boundField.set( config, "true" ); - } - break; - } - } - catch( std::exception& ex ) { - errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); - } - } - if( it == itEnd ) { - if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) - unusedTokens.push_back( token ); - else if( errors.empty() && m_throwOnUnrecognisedTokens ) - errors.push_back( "unrecognised option: " + token.data ); - } - } - if( !errors.empty() ) { - std::ostringstream oss; - for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); - it != itEnd; - ++it ) { - if( it != errors.begin() ) - oss << "\n"; - oss << *it; - } - throw std::runtime_error( oss.str() ); - } - return unusedTokens; - } - std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - int position = 1; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::map::const_iterator it = m_positionalArgs.find( position ); - if( it != m_positionalArgs.end() ) - it->second.boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - if( token.type == Parser::Token::Positional ) - position++; - } - return unusedTokens; - } - std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { - if( !m_floatingArg.get() ) - return tokens; - std::vector unusedTokens; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - if( token.type == Parser::Token::Positional ) - m_floatingArg->boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - } - return unusedTokens; - } - - void validate() const - { - if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) - throw std::logic_error( "No options or arguments specified" ); - - for( typename std::vector::const_iterator it = m_options.begin(), - itEnd = m_options.end(); - it != itEnd; ++it ) - it->validate(); - } - - private: - Detail::BoundArgFunction m_boundProcessName; - std::vector m_options; - std::map m_positionalArgs; - ArgAutoPtr m_floatingArg; - int m_highestSpecifiedArgPosition; - bool m_throwOnUnrecognisedTokens; - }; - -} // end namespace Clara - -STITCH_CLARA_CLOSE_NAMESPACE -#undef STITCH_CLARA_OPEN_NAMESPACE -#undef STITCH_CLARA_CLOSE_NAMESPACE - -#endif // TWOBLUECUBES_CLARA_H_INCLUDED -#undef STITCH_CLARA_OPEN_NAMESPACE - -// Restore Clara's value for console width, if present -#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#endif - -#include - -namespace Catch { - - inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } - inline void abortAfterX( ConfigData& config, int x ) { - if( x < 1 ) - throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); - config.abortAfter = x; - } - inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } - inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); } - - inline void addWarning( ConfigData& config, std::string const& _warning ) { - if( _warning == "NoAssertions" ) - config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); - else - throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); - } - inline void setOrder( ConfigData& config, std::string const& order ) { - if( startsWith( "declared", order ) ) - config.runOrder = RunTests::InDeclarationOrder; - else if( startsWith( "lexical", order ) ) - config.runOrder = RunTests::InLexicographicalOrder; - else if( startsWith( "random", order ) ) - config.runOrder = RunTests::InRandomOrder; - else - throw std::runtime_error( "Unrecognised ordering: '" + order + "'" ); - } - inline void setRngSeed( ConfigData& config, std::string const& seed ) { - if( seed == "time" ) { - config.rngSeed = static_cast( std::time(0) ); - } - else { - std::stringstream ss; - ss << seed; - ss >> config.rngSeed; - if( ss.fail() ) - throw std::runtime_error( "Argment to --rng-seed should be the word 'time' or a number" ); - } - } - inline void setVerbosity( ConfigData& config, int level ) { - // !TBD: accept strings? - config.verbosity = static_cast( level ); - } - inline void setShowDurations( ConfigData& config, bool _showDurations ) { - config.showDurations = _showDurations - ? ShowDurations::Always - : ShowDurations::Never; - } - inline void setUseColour( ConfigData& config, std::string const& value ) { - std::string mode = toLower( value ); - - if( mode == "yes" ) - config.useColour = UseColour::Yes; - else if( mode == "no" ) - config.useColour = UseColour::No; - else if( mode == "auto" ) - config.useColour = UseColour::Auto; - else - throw std::runtime_error( "colour mode must be one of: auto, yes or no" ); - } - inline void forceColour( ConfigData& config ) { - config.useColour = UseColour::Yes; - } - inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { - std::ifstream f( _filename.c_str() ); - if( !f.is_open() ) - throw std::domain_error( "Unable to load input file: " + _filename ); - - std::string line; - while( std::getline( f, line ) ) { - line = trim(line); - if( !line.empty() && !startsWith( line, "#" ) ) { - if( !startsWith( line, "\"" ) ) - line = "\"" + line + "\""; - addTestOrTags( config, line + "," ); - } - } - } - - inline Clara::CommandLine makeCommandLineParser() { - - using namespace Clara; - CommandLine cli; - - cli.bindProcessName( &ConfigData::processName ); - - cli["-?"]["-h"]["--help"] - .describe( "display usage information" ) - .bind( &ConfigData::showHelp ); - - cli["-l"]["--list-tests"] - .describe( "list all/matching test cases" ) - .bind( &ConfigData::listTests ); - - cli["-t"]["--list-tags"] - .describe( "list all/matching tags" ) - .bind( &ConfigData::listTags ); - - cli["-s"]["--success"] - .describe( "include successful tests in output" ) - .bind( &ConfigData::showSuccessfulTests ); - - cli["-b"]["--break"] - .describe( "break into debugger on failure" ) - .bind( &ConfigData::shouldDebugBreak ); - - cli["-e"]["--nothrow"] - .describe( "skip exception tests" ) - .bind( &ConfigData::noThrow ); - - cli["-i"]["--invisibles"] - .describe( "show invisibles (tabs, newlines)" ) - .bind( &ConfigData::showInvisibles ); - - cli["-o"]["--out"] - .describe( "output filename" ) - .bind( &ConfigData::outputFilename, "filename" ); - - cli["-r"]["--reporter"] -// .placeholder( "name[:filename]" ) - .describe( "reporter to use (defaults to console)" ) - .bind( &addReporterName, "name" ); - - cli["-n"]["--name"] - .describe( "suite name" ) - .bind( &ConfigData::name, "name" ); - - cli["-a"]["--abort"] - .describe( "abort at first failure" ) - .bind( &abortAfterFirst ); - - cli["-x"]["--abortx"] - .describe( "abort after x failures" ) - .bind( &abortAfterX, "no. failures" ); - - cli["-w"]["--warn"] - .describe( "enable warnings" ) - .bind( &addWarning, "warning name" ); - -// - needs updating if reinstated -// cli.into( &setVerbosity ) -// .describe( "level of verbosity (0=no output)" ) -// .shortOpt( "v") -// .longOpt( "verbosity" ) -// .placeholder( "level" ); - - cli[_] - .describe( "which test or tests to use" ) - .bind( &addTestOrTags, "test name, pattern or tags" ); - - cli["-d"]["--durations"] - .describe( "show test durations" ) - .bind( &setShowDurations, "yes|no" ); - - cli["-f"]["--input-file"] - .describe( "load test names to run from a file" ) - .bind( &loadTestNamesFromFile, "filename" ); - - cli["-#"]["--filenames-as-tags"] - .describe( "adds a tag for the filename" ) - .bind( &ConfigData::filenamesAsTags ); - - // Less common commands which don't have a short form - cli["--list-test-names-only"] - .describe( "list all/matching test cases names only" ) - .bind( &ConfigData::listTestNamesOnly ); - - cli["--list-reporters"] - .describe( "list all reporters" ) - .bind( &ConfigData::listReporters ); - - cli["--order"] - .describe( "test case order (defaults to decl)" ) - .bind( &setOrder, "decl|lex|rand" ); - - cli["--rng-seed"] - .describe( "set a specific seed for random numbers" ) - .bind( &setRngSeed, "'time'|number" ); - - cli["--force-colour"] - .describe( "force colourised output (deprecated)" ) - .bind( &forceColour ); - - cli["--use-colour"] - .describe( "should output be colourised" ) - .bind( &setUseColour, "yes|no" ); - - return cli; - } - -} // end namespace Catch - -// #included from: internal/catch_list.hpp -#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED - -// #included from: catch_text.h -#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED - -#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch -// #included from: ../external/tbc_text_format.h -// Only use header guard if we are not using an outer namespace -#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#include -#include -#include - -// Use optional outer namespace -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE - -namespace Catch { - using Tbc::Text; - using Tbc::TextAttributes; -} - -// #included from: catch_console_colour.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED - -namespace Catch { - - struct Colour { - enum Code { - None = 0, - - White, - Red, - Green, - Blue, - Cyan, - Yellow, - Grey, - - Bright = 0x10, - - BrightRed = Bright | Red, - BrightGreen = Bright | Green, - LightGrey = Bright | Grey, - BrightWhite = Bright | White, - - // By intention - FileName = LightGrey, - Warning = Yellow, - ResultError = BrightRed, - ResultSuccess = BrightGreen, - ResultExpectedFailure = Warning, - - Error = BrightRed, - Success = Green, - - OriginalExpression = Cyan, - ReconstructedExpression = Yellow, - - SecondaryText = LightGrey, - Headers = White - }; - - // Use constructed object for RAII guard - Colour( Code _colourCode ); - Colour( Colour const& other ); - ~Colour(); - - // Use static method for one-shot changes - static void use( Code _colourCode ); - - private: - bool m_moved; - }; - - inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } - -} // end namespace Catch - -// #included from: catch_interfaces_reporter.h -#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED - -#include -#include -#include -#include - -namespace Catch -{ - struct ReporterConfig { - explicit ReporterConfig( Ptr const& _fullConfig ) - : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} - - ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) - : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} - - std::ostream& stream() const { return *m_stream; } - Ptr fullConfig() const { return m_fullConfig; } - - private: - std::ostream* m_stream; - Ptr m_fullConfig; - }; - - struct ReporterPreferences { - ReporterPreferences() - : shouldRedirectStdOut( false ) - {} - - bool shouldRedirectStdOut; - }; - - template - struct LazyStat : Option { - LazyStat() : used( false ) {} - LazyStat& operator=( T const& _value ) { - Option::operator=( _value ); - used = false; - return *this; - } - void reset() { - Option::reset(); - used = false; - } - bool used; - }; - - struct TestRunInfo { - TestRunInfo( std::string const& _name ) : name( _name ) {} - std::string name; - }; - struct GroupInfo { - GroupInfo( std::string const& _name, - std::size_t _groupIndex, - std::size_t _groupsCount ) - : name( _name ), - groupIndex( _groupIndex ), - groupsCounts( _groupsCount ) - {} - - std::string name; - std::size_t groupIndex; - std::size_t groupsCounts; - }; - - struct AssertionStats { - AssertionStats( AssertionResult const& _assertionResult, - std::vector const& _infoMessages, - Totals const& _totals ) - : assertionResult( _assertionResult ), - infoMessages( _infoMessages ), - totals( _totals ) - { - if( assertionResult.hasMessage() ) { - // Copy message into messages list. - // !TBD This should have been done earlier, somewhere - MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); - builder << assertionResult.getMessage(); - builder.m_info.message = builder.m_stream.str(); - - infoMessages.push_back( builder.m_info ); - } - } - virtual ~AssertionStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - AssertionStats( AssertionStats const& ) = default; - AssertionStats( AssertionStats && ) = default; - AssertionStats& operator = ( AssertionStats const& ) = default; - AssertionStats& operator = ( AssertionStats && ) = default; -# endif - - AssertionResult assertionResult; - std::vector infoMessages; - Totals totals; - }; - - struct SectionStats { - SectionStats( SectionInfo const& _sectionInfo, - Counts const& _assertions, - double _durationInSeconds, - bool _missingAssertions ) - : sectionInfo( _sectionInfo ), - assertions( _assertions ), - durationInSeconds( _durationInSeconds ), - missingAssertions( _missingAssertions ) - {} - virtual ~SectionStats(); -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - SectionStats( SectionStats const& ) = default; - SectionStats( SectionStats && ) = default; - SectionStats& operator = ( SectionStats const& ) = default; - SectionStats& operator = ( SectionStats && ) = default; -# endif - - SectionInfo sectionInfo; - Counts assertions; - double durationInSeconds; - bool missingAssertions; - }; - - struct TestCaseStats { - TestCaseStats( TestCaseInfo const& _testInfo, - Totals const& _totals, - std::string const& _stdOut, - std::string const& _stdErr, - bool _aborting ) - : testInfo( _testInfo ), - totals( _totals ), - stdOut( _stdOut ), - stdErr( _stdErr ), - aborting( _aborting ) - {} - virtual ~TestCaseStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestCaseStats( TestCaseStats const& ) = default; - TestCaseStats( TestCaseStats && ) = default; - TestCaseStats& operator = ( TestCaseStats const& ) = default; - TestCaseStats& operator = ( TestCaseStats && ) = default; -# endif - - TestCaseInfo testInfo; - Totals totals; - std::string stdOut; - std::string stdErr; - bool aborting; - }; - - struct TestGroupStats { - TestGroupStats( GroupInfo const& _groupInfo, - Totals const& _totals, - bool _aborting ) - : groupInfo( _groupInfo ), - totals( _totals ), - aborting( _aborting ) - {} - TestGroupStats( GroupInfo const& _groupInfo ) - : groupInfo( _groupInfo ), - aborting( false ) - {} - virtual ~TestGroupStats(); - -# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestGroupStats( TestGroupStats const& ) = default; - TestGroupStats( TestGroupStats && ) = default; - TestGroupStats& operator = ( TestGroupStats const& ) = default; - TestGroupStats& operator = ( TestGroupStats && ) = default; -# endif - - GroupInfo groupInfo; - Totals totals; - bool aborting; - }; - - struct TestRunStats { - TestRunStats( TestRunInfo const& _runInfo, - Totals const& _totals, - bool _aborting ) - : runInfo( _runInfo ), - totals( _totals ), - aborting( _aborting ) - {} - virtual ~TestRunStats(); - -# ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS - TestRunStats( TestRunStats const& _other ) - : runInfo( _other.runInfo ), - totals( _other.totals ), - aborting( _other.aborting ) - {} -# else - TestRunStats( TestRunStats const& ) = default; - TestRunStats( TestRunStats && ) = default; - TestRunStats& operator = ( TestRunStats const& ) = default; - TestRunStats& operator = ( TestRunStats && ) = default; -# endif - - TestRunInfo runInfo; - Totals totals; - bool aborting; - }; - - class MultipleReporters; - - struct IStreamingReporter : IShared { - virtual ~IStreamingReporter(); - - // Implementing class must also provide the following static method: - // static std::string getDescription(); - - virtual ReporterPreferences getPreferences() const = 0; - - virtual void noMatchingTestCases( std::string const& spec ) = 0; - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; - virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; - virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; - - // The return value indicates if the messages buffer should be cleared: - virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; - - virtual void sectionEnded( SectionStats const& sectionStats ) = 0; - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; - virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; - - virtual void skipTest( TestCaseInfo const& testInfo ) = 0; - - virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; } - }; - - struct IReporterFactory : IShared { - virtual ~IReporterFactory(); - virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; - virtual std::string getDescription() const = 0; - }; - - struct IReporterRegistry { - typedef std::map > FactoryMap; - typedef std::vector > Listeners; - - virtual ~IReporterRegistry(); - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; - virtual FactoryMap const& getFactories() const = 0; - virtual Listeners const& getListeners() const = 0; - }; - - Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ); - -} - -#include -#include - -namespace Catch { - - inline std::size_t listTests( Config const& config ) { - - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - Catch::cout() << "Matching test cases:\n"; - else { - Catch::cout() << "All available test cases:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::size_t matchedTests = 0; - TextAttributes nameAttr, tagsAttr; - nameAttr.setInitialIndent( 2 ).setIndent( 4 ); - tagsAttr.setIndent( 6 ); - - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - Colour::Code colour = testCaseInfo.isHidden() - ? Colour::SecondaryText - : Colour::None; - Colour colourGuard( colour ); - - Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl; - if( !testCaseInfo.tags.empty() ) - Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; - } - - if( !config.testSpec().hasFilters() ) - Catch::cout() << pluralise( matchedTests, "test case" ) << "\n" << std::endl; - else - Catch::cout() << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; - return matchedTests; - } - - inline std::size_t listTestsNamesOnly( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( !config.testSpec().hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - std::size_t matchedTests = 0; - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - if( startsWith( testCaseInfo.name, "#" ) ) - Catch::cout() << "\"" << testCaseInfo.name << "\"" << std::endl; - else - Catch::cout() << testCaseInfo.name << std::endl; - } - return matchedTests; - } - - struct TagInfo { - TagInfo() : count ( 0 ) {} - void add( std::string const& spelling ) { - ++count; - spellings.insert( spelling ); - } - std::string all() const { - std::string out; - for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); - it != itEnd; - ++it ) - out += "[" + *it + "]"; - return out; - } - std::set spellings; - std::size_t count; - }; - - inline std::size_t listTags( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - Catch::cout() << "Tags for matching test cases:\n"; - else { - Catch::cout() << "All available tags:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::map tagCounts; - - std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), - tagItEnd = it->getTestCaseInfo().tags.end(); - tagIt != tagItEnd; - ++tagIt ) { - std::string tagName = *tagIt; - std::string lcaseTagName = toLower( tagName ); - std::map::iterator countIt = tagCounts.find( lcaseTagName ); - if( countIt == tagCounts.end() ) - countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; - countIt->second.add( tagName ); - } - } - - for( std::map::const_iterator countIt = tagCounts.begin(), - countItEnd = tagCounts.end(); - countIt != countItEnd; - ++countIt ) { - std::ostringstream oss; - oss << " " << std::setw(2) << countIt->second.count << " "; - Text wrapper( countIt->second.all(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( oss.str().size() ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); - Catch::cout() << oss.str() << wrapper << "\n"; - } - Catch::cout() << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; - return tagCounts.size(); - } - - inline std::size_t listReporters( Config const& /*config*/ ) { - Catch::cout() << "Available reporters:\n"; - IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); - IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; - std::size_t maxNameLen = 0; - for(it = itBegin; it != itEnd; ++it ) - maxNameLen = (std::max)( maxNameLen, it->first.size() ); - - for(it = itBegin; it != itEnd; ++it ) { - Text wrapper( it->second->getDescription(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( 7+maxNameLen ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); - Catch::cout() << " " - << it->first - << ":" - << std::string( maxNameLen - it->first.size() + 2, ' ' ) - << wrapper << "\n"; - } - Catch::cout() << std::endl; - return factories.size(); - } - - inline Option list( Config const& config ) { - Option listedCount; - if( config.listTests() ) - listedCount = listedCount.valueOr(0) + listTests( config ); - if( config.listTestNamesOnly() ) - listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); - if( config.listTags() ) - listedCount = listedCount.valueOr(0) + listTags( config ); - if( config.listReporters() ) - listedCount = listedCount.valueOr(0) + listReporters( config ); - return listedCount; - } - -} // end namespace Catch - -// #included from: internal/catch_run_context.hpp -#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED - -// #included from: catch_test_case_tracker.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { -namespace TestCaseTracking { - - struct ITracker : SharedImpl<> { - virtual ~ITracker(); - - // static queries - virtual std::string name() const = 0; - - // dynamic queries - virtual bool isComplete() const = 0; // Successfully completed or failed - virtual bool isSuccessfullyCompleted() const = 0; - virtual bool isOpen() const = 0; // Started but not complete - virtual bool hasChildren() const = 0; - - virtual ITracker& parent() = 0; - - // actions - virtual void close() = 0; // Successfully complete - virtual void fail() = 0; - virtual void markAsNeedingAnotherRun() = 0; - - virtual void addChild( Ptr const& child ) = 0; - virtual ITracker* findChild( std::string const& name ) = 0; - virtual void openChild() = 0; - - // Debug/ checking - virtual bool isSectionTracker() const = 0; - virtual bool isIndexTracker() const = 0; - }; - - class TrackerContext { - - enum RunState { - NotStarted, - Executing, - CompletedCycle - }; - - Ptr m_rootTracker; - ITracker* m_currentTracker; - RunState m_runState; - - public: - - static TrackerContext& instance() { - static TrackerContext s_instance; - return s_instance; - } - - TrackerContext() - : m_currentTracker( CATCH_NULL ), - m_runState( NotStarted ) - {} - - ITracker& startRun(); - - void endRun() { - m_rootTracker.reset(); - m_currentTracker = CATCH_NULL; - m_runState = NotStarted; - } - - void startCycle() { - m_currentTracker = m_rootTracker.get(); - m_runState = Executing; - } - void completeCycle() { - m_runState = CompletedCycle; - } - - bool completedCycle() const { - return m_runState == CompletedCycle; - } - ITracker& currentTracker() { - return *m_currentTracker; - } - void setCurrentTracker( ITracker* tracker ) { - m_currentTracker = tracker; - } - }; - - class TrackerBase : public ITracker { - protected: - enum CycleState { - NotStarted, - Executing, - ExecutingChildren, - NeedsAnotherRun, - CompletedSuccessfully, - Failed - }; - class TrackerHasName { - std::string m_name; - public: - TrackerHasName( std::string const& name ) : m_name( name ) {} - bool operator ()( Ptr const& tracker ) { - return tracker->name() == m_name; - } - }; - typedef std::vector > Children; - std::string m_name; - TrackerContext& m_ctx; - ITracker* m_parent; - Children m_children; - CycleState m_runState; - public: - TrackerBase( std::string const& name, TrackerContext& ctx, ITracker* parent ) - : m_name( name ), - m_ctx( ctx ), - m_parent( parent ), - m_runState( NotStarted ) - {} - virtual ~TrackerBase(); - - virtual std::string name() const CATCH_OVERRIDE { - return m_name; - } - virtual bool isComplete() const CATCH_OVERRIDE { - return m_runState == CompletedSuccessfully || m_runState == Failed; - } - virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE { - return m_runState == CompletedSuccessfully; - } - virtual bool isOpen() const CATCH_OVERRIDE { - return m_runState != NotStarted && !isComplete(); - } - virtual bool hasChildren() const CATCH_OVERRIDE { - return !m_children.empty(); - } - - virtual void addChild( Ptr const& child ) CATCH_OVERRIDE { - m_children.push_back( child ); - } - - virtual ITracker* findChild( std::string const& name ) CATCH_OVERRIDE { - Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( name ) ); - return( it != m_children.end() ) - ? it->get() - : CATCH_NULL; - } - virtual ITracker& parent() CATCH_OVERRIDE { - assert( m_parent ); // Should always be non-null except for root - return *m_parent; - } - - virtual void openChild() CATCH_OVERRIDE { - if( m_runState != ExecutingChildren ) { - m_runState = ExecutingChildren; - if( m_parent ) - m_parent->openChild(); - } - } - - virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; } - virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; } - - void open() { - m_runState = Executing; - moveToThis(); - if( m_parent ) - m_parent->openChild(); - } - - virtual void close() CATCH_OVERRIDE { - - // Close any still open children (e.g. generators) - while( &m_ctx.currentTracker() != this ) - m_ctx.currentTracker().close(); - - switch( m_runState ) { - case NotStarted: - case CompletedSuccessfully: - case Failed: - throw std::logic_error( "Illogical state" ); - - case NeedsAnotherRun: - break;; - - case Executing: - m_runState = CompletedSuccessfully; - break; - case ExecutingChildren: - if( m_children.empty() || m_children.back()->isComplete() ) - m_runState = CompletedSuccessfully; - break; - - default: - throw std::logic_error( "Unexpected state" ); - } - moveToParent(); - m_ctx.completeCycle(); - } - virtual void fail() CATCH_OVERRIDE { - m_runState = Failed; - if( m_parent ) - m_parent->markAsNeedingAnotherRun(); - moveToParent(); - m_ctx.completeCycle(); - } - virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE { - m_runState = NeedsAnotherRun; - } - private: - void moveToParent() { - assert( m_parent ); - m_ctx.setCurrentTracker( m_parent ); - } - void moveToThis() { - m_ctx.setCurrentTracker( this ); - } - }; - - class SectionTracker : public TrackerBase { - public: - SectionTracker( std::string const& name, TrackerContext& ctx, ITracker* parent ) - : TrackerBase( name, ctx, parent ) - {} - virtual ~SectionTracker(); - - virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; } - - static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) { - SectionTracker* section = CATCH_NULL; - - ITracker& currentTracker = ctx.currentTracker(); - if( ITracker* childTracker = currentTracker.findChild( name ) ) { - assert( childTracker ); - assert( childTracker->isSectionTracker() ); - section = static_cast( childTracker ); - } - else { - section = new SectionTracker( name, ctx, ¤tTracker ); - currentTracker.addChild( section ); - } - if( !ctx.completedCycle() && !section->isComplete() ) { - - section->open(); - } - return *section; - } - }; - - class IndexTracker : public TrackerBase { - int m_size; - int m_index; - public: - IndexTracker( std::string const& name, TrackerContext& ctx, ITracker* parent, int size ) - : TrackerBase( name, ctx, parent ), - m_size( size ), - m_index( -1 ) - {} - virtual ~IndexTracker(); - - virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; } - - static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) { - IndexTracker* tracker = CATCH_NULL; - - ITracker& currentTracker = ctx.currentTracker(); - if( ITracker* childTracker = currentTracker.findChild( name ) ) { - assert( childTracker ); - assert( childTracker->isIndexTracker() ); - tracker = static_cast( childTracker ); - } - else { - tracker = new IndexTracker( name, ctx, ¤tTracker, size ); - currentTracker.addChild( tracker ); - } - - if( !ctx.completedCycle() && !tracker->isComplete() ) { - if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) - tracker->moveNext(); - tracker->open(); - } - - return *tracker; - } - - int index() const { return m_index; } - - void moveNext() { - m_index++; - m_children.clear(); - } - - virtual void close() CATCH_OVERRIDE { - TrackerBase::close(); - if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) - m_runState = Executing; - } - }; - - inline ITracker& TrackerContext::startRun() { - m_rootTracker = new SectionTracker( "{root}", *this, CATCH_NULL ); - m_currentTracker = CATCH_NULL; - m_runState = Executing; - return *m_rootTracker; - } - -} // namespace TestCaseTracking - -using TestCaseTracking::ITracker; -using TestCaseTracking::TrackerContext; -using TestCaseTracking::SectionTracker; -using TestCaseTracking::IndexTracker; - -} // namespace Catch - -// #included from: catch_fatal_condition.hpp -#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED - -namespace Catch { - - // Report the error condition then exit the process - inline void fatal( std::string const& message, int exitCode ) { - IContext& context = Catch::getCurrentContext(); - IResultCapture* resultCapture = context.getResultCapture(); - resultCapture->handleFatalErrorCondition( message ); - - if( Catch::alwaysTrue() ) // avoids "no return" warnings - exit( exitCode ); - } - -} // namespace Catch - -#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// - -namespace Catch { - - struct FatalConditionHandler { - void reset() {} - }; - -} // namespace Catch - -#else // Not Windows - assumed to be POSIX compatible ////////////////////////// - -#include - -namespace Catch { - - struct SignalDefs { int id; const char* name; }; - extern SignalDefs signalDefs[]; - SignalDefs signalDefs[] = { - { SIGINT, "SIGINT - Terminal interrupt signal" }, - { SIGILL, "SIGILL - Illegal instruction signal" }, - { SIGFPE, "SIGFPE - Floating point error signal" }, - { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, - { SIGTERM, "SIGTERM - Termination request signal" }, - { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } - }; - - struct FatalConditionHandler { - - static void handleSignal( int sig ) { - for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) - if( sig == signalDefs[i].id ) - fatal( signalDefs[i].name, -sig ); - fatal( "", -sig ); - } - - FatalConditionHandler() : m_isSet( true ) { - for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) - signal( signalDefs[i].id, handleSignal ); - } - ~FatalConditionHandler() { - reset(); - } - void reset() { - if( m_isSet ) { - for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) - signal( signalDefs[i].id, SIG_DFL ); - m_isSet = false; - } - } - - bool m_isSet; - }; - -} // namespace Catch - -#endif // not Windows - -#include -#include - -namespace Catch { - - class StreamRedirect { - - public: - StreamRedirect( std::ostream& stream, std::string& targetString ) - : m_stream( stream ), - m_prevBuf( stream.rdbuf() ), - m_targetString( targetString ) - { - stream.rdbuf( m_oss.rdbuf() ); - } - - ~StreamRedirect() { - m_targetString += m_oss.str(); - m_stream.rdbuf( m_prevBuf ); - } - - private: - std::ostream& m_stream; - std::streambuf* m_prevBuf; - std::ostringstream m_oss; - std::string& m_targetString; - }; - - /////////////////////////////////////////////////////////////////////////// - - class RunContext : public IResultCapture, public IRunner { - - RunContext( RunContext const& ); - void operator =( RunContext const& ); - - public: - - explicit RunContext( Ptr const& _config, Ptr const& reporter ) - : m_runInfo( _config->name() ), - m_context( getCurrentMutableContext() ), - m_activeTestCase( CATCH_NULL ), - m_config( _config ), - m_reporter( reporter ) - { - m_context.setRunner( this ); - m_context.setConfig( m_config ); - m_context.setResultCapture( this ); - m_reporter->testRunStarting( m_runInfo ); - } - - virtual ~RunContext() { - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); - } - - void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); - } - void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); - } - - Totals runTest( TestCase const& testCase ) { - Totals prevTotals = m_totals; - - std::string redirectedCout; - std::string redirectedCerr; - - TestCaseInfo testInfo = testCase.getTestCaseInfo(); - - m_reporter->testCaseStarting( testInfo ); - - m_activeTestCase = &testCase; - - do { - m_trackerContext.startRun(); - do { - m_trackerContext.startCycle(); - m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, testInfo.name ); - runCurrentTest( redirectedCout, redirectedCerr ); - } - while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() ); - } - // !TBD: deprecated - this will be replaced by indexed trackers - while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); - - Totals deltaTotals = m_totals.delta( prevTotals ); - if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) { - deltaTotals.assertions.failed++; - deltaTotals.testCases.passed--; - deltaTotals.testCases.failed++; - } - m_totals.testCases += deltaTotals.testCases; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - redirectedCout, - redirectedCerr, - aborting() ) ); - - m_activeTestCase = CATCH_NULL; - m_testCaseTracker = CATCH_NULL; - - return deltaTotals; - } - - Ptr config() const { - return m_config; - } - - private: // IResultCapture - - virtual void assertionEnded( AssertionResult const& result ) { - if( result.getResultType() == ResultWas::Ok ) { - m_totals.assertions.passed++; - } - else if( !result.isOk() ) { - m_totals.assertions.failed++; - } - - if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) - m_messages.clear(); - - // Reset working state - m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); - m_lastResult = result; - } - - virtual bool sectionStarted ( - SectionInfo const& sectionInfo, - Counts& assertions - ) - { - std::ostringstream oss; - oss << sectionInfo.name << "@" << sectionInfo.lineInfo; - - ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, oss.str() ); - if( !sectionTracker.isOpen() ) - return false; - m_activeSections.push_back( §ionTracker ); - - m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; - - m_reporter->sectionStarting( sectionInfo ); - - assertions = m_totals.assertions; - - return true; - } - bool testForMissingAssertions( Counts& assertions ) { - if( assertions.total() != 0 ) - return false; - if( !m_config->warnAboutMissingAssertions() ) - return false; - if( m_trackerContext.currentTracker().hasChildren() ) - return false; - m_totals.assertions.failed++; - assertions.failed++; - return true; - } - - virtual void sectionEnded( SectionEndInfo const& endInfo ) { - Counts assertions = m_totals.assertions - endInfo.prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( !m_activeSections.empty() ) { - m_activeSections.back()->close(); - m_activeSections.pop_back(); - } - - m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) ); - m_messages.clear(); - } - - virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) { - if( m_unfinishedSections.empty() ) - m_activeSections.back()->fail(); - else - m_activeSections.back()->close(); - m_activeSections.pop_back(); - - m_unfinishedSections.push_back( endInfo ); - } - - virtual void pushScopedMessage( MessageInfo const& message ) { - m_messages.push_back( message ); - } - - virtual void popScopedMessage( MessageInfo const& message ) { - m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); - } - - virtual std::string getCurrentTestName() const { - return m_activeTestCase - ? m_activeTestCase->getTestCaseInfo().name - : ""; - } - - virtual const AssertionResult* getLastResult() const { - return &m_lastResult; - } - - virtual void handleFatalErrorCondition( std::string const& message ) { - ResultBuilder resultBuilder = makeUnexpectedResultBuilder(); - resultBuilder.setResultType( ResultWas::FatalErrorCondition ); - resultBuilder << message; - resultBuilder.captureExpression(); - - handleUnfinishedSections(); - - // Recreate section for test case (as we will lose the one that was in scope) - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - - Counts assertions; - assertions.failed = 1; - SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false ); - m_reporter->sectionEnded( testCaseSectionStats ); - - TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo(); - - Totals deltaTotals; - deltaTotals.testCases.failed = 1; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - "", - "", - false ) ); - m_totals.testCases.failed++; - testGroupEnded( "", m_totals, 1, 1 ); - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) ); - } - - public: - // !TBD We need to do this another way! - bool aborting() const { - return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); - } - - private: - - void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - m_reporter->sectionStarting( testCaseSection ); - Counts prevAssertions = m_totals.assertions; - double duration = 0; - try { - m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); - - seedRng( *m_config ); - - Timer timer; - timer.start(); - if( m_reporter->getPreferences().shouldRedirectStdOut ) { - StreamRedirect coutRedir( Catch::cout(), redirectedCout ); - StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr ); - invokeActiveTestCase(); - } - else { - invokeActiveTestCase(); - } - duration = timer.getElapsedSeconds(); - } - catch( TestFailureException& ) { - // This just means the test was aborted due to failure - } - catch(...) { - makeUnexpectedResultBuilder().useActiveException(); - } - m_testCaseTracker->close(); - handleUnfinishedSections(); - m_messages.clear(); - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( testCaseInfo.okToFail() ) { - std::swap( assertions.failedButOk, assertions.failed ); - m_totals.assertions.failed -= assertions.failedButOk; - m_totals.assertions.failedButOk += assertions.failedButOk; - } - - SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); - m_reporter->sectionEnded( testCaseSectionStats ); - } - - void invokeActiveTestCase() { - FatalConditionHandler fatalConditionHandler; // Handle signals - m_activeTestCase->invoke(); - fatalConditionHandler.reset(); - } - - private: - - ResultBuilder makeUnexpectedResultBuilder() const { - return ResultBuilder( m_lastAssertionInfo.macroName.c_str(), - m_lastAssertionInfo.lineInfo, - m_lastAssertionInfo.capturedExpression.c_str(), - m_lastAssertionInfo.resultDisposition ); - } - - void handleUnfinishedSections() { - // If sections ended prematurely due to an exception we stored their - // infos here so we can tear them down outside the unwind process. - for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); - it != itEnd; - ++it ) - sectionEnded( *it ); - m_unfinishedSections.clear(); - } - - TestRunInfo m_runInfo; - IMutableContext& m_context; - TestCase const* m_activeTestCase; - ITracker* m_testCaseTracker; - ITracker* m_currentSectionTracker; - AssertionResult m_lastResult; - - Ptr m_config; - Totals m_totals; - Ptr m_reporter; - std::vector m_messages; - AssertionInfo m_lastAssertionInfo; - std::vector m_unfinishedSections; - std::vector m_activeSections; - TrackerContext m_trackerContext; - }; - - IResultCapture& getResultCapture() { - if( IResultCapture* capture = getCurrentContext().getResultCapture() ) - return *capture; - else - throw std::logic_error( "No result capture instance" ); - } - -} // end namespace Catch - -// #included from: internal/catch_version.h -#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED - -namespace Catch { - - // Versioning information - struct Version { - Version( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - std::string const& _branchName, - unsigned int _buildNumber ); - - unsigned int const majorVersion; - unsigned int const minorVersion; - unsigned int const patchNumber; - - // buildNumber is only used if branchName is not null - std::string const branchName; - unsigned int const buildNumber; - - friend std::ostream& operator << ( std::ostream& os, Version const& version ); - - private: - void operator=( Version const& ); - }; - - extern Version libraryVersion; -} - -#include -#include -#include - -namespace Catch { - - Ptr createReporter( std::string const& reporterName, Ptr const& config ) { - Ptr reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() ); - if( !reporter ) { - std::ostringstream oss; - oss << "No reporter registered with name: '" << reporterName << "'"; - throw std::domain_error( oss.str() ); - } - return reporter; - } - - Ptr makeReporter( Ptr const& config ) { - std::vector reporters = config->getReporterNames(); - if( reporters.empty() ) - reporters.push_back( "console" ); - - Ptr reporter; - for( std::vector::const_iterator it = reporters.begin(), itEnd = reporters.end(); - it != itEnd; - ++it ) - reporter = addReporter( reporter, createReporter( *it, config ) ); - return reporter; - } - Ptr addListeners( Ptr const& config, Ptr reporters ) { - IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); - for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); - it != itEnd; - ++it ) - reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); - return reporters; - } - - Totals runTests( Ptr const& config ) { - - Ptr iconfig = config.get(); - - Ptr reporter = makeReporter( config ); - reporter = addListeners( iconfig, reporter ); - - RunContext context( iconfig, reporter ); - - Totals totals; - - context.testGroupStarting( config->name(), 1, 1 ); - - TestSpec testSpec = config->testSpec(); - if( !testSpec.hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests - - std::vector const& allTestCases = getAllTestCasesSorted( *iconfig ); - for( std::vector::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end(); - it != itEnd; - ++it ) { - if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) ) - totals += context.runTest( *it ); - else - reporter->skipTest( *it ); - } - - context.testGroupEnded( iconfig->name(), totals, 1, 1 ); - return totals; - } - - void applyFilenamesAsTags( IConfig const& config ) { - std::vector const& tests = getAllTestCasesSorted( config ); - for(std::size_t i = 0; i < tests.size(); ++i ) { - TestCase& test = const_cast( tests[i] ); - std::set tags = test.tags; - - std::string filename = test.lineInfo.file; - std::string::size_type lastSlash = filename.find_last_of( "\\/" ); - if( lastSlash != std::string::npos ) - filename = filename.substr( lastSlash+1 ); - - std::string::size_type lastDot = filename.find_last_of( "." ); - if( lastDot != std::string::npos ) - filename = filename.substr( 0, lastDot ); - - tags.insert( "#" + filename ); - setTags( test, tags ); - } - } - - class Session : NonCopyable { - static bool alreadyInstantiated; - - public: - - struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; - - Session() - : m_cli( makeCommandLineParser() ) { - if( alreadyInstantiated ) { - std::string msg = "Only one instance of Catch::Session can ever be used"; - Catch::cerr() << msg << std::endl; - throw std::logic_error( msg ); - } - alreadyInstantiated = true; - } - ~Session() { - Catch::cleanUp(); - } - - void showHelp( std::string const& processName ) { - Catch::cout() << "\nCatch v" << libraryVersion << "\n"; - - m_cli.usage( Catch::cout(), processName ); - Catch::cout() << "For more detail usage please see the project docs\n" << std::endl; - } - - int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { - try { - m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData ); - if( m_configData.showHelp ) - showHelp( m_configData.processName ); - m_config.reset(); - } - catch( std::exception& ex ) { - { - Colour colourGuard( Colour::Red ); - Catch::cerr() - << "\nError(s) in input:\n" - << Text( ex.what(), TextAttributes().setIndent(2) ) - << "\n\n"; - } - m_cli.usage( Catch::cout(), m_configData.processName ); - return (std::numeric_limits::max)(); - } - return 0; - } - - void useConfigData( ConfigData const& _configData ) { - m_configData = _configData; - m_config.reset(); - } - - int run( int argc, char const* const* const argv ) { - - int returnCode = applyCommandLine( argc, argv ); - if( returnCode == 0 ) - returnCode = run(); - return returnCode; - } - - int run() { - if( m_configData.showHelp ) - return 0; - - try - { - config(); // Force config to be constructed - - seedRng( *m_config ); - - if( m_configData.filenamesAsTags ) - applyFilenamesAsTags( *m_config ); - - // Handle list request - if( Option listed = list( config() ) ) - return static_cast( *listed ); - - return static_cast( runTests( m_config ).assertions.failed ); - } - catch( std::exception& ex ) { - Catch::cerr() << ex.what() << std::endl; - return (std::numeric_limits::max)(); - } - } - - Clara::CommandLine const& cli() const { - return m_cli; - } - std::vector const& unusedTokens() const { - return m_unusedTokens; - } - ConfigData& configData() { - return m_configData; - } - Config& config() { - if( !m_config ) - m_config = new Config( m_configData ); - return *m_config; - } - private: - Clara::CommandLine m_cli; - std::vector m_unusedTokens; - ConfigData m_configData; - Ptr m_config; - }; - - bool Session::alreadyInstantiated = false; - -} // end namespace Catch - -// #included from: catch_registry_hub.hpp -#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED - -// #included from: catch_test_case_registry_impl.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#ifdef CATCH_CPP14_OR_GREATER -#include -#endif - -namespace Catch { - - struct RandomNumberGenerator { - typedef int result_type; - - result_type operator()( result_type n ) const { return std::rand() % n; } - -#ifdef CATCH_CPP14_OR_GREATER - static constexpr result_type min() { return 0; } - static constexpr result_type max() { return 1000000; } - result_type operator()() const { return std::rand() % max(); } -#endif - template - static void shuffle( V& vector ) { - RandomNumberGenerator rng; -#ifdef CATCH_CPP14_OR_GREATER - std::shuffle( vector.begin(), vector.end(), rng ); -#else - std::random_shuffle( vector.begin(), vector.end(), rng ); -#endif - } - }; - - inline std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { - - std::vector sorted = unsortedTestCases; - - switch( config.runOrder() ) { - case RunTests::InLexicographicalOrder: - std::sort( sorted.begin(), sorted.end() ); - break; - case RunTests::InRandomOrder: - { - seedRng( config ); - RandomNumberGenerator::shuffle( sorted ); - } - break; - case RunTests::InDeclarationOrder: - // already in declaration order - break; - } - return sorted; - } - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { - return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); - } - - void enforceNoDuplicateTestCases( std::vector const& functions ) { - std::set seenFunctions; - for( std::vector::const_iterator it = functions.begin(), itEnd = functions.end(); - it != itEnd; - ++it ) { - std::pair::const_iterator, bool> prev = seenFunctions.insert( *it ); - if( !prev.second ) { - std::ostringstream ss; - - ss << Colour( Colour::Red ) - << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl; - - throw std::runtime_error(ss.str()); - } - } - } - - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ) { - std::vector filtered; - filtered.reserve( testCases.size() ); - for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); - it != itEnd; - ++it ) - if( matchTest( *it, testSpec, config ) ) - filtered.push_back( *it ); - return filtered; - } - std::vector const& getAllTestCasesSorted( IConfig const& config ) { - return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); - } - - class TestRegistry : public ITestCaseRegistry { - public: - TestRegistry() - : m_currentSortOrder( RunTests::InDeclarationOrder ), - m_unnamedCount( 0 ) - {} - virtual ~TestRegistry(); - - virtual void registerTest( TestCase const& testCase ) { - std::string name = testCase.getTestCaseInfo().name; - if( name == "" ) { - std::ostringstream oss; - oss << "Anonymous test case " << ++m_unnamedCount; - return registerTest( testCase.withName( oss.str() ) ); - } - m_functions.push_back( testCase ); - } - - virtual std::vector const& getAllTests() const { - return m_functions; - } - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const { - if( m_sortedFunctions.empty() ) - enforceNoDuplicateTestCases( m_functions ); - - if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { - m_sortedFunctions = sortTests( config, m_functions ); - m_currentSortOrder = config.runOrder(); - } - return m_sortedFunctions; - } - - private: - std::vector m_functions; - mutable RunTests::InWhatOrder m_currentSortOrder; - mutable std::vector m_sortedFunctions; - size_t m_unnamedCount; - std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised - }; - - /////////////////////////////////////////////////////////////////////////// - - class FreeFunctionTestCase : public SharedImpl { - public: - - FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} - - virtual void invoke() const { - m_fun(); - } - - private: - virtual ~FreeFunctionTestCase(); - - TestFunction m_fun; - }; - - inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { - std::string className = classOrQualifiedMethodName; - if( startsWith( className, "&" ) ) - { - std::size_t lastColons = className.rfind( "::" ); - std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); - if( penultimateColons == std::string::npos ) - penultimateColons = 1; - className = className.substr( penultimateColons, lastColons-penultimateColons ); - } - return className; - } - - void registerTestCase - ( ITestCase* testCase, - char const* classOrQualifiedMethodName, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - getMutableRegistryHub().registerTest - ( makeTestCase - ( testCase, - extractClassName( classOrQualifiedMethodName ), - nameAndDesc.name, - nameAndDesc.description, - lineInfo ) ); - } - void registerTestCaseFunction - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); - } - - /////////////////////////////////////////////////////////////////////////// - - AutoReg::AutoReg - ( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCaseFunction( function, lineInfo, nameAndDesc ); - } - - AutoReg::~AutoReg() {} - -} // end namespace Catch - -// #included from: catch_reporter_registry.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED - -#include - -namespace Catch { - - class ReporterRegistry : public IReporterRegistry { - - public: - - virtual ~ReporterRegistry() CATCH_OVERRIDE {} - - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const CATCH_OVERRIDE { - FactoryMap::const_iterator it = m_factories.find( name ); - if( it == m_factories.end() ) - return CATCH_NULL; - return it->second->create( ReporterConfig( config ) ); - } - - void registerReporter( std::string const& name, Ptr const& factory ) { - m_factories.insert( std::make_pair( name, factory ) ); - } - void registerListener( Ptr const& factory ) { - m_listeners.push_back( factory ); - } - - virtual FactoryMap const& getFactories() const CATCH_OVERRIDE { - return m_factories; - } - virtual Listeners const& getListeners() const CATCH_OVERRIDE { - return m_listeners; - } - - private: - FactoryMap m_factories; - Listeners m_listeners; - }; -} - -// #included from: catch_exception_translator_registry.hpp -#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED - -#ifdef __OBJC__ -#import "Foundation/Foundation.h" -#endif - -namespace Catch { - - class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { - public: - ~ExceptionTranslatorRegistry() { - deleteAll( m_translators ); - } - - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_translators.push_back( translator ); - } - - virtual std::string translateActiveException() const { - try { -#ifdef __OBJC__ - // In Objective-C try objective-c exceptions first - @try { - return tryTranslators(); - } - @catch (NSException *exception) { - return Catch::toString( [exception description] ); - } -#else - return tryTranslators(); -#endif - } - catch( TestFailureException& ) { - throw; - } - catch( std::exception& ex ) { - return ex.what(); - } - catch( std::string& msg ) { - return msg; - } - catch( const char* msg ) { - return msg; - } - catch(...) { - return "Unknown exception"; - } - } - - std::string tryTranslators() const { - if( m_translators.empty() ) - throw; - else - return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); - } - - private: - std::vector m_translators; - }; -} - -namespace Catch { - - namespace { - - class RegistryHub : public IRegistryHub, public IMutableRegistryHub { - - RegistryHub( RegistryHub const& ); - void operator=( RegistryHub const& ); - - public: // IRegistryHub - RegistryHub() { - } - virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE { - return m_reporterRegistry; - } - virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE { - return m_testCaseRegistry; - } - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE { - return m_exceptionTranslatorRegistry; - } - - public: // IMutableRegistryHub - virtual void registerReporter( std::string const& name, Ptr const& factory ) CATCH_OVERRIDE { - m_reporterRegistry.registerReporter( name, factory ); - } - virtual void registerListener( Ptr const& factory ) CATCH_OVERRIDE { - m_reporterRegistry.registerListener( factory ); - } - virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE { - m_testCaseRegistry.registerTest( testInfo ); - } - virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE { - m_exceptionTranslatorRegistry.registerTranslator( translator ); - } - - private: - TestRegistry m_testCaseRegistry; - ReporterRegistry m_reporterRegistry; - ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; - }; - - // Single, global, instance - inline RegistryHub*& getTheRegistryHub() { - static RegistryHub* theRegistryHub = CATCH_NULL; - if( !theRegistryHub ) - theRegistryHub = new RegistryHub(); - return theRegistryHub; - } - } - - IRegistryHub& getRegistryHub() { - return *getTheRegistryHub(); - } - IMutableRegistryHub& getMutableRegistryHub() { - return *getTheRegistryHub(); - } - void cleanUp() { - delete getTheRegistryHub(); - getTheRegistryHub() = CATCH_NULL; - cleanUpContext(); - } - std::string translateActiveException() { - return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); - } - -} // end namespace Catch - -// #included from: catch_notimplemented_exception.hpp -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED - -#include - -namespace Catch { - - NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) - : m_lineInfo( lineInfo ) { - std::ostringstream oss; - oss << lineInfo << ": function "; - oss << "not implemented"; - m_what = oss.str(); - } - - const char* NotImplementedException::what() const CATCH_NOEXCEPT { - return m_what.c_str(); - } - -} // end namespace Catch - -// #included from: catch_context_impl.hpp -#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED - -// #included from: catch_stream.hpp -#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - template - class StreamBufImpl : public StreamBufBase { - char data[bufferSize]; - WriterF m_writer; - - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } - - ~StreamBufImpl() CATCH_NOEXCEPT { - sync(); - } - - private: - int overflow( int c ) { - sync(); - - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); - } - return 0; - } - - int sync() { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); - } - return 0; - } - }; - - /////////////////////////////////////////////////////////////////////////// - - FileStream::FileStream( std::string const& filename ) { - m_ofs.open( filename.c_str() ); - if( m_ofs.fail() ) { - std::ostringstream oss; - oss << "Unable to open file: '" << filename << "'"; - throw std::domain_error( oss.str() ); - } - } - - std::ostream& FileStream::stream() const { - return m_ofs; - } - - struct OutputDebugWriter { - - void operator()( std::string const&str ) { - writeToDebugConsole( str ); - } - }; - - DebugOutStream::DebugOutStream() - : m_streamBuf( new StreamBufImpl() ), - m_os( m_streamBuf.get() ) - {} - - std::ostream& DebugOutStream::stream() const { - return m_os; - } - - // Store the streambuf from cout up-front because - // cout may get redirected when running tests - CoutStream::CoutStream() - : m_os( Catch::cout().rdbuf() ) - {} - - std::ostream& CoutStream::stream() const { - return m_os; - } - -#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions - std::ostream& cout() { - return std::cout; - } - std::ostream& cerr() { - return std::cerr; - } -#endif -} - -namespace Catch { - - class Context : public IMutableContext { - - Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {} - Context( Context const& ); - void operator=( Context const& ); - - public: // IContext - virtual IResultCapture* getResultCapture() { - return m_resultCapture; - } - virtual IRunner* getRunner() { - return m_runner; - } - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { - return getGeneratorsForCurrentTest() - .getGeneratorInfo( fileInfo, totalSize ) - .getCurrentIndex(); - } - virtual bool advanceGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - return generators && generators->moveNext(); - } - - virtual Ptr getConfig() const { - return m_config; - } - - public: // IMutableContext - virtual void setResultCapture( IResultCapture* resultCapture ) { - m_resultCapture = resultCapture; - } - virtual void setRunner( IRunner* runner ) { - m_runner = runner; - } - virtual void setConfig( Ptr const& config ) { - m_config = config; - } - - friend IMutableContext& getCurrentMutableContext(); - - private: - IGeneratorsForTest* findGeneratorsForCurrentTest() { - std::string testName = getResultCapture()->getCurrentTestName(); - - std::map::const_iterator it = - m_generatorsByTestName.find( testName ); - return it != m_generatorsByTestName.end() - ? it->second - : CATCH_NULL; - } - - IGeneratorsForTest& getGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - if( !generators ) { - std::string testName = getResultCapture()->getCurrentTestName(); - generators = createGeneratorsForTest(); - m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); - } - return *generators; - } - - private: - Ptr m_config; - IRunner* m_runner; - IResultCapture* m_resultCapture; - std::map m_generatorsByTestName; - }; - - namespace { - Context* currentContext = CATCH_NULL; - } - IMutableContext& getCurrentMutableContext() { - if( !currentContext ) - currentContext = new Context(); - return *currentContext; - } - IContext& getCurrentContext() { - return getCurrentMutableContext(); - } - - void cleanUpContext() { - delete currentContext; - currentContext = CATCH_NULL; - } -} - -// #included from: catch_console_colour_impl.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED - -namespace Catch { - namespace { - - struct IColourImpl { - virtual ~IColourImpl() {} - virtual void use( Colour::Code _colourCode ) = 0; - }; - - struct NoColourImpl : IColourImpl { - void use( Colour::Code ) {} - - static IColourImpl* instance() { - static NoColourImpl s_instance; - return &s_instance; - } - }; - - } // anon namespace -} // namespace Catch - -#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) -# ifdef CATCH_PLATFORM_WINDOWS -# define CATCH_CONFIG_COLOUR_WINDOWS -# else -# define CATCH_CONFIG_COLOUR_ANSI -# endif -#endif - -#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// - -#ifndef NOMINMAX -#define NOMINMAX -#endif - -#ifdef __AFXDLL -#include -#else -#include -#endif - -namespace Catch { -namespace { - - class Win32ColourImpl : public IColourImpl { - public: - Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) - { - CONSOLE_SCREEN_BUFFER_INFO csbiInfo; - GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); - originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); - originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); - } - - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: return setTextAttribute( originalForegroundAttributes ); - case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - case Colour::Red: return setTextAttribute( FOREGROUND_RED ); - case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); - case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); - case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); - case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); - case Colour::Grey: return setTextAttribute( 0 ); - - case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); - case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); - case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); - case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - - private: - void setTextAttribute( WORD _textAttribute ) { - SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); - } - HANDLE stdoutHandle; - WORD originalForegroundAttributes; - WORD originalBackgroundAttributes; - }; - - IColourImpl* platformColourInstance() { - static Win32ColourImpl s_instance; - - Ptr config = getCurrentContext().getConfig(); - UseColour::YesOrNo colourMode = config - ? config->useColour() - : UseColour::Auto; - if( colourMode == UseColour::Auto ) - colourMode = !isDebuggerActive() - ? UseColour::Yes - : UseColour::No; - return colourMode == UseColour::Yes - ? &s_instance - : NoColourImpl::instance(); - } - -} // end anon namespace -} // end namespace Catch - -#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// - -#include - -namespace Catch { -namespace { - - // use POSIX/ ANSI console terminal codes - // Thanks to Adam Strzelecki for original contribution - // (http://github.com/nanoant) - // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public IColourImpl { - public: - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: - case Colour::White: return setColour( "[0m" ); - case Colour::Red: return setColour( "[0;31m" ); - case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0:34m" ); - case Colour::Cyan: return setColour( "[0;36m" ); - case Colour::Yellow: return setColour( "[0;33m" ); - case Colour::Grey: return setColour( "[1;30m" ); - - case Colour::LightGrey: return setColour( "[0;37m" ); - case Colour::BrightRed: return setColour( "[1;31m" ); - case Colour::BrightGreen: return setColour( "[1;32m" ); - case Colour::BrightWhite: return setColour( "[1;37m" ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - static IColourImpl* instance() { - static PosixColourImpl s_instance; - return &s_instance; - } - - private: - void setColour( const char* _escapeCode ) { - Catch::cout() << '\033' << _escapeCode; - } - }; - - IColourImpl* platformColourInstance() { - Ptr config = getCurrentContext().getConfig(); - UseColour::YesOrNo colourMode = config - ? config->useColour() - : UseColour::Auto; - if( colourMode == UseColour::Auto ) - colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) ) - ? UseColour::Yes - : UseColour::No; - return colourMode == UseColour::Yes - ? PosixColourImpl::instance() - : NoColourImpl::instance(); - } - -} // end anon namespace -} // end namespace Catch - -#else // not Windows or ANSI /////////////////////////////////////////////// - -namespace Catch { - - static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } - -} // end namespace Catch - -#endif // Windows/ ANSI/ None - -namespace Catch { - - Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } - Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } - Colour::~Colour(){ if( !m_moved ) use( None ); } - - void Colour::use( Code _colourCode ) { - static IColourImpl* impl = platformColourInstance(); - impl->use( _colourCode ); - } - -} // end namespace Catch - -// #included from: catch_generators_impl.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct GeneratorInfo : IGeneratorInfo { - - GeneratorInfo( std::size_t size ) - : m_size( size ), - m_currentIndex( 0 ) - {} - - bool moveNext() { - if( ++m_currentIndex == m_size ) { - m_currentIndex = 0; - return false; - } - return true; - } - - std::size_t getCurrentIndex() const { - return m_currentIndex; - } - - std::size_t m_size; - std::size_t m_currentIndex; - }; - - /////////////////////////////////////////////////////////////////////////// - - class GeneratorsForTest : public IGeneratorsForTest { - - public: - ~GeneratorsForTest() { - deleteAll( m_generatorsInOrder ); - } - - IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { - std::map::const_iterator it = m_generatorsByName.find( fileInfo ); - if( it == m_generatorsByName.end() ) { - IGeneratorInfo* info = new GeneratorInfo( size ); - m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); - m_generatorsInOrder.push_back( info ); - return *info; - } - return *it->second; - } - - bool moveNext() { - std::vector::const_iterator it = m_generatorsInOrder.begin(); - std::vector::const_iterator itEnd = m_generatorsInOrder.end(); - for(; it != itEnd; ++it ) { - if( (*it)->moveNext() ) - return true; - } - return false; - } - - private: - std::map m_generatorsByName; - std::vector m_generatorsInOrder; - }; - - IGeneratorsForTest* createGeneratorsForTest() - { - return new GeneratorsForTest(); - } - -} // end namespace Catch - -// #included from: catch_assertionresult.hpp -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED - -namespace Catch { - - AssertionInfo::AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - capturedExpression( _capturedExpression ), - resultDisposition( _resultDisposition ) - {} - - AssertionResult::AssertionResult() {} - - AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) - : m_info( info ), - m_resultData( data ) - {} - - AssertionResult::~AssertionResult() {} - - // Result was a success - bool AssertionResult::succeeded() const { - return Catch::isOk( m_resultData.resultType ); - } - - // Result was a success, or failure is suppressed - bool AssertionResult::isOk() const { - return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); - } - - ResultWas::OfType AssertionResult::getResultType() const { - return m_resultData.resultType; - } - - bool AssertionResult::hasExpression() const { - return !m_info.capturedExpression.empty(); - } - - bool AssertionResult::hasMessage() const { - return !m_resultData.message.empty(); - } - - std::string AssertionResult::getExpression() const { - if( isFalseTest( m_info.resultDisposition ) ) - return "!" + m_info.capturedExpression; - else - return m_info.capturedExpression; - } - std::string AssertionResult::getExpressionInMacro() const { - if( m_info.macroName.empty() ) - return m_info.capturedExpression; - else - return m_info.macroName + "( " + m_info.capturedExpression + " )"; - } - - bool AssertionResult::hasExpandedExpression() const { - return hasExpression() && getExpandedExpression() != getExpression(); - } - - std::string AssertionResult::getExpandedExpression() const { - return m_resultData.reconstructedExpression; - } - - std::string AssertionResult::getMessage() const { - return m_resultData.message; - } - SourceLineInfo AssertionResult::getSourceInfo() const { - return m_info.lineInfo; - } - - std::string AssertionResult::getTestMacroName() const { - return m_info.macroName; - } - -} // end namespace Catch - -// #included from: catch_test_case_info.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED - -namespace Catch { - - inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { - if( startsWith( tag, "." ) || - tag == "hide" || - tag == "!hide" ) - return TestCaseInfo::IsHidden; - else if( tag == "!throws" ) - return TestCaseInfo::Throws; - else if( tag == "!shouldfail" ) - return TestCaseInfo::ShouldFail; - else if( tag == "!mayfail" ) - return TestCaseInfo::MayFail; - else - return TestCaseInfo::None; - } - inline bool isReservedTag( std::string const& tag ) { - return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] ); - } - inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { - if( isReservedTag( tag ) ) { - { - Colour colourGuard( Colour::Red ); - Catch::cerr() - << "Tag name [" << tag << "] not allowed.\n" - << "Tag names starting with non alpha-numeric characters are reserved\n"; - } - { - Colour colourGuard( Colour::FileName ); - Catch::cerr() << _lineInfo << std::endl; - } - exit(1); - } - } - - TestCase makeTestCase( ITestCase* _testCase, - std::string const& _className, - std::string const& _name, - std::string const& _descOrTags, - SourceLineInfo const& _lineInfo ) - { - bool isHidden( startsWith( _name, "./" ) ); // Legacy support - - // Parse out tags - std::set tags; - std::string desc, tag; - bool inTag = false; - for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { - char c = _descOrTags[i]; - if( !inTag ) { - if( c == '[' ) - inTag = true; - else - desc += c; - } - else { - if( c == ']' ) { - TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); - if( prop == TestCaseInfo::IsHidden ) - isHidden = true; - else if( prop == TestCaseInfo::None ) - enforceNotReservedTag( tag, _lineInfo ); - - tags.insert( tag ); - tag.clear(); - inTag = false; - } - else - tag += c; - } - } - if( isHidden ) { - tags.insert( "hide" ); - tags.insert( "." ); - } - - TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); - return TestCase( _testCase, info ); - } - - void setTags( TestCaseInfo& testCaseInfo, std::set const& tags ) - { - testCaseInfo.tags = tags; - testCaseInfo.lcaseTags.clear(); - - std::ostringstream oss; - for( std::set::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) { - oss << "[" << *it << "]"; - std::string lcaseTag = toLower( *it ); - testCaseInfo.properties = static_cast( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); - testCaseInfo.lcaseTags.insert( lcaseTag ); - } - testCaseInfo.tagsAsString = oss.str(); - } - - TestCaseInfo::TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ) - : name( _name ), - className( _className ), - description( _description ), - lineInfo( _lineInfo ), - properties( None ) - { - setTags( *this, _tags ); - } - - TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) - : name( other.name ), - className( other.className ), - description( other.description ), - tags( other.tags ), - lcaseTags( other.lcaseTags ), - tagsAsString( other.tagsAsString ), - lineInfo( other.lineInfo ), - properties( other.properties ) - {} - - bool TestCaseInfo::isHidden() const { - return ( properties & IsHidden ) != 0; - } - bool TestCaseInfo::throws() const { - return ( properties & Throws ) != 0; - } - bool TestCaseInfo::okToFail() const { - return ( properties & (ShouldFail | MayFail ) ) != 0; - } - bool TestCaseInfo::expectedToFail() const { - return ( properties & (ShouldFail ) ) != 0; - } - - TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} - - TestCase::TestCase( TestCase const& other ) - : TestCaseInfo( other ), - test( other.test ) - {} - - TestCase TestCase::withName( std::string const& _newName ) const { - TestCase other( *this ); - other.name = _newName; - return other; - } - - void TestCase::swap( TestCase& other ) { - test.swap( other.test ); - name.swap( other.name ); - className.swap( other.className ); - description.swap( other.description ); - tags.swap( other.tags ); - lcaseTags.swap( other.lcaseTags ); - tagsAsString.swap( other.tagsAsString ); - std::swap( TestCaseInfo::properties, static_cast( other ).properties ); - std::swap( lineInfo, other.lineInfo ); - } - - void TestCase::invoke() const { - test->invoke(); - } - - bool TestCase::operator == ( TestCase const& other ) const { - return test.get() == other.test.get() && - name == other.name && - className == other.className; - } - - bool TestCase::operator < ( TestCase const& other ) const { - return name < other.name; - } - TestCase& TestCase::operator = ( TestCase const& other ) { - TestCase temp( other ); - swap( temp ); - return *this; - } - - TestCaseInfo const& TestCase::getTestCaseInfo() const - { - return *this; - } - -} // end namespace Catch - -// #included from: catch_version.hpp -#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED - -namespace Catch { - - Version::Version - ( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - std::string const& _branchName, - unsigned int _buildNumber ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - patchNumber( _patchNumber ), - branchName( _branchName ), - buildNumber( _buildNumber ) - {} - - std::ostream& operator << ( std::ostream& os, Version const& version ) { - os << version.majorVersion << "." - << version.minorVersion << "." - << version.patchNumber; - - if( !version.branchName.empty() ) { - os << "-" << version.branchName - << "." << version.buildNumber; - } - return os; - } - - Version libraryVersion( 1, 5, 7, "", 0 ); - -} - -// #included from: catch_message.hpp -#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED - -namespace Catch { - - MessageInfo::MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - type( _type ), - sequence( ++globalCount ) - {} - - // This may need protecting if threading support is added - unsigned int MessageInfo::globalCount = 0; - - //////////////////////////////////////////////////////////////////////////// - - ScopedMessage::ScopedMessage( MessageBuilder const& builder ) - : m_info( builder.m_info ) - { - m_info.message = builder.m_stream.str(); - getResultCapture().pushScopedMessage( m_info ); - } - ScopedMessage::ScopedMessage( ScopedMessage const& other ) - : m_info( other.m_info ) - {} - - ScopedMessage::~ScopedMessage() { - getResultCapture().popScopedMessage( m_info ); - } - -} // end namespace Catch - -// #included from: catch_legacy_reporter_adapter.hpp -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED - -// #included from: catch_legacy_reporter_adapter.h -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED - -namespace Catch -{ - // Deprecated - struct IReporter : IShared { - virtual ~IReporter(); - - virtual bool shouldRedirectStdout() const = 0; - - virtual void StartTesting() = 0; - virtual void EndTesting( Totals const& totals ) = 0; - virtual void StartGroup( std::string const& groupName ) = 0; - virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; - virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; - virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; - virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; - virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; - virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; - virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; - virtual void Aborted() = 0; - virtual void Result( AssertionResult const& result ) = 0; - }; - - class LegacyReporterAdapter : public SharedImpl - { - public: - LegacyReporterAdapter( Ptr const& legacyReporter ); - virtual ~LegacyReporterAdapter(); - - virtual ReporterPreferences getPreferences() const; - virtual void noMatchingTestCases( std::string const& ); - virtual void testRunStarting( TestRunInfo const& ); - virtual void testGroupStarting( GroupInfo const& groupInfo ); - virtual void testCaseStarting( TestCaseInfo const& testInfo ); - virtual void sectionStarting( SectionInfo const& sectionInfo ); - virtual void assertionStarting( AssertionInfo const& ); - virtual bool assertionEnded( AssertionStats const& assertionStats ); - virtual void sectionEnded( SectionStats const& sectionStats ); - virtual void testCaseEnded( TestCaseStats const& testCaseStats ); - virtual void testGroupEnded( TestGroupStats const& testGroupStats ); - virtual void testRunEnded( TestRunStats const& testRunStats ); - virtual void skipTest( TestCaseInfo const& ); - - private: - Ptr m_legacyReporter; - }; -} - -namespace Catch -{ - LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) - : m_legacyReporter( legacyReporter ) - {} - LegacyReporterAdapter::~LegacyReporterAdapter() {} - - ReporterPreferences LegacyReporterAdapter::getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); - return prefs; - } - - void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} - void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { - m_legacyReporter->StartTesting(); - } - void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { - m_legacyReporter->StartGroup( groupInfo.name ); - } - void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { - m_legacyReporter->StartTestCase( testInfo ); - } - void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { - m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); - } - void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { - // Not on legacy interface - } - - bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); - rb << it->message; - rb.setResultType( ResultWas::Info ); - AssertionResult result = rb.build(); - m_legacyReporter->Result( result ); - } - } - } - m_legacyReporter->Result( assertionStats.assertionResult ); - return true; - } - void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { - if( sectionStats.missingAssertions ) - m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); - m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); - } - void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { - m_legacyReporter->EndTestCase - ( testCaseStats.testInfo, - testCaseStats.totals, - testCaseStats.stdOut, - testCaseStats.stdErr ); - } - void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { - if( testGroupStats.aborting ) - m_legacyReporter->Aborted(); - m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); - } - void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { - m_legacyReporter->EndTesting( testRunStats.totals ); - } - void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) { - } -} - -// #included from: catch_timer.hpp - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc++11-long-long" -#endif - -#ifdef CATCH_PLATFORM_WINDOWS -#include -#else -#include -#endif - -namespace Catch { - - namespace { -#ifdef CATCH_PLATFORM_WINDOWS - uint64_t getCurrentTicks() { - static uint64_t hz=0, hzo=0; - if (!hz) { - QueryPerformanceFrequency( reinterpret_cast( &hz ) ); - QueryPerformanceCounter( reinterpret_cast( &hzo ) ); - } - uint64_t t; - QueryPerformanceCounter( reinterpret_cast( &t ) ); - return ((t-hzo)*1000000)/hz; - } -#else - uint64_t getCurrentTicks() { - timeval t; - gettimeofday(&t,CATCH_NULL); - return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); - } -#endif - } - - void Timer::start() { - m_ticks = getCurrentTicks(); - } - unsigned int Timer::getElapsedMicroseconds() const { - return static_cast(getCurrentTicks() - m_ticks); - } - unsigned int Timer::getElapsedMilliseconds() const { - return static_cast(getElapsedMicroseconds()/1000); - } - double Timer::getElapsedSeconds() const { - return getElapsedMicroseconds()/1000000.0; - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -// #included from: catch_common.hpp -#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED - -namespace Catch { - - bool startsWith( std::string const& s, std::string const& prefix ) { - return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; - } - bool endsWith( std::string const& s, std::string const& suffix ) { - return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; - } - bool contains( std::string const& s, std::string const& infix ) { - return s.find( infix ) != std::string::npos; - } - void toLowerInPlace( std::string& s ) { - std::transform( s.begin(), s.end(), s.begin(), ::tolower ); - } - std::string toLower( std::string const& s ) { - std::string lc = s; - toLowerInPlace( lc ); - return lc; - } - std::string trim( std::string const& str ) { - static char const* whitespaceChars = "\n\r\t "; - std::string::size_type start = str.find_first_not_of( whitespaceChars ); - std::string::size_type end = str.find_last_not_of( whitespaceChars ); - - return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; - } - - bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { - bool replaced = false; - std::size_t i = str.find( replaceThis ); - while( i != std::string::npos ) { - replaced = true; - str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); - if( i < str.size()-withThis.size() ) - i = str.find( replaceThis, i+withThis.size() ); - else - i = std::string::npos; - } - return replaced; - } - - pluralise::pluralise( std::size_t count, std::string const& label ) - : m_count( count ), - m_label( label ) - {} - - std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { - os << pluraliser.m_count << " " << pluraliser.m_label; - if( pluraliser.m_count != 1 ) - os << "s"; - return os; - } - - SourceLineInfo::SourceLineInfo() : line( 0 ){} - SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) - : file( _file ), - line( _line ) - {} - SourceLineInfo::SourceLineInfo( SourceLineInfo const& other ) - : file( other.file ), - line( other.line ) - {} - bool SourceLineInfo::empty() const { - return file.empty(); - } - bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { - return line == other.line && file == other.file; - } - bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { - return line < other.line || ( line == other.line && file < other.file ); - } - - void seedRng( IConfig const& config ) { - if( config.rngSeed() != 0 ) - std::srand( config.rngSeed() ); - } - unsigned int rngSeed() { - return getCurrentContext().getConfig()->rngSeed(); - } - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { -#ifndef __GNUG__ - os << info.file << "(" << info.line << ")"; -#else - os << info.file << ":" << info.line; -#endif - return os; - } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { - std::ostringstream oss; - oss << locationInfo << ": Internal Catch error: '" << message << "'"; - if( alwaysTrue() ) - throw std::logic_error( oss.str() ); - } -} - -// #included from: catch_section.hpp -#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED - -namespace Catch { - - SectionInfo::SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description ) - : name( _name ), - description( _description ), - lineInfo( _lineInfo ) - {} - - Section::Section( SectionInfo const& info ) - : m_info( info ), - m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) - { - m_timer.start(); - } - - Section::~Section() { - if( m_sectionIncluded ) { - SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); - if( std::uncaught_exception() ) - getResultCapture().sectionEndedEarly( endInfo ); - else - getResultCapture().sectionEnded( endInfo ); - } - } - - // This indicates whether the section should be executed or not - Section::operator bool() const { - return m_sectionIncluded; - } - -} // end namespace Catch - -// #included from: catch_debugger.hpp -#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED - -#include - -#ifdef CATCH_PLATFORM_MAC - - #include - #include - #include - #include - #include - - namespace Catch{ - - // The following function is taken directly from the following technical note: - // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html - - // Returns true if the current process is being debugged (either - // running under the debugger or has a debugger attached post facto). - bool isDebuggerActive(){ - - int mib[4]; - struct kinfo_proc info; - size_t size; - - // Initialize the flags so that, if sysctl fails for some bizarre - // reason, we get a predictable result. - - info.kp_proc.p_flag = 0; - - // Initialize mib, which tells sysctl the info we want, in this case - // we're looking for information about a specific process ID. - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - // Call sysctl. - - size = sizeof(info); - if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) { - Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; - return false; - } - - // We're being debugged if the P_TRACED flag is set. - - return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); - } - } // namespace Catch - -#elif defined(_MSC_VER) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#else - namespace Catch { - inline bool isDebuggerActive() { return false; } - } -#endif // Platform - -#ifdef CATCH_PLATFORM_WINDOWS - extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - ::OutputDebugStringA( text.c_str() ); - } - } -#else - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - // !TBD: Need a version for Mac/ XCode and other IDEs - Catch::cout() << text; - } - } -#endif // Platform - -// #included from: catch_tostring.hpp -#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED - -namespace Catch { - -namespace Detail { - - const std::string unprintableString = "{?}"; - - namespace { - const int hexThreshold = 255; - - struct Endianness { - enum Arch { Big, Little }; - - static Arch which() { - union _{ - int asInt; - char asChar[sizeof (int)]; - } u; - - u.asInt = 1; - return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; - } - }; - } - - std::string rawMemoryToString( const void *object, std::size_t size ) - { - // Reverse order for little endian architectures - int i = 0, end = static_cast( size ), inc = 1; - if( Endianness::which() == Endianness::Little ) { - i = end-1; - end = inc = -1; - } - - unsigned char const *bytes = static_cast(object); - std::ostringstream os; - os << "0x" << std::setfill('0') << std::hex; - for( ; i != end; i += inc ) - os << std::setw(2) << static_cast(bytes[i]); - return os.str(); - } -} - -std::string toString( std::string const& value ) { - std::string s = value; - if( getCurrentContext().getConfig()->showInvisibles() ) { - for(size_t i = 0; i < s.size(); ++i ) { - std::string subs; - switch( s[i] ) { - case '\n': subs = "\\n"; break; - case '\t': subs = "\\t"; break; - default: break; - } - if( !subs.empty() ) { - s = s.substr( 0, i ) + subs + s.substr( i+1 ); - ++i; - } - } - } - return "\"" + s + "\""; -} -std::string toString( std::wstring const& value ) { - - std::string s; - s.reserve( value.size() ); - for(size_t i = 0; i < value.size(); ++i ) - s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; - return Catch::toString( s ); -} - -std::string toString( const char* const value ) { - return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); -} - -std::string toString( char* const value ) { - return Catch::toString( static_cast( value ) ); -} - -std::string toString( const wchar_t* const value ) -{ - return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" ); -} - -std::string toString( wchar_t* const value ) -{ - return Catch::toString( static_cast( value ) ); -} - -std::string toString( int value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ")"; - return oss.str(); -} - -std::string toString( unsigned long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ")"; - return oss.str(); -} - -std::string toString( unsigned int value ) { - return Catch::toString( static_cast( value ) ); -} - -template -std::string fpToString( T value, int precision ) { - std::ostringstream oss; - oss << std::setprecision( precision ) - << std::fixed - << value; - std::string d = oss.str(); - std::size_t i = d.find_last_not_of( '0' ); - if( i != std::string::npos && i != d.size()-1 ) { - if( d[i] == '.' ) - i++; - d = d.substr( 0, i+1 ); - } - return d; -} - -std::string toString( const double value ) { - return fpToString( value, 10 ); -} -std::string toString( const float value ) { - return fpToString( value, 5 ) + "f"; -} - -std::string toString( bool value ) { - return value ? "true" : "false"; -} - -std::string toString( char value ) { - return value < ' ' - ? toString( static_cast( value ) ) - : Detail::makeString( value ); -} - -std::string toString( signed char value ) { - return toString( static_cast( value ) ); -} - -std::string toString( unsigned char value ) { - return toString( static_cast( value ) ); -} - -#ifdef CATCH_CONFIG_CPP11_LONG_LONG -std::string toString( long long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ")"; - return oss.str(); -} -std::string toString( unsigned long long value ) { - std::ostringstream oss; - oss << value; - if( value > Detail::hexThreshold ) - oss << " (0x" << std::hex << value << ")"; - return oss.str(); -} -#endif - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ) { - return "nullptr"; -} -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSObject* const& nsObject ) { - return toString( [nsObject description] ); - } -#endif - -} // end namespace Catch - -// #included from: catch_result_builder.hpp -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED - -namespace Catch { - - std::string capturedExpressionWithSecondArgument( std::string const& capturedExpression, std::string const& secondArg ) { - return secondArg.empty() || secondArg == "\"\"" - ? capturedExpression - : capturedExpression + ", " + secondArg; - } - ResultBuilder::ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition, - char const* secondArg ) - : m_assertionInfo( macroName, lineInfo, capturedExpressionWithSecondArgument( capturedExpression, secondArg ), resultDisposition ), - m_shouldDebugBreak( false ), - m_shouldThrow( false ) - {} - - ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { - m_data.resultType = result; - return *this; - } - ResultBuilder& ResultBuilder::setResultType( bool result ) { - m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; - return *this; - } - ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) { - m_exprComponents.lhs = lhs; - return *this; - } - ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) { - m_exprComponents.rhs = rhs; - return *this; - } - ResultBuilder& ResultBuilder::setOp( std::string const& op ) { - m_exprComponents.op = op; - return *this; - } - - void ResultBuilder::endExpression() { - m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition ); - captureExpression(); - } - - void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { - m_assertionInfo.resultDisposition = resultDisposition; - m_stream.oss << Catch::translateActiveException(); - captureResult( ResultWas::ThrewException ); - } - - void ResultBuilder::captureResult( ResultWas::OfType resultType ) { - setResultType( resultType ); - captureExpression(); - } - void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) { - if( expectedMessage.empty() ) - captureExpectedException( Matchers::Impl::Generic::AllOf() ); - else - captureExpectedException( Matchers::Equals( expectedMessage ) ); - } - - void ResultBuilder::captureExpectedException( Matchers::Impl::Matcher const& matcher ) { - - assert( m_exprComponents.testFalse == false ); - AssertionResultData data = m_data; - data.resultType = ResultWas::Ok; - data.reconstructedExpression = m_assertionInfo.capturedExpression; - - std::string actualMessage = Catch::translateActiveException(); - if( !matcher.match( actualMessage ) ) { - data.resultType = ResultWas::ExpressionFailed; - data.reconstructedExpression = actualMessage; - } - AssertionResult result( m_assertionInfo, data ); - handleResult( result ); - } - - void ResultBuilder::captureExpression() { - AssertionResult result = build(); - handleResult( result ); - } - void ResultBuilder::handleResult( AssertionResult const& result ) - { - getResultCapture().assertionEnded( result ); - - if( !result.isOk() ) { - if( getCurrentContext().getConfig()->shouldDebugBreak() ) - m_shouldDebugBreak = true; - if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) ) - m_shouldThrow = true; - } - } - void ResultBuilder::react() { - if( m_shouldThrow ) - throw Catch::TestFailureException(); - } - - bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } - bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } - - AssertionResult ResultBuilder::build() const - { - assert( m_data.resultType != ResultWas::Unknown ); - - AssertionResultData data = m_data; - - // Flip bool results if testFalse is set - if( m_exprComponents.testFalse ) { - if( data.resultType == ResultWas::Ok ) - data.resultType = ResultWas::ExpressionFailed; - else if( data.resultType == ResultWas::ExpressionFailed ) - data.resultType = ResultWas::Ok; - } - - data.message = m_stream.oss.str(); - data.reconstructedExpression = reconstructExpression(); - if( m_exprComponents.testFalse ) { - if( m_exprComponents.op == "" ) - data.reconstructedExpression = "!" + data.reconstructedExpression; - else - data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; - } - return AssertionResult( m_assertionInfo, data ); - } - std::string ResultBuilder::reconstructExpression() const { - if( m_exprComponents.op == "" ) - return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; - else if( m_exprComponents.op == "matches" ) - return m_exprComponents.lhs + " " + m_exprComponents.rhs; - else if( m_exprComponents.op != "!" ) { - if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && - m_exprComponents.lhs.find("\n") == std::string::npos && - m_exprComponents.rhs.find("\n") == std::string::npos ) - return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; - else - return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; - } - else - return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}"; - } - -} // end namespace Catch - -// #included from: catch_tag_alias_registry.hpp -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED - -// #included from: catch_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED - -#include - -namespace Catch { - - class TagAliasRegistry : public ITagAliasRegistry { - public: - virtual ~TagAliasRegistry(); - virtual Option find( std::string const& alias ) const; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; - void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - static TagAliasRegistry& get(); - - private: - std::map m_registry; - }; - -} // end namespace Catch - -#include -#include - -namespace Catch { - - TagAliasRegistry::~TagAliasRegistry() {} - - Option TagAliasRegistry::find( std::string const& alias ) const { - std::map::const_iterator it = m_registry.find( alias ); - if( it != m_registry.end() ) - return it->second; - else - return Option(); - } - - std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { - std::string expandedTestSpec = unexpandedTestSpec; - for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); - it != itEnd; - ++it ) { - std::size_t pos = expandedTestSpec.find( it->first ); - if( pos != std::string::npos ) { - expandedTestSpec = expandedTestSpec.substr( 0, pos ) + - it->second.tag + - expandedTestSpec.substr( pos + it->first.size() ); - } - } - return expandedTestSpec; - } - - void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - - if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" already registered.\n" - << "\tFirst seen at " << find(alias)->lineInfo << "\n" - << "\tRedefined at " << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - } - - TagAliasRegistry& TagAliasRegistry::get() { - static TagAliasRegistry instance; - return instance; - - } - - ITagAliasRegistry::~ITagAliasRegistry() {} - ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); } - - RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - try { - TagAliasRegistry::get().add( alias, tag, lineInfo ); - } - catch( std::exception& ex ) { - Colour colourGuard( Colour::Red ); - Catch::cerr() << ex.what() << std::endl; - exit(1); - } - } - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_multi.hpp -#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED - -namespace Catch { - -class MultipleReporters : public SharedImpl { - typedef std::vector > Reporters; - Reporters m_reporters; - -public: - void add( Ptr const& reporter ) { - m_reporters.push_back( reporter ); - } - -public: // IStreamingReporter - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporters[0]->getPreferences(); - } - - virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->noMatchingTestCases( spec ); - } - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testRunStarting( testRunInfo ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testGroupStarting( groupInfo ); - } - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testCaseStarting( testInfo ); - } - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->sectionStarting( sectionInfo ); - } - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->assertionStarting( assertionInfo ); - } - - // The return value indicates if the messages buffer should be cleared: - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - bool clearBuffer = false; - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - clearBuffer |= (*it)->assertionEnded( assertionStats ); - return clearBuffer; - } - - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->sectionEnded( sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testGroupEnded( testGroupStats ); - } - - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->testRunEnded( testRunStats ); - } - - virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end(); - it != itEnd; - ++it ) - (*it)->skipTest( testInfo ); - } - - virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE { - return this; - } - -}; - -Ptr addReporter( Ptr const& existingReporter, Ptr const& additionalReporter ) { - Ptr resultingReporter; - - if( existingReporter ) { - MultipleReporters* multi = existingReporter->tryAsMulti(); - if( !multi ) { - multi = new MultipleReporters; - resultingReporter = Ptr( multi ); - if( existingReporter ) - multi->add( existingReporter ); - } - else - resultingReporter = existingReporter; - multi->add( additionalReporter ); - } - else - resultingReporter = additionalReporter; - - return resultingReporter; -} - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_xml.hpp -#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED - -// #included from: catch_reporter_bases.hpp -#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED - -#include - -namespace Catch { - - struct StreamingReporterBase : SharedImpl { - - StreamingReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = false; - } - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporterPrefs; - } - - virtual ~StreamingReporterBase() CATCH_OVERRIDE; - - virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} - - virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { - currentTestRunInfo = _testRunInfo; - } - virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { - currentGroupInfo = _groupInfo; - } - - virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { - currentTestCaseInfo = _testInfo; - } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { - m_sectionStack.push_back( _sectionInfo ); - } - - virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { - currentTestCaseInfo.reset(); - } - virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { - currentGroupInfo.reset(); - } - virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { - currentTestCaseInfo.reset(); - currentGroupInfo.reset(); - currentTestRunInfo.reset(); - } - - virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { - // Don't do anything with this by default. - // It can optionally be overridden in the derived class. - } - - Ptr m_config; - std::ostream& stream; - - LazyStat currentTestRunInfo; - LazyStat currentGroupInfo; - LazyStat currentTestCaseInfo; - - std::vector m_sectionStack; - ReporterPreferences m_reporterPrefs; - }; - - struct CumulativeReporterBase : SharedImpl { - template - struct Node : SharedImpl<> { - explicit Node( T const& _value ) : value( _value ) {} - virtual ~Node() {} - - typedef std::vector > ChildNodes; - T value; - ChildNodes children; - }; - struct SectionNode : SharedImpl<> { - explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} - virtual ~SectionNode(); - - bool operator == ( SectionNode const& other ) const { - return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; - } - bool operator == ( Ptr const& other ) const { - return operator==( *other ); - } - - SectionStats stats; - typedef std::vector > ChildSections; - typedef std::vector Assertions; - ChildSections childSections; - Assertions assertions; - std::string stdOut; - std::string stdErr; - }; - - struct BySectionInfo { - BySectionInfo( SectionInfo const& other ) : m_other( other ) {} - BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} - bool operator() ( Ptr const& node ) const { - return node->stats.sectionInfo.lineInfo == m_other.lineInfo; - } - private: - void operator=( BySectionInfo const& ); - SectionInfo const& m_other; - }; - - typedef Node TestCaseNode; - typedef Node TestGroupNode; - typedef Node TestRunNode; - - CumulativeReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = false; - } - ~CumulativeReporterBase(); - - virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { - return m_reporterPrefs; - } - - virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} - virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} - - virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); - Ptr node; - if( m_sectionStack.empty() ) { - if( !m_rootSection ) - m_rootSection = new SectionNode( incompleteStats ); - node = m_rootSection; - } - else { - SectionNode& parentNode = *m_sectionStack.back(); - SectionNode::ChildSections::const_iterator it = - std::find_if( parentNode.childSections.begin(), - parentNode.childSections.end(), - BySectionInfo( sectionInfo ) ); - if( it == parentNode.childSections.end() ) { - node = new SectionNode( incompleteStats ); - parentNode.childSections.push_back( node ); - } - else - node = *it; - } - m_sectionStack.push_back( node ); - m_deepestSection = node; - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - assert( !m_sectionStack.empty() ); - SectionNode& sectionNode = *m_sectionStack.back(); - sectionNode.assertions.push_back( assertionStats ); - return true; - } - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - assert( !m_sectionStack.empty() ); - SectionNode& node = *m_sectionStack.back(); - node.stats = sectionStats; - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - Ptr node = new TestCaseNode( testCaseStats ); - assert( m_sectionStack.size() == 0 ); - node->children.push_back( m_rootSection ); - m_testCases.push_back( node ); - m_rootSection.reset(); - - assert( m_deepestSection ); - m_deepestSection->stdOut = testCaseStats.stdOut; - m_deepestSection->stdErr = testCaseStats.stdErr; - } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - Ptr node = new TestGroupNode( testGroupStats ); - node->children.swap( m_testCases ); - m_testGroups.push_back( node ); - } - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - Ptr node = new TestRunNode( testRunStats ); - node->children.swap( m_testGroups ); - m_testRuns.push_back( node ); - testRunEndedCumulative(); - } - virtual void testRunEndedCumulative() = 0; - - virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} - - Ptr m_config; - std::ostream& stream; - std::vector m_assertions; - std::vector > > m_sections; - std::vector > m_testCases; - std::vector > m_testGroups; - - std::vector > m_testRuns; - - Ptr m_rootSection; - Ptr m_deepestSection; - std::vector > m_sectionStack; - ReporterPreferences m_reporterPrefs; - - }; - - template - char const* getLineOfChars() { - static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; - if( !*line ) { - memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); - line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; - } - return line; - } - - struct TestEventListenerBase : StreamingReporterBase { - TestEventListenerBase( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} - virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE { - return false; - } - }; - -} // end namespace Catch - -// #included from: ../internal/catch_reporter_registrars.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED - -namespace Catch { - - template - class LegacyReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new LegacyReporterAdapter( new T( config ) ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - LegacyReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ReporterRegistrar { - - class ReporterFactory : public SharedImpl { - - // *** Please Note ***: - // - If you end up here looking at a compiler error because it's trying to register - // your custom reporter class be aware that the native reporter interface has changed - // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via - // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. - // However please consider updating to the new interface as the old one is now - // deprecated and will probably be removed quite soon! - // Please contact me via github if you have any questions at all about this. - // In fact, ideally, please contact me anyway to let me know you've hit this - as I have - // no idea who is actually using custom reporters at all (possibly no-one!). - // The new interface is designed to minimise exposure to interface changes in the future. - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - ReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ListenerRegistrar { - - class ListenerFactory : public SharedImpl { - - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - virtual std::string getDescription() const { - return ""; - } - }; - - public: - - ListenerRegistrar() { - getMutableRegistryHub().registerListener( new ListenerFactory() ); - } - }; -} - -#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ - namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ - namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ - namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } - -// #included from: ../internal/catch_xmlwriter.hpp -#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class XmlEncode { - public: - enum ForWhat { ForTextNodes, ForAttributes }; - - XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ) - : m_str( str ), - m_forWhat( forWhat ) - {} - - void encodeTo( std::ostream& os ) const { - - // Apostrophe escaping not necessary if we always use " to write attributes - // (see: http://www.w3.org/TR/xml/#syntax) - - for( std::size_t i = 0; i < m_str.size(); ++ i ) { - char c = m_str[i]; - switch( c ) { - case '<': os << "<"; break; - case '&': os << "&"; break; - - case '>': - // See: http://www.w3.org/TR/xml/#syntax - if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' ) - os << ">"; - else - os << c; - break; - - case '\"': - if( m_forWhat == ForAttributes ) - os << """; - else - os << c; - break; - - default: - // Escape control chars - based on contribution by @espenalb in PR #465 and - // by @mrpi PR #588 - if ( ( c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) - os << "&#x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << static_cast( c ) << ';'; - else - os << c; - } - } - } - - friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { - xmlEncode.encodeTo( os ); - return os; - } - - private: - std::string m_str; - ForWhat m_forWhat; - }; - - class XmlWriter { - public: - - class ScopedElement { - public: - ScopedElement( XmlWriter* writer ) - : m_writer( writer ) - {} - - ScopedElement( ScopedElement const& other ) - : m_writer( other.m_writer ){ - other.m_writer = CATCH_NULL; - } - - ~ScopedElement() { - if( m_writer ) - m_writer->endElement(); - } - - ScopedElement& writeText( std::string const& text, bool indent = true ) { - m_writer->writeText( text, indent ); - return *this; - } - - template - ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { - m_writer->writeAttribute( name, attribute ); - return *this; - } - - private: - mutable XmlWriter* m_writer; - }; - - XmlWriter() - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &Catch::cout() ) - { - // We encode control characters, which requires - // XML 1.1 - // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 - *m_os << "\n"; - } - - XmlWriter( std::ostream& os ) - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &os ) - { - *m_os << "\n"; - } - - ~XmlWriter() { - while( !m_tags.empty() ) - endElement(); - } - - XmlWriter& startElement( std::string const& name ) { - ensureTagClosed(); - newlineIfNecessary(); - stream() << m_indent << "<" << name; - m_tags.push_back( name ); - m_indent += " "; - m_tagIsOpen = true; - return *this; - } - - ScopedElement scopedElement( std::string const& name ) { - ScopedElement scoped( this ); - startElement( name ); - return scoped; - } - - XmlWriter& endElement() { - newlineIfNecessary(); - m_indent = m_indent.substr( 0, m_indent.size()-2 ); - if( m_tagIsOpen ) { - stream() << "/>\n"; - m_tagIsOpen = false; - } - else { - stream() << m_indent << "\n"; - } - m_tags.pop_back(); - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { - if( !name.empty() && !attribute.empty() ) - stream() << " " << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << "\""; - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, bool attribute ) { - stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; - return *this; - } - - template - XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - std::ostringstream oss; - oss << attribute; - return writeAttribute( name, oss.str() ); - } - - XmlWriter& writeText( std::string const& text, bool indent = true ) { - if( !text.empty() ){ - bool tagWasOpen = m_tagIsOpen; - ensureTagClosed(); - if( tagWasOpen && indent ) - stream() << m_indent; - stream() << XmlEncode( text ); - m_needsNewline = true; - } - return *this; - } - - XmlWriter& writeComment( std::string const& text ) { - ensureTagClosed(); - stream() << m_indent << ""; - m_needsNewline = true; - return *this; - } - - XmlWriter& writeBlankLine() { - ensureTagClosed(); - stream() << "\n"; - return *this; - } - - void setStream( std::ostream& os ) { - m_os = &os; - } - - private: - XmlWriter( XmlWriter const& ); - void operator=( XmlWriter const& ); - - std::ostream& stream() { - return *m_os; - } - - void ensureTagClosed() { - if( m_tagIsOpen ) { - stream() << ">\n"; - m_tagIsOpen = false; - } - } - - void newlineIfNecessary() { - if( m_needsNewline ) { - stream() << "\n"; - m_needsNewline = false; - } - } - - bool m_tagIsOpen; - bool m_needsNewline; - std::vector m_tags; - std::string m_indent; - std::ostream* m_os; - }; - -} -// #included from: catch_reenable_warnings.h - -#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(pop) -# else -# pragma clang diagnostic pop -# endif -#elif defined __GNUC__ -# pragma GCC diagnostic pop -#endif - - -namespace Catch { - class XmlReporter : public StreamingReporterBase { - public: - XmlReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_sectionDepth( 0 ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - } - - virtual ~XmlReporter() CATCH_OVERRIDE; - - static std::string getDescription() { - return "Reports test results as an XML document"; - } - - public: // StreamingReporterBase - - virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { - StreamingReporterBase::noMatchingTestCases( s ); - } - - virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testRunStarting( testInfo ); - m_xml.setStream( stream ); - m_xml.startElement( "Catch" ); - if( !m_config->name().empty() ) - m_xml.writeAttribute( "name", m_config->name() ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testGroupStarting( groupInfo ); - m_xml.startElement( "Group" ) - .writeAttribute( "name", groupInfo.name ); - } - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseStarting(testInfo); - m_xml.startElement( "TestCase" ).writeAttribute( "name", testInfo.name ); - - if ( m_config->showDurations() == ShowDurations::Always ) - m_testCaseTimer.start(); - } - - virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { - StreamingReporterBase::sectionStarting( sectionInfo ); - if( m_sectionDepth++ > 0 ) { - m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionInfo.name ) ) - .writeAttribute( "description", sectionInfo.description ); - } - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - const AssertionResult& assertionResult = assertionStats.assertionResult; - - // Print any info messages in tags. - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - m_xml.scopedElement( "Info" ) - .writeText( it->message ); - } else if ( it->type == ResultWas::Warning ) { - m_xml.scopedElement( "Warning" ) - .writeText( it->message ); - } - } - } - - // Drop out if result was successful but we're not printing them. - if( !m_config->includeSuccessfulResults() && isOk(assertionResult.getResultType()) ) - return true; - - // Print the expression if there is one. - if( assertionResult.hasExpression() ) { - m_xml.startElement( "Expression" ) - .writeAttribute( "success", assertionResult.succeeded() ) - .writeAttribute( "type", assertionResult.getTestMacroName() ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ); - - m_xml.scopedElement( "Original" ) - .writeText( assertionResult.getExpression() ); - m_xml.scopedElement( "Expanded" ) - .writeText( assertionResult.getExpandedExpression() ); - } - - // And... Print a result applicable to each result type. - switch( assertionResult.getResultType() ) { - case ResultWas::ThrewException: - m_xml.scopedElement( "Exception" ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::FatalErrorCondition: - m_xml.scopedElement( "Fatal Error Condition" ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::Info: - m_xml.scopedElement( "Info" ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::Warning: - // Warning will already have been written - break; - case ResultWas::ExplicitFailure: - m_xml.scopedElement( "Failure" ) - .writeText( assertionResult.getMessage() ); - break; - default: - break; - } - - if( assertionResult.hasExpression() ) - m_xml.endElement(); - - return true; - } - - virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { - StreamingReporterBase::sectionEnded( sectionStats ); - if( --m_sectionDepth > 0 ) { - XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); - e.writeAttribute( "successes", sectionStats.assertions.passed ); - e.writeAttribute( "failures", sectionStats.assertions.failed ); - e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); - - if ( m_config->showDurations() == ShowDurations::Always ) - e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); - - m_xml.endElement(); - } - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseEnded( testCaseStats ); - XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); - e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); - - if ( m_config->showDurations() == ShowDurations::Always ) - e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); - - m_xml.endElement(); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - StreamingReporterBase::testGroupEnded( testGroupStats ); - // TODO: Check testGroupStats.aborting and act accordingly. - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) - .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { - StreamingReporterBase::testRunEnded( testRunStats ); - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testRunStats.totals.assertions.passed ) - .writeAttribute( "failures", testRunStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); - m_xml.endElement(); - } - - private: - Timer m_testCaseTimer; - XmlWriter m_xml; - int m_sectionDepth; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_junit.hpp -#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED - -#include - -namespace Catch { - - class JunitReporter : public CumulativeReporterBase { - public: - JunitReporter( ReporterConfig const& _config ) - : CumulativeReporterBase( _config ), - xml( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - } - - virtual ~JunitReporter() CATCH_OVERRIDE; - - static std::string getDescription() { - return "Reports test results in an XML format that looks like Ant's junitreport target"; - } - - virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} - - virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { - CumulativeReporterBase::testRunStarting( runInfo ); - xml.startElement( "testsuites" ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { - suiteTimer.start(); - stdOutForSuite.str(""); - stdErrForSuite.str(""); - unexpectedExceptions = 0; - CumulativeReporterBase::testGroupStarting( groupInfo ); - } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { - if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) - unexpectedExceptions++; - return CumulativeReporterBase::assertionEnded( assertionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { - stdOutForSuite << testCaseStats.stdOut; - stdErrForSuite << testCaseStats.stdErr; - CumulativeReporterBase::testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { - double suiteTime = suiteTimer.getElapsedSeconds(); - CumulativeReporterBase::testGroupEnded( testGroupStats ); - writeGroup( *m_testGroups.back(), suiteTime ); - } - - virtual void testRunEndedCumulative() CATCH_OVERRIDE { - xml.endElement(); - } - - void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); - TestGroupStats const& stats = groupNode.value; - xml.writeAttribute( "name", stats.groupInfo.name ); - xml.writeAttribute( "errors", unexpectedExceptions ); - xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); - xml.writeAttribute( "tests", stats.totals.assertions.total() ); - xml.writeAttribute( "hostname", "tbd" ); // !TBD - if( m_config->showDurations() == ShowDurations::Never ) - xml.writeAttribute( "time", "" ); - else - xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", "tbd" ); // !TBD - - // Write test cases - for( TestGroupNode::ChildNodes::const_iterator - it = groupNode.children.begin(), itEnd = groupNode.children.end(); - it != itEnd; - ++it ) - writeTestCase( **it ); - - xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); - xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); - } - - void writeTestCase( TestCaseNode const& testCaseNode ) { - TestCaseStats const& stats = testCaseNode.value; - - // All test cases have exactly one section - which represents the - // test case itself. That section may have 0-n nested sections - assert( testCaseNode.children.size() == 1 ); - SectionNode const& rootSection = *testCaseNode.children.front(); - - std::string className = stats.testInfo.className; - - if( className.empty() ) { - if( rootSection.childSections.empty() ) - className = "global"; - } - writeSection( className, "", rootSection ); - } - - void writeSection( std::string const& className, - std::string const& rootName, - SectionNode const& sectionNode ) { - std::string name = trim( sectionNode.stats.sectionInfo.name ); - if( !rootName.empty() ) - name = rootName + "/" + name; - - if( !sectionNode.assertions.empty() || - !sectionNode.stdOut.empty() || - !sectionNode.stdErr.empty() ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); - if( className.empty() ) { - xml.writeAttribute( "classname", name ); - xml.writeAttribute( "name", "root" ); - } - else { - xml.writeAttribute( "classname", className ); - xml.writeAttribute( "name", name ); - } - xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) ); - - writeAssertions( sectionNode ); - - if( !sectionNode.stdOut.empty() ) - xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); - if( !sectionNode.stdErr.empty() ) - xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); - } - for( SectionNode::ChildSections::const_iterator - it = sectionNode.childSections.begin(), - itEnd = sectionNode.childSections.end(); - it != itEnd; - ++it ) - if( className.empty() ) - writeSection( name, "", **it ); - else - writeSection( className, name, **it ); - } - - void writeAssertions( SectionNode const& sectionNode ) { - for( SectionNode::Assertions::const_iterator - it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); - it != itEnd; - ++it ) - writeAssertion( *it ); - } - void writeAssertion( AssertionStats const& stats ) { - AssertionResult const& result = stats.assertionResult; - if( !result.isOk() ) { - std::string elementName; - switch( result.getResultType() ) { - case ResultWas::ThrewException: - case ResultWas::FatalErrorCondition: - elementName = "error"; - break; - case ResultWas::ExplicitFailure: - elementName = "failure"; - break; - case ResultWas::ExpressionFailed: - elementName = "failure"; - break; - case ResultWas::DidntThrowException: - elementName = "failure"; - break; - - // We should never see these here: - case ResultWas::Info: - case ResultWas::Warning: - case ResultWas::Ok: - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - elementName = "internalError"; - break; - } - - XmlWriter::ScopedElement e = xml.scopedElement( elementName ); - - xml.writeAttribute( "message", result.getExpandedExpression() ); - xml.writeAttribute( "type", result.getTestMacroName() ); - - std::ostringstream oss; - if( !result.getMessage().empty() ) - oss << result.getMessage() << "\n"; - for( std::vector::const_iterator - it = stats.infoMessages.begin(), - itEnd = stats.infoMessages.end(); - it != itEnd; - ++it ) - if( it->type == ResultWas::Info ) - oss << it->message << "\n"; - - oss << "at " << result.getSourceInfo(); - xml.writeText( oss.str(), false ); - } - } - - XmlWriter xml; - Timer suiteTimer; - std::ostringstream stdOutForSuite; - std::ostringstream stdErrForSuite; - unsigned int unexpectedExceptions; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_console.hpp -#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED - -namespace Catch { - - struct ConsoleReporter : StreamingReporterBase { - ConsoleReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_headerPrinted( false ) - {} - - virtual ~ConsoleReporter() CATCH_OVERRIDE; - static std::string getDescription() { - return "Reports test results as plain lines of text"; - } - - virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - lazyPrint(); - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - stream << std::endl; - return true; - } - - virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { - m_headerPrinted = false; - StreamingReporterBase::sectionStarting( _sectionInfo ); - } - virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { - if( _sectionStats.missingAssertions ) { - lazyPrint(); - Colour colour( Colour::ResultError ); - if( m_sectionStack.size() > 1 ) - stream << "\nNo assertions in section"; - else - stream << "\nNo assertions in test case"; - stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; - } - if( m_headerPrinted ) { - if( m_config->showDurations() == ShowDurations::Always ) - stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - m_headerPrinted = false; - } - else { - if( m_config->showDurations() == ShowDurations::Always ) - stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - } - StreamingReporterBase::sectionEnded( _sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { - StreamingReporterBase::testCaseEnded( _testCaseStats ); - m_headerPrinted = false; - } - virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { - if( currentGroupInfo.used ) { - printSummaryDivider(); - stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; - printTotals( _testGroupStats.totals ); - stream << "\n" << std::endl; - } - StreamingReporterBase::testGroupEnded( _testGroupStats ); - } - virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { - printTotalsDivider( _testRunStats.totals ); - printTotals( _testRunStats.totals ); - stream << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ), - stats( _stats ), - result( _stats.assertionResult ), - colour( Colour::None ), - message( result.getMessage() ), - messages( _stats.infoMessages ), - printInfoMessages( _printInfoMessages ) - { - switch( result.getResultType() ) { - case ResultWas::Ok: - colour = Colour::Success; - passOrFail = "PASSED"; - //if( result.hasMessage() ) - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) { - colour = Colour::Success; - passOrFail = "FAILED - but was ok"; - } - else { - colour = Colour::Error; - passOrFail = "FAILED"; - } - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ThrewException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with message"; - break; - case ResultWas::FatalErrorCondition: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to a fatal error condition"; - break; - case ResultWas::DidntThrowException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "because no exception was thrown where one was expected"; - break; - case ResultWas::Info: - messageLabel = "info"; - break; - case ResultWas::Warning: - messageLabel = "warning"; - break; - case ResultWas::ExplicitFailure: - passOrFail = "FAILED"; - colour = Colour::Error; - if( _stats.infoMessages.size() == 1 ) - messageLabel = "explicitly with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "explicitly with messages"; - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - passOrFail = "** internal error **"; - colour = Colour::Error; - break; - } - } - - void print() const { - printSourceInfo(); - if( stats.totals.assertions.total() > 0 ) { - if( result.isOk() ) - stream << "\n"; - printResultType(); - printOriginalExpression(); - printReconstructedExpression(); - } - else { - stream << "\n"; - } - printMessage(); - } - - private: - void printResultType() const { - if( !passOrFail.empty() ) { - Colour colourGuard( colour ); - stream << passOrFail << ":\n"; - } - } - void printOriginalExpression() const { - if( result.hasExpression() ) { - Colour colourGuard( Colour::OriginalExpression ); - stream << " "; - stream << result.getExpressionInMacro(); - stream << "\n"; - } - } - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - stream << "with expansion:\n"; - Colour colourGuard( Colour::ReconstructedExpression ); - stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; - } - } - void printMessage() const { - if( !messageLabel.empty() ) - stream << messageLabel << ":" << "\n"; - for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); - it != itEnd; - ++it ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || it->type != ResultWas::Info ) - stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; - } - } - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ": "; - } - - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - Colour::Code colour; - std::string passOrFail; - std::string messageLabel; - std::string message; - std::vector messages; - bool printInfoMessages; - }; - - void lazyPrint() { - - if( !currentTestRunInfo.used ) - lazyPrintRunInfo(); - if( !currentGroupInfo.used ) - lazyPrintGroupInfo(); - - if( !m_headerPrinted ) { - printTestCaseAndSectionHeader(); - m_headerPrinted = true; - } - } - void lazyPrintRunInfo() { - stream << "\n" << getLineOfChars<'~'>() << "\n"; - Colour colour( Colour::SecondaryText ); - stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion << " host application.\n" - << "Run with -? for options\n\n"; - - if( m_config->rngSeed() != 0 ) - stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; - - currentTestRunInfo.used = true; - } - void lazyPrintGroupInfo() { - if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { - printClosedHeader( "Group: " + currentGroupInfo->name ); - currentGroupInfo.used = true; - } - } - void printTestCaseAndSectionHeader() { - assert( !m_sectionStack.empty() ); - printOpenHeader( currentTestCaseInfo->name ); - - if( m_sectionStack.size() > 1 ) { - Colour colourGuard( Colour::Headers ); - - std::vector::const_iterator - it = m_sectionStack.begin()+1, // Skip first section (test case) - itEnd = m_sectionStack.end(); - for( ; it != itEnd; ++it ) - printHeaderString( it->name, 2 ); - } - - SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; - - if( !lineInfo.empty() ){ - stream << getLineOfChars<'-'>() << "\n"; - Colour colourGuard( Colour::FileName ); - stream << lineInfo << "\n"; - } - stream << getLineOfChars<'.'>() << "\n" << std::endl; - } - - void printClosedHeader( std::string const& _name ) { - printOpenHeader( _name ); - stream << getLineOfChars<'.'>() << "\n"; - } - void printOpenHeader( std::string const& _name ) { - stream << getLineOfChars<'-'>() << "\n"; - { - Colour colourGuard( Colour::Headers ); - printHeaderString( _name ); - } - } - - // if string has a : in first line will set indent to follow it on - // subsequent lines - void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { - std::size_t i = _string.find( ": " ); - if( i != std::string::npos ) - i+=2; - else - i = 0; - stream << Text( _string, TextAttributes() - .setIndent( indent+i) - .setInitialIndent( indent ) ) << "\n"; - } - - struct SummaryColumn { - - SummaryColumn( std::string const& _label, Colour::Code _colour ) - : label( _label ), - colour( _colour ) - {} - SummaryColumn addRow( std::size_t count ) { - std::ostringstream oss; - oss << count; - std::string row = oss.str(); - for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { - while( it->size() < row.size() ) - *it = " " + *it; - while( it->size() > row.size() ) - row = " " + row; - } - rows.push_back( row ); - return *this; - } - - std::string label; - Colour::Code colour; - std::vector rows; - - }; - - void printTotals( Totals const& totals ) { - if( totals.testCases.total() == 0 ) { - stream << Colour( Colour::Warning ) << "No tests ran\n"; - } - else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) { - stream << Colour( Colour::ResultSuccess ) << "All tests passed"; - stream << " (" - << pluralise( totals.assertions.passed, "assertion" ) << " in " - << pluralise( totals.testCases.passed, "test case" ) << ")" - << "\n"; - } - else { - - std::vector columns; - columns.push_back( SummaryColumn( "", Colour::None ) - .addRow( totals.testCases.total() ) - .addRow( totals.assertions.total() ) ); - columns.push_back( SummaryColumn( "passed", Colour::Success ) - .addRow( totals.testCases.passed ) - .addRow( totals.assertions.passed ) ); - columns.push_back( SummaryColumn( "failed", Colour::ResultError ) - .addRow( totals.testCases.failed ) - .addRow( totals.assertions.failed ) ); - columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) - .addRow( totals.testCases.failedButOk ) - .addRow( totals.assertions.failedButOk ) ); - - printSummaryRow( "test cases", columns, 0 ); - printSummaryRow( "assertions", columns, 1 ); - } - } - void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { - for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { - std::string value = it->rows[row]; - if( it->label.empty() ) { - stream << label << ": "; - if( value != "0" ) - stream << value; - else - stream << Colour( Colour::Warning ) << "- none -"; - } - else if( value != "0" ) { - stream << Colour( Colour::LightGrey ) << " | "; - stream << Colour( it->colour ) - << value << " " << it->label; - } - } - stream << "\n"; - } - - static std::size_t makeRatio( std::size_t number, std::size_t total ) { - std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; - return ( ratio == 0 && number > 0 ) ? 1 : ratio; - } - static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { - if( i > j && i > k ) - return i; - else if( j > k ) - return j; - else - return k; - } - - void printTotalsDivider( Totals const& totals ) { - if( totals.testCases.total() > 0 ) { - std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); - std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); - std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); - while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )++; - while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )--; - - stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); - stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); - if( totals.testCases.allPassed() ) - stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); - else - stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); - } - else { - stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); - } - stream << "\n"; - } - void printSummaryDivider() { - stream << getLineOfChars<'-'>() << "\n"; - } - - private: - bool m_headerPrinted; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_compact.hpp -#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED - -namespace Catch { - - struct CompactReporter : StreamingReporterBase { - - CompactReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual ~CompactReporter(); - - static std::string getDescription() { - return "Reports test results on a single line, suitable for IDEs"; - } - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - - stream << std::endl; - return true; - } - - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotals( _testRunStats.totals ); - stream << "\n" << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ) - , stats( _stats ) - , result( _stats.assertionResult ) - , messages( _stats.infoMessages ) - , itMessage( _stats.infoMessages.begin() ) - , printInfoMessages( _printInfoMessages ) - {} - - void print() { - printSourceInfo(); - - itMessage = messages.begin(); - - switch( result.getResultType() ) { - case ResultWas::Ok: - printResultType( Colour::ResultSuccess, passedString() ); - printOriginalExpression(); - printReconstructedExpression(); - if ( ! result.hasExpression() ) - printRemainingMessages( Colour::None ); - else - printRemainingMessages(); - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) - printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); - else - printResultType( Colour::Error, failedString() ); - printOriginalExpression(); - printReconstructedExpression(); - printRemainingMessages(); - break; - case ResultWas::ThrewException: - printResultType( Colour::Error, failedString() ); - printIssue( "unexpected exception with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::FatalErrorCondition: - printResultType( Colour::Error, failedString() ); - printIssue( "fatal error condition with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::DidntThrowException: - printResultType( Colour::Error, failedString() ); - printIssue( "expected exception, got none" ); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::Info: - printResultType( Colour::None, "info" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::Warning: - printResultType( Colour::None, "warning" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::ExplicitFailure: - printResultType( Colour::Error, failedString() ); - printIssue( "explicitly" ); - printRemainingMessages( Colour::None ); - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - printResultType( Colour::Error, "** internal error **" ); - break; - } - } - - private: - // Colour::LightGrey - - static Colour::Code dimColour() { return Colour::FileName; } - -#ifdef CATCH_PLATFORM_MAC - static const char* failedString() { return "FAILED"; } - static const char* passedString() { return "PASSED"; } -#else - static const char* failedString() { return "failed"; } - static const char* passedString() { return "passed"; } -#endif - - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ":"; - } - - void printResultType( Colour::Code colour, std::string passOrFail ) const { - if( !passOrFail.empty() ) { - { - Colour colourGuard( colour ); - stream << " " << passOrFail; - } - stream << ":"; - } - } - - void printIssue( std::string issue ) const { - stream << " " << issue; - } - - void printExpressionWas() { - if( result.hasExpression() ) { - stream << ";"; - { - Colour colour( dimColour() ); - stream << " expression was:"; - } - printOriginalExpression(); - } - } - - void printOriginalExpression() const { - if( result.hasExpression() ) { - stream << " " << result.getExpression(); - } - } - - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - { - Colour colour( dimColour() ); - stream << " for: "; - } - stream << result.getExpandedExpression(); - } - } - - void printMessage() { - if ( itMessage != messages.end() ) { - stream << " '" << itMessage->message << "'"; - ++itMessage; - } - } - - void printRemainingMessages( Colour::Code colour = dimColour() ) { - if ( itMessage == messages.end() ) - return; - - // using messages.end() directly yields compilation error: - std::vector::const_iterator itEnd = messages.end(); - const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); - - { - Colour colourGuard( colour ); - stream << " with " << pluralise( N, "message" ) << ":"; - } - - for(; itMessage != itEnd; ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || itMessage->type != ResultWas::Info ) { - stream << " '" << itMessage->message << "'"; - if ( ++itMessage != itEnd ) { - Colour colourGuard( dimColour() ); - stream << " and"; - } - } - } - } - - private: - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - std::vector messages; - std::vector::const_iterator itMessage; - bool printInfoMessages; - }; - - // Colour, message variants: - // - white: No tests ran. - // - red: Failed [both/all] N test cases, failed [both/all] M assertions. - // - white: Passed [both/all] N test cases (no assertions). - // - red: Failed N tests cases, failed M assertions. - // - green: Passed [both/all] N tests cases with M assertions. - - std::string bothOrAll( std::size_t count ) const { - return count == 1 ? "" : count == 2 ? "both " : "all " ; - } - - void printTotals( const Totals& totals ) const { - if( totals.testCases.total() == 0 ) { - stream << "No tests ran."; - } - else if( totals.testCases.failed == totals.testCases.total() ) { - Colour colour( Colour::ResultError ); - const std::string qualify_assertions_failed = - totals.assertions.failed == totals.assertions.total() ? - bothOrAll( totals.assertions.failed ) : ""; - stream << - "Failed " << bothOrAll( totals.testCases.failed ) - << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << qualify_assertions_failed << - pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else if( totals.assertions.total() == 0 ) { - stream << - "Passed " << bothOrAll( totals.testCases.total() ) - << pluralise( totals.testCases.total(), "test case" ) - << " (no assertions)."; - } - else if( totals.assertions.failed ) { - Colour colour( Colour::ResultError ); - stream << - "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else { - Colour colour( Colour::ResultSuccess ); - stream << - "Passed " << bothOrAll( totals.testCases.passed ) - << pluralise( totals.testCases.passed, "test case" ) << - " with " << pluralise( totals.assertions.passed, "assertion" ) << "."; - } - } - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) - -} // end namespace Catch - -namespace Catch { - // These are all here to avoid warnings about not having any out of line - // virtual methods - NonCopyable::~NonCopyable() {} - IShared::~IShared() {} - IStream::~IStream() CATCH_NOEXCEPT {} - FileStream::~FileStream() CATCH_NOEXCEPT {} - CoutStream::~CoutStream() CATCH_NOEXCEPT {} - DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {} - StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} - IContext::~IContext() {} - IResultCapture::~IResultCapture() {} - ITestCase::~ITestCase() {} - ITestCaseRegistry::~ITestCaseRegistry() {} - IRegistryHub::~IRegistryHub() {} - IMutableRegistryHub::~IMutableRegistryHub() {} - IExceptionTranslator::~IExceptionTranslator() {} - IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} - IReporter::~IReporter() {} - IReporterFactory::~IReporterFactory() {} - IReporterRegistry::~IReporterRegistry() {} - IStreamingReporter::~IStreamingReporter() {} - AssertionStats::~AssertionStats() {} - SectionStats::~SectionStats() {} - TestCaseStats::~TestCaseStats() {} - TestGroupStats::~TestGroupStats() {} - TestRunStats::~TestRunStats() {} - CumulativeReporterBase::SectionNode::~SectionNode() {} - CumulativeReporterBase::~CumulativeReporterBase() {} - - StreamingReporterBase::~StreamingReporterBase() {} - ConsoleReporter::~ConsoleReporter() {} - CompactReporter::~CompactReporter() {} - IRunner::~IRunner() {} - IMutableContext::~IMutableContext() {} - IConfig::~IConfig() {} - XmlReporter::~XmlReporter() {} - JunitReporter::~JunitReporter() {} - TestRegistry::~TestRegistry() {} - FreeFunctionTestCase::~FreeFunctionTestCase() {} - IGeneratorInfo::~IGeneratorInfo() {} - IGeneratorsForTest::~IGeneratorsForTest() {} - WildcardPattern::~WildcardPattern() {} - TestSpec::Pattern::~Pattern() {} - TestSpec::NamePattern::~NamePattern() {} - TestSpec::TagPattern::~TagPattern() {} - TestSpec::ExcludedPattern::~ExcludedPattern() {} - - Matchers::Impl::StdString::Equals::~Equals() {} - Matchers::Impl::StdString::Contains::~Contains() {} - Matchers::Impl::StdString::StartsWith::~StartsWith() {} - Matchers::Impl::StdString::EndsWith::~EndsWith() {} - - void Config::dummy() {} - - namespace TestCaseTracking { - ITracker::~ITracker() {} - TrackerBase::~TrackerBase() {} - SectionTracker::~SectionTracker() {} - IndexTracker::~IndexTracker() {} - } -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif - -#ifdef CATCH_CONFIG_MAIN -// #included from: internal/catch_default_main.hpp -#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED - -#ifndef __OBJC__ - -// Standard C/C++ main entry point -int main (int argc, char * argv[]) { - return Catch::Session().run( argc, argv ); -} - -#else // __OBJC__ - -// Objective-C entry point -int main (int argc, char * const argv[]) { -#if !CATCH_ARC_ENABLED - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; -#endif - - Catch::registerTestMethods(); - int result = Catch::Session().run( argc, (char* const*)argv ); - -#if !CATCH_ARC_ENABLED - [pool drain]; -#endif - - return result; -} - -#endif // __OBJC__ - -#endif - -#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED -# undef CLARA_CONFIG_MAIN -#endif - -////// - -// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ -#ifdef CATCH_CONFIG_PREFIX_ALL - -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" ) - -#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "", "CATCH_REQUIRE_THROWS" ) -#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) -#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, "CATCH_REQUIRE_THROWS_WITH" ) -#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) - -#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) -#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" ) -#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) -#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) -#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) - -#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) -#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) -#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CATCH_CHECK_THROWS_WITH" ) -#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) - -#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg ) -#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) -#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) - #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ ) - #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ ) -#else - #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description ) - #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg ) - #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg ) -#endif -#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) -#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) -#else -#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) -#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) -#endif -#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" ) -#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" ) -#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) -#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" ) -#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" ) - -// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required -#else - -#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" ) - -#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "", "REQUIRE_THROWS" ) -#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) -#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, matcher, "REQUIRE_THROWS_WITH" ) -#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) - -#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) -#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" ) -#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) -#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) -#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) - -#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "", "CHECK_THROWS" ) -#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) -#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CHECK_THROWS_WITH" ) -#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) - -#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg ) -#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) -#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) - #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ ) - #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ ) -#else - #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description ) - #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg ) - #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg ) -#endif -#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -#endif - -#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) -#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) -#else -#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) -#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags ) -#endif -#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" ) -#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" ) -#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" ) -#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" ) -#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" ) - -using Catch::Detail::Approx; - -#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - - diff --git a/tests/check.cpp b/tests/check.cpp index 63d782f..732c7fb 100644 --- a/tests/check.cpp +++ b/tests/check.cpp @@ -20,10 +20,9 @@ # ############################################################################*/ -#include "catch.hpp" -#include "fixture.hpp" - +#include #include +#include "fixture.hpp" SCENARIO("Client must check an existing remote resources", "[check]") { diff --git a/tests/clean.cpp b/tests/clean.cpp index c7b4338..14af2ae 100644 --- a/tests/clean.cpp +++ b/tests/clean.cpp @@ -20,10 +20,10 @@ # ############################################################################*/ -#include "catch.hpp" +#include +#include #include "fixture.hpp" -#include SCENARIO("Client must clean an existing remote resources", "[clean]") { diff --git a/tests/download.cpp b/tests/download.cpp index fc34a6d..f287551 100644 --- a/tests/download.cpp +++ b/tests/download.cpp @@ -20,10 +20,9 @@ # ############################################################################*/ -#include "catch.hpp" -#include "fixture.hpp" - +#include #include +#include "fixture.hpp" SCENARIO("Client must download into buffer", "[download][buffer]") { diff --git a/tests/fixture.hpp b/tests/fixture.hpp index cc59ef4..de70097 100644 --- a/tests/fixture.hpp +++ b/tests/fixture.hpp @@ -22,11 +22,6 @@ #include #include -#include - -#include -#include -#include using dict_t = std::map; diff --git a/tests/list.cpp b/tests/list.cpp index 0737aae..33c592d 100644 --- a/tests/list.cpp +++ b/tests/list.cpp @@ -20,10 +20,9 @@ # ############################################################################*/ -#include "catch.hpp" -#include "fixture.hpp" - +#include #include +#include "fixture.hpp" SCENARIO("Client must list a remote files and a remote directories", "[list]") { diff --git a/tests/main.cpp b/tests/main.cpp index 47e82c8..0b9ea93 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -21,4 +21,4 @@ ############################################################################*/ #define CATCH_CONFIG_MAIN -#include "catch.hpp" +#include diff --git a/tests/upload.cpp b/tests/upload.cpp index 2d22164..db5f8d3 100644 --- a/tests/upload.cpp +++ b/tests/upload.cpp @@ -20,10 +20,9 @@ # ############################################################################*/ -#include "catch.hpp" -#include "fixture.hpp" - +#include #include +#include "fixture.hpp" #include From 281de5db2dbdc376450d3457268bee57ddeae351 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 23:01:16 +0300 Subject: [PATCH 047/133] workaround for polly analyze --- CMakeLists.txt | 6 ++++-- tests/clean.cpp | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c14e229..19f182d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,14 +26,16 @@ include("cmake/HunterGate.cmake") HunterGate( URL "https://github.com/ruslo/hunter/archive/v0.19.45.tar.gz" SHA1 "56b690cd9bf54de1099727672b8525a4102f124f" - LOCAL + LOCAL # issue #29 ) project(wdc) +include($ENV{POLLY_ROOT}/analyze.cmake OPTIONAL) + set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 0) -set(WDC_VERSION_PATCH 4) +set(WDC_VERSION_PATCH 5) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) set(CMAKE_CXX_STANDARD 11) diff --git a/tests/clean.cpp b/tests/clean.cpp index 14af2ae..cdc5512 100644 --- a/tests/clean.cpp +++ b/tests/clean.cpp @@ -171,6 +171,8 @@ SCENARIO("Client must clean a remote directory", "[clean]") { REQUIRE(client->check(directory_name)); auto is_success = client->clean(directory_name); + + REQUIRE(is_success); THEN("The directory is cleaning") { From 0a5ac5c6657968198a752ab365c1f977bf1502d5 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 26 Jul 2017 23:03:43 +0300 Subject: [PATCH 048/133] update changelog --- ChangeLog.md | 111 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 44 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index de016cc..93fbdf2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,87 +1,110 @@ # Change Log -## [Unreleased](https://github.com/designerror/webdav-client-cpp/tree/HEAD) +## [v1.0.5](https://github.com/CloudPolis/webdav-client-cpp/tree/v1.0.5) (2017-07-26) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v1.0.4...v1.0.5) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.2...HEAD) +**Implemented enhancements:** + +- change webdav\_login to webdav\_username [\#27](https://github.com/CloudPolis/webdav-client-cpp/issues/27) + +## [v1.0.4](https://github.com/CloudPolis/webdav-client-cpp/tree/v1.0.4) (2017-07-26) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v1.0.3...v1.0.4) + +**Implemented enhancements:** + +- change webdav servers [\#26](https://github.com/CloudPolis/webdav-client-cpp/issues/26) +- Adding verbose flag [\#25](https://github.com/CloudPolis/webdav-client-cpp/issues/25) + +## [v1.0.3](https://github.com/CloudPolis/webdav-client-cpp/tree/v1.0.3) (2017-07-24) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v1.0.2...v1.0.3) + +**Implemented enhancements:** + +- Update CMakeLists.txt [\#24](https://github.com/CloudPolis/webdav-client-cpp/pull/24) ([designerror](https://github.com/designerror)) **Fixed bugs:** -- Handling of XML namespaces in PROPFIND responds [\#17](https://github.com/designerror/webdav-client-cpp/issues/17) +- Handling of XML namespaces in PROPFIND responds [\#17](https://github.com/CloudPolis/webdav-client-cpp/issues/17) + +**Closed issues:** + +- resource\_pah and target\_path differs in ::info when URL has subdirectory [\#18](https://github.com/CloudPolis/webdav-client-cpp/issues/18) **Merged pull requests:** -- fixed \#17 [\#21](https://github.com/designerror/webdav-client-cpp/pull/21) ([designerror](https://github.com/designerror)) +- fixed \#18 [\#23](https://github.com/CloudPolis/webdav-client-cpp/pull/23) ([rusdevops](https://github.com/rusdevops)) +- fixed \#17 [\#21](https://github.com/CloudPolis/webdav-client-cpp/pull/21) ([designerror](https://github.com/designerror)) -## [v1.0.2](https://github.com/designerror/webdav-client-cpp/tree/v1.0.2) (2017-07-23) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.1-hunter-p1...v1.0.2) +## [v1.0.2](https://github.com/CloudPolis/webdav-client-cpp/tree/v1.0.2) (2017-07-23) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v1.0.1-hunter-p1...v1.0.2) **Fixed bugs:** -- ::list returns the name of the root directory [\#19](https://github.com/designerror/webdav-client-cpp/issues/19) +- ::list returns the name of the root directory [\#19](https://github.com/CloudPolis/webdav-client-cpp/issues/19) **Merged pull requests:** -- fixed \#19 [\#20](https://github.com/designerror/webdav-client-cpp/pull/20) ([designerror](https://github.com/designerror)) +- fixed \#19 [\#20](https://github.com/CloudPolis/webdav-client-cpp/pull/20) ([designerror](https://github.com/designerror)) -## [v1.0.1-hunter-p1](https://github.com/designerror/webdav-client-cpp/tree/v1.0.1-hunter-p1) (2017-03-20) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.1-hunter...v1.0.1-hunter-p1) +## [v1.0.1-hunter-p1](https://github.com/CloudPolis/webdav-client-cpp/tree/v1.0.1-hunter-p1) (2017-03-20) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v1.0.1-hunter...v1.0.1-hunter-p1) -## [v1.0.1-hunter](https://github.com/designerror/webdav-client-cpp/tree/v1.0.1-hunter) (2017-03-17) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.1...v1.0.1-hunter) +## [v1.0.1-hunter](https://github.com/CloudPolis/webdav-client-cpp/tree/v1.0.1-hunter) (2017-03-17) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v1.0.1...v1.0.1-hunter) -## [v1.0.1](https://github.com/designerror/webdav-client-cpp/tree/v1.0.1) (2016-11-08) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v1.0.0...v1.0.1) +## [v1.0.1](https://github.com/CloudPolis/webdav-client-cpp/tree/v1.0.1) (2016-11-08) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v1.0.0...v1.0.1) **Merged pull requests:** -- Update client.hpp [\#15](https://github.com/designerror/webdav-client-cpp/pull/15) ([designerror](https://github.com/designerror)) +- Update client.hpp [\#15](https://github.com/CloudPolis/webdav-client-cpp/pull/15) ([designerror](https://github.com/designerror)) -## [v1.0.0](https://github.com/designerror/webdav-client-cpp/tree/v1.0.0) (2016-10-22) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.9...v1.0.0) +## [v1.0.0](https://github.com/CloudPolis/webdav-client-cpp/tree/v1.0.0) (2016-10-22) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.9...v1.0.0) **Merged pull requests:** -- Update .travis.yml [\#14](https://github.com/designerror/webdav-client-cpp/pull/14) ([designerror](https://github.com/designerror)) -- ifndef/define xxx\_H and final/or\_virt\_destructor [\#13](https://github.com/designerror/webdav-client-cpp/pull/13) ([x10mind](https://github.com/x10mind)) -- Update build\_requirements.unix.sh [\#10](https://github.com/designerror/webdav-client-cpp/pull/10) ([designerror](https://github.com/designerror)) -- Update .travis.yml [\#9](https://github.com/designerror/webdav-client-cpp/pull/9) ([designerror](https://github.com/designerror)) -- Update README.md [\#8](https://github.com/designerror/webdav-client-cpp/pull/8) ([designerror](https://github.com/designerror)) -- fix some bugs for building on macOS [\#7](https://github.com/designerror/webdav-client-cpp/pull/7) ([x10mind](https://github.com/x10mind)) -- Update README.md [\#6](https://github.com/designerror/webdav-client-cpp/pull/6) ([x10mind](https://github.com/x10mind)) +- Update .travis.yml [\#14](https://github.com/CloudPolis/webdav-client-cpp/pull/14) ([designerror](https://github.com/designerror)) +- ifndef/define xxx\_H and final/or\_virt\_destructor [\#13](https://github.com/CloudPolis/webdav-client-cpp/pull/13) ([x10mind](https://github.com/x10mind)) +- Update build\_requirements.unix.sh [\#10](https://github.com/CloudPolis/webdav-client-cpp/pull/10) ([designerror](https://github.com/designerror)) +- Update .travis.yml [\#9](https://github.com/CloudPolis/webdav-client-cpp/pull/9) ([designerror](https://github.com/designerror)) +- Update README.md [\#8](https://github.com/CloudPolis/webdav-client-cpp/pull/8) ([designerror](https://github.com/designerror)) +- fix some bugs for building on macOS [\#7](https://github.com/CloudPolis/webdav-client-cpp/pull/7) ([x10mind](https://github.com/x10mind)) +- Update README.md [\#6](https://github.com/CloudPolis/webdav-client-cpp/pull/6) ([x10mind](https://github.com/x10mind)) -## [v0.9.9](https://github.com/designerror/webdav-client-cpp/tree/v0.9.9) (2016-10-14) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.8...v0.9.9) +## [v0.9.9](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.9) (2016-10-14) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.8...v0.9.9) **Merged pull requests:** -- Update .travis.yml [\#4](https://github.com/designerror/webdav-client-cpp/pull/4) ([x10mind](https://github.com/x10mind)) +- Update .travis.yml [\#4](https://github.com/CloudPolis/webdav-client-cpp/pull/4) ([x10mind](https://github.com/x10mind)) -## [v0.9.8](https://github.com/designerror/webdav-client-cpp/tree/v0.9.8) (2016-10-12) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.7...v0.9.8) +## [v0.9.8](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.8) (2016-10-12) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.7...v0.9.8) -## [v0.9.7](https://github.com/designerror/webdav-client-cpp/tree/v0.9.7) (2016-10-12) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.6...v0.9.7) +## [v0.9.7](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.7) (2016-10-12) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.6...v0.9.7) -## [v0.9.6](https://github.com/designerror/webdav-client-cpp/tree/v0.9.6) (2016-10-11) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.5...v0.9.6) +## [v0.9.6](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.6) (2016-10-11) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.5...v0.9.6) **Closed issues:** -- bug [\#2](https://github.com/designerror/webdav-client-cpp/issues/2) +- bug [\#2](https://github.com/CloudPolis/webdav-client-cpp/issues/2) -## [v0.9.5](https://github.com/designerror/webdav-client-cpp/tree/v0.9.5) (2016-04-06) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.4...v0.9.5) +## [v0.9.5](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.5) (2016-04-06) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.4...v0.9.5) -## [v0.9.4](https://github.com/designerror/webdav-client-cpp/tree/v0.9.4) (2016-04-06) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.3...v0.9.4) +## [v0.9.4](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.4) (2016-04-06) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.3...v0.9.4) -## [v0.9.3](https://github.com/designerror/webdav-client-cpp/tree/v0.9.3) (2016-04-05) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.2...v0.9.3) +## [v0.9.3](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.3) (2016-04-05) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.2...v0.9.3) -## [v0.9.2](https://github.com/designerror/webdav-client-cpp/tree/v0.9.2) (2016-04-05) -[Full Changelog](https://github.com/designerror/webdav-client-cpp/compare/v0.9.1...v0.9.2) +## [v0.9.2](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.2) (2016-04-05) +[Full Changelog](https://github.com/CloudPolis/webdav-client-cpp/compare/v0.9.1...v0.9.2) -## [v0.9.1](https://github.com/designerror/webdav-client-cpp/tree/v0.9.1) (2015-07-15) +## [v0.9.1](https://github.com/CloudPolis/webdav-client-cpp/tree/v0.9.1) (2015-07-15) -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file From ec9b3605827fe55d64e8d39f949b9d4758048ad8 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 27 Jul 2017 01:42:05 +0300 Subject: [PATCH 049/133] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 192af95..8753f43 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ WebDAV Client === -[![version](https://img.shields.io/badge/version-1.0.4-brightgreen.svg)](https://github.com/designerror/webdav-client-cpp/releases/tag/v1.0.4) +[![version](https://img.shields.io/badge/version-1.0.5-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.5) [![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) From 9a36b6023f7ae8a79dd506322ead65f410d58686 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 27 Jul 2017 13:00:37 +0300 Subject: [PATCH 050/133] fixed syntax error for clang-libstdcxx --- CMakeLists.txt | 4 ++-- README.md | 2 +- sources/fsinfo.cpp | 1 + sources/urn.cpp | 4 ++-- sources/urn.hpp | 1 + 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 19f182d..78969b6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,11 +31,11 @@ HunterGate( project(wdc) -include($ENV{POLLY_ROOT}/analyze.cmake OPTIONAL) +#include($ENV{POLLY_ROOT}/analyze.cmake OPTIONAL) set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 0) -set(WDC_VERSION_PATCH 5) +set(WDC_VERSION_PATCH 6) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) set(CMAKE_CXX_STANDARD 11) diff --git a/README.md b/README.md index 8753f43..e4167fc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ WebDAV Client === -[![version](https://img.shields.io/badge/version-1.0.5-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.5) +[![version](https://img.shields.io/badge/version-1.0.6-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.6) [![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) diff --git a/sources/fsinfo.cpp b/sources/fsinfo.cpp index 9e3b5d2..ba247ba 100644 --- a/sources/fsinfo.cpp +++ b/sources/fsinfo.cpp @@ -22,6 +22,7 @@ #include "fsinfo.hpp" +#include namespace WebDAV { diff --git a/sources/urn.cpp b/sources/urn.cpp index e77f219..e5fbc7a 100644 --- a/sources/urn.cpp +++ b/sources/urn.cpp @@ -44,7 +44,7 @@ namespace WebDAV { auto first_position = path.find(Path::separate); if (first_position != 0) path = Path::root + path; auto last_symbol_index = path.length() - 1; - auto last_symbol = string{ path[last_symbol_index] }; + auto last_symbol = path.substr(last_symbol_index, 1); auto is_dir = Path::separate.compare(last_symbol) == 0; if (force_dir && !is_dir) path += Path::separate; m_path = path; @@ -196,4 +196,4 @@ namespace WebDAV { auto operator<<(std::ostream& stream, const WebDAV::Urn::Path& path) -> std::ostream& { return stream << path.path(); -} \ No newline at end of file +} diff --git a/sources/urn.hpp b/sources/urn.hpp index 18703e9..c35067b 100644 --- a/sources/urn.hpp +++ b/sources/urn.hpp @@ -24,6 +24,7 @@ #define WEBDAV_URN_H #include +#include #include using std::string; From fd5ea5cb1d08dd6783414b7d7ab5b74d6ba50169 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 27 Jul 2017 13:48:12 +0300 Subject: [PATCH 051/133] fixed syntax error for clang-libstdcxx --- sources/urn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/urn.cpp b/sources/urn.cpp index e5fbc7a..ee00785 100644 --- a/sources/urn.cpp +++ b/sources/urn.cpp @@ -145,7 +145,7 @@ namespace WebDAV { auto path = this->path(); auto last_symbol_index = path.length() - 1; - auto last_symbol = std::string{path[last_symbol_index]}; + auto last_symbol = path.substr(last_symbol_index, 1); auto is_equal = Path::separate.compare(last_symbol) == 0; return is_equal; } From 9edafdb0eabb6fd11bf38cf8b26ff33d2453293d Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 27 Jul 2017 22:08:47 +0300 Subject: [PATCH 052/133] fixed #31 --- CMakeLists.txt | 2 +- README.md | 2 +- sources/client.cpp | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78969b6..90ca6ea 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ project(wdc) set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 0) -set(WDC_VERSION_PATCH 6) +set(WDC_VERSION_PATCH 7) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) set(CMAKE_CXX_STANDARD 11) diff --git a/README.md b/README.md index e4167fc..4a3b9bc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ WebDAV Client === -[![version](https://img.shields.io/badge/version-1.0.6-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.6) +[![version](https://img.shields.io/badge/version-1.0.7-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.7) [![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) diff --git a/sources/client.cpp b/sources/client.cpp index 89a9c45..7dc5749 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -21,6 +21,7 @@ ############################################################################*/ #include +#include #include #include "pugiext.hpp" #include "header.hpp" @@ -464,7 +465,7 @@ namespace WebDAV pugi::xml_node quota_available_bytes = prop.select_node("*[local-name()='quota-available-bytes']").node(); std::string free_size_text = quota_available_bytes.first_child().value(); - auto free_size = atol(free_size_text.c_str()); + auto free_size = std::atoll(free_size_text.c_str()); return free_size; } From 8b4352a31e250731cb0585795089bcef54febcc5 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 28 Jul 2017 10:35:49 +0300 Subject: [PATCH 053/133] added namespace wor tagret --- CMakeLists.txt | 20 +++++++++++--------- README.md | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 90ca6ea..de30705 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,13 +29,13 @@ HunterGate( LOCAL # issue #29 ) -project(wdc) +project(WDC) #include($ENV{POLLY_ROOT}/analyze.cmake OPTIONAL) set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 0) -set(WDC_VERSION_PATCH 7) +set(WDC_VERSION_PATCH 8) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) set(CMAKE_CXX_STANDARD 11) @@ -61,23 +61,25 @@ find_package(pugixml CONFIG REQUIRED) file(GLOB ${PROJECT_NAME}_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/sources/*.cpp") include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/) -add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SOURCES}) +add_library(libwdc ${${PROJECT_NAME}_SOURCES}) +set_target_properties(libwdc PROPERTIES PREFIX "") +set_target_properties(libwdc PROPERTIES IMPORT_PREFIX "") -target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) +target_link_libraries(libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) -target_include_directories(${PROJECT_NAME} PUBLIC +target_include_directories(libwdc PUBLIC $ $ ) -install(TARGETS ${PROJECT_NAME} +install(TARGETS libwdc EXPORT ${PROJECT_NAME}-config RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include) -install(EXPORT ${PROJECT_NAME}-config DESTINATION cmake) +install(EXPORT ${PROJECT_NAME}-config NAMESPACE WDC:: DESTINATION cmake) if(BUILD_PKGCONFIG) configure_file(scripts/wdc.pc.in ${PROJECT_BINARY_DIR}/wdc.pc @ONLY) @@ -94,7 +96,7 @@ if(BUILD_TESTS) file(GLOB ${PROJECT_NAME}_TEST_SOURCES tests/*.cpp) add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) - target_link_libraries(check ${PROJECT_NAME} Catch::Catch Boost::filesystem Boost::system) + target_link_libraries(check libwdc Catch::Catch Boost::filesystem Boost::system) add_test(NAME check COMMAND check "-s" "-r" "compact" "--use-colour" "yes") endif() @@ -105,7 +107,7 @@ if(BUILD_EXAMPLES) get_filename_component(EXAMPLE_NAME ${EXAMPLE_SOURCE} NAME_WE) set(EXAMPLE_TARGET_NAME example_${EXAMPLE_NAME}) add_executable(${EXAMPLE_TARGET_NAME} ${EXAMPLE_SOURCE}) - target_link_libraries(${EXAMPLE_TARGET_NAME} ${PROJECT_NAME}) + target_link_libraries(${EXAMPLE_TARGET_NAME} libwdc) set_target_properties(${EXAMPLE_TARGET_NAME} PROPERTIES OUTPUT_NAME ${EXAMPLE_NAME}) install(TARGETS ${EXAMPLE_TARGET_NAME} RUNTIME DESTINATION bin diff --git a/README.md b/README.md index 4a3b9bc..dfc86fc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ WebDAV Client === -[![version](https://img.shields.io/badge/version-1.0.7-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.7) +[![version](https://img.shields.io/badge/version-1.0.8-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.8) [![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) From cd534b25edc41abd9bd7934c2bdffa1b5526a7bf Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 28 Jul 2017 10:57:29 +0300 Subject: [PATCH 054/133] added namespace for tagret --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index de30705..7f1c7c3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,13 +73,13 @@ target_include_directories(libwdc PUBLIC ) install(TARGETS libwdc - EXPORT ${PROJECT_NAME}-config + EXPORT wdc-config RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include) -install(EXPORT ${PROJECT_NAME}-config NAMESPACE WDC:: DESTINATION cmake) +install(EXPORT wdc-config NAMESPACE WDC:: DESTINATION cmake) if(BUILD_PKGCONFIG) configure_file(scripts/wdc.pc.in ${PROJECT_BINARY_DIR}/wdc.pc @ONLY) From f5c30738fd58465195155af4f4b715f0eb2b4093 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 28 Jul 2017 18:35:20 +0300 Subject: [PATCH 055/133] move stage install dependens into find_package --- CMakeLists.txt | 57 +++++++++++++++++++++++++++++++++---------- README.md | 2 +- cmake/Config.cmake.in | 8 ++++++ 3 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 cmake/Config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f1c7c3..ee84e9e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,20 +24,19 @@ cmake_minimum_required(VERSION 3.3) include("cmake/HunterGate.cmake") HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.19.45.tar.gz" - SHA1 "56b690cd9bf54de1099727672b8525a4102f124f" - LOCAL # issue #29 + URL "https://github.com/ruslo/hunter/archive/v0.19.51.tar.gz" + SHA1 "d238dc1dd4db83e45a592f96fdb95d17c688600a" ) -project(WDC) - -#include($ENV{POLLY_ROOT}/analyze.cmake OPTIONAL) - set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 0) -set(WDC_VERSION_PATCH 8) +set(WDC_VERSION_PATCH 9) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) +project(WDC VERSION ${WDC_VERSION}) + +#include($ENV{POLLY_ROOT}/analyze.cmake OPTIONAL) + set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") @@ -47,9 +46,6 @@ option(BUILD_EXAMPLES "Build Examples" OFF) option(BUILD_PKGCONFIG "Build in PKGCONFIG mode" OFF) option(WDC_VERBOSE "Print verbose information" OFF) -if(WDC_VERBOSE) - add_definitions(-DWDC_VERBOSE) -endif() hunter_add_package(OpenSSL) find_package(OpenSSL REQUIRED) @@ -64,6 +60,9 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/) add_library(libwdc ${${PROJECT_NAME}_SOURCES}) set_target_properties(libwdc PROPERTIES PREFIX "") set_target_properties(libwdc PROPERTIES IMPORT_PREFIX "") +if(WDC_VERBOSE) + target_compile_definitions(libwdc PUBLIC WDC_VERBOSE=1) +endif() target_link_libraries(libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) @@ -72,14 +71,46 @@ target_include_directories(libwdc PUBLIC $ ) +# Install + +set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") + +set(CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}") +set(INCLUDE_INSTALL_DIR "include") + +set(VERSION_CONFIG "${GENERATED_DIR}/${PROJECT_NAME}ConfigVersion.cmake") +set(PROJECT_CONFIG "${GENERATED_DIR}/${PROJECT_NAME}Config.cmake") +set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") +set(NAMESPACE "${PROJECT_NAME}::") + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${VERSION_CONFIG}" COMPATIBILITY SameMajorVersion +) + +configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in" + "${PROJECT_CONFIG}" + INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}" +) + install(TARGETS libwdc - EXPORT wdc-config + EXPORT "${TARGETS_EXPORT_NAME}" RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) + install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include) -install(EXPORT wdc-config NAMESPACE WDC:: DESTINATION cmake) + +install( + FILES "${PROJECT_CONFIG}" "${VERSION_CONFIG}" + DESTINATION "${CONFIG_INSTALL_DIR}" + ) + +install(EXPORT "${TARGETS_EXPORT_NAME}" + NAMESPACE "${NAMESPACE}" + DESTINATION "${CONFIG_INSTALL_DIR}") if(BUILD_PKGCONFIG) configure_file(scripts/wdc.pc.in ${PROJECT_BINARY_DIR}/wdc.pc @ONLY) diff --git a/README.md b/README.md index dfc86fc..2b9d44b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ WebDAV Client === -[![version](https://img.shields.io/badge/version-1.0.8-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.8) +[![version](https://img.shields.io/badge/version-1.0.9-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) [![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 0000000..d0325c7 --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,8 @@ +@PACKAGE_INIT@ + +find_package(OpenSSL REQUIRED) +find_package(CURL CONFIG REQUIRED) +find_package(pugixml CONFIG REQUIRED) + +include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") +check_required_components("@PROJECT_NAME@") From 72fde3e0a80092a6c10d30c7b63dcf4c14b47c0e Mon Sep 17 00:00:00 2001 From: The Gitter Badger Date: Fri, 28 Jul 2017 18:20:57 +0000 Subject: [PATCH 056/133] Add Gitter badge --- README.md | 122 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 68 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index ea186a9..3ced277 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ WebDAV Client === +[![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![version](https://img.shields.io/badge/version-1.0.9-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) +[![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) +[![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) + Package ```WebDAV Client``` provides easy and convenient to work with WebDAV-servers: - Yandex.Disk @@ -13,85 +19,93 @@ Package ```WebDAV Client``` provides easy and convenient to work with WebDAV-ser Install === -```bash -> git clone https://github.com/designerror/webdav-client-cpp.git -> cd webdav-client-cpp -> clion . +```ShellSession +# via brew or homebrew +$ brew install wdc +``` + +Build +=== + +**Building WebDAV Client from sources** + +```ShellSession +$ git clone https://github.com/designerror/webdav-client-cpp +$ cd webdav-client-cpp +$ cmake -H. -B_builds # -DCMAKE_INSTALL_PREFIX=install +$ cmake --build _builds +$ cmake --build _builds --target install ``` Documentation === -```bash -> cd docs -> doxygen doxygen.conf -> firefox html/index.html +```ShellSession +$ cd docs +$ doxygen doxygen.conf +$ open html/index.html ``` Usage examples === -```c++ +```C++ #include #include #include int main() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_login", "webdav_login"}, - {"webdav_password", "webdav_password"} - }; + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "webdav_username"}, + {"webdav_password", "webdav_password"} + }; + // additional keys: + // - webdav_root + // - cert_path, key_path + // - proxy_hostname, proxy_username, proxy_password - std::shared_ptr client(WebDAV::Client::Init(options)); + std::shared_ptr client(WebDAV::Client::Init(options)); - auto check_connection = client->check(); - std::cout << "test connection with WebDAV drive is " - << (check_connection ? "" : "not ") - << "successful"<< std::endl; + auto check_connection = client->check(); + std::cout << "test connection with WebDAV drive is " + << (check_connection ? "" : "not ") + << "successful"<< std::endl; - auto is_directory = client->is_dir("/path/to/remote/resource"); - std::cout << "remote resource is " - << (is_directory ? "" : "not ") - << "directory" << std::endl; + auto is_dir = client->is_directory("/path/to/remote/resource"); + std::cout << "remote resource is " + << (is_dir ? "" : "not ") + << "directory" << std::endl; - client->create_directory("/path/to/remote/directory/"); - client->clean("/path/to/remote/directory/"); + client->create_directory("/path/to/remote/directory/"); + client->clean("/path/to/remote/directory/"); - std::cout << "On WebDAV-disk available free space: " - << client->free_size() - << std::endl; + std::cout << "On WebDAV-disk available free space: " + << client->free_size() + << std::endl; - std::cout << "remote_directory_name"; - for(auto resource_name : client->list("/path/to/remote/directory/")) - { - std::cout << "\t" << "-" << resource_name; - } - std::cout << std::endl; + std::cout << "remote_directory_name"; + for(auto& resource_name : client->list("/path/to/remote/directory/")) { + std::cout << "\t" << "-" << resource_name; + } + std::cout << std::endl; - client->download("/path/to/remote/file", "/path/to/local/file"); - client->clean("/path/to/remote/file"); - client->upload("/path/to/remote/file", "/path/to/local/file"); + client->download("/path/to/remote/file", "/path/to/local/file"); + client->clean("/path/to/remote/file"); + client->upload("/path/to/remote/file", "/path/to/local/file"); - auto meta_info = client->info("/path/to/remote/resource"); - for(auto field : meta_info) - { - std::cout << field.first << ":" << "\t" << field.second; - } - std::cout << std::endl; + auto meta_info = client->info("/path/to/remote/resource"); + for(auto& field : meta_info) { + std::cout << field.first << ":" << "\t" << field.second; + } + std::cout << std::endl; - client->copy("/path/to/remote/file1", "/path/to/remote/file2"); - client->move("/path/to/remote/file1", "/path/to/remote/file3"); + client->copy("/path/to/remote/file1", "/path/to/remote/file2"); + client->move("/path/to/remote/file1", "/path/to/remote/file3"); - client->async_upload("/path/to/remote/file", "/path/to/local/file"); - client->async_download("/path/to/remote/file", "/path/to/local/file"); + client->async_upload("/path/to/remote/file", "/path/to/local/file"); + client->async_download("/path/to/remote/file", "/path/to/local/file"); } ``` - -Acknowledgments -=== -Thanks to the `JetBrains` company for - - From b7d2a7a2fbb3a570453270bac9433694f3f56564 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 28 Jul 2017 21:24:28 +0300 Subject: [PATCH 057/133] Update README.md [skip ci] --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 3ced277..fb2a775 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ WebDAV Client [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![version](https://img.shields.io/badge/version-1.0.9-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) -[![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) From a9236d7ec3a1920255732acfadc1672583566aea Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 28 Jul 2017 21:25:28 +0300 Subject: [PATCH 058/133] Update README.md [skip ci] --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index bf486ea..8c32e65 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,5 @@ WebDAV Client === -[![version](https://img.shields.io/badge/version-1.0.9-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) -[![Gitter](https://badges.gitter.im/designerror/webdav-client-cpp.svg)](https://gitter.im/designerror/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -[![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) -[![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) - [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![version](https://img.shields.io/badge/version-1.0.9-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) From b51dc1659a1b7505faa4749ed7224fc0783914e6 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 28 Jul 2017 21:31:58 +0300 Subject: [PATCH 059/133] Update README.md [skip ci] --- README.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8c32e65..b903d22 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ $ brew install wdc Build === -**Building WebDAV Client from sources** +Building WebDAV Client from sources: ```ShellSession $ git clone https://github.com/designerror/webdav-client-cpp @@ -44,9 +44,10 @@ $ doxygen doxygen.conf $ open html/index.html ``` -Usage examples +Usage === +**example.cpp** ```C++ #include #include @@ -107,3 +108,22 @@ int main() client->async_download("/path/to/remote/file", "/path/to/local/file"); } ``` + +**CMakeLists.txt** +```cmake +cmake_minimum_required(VERSION 3.3) + +include(cmake/HunterGate.cmake) +HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.19.51.tar.gz" + SHA1 "d238dc1dd4db83e45a592f96fdb95d17c688600a" +) + +project(example) + +hunter_add_package(WDC) +find_package(WDC CONFIG REQUIRED) + +add_executable(example example.cpp) +target_link_libraries(example WDC::libwdc) +``` From 87fca38c0937376c61ffd61eb142f3f0dfba8869 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 29 Jul 2017 00:21:04 +0300 Subject: [PATCH 060/133] Update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b903d22..bdd5be4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ WebDAV Client === +[![version](https://img.shields.io/badge/hunter-v0.19.51-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.51) [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![version](https://img.shields.io/badge/version-1.0.9-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) From 2b7da69be94bd209700fb59e512d57caf817b4eb Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 29 Jul 2017 00:23:01 +0300 Subject: [PATCH 061/133] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bdd5be4..598ea21 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ WebDAV Client === [![version](https://img.shields.io/badge/hunter-v0.19.51-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.51) -[![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![version](https://img.shields.io/badge/version-1.0.9-brightgreen.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) +[![version](https://img.shields.io/badge/wdc-v1.0.9-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) +[![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) Package ```WebDAV Client``` provides easy and convenient to work with WebDAV-servers: From e4532bac99b8c107b1d3a449a2ddd40868557dd1 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 29 Jul 2017 01:07:46 +0300 Subject: [PATCH 062/133] Update .travis.yml --- .travis.yml | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5110d88..69fb6af 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ addons: packages: - clang-3.6 - gcc-5 + - lcov sources: - llvm-toolchain-trusty-3.6 - ubuntu-toolchain-r-test @@ -19,25 +20,42 @@ matrix: include: - os: linux compiler: gcc-5 - env: COMPILER="g++-5" + env: COMPILER="g++-5" BUILD_TYPE=Debug - os: linux compiler: clang-3.6 - env: COMPILER="clang++-3.6" + env: COMPILER="clang++-3.6" BUILD_TYPE=Debug - os: osx compiler: clang-3.6 - env: COMPILER="clang++-3.6" + env: COMPILER="clang++-3.6" BUILD_TYPE=Debug + - os: linux + compiler: gcc + addons: + apt: + packages: + - lcov + env: COMPILER=g++ BUILD_TYPE=Coverage install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz; sudo tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; fi +- if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then + PATH=~/.local/bin:${PATH}; + pip install --user --upgrade pip; + pip install --user cpp-coveralls; + fi cache: directories: - $HOME/.hunter script: -- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug +- cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=${BUILD_TYPE} - cmake --build _builds - cmake --build _builds --target test -- ARGS=--verbose + +after_success: +- if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then + coveralls --include sources --include include --gcov-options '\-lp' --root .. --build-root .; + fi From dfc37083452e5f4257f8f9469d958213c83ca588 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 29 Jul 2017 01:09:42 +0300 Subject: [PATCH 063/133] Update README.md [skip ci] --- README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 598ea21..c8d6f0d 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,10 @@ $ cmake --build _builds $ cmake --build _builds --target install ``` -Documentation -=== - +Building documentation: ```ShellSession -$ cd docs -$ doxygen doxygen.conf -$ open html/index.html +$ doxygen docs/doxygen.conf +$ open docs/html/index.html ``` Usage From b6b1f4c4b607d4550ec9a8fb13a3820335a343fb Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 29 Jul 2017 01:12:40 +0300 Subject: [PATCH 064/133] Update .travis.yml --- .travis.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 69fb6af..93f1591 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,6 @@ addons: packages: - clang-3.6 - gcc-5 - - lcov sources: - llvm-toolchain-trusty-3.6 - ubuntu-toolchain-r-test @@ -28,12 +27,12 @@ matrix: compiler: clang-3.6 env: COMPILER="clang++-3.6" BUILD_TYPE=Debug - os: linux - compiler: gcc - addons: - apt: - packages: - - lcov - env: COMPILER=g++ BUILD_TYPE=Coverage + compiler: gcc-5 + addons: + apt: + packages: + - lcov + env: COMPILER="g++-5" BUILD_TYPE=Coverage install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then From efba2145b6aa32fcf70cf8fb2432b42b74d3739f Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 29 Jul 2017 01:14:04 +0300 Subject: [PATCH 065/133] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 93f1591..419af49 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ matrix: apt: packages: - lcov - env: COMPILER="g++-5" BUILD_TYPE=Coverage + env: COMPILER="g++-5" BUILD_TYPE=Coverage install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then From fc263fc633414f1ac29a0f8bcc8b81aa43aef310 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 29 Jul 2017 01:25:48 +0300 Subject: [PATCH 066/133] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 419af49..143fa03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,5 +56,5 @@ script: after_success: - if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then - coveralls --include sources --include include --gcov-options '\-lp' --root .. --build-root .; + coveralls --include sources --include include --gcov-options '\-lp' --root . --build-root _builds; fi From af39de80668b0b6890f4128155e1e1298cc17b5b Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 5 Aug 2017 12:19:15 +0300 Subject: [PATCH 067/133] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 143fa03..678f1b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,7 +52,7 @@ cache: script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=${BUILD_TYPE} - cmake --build _builds -- cmake --build _builds --target test -- ARGS=--verbose +- cmake --build _builds --target test -- ARGS="--verbose -C=${BUILD_TYPE}" after_success: - if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then From b68ee60971cc5aed67e87e8314ffaf303dda9b41 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 5 Aug 2017 21:46:42 +0300 Subject: [PATCH 068/133] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c8d6f0d..8d9a0b4 100644 --- a/README.md +++ b/README.md @@ -113,8 +113,8 @@ cmake_minimum_required(VERSION 3.3) include(cmake/HunterGate.cmake) HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.19.51.tar.gz" - SHA1 "d238dc1dd4db83e45a592f96fdb95d17c688600a" + URL "https://github.com/ruslo/hunter/archive/v0.19.59.tar.gz" + SHA1 "7d300d183cd7e235ef881639d3009a85362fff1c" ) project(example) From 4f4de01c53feb60da9480658982893a261d18c47 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 8 Aug 2017 10:07:58 +0300 Subject: [PATCH 069/133] removed pimpl --- CMakeLists.txt | 4 +- README.md | 6 +- examples/cli/cli.cpp | 4 +- examples/client/check.cpp | 2 +- examples/client/copy.cpp | 2 +- examples/client/download.cpp | 10 +- examples/client/info.cpp | 2 +- examples/client/init.cpp | 2 +- examples/client/list.cpp | 2 +- examples/client/mkdir.cpp | 2 +- examples/client/move.cpp | 2 +- examples/client/remove.cpp | 3 +- examples/client/size.cpp | 3 +- examples/client/upload.cpp | 11 +- include/webdav/client.hpp | 77 +++++++-- sources/callback.hpp | 5 +- sources/client.cpp | 318 +++++++++++++---------------------- sources/fsinfo.hpp | 5 +- sources/header.hpp | 5 +- sources/pugiext.hpp | 6 +- sources/request.hpp | 5 +- sources/urn.hpp | 4 +- tests/check.cpp | 4 +- tests/clean.cpp | 8 +- tests/download.cpp | 4 +- tests/list.cpp | 6 +- tests/upload.cpp | 6 +- 27 files changed, 233 insertions(+), 275 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ee84e9e..a3b549d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,8 +29,8 @@ HunterGate( ) set(WDC_VERSION_MAJOR 1) -set(WDC_VERSION_MINOR 0) -set(WDC_VERSION_PATCH 9) +set(WDC_VERSION_MINOR 1) +set(WDC_VERSION_PATCH 0) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) diff --git a/README.md b/README.md index c8d6f0d..021e9ae 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ WebDAV Client === -[![version](https://img.shields.io/badge/hunter-v0.19.51-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.51) -[![version](https://img.shields.io/badge/wdc-v1.0.9-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.0.9) +[![version](https://img.shields.io/badge/hunter-v0.19.54-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.54) +[![version](https://img.shields.io/badge/wdc-v1.1.0-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.0) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -64,7 +64,7 @@ int main() // - cert_path, key_path // - proxy_hostname, proxy_username, proxy_password - std::shared_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; auto check_connection = client->check(); std::cout << "test connection with WebDAV drive is " diff --git a/examples/cli/cli.cpp b/examples/cli/cli.cpp index 738d9d7..e362dba 100644 --- a/examples/cli/cli.cpp +++ b/examples/cli/cli.cpp @@ -80,7 +80,7 @@ int main(int argc, char * argv[]) { options["webdav_root"] = root_ptr; } - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; if (command == "check") { bool is_existed = client->check(remote_resource); @@ -128,4 +128,4 @@ int main(int argc, char * argv[]) { catch (std::runtime_error& error) { std::cout << error.what() << std::endl; } -} \ No newline at end of file +} diff --git a/examples/client/check.cpp b/examples/client/check.cpp index 07d0020..50269e8 100644 --- a/examples/client/check.cpp +++ b/examples/client/check.cpp @@ -44,7 +44,7 @@ int main() { options["webdav_root"] = root_ptr; } - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_resources = { "existing_file.dat", diff --git a/examples/client/copy.cpp b/examples/client/copy.cpp index cb3adbe..7ef2067 100644 --- a/examples/client/copy.cpp +++ b/examples/client/copy.cpp @@ -56,7 +56,7 @@ int main() { options["webdav_root"] = root_ptr; } - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_file = "file.dat"; auto remote_directory = "dir/"; diff --git a/examples/client/download.cpp b/examples/client/download.cpp index 1cf9488..245b8af 100644 --- a/examples/client/download.cpp +++ b/examples/client/download.cpp @@ -35,7 +35,7 @@ void download_to_file() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; auto local_file = "/home/user/Downloads/file.dat"; @@ -59,7 +59,7 @@ void async_download_to_file() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; std::string local_file = "/home/user/Downloads/file.dat"; @@ -85,7 +85,7 @@ void download_to_buffer() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; char * buffer_ptr = nullptr; @@ -112,7 +112,7 @@ void async_download_to_buffer() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; char * buffer_ptr = nullptr; @@ -140,7 +140,7 @@ void download_from_stream() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; std::ofstream stream("/home/user/Downloads/file.dat"); diff --git a/examples/client/info.cpp b/examples/client/info.cpp index ed3bc39..a24d21e 100644 --- a/examples/client/info.cpp +++ b/examples/client/info.cpp @@ -55,7 +55,7 @@ int main() { options["webdav_root"] = root_ptr; } - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_resources = { "existing_file.dat", diff --git a/examples/client/init.cpp b/examples/client/init.cpp index 0d0be14..29c9f34 100644 --- a/examples/client/init.cpp +++ b/examples/client/init.cpp @@ -68,7 +68,7 @@ int main() { }; for (auto options : various_options) { - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; bool is_connected = client->check(); std::cout << "Client with options: " << std::endl; std::cout << options_to_string(options); diff --git a/examples/client/list.cpp b/examples/client/list.cpp index e87b7f8..2c15ab6 100644 --- a/examples/client/list.cpp +++ b/examples/client/list.cpp @@ -55,7 +55,7 @@ int main() { options["webdav_root"] = root_ptr; } - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_resources = { "/", diff --git a/examples/client/mkdir.cpp b/examples/client/mkdir.cpp index 8e2c1d0..77d17de 100644 --- a/examples/client/mkdir.cpp +++ b/examples/client/mkdir.cpp @@ -31,7 +31,7 @@ int main() { { "webdav_password", "{webdav_password}" } }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_directories = { "existing_directory", diff --git a/examples/client/move.cpp b/examples/client/move.cpp index fd3eb3a..d61af41 100644 --- a/examples/client/move.cpp +++ b/examples/client/move.cpp @@ -42,7 +42,7 @@ int main() { { "webdav_password", "{webdav_password}" } }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_file = "file.dat"; auto remote_directory = "dir/"; diff --git a/examples/client/remove.cpp b/examples/client/remove.cpp index df04af7..15fc156 100644 --- a/examples/client/remove.cpp +++ b/examples/client/remove.cpp @@ -31,7 +31,8 @@ int main() { { "webdav_password", "{webdav_password}" } }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; + bool is_connected = client->check(); auto remote_resources = { diff --git a/examples/client/size.cpp b/examples/client/size.cpp index b09e215..3c9df54 100644 --- a/examples/client/size.cpp +++ b/examples/client/size.cpp @@ -31,7 +31,8 @@ int main() { { "webdav_password", "{webdav_password}" } }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; + auto free_size = client->free_size(); std::cout << "Free size: " << free_size << " bytes" << std::endl; } diff --git a/examples/client/upload.cpp b/examples/client/upload.cpp index 7b1f099..238cea0 100644 --- a/examples/client/upload.cpp +++ b/examples/client/upload.cpp @@ -35,8 +35,7 @@ void upload_from_file() {"webdav_password", "{webdav_password}"} }; - - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; std::string local_file = "/home/user/Downloads/file.dat"; @@ -61,7 +60,7 @@ void async_upload_from_file() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; std::string local_file = "/home/user/Downloads/file.dat"; @@ -87,7 +86,7 @@ void upload_from_buffer() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; char * buffer_ptr = nullptr; @@ -113,7 +112,7 @@ void async_upload_from_buffer() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; char * buffer_ptr = nullptr; @@ -141,7 +140,7 @@ void upload_from_stream() {"webdav_password", "{webdav_password}"} }; - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; std::string remote_file = "dir/file.dat"; std::ifstream stream("/home/user/Downloads/file.dat"); diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index c470cfd..9c834b1 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -20,9 +20,8 @@ # ############################################################################*/ -#ifndef WEBDAV_CLIENT_H -#define WEBDAV_CLIENT_H -#pragma once +#ifndef WEBDAV_CLIENT_HPP +#define WEBDAV_CLIENT_HPP #include #include @@ -46,8 +45,8 @@ namespace WebDAV /// /// \brief WebDAV Client /// \author designerror - /// \version 1.0.1 - /// \date 08/11/2016 + /// \version 1.1.0 + /// \date 08/8/2016 /// class Client { @@ -65,10 +64,7 @@ namespace WebDAV /// \param[in] key_path /// \include client/init.cpp /// - static auto Init(const dict_t& options) noexcept -> Client *; - - /// This function releases resources acquired by curl_global_init - static void Cleanup() noexcept; + Client(const dict_t& options); /// /// Get free size of the WebDAV server @@ -256,14 +252,71 @@ namespace WebDAV progress_t progress = nullptr ) const noexcept -> void; - - virtual ~Client() {}; + virtual ~Client(); protected: + auto sync_download( + const std::string& remote_file, + const std::string& local_file, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const noexcept -> bool; + + auto sync_download_to( + const std::string& remote_file, + char * & buffer_ptr, + unsigned long long int & buffer_size, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const noexcept -> bool; + + bool sync_download_to( + const std::string& remote_file, + std::ostream& stream, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const noexcept; + + bool sync_upload( + const std::string& remote_file, + const std::string& local_file, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const noexcept; + + auto sync_upload_from( + const std::string& remote_file, + char * buffer_ptr, + unsigned long long int buffer_size, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const noexcept -> bool; + + auto sync_upload_from( + const std::string& remote_file, + std::istream& stream, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const noexcept -> bool; + + private: + enum { buffer_size = 1000 * 1000 }; - Client() {} + std::string webdav_hostname; + std::string webdav_root; + std::string webdav_username; + std::string webdav_password; + + std::string proxy_hostname; + std::string proxy_username; + std::string proxy_password; + + std::string cert_path; + std::string key_path; + + dict_t options() const noexcept; }; } diff --git a/sources/callback.hpp b/sources/callback.hpp index 223b53d..77475b4 100644 --- a/sources/callback.hpp +++ b/sources/callback.hpp @@ -20,9 +20,8 @@ # ############################################################################*/ -#ifndef WEBDAV_CALLBACK_H -#define WEBDAV_CALLBACK_H -#pragma once +#ifndef WEBDAV_CALLBACK_HPP +#define WEBDAV_CALLBACK_HPP namespace WebDAV { diff --git a/sources/client.cpp b/sources/client.cpp index 7dc5749..e8ebd6d 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -32,10 +32,6 @@ namespace WebDAV { - using Urn::Path; - - using progress_funptr = int(*)(void *context, size_t dltotal, size_t dlnow, size_t ultotal, size_t ulnow); - auto inline get(const dict_t& options, const std::string&& name) -> std::string { auto it = options.find(name); @@ -43,126 +39,34 @@ namespace WebDAV else return it->second; } - class ClientImpl : public Client - { - public: - - void init() const noexcept; - - std::string webdav_hostname; - std::string webdav_root; - std::string webdav_username; - std::string webdav_password; - - std::string proxy_hostname; - std::string proxy_username; - std::string proxy_password; - - std::string cert_path; - std::string key_path; - - dict_t options() const noexcept; - - bool sync_download( - const std::string& remote_file, - const std::string& local_file, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept; - - bool sync_download_to( - const std::string& remote_file, - char * & buffer_ptr, - unsigned long long int & buffer_size, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept; - - bool sync_download_to( - const std::string& remote_file, - std::ostream& stream, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept; - - bool sync_upload( - const std::string& remote_file, - const std::string& local_file, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept; - - bool sync_upload_from( - const std::string& remote_file, - char * buffer_ptr, - unsigned long long int buffer_size, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept; - - bool sync_upload_from( - const std::string& remote_file, - std::istream& stream, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept; - - ClientImpl(const dict_t & options); - - ~ClientImpl(); - }; - - inline ClientImpl * GetImpl(Client * ptr) { return (ClientImpl *)ptr; } - inline const ClientImpl * GetImpl(const Client * ptr) { return (const ClientImpl *)ptr; } - - ClientImpl::ClientImpl(const dict_t& options) - { - this->webdav_hostname = get(options, "webdav_hostname"); - this->webdav_root = get(options, "webdav_root"); - this->webdav_username = get(options, "webdav_username"); - this->webdav_password = get(options, "webdav_password"); - - this->proxy_hostname = get(options, "proxy_hostname"); - this->proxy_username = get(options, "proxy_username"); - this->proxy_password = get(options, "proxy_password"); - - this->cert_path = get(options, "cert_path"); - this->key_path = get(options, "key_path"); - - this->init(); - } + using Urn::Path; - void - ClientImpl::init() const noexcept - { - curl_global_init(CURL_GLOBAL_DEFAULT); - } + using progress_funptr = int(*)(void *context, size_t dltotal, size_t dlnow, size_t ultotal, size_t ulnow); - dict_t - ClientImpl::options() const noexcept - { - return dict_t - { - { "webdav_hostname", this->webdav_hostname }, - { "webdav_root", this->webdav_root }, - { "webdav_username", this->webdav_username }, - { "webdav_password", this->webdav_password }, - { "proxy_hostname", this->proxy_hostname }, - { "proxy_username", this->proxy_username }, - { "proxy_password", this->proxy_password }, - { "cert_path", this->cert_path }, - { "key_path", this->key_path }, - }; - } + dict_t + Client::options() const noexcept + { + return dict_t + { + { "webdav_hostname", this->webdav_hostname }, + { "webdav_root", this->webdav_root }, + { "webdav_username", this->webdav_username }, + { "webdav_password", this->webdav_password }, + { "proxy_hostname", this->proxy_hostname }, + { "proxy_username", this->proxy_username }, + { "proxy_password", this->proxy_password }, + { "cert_path", this->cert_path }, + { "key_path", this->key_path }, + }; + } bool - ClientImpl::sync_download( - const std::string& remote_file, - const std::string& local_file, - callback_t callback, - progress_t progress - ) const noexcept - + Client::sync_download( + const std::string& remote_file, + const std::string& local_file, + callback_t callback, + progress_t progress + ) const noexcept { bool is_existed = this->check(remote_file); if (!is_existed) return false; @@ -196,13 +100,13 @@ namespace WebDAV } bool - ClientImpl::sync_download_to( - const std::string& remote_file, - char * & buffer_ptr, - unsigned long long int & buffer_size, - callback_t callback, - progress_t progress - ) const noexcept + Client::sync_download_to( + const std::string& remote_file, + char * & buffer_ptr, + unsigned long long int & buffer_size, + callback_t callback, + progress_t progress + ) const noexcept { bool is_existed = this->check(remote_file); if (!is_existed) return false; @@ -239,12 +143,12 @@ namespace WebDAV } bool - ClientImpl::sync_download_to( - const std::string& remote_file, - std::ostream & stream, - callback_t callback, - progress_t progress - ) const noexcept + Client::sync_download_to( + const std::string& remote_file, + std::ostream & stream, + callback_t callback, + progress_t progress + ) const noexcept { bool is_existed = this->check(remote_file); if (!is_existed) return false; @@ -277,12 +181,12 @@ namespace WebDAV } bool - ClientImpl::sync_upload( - const std::string& remote_file, - const std::string& local_file, - callback_t callback, - progress_t progress - ) const noexcept + Client::sync_upload( + const std::string& remote_file, + const std::string& local_file, + callback_t callback, + progress_t progress + ) const noexcept { bool is_existed = FileInfo::exists(local_file); if (!is_existed) return false; @@ -322,13 +226,13 @@ namespace WebDAV } bool - ClientImpl::sync_upload_from( - const std::string& remote_file, - char * buffer, - unsigned long long int buffer_size, - callback_t callback, - progress_t progress - ) const noexcept + Client::sync_upload_from( + const std::string& remote_file, + char * buffer, + unsigned long long int buffer_size, + callback_t callback, + progress_t progress + ) const noexcept { auto root_urn = Path(this->webdav_root, true); auto file_urn = root_urn + remote_file; @@ -364,12 +268,12 @@ namespace WebDAV } bool - ClientImpl::sync_upload_from( - const std::string& remote_file, - std::istream& stream, - callback_t callback, - progress_t progress - ) const noexcept + Client::sync_upload_from( + const std::string& remote_file, + std::istream& stream, + callback_t callback, + progress_t progress + ) const noexcept { auto root_urn = Path(this->webdav_root, true); auto file_urn = root_urn + remote_file; @@ -405,19 +309,26 @@ namespace WebDAV return is_performed; } - Client* Client::Init(const dict_t& options) noexcept + Client::Client(const dict_t& options) { - return new ClientImpl(options); - } + this->webdav_hostname = get(options, "webdav_hostname"); + this->webdav_root = get(options, "webdav_root"); + this->webdav_username = get(options, "webdav_username"); + this->webdav_password = get(options, "webdav_password"); - ClientImpl::~ClientImpl() { - } + this->proxy_hostname = get(options, "proxy_hostname"); + this->proxy_username = get(options, "proxy_username"); + this->proxy_password = get(options, "proxy_password"); - void Client::Cleanup() noexcept - { - curl_global_cleanup(); + this->cert_path = get(options, "cert_path"); + this->key_path = get(options, "key_path"); } + Client::~Client() + { + } + + unsigned long long Client::free_size() const noexcept { @@ -440,7 +351,7 @@ namespace WebDAV Data data = { 0, 0, 0 }; - Request request(GetImpl(this)->options()); + Request request(this->options()); request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); @@ -472,8 +383,7 @@ namespace WebDAV bool Client::check(const std::string& remote_resource) const noexcept { - auto clientImpl = GetImpl(this); - auto root_urn = Path(clientImpl->webdav_root, true); + auto root_urn = Path(this->webdav_root, true); auto resource_urn = root_urn + remote_resource; Header header = { @@ -483,9 +393,9 @@ namespace WebDAV Data data = { 0, 0, 0 }; - Request request(clientImpl->options()); + Request request(this->options()); - auto url = clientImpl->webdav_hostname + resource_urn.quote(request.handle); + auto url = this->webdav_hostname + resource_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); @@ -502,8 +412,7 @@ namespace WebDAV dict_t Client::info(const std::string& remote_resource) const noexcept { - auto clientImpl = GetImpl(this); - auto root_urn = Path(clientImpl->webdav_root, true); + auto root_urn = Path(this->webdav_root, true); auto target_urn = root_urn + remote_resource; Header header = { @@ -513,9 +422,9 @@ namespace WebDAV Data data = { 0, 0, 0 }; - Request request(clientImpl->options()); + Request request(this->options()); - auto url = clientImpl->webdav_hostname + target_urn.quote(request.handle); + auto url = this->webdav_hostname + target_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); @@ -581,11 +490,10 @@ namespace WebDAV strings_t Client::list(const std::string& remote_directory) const noexcept { - auto clientImpl = GetImpl(this); bool is_existed = this->check(remote_directory); if (!is_existed) return strings_t(); - auto target_urn = Path(clientImpl->webdav_root, true) + remote_directory; + auto target_urn = Path(this->webdav_root, true) + remote_directory; target_urn = Path(target_urn.path(), true); Header header = { @@ -595,9 +503,9 @@ namespace WebDAV Data data = { 0, 0, 0 }; - Request request(clientImpl->options()); + Request request(this->options()); - auto url = clientImpl->webdav_hostname + target_urn.quote(request.handle); + auto url = this->webdav_hostname + target_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); @@ -639,8 +547,7 @@ namespace WebDAV progress_t progress ) const noexcept { - auto clientImpl = GetImpl(this); - return clientImpl->sync_download(remote_file, local_file, nullptr, progress); + return this->sync_download(remote_file, local_file, nullptr, progress); } void @@ -651,8 +558,7 @@ namespace WebDAV progress_t progress ) const noexcept { - auto clientImpl = GetImpl(this); - std::thread downloading([&]() { clientImpl->sync_download(remote_file, local_file, callback, progress); }); + std::thread downloading([&]() { this->sync_download(remote_file, local_file, callback, progress); }); downloading.detach(); } @@ -664,8 +570,7 @@ namespace WebDAV progress_t progress ) const noexcept { - auto clientImpl = GetImpl(this); - return clientImpl->sync_download_to(remote_file, buffer_ptr, buffer_size, nullptr, progress); + return this->sync_download_to(remote_file, buffer_ptr, buffer_size, nullptr, progress); } bool @@ -675,14 +580,12 @@ namespace WebDAV progress_t progress ) const noexcept { - auto clientImpl = GetImpl(this); - return clientImpl->sync_download_to(remote_file, stream, nullptr, progress); + return this->sync_download_to(remote_file, stream, nullptr, progress); } bool Client::create_directory(const std::string& remote_directory, bool recursive) const noexcept { - auto clientImpl = GetImpl(this); bool is_existed = this->check(remote_directory); if (is_existed) return true; @@ -700,12 +603,12 @@ namespace WebDAV "Connection: Keep-Alive" }; - auto target_urn = Path(clientImpl->webdav_root, true) + remote_directory; + auto target_urn = Path(this->webdav_root, true) + remote_directory; target_urn = Path(target_urn.path(), true); - Request request(clientImpl->options()); + Request request(this->options()); - auto url = clientImpl->webdav_hostname + target_urn.quote(request.handle); + auto url = this->webdav_hostname + target_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "MKCOL"); request.set(CURLOPT_URL, url.c_str()); @@ -720,11 +623,10 @@ namespace WebDAV bool Client::move(const std::string& remote_source_resource, const std::string& remote_destination_resource) const noexcept { - auto clientImpl = GetImpl(this); bool is_existed = this->check(remote_source_resource); if (!is_existed) return false; - Path root_urn(clientImpl->webdav_root, true); + Path root_urn(this->webdav_root, true); auto source_resource_urn = root_urn + remote_source_resource; auto destination_resource_urn = root_urn + remote_destination_resource; @@ -734,9 +636,9 @@ namespace WebDAV "Destination: " + destination_resource_urn.path() }; - Request request(clientImpl->options()); + Request request(this->options()); - auto url = clientImpl->webdav_hostname + source_resource_urn.quote(request.handle); + auto url = this->webdav_hostname + source_resource_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "MOVE"); request.set(CURLOPT_URL, url.c_str()); @@ -751,11 +653,10 @@ namespace WebDAV bool Client::copy(const std::string& remote_source_resource, const std::string& remote_destination_resource) const noexcept { - auto clientImpl = GetImpl(this); bool is_existed = this->check(remote_source_resource); if (!is_existed) return false; - Path root_urn(clientImpl->webdav_root, true); + Path root_urn(this->webdav_root, true); auto source_resource_urn = root_urn + remote_source_resource; auto destination_resource_urn = root_urn + remote_destination_resource; @@ -765,9 +666,9 @@ namespace WebDAV "Destination: " + destination_resource_urn.path() }; - Request request(clientImpl->options()); + Request request(this->options()); - auto url = clientImpl->webdav_hostname + source_resource_urn.quote(request.handle); + auto url = this->webdav_hostname + source_resource_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "COPY"); request.set(CURLOPT_URL, url.c_str()); @@ -786,8 +687,7 @@ namespace WebDAV progress_t progress ) const noexcept { - auto clientImpl = GetImpl(this); - return clientImpl->sync_upload(remote_file, local_file, nullptr, progress); + return this->sync_upload(remote_file, local_file, nullptr, progress); } void @@ -798,8 +698,7 @@ namespace WebDAV progress_t progress ) const noexcept { - auto clientImpl = GetImpl(this); - std::thread uploading([&]() { clientImpl->sync_upload(remote_file, local_file, callback, progress); }); + std::thread uploading([&]() { this->sync_upload(remote_file, local_file, callback, progress); }); uploading.detach(); } @@ -810,8 +709,7 @@ namespace WebDAV progress_t progress ) const noexcept { - auto clientImpl = GetImpl(this); - return clientImpl->sync_upload_from(remote_file, stream, nullptr, progress); + return this->sync_upload_from(remote_file, stream, nullptr, progress); } bool @@ -822,18 +720,16 @@ namespace WebDAV progress_t progress ) const noexcept { - auto clientImpl = GetImpl(this); - return clientImpl->sync_upload_from(remote_file, buffer_ptr, buffer_size, nullptr, progress); + return this->sync_upload_from(remote_file, buffer_ptr, buffer_size, nullptr, progress); } bool Client::clean(const std::string& remote_resource) const noexcept { - auto clientImpl = GetImpl(this); bool is_existed = this->check(remote_resource); if (!is_existed) return true; - auto root_urn = Path(clientImpl->webdav_root, true); + auto root_urn = Path(this->webdav_root, true); auto resource_urn = root_urn + remote_resource; Header header = { @@ -841,9 +737,9 @@ namespace WebDAV "Connection: Keep-Alive" }; - Request request(clientImpl->options()); + Request request(this->options()); - auto url = clientImpl->webdav_hostname + resource_urn.quote(request.handle); + auto url = this->webdav_hostname + resource_urn.quote(request.handle); request.set(CURLOPT_CUSTOMREQUEST, "DELETE"); request.set(CURLOPT_URL, url.c_str()); @@ -854,4 +750,16 @@ namespace WebDAV return request.perform(); } + + class Environment { + public: + Environment() { + curl_global_init(CURL_GLOBAL_ALL); + } + ~Environment() { + curl_global_cleanup(); + } + }; } + +static const WebDAV::Environment env; diff --git a/sources/fsinfo.hpp b/sources/fsinfo.hpp index 8f05acc..5bab6a5 100644 --- a/sources/fsinfo.hpp +++ b/sources/fsinfo.hpp @@ -20,9 +20,8 @@ # ############################################################################*/ -#ifndef WEBDAV_FSINFO_H -#define WEBDAV_FSINFO_H -#pragma once +#ifndef WEBDAV_FSINFO_HPP +#define WEBDAV_FSINFO_HPP #include #include diff --git a/sources/header.hpp b/sources/header.hpp index b28d377..814da83 100644 --- a/sources/header.hpp +++ b/sources/header.hpp @@ -20,9 +20,8 @@ # ############################################################################*/ -#ifndef WEBDAV_HEADER_H -#define WEBDAV_HEADER_H -#pragma once +#ifndef WEBDAV_HEADER_HPP +#define WEBDAV_HEADER_HPP #include #include diff --git a/sources/pugiext.hpp b/sources/pugiext.hpp index 7f5bf0c..e21ff21 100644 --- a/sources/pugiext.hpp +++ b/sources/pugiext.hpp @@ -20,9 +20,9 @@ # ############################################################################*/ -#ifndef WEBDAV_PUGIEXT_H -#define WEBDAV_PUGIEXT_H -#pragma once +#ifndef WEBDAV_PUGIEXT_HPP +#define WEBDAV_PUGIEXT_HPP + #include namespace pugi diff --git a/sources/request.hpp b/sources/request.hpp index c134762..3d5419f 100644 --- a/sources/request.hpp +++ b/sources/request.hpp @@ -20,9 +20,8 @@ # ############################################################################*/ -#ifndef WEBDAV_REQUEST_H -#define WEBDAV_REQUEST_H -#pragma once +#ifndef WEBDAV_REQUEST_HPP +#define WEBDAV_REQUEST_HPP #include #include diff --git a/sources/urn.hpp b/sources/urn.hpp index c35067b..fa47efb 100644 --- a/sources/urn.hpp +++ b/sources/urn.hpp @@ -20,8 +20,8 @@ # ############################################################################*/ -#ifndef WEBDAV_URN_H -#define WEBDAV_URN_H +#ifndef WEBDAV_URN_HPP +#define WEBDAV_URN_HPP #include #include diff --git a/tests/check.cpp b/tests/check.cpp index 732c7fb..6b5f102 100644 --- a/tests/check.cpp +++ b/tests/check.cpp @@ -34,7 +34,7 @@ SCENARIO("Client must check an existing remote resources", "[check]") { CAPTURE(dirname); CAPTURE(filename); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("An existing remote resource") { @@ -74,7 +74,7 @@ SCENARIO("Client must check not an existing remote resources", "[check]") { auto options = fixture::get_options(); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("Not an existing remote resource") { diff --git a/tests/clean.cpp b/tests/clean.cpp index cdc5512..94890f3 100644 --- a/tests/clean.cpp +++ b/tests/clean.cpp @@ -35,7 +35,7 @@ SCENARIO("Client must clean an existing remote resources", "[clean]") { CAPTURE(dirname); CAPTURE(filename); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("An existing remote resource") { @@ -77,7 +77,7 @@ SCENARIO("Client must clean not an existing remote resources", "[clean]") { auto options = fixture::get_options(); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("Not an existing remote resource") { @@ -120,7 +120,7 @@ SCENARIO("Client must clean not an empty remote directories", "[clean]") { CAPTURE(dirname); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("Not an empty remote directory") { @@ -159,7 +159,7 @@ SCENARIO("Client must clean a remote directory", "[clean]") { CAPTURE(dirname); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("An existing directory") { diff --git a/tests/download.cpp b/tests/download.cpp index f287551..034ecbe 100644 --- a/tests/download.cpp +++ b/tests/download.cpp @@ -32,7 +32,7 @@ SCENARIO("Client must download into buffer", "[download][buffer]") { CAPTURE(filename); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("A buffer") { @@ -69,7 +69,7 @@ SCENARIO("Client must download stream", "[download][stream]") { CAPTURE(filename); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("A stream") { diff --git a/tests/list.cpp b/tests/list.cpp index 33c592d..955eafb 100644 --- a/tests/list.cpp +++ b/tests/list.cpp @@ -32,7 +32,7 @@ SCENARIO("Client must list a remote files and a remote directories", "[list]") { CAPTURE(dirname); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("A remote directory with 5 files and 5 directories") { @@ -73,7 +73,7 @@ SCENARIO("Client can not list a remote file", "[list][file]") { CAPTURE(filename); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("An existing remote file") { @@ -102,7 +102,7 @@ SCENARIO("Client can list an empty remote directory", "[list][empty]") { CAPTURE(dirname); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("An empty remote directory") { diff --git a/tests/upload.cpp b/tests/upload.cpp index db5f8d3..7eee51a 100644 --- a/tests/upload.cpp +++ b/tests/upload.cpp @@ -34,7 +34,7 @@ SCENARIO("Client must upload buffer", "[upload][buffer]") { CAPTURE(filename); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("A buffer") { @@ -67,7 +67,7 @@ SCENARIO("Client must upload string stream", "[upload][string][stream]") { CAPTURE(filename); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("A stream") { @@ -98,7 +98,7 @@ SCENARIO("Client must upload file stream", "[upload][file][stream]") { CAPTURE(filename); - std::unique_ptr client(WebDAV::Client::Init(options)); + std::unique_ptr client{ new WebDAV::Client{ options } }; GIVEN("A stream") { From fb5f60d4147eba3a43a2c1e862394db925faedb2 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 8 Aug 2017 11:47:06 +0300 Subject: [PATCH 070/133] Update README.md [skip ci] --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 21c51a7..7461757 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,14 @@ $ doxygen docs/doxygen.conf $ open docs/html/index.html ``` +Run tests +=== +```ShellSession +$ cmake -H. -B_builds -DBUILD_TESTS=ON +$ cmake --build _builds +$ cmake --build _builds --target test -- ARGS=--verbose +``` + Usage === From db5ba7faa696d0812bba9da5a95be99e060dd8a0 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 8 Aug 2017 11:56:40 +0300 Subject: [PATCH 071/133] Update README.md [skip ci] --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 7461757..e2f75ce 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,14 @@ $ open docs/html/index.html Run tests === + +For run tests you need set environment variables `WEBDAV_HOSTNAME`, +`WEBDAV_USERNAME` and `WEBDAV_PASSWORD` (optional `WEBDAV_ROOT`). + ```ShellSession +$ export WEBDAV_HOSTNAME= +$ export WEBDAV_USERNAME= +$ export WEBDAV_PASSWORD= $ cmake -H. -B_builds -DBUILD_TESTS=ON $ cmake --build _builds $ cmake --build _builds --target test -- ARGS=--verbose From 878969d8d80276d3f537b8e9505d167dd9e7fa68 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 8 Aug 2017 11:59:22 +0300 Subject: [PATCH 072/133] Update README.md [skip ci] --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e2f75ce..d44ebb6 100644 --- a/README.md +++ b/README.md @@ -42,10 +42,10 @@ $ doxygen docs/doxygen.conf $ open docs/html/index.html ``` -Run tests +Running tests === -For run tests you need set environment variables `WEBDAV_HOSTNAME`, +For run tests you need to set environment variables `WEBDAV_HOSTNAME`, `WEBDAV_USERNAME` and `WEBDAV_PASSWORD` (optional `WEBDAV_ROOT`). ```ShellSession From 3309b62ec0b0dd12d6a02647fe50ec5d9661f3c1 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 8 Aug 2017 12:00:19 +0300 Subject: [PATCH 073/133] Update README.md [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d44ebb6..8e99c44 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ WebDAV Client === -[![version](https://img.shields.io/badge/hunter-v0.19.54-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.54) +[![version](https://img.shields.io/badge/hunter-v0.19.59-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.59) [![version](https://img.shields.io/badge/wdc-v1.1.0-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.0) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) From 5ef273578640211778c666b11576f8575eb5d08b Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 8 Aug 2017 18:34:18 +0300 Subject: [PATCH 074/133] Update README.md [skip ci] --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8e99c44..25207fc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ WebDAV Client === -[![version](https://img.shields.io/badge/hunter-v0.19.59-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.59) +[![version](https://img.shields.io/badge/hunter-v0.19.61-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.61) [![version](https://img.shields.io/badge/wdc-v1.1.0-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.0) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) @@ -128,8 +128,8 @@ cmake_minimum_required(VERSION 3.3) include(cmake/HunterGate.cmake) HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.19.59.tar.gz" - SHA1 "7d300d183cd7e235ef881639d3009a85362fff1c" + URL "https://github.com/ruslo/hunter/archive/v0.19.61.tar.gz" + SHA1 "cd4dd406ca45bb6bb28a116d93c2958efac6bf09" ) project(example) From d7c026aad4c6a3b0e68c14f4d472e51176eab189 Mon Sep 17 00:00:00 2001 From: justcppdeveloper Date: Thu, 10 Aug 2017 00:08:09 +0300 Subject: [PATCH 075/133] updated gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e68ec28..cf579cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.dat .idea/ *.swp +.DS_Store *build*/ *install*/ From 242886a402790bd6e985d00711a6bff5d78eb826 Mon Sep 17 00:00:00 2001 From: justcppdeveloper Date: Thu, 10 Aug 2017 00:08:25 +0300 Subject: [PATCH 076/133] refactored --- include/webdav/client.hpp | 10 +++----- sources/client.cpp | 54 ++++++++++++++++++--------------------- sources/fsinfo.hpp | 2 +- sources/header.cpp | 24 ++++++++++++++++- sources/header.hpp | 14 ++++++++-- sources/pugiext.hpp | 4 +-- sources/request.cpp | 20 +++++++++++++++ sources/request.hpp | 14 +++++++--- sources/urn.cpp | 11 ++++---- sources/urn.hpp | 9 ++++--- 10 files changed, 107 insertions(+), 55 deletions(-) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 9c834b1..01e62ea 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -64,7 +64,7 @@ namespace WebDAV /// \param[in] key_path /// \include client/init.cpp /// - Client(const dict_t& options); + explicit Client(const dict_t& options); /// /// Get free size of the WebDAV server @@ -251,10 +251,8 @@ namespace WebDAV callback_t callback = nullptr, progress_t progress = nullptr ) const noexcept -> void; - - virtual ~Client(); - - protected: + + private: auto sync_download( const std::string& remote_file, @@ -300,8 +298,6 @@ namespace WebDAV progress_t progress = nullptr ) const noexcept -> bool; - private: - enum { buffer_size = 1000 * 1000 }; std::string webdav_hostname; diff --git a/sources/client.cpp b/sources/client.cpp index e8ebd6d..6d020b5 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -20,15 +20,18 @@ # ############################################################################*/ -#include + #include +#include #include -#include "pugiext.hpp" +#include "callback.hpp" #include "header.hpp" +#include "fsinfo.hpp" +#include "pugiext.hpp" #include "request.hpp" #include "urn.hpp" -#include "fsinfo.hpp" -#include "callback.hpp" + + namespace WebDAV { @@ -114,7 +117,7 @@ namespace WebDAV auto root_urn = Path(this->webdav_root, true); auto file_urn = root_urn + remote_file; - Data data = { 0, 0, 0 }; + Data data = { nullptr, 0, 0 }; Request request(this->options()); @@ -175,9 +178,8 @@ namespace WebDAV bool is_performed = request.perform(); if (callback != nullptr) callback(is_performed); - if (!is_performed) return false; - - return true; + + return is_performed; } bool @@ -201,7 +203,7 @@ namespace WebDAV auto url = this->webdav_hostname + file_urn.quote(request.handle); - Data response = { 0, 0, 0 }; + Data response = { nullptr, 0, 0 }; request.set(CURLOPT_UPLOAD, 1L); request.set(CURLOPT_URL, url.c_str()); @@ -228,7 +230,7 @@ namespace WebDAV bool Client::sync_upload_from( const std::string& remote_file, - char * buffer, + char * buffer_ptr, unsigned long long int buffer_size, callback_t callback, progress_t progress @@ -237,13 +239,13 @@ namespace WebDAV auto root_urn = Path(this->webdav_root, true); auto file_urn = root_urn + remote_file; - Data data = { buffer, 0, buffer_size }; + Data data = { buffer_ptr, 0, buffer_size }; Request request(this->options()); auto url = this->webdav_hostname + file_urn.quote(request.handle); - Data response = { 0, 0, 0 }; + Data response = { nullptr, 0, 0 }; request.set(CURLOPT_UPLOAD, 1L); request.set(CURLOPT_URL, url.c_str()); @@ -285,7 +287,7 @@ namespace WebDAV size_t stream_size = stream.tellg(); stream.seekg(0, std::ios::beg); - Data response = { 0, 0, 0 }; + Data response = { nullptr, 0, 0 }; request.set(CURLOPT_UPLOAD, 1L); request.set(CURLOPT_URL, url.c_str()); @@ -324,11 +326,6 @@ namespace WebDAV this->key_path = get(options, "key_path"); } - Client::~Client() - { - } - - unsigned long long Client::free_size() const noexcept { @@ -349,7 +346,7 @@ namespace WebDAV auto document_print = pugi::node_to_string(document); size_t size = document_print.length() * sizeof((document_print.c_str())[0]); - Data data = { 0, 0, 0 }; + Data data = { nullptr, 0, 0 }; Request request(this->options()); @@ -391,7 +388,7 @@ namespace WebDAV "Depth: 1" }; - Data data = { 0, 0, 0 }; + Data data = { nullptr, 0, 0 }; Request request(this->options()); @@ -420,7 +417,7 @@ namespace WebDAV "Depth: 1" }; - Data data = { 0, 0, 0 }; + Data data = { nullptr, 0, 0 }; Request request(this->options()); @@ -451,9 +448,9 @@ namespace WebDAV std::string encode_file_name = href.first_child().value(); std::string resource_path = curl_unescape(encode_file_name.c_str(), (int)encode_file_name.length()); auto target_path = target_urn.path(); - auto target_path_without_sep = std::string(target_path, 0, target_path.rfind("/") + 1); - auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind("/") + 1); - if (resource_path_without_sep.compare(target_path_without_sep) == 0) { + auto target_path_without_sep = std::string(target_path, 0, target_path.rfind('/') + 1); + auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind('/') + 1); + if (resource_path_without_sep == target_path_without_sep) { auto propstat = response.node().select_node("*[local-name()='propstat']").node(); auto prop = propstat.select_node("*[local-name()='prop']").node(); auto creation_date = prop.select_node("*[local-name()='creationdate']").node(); @@ -482,8 +479,7 @@ namespace WebDAV { auto information = this->info(remote_resource); auto resource_type = information["type"]; - bool is_dir = resource_type.compare("d:collection") == 0; - is_dir |= resource_type.compare("D:collection") == 0; + bool is_dir = resource_type == "d:collection" || resource_type == "D:collection"; return is_dir; } @@ -501,7 +497,7 @@ namespace WebDAV "Depth: 1" }; - Data data = { 0, 0, 0 }; + Data data = { nullptr, 0, 0 }; Request request(this->options()); @@ -753,10 +749,10 @@ namespace WebDAV class Environment { public: - Environment() { + Environment() noexcept { curl_global_init(CURL_GLOBAL_ALL); } - ~Environment() { + ~Environment() noexcept { curl_global_cleanup(); } }; diff --git a/sources/fsinfo.hpp b/sources/fsinfo.hpp index 5bab6a5..12589bb 100644 --- a/sources/fsinfo.hpp +++ b/sources/fsinfo.hpp @@ -23,8 +23,8 @@ #ifndef WEBDAV_FSINFO_HPP #define WEBDAV_FSINFO_HPP -#include #include +#include namespace WebDAV { diff --git a/sources/header.cpp b/sources/header.cpp index f4f61fe..dec7fb0 100644 --- a/sources/header.cpp +++ b/sources/header.cpp @@ -34,11 +34,33 @@ namespace WebDAV } } - Header::~Header() + Header::~Header() noexcept { curl_slist_free_all((curl_slist*)this->handle); } + Header::Header(Header&& other) noexcept + { + handle = other.handle; + other.handle = nullptr; + } + + auto Header::operator=(Header&& other) noexcept -> Header& + { + if (this != &other) { + Header(std::move(other)).swap(*this); + } + + return *this; + } + + auto Header::swap(Header& other) noexcept -> void + { + using std::swap; + swap(handle, other.handle); + } + + void Header::append(const std::string& item) noexcept { diff --git a/sources/header.hpp b/sources/header.hpp index 814da83..a4887e5 100644 --- a/sources/header.hpp +++ b/sources/header.hpp @@ -23,8 +23,8 @@ #ifndef WEBDAV_HEADER_HPP #define WEBDAV_HEADER_HPP -#include #include +#include namespace WebDAV { @@ -35,9 +35,19 @@ namespace WebDAV Header(const std::initializer_list& init_list) noexcept; - ~Header(); + ~Header() noexcept; + + Header(const Header& other) = delete; + + auto operator=(const Header& other) -> Header& = delete; + + Header(Header&& other) noexcept; + + auto operator=(Header&& other) noexcept -> Header&; void append(const std::string& item) noexcept; + private: + auto swap(Header& other) noexcept -> void; }; } diff --git a/sources/pugiext.hpp b/sources/pugiext.hpp index e21ff21..e1fa32b 100644 --- a/sources/pugiext.hpp +++ b/sources/pugiext.hpp @@ -32,13 +32,13 @@ namespace pugi public: std::string result; - virtual void write(const void* data, size_t size) + void write(const void* data, size_t size) final { result += std::string(static_cast(data), size); } }; - std::string node_to_string(pugi::xml_node node) + inline std::string node_to_string(pugi::xml_node node) { xml_string_writer writer; node.print(writer); diff --git a/sources/request.cpp b/sources/request.cpp index 10a3939..f5e9d4e 100644 --- a/sources/request.cpp +++ b/sources/request.cpp @@ -93,6 +93,26 @@ namespace WebDAV } + auto Request::swap(Request& other) noexcept -> void + { + using std::swap; + swap(handle, other.handle); + } + + Request::Request(Request&& other) noexcept : handle{ other.handle } + { + other.handle = nullptr; + } + + auto Request::operator=(Request&& other) noexcept -> Request & + { + if (this != &other) { + Request(std::move(other)).swap(*this); + } + + return *this; + } + bool Request::perform() const noexcept { if (this->handle == nullptr) return false; diff --git a/sources/request.hpp b/sources/request.hpp index 3d5419f..a6f4b80 100644 --- a/sources/request.hpp +++ b/sources/request.hpp @@ -24,8 +24,8 @@ #define WEBDAV_REQUEST_HPP #include -#include #include +#include namespace WebDAV { @@ -44,12 +44,20 @@ namespace WebDAV bool cert_required() const noexcept; + auto swap(Request& other) noexcept -> void; public: - - Request(dict_t&& options); + explicit Request(dict_t&& options); ~Request() noexcept; + Request(const Request& other) = delete; + + Request(Request&& other) noexcept; + + auto operator=(const Request& other) -> Request & = delete; + + auto operator=(Request&& other) noexcept -> Request &; + template auto set(CURLoption option, T value) const noexcept -> bool { diff --git a/sources/urn.cpp b/sources/urn.cpp index ee00785..71dd413 100644 --- a/sources/urn.cpp +++ b/sources/urn.cpp @@ -132,13 +132,13 @@ namespace WebDAV { auto Path::parent() const -> Path { - if (this->is_root()) return m_path; + if (this->is_root()) return Path{m_path}; auto last_separate_position = m_path.rfind(Path::separate); - if (last_separate_position == 0) return Path::separate; + if (last_separate_position == 0) return Path{Path::separate}; auto parent = m_path.substr(0, last_separate_position + 1); - return parent; + return Path{parent}; } auto Path::is_directory() const -> bool { @@ -154,9 +154,8 @@ namespace WebDAV { return Path::separate.compare(m_path) == 0; } - auto Path::operator+(const string& resource_path) const -> Path { - - return Path{ m_path + resource_path }; + auto Path::operator+(const string& rhs) const -> Path { + return Path{ m_path + rhs }; } auto Path::operator==(const Path& rhs) const -> bool { diff --git a/sources/urn.hpp b/sources/urn.hpp index fa47efb..01f4470 100644 --- a/sources/urn.hpp +++ b/sources/urn.hpp @@ -23,15 +23,16 @@ #ifndef WEBDAV_URN_HPP #define WEBDAV_URN_HPP -#include #include +#include #include -using std::string; namespace WebDAV { namespace Urn { + using std::string; + class Path { static const string separate; @@ -42,9 +43,9 @@ namespace WebDAV public: - Path(const string& path, bool force_dir = false); + explicit Path(const string& path, bool force_dir = false); - Path(std::nullptr_t); + explicit Path(std::nullptr_t); auto path() const -> string; From 19ba86716fecbb7eb3c1914fc0076df17f1b9c79 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 10 Aug 2017 12:42:30 +0300 Subject: [PATCH 077/133] added secure variables for Travis --- .travis.yml | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 143fa03..fc8be73 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,9 @@ language: generic dist: trusty sudo: required - git: depth: 1 submodules: false - addons: apt: packages: @@ -14,7 +12,6 @@ addons: sources: - llvm-toolchain-trusty-3.6 - ubuntu-toolchain-r-test - matrix: include: - os: linux @@ -33,28 +30,22 @@ matrix: packages: - lcov env: COMPILER="g++-5" BUILD_TYPE=Coverage - install: -- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz; - sudo tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; +- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then wget https://cmake.org/files/v3.9/cmake-3.9.0-Linux-x86_64.tar.gz; + sudo tar -xf cmake-3.9.0-Linux-x86_64.tar.gz -C /usr/local/ --strip-components=1; fi -- if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then - PATH=~/.local/bin:${PATH}; - pip install --user --upgrade pip; - pip install --user cpp-coveralls; - fi - +- if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then PATH=~/.local/bin:${PATH}; + pip install --user --upgrade pip; pip install --user cpp-coveralls; fi cache: directories: - - $HOME/.hunter - + - "$HOME/.hunter" script: - cmake -H. -B_builds -DBUILD_TESTS=ON -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=${BUILD_TYPE} - cmake --build _builds - cmake --build _builds --target test -- ARGS=--verbose - after_success: -- if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then - coveralls --include sources --include include --gcov-options '\-lp' --root . --build-root _builds; - fi +- if [ "${BUILD_TYPE}" == "Coverage" -a "${TRAVIS_OS_NAME}" == "linux" ]; then coveralls + --include sources --include include --gcov-options '\-lp' --root . --build-root + _builds; fi +env: + secure: AEfl5gFb6kYUqnzJ5CJrx7WphiyVHLUqyShV1fakED0tYYLV8UT3hzDsX3Fgz0224krrFpF3KmP3MdL/52RfjSjoeCOEnALiyHnLbqo+kD2uS834nmlECdM1vjMaR4E5Gt2FcQ1qH2xm84UCD6idpdy3+dr4Ydyke/dUzYRds34= From b0678b98b3792a8a799da6d0a576546dfd706179 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 10 Aug 2017 13:00:15 +0300 Subject: [PATCH 078/133] added secure variables for Travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fc8be73..034fbf1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,4 +48,4 @@ after_success: --include sources --include include --gcov-options '\-lp' --root . --build-root _builds; fi env: - secure: AEfl5gFb6kYUqnzJ5CJrx7WphiyVHLUqyShV1fakED0tYYLV8UT3hzDsX3Fgz0224krrFpF3KmP3MdL/52RfjSjoeCOEnALiyHnLbqo+kD2uS834nmlECdM1vjMaR4E5Gt2FcQ1qH2xm84UCD6idpdy3+dr4Ydyke/dUzYRds34= + secure: RTTk3A2/YE3onv4sdwI+UyNE2LwY+WI3GqEzODlJZHEUwDEU+qXLMXUIMP+XcO6Rd9rZ2J7vLf8aq9fajbMxxt9fNqiO42DprywLetGDtg+FhPQPD6hRrT8oQm5k9ss8gJqmC3u+QsmflmSsfv4MzBiHc6gunKw0sv1tWck+CTQ= From 072d20fc0df877c94067a2e787e44b5a3c4968e6 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 12 Aug 2017 20:53:51 +0300 Subject: [PATCH 079/133] fixed cli example --- examples/cli/cli.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cli/cli.cpp b/examples/cli/cli.cpp index e362dba..7ae8751 100644 --- a/examples/cli/cli.cpp +++ b/examples/cli/cli.cpp @@ -72,7 +72,7 @@ int main(int argc, char * argv[]) { std::map options = { {"webdav_hostname", hostname_ptr}, - {"webdav_login", username_ptr}, + {"webdav_username", username_ptr}, {"webdav_password", password_ptr} }; From 8f4d3a5da6e2e9497d5b09663de936a3da74303a Mon Sep 17 00:00:00 2001 From: designerror Date: Sun, 13 Aug 2017 08:18:40 +0300 Subject: [PATCH 080/133] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 25207fc..964c1a9 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Package ```WebDAV Client``` provides easy and convenient to work with WebDAV-ser - Google Drive - Box - 4shared + - ownCloud - ... Install From b7b0c99efe5abdc3fd3b375c924e7f4746170926 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 22 Aug 2017 22:43:33 +0300 Subject: [PATCH 081/133] fixed #42 --- include/webdav/client.hpp | 2 +- sources/callback.cpp | 20 +++++++-------- sources/callback.hpp | 2 +- sources/client.cpp | 54 +++++++++++++++++++-------------------- sources/fsinfo.cpp | 6 ++--- sources/fsinfo.hpp | 4 +-- sources/header.cpp | 6 ++--- sources/header.hpp | 4 ++- sources/pugiext.hpp | 2 +- sources/request.cpp | 28 +++++++++++--------- sources/request.hpp | 6 +++-- sources/urn.cpp | 52 +++++++++++++++++-------------------- sources/urn.hpp | 5 ++-- 13 files changed, 96 insertions(+), 95 deletions(-) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 01e62ea..b72a354 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -314,6 +314,6 @@ namespace WebDAV dict_t options() const noexcept; }; -} +} // namespace WebDAV #endif diff --git a/sources/callback.cpp b/sources/callback.cpp index cfa92b3..9f1ab3c 100644 --- a/sources/callback.cpp +++ b/sources/callback.cpp @@ -34,7 +34,7 @@ namespace WebDAV { size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) { - auto in_stream = (std::istream *)stream; + auto in_stream = reinterpret_cast(stream); auto read_bytes = static_cast(item_size * item_count); auto position = static_cast(in_stream->tellg()); in_stream->seekg(0, std::ios::end); @@ -56,13 +56,13 @@ namespace WebDAV data->position += copied_bytes; return copied_bytes; } - } + } // namespace Read namespace Write { size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) { - auto out_stream = (std::ostream *)stream; + auto out_stream = reinterpret_cast(stream); size_t write_bytes = item_size * item_count; out_stream->write(ptr, write_bytes); return write_bytes; @@ -70,7 +70,7 @@ namespace WebDAV size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) { - auto data = (Data*)buffer; + auto data = reinterpret_cast(buffer); auto size = static_cast(item_size * item_count); auto rest_bytes = data->size - data->position; auto copied_bytes = std::min(size, rest_bytes); @@ -78,13 +78,13 @@ namespace WebDAV data->position += copied_bytes; return copied_bytes; } - } + } // namespace Write namespace Append { size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) { - auto data = (Data*)buffer; + auto data = reinterpret_cast(buffer); auto append_size = item_size * item_count; auto new_buffer_size = data->size + append_size; auto new_buffer = new char[new_buffer_size]; @@ -98,12 +98,12 @@ namespace WebDAV size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) { - auto out_stream = (std::ostream *)stream; + auto out_stream = reinterpret_cast(stream); size_t write_bytes = item_size * item_count; out_stream->seekp(0, std::ios::end); out_stream->write(ptr, write_bytes); return write_bytes; } - } - } -} + } // namespace Append + } // namespace Callback +} // namespace WebDAV diff --git a/sources/callback.hpp b/sources/callback.hpp index 77475b4..263b6e7 100644 --- a/sources/callback.hpp +++ b/sources/callback.hpp @@ -52,6 +52,6 @@ namespace WebDAV size_t buffer(char * data, size_t size, size_t count, void * buffer); } } -} +} // namespace WebDAV #endif diff --git a/sources/client.cpp b/sources/client.cpp index 6d020b5..9a8ad6e 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -31,8 +31,6 @@ #include "request.hpp" #include "urn.hpp" - - namespace WebDAV { auto inline get(const dict_t& options, const std::string&& name) -> std::string @@ -207,17 +205,17 @@ namespace WebDAV request.set(CURLOPT_UPLOAD, 1L); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_READDATA, (size_t)&file_stream); - request.set(CURLOPT_READFUNCTION, (size_t)Callback::Read::stream); - request.set(CURLOPT_INFILESIZE_LARGE, (curl_off_t)size); - request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); - request.set(CURLOPT_WRITEDATA, (size_t)&response); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); + request.set(CURLOPT_READDATA, static_cast(&file_stream)); + request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::stream)); + request.set(CURLOPT_INFILESIZE_LARGE, static_cast(size)); + request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); + request.set(CURLOPT_WRITEDATA, static_cast(&response)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -351,12 +349,12 @@ namespace WebDAV Request request(this->options()); request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); - request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); request.set(CURLOPT_POSTFIELDS, document_print.c_str()); - request.set(CURLOPT_POSTFIELDSIZE, (long)size); + request.set(CURLOPT_POSTFIELDSIZE, static_cast(size)); request.set(CURLOPT_HEADER, 0); - request.set(CURLOPT_WRITEDATA, (size_t)&data); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -364,7 +362,7 @@ namespace WebDAV auto is_performed = request.perform(); if (!is_performed) return 0; - document.load_buffer(data.buffer, (size_t)data.size); + document.load_buffer(data.buffer, static_cast(data.size)); pugi::xml_node multistatus = document.select_node("*[local-name()='multistatus']").node(); pugi::xml_node response = multistatus.select_node("*[local-name()='response']").node(); @@ -396,9 +394,9 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); - request.set(CURLOPT_WRITEDATA, (size_t)&data); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -425,9 +423,9 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); - request.set(CURLOPT_WRITEDATA, (size_t)&data); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -436,7 +434,7 @@ namespace WebDAV if (!is_performed) return dict_t(); pugi::xml_document document; - document.load_buffer(data.buffer, (size_t)data.size); + document.load_buffer(data.buffer, static_cast(data.size)); #ifdef WDC_VERBOSE document.save(std::cout); #endif @@ -505,7 +503,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); request.set(CURLOPT_HEADER, 0); request.set(CURLOPT_WRITEDATA, (size_t)&data); request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); @@ -520,14 +518,14 @@ namespace WebDAV strings_t resources; pugi::xml_document document; - document.load_buffer(data.buffer, (size_t)data.size); + document.load_buffer(data.buffer, static_cast(data.size)); auto multistatus = document.select_node("*[local-name()='multistatus']").node(); auto responses = multistatus.select_nodes("*[local-name()='response']"); for (auto response : responses) { pugi::xml_node href = response.node().select_node("*[local-name()='href']").node(); std::string encode_file_name = href.first_child().value(); - std::string resource_path = curl_unescape(encode_file_name.c_str(), (int)encode_file_name.length()); + std::string resource_path = curl_unescape(encode_file_name.c_str(), static_cast(encode_file_name.length())); auto target_path = target_urn.path(); Path resource_urn(resource_path); if (resource_urn == target_urn) continue; @@ -608,7 +606,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "MKCOL"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -638,7 +636,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "MOVE"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -668,7 +666,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "COPY"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -756,6 +754,6 @@ namespace WebDAV curl_global_cleanup(); } }; -} +} // namespace WebDAV static const WebDAV::Environment env; diff --git a/sources/fsinfo.cpp b/sources/fsinfo.cpp index ba247ba..9140867 100644 --- a/sources/fsinfo.cpp +++ b/sources/fsinfo.cpp @@ -37,7 +37,7 @@ namespace WebDAV auto size(const std::string& path_file) -> unsigned long long { std::ifstream file(path_file, std::ios::binary | std::ios::ate); - return (unsigned long long)file.tellg(); + return static_cast(file.tellg()); } - } -} + } // namespace FileInfo +} // namespace WebDAV diff --git a/sources/fsinfo.hpp b/sources/fsinfo.hpp index 12589bb..1acdca0 100644 --- a/sources/fsinfo.hpp +++ b/sources/fsinfo.hpp @@ -33,7 +33,7 @@ namespace WebDAV auto exists(const std::string& path) -> bool; auto size(const std::string& path_file) -> unsigned long long; - } -} + } // namespace FileInfo +} // namespace WebDAV #endif diff --git a/sources/header.cpp b/sources/header.cpp index dec7fb0..52e3885 100644 --- a/sources/header.cpp +++ b/sources/header.cpp @@ -36,7 +36,7 @@ namespace WebDAV Header::~Header() noexcept { - curl_slist_free_all((curl_slist*)this->handle); + curl_slist_free_all(reinterpret_cast(this->handle)); } Header::Header(Header&& other) noexcept @@ -64,6 +64,6 @@ namespace WebDAV void Header::append(const std::string& item) noexcept { - this->handle = curl_slist_append((curl_slist*)this->handle, item.c_str()); + this->handle = curl_slist_append(reinterpret_cast(this->handle), item.c_str()); } -} +} // namespace WebDAV diff --git a/sources/header.hpp b/sources/header.hpp index a4887e5..be46b3f 100644 --- a/sources/header.hpp +++ b/sources/header.hpp @@ -46,9 +46,11 @@ namespace WebDAV auto operator=(Header&& other) noexcept -> Header&; void append(const std::string& item) noexcept; + private: + auto swap(Header& other) noexcept -> void; }; -} +} // namespace WebDAV #endif diff --git a/sources/pugiext.hpp b/sources/pugiext.hpp index e1fa32b..fae0346 100644 --- a/sources/pugiext.hpp +++ b/sources/pugiext.hpp @@ -45,6 +45,6 @@ namespace pugi return writer.result; } -} +} // namespace pugi #endif diff --git a/sources/request.cpp b/sources/request.cpp index f5e9d4e..355fa10 100644 --- a/sources/request.cpp +++ b/sources/request.cpp @@ -28,8 +28,12 @@ namespace WebDAV auto inline get(const dict_t& options, const std::string&& name) -> std::string { auto it = options.find(name); - if (it == options.end()) return ""; - else return it->second; + if (it == options.end()) { + return std::string{""}; + } + else { + return it->second; + } } Request::Request(dict_t&& options_) : options(options_) @@ -59,31 +63,31 @@ namespace WebDAV this->set(CURLOPT_SSLCERTTYPE, "PEM"); this->set(CURLOPT_SSLKEYTYPE, "PEM"); - this->set(CURLOPT_SSLCERT, (char *)cert_path.c_str()); - this->set(CURLOPT_SSLKEY, (char *)key_path.c_str()); + this->set(CURLOPT_SSLCERT, const_cast(cert_path.c_str())); + this->set(CURLOPT_SSLKEY, const_cast(key_path.c_str())); } - this->set(CURLOPT_URL, (char *)webdav_hostname.c_str()); - this->set(CURLOPT_HTTPAUTH, (int)CURLAUTH_BASIC); + this->set(CURLOPT_URL, const_cast(webdav_hostname.c_str())); + this->set(CURLOPT_HTTPAUTH, static_cast(CURLAUTH_BASIC)); auto token = webdav_username + ":" + webdav_password; - this->set(CURLOPT_USERPWD, (char *)token.c_str()); + this->set(CURLOPT_USERPWD, const_cast(token.c_str())); if (!this->proxy_enabled()) return; - this->set(CURLOPT_PROXY, (char *)proxy_hostname.c_str()); - this->set(CURLOPT_PROXYAUTH, (int)CURLAUTH_BASIC); + this->set(CURLOPT_PROXY, const_cast(proxy_hostname.c_str())); + this->set(CURLOPT_PROXYAUTH, static_cast(CURLAUTH_BASIC)); if (proxy_username.empty()) return; if (proxy_password.empty()) { - this->set(CURLOPT_PROXYUSERNAME, (char *)proxy_username.c_str()); + this->set(CURLOPT_PROXYUSERNAME, const_cast(proxy_username.c_str())); } else { token = proxy_username + ":" + proxy_password; - this->set(CURLOPT_PROXYUSERPWD, (char *)token.c_str()); + this->set(CURLOPT_PROXYUSERPWD, const_cast(token.c_str())); } } @@ -147,4 +151,4 @@ namespace WebDAV if (key_path.empty()) return false; return FileInfo::exists(key_path); } -} +} // namespace WebDAV diff --git a/sources/request.hpp b/sources/request.hpp index a6f4b80..b67b74a 100644 --- a/sources/request.hpp +++ b/sources/request.hpp @@ -45,8 +45,10 @@ namespace WebDAV bool cert_required() const noexcept; auto swap(Request& other) noexcept -> void; + public: - explicit Request(dict_t&& options); + + explicit Request(dict_t&& options_); ~Request() noexcept; @@ -69,6 +71,6 @@ namespace WebDAV void * handle; }; -} +} // namespace WebDAV #endif diff --git a/sources/urn.cpp b/sources/urn.cpp index 71dd413..59c1740 100644 --- a/sources/urn.cpp +++ b/sources/urn.cpp @@ -21,6 +21,7 @@ ############################################################################*/ #include +#include #include #include #include @@ -30,9 +31,10 @@ using std::vector; #include "urn.hpp" -namespace WebDAV { - - namespace Urn { +namespace WebDAV +{ + namespace Urn + { const string Path::separate = "/"; const string Path::root = "/"; @@ -45,7 +47,7 @@ namespace WebDAV { if (first_position != 0) path = Path::root + path; auto last_symbol_index = path.length() - 1; auto last_symbol = path.substr(last_symbol_index, 1); - auto is_dir = Path::separate.compare(last_symbol) == 0; + auto is_dir = last_symbol == Path::separate; if (force_dir && !is_dir) path += Path::separate; m_path = path; @@ -53,7 +55,7 @@ namespace WebDAV { bool is_find = false; do { auto first_position = m_path.find(double_separte); - is_find = first_position != string::npos; + is_find = first_position != m_path.npos; if (is_find) { m_path.replace(first_position, double_separte.size(), Path::separate); } @@ -70,23 +72,24 @@ namespace WebDAV { auto escape(void * request, const string& name) -> string { - string path = curl_easy_escape(request, name.c_str(), (int)name.length()); + string path = curl_easy_escape(request, name.c_str(), static_cast(name.length())); return path; } auto split(const string& text, const string& delims) -> vector { vector tokens; - std::size_t start = text.find_first_not_of(delims), end = 0; + auto start = text.find_first_not_of(delims); + auto end = text.npos; + + while ((end = text.find_first_of(delims, start)) != text.npos){ - while ((end = text.find_first_of(delims, start)) != string::npos) - { - tokens.push_back(text.substr(start, end - start)); + tokens.push_back(text.substr(start, end-start)); start = text.find_first_not_of(delims, end); } - if (start != string::npos) + if (start != text.npos) { tokens.push_back(text.substr(start)); - + } return tokens; } @@ -95,7 +98,7 @@ namespace WebDAV { if (this->is_root()) return m_path; auto names = split(m_path, Path::separate); - std::string quote_path; + string quote_path; std::for_each(names.begin(), names.end(), ["e_path, request](string& name) { auto escape_name = escape(request, name); @@ -112,7 +115,7 @@ namespace WebDAV { auto Path::name() const -> string { auto path = this->path(); - auto is_root = Path::separate.compare(path) == 0; + auto is_root = path == Path::separate; if (is_root) return string{""}; if (this->is_directory()) { @@ -146,12 +149,12 @@ namespace WebDAV { auto path = this->path(); auto last_symbol_index = path.length() - 1; auto last_symbol = path.substr(last_symbol_index, 1); - auto is_equal = Path::separate.compare(last_symbol) == 0; + auto is_equal = last_symbol == Path::separate; return is_equal; } auto Path::is_root() const -> bool { - return Path::separate.compare(m_path) == 0; + return m_path == Path::separate; } auto Path::operator+(const string& rhs) const -> Path { @@ -160,17 +163,8 @@ namespace WebDAV { auto Path::operator==(const Path& rhs) const -> bool { - if (this->is_root()) { - if (rhs.is_root()) { - return true; - } - else { - return false; - } - } - else if (rhs.is_root()) { - return false; - } + if (this->is_root() && rhs.is_root()) return true; + if (!this->is_root() && rhs.is_root()) return false; string lhs_path; bool is_dir = is_directory(); @@ -190,8 +184,8 @@ namespace WebDAV { } return lhs_path == rhs_path; } - } -} + } // namespace Urn +} // namespace WebDAV auto operator<<(std::ostream& stream, const WebDAV::Urn::Path& path) -> std::ostream& { return stream << path.path(); diff --git a/sources/urn.hpp b/sources/urn.hpp index 01f4470..d7b2bca 100644 --- a/sources/urn.hpp +++ b/sources/urn.hpp @@ -29,7 +29,8 @@ namespace WebDAV { - namespace Urn { + namespace Urn + { using std::string; @@ -43,7 +44,7 @@ namespace WebDAV public: - explicit Path(const string& path, bool force_dir = false); + explicit Path(const string& path_, bool force_dir = false); explicit Path(std::nullptr_t); From 31f296d25052720411206d7b9029cbb563a43d64 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 22 Aug 2017 22:44:17 +0300 Subject: [PATCH 082/133] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25207fc..135d6d5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ WebDAV Client === [![version](https://img.shields.io/badge/hunter-v0.19.61-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.61) -[![version](https://img.shields.io/badge/wdc-v1.1.0-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.0) +[![version](https://img.shields.io/badge/wdc-v1.1.1-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.1) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) From f103c78c2dad55ce2e573fe16a54d229278ed9fc Mon Sep 17 00:00:00 2001 From: rusdevops Date: Tue, 22 Aug 2017 23:01:42 +0300 Subject: [PATCH 083/133] refactored --- CMakeLists.txt | 2 +- examples/client/check.cpp | 24 +++++----- examples/client/copy.cpp | 12 ++--- examples/client/download.cpp | 50 ++++++++++---------- examples/client/info.cpp | 12 ++--- examples/client/init.cpp | 50 ++++++++++---------- examples/client/list.cpp | 24 +++++----- examples/client/mkdir.cpp | 18 +++---- examples/client/move.cpp | 12 ++--- examples/client/remove.cpp | 24 +++++----- examples/client/size.cpp | 10 ++-- examples/client/upload.cpp | 10 ++-- include/webdav/client.hpp | 6 +-- sources/client.cpp | 91 ++++++++++++++++++------------------ sources/pugiext.hpp | 2 +- tests/fixture.cpp | 2 +- 16 files changed, 175 insertions(+), 174 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a3b549d..79086c9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ HunterGate( set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 1) -set(WDC_VERSION_PATCH 0) +set(WDC_VERSION_PATCH 1) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) diff --git a/examples/client/check.cpp b/examples/client/check.cpp index 50269e8..0f167e2 100644 --- a/examples/client/check.cpp +++ b/examples/client/check.cpp @@ -34,11 +34,11 @@ int main() { if (password_ptr == nullptr) return -1; std::map options = - { - { "webdav_hostname", hostname_ptr }, - { "webdav_username", username_ptr }, - { "webdav_password", password_ptr } - }; + { + { "webdav_hostname", hostname_ptr }, + { "webdav_username", username_ptr }, + { "webdav_password", password_ptr } + }; if (root_ptr != nullptr) { options["webdav_root"] = root_ptr; @@ -47,15 +47,15 @@ int main() { std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_resources = { - "existing_file.dat", - "not_existing_file.dat", - "existing_directory", - "existing_directory/", - "not_existing_directory", - "not_existing_directory/" + "existing_file.dat", + "not_existing_file.dat", + "existing_directory", + "existing_directory/", + "not_existing_directory", + "not_existing_directory/" }; - for (auto remote_resource : remote_resources) { + for (const auto& remote_resource : remote_resources) { bool is_existed = client->check(remote_resource); std::cout << "Resource: " << remote_resource << " is " << (is_existed ? "" : "not ") << "existed" << std::endl; } diff --git a/examples/client/copy.cpp b/examples/client/copy.cpp index 7ef2067..a937e76 100644 --- a/examples/client/copy.cpp +++ b/examples/client/copy.cpp @@ -27,7 +27,7 @@ std::string resources_to_string(std::vector & resources) { std::stringstream stream; - for (auto resource : resources) + for (const auto& resource : resources) { stream << "\t" << "- " << resource << std::endl; } @@ -46,11 +46,11 @@ int main() { if (password_ptr == nullptr) return -1; std::map options = - { - { "webdav_hostname", hostname_ptr }, - { "webdav_username", username_ptr }, - { "webdav_password", password_ptr } - }; + { + { "webdav_hostname", hostname_ptr }, + { "webdav_username", username_ptr }, + { "webdav_password", password_ptr } + }; if (root_ptr != nullptr) { options["webdav_root"] = root_ptr; diff --git a/examples/client/download.cpp b/examples/client/download.cpp index 245b8af..7626388 100644 --- a/examples/client/download.cpp +++ b/examples/client/download.cpp @@ -29,11 +29,11 @@ void download_to_file() { std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; std::unique_ptr client{ new WebDAV::Client{ options } }; @@ -53,11 +53,11 @@ void download_to_file() void async_download_to_file() { std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; std::unique_ptr client{ new WebDAV::Client{ options } }; @@ -79,11 +79,11 @@ void async_download_to_file() void download_to_buffer() { std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; std::unique_ptr client{ new WebDAV::Client{ options } }; @@ -106,11 +106,11 @@ void async_download_to_buffer() { /* std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; std::unique_ptr client{ new WebDAV::Client{ options } }; @@ -134,11 +134,11 @@ void async_download_to_buffer() void download_from_stream() { std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; std::unique_ptr client{ new WebDAV::Client{ options } }; diff --git a/examples/client/info.cpp b/examples/client/info.cpp index a24d21e..d3e5ee8 100644 --- a/examples/client/info.cpp +++ b/examples/client/info.cpp @@ -27,7 +27,7 @@ std::string info_to_string(std::map & info) { std::stringstream stream; - for (auto& option : info){ + for (const auto& option : info){ stream << "/t" << option.first << ": " << option.second << std::endl; } return stream.str(); @@ -58,13 +58,13 @@ int main() { std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_resources = { - "existing_file.dat", - "not_existing_file.dat", - "existing_directory", - "not_existing_directory" + "existing_file.dat", + "not_existing_file.dat", + "existing_directory", + "not_existing_directory" }; - for (auto remote_resource : remote_resources) + for (const auto& remote_resource : remote_resources) { auto info = client->info(remote_resource); std::cout << "Information about " << remote_resource << ":" << std::endl; diff --git a/examples/client/init.cpp b/examples/client/init.cpp index 29c9f34..cd51ce3 100644 --- a/examples/client/init.cpp +++ b/examples/client/init.cpp @@ -25,34 +25,34 @@ #include std::map base_options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; +{ + { "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}" } - }; +{ + { "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" } - }; +{ + { "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 (auto option :options) + for (const auto& option : options) { stream << "\t" << option.first << ": " << option.second << std::endl; } @@ -62,12 +62,12 @@ std::string options_to_string(const std::map & options int main() { auto various_options = { - base_options, - options_with_proxy, - options_with_cert + base_options, + options_with_proxy, + options_with_cert }; - for (auto options : various_options) { + 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; diff --git a/examples/client/list.cpp b/examples/client/list.cpp index 2c15ab6..cab5061 100644 --- a/examples/client/list.cpp +++ b/examples/client/list.cpp @@ -27,7 +27,7 @@ std::string resources_to_string(std::vector & resources) { std::stringstream ss; - for (auto& resource : resources){ + for (const auto& resource : resources){ ss << "\t" << "- " << resource << std::endl; } return ss.str(); @@ -45,11 +45,11 @@ int main() { if (password_ptr == nullptr) return -1; std::map options = - { - { "webdav_hostname", hostname_ptr }, - { "webdav_username", username_ptr }, - { "webdav_password", password_ptr } - }; + { + { "webdav_hostname", hostname_ptr }, + { "webdav_username", username_ptr }, + { "webdav_password", password_ptr } + }; if (root_ptr != nullptr) { options["webdav_root"] = root_ptr; @@ -58,14 +58,14 @@ int main() { std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_resources = { - "/", - "existing_file.dat", - "not_existing_file.dat", - "existing_directory", - "not_existing_directory" + "/", + "existing_file.dat", + "not_existing_file.dat", + "existing_directory", + "not_existing_directory" }; - for (auto& remote_resource : remote_resources) { + for (const auto& remote_resource : remote_resources) { auto resources = client->list(remote_resource); std::cout << remote_resource << " resource contain:" << std::endl; std::cout << resources_to_string(resources); diff --git a/examples/client/mkdir.cpp b/examples/client/mkdir.cpp index 77d17de..9175249 100644 --- a/examples/client/mkdir.cpp +++ b/examples/client/mkdir.cpp @@ -25,21 +25,21 @@ int main() { std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; + { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } + }; std::unique_ptr client{ new WebDAV::Client{ options } }; auto remote_directories = { - "existing_directory", - "existing_directory/new_directory", - "not_existing_directory/new_directory", + "existing_directory", + "existing_directory/new_directory", + "not_existing_directory/new_directory", }; - for (auto remote_directory : remote_directories) { + for (const auto& remote_directory : remote_directories) { bool is_created = client->create_directory(remote_directory); std::cout << "Directory: " << remote_directory << " is " << (is_created ? "" : "not ") << "created" << std::endl; } diff --git a/examples/client/move.cpp b/examples/client/move.cpp index d61af41..8a75d14 100644 --- a/examples/client/move.cpp +++ b/examples/client/move.cpp @@ -26,7 +26,7 @@ std::string resources_to_string(const std::vector & resources) { std::stringstream stream; - for (auto resource : resources) + for (const auto& resource : resources) { stream << "\t" << "- " << resource << std::endl; } @@ -36,11 +36,11 @@ std::string resources_to_string(const std::vector & resources) { int main() { std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; + { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } + }; std::unique_ptr client{ new WebDAV::Client{ options } }; diff --git a/examples/client/remove.cpp b/examples/client/remove.cpp index 15fc156..8cc23dd 100644 --- a/examples/client/remove.cpp +++ b/examples/client/remove.cpp @@ -25,26 +25,26 @@ int main() { std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; + { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } + }; std::unique_ptr client{ new WebDAV::Client{ options } }; bool is_connected = client->check(); auto remote_resources = { - "existing_file.dat", - "not_existing_file.dat", - "existing_directory", - "existing_directory/", - "not_existing_directory", - "not_existing_directory/" + "existing_file.dat", + "not_existing_file.dat", + "existing_directory", + "existing_directory/", + "not_existing_directory", + "not_existing_directory/" }; - for (auto remote_resource : remote_resources) { + for (const auto& remote_resource : remote_resources) { bool is_clean = client->clean(remote_resource); std::cout << "Resource: " << remote_resource << " is " << (is_clean ? "" : "not ") << "clean" << std::endl; } diff --git a/examples/client/size.cpp b/examples/client/size.cpp index 3c9df54..963cca6 100644 --- a/examples/client/size.cpp +++ b/examples/client/size.cpp @@ -25,11 +25,11 @@ int main() { std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; + { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } + }; std::unique_ptr client{ new WebDAV::Client{ options } }; diff --git a/examples/client/upload.cpp b/examples/client/upload.cpp index 238cea0..e7a596f 100644 --- a/examples/client/upload.cpp +++ b/examples/client/upload.cpp @@ -29,11 +29,11 @@ void upload_from_file() { std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; std::unique_ptr client{ new WebDAV::Client{ options } }; diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index b72a354..0e47ae8 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -45,7 +45,7 @@ namespace WebDAV /// /// \brief WebDAV Client /// \author designerror - /// \version 1.1.0 + /// \version 1.1.1 /// \date 08/8/2016 /// class Client @@ -264,7 +264,7 @@ namespace WebDAV auto sync_download_to( const std::string& remote_file, char * & buffer_ptr, - unsigned long long int & buffer_size, + unsigned long long & buffer_size, callback_t callback = nullptr, progress_t progress = nullptr ) const noexcept -> bool; @@ -286,7 +286,7 @@ namespace WebDAV auto sync_upload_from( const std::string& remote_file, char * buffer_ptr, - unsigned long long int buffer_size, + unsigned long long buffer_size, callback_t callback = nullptr, progress_t progress = nullptr ) const noexcept -> bool; diff --git a/sources/client.cpp b/sources/client.cpp index 9a8ad6e..c780bf9 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include "callback.hpp" #include "header.hpp" @@ -84,13 +85,13 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "GET"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HEADER, 0L); - request.set(CURLOPT_WRITEDATA, (size_t)&file_stream); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Write::stream); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&file_stream)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Write::stream)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -104,7 +105,7 @@ namespace WebDAV Client::sync_download_to( const std::string& remote_file, char * & buffer_ptr, - unsigned long long int & buffer_size, + unsigned long long & buffer_size, callback_t callback, progress_t progress ) const noexcept @@ -124,13 +125,13 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "GET"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HEADER, 0L); - request.set(CURLOPT_WRITEDATA, (size_t)&data); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -164,13 +165,13 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "GET"); request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HEADER, 0L); - request.set(CURLOPT_WRITEDATA, (size_t)&stream); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Write::stream); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&stream)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Write::stream)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -205,11 +206,11 @@ namespace WebDAV request.set(CURLOPT_UPLOAD, 1L); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_READDATA, static_cast(&file_stream)); + request.set(CURLOPT_READDATA, reinterpret_cast(&file_stream)); request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::stream)); request.set(CURLOPT_INFILESIZE_LARGE, static_cast(size)); request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); - request.set(CURLOPT_WRITEDATA, static_cast(&response)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); @@ -229,7 +230,7 @@ namespace WebDAV Client::sync_upload_from( const std::string& remote_file, char * buffer_ptr, - unsigned long long int buffer_size, + unsigned long long buffer_size, callback_t callback, progress_t progress ) const noexcept @@ -247,17 +248,17 @@ namespace WebDAV request.set(CURLOPT_UPLOAD, 1L); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_READDATA, (size_t)&data); - request.set(CURLOPT_READFUNCTION, (size_t)Callback::Read::buffer); - request.set(CURLOPT_INFILESIZE_LARGE, (curl_off_t)buffer_size); - request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); - request.set(CURLOPT_WRITEDATA, (size_t)&response); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); + request.set(CURLOPT_READDATA, reinterpret_cast(&data)); + request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::buffer)); + request.set(CURLOPT_INFILESIZE_LARGE, static_cast(buffer_size)); + request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -289,17 +290,17 @@ namespace WebDAV request.set(CURLOPT_UPLOAD, 1L); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_READDATA, (size_t)&stream); - request.set(CURLOPT_READFUNCTION, (size_t)Callback::Read::stream); - request.set(CURLOPT_INFILESIZE_LARGE, (curl_off_t)stream_size); - request.set(CURLOPT_BUFFERSIZE, (long)Client::buffer_size); - request.set(CURLOPT_WRITEDATA, (size_t)&response); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); + request.set(CURLOPT_READDATA, reinterpret_cast(&stream)); + request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::stream)); + request.set(CURLOPT_INFILESIZE_LARGE, static_cast(stream_size)); + request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, (size_t)progress.target()); + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -431,7 +432,7 @@ namespace WebDAV #endif bool is_performed = request.perform(); - if (!is_performed) return dict_t(); + if (!is_performed) return dict_t{}; pugi::xml_document document; document.load_buffer(data.buffer, static_cast(data.size)); @@ -444,7 +445,7 @@ namespace WebDAV { pugi::xml_node href = response.node().select_node("*[local-name()='href']").node(); std::string encode_file_name = href.first_child().value(); - std::string resource_path = curl_unescape(encode_file_name.c_str(), (int)encode_file_name.length()); + std::string resource_path = curl_unescape(encode_file_name.c_str(), static_cast(encode_file_name.length())); auto target_path = target_urn.path(); auto target_path_without_sep = std::string(target_path, 0, target_path.rfind('/') + 1); auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind('/') + 1); @@ -469,7 +470,7 @@ namespace WebDAV } } - return dict_t(); + return dict_t{}; } bool @@ -485,7 +486,7 @@ namespace WebDAV Client::list(const std::string& remote_directory) const noexcept { bool is_existed = this->check(remote_directory); - if (!is_existed) return strings_t(); + if (!is_existed) return strings_t{}; auto target_urn = Path(this->webdav_root, true) + remote_directory; target_urn = Path(target_urn.path(), true); @@ -505,15 +506,15 @@ namespace WebDAV request.set(CURLOPT_URL, url.c_str()); request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); request.set(CURLOPT_HEADER, 0); - request.set(CURLOPT_WRITEDATA, (size_t)&data); - request.set(CURLOPT_WRITEFUNCTION, (size_t)Callback::Append::buffer); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif bool is_performed = request.perform(); - if (!is_performed) return strings_t(); + if (!is_performed) return strings_t{}; strings_t resources; @@ -541,7 +542,7 @@ namespace WebDAV progress_t progress ) const noexcept { - return this->sync_download(remote_file, local_file, nullptr, progress); + return this->sync_download(remote_file, local_file, nullptr, std::move(progress)); } void @@ -552,7 +553,7 @@ namespace WebDAV progress_t progress ) const noexcept { - std::thread downloading([&]() { this->sync_download(remote_file, local_file, callback, progress); }); + std::thread downloading([&]() { this->sync_download(remote_file, local_file, callback, std::move(progress)); }); downloading.detach(); } @@ -560,11 +561,11 @@ namespace WebDAV Client::download_to( const std::string& remote_file, char * & buffer_ptr, - unsigned long long int & buffer_size, + unsigned long long & buffer_size, progress_t progress ) const noexcept { - return this->sync_download_to(remote_file, buffer_ptr, buffer_size, nullptr, progress); + return this->sync_download_to(remote_file, buffer_ptr, buffer_size, nullptr, std::move(progress)); } bool @@ -574,7 +575,7 @@ namespace WebDAV progress_t progress ) const noexcept { - return this->sync_download_to(remote_file, stream, nullptr, progress); + return this->sync_download_to(remote_file, stream, nullptr, std::move(progress)); } bool @@ -681,7 +682,7 @@ namespace WebDAV progress_t progress ) const noexcept { - return this->sync_upload(remote_file, local_file, nullptr, progress); + return this->sync_upload(remote_file, local_file, nullptr, std::move(progress)); } void @@ -692,7 +693,7 @@ namespace WebDAV progress_t progress ) const noexcept { - std::thread uploading([&]() { this->sync_upload(remote_file, local_file, callback, progress); }); + std::thread uploading([&]() { this->sync_upload(remote_file, local_file, callback, std::move(progress)); }); uploading.detach(); } @@ -703,18 +704,18 @@ namespace WebDAV progress_t progress ) const noexcept { - return this->sync_upload_from(remote_file, stream, nullptr, progress); + return this->sync_upload_from(remote_file, stream, nullptr, std::move(progress)); } bool Client::upload_from( const std::string& remote_file, char * buffer_ptr, - unsigned long long int buffer_size, + unsigned long long buffer_size, progress_t progress ) const noexcept { - return this->sync_upload_from(remote_file, buffer_ptr, buffer_size, nullptr, progress); + return this->sync_upload_from(remote_file, buffer_ptr, buffer_size, nullptr, std::move(progress)); } bool @@ -737,7 +738,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "DELETE"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, (struct curl_slist *)header.handle); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif diff --git a/sources/pugiext.hpp b/sources/pugiext.hpp index fae0346..8d6d270 100644 --- a/sources/pugiext.hpp +++ b/sources/pugiext.hpp @@ -38,7 +38,7 @@ namespace pugi } }; - inline std::string node_to_string(pugi::xml_node node) + inline std::string node_to_string(const pugi::xml_node& node) { xml_string_writer writer; node.print(writer); diff --git a/tests/fixture.cpp b/tests/fixture.cpp index 383da36..58d935c 100644 --- a/tests/fixture.cpp +++ b/tests/fixture.cpp @@ -59,7 +59,7 @@ namespace fixture boost::uuids::random_generator gen; boost::uuids::uuid id = gen(); auto ciid = to_string(id); - return ciid; + return ciid + "/"; } auto get_options() -> dict_t { From 52631b65853d193cb2ac8f77d9affd71efc03f62 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Wed, 23 Aug 2017 20:25:32 +0300 Subject: [PATCH 084/133] Update README.md [skip ci] --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 135d6d5..499c9ec 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ WebDAV Client === -[![version](https://img.shields.io/badge/hunter-v0.19.61-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.61) +[![version](https://img.shields.io/badge/hunter-v0.19.79-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.79) [![version](https://img.shields.io/badge/wdc-v1.1.1-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.1) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) @@ -128,8 +128,8 @@ cmake_minimum_required(VERSION 3.3) include(cmake/HunterGate.cmake) HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.19.61.tar.gz" - SHA1 "cd4dd406ca45bb6bb28a116d93c2958efac6bf09" + URL "https://github.com/ruslo/hunter/archive/v0.19.79.tar.gz" + SHA1 "f4ac704bdf9f32b52f718b1ac520bb6aca2d9be4" ) project(example) From d3d4434b9b8bf289068fef45e2a753399c27cd5a Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 16 Oct 2017 11:50:01 -0700 Subject: [PATCH 085/133] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9614b84..3d1364a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Package ```WebDAV Client``` provides easy and convenient to work with WebDAV-ser - ownCloud - ... -Install +Install old version === ```ShellSession From ac1a9efca06d501636c8bc3dd5c4974474156f45 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 16 Oct 2017 12:53:28 -0700 Subject: [PATCH 086/133] Update CMakeLists.txt --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 79086c9..65220a4 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,8 +24,8 @@ cmake_minimum_required(VERSION 3.3) include("cmake/HunterGate.cmake") HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.19.51.tar.gz" - SHA1 "d238dc1dd4db83e45a592f96fdb95d17c688600a" + URL "https://github.com/ruslo/hunter/archive/v0.19.123.tar.gz" + SHA1 "57d07480686f82ddc916a5980b4f2a18e5954c2b" ) set(WDC_VERSION_MAJOR 1) From f2bcc153b9fce85bbe259efa5c0a3b779ff2487f Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 16 Oct 2017 22:18:34 -0700 Subject: [PATCH 087/133] Update check.cpp --- tests/check.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/check.cpp b/tests/check.cpp index 6b5f102..6f23993 100644 --- a/tests/check.cpp +++ b/tests/check.cpp @@ -24,6 +24,8 @@ #include #include "fixture.hpp" +#include + SCENARIO("Client must check an existing remote resources", "[check]") { auto options = fixture::get_options(); From 7a85b8fa7cd1a5cbcc45dca34ebe80ee247f7c9e Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 16 Oct 2017 22:19:08 -0700 Subject: [PATCH 088/133] Update clean.cpp --- tests/clean.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/clean.cpp b/tests/clean.cpp index 94890f3..f547b54 100644 --- a/tests/clean.cpp +++ b/tests/clean.cpp @@ -24,6 +24,7 @@ #include #include "fixture.hpp" +#include SCENARIO("Client must clean an existing remote resources", "[clean]") { From c5cf535ded85d2dbb4aa8f85188f19bd0d23e8ad Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 16 Oct 2017 22:19:32 -0700 Subject: [PATCH 089/133] Update download.cpp --- tests/download.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/download.cpp b/tests/download.cpp index 034ecbe..b51bff3 100644 --- a/tests/download.cpp +++ b/tests/download.cpp @@ -24,6 +24,8 @@ #include #include "fixture.hpp" +#include + SCENARIO("Client must download into buffer", "[download][buffer]") { auto options = fixture::get_options(); From 046827fc9ffed176e616c55bf018c9ea3a58093c Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 16 Oct 2017 22:19:52 -0700 Subject: [PATCH 090/133] Update list.cpp --- tests/list.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/list.cpp b/tests/list.cpp index 955eafb..334bbae 100644 --- a/tests/list.cpp +++ b/tests/list.cpp @@ -24,6 +24,8 @@ #include #include "fixture.hpp" +#include + SCENARIO("Client must list a remote files and a remote directories", "[list]") { auto options = fixture::get_options(); From 2cf3123fd6b22d9d7dd6879e461ba4ed5decd5f2 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 16 Oct 2017 22:20:11 -0700 Subject: [PATCH 091/133] Update upload.cpp --- tests/upload.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/upload.cpp b/tests/upload.cpp index 7eee51a..a5c65e9 100644 --- a/tests/upload.cpp +++ b/tests/upload.cpp @@ -25,6 +25,7 @@ #include "fixture.hpp" #include +#include SCENARIO("Client must upload buffer", "[upload][buffer]") { From 5a92c825e84ba0a3d1907b8cbdaeee7fa3079bb5 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 26 Oct 2017 03:24:37 -0700 Subject: [PATCH 092/133] added coverage --- CMakeLists.txt | 26 +++-- cmake/CodeCoverage.cmake | 204 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+), 6 deletions(-) create mode 100644 cmake/CodeCoverage.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 65220a4..a4cfe7a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -123,13 +123,27 @@ if(BUILD_TESTS) hunter_add_package(Catch) find_package(Catch CONFIG REQUIRED) - enable_testing() + enable_testing() - file(GLOB ${PROJECT_NAME}_TEST_SOURCES tests/*.cpp) - add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) - target_link_libraries(check libwdc Catch::Catch Boost::filesystem Boost::system) + file(GLOB ${PROJECT_NAME}_TEST_SOURCES tests/*.cpp) + add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) + target_link_libraries(check libwdc Catch::Catch Boost::filesystem Boost::system) + + if (${CMAKE_BUILD_TYPE} MATCHES "Coverage") + + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") + include(CodeCoverage) + + set(CMAKE_CXX_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage") + set(LCOV_REMOVE_EXTRA "'tests/*'") + add_executable(unit_tests ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_TEST_SOURCES}) + target_link_libraries(unit_tests Catch::Catch Boost::filesystem Boost::system libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) + + setup_target_for_coverage(unit_tests_coverage unit_tests coverage) + else() + add_test(NAME unit_tests COMMAND check "-s" "-r" "compact" "--use-colour" "yes") + endif() - add_test(NAME check COMMAND check "-s" "-r" "compact" "--use-colour" "yes") endif() if(BUILD_EXAMPLES) @@ -142,7 +156,7 @@ if(BUILD_EXAMPLES) set_target_properties(${EXAMPLE_TARGET_NAME} PROPERTIES OUTPUT_NAME ${EXAMPLE_NAME}) install(TARGETS ${EXAMPLE_TARGET_NAME} RUNTIME DESTINATION bin - ) + ) endforeach(EXAMPLE_SOURCE ${EXAMPLE_SOURCES}) endif() diff --git a/cmake/CodeCoverage.cmake b/cmake/CodeCoverage.cmake new file mode 100644 index 0000000..92e404f --- /dev/null +++ b/cmake/CodeCoverage.cmake @@ -0,0 +1,204 @@ +# Copyright (c) 2012 - 2015, Lars Bilke +# All rights reserved. +# +# 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. Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# 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. +# +# +# +# 2012-01-31, Lars Bilke +# - Enable Code Coverage +# +# 2013-09-17, Joakim Söderberg +# - Added support for Clang. +# - Some additional usage instructions. +# +# USAGE: + +# 0. (Mac only) If you use Xcode 5.1 make sure to patch geninfo as described here: +# http://stackoverflow.com/a/22404544/80480 +# +# 1. Copy this file into your cmake modules path. +# +# 2. Add the following line to your CMakeLists.txt: +# INCLUDE(CodeCoverage) +# +# 3. Set compiler flags to turn off optimization and enable coverage: +# SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") +# SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") +# +# 3. Use the function SETUP_TARGET_FOR_COVERAGE to create a custom make target +# which runs your test executable and produces a lcov code coverage report: +# Example: +# SETUP_TARGET_FOR_COVERAGE( +# my_coverage_target # Name for custom target. +# test_driver # Name of the test driver executable that runs the tests. +# # NOTE! This should always have a ZERO as exit code +# # otherwise the coverage generation will not complete. +# coverage # Name of output directory. +# ) +# +# If you need to exclude additional directories from the report, specify them +# using the LCOV_REMOVE_EXTRA variable before calling SETUP_TARGET_FOR_COVERAGE. +# For example: +# +# set(LCOV_REMOVE_EXTRA "'thirdparty/*'") +# +# 4. Build a Debug build: +# cmake -DCMAKE_BUILD_TYPE=Debug .. +# make +# make my_coverage_target +# +# + +# Check prereqs +FIND_PROGRAM( GCOV_PATH gcov ) +FIND_PROGRAM( LCOV_PATH lcov ) +FIND_PROGRAM( GENHTML_PATH genhtml ) +FIND_PROGRAM( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/tests) + +IF(NOT GCOV_PATH) + MESSAGE(FATAL_ERROR "gcov not found! Aborting...") +ENDIF() # NOT GCOV_PATH + +IF("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") + IF("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3) + MESSAGE(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...") + ENDIF() +ELSEIF(NOT CMAKE_COMPILER_IS_GNUCXX) + MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...") +ENDIF() # CHECK VALID COMPILER + +SET(CMAKE_CXX_FLAGS_COVERAGE + "-g -O0 --coverage -fprofile-arcs -ftest-coverage" + CACHE STRING "Flags used by the C++ compiler during coverage builds." + FORCE ) +SET(CMAKE_C_FLAGS_COVERAGE + "-g -O0 --coverage -fprofile-arcs -ftest-coverage" + CACHE STRING "Flags used by the C compiler during coverage builds." + FORCE ) +SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE + "" + CACHE STRING "Flags used for linking binaries during coverage builds." + FORCE ) +SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE + "" + CACHE STRING "Flags used by the shared libraries linker during coverage builds." + FORCE ) +MARK_AS_ADVANCED( + CMAKE_CXX_FLAGS_COVERAGE + CMAKE_C_FLAGS_COVERAGE + CMAKE_EXE_LINKER_FLAGS_COVERAGE + CMAKE_SHARED_LINKER_FLAGS_COVERAGE ) + +IF ( NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "Coverage")) + MESSAGE( WARNING "Code coverage results with an optimized (non-Debug) build may be misleading" ) +ENDIF() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug" + + +# Param _targetname The name of new the custom make target +# Param _testrunner The name of the target which runs the tests. +# MUST return ZERO always, even on errors. +# If not, no coverage report will be created! +# Param _outputname lcov output is generated as _outputname.info +# HTML report is generated in _outputname/index.html +# Optional fourth parameter is passed as arguments to _testrunner +# Pass them in list form, e.g.: "-j;2" for -j 2 +FUNCTION(SETUP_TARGET_FOR_COVERAGE _targetname _testrunner _outputname) + + IF(NOT LCOV_PATH) + MESSAGE(FATAL_ERROR "lcov not found! Aborting...") + ENDIF() # NOT LCOV_PATH + + IF(NOT GENHTML_PATH) + MESSAGE(FATAL_ERROR "genhtml not found! Aborting...") + ENDIF() # NOT GENHTML_PATH + + SET(coverage_info "${CMAKE_BINARY_DIR}/${_outputname}.info") + SET(coverage_cleaned "${coverage_info}.cleaned") + + SEPARATE_ARGUMENTS(test_command UNIX_COMMAND "${_testrunner}") + + # Setup target + ADD_CUSTOM_TARGET(${_targetname} + + # Cleanup lcov + ${LCOV_PATH} --directory . --zerocounters + + # Run tests + COMMAND ${test_command} ${ARGV3} + + # Capturing lcov counters and generating report + COMMAND ${LCOV_PATH} --directory . --capture --output-file ${coverage_info} + COMMAND ${LCOV_PATH} --remove ${coverage_info} 'tests/*' '/usr/*' ${LCOV_REMOVE_EXTRA} --output-file ${coverage_cleaned} + COMMAND ${GENHTML_PATH} -o ${_outputname} ${coverage_cleaned} + COMMAND ${CMAKE_COMMAND} -E remove ${coverage_info} ${coverage_cleaned} + + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report." + ) + + # Show info where to find the report + ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD + COMMAND ; + COMMENT "Open ./${_outputname}/index.html in your browser to view the coverage report." + ) + +ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE + +# Param _targetname The name of new the custom make target +# Param _testrunner The name of the target which runs the tests +# Param _outputname cobertura output is generated as _outputname.xml +# Optional fourth parameter is passed as arguments to _testrunner +# Pass them in list form, e.g.: "-j;2" for -j 2 +FUNCTION(SETUP_TARGET_FOR_COVERAGE_COBERTURA _targetname _testrunner _outputname) + + IF(NOT PYTHON_EXECUTABLE) + MESSAGE(FATAL_ERROR "Python not found! Aborting...") + ENDIF() # NOT PYTHON_EXECUTABLE + + IF(NOT GCOVR_PATH) + MESSAGE(FATAL_ERROR "gcovr not found! Aborting...") + ENDIF() # NOT GCOVR_PATH + + ADD_CUSTOM_TARGET(${_targetname} + + # Run tests + ${_testrunner} ${ARGV3} + + # Running gcovr + COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} -e '${CMAKE_SOURCE_DIR}/tests/' -o ${_outputname}.xml + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Running gcovr to produce Cobertura code coverage report." + ) + + # Show info where to find the report + ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD + COMMAND ; + COMMENT "Cobertura code coverage report saved in ${_outputname}.xml." + ) + +ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE_COBERTURA + From 3af8c9c7cec55be201c93f6bd4720818db6e7f50 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 15 Mar 2018 22:12:55 +0400 Subject: [PATCH 093/133] fixed #45 --- sources/client.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sources/client.cpp b/sources/client.cpp index c780bf9..a1ffa22 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -553,7 +553,7 @@ namespace WebDAV progress_t progress ) const noexcept { - std::thread downloading([&]() { this->sync_download(remote_file, local_file, callback, std::move(progress)); }); + std::thread downloading([=]() { this->sync_download(remote_file, local_file, callback, std::move(progress)); }); downloading.detach(); } @@ -693,7 +693,7 @@ namespace WebDAV progress_t progress ) const noexcept { - std::thread uploading([&]() { this->sync_upload(remote_file, local_file, callback, std::move(progress)); }); + std::thread uploading([=]() { this->sync_upload(remote_file, local_file, callback, std::move(progress)); }); uploading.detach(); } From 28e69d6e82cc50bfb3e55415fcba249e749e4fe1 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 15 Mar 2018 23:00:49 +0400 Subject: [PATCH 094/133] fixed #46 --- sources/urn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/urn.cpp b/sources/urn.cpp index 59c1740..17cb97c 100644 --- a/sources/urn.cpp +++ b/sources/urn.cpp @@ -137,7 +137,7 @@ namespace WebDAV if (this->is_root()) return Path{m_path}; - auto last_separate_position = m_path.rfind(Path::separate); + auto last_separate_position = m_path.rfind(Path::separate, m_path.length() - 2); if (last_separate_position == 0) return Path{Path::separate}; auto parent = m_path.substr(0, last_separate_position + 1); From b387ee11010f43c049d5dc8b53baf8ff9cf568e8 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 15 Mar 2018 23:24:48 +0400 Subject: [PATCH 095/133] fixed #44 --- sources/callback.cpp | 2 +- sources/callback.hpp | 8 ++++++++ sources/client.cpp | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sources/callback.cpp b/sources/callback.cpp index 9f1ab3c..a8b3c98 100644 --- a/sources/callback.cpp +++ b/sources/callback.cpp @@ -74,7 +74,7 @@ namespace WebDAV auto size = static_cast(item_size * item_count); auto rest_bytes = data->size - data->position; auto copied_bytes = std::min(size, rest_bytes); - memcpy(data->buffer, data->buffer, copied_bytes); + memcpy(data->buffer, ptr, copied_bytes); data->position += copied_bytes; return copied_bytes; } diff --git a/sources/callback.hpp b/sources/callback.hpp index 263b6e7..8746923 100644 --- a/sources/callback.hpp +++ b/sources/callback.hpp @@ -30,6 +30,14 @@ namespace WebDAV char * buffer; unsigned long long position; unsigned long long size; + void reset() { + buffer = nullptr; + position = 0; + size = 0; + } + ~Data() { + delete[] buffer; + } }; namespace Callback diff --git a/sources/client.cpp b/sources/client.cpp index a1ffa22..1afa32c 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -141,6 +141,7 @@ namespace WebDAV buffer_ptr = data.buffer; buffer_size = data.size; + data.reset(); return true; } @@ -265,6 +266,8 @@ namespace WebDAV bool is_performed = request.perform(); if (callback != nullptr) callback(is_performed); + + data.reset(); return is_performed; } From bfa816c3fcd4cf5617f0d6d3a4c5e70089eb5bf7 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 00:00:05 +0400 Subject: [PATCH 096/133] change version --- CMakeLists.txt | 2 +- README.md | 2 +- include/webdav/client.hpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a4cfe7a..22a8be0 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ HunterGate( set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 1) -set(WDC_VERSION_PATCH 1) +set(WDC_VERSION_PATCH 2) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) diff --git a/README.md b/README.md index 3d1364a..190ad58 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ WebDAV Client === [![version](https://img.shields.io/badge/hunter-v0.19.79-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.79) -[![version](https://img.shields.io/badge/wdc-v1.1.1-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.1) +[![version](https://img.shields.io/badge/wdc-v1.1.2-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.2) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 0e47ae8..c6ec9ab 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -45,8 +45,8 @@ namespace WebDAV /// /// \brief WebDAV Client /// \author designerror - /// \version 1.1.1 - /// \date 08/8/2016 + /// \version 1.1.2 + /// \date 3/15/2018 /// class Client { From c90c3281d5b8d707b3f9d15956209177665ae3d7 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 00:03:46 +0400 Subject: [PATCH 097/133] change version --- CMakeLists.txt | 2 +- README.md | 2 +- include/webdav/client.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 22a8be0..94ff972 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ HunterGate( set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 1) -set(WDC_VERSION_PATCH 2) +set(WDC_VERSION_PATCH 3) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) diff --git a/README.md b/README.md index 190ad58..f447d73 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ WebDAV Client === [![version](https://img.shields.io/badge/hunter-v0.19.79-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.79) -[![version](https://img.shields.io/badge/wdc-v1.1.2-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.2) +[![version](https://img.shields.io/badge/wdc-v1.1.3-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.3) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index c6ec9ab..16df90b 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -45,7 +45,7 @@ namespace WebDAV /// /// \brief WebDAV Client /// \author designerror - /// \version 1.1.2 + /// \version 1.1.3 /// \date 3/15/2018 /// class Client From 13ae1ba4854644544751f3dbf65e730a3530c50e Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 00:04:54 +0400 Subject: [PATCH 098/133] Delete INSTALL.macOS.md --- INSTALL.macOS.md | 54 ------------------------------------------------ 1 file changed, 54 deletions(-) delete mode 100644 INSTALL.macOS.md diff --git a/INSTALL.macOS.md b/INSTALL.macOS.md deleted file mode 100644 index 1b49f73..0000000 --- a/INSTALL.macOS.md +++ /dev/null @@ -1,54 +0,0 @@ - - [ ] 1. Install `OpenSSL@1.0.2g` -```bash -$ echo "Install OpenSSL@1.0.2g" -$ wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2g.tar.gz -O OpenSSL_1_0_2g.tar.gz -$ tar -xf OpenSSL_1_0_2g.tar.gz && cd openssl-OpenSSL_1_0_2g -$ ./config -$ make && sudo make install -$ cd .. && rm -rf openssl-OpenSSL_1_0_2g && rm -f OpenSSL_1_0_2g.tar.gz -``` - - - [ ] 2. Install `CURL@7.4.8` -```bash -$ echo "Install CURL@7.4.8" -$ wget https://github.com/curl/curl/archive/curl-7_48_0.tar.gz -O curl-7_48_0.tar.gz -$ tar -xf curl-7_48_0.tar.gz && cd curl-curl-7_48_0 -$ mkdir build && cd build -$ cmake .. -$ make && sudo make install -$ cd ../.. && rm -rf curl-curl-7_48_0 && rm -f curl-7_48_0.tar.gz -``` - - - [ ] 3. Install `pugixml@1.7.0` -```bash -$ echo "Install pugixml@1.7.0" -$ wget https://github.com/zeux/pugixml/releases/download/v1.7/pugixml-1.7.tar.gz -O pugixml-1.7.tar.gz -$ tar -xf pugixml-1.7.tar.gz && cd pugixml-1.7 -$ mkdir build && cd build -$ cmake ../scripts/ -$ make && sudo make install -$ cd ../.. && rm -rf pugixml-1.7 && rm -f pugixml-1.7.tar.gz -``` - - [ ] 4. Install `webdavclient@1.0.0` -```bash -$ echo "Install webdavclient@1.0.0" -$ wget https://github.com/designerror/webdav-client-cpp/archive/v1.0.0.tar.gz -O webdavclient-0.9.9.tar.gz -$ tar -xf webdavclient-1.0.0.tar.gz && cd webdav-client-cpp-1.0.0 -$ export OPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -$ mkdir build && cd build -$ cmake .. -$ make && sudo make install -$ cd ../.. && rm -rf webdav-client-cpp-1.0.0 && rm -f webdavclient-1.0.0.tar.gz -``` - - - [ ] 5. Building tests for `webdavclient@1.0.0` -```bash -$ echo "Building tests for webdavclient@1.0.0" -$ wget https://github.com/designerror/webdav-client-cpp/archive/v1.0.0.tar.gz -O webdavclient-1.0.0.tar.gz -$ tar -xf webdavclient-1.0.0.tar.gz && cd webdav-client-cpp-1.0.0 -$ export OPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -$ mkdir build && cd build -$ cmake .. && make -$ ctest -$ cd ../.. && rm -rf webdav-client-cpp-1.0.0 && rm -f webdavclient-1.0.0.tar.gz -``` From 634f855e5ebde4b308d14847dabb79028d496ff3 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 00:05:03 +0400 Subject: [PATCH 099/133] Delete INSTALL.UNIX.md --- INSTALL.UNIX.md | 52 ------------------------------------------------- 1 file changed, 52 deletions(-) delete mode 100644 INSTALL.UNIX.md diff --git a/INSTALL.UNIX.md b/INSTALL.UNIX.md deleted file mode 100644 index 686f31b..0000000 --- a/INSTALL.UNIX.md +++ /dev/null @@ -1,52 +0,0 @@ - - [ ] 1. Install `OpenSSL@1.0.2g` -```bash -$ echo "Install OpenSSL@1.0.2g" -$ wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2g.tar.gz -O OpenSSL_1_0_2g.tar.gz -$ tar -xf OpenSSL_1_0_2g.tar.gz && cd openssl-OpenSSL_1_0_2g -$ ./config -$ make && sudo make install -$ cd .. && rm -rf openssl-OpenSSL_1_0_2g && rm -f OpenSSL_1_0_2g.tar.gz -``` - - - [ ] 2. Install `CURL@7.4.8` -```bash -$ echo "Install CURL@7.4.8" -$ wget https://github.com/curl/curl/archive/curl-7_48_0.tar.gz -O curl-7_48_0.tar.gz -$ tar -xf curl-7_48_0.tar.gz && cd curl-curl-7_48_0 -$ mkdir build && cd build -$ cmake .. -$ make && sudo make install -$ cd ../.. && rm -rf curl-curl-7_48_0 && rm -f curl-7_48_0.tar.gz -``` - - - [ ] 3. Install `pugixml@1.7.0` -```bash -$ echo "Install pugixml@1.7.0" -$ wget https://github.com/zeux/pugixml/releases/download/v1.7/pugixml-1.7.tar.gz -O pugixml-1.7.tar.gz -$ tar -xf pugixml-1.7.tar.gz && cd pugixml-1.7 -$ mkdir build && cd build -$ cmake ../scripts/ -$ make && sudo make install -$ cd ../.. && rm -rf pugixml-1.7 && rm -f pugixml-1.7.tar.gz -``` - - [ ] 4. Install `webdavclient@1.0.0` -```bash -$ echo "Install webdavclient@1.0.0" -$ wget https://github.com/designerror/webdav-client-cpp/archive/v1.0.0.tar.gz -O webdavclient-0.9.9.tar.gz -$ tar -xf webdavclient-1.0.0.tar.gz && cd webdav-client-cpp-1.0.0 -$ mkdir build && cd build -$ cmake .. -$ make && sudo make install -$ cd ../.. && rm -rf webdav-client-cpp-1.0.0 && rm -f webdavclient-1.0.0.tar.gz -``` - - - [ ] 5. Building tests for `webdavclient@1.0.0` -```bash -$ echo "Building tests for webdavclient@1.0.0" -$ wget https://github.com/designerror/webdav-client-cpp/archive/v1.0.0.tar.gz -O webdavclient-1.0.0.tar.gz -$ tar -xf webdavclient-1.0.0.tar.gz && cd webdav-client-cpp-1.0.0 -$ mkdir build && cd build -$ cmake .. && make -$ ctest -$ cd ../.. && rm -rf webdav-client-cpp-1.0.0 && rm -f webdavclient-1.0.0.tar.gz -``` From a1b45a236d67b3d02584f8f6fc9a9b4fd7fb0943 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 00:05:13 +0400 Subject: [PATCH 100/133] Delete INSTALL.WIN.md --- INSTALL.WIN.md | 67 -------------------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 INSTALL.WIN.md diff --git a/INSTALL.WIN.md b/INSTALL.WIN.md deleted file mode 100644 index f8edcc6..0000000 --- a/INSTALL.WIN.md +++ /dev/null @@ -1,67 +0,0 @@ - - [ ] 1. Install [perl](https://www.perl.org/) - - [ ] 2. Install [nasm](http://www.nasm.us/) - - [ ] 3. Add nasm in environment variable `PATH` - - [ ] 4. Run `VS Cross Tools Command Prompt` - - - [ ] 5. Download repositoty with requirements -```bash -> git clone https://github.com/designerror/webdav-client-cpp -> cd webdav-client-cpp -> git submodule update --init -``` - - - [ ] 6. Set the build options -```bash -> set BUILD_TYPE=Release # Release | Debug -> set BUILD_SHARED_LIBS=FALSE # FALSE | TRUE -> set OPENSSL_BUILD_PLATFORM=VC-WIN64A # VC-WIN32 | VC-WIN64A | VC-WIN64I | VC-CE -> set INSTALL_PREFIX=%cd%\build -> set CMAKE_COMMON_FLAGS=-DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DMSVC_SHRED_RT:BOOL=%BUILD_SHARED_LIBS% -``` - - - [ ] 7. Build and local install `openssl` - -```bash -> cd vendor\openssl/ -> mkdir build && cd build -> perl ../Configure --prefix=%INSTALL_PREFIX% --openssldir=%INSTALL_PREFIX%\ssl %OPENSSL_BUILD_PLATFORM% no-shared no-idea no-unit-test -> nmake -> nmake install -> cd ../.. -``` - - - [ ] 8. Build and local install `curl` - -```bash -> cd curl -> mkdir build && cd build -> cmake .. -DCMAKE_INSTALL_PREFIX=%INSTALL_PREFIX% -DCURL_STATICLIB:BOOL=ON -DBUILD_TESTING:BOOL=OFF -DBUILD_CURL_TESTS:BOOL=OFF -DBUILD_CURL_EXE:BOOL=OFF -DCURL_DISABLE_LDAP:BOOL=ON -DCURL_DISABLE_LDAPS=ON %CMAKE_COMMON_FLAGS% -> nmake -> nmake install -> cd ../.. -``` - - - [ ] 9. Build and local install `pugixml` - -```bash -> cd pugixml -> mkdir build && cd build -> cmake .. -DCMAKE_INSTALL_PREFIX=%INSTALL_PREFIX% %CMAKE_COMMON_FLAGS% -> nmake -> nmake install -> cd ../.. -``` - - - [ ] 10. Build and local install `webdavclient` - -```bash -> cd %INSTALL_PREFIX% -> set CURL_INCLUDE_DIR=%INSTALL_PREFIX%\include -> set CURL_LIBRARY=%INSTALL_PREFIX%\lib\libcurl.lib -> set CMAKE_PUGIXML_FLAGS=-DPUGIXML_LIBRARY=%INSTALL_PREFIX%\lib\pugixml.lib -DPUGIXML_INCLUDE_DIR=%INSTALL_PREFIX%\include -> set CMAKE_CURL_FLAGS=-DCURL_STATICLIB:BOOL=TRUE -DCURL_INCLUDE_DIR:STRING=%CURL_INCLUDE_DIR% -DCURL_LIBRARY=%CURL_LIBRARY% -> set CMAKE_OPENSSL_FLAGS=-DOPENSSL_LIBRARIES="%INSTALL_PREFIX%\lib\libcrypto.lib;%INSTALL_PREFIX%\lib\libssl.lib" -> cmake .. %CMAKE_PUGIXML_FLAGS% %CMAKE_CURL_FLAGS% %CMAKE_OPENSSL_FLAGS% %CMAKE_COMMON_FLAGS% -> nmake -> nmake install -``` From 22f7d28c2b9c5add412736d9937b4bdfce8f89f7 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 00:05:34 +0400 Subject: [PATCH 101/133] Delete REQUIREMENTS.UNIX.txt --- REQUIREMENTS.UNIX.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 REQUIREMENTS.UNIX.txt diff --git a/REQUIREMENTS.UNIX.txt b/REQUIREMENTS.UNIX.txt deleted file mode 100644 index 14a0de9..0000000 --- a/REQUIREMENTS.UNIX.txt +++ /dev/null @@ -1,3 +0,0 @@ -libcurl-dev(>=7.38.0) -libssl-dev(>=1.0.1f) -libpugixml-dev(>=1.0.0) From fafcb660a79ff34079e6063b5abb3e8d13aa84bd Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 00:05:48 +0400 Subject: [PATCH 102/133] Delete BUGS.md --- BUGS.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 BUGS.md diff --git a/BUGS.md b/BUGS.md deleted file mode 100644 index 8b13789..0000000 --- a/BUGS.md +++ /dev/null @@ -1 +0,0 @@ - From d1bbbf939b39cb7f17acaefe5e0ccce658325faa Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 16:58:47 +0400 Subject: [PATCH 103/133] Update client.cpp --- sources/client.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/client.cpp b/sources/client.cpp index 1afa32c..e2a2ec8 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -592,6 +592,7 @@ namespace WebDAV if (recursive) { auto remote_parent_directory = directory_urn.parent().path(); + if (remote_parent_directory == remote_directory) return false; bool is_created = this->create_directory(remote_parent_directory, true); if (!is_created) return false; } From baa6967f0f87f1ea60d3a3d186606c32f2e8a213 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 19:20:43 +0400 Subject: [PATCH 104/133] fixed #48 --- sources/client.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sources/client.cpp b/sources/client.cpp index e2a2ec8..51c8101 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -450,7 +450,9 @@ namespace WebDAV std::string encode_file_name = href.first_child().value(); std::string resource_path = curl_unescape(encode_file_name.c_str(), static_cast(encode_file_name.length())); auto target_path = target_urn.path(); - auto target_path_without_sep = std::string(target_path, 0, target_path.rfind('/') + 1); + auto target_path_without_sep = target_urn.path(); + if (!target_path_without_sep.empty() && target_path_without_sep.back() == '/') + target_path_without_sep.resize(target_path_without_sep.length() - 1); auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind('/') + 1); if (resource_path_without_sep == target_path_without_sep) { auto propstat = response.node().select_node("*[local-name()='propstat']").node(); From b7d1184743b74dec5f0debcd4b9515ab1cfd7bb9 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 16 Mar 2018 19:26:56 +0400 Subject: [PATCH 105/133] update version --- CMakeLists.txt | 2 +- README.md | 2 +- include/webdav/client.hpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 94ff972..dcc9ba7 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ HunterGate( set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 1) -set(WDC_VERSION_PATCH 3) +set(WDC_VERSION_PATCH 4) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) diff --git a/README.md b/README.md index f447d73..90eaf0a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ WebDAV Client === [![version](https://img.shields.io/badge/hunter-v0.19.79-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.79) -[![version](https://img.shields.io/badge/wdc-v1.1.3-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.3) +[![version](https://img.shields.io/badge/wdc-v1.1.4-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.4) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 16df90b..4141599 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -45,8 +45,8 @@ namespace WebDAV /// /// \brief WebDAV Client /// \author designerror - /// \version 1.1.3 - /// \date 3/15/2018 + /// \version 1.1.4 + /// \date 3/16/2018 /// class Client { From 0d1c1b106b04490165b734f5ee6db6f2a108d134 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sun, 16 Dec 2018 22:41:00 +1000 Subject: [PATCH 106/133] Need to include for std::unique_ptr --- examples/cli/cli.cpp | 2 ++ examples/client/check.cpp | 2 ++ examples/client/copy.cpp | 1 + examples/client/download.cpp | 1 + examples/client/info.cpp | 1 + examples/client/init.cpp | 1 + examples/client/list.cpp | 1 + examples/client/mkdir.cpp | 2 ++ examples/client/move.cpp | 1 + examples/client/remove.cpp | 2 ++ examples/client/size.cpp | 2 ++ examples/client/upload.cpp | 1 + 12 files changed, 17 insertions(+) diff --git a/examples/cli/cli.cpp b/examples/cli/cli.cpp index 7ae8751..5eec7f5 100644 --- a/examples/cli/cli.cpp +++ b/examples/cli/cli.cpp @@ -21,6 +21,8 @@ ############################################################################*/ #include + +#include #include using dict_t = std::map; diff --git a/examples/client/check.cpp b/examples/client/check.cpp index 0f167e2..292926b 100644 --- a/examples/client/check.cpp +++ b/examples/client/check.cpp @@ -22,6 +22,8 @@ #include +#include + int main() { auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); diff --git a/examples/client/copy.cpp b/examples/client/copy.cpp index a937e76..d364638 100644 --- a/examples/client/copy.cpp +++ b/examples/client/copy.cpp @@ -22,6 +22,7 @@ #include +#include #include std::string resources_to_string(std::vector & resources) diff --git a/examples/client/download.cpp b/examples/client/download.cpp index 7626388..ac9c3d5 100644 --- a/examples/client/download.cpp +++ b/examples/client/download.cpp @@ -22,6 +22,7 @@ #include +#include #include //! [download_to_file] diff --git a/examples/client/info.cpp b/examples/client/info.cpp index d3e5ee8..03f0b99 100644 --- a/examples/client/info.cpp +++ b/examples/client/info.cpp @@ -22,6 +22,7 @@ #include +#include #include std::string info_to_string(std::map & info) { diff --git a/examples/client/init.cpp b/examples/client/init.cpp index cd51ce3..93f913b 100644 --- a/examples/client/init.cpp +++ b/examples/client/init.cpp @@ -22,6 +22,7 @@ #include +#include #include std::map base_options = diff --git a/examples/client/list.cpp b/examples/client/list.cpp index cab5061..fa2605c 100644 --- a/examples/client/list.cpp +++ b/examples/client/list.cpp @@ -22,6 +22,7 @@ #include +#include #include std::string resources_to_string(std::vector & resources) diff --git a/examples/client/mkdir.cpp b/examples/client/mkdir.cpp index 9175249..1f32290 100644 --- a/examples/client/mkdir.cpp +++ b/examples/client/mkdir.cpp @@ -22,6 +22,8 @@ #include +#include + int main() { std::map options = diff --git a/examples/client/move.cpp b/examples/client/move.cpp index 8a75d14..5007366 100644 --- a/examples/client/move.cpp +++ b/examples/client/move.cpp @@ -22,6 +22,7 @@ #include +#include #include std::string resources_to_string(const std::vector & resources) { diff --git a/examples/client/remove.cpp b/examples/client/remove.cpp index 8cc23dd..66057e1 100644 --- a/examples/client/remove.cpp +++ b/examples/client/remove.cpp @@ -22,6 +22,8 @@ #include +#include + int main() { std::map options = diff --git a/examples/client/size.cpp b/examples/client/size.cpp index 963cca6..3e704b6 100644 --- a/examples/client/size.cpp +++ b/examples/client/size.cpp @@ -22,6 +22,8 @@ #include +#include + int main() { std::map options = diff --git a/examples/client/upload.cpp b/examples/client/upload.cpp index e7a596f..d46be61 100644 --- a/examples/client/upload.cpp +++ b/examples/client/upload.cpp @@ -22,6 +22,7 @@ #include +#include #include //! [upload_from_file] From a8305b7843b8c8c4b9910e95039619d21fff61c1 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 3 Jan 2019 10:06:28 +0300 Subject: [PATCH 107/133] update huner with gate --- .gitignore | 1 + .gitmodules | 3 + CMakeLists.txt | 8 +- tools/build_package.deb.sh | 19 - tools/build_package.rpm.sh | 20 - tools/build_requirements.cygwin.sh | 20 - tools/build_requirements.unix.sh | 20 - tools/build_requirements.win.bat | 37 - tools/gate | 1 + tools/polly/.gitignore | 11 + tools/polly/.gitmodules | 3 + tools/polly/.travis.yml | 117 +++ tools/polly/CONTRIBUTING.md | 7 + tools/polly/LICENSE | 23 + tools/polly/README.md | 168 +++++ tools/polly/analyze-cxx17.cmake | 26 + tools/polly/analyze.cmake | 26 + ...meabi-v7a-neon-clang-35-hid-sections.cmake | 35 + ...api-16-armeabi-v7a-neon-clang-35-hid.cmake | 33 + ...10e-api-16-armeabi-v7a-neon-clang-35.cmake | 33 + ...oid-ndk-r10e-api-16-armeabi-v7a-neon.cmake | 32 + ...oid-ndk-r10e-api-16-x86-hid-sections.cmake | 36 + .../android-ndk-r10e-api-16-x86-hid.cmake | 32 + tools/polly/android-ndk-r10e-api-16-x86.cmake | 29 + ...ndk-r10e-api-19-armeabi-v7a-neon-c11.cmake | 35 + ...api-19-armeabi-v7a-neon-clang-libcxx.cmake | 35 + ...19-armeabi-v7a-neon-hid-sections-lto.cmake | 41 + ...api-19-armeabi-v7a-neon-hid-sections.cmake | 39 + ...oid-ndk-r10e-api-19-armeabi-v7a-neon.cmake | 33 + ...d-ndk-r10e-api-21-arm64-v8a-clang-35.cmake | 31 + ...api-21-arm64-v8a-gcc-49-hid-sections.cmake | 33 + ...ndk-r10e-api-21-arm64-v8a-gcc-49-hid.cmake | 31 + ...oid-ndk-r10e-api-21-arm64-v8a-gcc-49.cmake | 31 + .../android-ndk-r10e-api-21-arm64-v8a.cmake | 29 + ...ndk-r10e-api-21-armeabi-clang-libcxx.cmake | 34 + ...10e-api-21-armeabi-v7a-neon-clang-35.cmake | 33 + ...api-21-armeabi-v7a-neon-clang-libcxx.cmake | 35 + ...api-21-armeabi-v7a-neon-hid-sections.cmake | 39 + ...oid-ndk-r10e-api-21-armeabi-v7a-neon.cmake | 32 + .../android-ndk-r10e-api-21-armeabi-v7a.cmake | 31 + .../android-ndk-r10e-api-21-armeabi.cmake | 31 + ...id-ndk-r10e-api-21-mips-clang-libcxx.cmake | 32 + .../polly/android-ndk-r10e-api-21-mips.cmake | 30 + .../android-ndk-r10e-api-21-mips64.cmake | 30 + ...-ndk-r10e-api-21-x86-64-hid-sections.cmake | 36 + .../android-ndk-r10e-api-21-x86-64-hid.cmake | 32 + .../android-ndk-r10e-api-21-x86-64.cmake | 29 + ...oid-ndk-r10e-api-21-x86-clang-libcxx.cmake | 31 + tools/polly/android-ndk-r10e-api-21-x86.cmake | 29 + .../android-ndk-r10e-api-8-armeabi-v7a.cmake | 31 + ...ndroid-ndk-r11c-api-16-armeabi-cxx14.cmake | 30 + ...id-ndk-r11c-api-16-armeabi-v7a-cxx14.cmake | 31 + ...api-16-armeabi-v7a-neon-clang-35-hid.cmake | 32 + ...11c-api-16-armeabi-v7a-neon-clang-35.cmake | 32 + ...k-r11c-api-16-armeabi-v7a-neon-cxx14.cmake | 31 + ...oid-ndk-r11c-api-16-armeabi-v7a-neon.cmake | 31 + .../android-ndk-r11c-api-16-armeabi-v7a.cmake | 31 + .../android-ndk-r11c-api-16-armeabi.cmake | 30 + .../android-ndk-r11c-api-16-x86-hid.cmake | 32 + tools/polly/android-ndk-r11c-api-16-x86.cmake | 29 + ...oid-ndk-r11c-api-19-armeabi-v7a-neon.cmake | 31 + ...d-ndk-r11c-api-21-arm64-v8a-clang-35.cmake | 30 + ...ndk-r11c-api-21-arm64-v8a-gcc-49-hid.cmake | 30 + ...oid-ndk-r11c-api-21-arm64-v8a-gcc-49.cmake | 30 + .../android-ndk-r11c-api-21-arm64-v8a.cmake | 29 + ...11c-api-21-armeabi-v7a-neon-clang-35.cmake | 32 + ...oid-ndk-r11c-api-21-armeabi-v7a-neon.cmake | 31 + .../android-ndk-r11c-api-21-armeabi-v7a.cmake | 31 + .../android-ndk-r11c-api-21-armeabi.cmake | 30 + .../polly/android-ndk-r11c-api-21-mips.cmake | 29 + .../android-ndk-r11c-api-21-mips64.cmake | 29 + .../android-ndk-r11c-api-21-x86-64-hid.cmake | 32 + .../android-ndk-r11c-api-21-x86-64.cmake | 29 + tools/polly/android-ndk-r11c-api-21-x86.cmake | 29 + .../android-ndk-r11c-api-8-armeabi-v7a.cmake | 31 + ...oid-ndk-r12b-api-19-armeabi-v7a-neon.cmake | 33 + ...oid-ndk-r13b-api-19-armeabi-v7a-neon.cmake | 33 + ...eabi-v7a-neon-clang-hid-sections-lto.cmake | 36 + ...-ndk-r14-api-19-armeabi-v7a-neon-c11.cmake | 35 + ...api-19-armeabi-v7a-neon-clang-libcxx.cmake | 33 + ...dk-r14-api-19-armeabi-v7a-neon-clang.cmake | 32 + ...19-armeabi-v7a-neon-hid-sections-lto.cmake | 41 + ...-21-arm64-v8a-clang-hid-sections-lto.cmake | 34 + ...4-api-21-arm64-v8a-neon-clang-libcxx.cmake | 31 + .../polly/android-ndk-r14-api-21-x86-64.cmake | 30 + ...ndk-r14b-api-21-armeabi-clang-libcxx.cmake | 29 + ...api-21-armeabi-v7a-neon-clang-libcxx.cmake | 29 + ...id-ndk-r14b-api-21-mips-clang-libcxx.cmake | 28 + ...oid-ndk-r14b-api-21-x86-clang-libcxx.cmake | 28 + ...ndk-r15c-api-16-armeabi-clang-libcxx.cmake | 34 + ...r15c-api-16-armeabi-v7a-clang-libcxx.cmake | 33 + ...api-16-armeabi-v7a-neon-clang-libcxx.cmake | 33 + ...id-ndk-r15c-api-16-mips-clang-libcxx.cmake | 32 + ...oid-ndk-r15c-api-16-x86-clang-libcxx.cmake | 31 + ...k-r15c-api-21-arm64-v8a-clang-libcxx.cmake | 32 + ...c-api-21-arm64-v8a-neon-clang-libcxx.cmake | 32 + ...ndk-r15c-api-21-armeabi-clang-libcxx.cmake | 34 + ...r15c-api-21-armeabi-v7a-clang-libcxx.cmake | 33 + ...api-21-armeabi-v7a-neon-clang-libcxx.cmake | 33 + ...id-ndk-r15c-api-21-mips-clang-libcxx.cmake | 32 + ...-ndk-r15c-api-21-x86-64-clang-libcxx.cmake | 31 + ...oid-ndk-r15c-api-21-x86-clang-libcxx.cmake | 31 + ...api-24-armeabi-v7a-neon-clang-libcxx.cmake | 33 + ...6b-api-16-armeabi-v7a-clang-libcxx14.cmake | 35 + ...-16-armeabi-v7a-thumb-clang-libcxx14.cmake | 35 + ...d-ndk-r16b-api-16-x86-clang-libcxx14.cmake | 33 + ...abi-v7a-neon-libcxx-hid-sections-lto.cmake | 43 ++ ...b-api-21-arm64-v8a-neon-clang-libcxx.cmake | 32 + ...api-21-arm64-v8a-neon-clang-libcxx14.cmake | 32 + ...ndk-r16b-api-21-armeabi-clang-libcxx.cmake | 34 + ...k-r16b-api-21-armeabi-clang-libcxx14.cmake | 34 + ...r16b-api-21-armeabi-v7a-clang-libcxx.cmake | 34 + ...6b-api-21-armeabi-v7a-clang-libcxx14.cmake | 34 + ...api-21-armeabi-v7a-neon-clang-libcxx.cmake | 34 + ...i-21-armeabi-v7a-neon-clang-libcxx14.cmake | 34 + ...-ndk-r16b-api-21-x86-64-clang-libcxx.cmake | 33 + ...oid-ndk-r16b-api-21-x86-clang-libcxx.cmake | 32 + ...r16b-api-24-arm64-v8a-clang-libcxx14.cmake | 33 + ...api-24-armeabi-v7a-neon-clang-libcxx.cmake | 34 + ...i-24-armeabi-v7a-neon-clang-libcxx14.cmake | 34 + ...17-api-16-armeabi-v7a-clang-libcxx14.cmake | 35 + ...id-ndk-r17-api-16-x86-clang-libcxx14.cmake | 33 + ...api-19-armeabi-v7a-neon-clang-libcxx.cmake | 33 + ...api-19-armeabi-v7a-neon-hid-sections.cmake | 39 + ...api-21-arm64-v8a-neon-clang-libcxx14.cmake | 32 + ...ndk-r17-api-21-x86-64-clang-libcxx14.cmake | 33 + ...-r17-api-24-arm64-v8a-clang-libcxx14.cmake | 33 + ...-r18-api-24-arm64-v8a-clang-libcxx14.cmake | 33 + ...r18b-api-16-armeabi-v7a-clang-libcxx.cmake | 33 + ...r18b-api-24-arm64-v8a-clang-libcxx11.cmake | 33 + ...oid-vc-ndk-r10e-api-19-arm-clang-3-6.cmake | 31 + ...droid-vc-ndk-r10e-api-19-arm-gcc-4-9.cmake | 31 + ...oid-vc-ndk-r10e-api-19-x86-clang-3-6.cmake | 31 + ...oid-vc-ndk-r10e-api-21-arm-clang-3-6.cmake | 31 + tools/polly/appveyor.yml | 72 ++ .../polly/arm-openwrt-linux-muslgnueabi.cmake | 46 ++ tools/polly/bin/build.py | 9 + tools/polly/bin/detail/__init__.py | 0 tools/polly/bin/detail/call.py | 102 +++ tools/polly/bin/detail/cpack_generator.py | 54 ++ tools/polly/bin/detail/create_archive.py | 35 + tools/polly/bin/detail/create_framework.py | 148 ++++ tools/polly/bin/detail/generate_command.py | 37 + .../polly/bin/detail/get_nmake_environment.py | 35 + tools/polly/bin/detail/ios_dev_root.py | 10 + tools/polly/bin/detail/logging.py | 49 ++ tools/polly/bin/detail/open_project.py | 40 + tools/polly/bin/detail/osx_dev_root.py | 10 + tools/polly/bin/detail/pack_command.py | 25 + tools/polly/bin/detail/rmtree.py | 23 + tools/polly/bin/detail/target.py | 30 + tools/polly/bin/detail/test_command.py | 20 + tools/polly/bin/detail/timer.py | 61 ++ tools/polly/bin/detail/toolchain_name.py | 8 + tools/polly/bin/detail/toolchain_table.py | 705 ++++++++++++++++++ tools/polly/bin/detail/util.py | 40 + tools/polly/bin/detail/verify_mingw_path.py | 21 + tools/polly/bin/detail/verify_msys_path.py | 28 + tools/polly/bin/detail/win32.py | 20 + tools/polly/bin/install-ci-dependencies.py | 279 +++++++ tools/polly/bin/polly | 7 + tools/polly/bin/polly.bat | 1 + tools/polly/bin/polly.py | 547 ++++++++++++++ tools/polly/clang-5-cxx14.cmake | 21 + tools/polly/clang-5-cxx17.cmake | 21 + tools/polly/clang-5.cmake | 21 + tools/polly/clang-cxx14-pic.cmake | 22 + tools/polly/clang-cxx14.cmake | 21 + tools/polly/clang-cxx17.cmake | 21 + tools/polly/clang-fpic-hid-sections.cmake | 26 + tools/polly/clang-fpic-static-std.cmake | 25 + tools/polly/clang-fpic.cmake | 24 + tools/polly/clang-libcxx-fpic.cmake | 24 + tools/polly/clang-libcxx.cmake | 23 + tools/polly/clang-libcxx14-fpic.cmake | 24 + tools/polly/clang-libcxx14.cmake | 23 + tools/polly/clang-libcxx17-fpic.cmake | 24 + tools/polly/clang-libcxx17.cmake | 23 + tools/polly/clang-libstdcxx.cmake | 23 + tools/polly/clang-lto.cmake | 22 + tools/polly/clang-omp.cmake | 23 + tools/polly/clang-tidy-libcxx.cmake | 22 + tools/polly/clang-tidy.cmake | 21 + tools/polly/compiler/cl.cmake | 37 + tools/polly/compiler/clang-5.cmake | 47 ++ tools/polly/compiler/clang-omp.cmake | 58 ++ tools/polly/compiler/clang.cmake | 46 ++ tools/polly/compiler/egcc.cmake | 47 ++ tools/polly/compiler/emscripten.cmake | 21 + .../compiler/emscripten/glew/glewConfig.cmake | 11 + .../emscripten/glfw3/glfw3Config.cmake | 10 + tools/polly/compiler/gcc-5.cmake | 37 + tools/polly/compiler/gcc-6.cmake | 37 + tools/polly/compiler/gcc-7.cmake | 38 + tools/polly/compiler/gcc-8.cmake | 38 + .../gcc-cross-compile-raspberry-pi.cmake | 103 +++ .../gcc-cross-compile-simple-layout.cmake | 31 + tools/polly/compiler/gcc-cross-compile.cmake | 87 +++ tools/polly/compiler/gcc.cmake | 37 + tools/polly/compiler/gcc48.cmake | 11 + tools/polly/compiler/xcode.cmake | 33 + tools/polly/custom-libcxx.cmake | 34 + tools/polly/cxx11.cmake | 16 + tools/polly/cxx17.cmake | 18 + tools/polly/cygwin.cmake | 22 + tools/polly/default.cmake | 14 + tools/polly/docs/Makefile | 216 ++++++ tools/polly/docs/conf.py | 317 ++++++++ tools/polly/docs/index.rst | 17 + tools/polly/docs/jenkins.sh | 34 + tools/polly/docs/make.sh | 12 + tools/polly/docs/requirements.txt | 3 + tools/polly/docs/screens/ios-team-id.png | Bin 0 -> 55767 bytes tools/polly/docs/spelling.txt | 54 ++ tools/polly/docs/toolchains.rst | 15 + tools/polly/docs/toolchains/android.rst | 57 ++ .../toolchains/android/developer-notes.rst | 48 ++ tools/polly/docs/toolchains/android/old.rst | 59 ++ tools/polly/docs/toolchains/clang-omp.rst | 32 + tools/polly/docs/toolchains/gcc-musl.rst | 60 ++ tools/polly/docs/toolchains/ios.rst | 155 ++++ tools/polly/docs/toolchains/ios/bundle-id.rst | 60 ++ .../errors/polly_ios_bundle_identifier.rst | 24 + .../ios/errors/polly_ios_development_team.rst | 29 + .../signing-request-development-team.rst | 21 + .../toolchains/ios/screens/01_new_project.png | Bin 0 -> 65127 bytes .../ios/screens/02_single_view_app.png | Bin 0 -> 52903 bytes .../ios/screens/03_project_options.png | Bin 0 -> 45606 bytes .../ios/screens/04_bundle_identifier.png | Bin 0 -> 45957 bytes .../toolchains/ios/screens/05_run_app.png | Bin 0 -> 43734 bytes .../toolchains/ios/screens/bad_bundle_id.png | Bin 0 -> 61574 bytes .../polly/docs/toolchains/linux-mingw-w64.rst | 27 + tools/polly/docs/toolchains/raspberry-pi.rst | 111 +++ tools/polly/emscripten-cxx11.cmake | 21 + tools/polly/emscripten-cxx14.cmake | 21 + tools/polly/emscripten-cxx17.cmake | 21 + .../examples/01-executable/CMakeLists.txt | 18 + tools/polly/examples/01-executable/main.cpp | 47 ++ .../polly/examples/02-library/CMakeLists.txt | 20 + tools/polly/examples/02-library/foo.cpp | 6 + tools/polly/examples/02-library/main.cpp | 8 + .../examples/03-shared-link/CMakeLists.txt | 31 + tools/polly/examples/03-shared-link/boo.cpp | 10 + tools/polly/examples/03-shared-link/foo.cpp | 8 + tools/polly/examples/03-shared-link/main.cpp | 8 + tools/polly/find/FindLibcxx.cmake | 101 +++ tools/polly/flags/32bit.cmake | 13 + tools/polly/flags/bitcode.cmake | 22 + tools/polly/flags/c11.cmake | 18 + tools/polly/flags/clang-tidy.cmake | 12 + tools/polly/flags/cxx11.cmake | 26 + tools/polly/flags/cxx14.cmake | 26 + tools/polly/flags/cxx17-gnu.cmake | 29 + tools/polly/flags/cxx17.cmake | 29 + tools/polly/flags/cxx98.cmake | 19 + tools/polly/flags/data-sections.cmake | 26 + tools/polly/flags/fpic.cmake | 32 + tools/polly/flags/function-sections.cmake | 26 + tools/polly/flags/gnuxx11.cmake | 18 + tools/polly/flags/gold.cmake | 13 + tools/polly/flags/hardfloat.cmake | 13 + tools/polly/flags/hidden.cmake | 27 + tools/polly/flags/ios_nocodesign.cmake | 52 ++ tools/polly/flags/lto.cmake | 17 + tools/polly/flags/mtune_cortex-a15.cmake | 16 + tools/polly/flags/neon-vfpv4.cmake | 13 + tools/polly/flags/neon.cmake | 13 + tools/polly/flags/openwrt.cmake | 29 + tools/polly/flags/sanitize_address.cmake | 81 ++ tools/polly/flags/sanitize_leak.cmake | 18 + tools/polly/flags/sanitize_memory.cmake | 18 + tools/polly/flags/sanitize_thread.cmake | 25 + tools/polly/flags/static-std.cmake | 19 + tools/polly/flags/static.cmake | 17 + tools/polly/flags/vs-cxx14.cmake | 19 + tools/polly/flags/vs-cxx17.cmake | 19 + tools/polly/flags/vs-mt.cmake | 15 + tools/polly/flags/vs-z7.cmake | 17 + tools/polly/flags/vs-zw.cmake | 14 + tools/polly/gcc-32bit-pic.cmake | 24 + tools/polly/gcc-32bit.cmake | 23 + tools/polly/gcc-4-8-c11.cmake | 21 + tools/polly/gcc-4-8-pic-hid-sections.cmake | 24 + tools/polly/gcc-4-8-pic.cmake | 21 + tools/polly/gcc-4-8.cmake | 20 + tools/polly/gcc-5-cxx14-c11.cmake | 24 + tools/polly/gcc-5-pic-hid-sections-lto.cmake | 25 + tools/polly/gcc-5-pic-hid-sections.cmake | 25 + tools/polly/gcc-5.cmake | 20 + tools/polly/gcc-6-32bit-cxx14.cmake | 21 + tools/polly/gcc-7-cxx14-pic.cmake | 22 + tools/polly/gcc-7-cxx14.cmake | 21 + tools/polly/gcc-7-cxx17-gnu.cmake | 21 + tools/polly/gcc-7-cxx17-pic.cmake | 22 + tools/polly/gcc-7-cxx17.cmake | 21 + tools/polly/gcc-7-pic-hid-sections-lto.cmake | 25 + tools/polly/gcc-7.cmake | 21 + tools/polly/gcc-8-cxx14-fpic.cmake | 21 + tools/polly/gcc-8-cxx14.cmake | 20 + tools/polly/gcc-8-cxx17-fpic.cmake | 21 + tools/polly/gcc-8-cxx17.cmake | 20 + tools/polly/gcc-c11.cmake | 23 + tools/polly/gcc-cxx14-c11.cmake | 24 + tools/polly/gcc-cxx17-c11.cmake | 24 + tools/polly/gcc-cxx98.cmake | 20 + tools/polly/gcc-gold.cmake | 21 + tools/polly/gcc-hid-fpic.cmake | 24 + tools/polly/gcc-hid.cmake | 21 + tools/polly/gcc-lto.cmake | 23 + tools/polly/gcc-musl.cmake | 33 + tools/polly/gcc-ninja.cmake | 22 + tools/polly/gcc-pic-hid-sections-lto.cmake | 25 + tools/polly/gcc-pic-hid-sections.cmake | 24 + tools/polly/gcc-pic.cmake | 21 + tools/polly/gcc-static-std.cmake | 23 + tools/polly/gcc-static.cmake | 23 + tools/polly/gcc.cmake | 22 + .../ios-10-0-arm64-dep-8-0-hid-sections.cmake | 45 ++ tools/polly/ios-10-0-arm64.cmake | 40 + tools/polly/ios-10-0-armv7.cmake | 40 + .../polly/ios-10-0-dep-8-0-hid-sections.cmake | 45 ++ tools/polly/ios-10-0-wo-armv7s.cmake | 40 + tools/polly/ios-10-0.cmake | 39 + .../ios-10-1-arm64-dep-8-0-hid-sections.cmake | 45 ++ tools/polly/ios-10-1-arm64.cmake | 40 + tools/polly/ios-10-1-armv7.cmake | 40 + .../polly/ios-10-1-dep-8-0-hid-sections.cmake | 45 ++ ...10-1-dep-8-0-libcxx-hid-sections-lto.cmake | 47 ++ ...ios-10-1-dep-8-0-libcxx-hid-sections.cmake | 46 ++ tools/polly/ios-10-1-wo-armv7s.cmake | 40 + tools/polly/ios-10-1.cmake | 39 + tools/polly/ios-10-2-dep-9-3-arm64.cmake | 42 ++ tools/polly/ios-10-2-dep-9-3-armv7.cmake | 42 ++ tools/polly/ios-10-2.cmake | 39 + tools/polly/ios-10-3-arm64.cmake | 41 + tools/polly/ios-10-3-armv7.cmake | 41 + tools/polly/ios-10-3-dep-8-0-bitcode.cmake | 44 ++ tools/polly/ios-10-3-dep-9-0-bitcode.cmake | 44 ++ tools/polly/ios-10-3-dep-9-3-i386-armv7.cmake | 43 ++ .../polly/ios-10-3-dep-9-3-x86-64-arm64.cmake | 43 ++ tools/polly/ios-10-3-lto.cmake | 41 + tools/polly/ios-10-3.cmake | 40 + .../ios-11-0-dep-9-0-bitcode-cxx11.cmake | 44 ++ ...os-11-0-dep-9-0-device-bitcode-cxx11.cmake | 44 ++ tools/polly/ios-11-0.cmake | 40 + .../ios-11-1-dep-9-0-bitcode-cxx11.cmake | 44 ++ ...os-11-1-dep-9-0-device-bitcode-cxx11.cmake | 44 ++ ...os-11-2-dep-9-0-device-bitcode-cxx11.cmake | 44 ++ ...os-11-2-dep-9-0-device-bitcode-nocxx.cmake | 43 ++ .../polly/ios-11-2-dep-9-3-arm64-armv7.cmake | 42 ++ tools/polly/ios-11-3-dep-9-0-arm64.cmake | 43 ++ ...os-11-3-dep-9-0-device-bitcode-cxx11.cmake | 44 ++ ...os-11-3-dep-9-0-device-bitcode-cxx17.cmake | 44 ++ ...os-11-3-dep-9-0-device-bitcode-nocxx.cmake | 43 ++ .../ios-11-3-dep-9-0-device-bitcode.cmake | 44 ++ .../polly/ios-11-3-dep-9-3-arm64-armv7.cmake | 42 ++ ...0-arm64-armv7-hid-sections-lto-cxx11.cmake | 45 ++ ...dep-8-0-arm64-hid-sections-lto-cxx11.cmake | 45 ++ ...os-11-4-dep-9-0-device-bitcode-cxx11.cmake | 44 ++ ...os-11-4-dep-9-0-device-bitcode-nocxx.cmake | 43 ++ .../polly/ios-11-4-dep-9-3-arm64-armv7.cmake | 42 ++ ...dep-9-3-arm64-hid-sections-lto-cxx11.cmake | 45 ++ tools/polly/ios-11-4-dep-9-3-arm64.cmake | 42 ++ tools/polly/ios-11-4-dep-9-3-armv7.cmake | 42 ++ tools/polly/ios-11-4-dep-9-3.cmake | 42 ++ tools/polly/ios-11-4-dep-9-4-arm64.cmake | 42 ++ tools/polly/ios-12-0-dep-11-0-arm64.cmake | 42 ++ ...os-12-0-dep-9-0-device-bitcode-cxx11.cmake | 44 ++ tools/polly/ios-12-1-dep-11-0-arm64.cmake | 42 ++ tools/polly/ios-12-1-dep-9-3-arm64.cmake | 42 ++ tools/polly/ios-7-0.cmake | 37 + tools/polly/ios-7-1.cmake | 37 + tools/polly/ios-8-0.cmake | 37 + tools/polly/ios-8-1.cmake | 37 + tools/polly/ios-8-2-arm64-hid.cmake | 39 + tools/polly/ios-8-2-arm64.cmake | 38 + tools/polly/ios-8-2-cxx98.cmake | 37 + tools/polly/ios-8-2-i386-arm64.cmake | 38 + tools/polly/ios-8-2.cmake | 37 + tools/polly/ios-8-4-arm64.cmake | 38 + tools/polly/ios-8-4-armv7.cmake | 38 + tools/polly/ios-8-4-armv7s.cmake | 38 + tools/polly/ios-8-4-hid.cmake | 40 + tools/polly/ios-8-4.cmake | 37 + tools/polly/ios-9-0-armv7.cmake | 38 + tools/polly/ios-9-0-dep-7-0-armv7.cmake | 40 + tools/polly/ios-9-0-i386-armv7.cmake | 38 + tools/polly/ios-9-0-wo-armv7s.cmake | 38 + tools/polly/ios-9-0.cmake | 37 + tools/polly/ios-9-1-arm64.cmake | 38 + tools/polly/ios-9-1-armv7.cmake | 38 + tools/polly/ios-9-1-dep-7-0-armv7.cmake | 40 + tools/polly/ios-9-1-dep-8-0-hid.cmake | 42 ++ tools/polly/ios-9-1-hid.cmake | 40 + tools/polly/ios-9-1.cmake | 37 + tools/polly/ios-9-2-arm64.cmake | 38 + tools/polly/ios-9-2-armv7.cmake | 38 + tools/polly/ios-9-2-hid-sections.cmake | 42 ++ tools/polly/ios-9-2-hid.cmake | 40 + tools/polly/ios-9-2.cmake | 37 + tools/polly/ios-9-3-arm64.cmake | 38 + tools/polly/ios-9-3-armv7.cmake | 38 + tools/polly/ios-9-3-wo-armv7s.cmake | 38 + tools/polly/ios-9-3.cmake | 37 + ...0-arm64-armv7-hid-sections-lto-cxx11.cmake | 45 ++ tools/polly/ios-nocodesign-10-0-arm64.cmake | 67 ++ tools/polly/ios-nocodesign-10-0-armv7.cmake | 67 ++ .../polly/ios-nocodesign-10-0-wo-armv7s.cmake | 67 ++ tools/polly/ios-nocodesign-10-0.cmake | 67 ++ ...p-9-0-device-libcxx-hid-sections-lto.cmake | 76 ++ ...4-dep-9-0-device-libcxx-hid-sections.cmake | 75 ++ tools/polly/ios-nocodesign-10-1-arm64.cmake | 67 ++ tools/polly/ios-nocodesign-10-1-armv7.cmake | 67 ++ ...p-8-0-device-libcxx-hid-sections-lto.cmake | 76 ++ ...10-1-dep-8-0-libcxx-hid-sections-lto.cmake | 76 ++ ...p-9-0-device-libcxx-hid-sections-lto.cmake | 76 ++ .../polly/ios-nocodesign-10-1-wo-armv7s.cmake | 67 ++ tools/polly/ios-nocodesign-10-1.cmake | 67 ++ tools/polly/ios-nocodesign-10-2.cmake | 67 ++ ...4-dep-9-0-device-libcxx-hid-sections.cmake | 75 ++ tools/polly/ios-nocodesign-10-3-arm64.cmake | 67 ++ tools/polly/ios-nocodesign-10-3-armv7.cmake | 67 ++ tools/polly/ios-nocodesign-10-3-cxx14.cmake | 67 ++ .../ios-nocodesign-10-3-dep-9-0-bitcode.cmake | 44 ++ .../polly/ios-nocodesign-10-3-wo-armv7s.cmake | 67 ++ tools/polly/ios-nocodesign-10-3.cmake | 67 ++ ...4-dep-9-0-device-libcxx-hid-sections.cmake | 75 ++ ...ocodesign-11-0-dep-9-0-bitcode-cxx11.cmake | 44 ++ tools/polly/ios-nocodesign-11-0.cmake | 67 ++ ...ocodesign-11-1-dep-9-0-bitcode-cxx11.cmake | 44 ++ ...11-1-dep-9-0-wo-armv7s-bitcode-cxx11.cmake | 45 ++ tools/polly/ios-nocodesign-11-1.cmake | 67 ++ ...11-2-dep-8-0-wo-armv7s-bitcode-cxx11.cmake | 45 ++ ...ocodesign-11-2-dep-9-0-bitcode-cxx11.cmake | 44 ++ ...-nocodesign-11-2-dep-9-3-arm64-armv7.cmake | 42 ++ .../ios-nocodesign-11-2-dep-9-3-arm64.cmake | 42 ++ .../ios-nocodesign-11-2-dep-9-3-armv7.cmake | 42 ++ ...s-nocodesign-11-2-dep-9-3-i386-armv7.cmake | 43 ++ tools/polly/ios-nocodesign-11-2-dep-9-3.cmake | 42 ++ tools/polly/ios-nocodesign-11-2.cmake | 67 ++ ...ocodesign-11-3-dep-9-0-bitcode-cxx11.cmake | 44 ++ .../ios-nocodesign-11-3-dep-9-3-arm64.cmake | 42 ++ .../ios-nocodesign-11-3-dep-9-3-armv7.cmake | 42 ++ tools/polly/ios-nocodesign-11-3-dep-9-3.cmake | 42 ++ ...ocodesign-11-4-dep-9-0-bitcode-cxx11.cmake | 44 ++ .../ios-nocodesign-11-4-dep-9-3-arm64.cmake | 42 ++ .../ios-nocodesign-11-4-dep-9-3-armv7.cmake | 42 ++ tools/polly/ios-nocodesign-11-4-dep-9-3.cmake | 42 ++ ...ocodesign-12-0-dep-9-0-bitcode-cxx11.cmake | 44 ++ .../ios-nocodesign-12-1-dep-9-3-armv7.cmake | 42 ++ tools/polly/ios-nocodesign-8-1.cmake | 67 ++ tools/polly/ios-nocodesign-8-4.cmake | 67 ++ tools/polly/ios-nocodesign-9-1-arm64.cmake | 67 ++ tools/polly/ios-nocodesign-9-1-armv7.cmake | 67 ++ tools/polly/ios-nocodesign-9-1.cmake | 67 ++ tools/polly/ios-nocodesign-9-2-arm64.cmake | 67 ++ tools/polly/ios-nocodesign-9-2-armv7.cmake | 67 ++ tools/polly/ios-nocodesign-9-2.cmake | 67 ++ tools/polly/ios-nocodesign-9-3-arm64.cmake | 67 ++ tools/polly/ios-nocodesign-9-3-armv7.cmake | 67 ++ ...s-nocodesign-9-3-device-hid-sections.cmake | 71 ++ tools/polly/ios-nocodesign-9-3-device.cmake | 67 ++ .../polly/ios-nocodesign-9-3-wo-armv7s.cmake | 67 ++ tools/polly/ios-nocodesign-9-3.cmake | 67 ++ tools/polly/ios-nocodesign-arm64.cmake | 67 ++ tools/polly/ios-nocodesign-armv7.cmake | 67 ++ .../polly/ios-nocodesign-dep-9-0-cxx14.cmake | 68 ++ tools/polly/ios-nocodesign-hid-sections.cmake | 71 ++ tools/polly/ios-nocodesign-wo-armv7s.cmake | 67 ++ tools/polly/ios-nocodesign.cmake | 73 ++ tools/polly/ios.cmake | 48 ++ tools/polly/libcxx-fpic-hid-sections.cmake | 27 + tools/polly/libcxx-hid-fpic.cmake | 23 + tools/polly/libcxx-hid-sections.cmake | 26 + tools/polly/libcxx-hid.cmake | 22 + tools/polly/libcxx-no-sdk.cmake | 21 + tools/polly/libcxx.cmake | 23 + tools/polly/libcxx14.cmake | 24 + tools/polly/library/std/libcxx.cmake | 19 + tools/polly/library/std/libstdcxx.cmake | 14 + tools/polly/library/std/nolibs.cmake | 13 + tools/polly/linux-gcc-armhf-neon-vfpv4.cmake | 34 + tools/polly/linux-gcc-armhf-neon.cmake | 34 + tools/polly/linux-gcc-armhf.cmake | 33 + tools/polly/linux-gcc-jetson-tk1.cmake | 35 + tools/polly/linux-gcc-x64.cmake | 25 + tools/polly/linux-mingw-w32.cmake | 29 + tools/polly/linux-mingw-w64-cxx98.cmake | 28 + tools/polly/linux-mingw-w64-gnuxx11.cmake | 28 + tools/polly/linux-mingw-w64.cmake | 29 + tools/polly/mingw-c11.cmake | 21 + tools/polly/mingw-cxx14.cmake | 20 + tools/polly/mingw-cxx17.cmake | 20 + tools/polly/mingw.cmake | 20 + tools/polly/msys-cxx14.cmake | 20 + tools/polly/msys-cxx17.cmake | 20 + tools/polly/msys.cmake | 20 + tools/polly/ninja-vs-12-2013-win64.cmake | 19 + tools/polly/ninja-vs-14-2015-win64.cmake | 19 + .../polly/ninja-vs-15-2017-win64-cxx17.cmake | 20 + tools/polly/ninja-vs-15-2017-win64.cmake | 19 + tools/polly/nmake-vs-12-2013-win64.cmake | 17 + tools/polly/nmake-vs-12-2013.cmake | 17 + .../polly/nmake-vs-15-2017-win64-cxx17.cmake | 18 + tools/polly/nmake-vs-15-2017-win64.cmake | 17 + .../polly/openbsd-egcc-cxx11-static-std.cmake | 24 + tools/polly/os/android.cmake | 64 ++ tools/polly/os/cygwin.cmake | 12 + tools/polly/os/iphone-default-sdk.cmake | 73 ++ tools/polly/os/iphone.cmake | 165 ++++ tools/polly/os/osx.cmake | 103 +++ tools/polly/os/raspberry-pi-hardfloat.cmake | 18 + tools/polly/os/raspberry-pi1.cmake | 20 + tools/polly/os/raspberry-pi2.cmake | 19 + tools/polly/os/raspberry-pi3.cmake | 19 + tools/polly/os/vc-mdd-android.cmake | 215 ++++++ tools/polly/osx-10-10-dep-10-7.cmake | 29 + tools/polly/osx-10-10-dep-10-9-make.cmake | 27 + tools/polly/osx-10-10.cmake | 29 + tools/polly/osx-10-11-hid-sections-lto.cmake | 34 + tools/polly/osx-10-11-hid-sections.cmake | 33 + tools/polly/osx-10-11-lto.cmake | 30 + tools/polly/osx-10-11-make.cmake | 27 + tools/polly/osx-10-11-sanitize-address.cmake | 30 + tools/polly/osx-10-11.cmake | 29 + tools/polly/osx-10-12-cxx14.cmake | 29 + tools/polly/osx-10-12-cxx17.cmake | 29 + tools/polly/osx-10-12-cxx98.cmake | 29 + tools/polly/osx-10-12-dep-10-10-lto.cmake | 30 + tools/polly/osx-10-12-dep-10-10.cmake | 29 + tools/polly/osx-10-12-hid-sections.cmake | 33 + tools/polly/osx-10-12-lto.cmake | 30 + tools/polly/osx-10-12-make.cmake | 27 + tools/polly/osx-10-12-ninja.cmake | 27 + ...-10-12-sanitize-address-hid-sections.cmake | 34 + tools/polly/osx-10-12-sanitize-address.cmake | 31 + tools/polly/osx-10-12.cmake | 29 + tools/polly/osx-10-13-cxx14.cmake | 29 + tools/polly/osx-10-13-cxx17.cmake | 29 + tools/polly/osx-10-13-dep-10-10-cxx14.cmake | 29 + tools/polly/osx-10-13-dep-10-10-cxx17.cmake | 29 + tools/polly/osx-10-13-dep-10-10.cmake | 29 + tools/polly/osx-10-13-i386-cxx14.cmake | 32 + tools/polly/osx-10-13-make-cxx14.cmake | 27 + tools/polly/osx-10-13.cmake | 29 + tools/polly/osx-10-14-cxx14.cmake | 29 + tools/polly/osx-10-14-cxx17.cmake | 29 + tools/polly/osx-10-14-dep-10-10-cxx14.cmake | 29 + tools/polly/osx-10-14-dep-10-10-cxx17.cmake | 29 + tools/polly/osx-10-14-dep-10-10.cmake | 29 + tools/polly/osx-10-14.cmake | 29 + tools/polly/osx-10-7.cmake | 29 + tools/polly/osx-10-8.cmake | 29 + tools/polly/osx-10-9.cmake | 29 + .../raspberrypi1-cxx11-pic-static-std.cmake | 27 + tools/polly/raspberrypi1-cxx11-pic.cmake | 26 + tools/polly/raspberrypi2-cxx11-pic.cmake | 26 + tools/polly/raspberrypi2-cxx11.cmake | 25 + tools/polly/raspberrypi3-cxx11.cmake | 24 + .../raspberrypi3-gcc-pic-hid-sections.cmake | 29 + tools/polly/sanitize-address-cxx17-pic.cmake | 22 + tools/polly/sanitize-address-cxx17.cmake | 22 + tools/polly/sanitize-address.cmake | 22 + tools/polly/sanitize-leak-cxx17-pic.cmake | 22 + tools/polly/sanitize-leak-cxx17.cmake | 22 + tools/polly/sanitize-leak.cmake | 22 + tools/polly/sanitize-memory.cmake | 21 + tools/polly/sanitize-thread-cxx17-pic.cmake | 22 + tools/polly/sanitize-thread-cxx17.cmake | 21 + tools/polly/sanitize-thread.cmake | 21 + tools/polly/scripts/Info.plist | 24 + tools/polly/scripts/NoCodeSign.xcconfig | 4 + tools/polly/scripts/clang-analyze.sh | 38 + tools/polly/scripts/clangxx-analyze.sh | 38 + .../utilities/polly_add_cache_flag.cmake | 31 + .../polly_clear_environment_variables.cmake | 290 +++++++ tools/polly/utilities/polly_common.cmake | 49 ++ tools/polly/utilities/polly_fatal_error.cmake | 11 + tools/polly/utilities/polly_init.cmake | 26 + .../polly_ios_bundle_identifier.cmake | 21 + .../polly_ios_development_team.cmake | 28 + tools/polly/utilities/polly_module_path.cmake | 3 + .../polly/utilities/polly_status_debug.cmake | 10 + .../polly/utilities/polly_status_print.cmake | 10 + tools/polly/vs-10-2010.cmake | 17 + tools/polly/vs-11-2012-arm.cmake | 17 + tools/polly/vs-11-2012-win64.cmake | 17 + tools/polly/vs-11-2012.cmake | 17 + tools/polly/vs-12-2013-arm.cmake | 17 + tools/polly/vs-12-2013-mt.cmake | 19 + tools/polly/vs-12-2013-win64.cmake | 17 + tools/polly/vs-12-2013-xp.cmake | 17 + tools/polly/vs-12-2013.cmake | 17 + tools/polly/vs-14-2015-arm.cmake | 17 + tools/polly/vs-14-2015-sdk-8-1.cmake | 19 + tools/polly/vs-14-2015-win64-sdk-8-1.cmake | 19 + tools/polly/vs-14-2015-win64.cmake | 17 + tools/polly/vs-14-2015.cmake | 17 + tools/polly/vs-15-2017-cxx17.cmake | 18 + tools/polly/vs-15-2017-store-10-zw.cmake | 21 + tools/polly/vs-15-2017-win64-cxx14.cmake | 18 + tools/polly/vs-15-2017-win64-cxx17.cmake | 18 + .../polly/vs-15-2017-win64-llvm-vs2014.cmake | 17 + tools/polly/vs-15-2017-win64-llvm.cmake | 17 + .../vs-15-2017-win64-store-10-cxx17.cmake | 21 + .../polly/vs-15-2017-win64-store-10-zw.cmake | 21 + tools/polly/vs-15-2017-win64-z7.cmake | 18 + tools/polly/vs-15-2017-win64.cmake | 17 + tools/polly/vs-15-2017.cmake | 17 + tools/polly/vs-8-2005.cmake | 17 + tools/polly/vs-9-2008.cmake | 17 + tools/polly/xcode-cxx98.cmake | 23 + tools/polly/xcode-gcc.cmake | 23 + tools/polly/xcode-hid-sections.cmake | 27 + tools/polly/xcode-nocxx.cmake | 22 + tools/polly/xcode-sections.cmake | 26 + tools/polly/xcode.cmake | 23 + 617 files changed, 22993 insertions(+), 120 deletions(-) delete mode 100755 tools/build_package.deb.sh delete mode 100755 tools/build_package.rpm.sh delete mode 100644 tools/build_requirements.cygwin.sh delete mode 100755 tools/build_requirements.unix.sh delete mode 100755 tools/build_requirements.win.bat create mode 160000 tools/gate create mode 100644 tools/polly/.gitignore create mode 100644 tools/polly/.gitmodules create mode 100644 tools/polly/.travis.yml create mode 100644 tools/polly/CONTRIBUTING.md create mode 100644 tools/polly/LICENSE create mode 100644 tools/polly/README.md create mode 100644 tools/polly/analyze-cxx17.cmake create mode 100644 tools/polly/analyze.cmake create mode 100644 tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid-sections.cmake create mode 100644 tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid.cmake create mode 100644 tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35.cmake create mode 100644 tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon.cmake create mode 100644 tools/polly/android-ndk-r10e-api-16-x86-hid-sections.cmake create mode 100644 tools/polly/android-ndk-r10e-api-16-x86-hid.cmake create mode 100644 tools/polly/android-ndk-r10e-api-16-x86.cmake create mode 100644 tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-c11.cmake create mode 100644 tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections-lto.cmake create mode 100644 tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections.cmake create mode 100644 tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-arm64-v8a-clang-35.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid-sections.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-arm64-v8a.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-armeabi-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-clang-35.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-hid-sections.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-armeabi-v7a.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-armeabi.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-mips-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-mips.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-mips64.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-x86-64-hid-sections.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-x86-64-hid.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-x86-64.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-x86-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r10e-api-21-x86.cmake create mode 100644 tools/polly/android-ndk-r10e-api-8-armeabi-v7a.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-armeabi-cxx14.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-armeabi-v7a-cxx14.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35-hid.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-cxx14.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-armeabi-v7a.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-armeabi.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-x86-hid.cmake create mode 100644 tools/polly/android-ndk-r11c-api-16-x86.cmake create mode 100644 tools/polly/android-ndk-r11c-api-19-armeabi-v7a-neon.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-arm64-v8a-clang-35.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-arm64-v8a-gcc-49-hid.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-arm64-v8a-gcc-49.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-arm64-v8a.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-armeabi-v7a-neon-clang-35.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-armeabi-v7a-neon.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-armeabi-v7a.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-armeabi.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-mips.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-mips64.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-x86-64-hid.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-x86-64.cmake create mode 100644 tools/polly/android-ndk-r11c-api-21-x86.cmake create mode 100644 tools/polly/android-ndk-r11c-api-8-armeabi-v7a.cmake create mode 100644 tools/polly/android-ndk-r12b-api-19-armeabi-v7a-neon.cmake create mode 100644 tools/polly/android-ndk-r13b-api-19-armeabi-v7a-neon.cmake create mode 100644 tools/polly/android-ndk-r14-api-16-armeabi-v7a-neon-clang-hid-sections-lto.cmake create mode 100644 tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-c11.cmake create mode 100644 tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-clang.cmake create mode 100644 tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-hid-sections-lto.cmake create mode 100644 tools/polly/android-ndk-r14-api-21-arm64-v8a-clang-hid-sections-lto.cmake create mode 100644 tools/polly/android-ndk-r14-api-21-arm64-v8a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r14-api-21-x86-64.cmake create mode 100644 tools/polly/android-ndk-r14b-api-21-armeabi-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r14b-api-21-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r14b-api-21-mips-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r14b-api-21-x86-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-16-armeabi-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-16-armeabi-v7a-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-16-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-16-mips-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-16-x86-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-21-arm64-v8a-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-21-arm64-v8a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-21-armeabi-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-21-armeabi-v7a-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-21-mips-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-21-x86-64-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-21-x86-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r15c-api-24-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r16b-api-16-armeabi-v7a-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r16b-api-16-armeabi-v7a-thumb-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r16b-api-16-x86-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r16b-api-19-gcc-49-armeabi-v7a-neon-libcxx-hid-sections-lto.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-armeabi-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-armeabi-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-x86-64-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r16b-api-21-x86-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r16b-api-24-arm64-v8a-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r17-api-16-armeabi-v7a-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r17-api-16-x86-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r17-api-19-armeabi-v7a-neon-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r17-api-19-armeabi-v7a-neon-hid-sections.cmake create mode 100644 tools/polly/android-ndk-r17-api-21-arm64-v8a-neon-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r17-api-21-x86-64-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r17-api-24-arm64-v8a-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r18-api-24-arm64-v8a-clang-libcxx14.cmake create mode 100644 tools/polly/android-ndk-r18b-api-16-armeabi-v7a-clang-libcxx.cmake create mode 100644 tools/polly/android-ndk-r18b-api-24-arm64-v8a-clang-libcxx11.cmake create mode 100644 tools/polly/android-vc-ndk-r10e-api-19-arm-clang-3-6.cmake create mode 100644 tools/polly/android-vc-ndk-r10e-api-19-arm-gcc-4-9.cmake create mode 100644 tools/polly/android-vc-ndk-r10e-api-19-x86-clang-3-6.cmake create mode 100644 tools/polly/android-vc-ndk-r10e-api-21-arm-clang-3-6.cmake create mode 100644 tools/polly/appveyor.yml create mode 100644 tools/polly/arm-openwrt-linux-muslgnueabi.cmake create mode 100755 tools/polly/bin/build.py create mode 100644 tools/polly/bin/detail/__init__.py create mode 100644 tools/polly/bin/detail/call.py create mode 100644 tools/polly/bin/detail/cpack_generator.py create mode 100644 tools/polly/bin/detail/create_archive.py create mode 100644 tools/polly/bin/detail/create_framework.py create mode 100644 tools/polly/bin/detail/generate_command.py create mode 100755 tools/polly/bin/detail/get_nmake_environment.py create mode 100644 tools/polly/bin/detail/ios_dev_root.py create mode 100644 tools/polly/bin/detail/logging.py create mode 100644 tools/polly/bin/detail/open_project.py create mode 100644 tools/polly/bin/detail/osx_dev_root.py create mode 100644 tools/polly/bin/detail/pack_command.py create mode 100644 tools/polly/bin/detail/rmtree.py create mode 100644 tools/polly/bin/detail/target.py create mode 100644 tools/polly/bin/detail/test_command.py create mode 100644 tools/polly/bin/detail/timer.py create mode 100644 tools/polly/bin/detail/toolchain_name.py create mode 100644 tools/polly/bin/detail/toolchain_table.py create mode 100755 tools/polly/bin/detail/util.py create mode 100644 tools/polly/bin/detail/verify_mingw_path.py create mode 100644 tools/polly/bin/detail/verify_msys_path.py create mode 100755 tools/polly/bin/detail/win32.py create mode 100755 tools/polly/bin/install-ci-dependencies.py create mode 100755 tools/polly/bin/polly create mode 100644 tools/polly/bin/polly.bat create mode 100755 tools/polly/bin/polly.py create mode 100644 tools/polly/clang-5-cxx14.cmake create mode 100644 tools/polly/clang-5-cxx17.cmake create mode 100644 tools/polly/clang-5.cmake create mode 100644 tools/polly/clang-cxx14-pic.cmake create mode 100644 tools/polly/clang-cxx14.cmake create mode 100644 tools/polly/clang-cxx17.cmake create mode 100644 tools/polly/clang-fpic-hid-sections.cmake create mode 100644 tools/polly/clang-fpic-static-std.cmake create mode 100644 tools/polly/clang-fpic.cmake create mode 100644 tools/polly/clang-libcxx-fpic.cmake create mode 100644 tools/polly/clang-libcxx.cmake create mode 100644 tools/polly/clang-libcxx14-fpic.cmake create mode 100644 tools/polly/clang-libcxx14.cmake create mode 100644 tools/polly/clang-libcxx17-fpic.cmake create mode 100644 tools/polly/clang-libcxx17.cmake create mode 100644 tools/polly/clang-libstdcxx.cmake create mode 100644 tools/polly/clang-lto.cmake create mode 100644 tools/polly/clang-omp.cmake create mode 100644 tools/polly/clang-tidy-libcxx.cmake create mode 100644 tools/polly/clang-tidy.cmake create mode 100644 tools/polly/compiler/cl.cmake create mode 100644 tools/polly/compiler/clang-5.cmake create mode 100644 tools/polly/compiler/clang-omp.cmake create mode 100644 tools/polly/compiler/clang.cmake create mode 100644 tools/polly/compiler/egcc.cmake create mode 100644 tools/polly/compiler/emscripten.cmake create mode 100644 tools/polly/compiler/emscripten/glew/glewConfig.cmake create mode 100644 tools/polly/compiler/emscripten/glfw3/glfw3Config.cmake create mode 100644 tools/polly/compiler/gcc-5.cmake create mode 100644 tools/polly/compiler/gcc-6.cmake create mode 100644 tools/polly/compiler/gcc-7.cmake create mode 100644 tools/polly/compiler/gcc-8.cmake create mode 100644 tools/polly/compiler/gcc-cross-compile-raspberry-pi.cmake create mode 100644 tools/polly/compiler/gcc-cross-compile-simple-layout.cmake create mode 100644 tools/polly/compiler/gcc-cross-compile.cmake create mode 100644 tools/polly/compiler/gcc.cmake create mode 100644 tools/polly/compiler/gcc48.cmake create mode 100644 tools/polly/compiler/xcode.cmake create mode 100644 tools/polly/custom-libcxx.cmake create mode 100644 tools/polly/cxx11.cmake create mode 100644 tools/polly/cxx17.cmake create mode 100644 tools/polly/cygwin.cmake create mode 100644 tools/polly/default.cmake create mode 100644 tools/polly/docs/Makefile create mode 100644 tools/polly/docs/conf.py create mode 100644 tools/polly/docs/index.rst create mode 100755 tools/polly/docs/jenkins.sh create mode 100755 tools/polly/docs/make.sh create mode 100644 tools/polly/docs/requirements.txt create mode 100644 tools/polly/docs/screens/ios-team-id.png create mode 100644 tools/polly/docs/spelling.txt create mode 100644 tools/polly/docs/toolchains.rst create mode 100644 tools/polly/docs/toolchains/android.rst create mode 100644 tools/polly/docs/toolchains/android/developer-notes.rst create mode 100644 tools/polly/docs/toolchains/android/old.rst create mode 100644 tools/polly/docs/toolchains/clang-omp.rst create mode 100644 tools/polly/docs/toolchains/gcc-musl.rst create mode 100644 tools/polly/docs/toolchains/ios.rst create mode 100644 tools/polly/docs/toolchains/ios/bundle-id.rst create mode 100644 tools/polly/docs/toolchains/ios/errors/polly_ios_bundle_identifier.rst create mode 100644 tools/polly/docs/toolchains/ios/errors/polly_ios_development_team.rst create mode 100644 tools/polly/docs/toolchains/ios/errors/signing-request-development-team.rst create mode 100644 tools/polly/docs/toolchains/ios/screens/01_new_project.png create mode 100644 tools/polly/docs/toolchains/ios/screens/02_single_view_app.png create mode 100644 tools/polly/docs/toolchains/ios/screens/03_project_options.png create mode 100644 tools/polly/docs/toolchains/ios/screens/04_bundle_identifier.png create mode 100644 tools/polly/docs/toolchains/ios/screens/05_run_app.png create mode 100644 tools/polly/docs/toolchains/ios/screens/bad_bundle_id.png create mode 100644 tools/polly/docs/toolchains/linux-mingw-w64.rst create mode 100644 tools/polly/docs/toolchains/raspberry-pi.rst create mode 100644 tools/polly/emscripten-cxx11.cmake create mode 100644 tools/polly/emscripten-cxx14.cmake create mode 100644 tools/polly/emscripten-cxx17.cmake create mode 100644 tools/polly/examples/01-executable/CMakeLists.txt create mode 100644 tools/polly/examples/01-executable/main.cpp create mode 100644 tools/polly/examples/02-library/CMakeLists.txt create mode 100644 tools/polly/examples/02-library/foo.cpp create mode 100755 tools/polly/examples/02-library/main.cpp create mode 100644 tools/polly/examples/03-shared-link/CMakeLists.txt create mode 100644 tools/polly/examples/03-shared-link/boo.cpp create mode 100644 tools/polly/examples/03-shared-link/foo.cpp create mode 100755 tools/polly/examples/03-shared-link/main.cpp create mode 100644 tools/polly/find/FindLibcxx.cmake create mode 100644 tools/polly/flags/32bit.cmake create mode 100644 tools/polly/flags/bitcode.cmake create mode 100644 tools/polly/flags/c11.cmake create mode 100644 tools/polly/flags/clang-tidy.cmake create mode 100644 tools/polly/flags/cxx11.cmake create mode 100644 tools/polly/flags/cxx14.cmake create mode 100644 tools/polly/flags/cxx17-gnu.cmake create mode 100644 tools/polly/flags/cxx17.cmake create mode 100644 tools/polly/flags/cxx98.cmake create mode 100644 tools/polly/flags/data-sections.cmake create mode 100644 tools/polly/flags/fpic.cmake create mode 100644 tools/polly/flags/function-sections.cmake create mode 100644 tools/polly/flags/gnuxx11.cmake create mode 100644 tools/polly/flags/gold.cmake create mode 100644 tools/polly/flags/hardfloat.cmake create mode 100644 tools/polly/flags/hidden.cmake create mode 100644 tools/polly/flags/ios_nocodesign.cmake create mode 100644 tools/polly/flags/lto.cmake create mode 100644 tools/polly/flags/mtune_cortex-a15.cmake create mode 100644 tools/polly/flags/neon-vfpv4.cmake create mode 100644 tools/polly/flags/neon.cmake create mode 100644 tools/polly/flags/openwrt.cmake create mode 100644 tools/polly/flags/sanitize_address.cmake create mode 100644 tools/polly/flags/sanitize_leak.cmake create mode 100644 tools/polly/flags/sanitize_memory.cmake create mode 100644 tools/polly/flags/sanitize_thread.cmake create mode 100644 tools/polly/flags/static-std.cmake create mode 100644 tools/polly/flags/static.cmake create mode 100644 tools/polly/flags/vs-cxx14.cmake create mode 100644 tools/polly/flags/vs-cxx17.cmake create mode 100644 tools/polly/flags/vs-mt.cmake create mode 100644 tools/polly/flags/vs-z7.cmake create mode 100644 tools/polly/flags/vs-zw.cmake create mode 100644 tools/polly/gcc-32bit-pic.cmake create mode 100644 tools/polly/gcc-32bit.cmake create mode 100644 tools/polly/gcc-4-8-c11.cmake create mode 100644 tools/polly/gcc-4-8-pic-hid-sections.cmake create mode 100644 tools/polly/gcc-4-8-pic.cmake create mode 100644 tools/polly/gcc-4-8.cmake create mode 100644 tools/polly/gcc-5-cxx14-c11.cmake create mode 100644 tools/polly/gcc-5-pic-hid-sections-lto.cmake create mode 100644 tools/polly/gcc-5-pic-hid-sections.cmake create mode 100644 tools/polly/gcc-5.cmake create mode 100644 tools/polly/gcc-6-32bit-cxx14.cmake create mode 100644 tools/polly/gcc-7-cxx14-pic.cmake create mode 100644 tools/polly/gcc-7-cxx14.cmake create mode 100644 tools/polly/gcc-7-cxx17-gnu.cmake create mode 100644 tools/polly/gcc-7-cxx17-pic.cmake create mode 100644 tools/polly/gcc-7-cxx17.cmake create mode 100644 tools/polly/gcc-7-pic-hid-sections-lto.cmake create mode 100644 tools/polly/gcc-7.cmake create mode 100644 tools/polly/gcc-8-cxx14-fpic.cmake create mode 100644 tools/polly/gcc-8-cxx14.cmake create mode 100644 tools/polly/gcc-8-cxx17-fpic.cmake create mode 100644 tools/polly/gcc-8-cxx17.cmake create mode 100644 tools/polly/gcc-c11.cmake create mode 100644 tools/polly/gcc-cxx14-c11.cmake create mode 100644 tools/polly/gcc-cxx17-c11.cmake create mode 100644 tools/polly/gcc-cxx98.cmake create mode 100644 tools/polly/gcc-gold.cmake create mode 100644 tools/polly/gcc-hid-fpic.cmake create mode 100644 tools/polly/gcc-hid.cmake create mode 100644 tools/polly/gcc-lto.cmake create mode 100644 tools/polly/gcc-musl.cmake create mode 100644 tools/polly/gcc-ninja.cmake create mode 100644 tools/polly/gcc-pic-hid-sections-lto.cmake create mode 100644 tools/polly/gcc-pic-hid-sections.cmake create mode 100644 tools/polly/gcc-pic.cmake create mode 100644 tools/polly/gcc-static-std.cmake create mode 100644 tools/polly/gcc-static.cmake create mode 100644 tools/polly/gcc.cmake create mode 100644 tools/polly/ios-10-0-arm64-dep-8-0-hid-sections.cmake create mode 100644 tools/polly/ios-10-0-arm64.cmake create mode 100644 tools/polly/ios-10-0-armv7.cmake create mode 100644 tools/polly/ios-10-0-dep-8-0-hid-sections.cmake create mode 100644 tools/polly/ios-10-0-wo-armv7s.cmake create mode 100644 tools/polly/ios-10-0.cmake create mode 100644 tools/polly/ios-10-1-arm64-dep-8-0-hid-sections.cmake create mode 100644 tools/polly/ios-10-1-arm64.cmake create mode 100644 tools/polly/ios-10-1-armv7.cmake create mode 100644 tools/polly/ios-10-1-dep-8-0-hid-sections.cmake create mode 100644 tools/polly/ios-10-1-dep-8-0-libcxx-hid-sections-lto.cmake create mode 100644 tools/polly/ios-10-1-dep-8-0-libcxx-hid-sections.cmake create mode 100644 tools/polly/ios-10-1-wo-armv7s.cmake create mode 100644 tools/polly/ios-10-1.cmake create mode 100644 tools/polly/ios-10-2-dep-9-3-arm64.cmake create mode 100644 tools/polly/ios-10-2-dep-9-3-armv7.cmake create mode 100644 tools/polly/ios-10-2.cmake create mode 100644 tools/polly/ios-10-3-arm64.cmake create mode 100644 tools/polly/ios-10-3-armv7.cmake create mode 100644 tools/polly/ios-10-3-dep-8-0-bitcode.cmake create mode 100644 tools/polly/ios-10-3-dep-9-0-bitcode.cmake create mode 100644 tools/polly/ios-10-3-dep-9-3-i386-armv7.cmake create mode 100644 tools/polly/ios-10-3-dep-9-3-x86-64-arm64.cmake create mode 100644 tools/polly/ios-10-3-lto.cmake create mode 100644 tools/polly/ios-10-3.cmake create mode 100644 tools/polly/ios-11-0-dep-9-0-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-11-0-dep-9-0-device-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-11-0.cmake create mode 100644 tools/polly/ios-11-1-dep-9-0-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-11-1-dep-9-0-device-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-11-2-dep-9-0-device-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-11-2-dep-9-0-device-bitcode-nocxx.cmake create mode 100644 tools/polly/ios-11-2-dep-9-3-arm64-armv7.cmake create mode 100644 tools/polly/ios-11-3-dep-9-0-arm64.cmake create mode 100644 tools/polly/ios-11-3-dep-9-0-device-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-11-3-dep-9-0-device-bitcode-cxx17.cmake create mode 100644 tools/polly/ios-11-3-dep-9-0-device-bitcode-nocxx.cmake create mode 100644 tools/polly/ios-11-3-dep-9-0-device-bitcode.cmake create mode 100644 tools/polly/ios-11-3-dep-9-3-arm64-armv7.cmake create mode 100644 tools/polly/ios-11-4-dep-8-0-arm64-armv7-hid-sections-lto-cxx11.cmake create mode 100644 tools/polly/ios-11-4-dep-8-0-arm64-hid-sections-lto-cxx11.cmake create mode 100644 tools/polly/ios-11-4-dep-9-0-device-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-11-4-dep-9-0-device-bitcode-nocxx.cmake create mode 100644 tools/polly/ios-11-4-dep-9-3-arm64-armv7.cmake create mode 100644 tools/polly/ios-11-4-dep-9-3-arm64-hid-sections-lto-cxx11.cmake create mode 100644 tools/polly/ios-11-4-dep-9-3-arm64.cmake create mode 100644 tools/polly/ios-11-4-dep-9-3-armv7.cmake create mode 100644 tools/polly/ios-11-4-dep-9-3.cmake create mode 100644 tools/polly/ios-11-4-dep-9-4-arm64.cmake create mode 100644 tools/polly/ios-12-0-dep-11-0-arm64.cmake create mode 100644 tools/polly/ios-12-0-dep-9-0-device-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-12-1-dep-11-0-arm64.cmake create mode 100644 tools/polly/ios-12-1-dep-9-3-arm64.cmake create mode 100644 tools/polly/ios-7-0.cmake create mode 100644 tools/polly/ios-7-1.cmake create mode 100644 tools/polly/ios-8-0.cmake create mode 100644 tools/polly/ios-8-1.cmake create mode 100644 tools/polly/ios-8-2-arm64-hid.cmake create mode 100644 tools/polly/ios-8-2-arm64.cmake create mode 100644 tools/polly/ios-8-2-cxx98.cmake create mode 100644 tools/polly/ios-8-2-i386-arm64.cmake create mode 100644 tools/polly/ios-8-2.cmake create mode 100644 tools/polly/ios-8-4-arm64.cmake create mode 100644 tools/polly/ios-8-4-armv7.cmake create mode 100644 tools/polly/ios-8-4-armv7s.cmake create mode 100644 tools/polly/ios-8-4-hid.cmake create mode 100644 tools/polly/ios-8-4.cmake create mode 100644 tools/polly/ios-9-0-armv7.cmake create mode 100644 tools/polly/ios-9-0-dep-7-0-armv7.cmake create mode 100644 tools/polly/ios-9-0-i386-armv7.cmake create mode 100644 tools/polly/ios-9-0-wo-armv7s.cmake create mode 100644 tools/polly/ios-9-0.cmake create mode 100644 tools/polly/ios-9-1-arm64.cmake create mode 100644 tools/polly/ios-9-1-armv7.cmake create mode 100644 tools/polly/ios-9-1-dep-7-0-armv7.cmake create mode 100644 tools/polly/ios-9-1-dep-8-0-hid.cmake create mode 100644 tools/polly/ios-9-1-hid.cmake create mode 100644 tools/polly/ios-9-1.cmake create mode 100644 tools/polly/ios-9-2-arm64.cmake create mode 100644 tools/polly/ios-9-2-armv7.cmake create mode 100644 tools/polly/ios-9-2-hid-sections.cmake create mode 100644 tools/polly/ios-9-2-hid.cmake create mode 100644 tools/polly/ios-9-2.cmake create mode 100644 tools/polly/ios-9-3-arm64.cmake create mode 100644 tools/polly/ios-9-3-armv7.cmake create mode 100644 tools/polly/ios-9-3-wo-armv7s.cmake create mode 100644 tools/polly/ios-9-3.cmake create mode 100644 tools/polly/ios-dep-8-0-arm64-armv7-hid-sections-lto-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-10-0-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-10-0-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-10-0-wo-armv7s.cmake create mode 100644 tools/polly/ios-nocodesign-10-0.cmake create mode 100644 tools/polly/ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections-lto.cmake create mode 100644 tools/polly/ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections.cmake create mode 100644 tools/polly/ios-nocodesign-10-1-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-10-1-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-10-1-dep-8-0-device-libcxx-hid-sections-lto.cmake create mode 100644 tools/polly/ios-nocodesign-10-1-dep-8-0-libcxx-hid-sections-lto.cmake create mode 100644 tools/polly/ios-nocodesign-10-1-dep-9-0-device-libcxx-hid-sections-lto.cmake create mode 100644 tools/polly/ios-nocodesign-10-1-wo-armv7s.cmake create mode 100644 tools/polly/ios-nocodesign-10-1.cmake create mode 100644 tools/polly/ios-nocodesign-10-2.cmake create mode 100644 tools/polly/ios-nocodesign-10-3-arm64-dep-9-0-device-libcxx-hid-sections.cmake create mode 100644 tools/polly/ios-nocodesign-10-3-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-10-3-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-10-3-cxx14.cmake create mode 100644 tools/polly/ios-nocodesign-10-3-dep-9-0-bitcode.cmake create mode 100644 tools/polly/ios-nocodesign-10-3-wo-armv7s.cmake create mode 100644 tools/polly/ios-nocodesign-10-3.cmake create mode 100644 tools/polly/ios-nocodesign-11-0-arm64-dep-9-0-device-libcxx-hid-sections.cmake create mode 100644 tools/polly/ios-nocodesign-11-0-dep-9-0-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-11-0.cmake create mode 100644 tools/polly/ios-nocodesign-11-1-dep-9-0-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-11-1-dep-9-0-wo-armv7s-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-11-1.cmake create mode 100644 tools/polly/ios-nocodesign-11-2-dep-8-0-wo-armv7s-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-11-2-dep-9-0-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-11-2-dep-9-3-arm64-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-11-2-dep-9-3-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-11-2-dep-9-3-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-11-2-dep-9-3-i386-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-11-2-dep-9-3.cmake create mode 100644 tools/polly/ios-nocodesign-11-2.cmake create mode 100644 tools/polly/ios-nocodesign-11-3-dep-9-0-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-11-3-dep-9-3-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-11-3-dep-9-3-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-11-3-dep-9-3.cmake create mode 100644 tools/polly/ios-nocodesign-11-4-dep-9-0-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-11-4-dep-9-3-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-11-4-dep-9-3-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-11-4-dep-9-3.cmake create mode 100644 tools/polly/ios-nocodesign-12-0-dep-9-0-bitcode-cxx11.cmake create mode 100644 tools/polly/ios-nocodesign-12-1-dep-9-3-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-8-1.cmake create mode 100644 tools/polly/ios-nocodesign-8-4.cmake create mode 100644 tools/polly/ios-nocodesign-9-1-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-9-1-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-9-1.cmake create mode 100644 tools/polly/ios-nocodesign-9-2-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-9-2-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-9-2.cmake create mode 100644 tools/polly/ios-nocodesign-9-3-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-9-3-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-9-3-device-hid-sections.cmake create mode 100644 tools/polly/ios-nocodesign-9-3-device.cmake create mode 100644 tools/polly/ios-nocodesign-9-3-wo-armv7s.cmake create mode 100644 tools/polly/ios-nocodesign-9-3.cmake create mode 100644 tools/polly/ios-nocodesign-arm64.cmake create mode 100644 tools/polly/ios-nocodesign-armv7.cmake create mode 100644 tools/polly/ios-nocodesign-dep-9-0-cxx14.cmake create mode 100644 tools/polly/ios-nocodesign-hid-sections.cmake create mode 100644 tools/polly/ios-nocodesign-wo-armv7s.cmake create mode 100644 tools/polly/ios-nocodesign.cmake create mode 100644 tools/polly/ios.cmake create mode 100644 tools/polly/libcxx-fpic-hid-sections.cmake create mode 100644 tools/polly/libcxx-hid-fpic.cmake create mode 100644 tools/polly/libcxx-hid-sections.cmake create mode 100644 tools/polly/libcxx-hid.cmake create mode 100644 tools/polly/libcxx-no-sdk.cmake create mode 100644 tools/polly/libcxx.cmake create mode 100644 tools/polly/libcxx14.cmake create mode 100644 tools/polly/library/std/libcxx.cmake create mode 100644 tools/polly/library/std/libstdcxx.cmake create mode 100644 tools/polly/library/std/nolibs.cmake create mode 100644 tools/polly/linux-gcc-armhf-neon-vfpv4.cmake create mode 100644 tools/polly/linux-gcc-armhf-neon.cmake create mode 100644 tools/polly/linux-gcc-armhf.cmake create mode 100644 tools/polly/linux-gcc-jetson-tk1.cmake create mode 100644 tools/polly/linux-gcc-x64.cmake create mode 100644 tools/polly/linux-mingw-w32.cmake create mode 100644 tools/polly/linux-mingw-w64-cxx98.cmake create mode 100644 tools/polly/linux-mingw-w64-gnuxx11.cmake create mode 100644 tools/polly/linux-mingw-w64.cmake create mode 100644 tools/polly/mingw-c11.cmake create mode 100644 tools/polly/mingw-cxx14.cmake create mode 100644 tools/polly/mingw-cxx17.cmake create mode 100644 tools/polly/mingw.cmake create mode 100644 tools/polly/msys-cxx14.cmake create mode 100644 tools/polly/msys-cxx17.cmake create mode 100644 tools/polly/msys.cmake create mode 100644 tools/polly/ninja-vs-12-2013-win64.cmake create mode 100644 tools/polly/ninja-vs-14-2015-win64.cmake create mode 100644 tools/polly/ninja-vs-15-2017-win64-cxx17.cmake create mode 100644 tools/polly/ninja-vs-15-2017-win64.cmake create mode 100644 tools/polly/nmake-vs-12-2013-win64.cmake create mode 100644 tools/polly/nmake-vs-12-2013.cmake create mode 100644 tools/polly/nmake-vs-15-2017-win64-cxx17.cmake create mode 100644 tools/polly/nmake-vs-15-2017-win64.cmake create mode 100644 tools/polly/openbsd-egcc-cxx11-static-std.cmake create mode 100644 tools/polly/os/android.cmake create mode 100644 tools/polly/os/cygwin.cmake create mode 100644 tools/polly/os/iphone-default-sdk.cmake create mode 100644 tools/polly/os/iphone.cmake create mode 100644 tools/polly/os/osx.cmake create mode 100644 tools/polly/os/raspberry-pi-hardfloat.cmake create mode 100644 tools/polly/os/raspberry-pi1.cmake create mode 100644 tools/polly/os/raspberry-pi2.cmake create mode 100644 tools/polly/os/raspberry-pi3.cmake create mode 100644 tools/polly/os/vc-mdd-android.cmake create mode 100644 tools/polly/osx-10-10-dep-10-7.cmake create mode 100644 tools/polly/osx-10-10-dep-10-9-make.cmake create mode 100644 tools/polly/osx-10-10.cmake create mode 100644 tools/polly/osx-10-11-hid-sections-lto.cmake create mode 100644 tools/polly/osx-10-11-hid-sections.cmake create mode 100644 tools/polly/osx-10-11-lto.cmake create mode 100644 tools/polly/osx-10-11-make.cmake create mode 100644 tools/polly/osx-10-11-sanitize-address.cmake create mode 100644 tools/polly/osx-10-11.cmake create mode 100644 tools/polly/osx-10-12-cxx14.cmake create mode 100644 tools/polly/osx-10-12-cxx17.cmake create mode 100644 tools/polly/osx-10-12-cxx98.cmake create mode 100644 tools/polly/osx-10-12-dep-10-10-lto.cmake create mode 100644 tools/polly/osx-10-12-dep-10-10.cmake create mode 100644 tools/polly/osx-10-12-hid-sections.cmake create mode 100644 tools/polly/osx-10-12-lto.cmake create mode 100644 tools/polly/osx-10-12-make.cmake create mode 100644 tools/polly/osx-10-12-ninja.cmake create mode 100644 tools/polly/osx-10-12-sanitize-address-hid-sections.cmake create mode 100644 tools/polly/osx-10-12-sanitize-address.cmake create mode 100644 tools/polly/osx-10-12.cmake create mode 100644 tools/polly/osx-10-13-cxx14.cmake create mode 100644 tools/polly/osx-10-13-cxx17.cmake create mode 100644 tools/polly/osx-10-13-dep-10-10-cxx14.cmake create mode 100644 tools/polly/osx-10-13-dep-10-10-cxx17.cmake create mode 100644 tools/polly/osx-10-13-dep-10-10.cmake create mode 100644 tools/polly/osx-10-13-i386-cxx14.cmake create mode 100644 tools/polly/osx-10-13-make-cxx14.cmake create mode 100644 tools/polly/osx-10-13.cmake create mode 100644 tools/polly/osx-10-14-cxx14.cmake create mode 100644 tools/polly/osx-10-14-cxx17.cmake create mode 100644 tools/polly/osx-10-14-dep-10-10-cxx14.cmake create mode 100644 tools/polly/osx-10-14-dep-10-10-cxx17.cmake create mode 100644 tools/polly/osx-10-14-dep-10-10.cmake create mode 100644 tools/polly/osx-10-14.cmake create mode 100644 tools/polly/osx-10-7.cmake create mode 100644 tools/polly/osx-10-8.cmake create mode 100644 tools/polly/osx-10-9.cmake create mode 100644 tools/polly/raspberrypi1-cxx11-pic-static-std.cmake create mode 100644 tools/polly/raspberrypi1-cxx11-pic.cmake create mode 100644 tools/polly/raspberrypi2-cxx11-pic.cmake create mode 100644 tools/polly/raspberrypi2-cxx11.cmake create mode 100644 tools/polly/raspberrypi3-cxx11.cmake create mode 100644 tools/polly/raspberrypi3-gcc-pic-hid-sections.cmake create mode 100644 tools/polly/sanitize-address-cxx17-pic.cmake create mode 100644 tools/polly/sanitize-address-cxx17.cmake create mode 100644 tools/polly/sanitize-address.cmake create mode 100644 tools/polly/sanitize-leak-cxx17-pic.cmake create mode 100644 tools/polly/sanitize-leak-cxx17.cmake create mode 100644 tools/polly/sanitize-leak.cmake create mode 100644 tools/polly/sanitize-memory.cmake create mode 100644 tools/polly/sanitize-thread-cxx17-pic.cmake create mode 100644 tools/polly/sanitize-thread-cxx17.cmake create mode 100644 tools/polly/sanitize-thread.cmake create mode 100644 tools/polly/scripts/Info.plist create mode 100644 tools/polly/scripts/NoCodeSign.xcconfig create mode 100755 tools/polly/scripts/clang-analyze.sh create mode 100755 tools/polly/scripts/clangxx-analyze.sh create mode 100644 tools/polly/utilities/polly_add_cache_flag.cmake create mode 100644 tools/polly/utilities/polly_clear_environment_variables.cmake create mode 100644 tools/polly/utilities/polly_common.cmake create mode 100644 tools/polly/utilities/polly_fatal_error.cmake create mode 100644 tools/polly/utilities/polly_init.cmake create mode 100644 tools/polly/utilities/polly_ios_bundle_identifier.cmake create mode 100644 tools/polly/utilities/polly_ios_development_team.cmake create mode 100644 tools/polly/utilities/polly_module_path.cmake create mode 100644 tools/polly/utilities/polly_status_debug.cmake create mode 100644 tools/polly/utilities/polly_status_print.cmake create mode 100644 tools/polly/vs-10-2010.cmake create mode 100644 tools/polly/vs-11-2012-arm.cmake create mode 100644 tools/polly/vs-11-2012-win64.cmake create mode 100644 tools/polly/vs-11-2012.cmake create mode 100644 tools/polly/vs-12-2013-arm.cmake create mode 100644 tools/polly/vs-12-2013-mt.cmake create mode 100644 tools/polly/vs-12-2013-win64.cmake create mode 100644 tools/polly/vs-12-2013-xp.cmake create mode 100644 tools/polly/vs-12-2013.cmake create mode 100644 tools/polly/vs-14-2015-arm.cmake create mode 100644 tools/polly/vs-14-2015-sdk-8-1.cmake create mode 100644 tools/polly/vs-14-2015-win64-sdk-8-1.cmake create mode 100644 tools/polly/vs-14-2015-win64.cmake create mode 100644 tools/polly/vs-14-2015.cmake create mode 100644 tools/polly/vs-15-2017-cxx17.cmake create mode 100644 tools/polly/vs-15-2017-store-10-zw.cmake create mode 100644 tools/polly/vs-15-2017-win64-cxx14.cmake create mode 100644 tools/polly/vs-15-2017-win64-cxx17.cmake create mode 100644 tools/polly/vs-15-2017-win64-llvm-vs2014.cmake create mode 100644 tools/polly/vs-15-2017-win64-llvm.cmake create mode 100644 tools/polly/vs-15-2017-win64-store-10-cxx17.cmake create mode 100644 tools/polly/vs-15-2017-win64-store-10-zw.cmake create mode 100644 tools/polly/vs-15-2017-win64-z7.cmake create mode 100644 tools/polly/vs-15-2017-win64.cmake create mode 100644 tools/polly/vs-15-2017.cmake create mode 100644 tools/polly/vs-8-2005.cmake create mode 100644 tools/polly/vs-9-2008.cmake create mode 100644 tools/polly/xcode-cxx98.cmake create mode 100644 tools/polly/xcode-gcc.cmake create mode 100644 tools/polly/xcode-hid-sections.cmake create mode 100644 tools/polly/xcode-nocxx.cmake create mode 100644 tools/polly/xcode-sections.cmake create mode 100644 tools/polly/xcode.cmake diff --git a/.gitignore b/.gitignore index cf579cb..3a8afcb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.dat .idea/ +*build*/ *.swp .DS_Store *build*/ diff --git a/.gitmodules b/.gitmodules index 3db41bd..f3af409 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "vendor/openssl"] path = vendor/openssl url = https://github.com/openssl/openssl +[submodule "tools/gate"] + path = tools/gate + url = https://github.com/hunter-packages/gate diff --git a/CMakeLists.txt b/CMakeLists.txt index dcc9ba7..86f161f 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,10 +22,10 @@ cmake_minimum_required(VERSION 3.3) -include("cmake/HunterGate.cmake") -HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.19.123.tar.gz" - SHA1 "57d07480686f82ddc916a5980b4f2a18e5954c2b" +include("tools/gate/cmake/HunterGate.cmake") +huntergate( + URL "https://github.com/ruslo/hunter/archive/v0.23.83.tar.gz" + SHA1 "12dec078717539eb7b03e6d2a17797cba9be9ba9" ) set(WDC_VERSION_MAJOR 1) diff --git a/tools/build_package.deb.sh b/tools/build_package.deb.sh deleted file mode 100755 index 49f1e59..0000000 --- a/tools/build_package.deb.sh +++ /dev/null @@ -1,19 +0,0 @@ -mkdir doc-pak -cp ../AUTHORS ../LICENSE ./doc-pak -cp ../README.md ./doc-pak/README -cp ../DESCRIPTION ./description-pak - -checkinstall -y --type=debian \ - --install=no \ - --pkgname=libwdc-dev \ - --pkgversion=$(git describe --abbrev=0 --tags | sed 's,^v,,') \ - --pkglicense=MIT \ - --pkgrelease=1 \ - --pkgsource="https://github.com/designerror/webdav-client-cpp" \ - --requires="$(cat ../REQUIREMENTS.UNIX.txt | sed ':a;N;$!ba;s/\n/,/g' | sed 's/(/\\(/g' | sed 's/)/\\)/g' | sed 's/>/\\>/g')" \ - --provides=wdc \ - --backup=no \ - --nodoc \ - --maintainer="designerror@ya.ru" \ - --pkggroup="wdc" - diff --git a/tools/build_package.rpm.sh b/tools/build_package.rpm.sh deleted file mode 100755 index c3fa253..0000000 --- a/tools/build_package.rpm.sh +++ /dev/null @@ -1,20 +0,0 @@ -mkdir doc-pak -cp ../AUTHORS ../LICENSE ./doc-pak -cp ../README.md ./doc-pak/README -cp ../DESCRIPTION ./description-pak - -checkinstall -y --type=rpm \ - --install=no \ - --fstrans=yes \ - --pkgname=libwdc-dev \ - --pkgversion=$(git describe --abbrev=0 --tags | sed 's,^v,,') \ - --pkglicense=MIT \ - --pkgrelease=1 \ - --pkgsource="https://github.com/designerror/webdav-client-cpp" \ - --requires="$(cat ../REQUIREMENTS.UNIX.txt | sed ':a;N;$!ba;s/\n/,/g' | sed 's/(/\\(/g' | sed 's/)/\\)/g' | sed 's/>/\\>/g')" \ - --provides=wdc \ - --backup=no \ - --nodoc \ - --maintainer="designerror@ya.ru" \ - --pkggroup="wdc" - diff --git a/tools/build_requirements.cygwin.sh b/tools/build_requirements.cygwin.sh deleted file mode 100644 index 11cb1fe..0000000 --- a/tools/build_requirements.cygwin.sh +++ /dev/null @@ -1,20 +0,0 @@ -echo "Install OpenSSL@1.0.2g" -wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2g.tar.gz -O OpenSSL_1_0_2g.tar.gz -tar -xf OpenSSL_1_0_2g.tar.gz && cd openssl-OpenSSL_1_0_2g -./config -make && make install_sw -cd .. && rm -rf openssl-OpenSSL_1_0_2g && rm -f OpenSSL_1_0_2g.tar.gz - -echo "Install CURL@7.4.8" -wget https://github.com/curl/curl/archive/curl-7_48_0.tar.gz -O curl-7_48_0.tar.gz -tar -xf curl-7_48_0.tar.gz && cd curl-curl-7_48_0 -mkdir build && cd build && cmake .. -make && make install -cd ../.. && rm -rf curl-curl-7_48_0 && rm -f curl-7_48_0.tar.gz - -echo "Install pugixml@1.7.0" -wget https://github.com/zeux/pugixml/releases/download/v1.7/pugixml-1.7.tar.gz -O pugixml-1.7.tar.gz -tar -xf pugixml-1.7.tar.gz && cd pugixml-1.7 -mkdir build && cd build && cmake ../scripts/ -make && make install -cd ../.. && rm -rf pugixml-1.7 && rm -f pugixml-1.7.tar.gz diff --git a/tools/build_requirements.unix.sh b/tools/build_requirements.unix.sh deleted file mode 100755 index 5b115d2..0000000 --- a/tools/build_requirements.unix.sh +++ /dev/null @@ -1,20 +0,0 @@ -echo "Install OpenSSL@1.0.2g" -wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2g.tar.gz -O OpenSSL_1_0_2g.tar.gz -tar -xf OpenSSL_1_0_2g.tar.gz && cd openssl-OpenSSL_1_0_2g -./config -make && sudo make install_sw -cd .. && rm -rf openssl-OpenSSL_1_0_2g && rm -f OpenSSL_1_0_2g.tar.gz - -echo "Install CURL@7.4.8" -wget https://github.com/curl/curl/archive/curl-7_48_0.tar.gz -O curl-7_48_0.tar.gz -tar -xf curl-7_48_0.tar.gz && cd curl-curl-7_48_0 -mkdir build && cd build && cmake .. -make && sudo make install -cd ../.. && rm -rf curl-curl-7_48_0 && rm -f curl-7_48_0.tar.gz - -echo "Install pugixml@1.7.0" -wget https://github.com/zeux/pugixml/releases/download/v1.7/pugixml-1.7.tar.gz -O pugixml-1.7.tar.gz -tar -xf pugixml-1.7.tar.gz && cd pugixml-1.7 -mkdir build && cd build && cmake ../scripts/ -make && sudo make install -cd ../.. && rm -rf pugixml-1.7 && rm -f pugixml-1.7.tar.gz diff --git a/tools/build_requirements.win.bat b/tools/build_requirements.win.bat deleted file mode 100755 index 9a7610e..0000000 --- a/tools/build_requirements.win.bat +++ /dev/null @@ -1,37 +0,0 @@ -rem 1. Download requirements -git submodule update --init - -rem 2. Set the build options -set BUILD_TYPE=Release -set BUILD_SHARED_LIBS=FALSE -set OPENSSL_BUILD_PLATFORM=VC-WIN64A -set INSTALL_PREFIX=%cd%\build -set CMAKE_COMMON_FLAGS=-DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DMSVC_SHRED_RT:BOOL=%BUILD_SHARED_LIBS% - -rem 3. Build and local install openssl -cd vendor\openssl -if not exist build (mkdir build && cd build) else (rmdir /S/Q build && mkdir build && cd build) -perl ../Configure --prefix=%INSTALL_PREFIX% --openssldir=%INSTALL_PREFIX%\ssl %OPENSSL_BUILD_PLATFORM% no-shared no-idea no-unit-test -nmake -nmake install -cd ..\.. - -rem 4. Build and local install curl -cd curl -if not exist build (mkdir build && cd build) else (rmdir /S/Q build && mkdir build && cd build) -cmake .. -DCMAKE_INSTALL_PREFIX=%INSTALL_PREFIX% -DCURL_STATICLIB:BOOL=ON -DBUILD_TESTING:BOOL=OFF -DBUILD_CURL_TESTS:BOOL=OFF -DBUILD_CURL_EXE:BOOL=OFF -DCURL_DISABLE_LDAP:BOOL=ON -DCURL_DISABLE_LDAPS=ON %CMAKE_COMMON_FLAGS% -nmake -nmake install -cd ..\.. - -rem 5. Build and local install pugixml -cd pugixml -if not exist build (mkdir build && cd build) else (rmdir /S/Q build && mkdir build && cd build) -cmake .. -DCMAKE_INSTALL_PREFIX=%INSTALL_PREFIX% %CMAKE_COMMON_FLAGS% -nmake -nmake install -cd ..\.. - - -rem 6. Go back -cd .. diff --git a/tools/gate b/tools/gate new file mode 160000 index 0000000..42c1c27 --- /dev/null +++ b/tools/gate @@ -0,0 +1 @@ +Subproject commit 42c1c27cdd556dcbc358c6ba8ad7a72a68ee2a62 diff --git a/tools/polly/.gitignore b/tools/polly/.gitignore new file mode 100644 index 0000000..f4f7a55 --- /dev/null +++ b/tools/polly/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +*/.DS_Store +*/*/.DS_Store +*.*~ + +docs/_build +docs/activate.sh + +bin/detail/__pycache__ +*.pyc +/.vs diff --git a/tools/polly/.gitmodules b/tools/polly/.gitmodules new file mode 100644 index 0000000..3d2ca01 --- /dev/null +++ b/tools/polly/.gitmodules @@ -0,0 +1,3 @@ +[submodule "docs/rtfd-css"] + path = docs/rtfd-css + url = https://github.com/ruslo/rtfd-css diff --git a/tools/polly/.travis.yml b/tools/polly/.travis.yml new file mode 100644 index 0000000..793fc46 --- /dev/null +++ b/tools/polly/.travis.yml @@ -0,0 +1,117 @@ +# 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: + sources: + - ubuntu-toolchain-r-test + packages: + - python3-pip + + - g++-5 + - gcc-5 + - g++-7 + - gcc-7 + +dist: + - trusty + +matrix: + include: + # Linux { + + - os: linux + env: EXAMPLE=01-executable TOOLCHAIN=gcc CONFIG=Release + + - os: linux + env: EXAMPLE=01-executable TOOLCHAIN=android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx CONFIG=Release + + - os: linux + env: EXAMPLE=01-executable TOOLCHAIN=gcc-5-cxx14-c11 CONFIG=Release + + - os: linux + env: EXAMPLE=01-executable TOOLCHAIN=gcc-7-cxx17 CONFIG=Release + + # Clang5 included in Travis CI trusty image + - os: linux + env: EXAMPLE=01-executable TOOLCHAIN=clang-5-cxx14 CONFIG=Release + - os: linux + env: EXAMPLE=01-executable TOOLCHAIN=clang-5-cxx17 CONFIG=Release + + - os: linux + env: EXAMPLE=02-library TOOLCHAIN=gcc CONFIG=Release + + - os: linux + env: EXAMPLE=03-shared-link TOOLCHAIN=gcc CONFIG=Release + + # } + + # osx { + + - os: osx + osx_image: xcode9.4 + env: EXAMPLE=01-executable TOOLCHAIN=osx-10-13 CONFIG=Release + + - os: osx + osx_image: xcode9.4 + env: EXAMPLE=01-executable TOOLCHAIN=ios-nocodesign-11-4-dep-9-3-armv7 CONFIG=Release + + - os: osx + osx_image: xcode10.1 + env: EXAMPLE=01-executable TOOLCHAIN=ios-nocodesign-12-1-dep-9-3-armv7 CONFIG=Release + + # } + +install: + # Info about OS + - uname -a + + - 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 + # fix broken clang link on Travis-CI + - if [[ "`uname`" == "Linux" ]]; then mkdir clang-bin; ln -s /usr/local/clang-5.0.0/bin/clang++ clang-bin/clang++-5.0; fi + - if [[ "`uname`" == "Darwin" ]]; then mkdir clang-bin; ln -s /usr/bin/clang++ clang-bin/clang++-5.0; fi + + # Install dependencies (CMake, Android NDK) + - POLLY_SOURCE_DIR="`pwd`" + - python3 "${POLLY_SOURCE_DIR}/bin/install-ci-dependencies.py" + + # Tune locations + - export PATH="`pwd`/_ci/cmake/bin:`pwd`/clang-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" + - export ANDROID_NDK_r17="`pwd`/_ci/android-ndk-r17" + +script: + - > + python3 "${POLLY_SOURCE_DIR}/bin/build.py" + --home examples/${EXAMPLE} + --toolchain ${TOOLCHAIN} + --config ${CONFIG} + --verbose + --clear + --install + --test + +branches: + except: + - /^pr\..*/ diff --git a/tools/polly/CONTRIBUTING.md b/tools/polly/CONTRIBUTING.md new file mode 100644 index 0000000..e4c1417 --- /dev/null +++ b/tools/polly/CONTRIBUTING.md @@ -0,0 +1,7 @@ +Please send a patch as a pull request against the branch master. + +Also try to follow general notes from here: +* https://github.com/ruslo/hunter/wiki/dev.contribution + +Add new toolchain to toolchain table: +* https://github.com/ruslo/polly/blob/master/bin/detail/toolchain_table.py diff --git a/tools/polly/LICENSE b/tools/polly/LICENSE new file mode 100644 index 0000000..4fddff1 --- /dev/null +++ b/tools/polly/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2013, 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. diff --git a/tools/polly/README.md b/tools/polly/README.md new file mode 100644 index 0000000..3c90196 --- /dev/null +++ b/tools/polly/README.md @@ -0,0 +1,168 @@ +### Polly + +[![Join the chat at https://gitter.im/polly-cmake/Lobby](https://badges.gitter.im/polly-cmake/Lobby.svg)](https://gitter.im/polly-cmake/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +Collection of CMake toolchain files and scripts. + +| Linux/OSX | Windows | +|-------------------------------------------------|-----------------------------------------------------| +| [![Build Status][travis_status]][travis_builds] | [![Build Status][appveyor_status]][appveyor_builds] | + +[travis_status]: https://travis-ci.org/ruslo/polly.svg?branch=master +[travis_builds]: https://travis-ci.org/ruslo/polly/builds + +[appveyor_status]: https://ci.appveyor.com/api/projects/status/8x6thwc05mhvdxmo?svg=true +[appveyor_builds]: https://ci.appveyor.com/project/ruslo/polly/history + +Every toolchain defines compiler/flags and two variables: +* `POLLY_TOOLCHAIN_NAME` +* `POLLY_TOOLCHAIN_TAG` + +[First](https://github.com/ruslo/polly/wiki/Used-variables#polly_toolchain_name) +variable will be printed while processing file: +``` +-- [polly] Used toolchain: Name of toolchain A +-- The CXX compiler identification is Clang 5.0.0 +-- Check for working CXX compiler: /usr/bin/c++ +-- [polly] Used toolchain: Name of toolchain A +-- Check for working CXX compiler: /usr/bin/c++ -- works +-- Detecting CXX compiler ABI info +-- [polly] Used toolchain: Name of toolchain A +-- Detecting CXX compiler ABI info - done +-- [polly] Used toolchain: Name of toolchain A +-- Configuring done +-- Generating done +-- Build files have been written to: ... +``` +[Second](https://github.com/ruslo/polly/wiki/Used-variables#polly_toolchain_tag) +variable coincide with toolchain file name and *can* be used to define `CMAKE_INSTALL_PREFIX` like: +```cmake +set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/_install/${POLLY_TOOLCHAIN_TAG}") +``` +In this case targets can coexist simultaneously: +``` + - Project\ - + - CMakeLists.txt + - sources\ + - documentation\ + - ... + - _install\ - + - toolchain-A\ + - toolchain-B\ + - toolchain-C\ + - ... +``` + +*Note*: This is a core idea of the tagged builds in [hunter](https://github.com/ruslo/hunter#tagged-builds) package manager. + +## New documentation + +* https://polly.readthedocs.io + +## Toolchains + +* [default](https://github.com/ruslo/polly/wiki/Toolchain-list#default) +* [libcxx](https://github.com/ruslo/polly/wiki/Toolchain-list#libcxx) +* [clang-lto](https://github.com/ruslo/polly/wiki/Toolchain-list#clang-lto) +* [clang-libstdcxx](https://github.com/ruslo/polly/wiki/Toolchain-list#clang-libstdcxx) +* [custom-libcxx](https://github.com/ruslo/polly/wiki/Toolchain-list#custom-libcxx) +* [xcode](https://github.com/ruslo/polly/wiki/Toolchain-list#xcode) +* [osx-*](https://github.com/ruslo/polly/wiki/Toolchain-list#osx-a-b) +* [gcc](https://github.com/ruslo/polly/wiki/Toolchain-list#gcc) +* [gcc-4-8](https://github.com/ruslo/polly/wiki/Toolchain-list#gcc-4-8) +* Android + * [android-ndk-*](https://github.com/ruslo/polly/wiki/Toolchain-list#android-ndk-xxx) +* iOS + * [ios](https://github.com/ruslo/polly/wiki/Toolchain-list#ios) + * [ios-i386-armv7](https://github.com/ruslo/polly/wiki/Toolchain-list#ios-i386-armv7) + * [ios-nocodesign](https://github.com/ruslo/polly/wiki/Toolchain-list#ios-nocodesign) +* Raspberry Pi + * [raspberrypi2-cxx11](https://github.com/ruslo/polly/wiki/Toolchain-list#raspberrypi2-cxx11) +* Clang tools + * [analyze](https://github.com/ruslo/polly/wiki/Toolchain-list#analyze) + * [sanitize-address](https://github.com/ruslo/polly/wiki/Toolchain-list#sanitize-address) + * [sanitize-leak](https://github.com/ruslo/polly/wiki/Toolchain-list#sanitize-leak) + * [sanitize-memory](https://github.com/ruslo/polly/wiki/Toolchain-list#sanitize-memory) + * [sanitize-thread](https://github.com/ruslo/polly/wiki/Toolchain-list#sanitize-thread) +* Windows + * [vs-12-2013-win64](https://github.com/ruslo/polly/wiki/Toolchain-list#vs-12-2013-win64) + * [vs-12-2013](https://github.com/ruslo/polly/wiki/Toolchain-list#vs-12-2013) + * [vs-12-2013-xp](https://github.com/ruslo/polly/wiki/Toolchain-list#vs-12-2013-xp) + * [cygwin](https://github.com/ruslo/polly/wiki/Toolchain-list#cygwin) + * [mingw](https://github.com/ruslo/polly/wiki/Toolchain-list#mingw) + * [msys](https://github.com/ruslo/polly/wiki/Toolchain-list#msys) + * [nmake-vs-12-2013-win64](https://github.com/ruslo/polly/wiki/Toolchain-list#nmake-vs-12-2013-win64) + * [nmake-vs-12-2013](https://github.com/ruslo/polly/wiki/Toolchain-list#nmake-vs-12-2013) +* Cross compiling + * [linux-gcc-x64](https://github.com/ruslo/polly/wiki/Toolchain-list#linux-gcc-x64) + +## Usage +Just define [CMAKE_TOOLCHAIN_FILE][3] variable: +```bash +> cmake -H. -B_builds/clang-libstdcxx -DCMAKE_TOOLCHAIN_FILE=${POLLY_ROOT}/clang-libstdcxx.cmake -DCMAKE_VERBOSE_MAKEFILE=ON +-- [polly] Used toolchain: clang / GNU Standard C++ Library (libstdc++) / c++11 support +-- The CXX compiler identification is Clang 5.0.0 +-- Check for working CXX compiler: /usr/bin/c++ +-- [polly] Used toolchain: clang / GNU Standard C++ Library (libstdc++) / c++11 support +-- Check for working CXX compiler: /usr/bin/c++ -- works +-- Detecting CXX compiler ABI info +-- [polly] Used toolchain: clang / GNU Standard C++ Library (libstdc++) / c++11 support +-- Detecting CXX compiler ABI info - done +-- Configuring done +-- Generating done +-- Build files have been written to: /.../_builds/make-debug +``` +Take a look at make output, you must [see][6] `-stdlib=libstdc++` string: +``` +> cmake --build _builds/clang_libstdcxx +/usr/bin/c++ -std=c++11 -stdlib=libstdc++ -o CMakeFiles/.../main.cpp.o -c /.../main.cpp +``` + +## polly.py + +This is a python [script](https://github.com/ruslo/polly/tree/master/bin) that wrap cmake for you and automatically set: +* build directory for your toolchain. E.g. `_builds/xcode`, `_builds/libcxx-Debug`, `_builds/nmake-Release` +* local install directory. E.g. `_install/vs-12-2013-x64`, `_install/libcxx` +* start an IDE project (Xcode, Visual Studio) if option `--open` passed +* run `ctest` after the build done if option `--test` passed +* run `cpack` after the build done if option `--pack` passed +* create `OS X`/`iOS` framework if option `--framework` passed (can be used for broken iOS framework creation on CMake) + +Example of usage (also see `polly.py --help`): +* build Debug Xcode project: + * `polly.py --toolchain xcode --config Debug` (`_builds/xcode`) +* build and test Release Makefile project with `libcxx`: + * `polly.py --toolchain libcxx --config Release --test` (`_builds/libcxx-Release`) +* install Debug Xcode project: + * `polly.py --toolchain xcode --config Debug --install` (`_builds/xcode`, `_install/xcode`) + +## Examples +See [examples](https://github.com/ruslo/polly/tree/master/examples). +Please [read](https://github.com/ruslo/0/wiki/CMake) coding style and +agreements before start looking through examples (may explain a lot). +Take a look at the [Travis](https://travis-ci.org/) config files: +[mac](https://github.com/ruslo/polly/blob/master/.travis.yml) and [linux](https://github.com/ruslo/polly/blob/linux/.travis.yml), +it's quite self-explanatory. + +## Contributing + +See [CONTRIBUTING.md](https://github.com/ruslo/polly/blob/master/CONTRIBUTING.md). + +## Links + +* [Hunter package manager](https://github.com/ruslo/hunter) +* [Installation on Jenkins](https://github.com/ruslo/polly/wiki/Jenkins) +* Travis example: +[Mac OS X](https://travis-ci.org/forexample/hunter-simple/builds/28155372) and +[Linux](https://travis-ci.org/forexample/hunter-simple/builds/28154503) +* [Table of toolchains available for Travis CI/AppVeyor][7] +* [Travis, AppVeyor => GitHub deploy example](https://github.com/forexample/github-binary-release) + +[1]: https://github.com/ruslo/sugar/tree/master/cmake/core#sugar_install_ios_library +[2]: https://github.com/ruslo/sugar/tree/master/cmake/core#sugar_install_library +[3]: http://www.cmake.org/Wiki/CMake_Cross_Compiling#The_toolchain_file +[4]: https://github.com/ruslo/gitenv/blob/master/gitenv/paths.sh +[5]: https://github.com/ruslo/configs +[6]: https://travis-ci.org/ruslo/polly/jobs/14486268#L939 +[7]: https://github.com/ruslo/polly/wiki/Travis-CI-AppVeyor-support-table +[8]: https://github.com/ruslo/polly/blob/master/bin/polly.py diff --git a/tools/polly/analyze-cxx17.cmake b/tools/polly/analyze-cxx17.cmake new file mode 100644 index 0000000..91d9bc7 --- /dev/null +++ b/tools/polly/analyze-cxx17.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2014, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANALYZE_CXX17_CMAKE_) + return() +else() + set(POLLY_ANALYZE_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang static analyzer / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") + +set(CMAKE_CXX_COMPILER "${CMAKE_CURRENT_LIST_DIR}/scripts/clangxx-analyze.sh") +set(CMAKE_C_COMPILER "${CMAKE_CURRENT_LIST_DIR}/scripts/clang-analyze.sh") + +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "analyze") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/analyze.cmake b/tools/polly/analyze.cmake new file mode 100644 index 0000000..db498a4 --- /dev/null +++ b/tools/polly/analyze.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANALYZE_CMAKE_) + return() +else() + set(POLLY_ANALYZE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang static analyzer / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +set(CMAKE_CXX_COMPILER "${CMAKE_CURRENT_LIST_DIR}/scripts/clangxx-analyze.sh") +set(CMAKE_C_COMPILER "${CMAKE_CURRENT_LIST_DIR}/scripts/clang-analyze.sh") + +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "analyze") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid-sections.cmake b/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid-sections.cmake new file mode 100644 index 0000000..e1542ec --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid-sections.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_16_ARMEABI_V7A_NEON_CLANG_35_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_16_ARMEABI_V7A_NEON_CLANG_35_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang 3.5 / c++11 support / data-sections / function-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid.cmake b/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid.cmake new file mode 100644 index 0000000..4e58606 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_16_ARMEABI_V7A_NEON_CLANG_35_HID_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_16_ARMEABI_V7A_NEON_CLANG_35_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang 3.5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35.cmake b/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35.cmake new file mode 100644 index 0000000..8c3f282 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_16_ARMEABI_V7A_NEON_CLANG_35_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_16_ARMEABI_V7A_NEON_CLANG_35_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang 3.5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon.cmake b/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon.cmake new file mode 100644 index 0000000..a36e074 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-16-armeabi-v7a-neon.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_16_ARMEABI_V7A_NEON_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_16_ARMEABI_V7A_NEON_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-16-x86-hid-sections.cmake b/tools/polly/android-ndk-r10e-api-16-x86-hid-sections.cmake new file mode 100644 index 0000000..e1af18a --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-16-x86-hid-sections.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2015, Ruslan Baratov, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_16_X86_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_16_X86_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "x86") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +hidden visibility / function-sections / data-sections / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-16-x86-hid.cmake b/tools/polly/android-ndk-r10e-api-16-x86-hid.cmake new file mode 100644 index 0000000..2e7b8f3 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-16-x86-hid.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_16_X86_HID_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_16_X86_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "x86") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +hidden visibility / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-16-x86.cmake b/tools/polly/android-ndk-r10e-api-16-x86.cmake new file mode 100644 index 0000000..2496a68 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-16-x86.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_16_X86_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_16_X86_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "x86") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-c11.cmake b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-c11.cmake new file mode 100644 index 0000000..0ad6b45 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-c11.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_C11_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_C11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 / c11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/c11.cmake") diff --git a/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..ff69f25 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections-lto.cmake b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections-lto.cmake new file mode 100644 index 0000000..d6a8799 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections-lto.cmake @@ -0,0 +1,41 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support / hidden / function-sections / data-sections / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") # after 'os/android.cmake' diff --git a/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections.cmake b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections.cmake new file mode 100644 index 0000000..4a655a4 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support / hidden / function-sections / data-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon.cmake b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon.cmake new file mode 100644 index 0000000..690f1c5 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-19-armeabi-v7a-neon.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_19_ARMEABI_V7A_NEON_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-arm64-v8a-clang-35.cmake b/tools/polly/android-ndk-r10e-api-21-arm64-v8a-clang-35.cmake new file mode 100644 index 0000000..b91e622 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-arm64-v8a-clang-35.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_CLANG_35_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_CLANG_35_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang 3.5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid-sections.cmake b/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid-sections.cmake new file mode 100644 index 0000000..f3fa00c --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid-sections.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_GCC_49_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_GCC_49_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "4.9") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +GCC 4.9 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid.cmake b/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid.cmake new file mode 100644 index 0000000..69c5c7d --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_GCC_49_HID_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_GCC_49_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "4.9") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +GCC 4.9 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49.cmake b/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49.cmake new file mode 100644 index 0000000..f5e47ed --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-arm64-v8a-gcc-49.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_GCC_49_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_GCC_49_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "4.9") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +GCC 4.9 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-arm64-v8a.cmake b/tools/polly/android-ndk-r10e-api-21-arm64-v8a.cmake new file mode 100644 index 0000000..d194d2b --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-arm64-v8a.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARM64_V8A_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-armeabi-clang-libcxx.cmake b/tools/polly/android-ndk-r10e-api-21-armeabi-clang-libcxx.cmake new file mode 100644 index 0000000..34412d4 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-armeabi-clang-libcxx.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-clang-35.cmake b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-clang-35.cmake new file mode 100644 index 0000000..3fdc584 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-clang-35.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_NEON_CLANG_35_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_NEON_CLANG_35_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang 3.5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..109225b --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-hid-sections.cmake b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-hid-sections.cmake new file mode 100644 index 0000000..79be94d --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon-hid-sections.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_NEON_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_NEON_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support / hidden / function-sections / data-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon.cmake b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon.cmake new file mode 100644 index 0000000..2997b0c --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a-neon.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_NEON_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_NEON_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-armeabi-v7a.cmake b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a.cmake new file mode 100644 index 0000000..0cb8c24 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-armeabi-v7a.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_V7A_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-armeabi.cmake b/tools/polly/android-ndk-r10e-api-21-armeabi.cmake new file mode 100644 index 0000000..7a0ea9b --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-armeabi.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_ARMEABI_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-mips-clang-libcxx.cmake b/tools/polly/android-ndk-r10e-api-21-mips-clang-libcxx.cmake new file mode 100644 index 0000000..6565084 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-mips-clang-libcxx.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_MIPS_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_MIPS_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "mips") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-mips.cmake b/tools/polly/android-ndk-r10e-api-21-mips.cmake new file mode 100644 index 0000000..48b489a --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-mips.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_MIPS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_MIPS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "mips") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-mips64.cmake b/tools/polly/android-ndk-r10e-api-21-mips64.cmake new file mode 100644 index 0000000..d3d017f --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-mips64.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_MIPS64_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_MIPS64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "mips64") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-x86-64-hid-sections.cmake b/tools/polly/android-ndk-r10e-api-21-x86-64-hid-sections.cmake new file mode 100644 index 0000000..b93b1e4 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-x86-64-hid-sections.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2015, Ruslan Baratov, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_X86_64_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_X86_64_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +hidden visibility / function-sections / data-sections \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-x86-64-hid.cmake b/tools/polly/android-ndk-r10e-api-21-x86-64-hid.cmake new file mode 100644 index 0000000..6b9c141 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-x86-64-hid.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_X86_64_HID_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_X86_64_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +hidden visibility / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-x86-64.cmake b/tools/polly/android-ndk-r10e-api-21-x86-64.cmake new file mode 100644 index 0000000..19aa140 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-x86-64.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_X86_64_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_X86_64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-x86-clang-libcxx.cmake b/tools/polly/android-ndk-r10e-api-21-x86-clang-libcxx.cmake new file mode 100644 index 0000000..b962071 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-x86-clang-libcxx.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_X86_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_X86_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-21-x86.cmake b/tools/polly/android-ndk-r10e-api-21-x86.cmake new file mode 100644 index 0000000..f1883e0 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-21-x86.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_21_X86_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_21_X86_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r10e-api-8-armeabi-v7a.cmake b/tools/polly/android-ndk-r10e-api-8-armeabi-v7a.cmake new file mode 100644 index 0000000..aaa1c77 --- /dev/null +++ b/tools/polly/android-ndk-r10e-api-8-armeabi-v7a.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R10E_API_8_ARMEABI_V7A_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R10E_API_8_ARMEABI_V7A_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") +set(CMAKE_SYSTEM_VERSION "8") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-armeabi-cxx14.cmake b/tools/polly/android-ndk-r11c-api-16-armeabi-cxx14.cmake new file mode 100644 index 0000000..5ad35e0 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-armeabi-cxx14.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_CXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-cxx14.cmake b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-cxx14.cmake new file mode 100644 index 0000000..234df07 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-cxx14.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_CXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35-hid.cmake b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35-hid.cmake new file mode 100644 index 0000000..a2cab6a --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35-hid.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_NEON_CLANG_35_HID_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_NEON_CLANG_35_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang 3.5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35.cmake b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35.cmake new file mode 100644 index 0000000..2117ec0 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_NEON_CLANG_35_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_NEON_CLANG_35_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang 3.5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-cxx14.cmake b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-cxx14.cmake new file mode 100644 index 0000000..a898675 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon-cxx14.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_NEON_CXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_NEON_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon.cmake b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon.cmake new file mode 100644 index 0000000..fe19039 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a-neon.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_NEON_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_NEON_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-armeabi-v7a.cmake b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a.cmake new file mode 100644 index 0000000..276e94e --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-armeabi-v7a.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_V7A_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-armeabi.cmake b/tools/polly/android-ndk-r11c-api-16-armeabi.cmake new file mode 100644 index 0000000..6ec259d --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-armeabi.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_ARMEABI_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-x86-hid.cmake b/tools/polly/android-ndk-r11c-api-16-x86-hid.cmake new file mode 100644 index 0000000..4f29b1b --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-x86-hid.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_X86_HID_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_X86_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "x86") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +hidden visibility / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-16-x86.cmake b/tools/polly/android-ndk-r11c-api-16-x86.cmake new file mode 100644 index 0000000..e99c6ab --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-16-x86.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_16_X86_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_16_X86_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "x86") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-19-armeabi-v7a-neon.cmake b/tools/polly/android-ndk-r11c-api-19-armeabi-v7a-neon.cmake new file mode 100644 index 0000000..c120656 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-19-armeabi-v7a-neon.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_19_ARMEABI_V7A_NEON_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_19_ARMEABI_V7A_NEON_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-arm64-v8a-clang-35.cmake b/tools/polly/android-ndk-r11c-api-21-arm64-v8a-clang-35.cmake new file mode 100644 index 0000000..83d70d8 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-arm64-v8a-clang-35.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_ARM64_V8A_CLANG_35_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_ARM64_V8A_CLANG_35_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang 3.5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-arm64-v8a-gcc-49-hid.cmake b/tools/polly/android-ndk-r11c-api-21-arm64-v8a-gcc-49-hid.cmake new file mode 100644 index 0000000..592ccfb --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-arm64-v8a-gcc-49-hid.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_ARM64_V8A_GCC_49_HID_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_ARM64_V8A_GCC_49_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "4.9") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +GCC 4.9 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-arm64-v8a-gcc-49.cmake b/tools/polly/android-ndk-r11c-api-21-arm64-v8a-gcc-49.cmake new file mode 100644 index 0000000..9c24b97 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-arm64-v8a-gcc-49.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_ARM64_V8A_GCC_49_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_ARM64_V8A_GCC_49_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "4.9") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +GCC 4.9 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-arm64-v8a.cmake b/tools/polly/android-ndk-r11c-api-21-arm64-v8a.cmake new file mode 100644 index 0000000..2f531c3 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-arm64-v8a.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_ARM64_V8A_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_ARM64_V8A_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-armeabi-v7a-neon-clang-35.cmake b/tools/polly/android-ndk-r11c-api-21-armeabi-v7a-neon-clang-35.cmake new file mode 100644 index 0000000..0214027 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-armeabi-v7a-neon-clang-35.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_ARMEABI_V7A_NEON_CLANG_35_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_ARMEABI_V7A_NEON_CLANG_35_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang3.5") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang 3.5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-armeabi-v7a-neon.cmake b/tools/polly/android-ndk-r11c-api-21-armeabi-v7a-neon.cmake new file mode 100644 index 0000000..7648f6b --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-armeabi-v7a-neon.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_ARMEABI_V7A_NEON_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_ARMEABI_V7A_NEON_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-armeabi-v7a.cmake b/tools/polly/android-ndk-r11c-api-21-armeabi-v7a.cmake new file mode 100644 index 0000000..b8bd22d --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-armeabi-v7a.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_ARMEABI_V7A_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_ARMEABI_V7A_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-armeabi.cmake b/tools/polly/android-ndk-r11c-api-21-armeabi.cmake new file mode 100644 index 0000000..5015903 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-armeabi.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_ARMEABI_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_ARMEABI_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-mips.cmake b/tools/polly/android-ndk-r11c-api-21-mips.cmake new file mode 100644 index 0000000..1a80287 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-mips.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_MIPS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_MIPS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "mips") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-mips64.cmake b/tools/polly/android-ndk-r11c-api-21-mips64.cmake new file mode 100644 index 0000000..f44cdcb --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-mips64.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_MIPS64_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_MIPS64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "mips64") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-x86-64-hid.cmake b/tools/polly/android-ndk-r11c-api-21-x86-64-hid.cmake new file mode 100644 index 0000000..414110f --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-x86-64-hid.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_X86_64_HID_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_X86_64_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +hidden visibility / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-x86-64.cmake b/tools/polly/android-ndk-r11c-api-21-x86-64.cmake new file mode 100644 index 0000000..9a7ee02 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-x86-64.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_X86_64_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_X86_64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-21-x86.cmake b/tools/polly/android-ndk-r11c-api-21-x86.cmake new file mode 100644 index 0000000..f413f63 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-21-x86.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_21_X86_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_21_X86_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r11c-api-8-armeabi-v7a.cmake b/tools/polly/android-ndk-r11c-api-8-armeabi-v7a.cmake new file mode 100644 index 0000000..c4eceb0 --- /dev/null +++ b/tools/polly/android-ndk-r11c-api-8-armeabi-v7a.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R11C_API_8_ARMEABI_V7A_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R11C_API_8_ARMEABI_V7A_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r11c") +set(CMAKE_SYSTEM_VERSION "8") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r12b-api-19-armeabi-v7a-neon.cmake b/tools/polly/android-ndk-r12b-api-19-armeabi-v7a-neon.cmake new file mode 100644 index 0000000..e1d80ef --- /dev/null +++ b/tools/polly/android-ndk-r12b-api-19-armeabi-v7a-neon.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R12B_API_19_ARMEABI_V7A_NEON_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R12B_API_19_ARMEABI_V7A_NEON_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r12b") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r13b-api-19-armeabi-v7a-neon.cmake b/tools/polly/android-ndk-r13b-api-19-armeabi-v7a-neon.cmake new file mode 100644 index 0000000..caf5cfd --- /dev/null +++ b/tools/polly/android-ndk-r13b-api-19-armeabi-v7a-neon.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R13B_API_19_ARMEABI_V7A_NEON_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R13B_API_19_ARMEABI_V7A_NEON_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r13b") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r14-api-16-armeabi-v7a-neon-clang-hid-sections-lto.cmake b/tools/polly/android-ndk-r14-api-16-armeabi-v7a-neon-clang-hid-sections-lto.cmake new file mode 100644 index 0000000..b8bc4bd --- /dev/null +++ b/tools/polly/android-ndk-r14-api-16-armeabi-v7a-neon-clang-hid-sections-lto.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R14_API_16_ARMEABI_V7A_NEON_CLANG_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14_API_16_ARMEABI_V7A_NEON_CLANG_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang / c++11 support / data-sections / function-sections / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") # after os/android.cmake diff --git a/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-c11.cmake b/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-c11.cmake new file mode 100644 index 0000000..5ff851e --- /dev/null +++ b/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-c11.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R14_API_19_ARMEABI_V7A_NEON_C11_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14_API_19_ARMEABI_V7A_NEON_C11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support / c11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/c11.cmake") diff --git a/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..44e6213 --- /dev/null +++ b/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R14_API_19_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14_API_19_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-clang.cmake b/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-clang.cmake new file mode 100644 index 0000000..8123746 --- /dev/null +++ b/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-clang.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R14_API_19_ARMEABI_V7A_NEON_CLANG_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14_API_19_ARMEABI_V7A_NEON_CLANG_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-hid-sections-lto.cmake b/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-hid-sections-lto.cmake new file mode 100644 index 0000000..b6ea6a7 --- /dev/null +++ b/tools/polly/android-ndk-r14-api-19-armeabi-v7a-neon-hid-sections-lto.cmake @@ -0,0 +1,41 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R14_API_19_ARMEABI_V7A_NEON_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14_API_19_ARMEABI_V7A_NEON_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support / hidden / function-sections / data-sections / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") # after 'os/android.cmake' diff --git a/tools/polly/android-ndk-r14-api-21-arm64-v8a-clang-hid-sections-lto.cmake b/tools/polly/android-ndk-r14-api-21-arm64-v8a-clang-hid-sections-lto.cmake new file mode 100644 index 0000000..4976c42 --- /dev/null +++ b/tools/polly/android-ndk-r14-api-21-arm64-v8a-clang-hid-sections-lto.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R14_API_21_ARM64_V8A_CLANG_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14_API_21_ARM64_V8A_CLANG_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / data-sections / function-sections / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") # after os/android.cmake diff --git a/tools/polly/android-ndk-r14-api-21-arm64-v8a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r14-api-21-arm64-v8a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..141887b --- /dev/null +++ b/tools/polly/android-ndk-r14-api-21-arm64-v8a-neon-clang-libcxx.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R14_API_21_ARM64_V8A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14_API_21_ARM64_V8A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r14-api-21-x86-64.cmake b/tools/polly/android-ndk-r14-api-21-x86-64.cmake new file mode 100644 index 0000000..1bfd4c8 --- /dev/null +++ b/tools/polly/android-ndk-r14-api-21-x86-64.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016, Michele Caini +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R14_API_21_X86_64_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14_API_21_X86_64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r14b-api-21-armeabi-clang-libcxx.cmake b/tools/polly/android-ndk-r14b-api-21-armeabi-clang-libcxx.cmake new file mode 100644 index 0000000..1e1ba64 --- /dev/null +++ b/tools/polly/android-ndk-r14b-api-21-armeabi-clang-libcxx.cmake @@ -0,0 +1,29 @@ +if(DEFINED POLLY_ANDROID_NDK_R14B_API_21_ARMEABI_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14B_API_21_ARMEABI_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r14b-api-21-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r14b-api-21-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..6ecb18a --- /dev/null +++ b/tools/polly/android-ndk-r14b-api-21-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,29 @@ +if(DEFINED POLLY_ANDROID_NDK_R14B_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14B_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r14b-api-21-mips-clang-libcxx.cmake b/tools/polly/android-ndk-r14b-api-21-mips-clang-libcxx.cmake new file mode 100644 index 0000000..dc7dac8 --- /dev/null +++ b/tools/polly/android-ndk-r14b-api-21-mips-clang-libcxx.cmake @@ -0,0 +1,28 @@ +if(DEFINED POLLY_ANDROID_NDK_R14B_API_21_MIPS_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14B_API_21_MIPS_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "mips") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r14b-api-21-x86-clang-libcxx.cmake b/tools/polly/android-ndk-r14b-api-21-x86-clang-libcxx.cmake new file mode 100644 index 0000000..caf0c1f --- /dev/null +++ b/tools/polly/android-ndk-r14b-api-21-x86-clang-libcxx.cmake @@ -0,0 +1,28 @@ +if(DEFINED POLLY_ANDROID_NDK_R14B_API_21_X86_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R14B_API_21_X86_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r14b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-16-armeabi-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-16-armeabi-clang-libcxx.cmake new file mode 100644 index 0000000..eeae2e0 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-16-armeabi-clang-libcxx.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_16_ARMEABI_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_16_ARMEABI_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-16-armeabi-v7a-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-16-armeabi-v7a-clang-libcxx.cmake new file mode 100644 index 0000000..4c13a73 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-16-armeabi-v7a-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_16_ARMEABI_V7A_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_16_ARMEABI_V7A_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-16-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-16-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..2635cbe --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-16-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_16_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_16_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-16-mips-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-16-mips-clang-libcxx.cmake new file mode 100644 index 0000000..0da67c7 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-16-mips-clang-libcxx.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_16_MIPS_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_16_MIPS_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "mips") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-16-x86-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-16-x86-clang-libcxx.cmake new file mode 100644 index 0000000..9a513a8 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-16-x86-clang-libcxx.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_16_X86_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_16_X86_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "x86") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-21-arm64-v8a-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-21-arm64-v8a-clang-libcxx.cmake new file mode 100644 index 0000000..c52a3e7 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-21-arm64-v8a-clang-libcxx.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_21_ARM64_V8A_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_21_ARM64_V8A_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-21-arm64-v8a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-21-arm64-v8a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..d954201 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-21-arm64-v8a-neon-clang-libcxx.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_21_ARM64_V8A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_21_ARM64_V8A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-21-armeabi-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-21-armeabi-clang-libcxx.cmake new file mode 100644 index 0000000..8c6aa16 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-21-armeabi-clang-libcxx.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_21_ARMEABI_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_21_ARMEABI_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-21-armeabi-v7a-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-21-armeabi-v7a-clang-libcxx.cmake new file mode 100644 index 0000000..c7e3021 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-21-armeabi-v7a-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_21_ARMEABI_V7A_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_21_ARMEABI_V7A_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..a99dcf9 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-21-mips-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-21-mips-clang-libcxx.cmake new file mode 100644 index 0000000..51999b3 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-21-mips-clang-libcxx.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, Michele Caini +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_21_MIPS_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_21_MIPS_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "mips") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-21-x86-64-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-21-x86-64-clang-libcxx.cmake new file mode 100644 index 0000000..02dd359 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-21-x86-64-clang-libcxx.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_21_X86_64_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_21_X86_64_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-21-x86-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-21-x86-clang-libcxx.cmake new file mode 100644 index 0000000..0ed76d9 --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-21-x86-clang-libcxx.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_21_X86_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_21_X86_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r15c-api-24-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r15c-api-24-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..0636f3a --- /dev/null +++ b/tools/polly/android-ndk-r15c-api-24-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2015-2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R15C_API_24_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R15C_API_24_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r15c") +set(CMAKE_SYSTEM_VERSION "24") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-16-armeabi-v7a-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-16-armeabi-v7a-clang-libcxx14.cmake new file mode 100644 index 0000000..574ced9 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-16-armeabi-v7a-clang-libcxx14.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_16_ARMEABI_V7A_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_16_ARMEABI_V7A_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-16-armeabi-v7a-thumb-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-16-armeabi-v7a-thumb-clang-libcxx14.cmake new file mode 100644 index 0000000..575c6a0 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-16-armeabi-v7a-thumb-clang-libcxx14.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_16_ARMEABI_V7A_THUMB_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_16_ARMEABI_V7A_THUMB_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE FALSE) # 16-bit Thumb +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +16-bit Thumb / Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-16-x86-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-16-x86-clang-libcxx14.cmake new file mode 100644 index 0000000..bd4e139 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-16-x86-clang-libcxx14.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_16_X86_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_16_X86_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "x86") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-19-gcc-49-armeabi-v7a-neon-libcxx-hid-sections-lto.cmake b/tools/polly/android-ndk-r16b-api-19-gcc-49-armeabi-v7a-neon-libcxx-hid-sections-lto.cmake new file mode 100644 index 0000000..3b7f68f --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-19-gcc-49-armeabi-v7a-neon-libcxx-hid-sections-lto.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2015-2018, David Hirvonen +# Copyright (c) 2015-2018, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_19_GCC49_ARMEABI_V7A_NEON_LIBCXX_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_19_GCC49_ARMEABI_V7A_NEON_LIBCXX_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "4.9") # .: GCC of specified version +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support / hidden / function-sections / data-sections / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") # after 'os/android.cmake' diff --git a/tools/polly/android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..db88a25 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_ARM64_V8A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_ARM64_V8A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx14.cmake new file mode 100644 index 0000000..5520c7b --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx14.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_ARM64_V8A_NEON_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_ARM64_V8A_NEON_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-armeabi-clang-libcxx.cmake b/tools/polly/android-ndk-r16b-api-21-armeabi-clang-libcxx.cmake new file mode 100644 index 0000000..e31097f --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-armeabi-clang-libcxx.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-armeabi-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-21-armeabi-clang-libcxx14.cmake new file mode 100644 index 0000000..d580b4d --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-armeabi-clang-libcxx14.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi") +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx.cmake b/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx.cmake new file mode 100644 index 0000000..576799d --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_V7A_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_V7A_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx14.cmake new file mode 100644 index 0000000..ef5a084 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx14.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_V7A_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_V7A_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..54cf885 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx14.cmake new file mode 100644 index 0000000..0797fcc --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx14.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_ARMEABI_V7A_NEON_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-x86-64-clang-libcxx.cmake b/tools/polly/android-ndk-r16b-api-21-x86-64-clang-libcxx.cmake new file mode 100644 index 0000000..0ce8d0a --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-x86-64-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2017, Robert Nitsch +# Copyright (c) 2018, Chanwoo Noh +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_X86_64_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_X86_64_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-21-x86-clang-libcxx.cmake b/tools/polly/android-ndk-r16b-api-21-x86-clang-libcxx.cmake new file mode 100644 index 0000000..30ee4a3 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-21-x86-clang-libcxx.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_21_X86_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_21_X86_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-24-arm64-v8a-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-24-arm64-v8a-clang-libcxx14.cmake new file mode 100644 index 0000000..27d9d19 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-24-arm64-v8a-clang-libcxx14.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_24_ARM64_V8A_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_24_ARM64_V8A_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "24") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..2aff1a2 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_24_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_24_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "24") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx14.cmake b/tools/polly/android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx14.cmake new file mode 100644 index 0000000..4bd4e20 --- /dev/null +++ b/tools/polly/android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx14.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2015-2018, David Hirvonen +# Copyright (c) 2017-2018, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R16B_API_24_ARMEABI_V7A_NEON_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R16B_API_24_ARMEABI_V7A_NEON_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r16b") +set(CMAKE_SYSTEM_VERSION "24") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r17-api-16-armeabi-v7a-clang-libcxx14.cmake b/tools/polly/android-ndk-r17-api-16-armeabi-v7a-clang-libcxx14.cmake new file mode 100644 index 0000000..9f9cf12 --- /dev/null +++ b/tools/polly/android-ndk-r17-api-16-armeabi-v7a-clang-libcxx14.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R17_API_16_ARMEABI_V7A_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R17_API_16_ARMEABI_V7A_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r17") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r17-api-16-x86-clang-libcxx14.cmake b/tools/polly/android-ndk-r17-api-16-x86-clang-libcxx14.cmake new file mode 100644 index 0000000..35a3cd1 --- /dev/null +++ b/tools/polly/android-ndk-r17-api-16-x86-clang-libcxx14.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R17_API_16_X86_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R17_API_16_X86_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r17") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "x86") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r17-api-19-armeabi-v7a-neon-clang-libcxx.cmake b/tools/polly/android-ndk-r17-api-19-armeabi-v7a-neon-clang-libcxx.cmake new file mode 100644 index 0000000..5251324 --- /dev/null +++ b/tools/polly/android-ndk-r17-api-19-armeabi-v7a-neon-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R17_API_19_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R17_API_19_ARMEABI_V7A_NEON_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r17") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r17-api-19-armeabi-v7a-neon-hid-sections.cmake b/tools/polly/android-ndk-r17-api-19-armeabi-v7a-neon-hid-sections.cmake new file mode 100644 index 0000000..1018772 --- /dev/null +++ b/tools/polly/android-ndk-r17-api-19-armeabi-v7a-neon-hid-sections.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# Copyright (c) 2015, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R17_API_19_ARMEABI_V7A_NEON_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R17_API_19_ARMEABI_V7A_NEON_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r17") +set(CMAKE_SYSTEM_VERSION "19") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON TRUE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +NEON / 32-bit ARM / c++11 support / hidden / function-sections / data-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r17-api-21-arm64-v8a-neon-clang-libcxx14.cmake b/tools/polly/android-ndk-r17-api-21-arm64-v8a-neon-clang-libcxx14.cmake new file mode 100644 index 0000000..fb5e90d --- /dev/null +++ b/tools/polly/android-ndk-r17-api-21-arm64-v8a-neon-clang-libcxx14.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2017, Robert Nitsch +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R17_API_21_ARM64_V8A_NEON_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R17_API_21_ARM64_V8A_NEON_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r17") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r17-api-21-x86-64-clang-libcxx14.cmake b/tools/polly/android-ndk-r17-api-21-x86-64-clang-libcxx14.cmake new file mode 100644 index 0000000..1590b3f --- /dev/null +++ b/tools/polly/android-ndk-r17-api-21-x86-64-clang-libcxx14.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2017, Robert Nitsch +# Copyright (c) 2018, Chanwoo Noh +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R17_API_21_X86_64_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R17_API_21_X86_64_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r17") +set(CMAKE_SYSTEM_VERSION "21") +set(CMAKE_ANDROID_ARCH_ABI "x86_64") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r17-api-24-arm64-v8a-clang-libcxx14.cmake b/tools/polly/android-ndk-r17-api-24-arm64-v8a-clang-libcxx14.cmake new file mode 100644 index 0000000..bd55652 --- /dev/null +++ b/tools/polly/android-ndk-r17-api-24-arm64-v8a-clang-libcxx14.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R17_API_24_ARM64_V8A_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R17_API_24_ARM64_V8A_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r17") +set(CMAKE_SYSTEM_VERSION "24") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r18-api-24-arm64-v8a-clang-libcxx14.cmake b/tools/polly/android-ndk-r18-api-24-arm64-v8a-clang-libcxx14.cmake new file mode 100644 index 0000000..d4dcbbe --- /dev/null +++ b/tools/polly/android-ndk-r18-api-24-arm64-v8a-clang-libcxx14.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R18_API_24_ARM64_V8A_CLANG_LIBCXX14_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R18_API_24_ARM64_V8A_CLANG_LIBCXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r18") +set(CMAKE_SYSTEM_VERSION "24") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++14 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r18b-api-16-armeabi-v7a-clang-libcxx.cmake b/tools/polly/android-ndk-r18b-api-16-armeabi-v7a-clang-libcxx.cmake new file mode 100644 index 0000000..c4155c9 --- /dev/null +++ b/tools/polly/android-ndk-r18b-api-16-armeabi-v7a-clang-libcxx.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R18B_API_16_ARMEABI_V7A_CLANG_LIBCXX_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R18B_API_16_ARMEABI_V7A_CLANG_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r18b") +set(CMAKE_SYSTEM_VERSION "16") +set(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a") +set(CMAKE_ANDROID_ARM_NEON FALSE) +set(CMAKE_ANDROID_ARM_MODE TRUE) # 32-bit ARM +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +32-bit ARM / Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-ndk-r18b-api-24-arm64-v8a-clang-libcxx11.cmake b/tools/polly/android-ndk-r18b-api-24-arm64-v8a-clang-libcxx11.cmake new file mode 100644 index 0000000..d2c5ae8 --- /dev/null +++ b/tools/polly/android-ndk-r18b-api-24-arm64-v8a-clang-libcxx11.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# Copyright (c) 2017-2018, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_ANDROID_NDK_R18b_API_24_ARM64_V8A_CLANG_LIBCXX11_CMAKE_) + return() +else() + set(POLLY_ANDROID_NDK_R18b_API_24_ARM64_V8A_CLANG_LIBCXX11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r18b") +set(CMAKE_SYSTEM_VERSION "24") +set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a") +set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang") +set(CMAKE_ANDROID_STL_TYPE "c++_static") # LLVM libc++ static + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${CMAKE_SYSTEM_VERSION} / ${CMAKE_ANDROID_ARCH_ABI} / \ +Clang / c++11 support / libc++ static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/android.cmake") diff --git a/tools/polly/android-vc-ndk-r10e-api-19-arm-clang-3-6.cmake b/tools/polly/android-vc-ndk-r10e-api-19-arm-clang-3-6.cmake new file mode 100644 index 0000000..493daed --- /dev/null +++ b/tools/polly/android-vc-ndk-r10e-api-19-arm-clang-3-6.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_VC_NDK_R10E_API_19_ARM_CLANG_3_6_CMAKE_) + return() +else() + set(POLLY_ANDROID_VC_NDK_R10E_API_19_ARM_CLANG_3_6_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") # default +set(ANDROID_NATIVE_API_LEVEL "19") +set(ANDROID_ABI "armeabi") +set(CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET "Clang_3_6") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${ANDROID_NATIVE_API_LEVEL} / ${ANDROID_ABI} / \ +${CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET} / \ +c++11 support" + "Visual Studio 14 2015 ARM" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/vc-mdd-android.cmake") diff --git a/tools/polly/android-vc-ndk-r10e-api-19-arm-gcc-4-9.cmake b/tools/polly/android-vc-ndk-r10e-api-19-arm-gcc-4-9.cmake new file mode 100644 index 0000000..ca1a5ef --- /dev/null +++ b/tools/polly/android-vc-ndk-r10e-api-19-arm-gcc-4-9.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_VC_NDK_R10E_API_19_ARM_GCC_4_9_CMAKE_) + return() +else() + set(POLLY_ANDROID_VC_NDK_R10E_API_19_ARM_GCC_4_9_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") # default +set(ANDROID_NATIVE_API_LEVEL "19") +set(ANDROID_ABI "armeabi") +set(CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET "Gcc_4_9") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${ANDROID_NATIVE_API_LEVEL} / ${ANDROID_ABI} / \ +${CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET} / \ +c++11 support" + "Visual Studio 14 2015 ARM" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/vc-mdd-android.cmake") diff --git a/tools/polly/android-vc-ndk-r10e-api-19-x86-clang-3-6.cmake b/tools/polly/android-vc-ndk-r10e-api-19-x86-clang-3-6.cmake new file mode 100644 index 0000000..7a6a8b0 --- /dev/null +++ b/tools/polly/android-vc-ndk-r10e-api-19-x86-clang-3-6.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_VC_NDK_R10E_API_19_X86_CLANG_3_6_CMAKE_) + return() +else() + set(POLLY_ANDROID_VC_NDK_R10E_API_19_X86_CLANG_3_6_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") # default +set(ANDROID_NATIVE_API_LEVEL "19") +set(ANDROID_ABI "x86") +set(CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET "Clang_3_6") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${ANDROID_NATIVE_API_LEVEL} / ${ANDROID_ABI} / \ +${CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET} / \ +c++11 support" + "Visual Studio 14 2015" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/vc-mdd-android.cmake") diff --git a/tools/polly/android-vc-ndk-r10e-api-21-arm-clang-3-6.cmake b/tools/polly/android-vc-ndk-r10e-api-21-arm-clang-3-6.cmake new file mode 100644 index 0000000..52160be --- /dev/null +++ b/tools/polly/android-vc-ndk-r10e-api-21-arm-clang-3-6.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ANDROID_VC_NDK_R10E_API_21_ARM_CLANG_3_6_CMAKE_) + return() +else() + set(POLLY_ANDROID_VC_NDK_R10E_API_21_ARM_CLANG_3_6_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(ANDROID_NDK_VERSION "r10e") # default +set(ANDROID_NATIVE_API_LEVEL "21") +set(ANDROID_ABI "armeabi") +set(CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET "Clang_3_6") + +polly_init( + "Android NDK ${ANDROID_NDK_VERSION} / \ +API ${ANDROID_NATIVE_API_LEVEL} / ${ANDROID_ABI} / \ +${CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET} / \ +c++11 support" + "Visual Studio 14 2015 ARM" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") # before toolchain! + +include("${CMAKE_CURRENT_LIST_DIR}/os/vc-mdd-android.cmake") diff --git a/tools/polly/appveyor.yml b/tools/polly/appveyor.yml new file mode 100644 index 0000000..3ee7c47 --- /dev/null +++ b/tools/polly/appveyor.yml @@ -0,0 +1,72 @@ +# Windows (https://github.com/travis-ci-tester/toolchain-table) + +environment: + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + TOOLCHAIN: "vs-15-2017-cxx17" + EXAMPLE: 01-executable + CONFIG: Release + + - TOOLCHAIN: "ninja-vs-12-2013-win64" + EXAMPLE: 01-executable + CONFIG: Release + + - TOOLCHAIN: "nmake-vs-12-2013-win64" + EXAMPLE: 01-executable + CONFIG: Release + + - TOOLCHAIN: "vs-12-2013" + EXAMPLE: 01-executable + CONFIG: Release + + - TOOLCHAIN: "vs-14-2015" + EXAMPLE: 01-executable + CONFIG: Release + + - TOOLCHAIN: "mingw-cxx17" + EXAMPLE: 01-executable + CONFIG: Release + + - TOOLCHAIN: "msys-cxx14" + EXAMPLE: 01-executable + CONFIG: Release + + - TOOLCHAIN: "vs-14-2015" + EXAMPLE: 02-library + CONFIG: Release + + - TOOLCHAIN: "vs-14-2015" + EXAMPLE: 03-shared-link + CONFIG: Release + +install: + # Python 3 + - cmd: set PATH=C:\Python34-x64;C:\Python34-x64\Scripts;%PATH% + + # Install Python package 'requests' + - cmd: pip install requests + + # Install dependencies (CMake, Ninja) + - cmd: set POLLY_SOURCE_DIR=%cd% + - cmd: python %POLLY_SOURCE_DIR%\bin\install-ci-dependencies.py + + # Tune locations + - cmd: set PATH=%cd%\_ci\cmake\bin;%PATH% + - cmd: set PATH=%cd%\_ci\ninja;%PATH% + + # Remove entry with sh.exe from PATH to fix error with MinGW toolchain + # (For MinGW make to work correctly sh.exe must NOT be in your path) + # * http://stackoverflow.com/a/3870338/2288008 + - cmd: set PATH=%PATH:C:\Program Files\Git\usr\bin;=% + + - 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 + +build_script: + - cmd: python %POLLY_SOURCE_DIR%\bin\build.py --home examples/%EXAMPLE% --toolchain %TOOLCHAIN% --config %CONFIG% --verbose --clear --install --test + +branches: + except: + - /^pr\..*/ diff --git a/tools/polly/arm-openwrt-linux-muslgnueabi.cmake b/tools/polly/arm-openwrt-linux-muslgnueabi.cmake new file mode 100644 index 0000000..00afa8c --- /dev/null +++ b/tools/polly/arm-openwrt-linux-muslgnueabi.cmake @@ -0,0 +1,46 @@ +# Copyright (c) 2017, NeroBurner +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_ARM_OPENWRT_LINUX_MUSLGNUEABI_) + return() +else() + set(POLLY_ARM_OPENWRT_LINUX_MUSLGNUEABI_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Linux / gcc / OpenWRT / MUSL / c++11 support / cortex-a9" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +string(COMPARE EQUAL "$ENV{ARM_OPENWRT_LINUX_MUSLGNUEABI_ROOT}" "" _is_empty) +if(_is_empty) + polly_fatal_error("Environment variable 'ARM_OPENWRT_LINUX_MUSLGNUEABI_ROOT' is not set") +endif() + +# set system name, this sets the variable CMAKE_CROSSCOMPILING +set(CMAKE_SYSTEM_NAME Linux) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "arm-openwrt-linux-muslgnueabi") + +set(_expected_dir "$ENV{ARM_OPENWRT_LINUX_MUSLGNUEABI_ROOT}/${CROSS_COMPILE_TOOLCHAIN_PREFIX}") +if(NOT IS_DIRECTORY "${_expected_dir}") + polly_fatal_error( + "Directory not found: ${_expected_dir}" + " (check ARM_OPENWRT_LINUX_MUSLGNUEABI_ROOT environment variable)" + ) +endif() + +set(CROSS_COMPILE_TOOLCHAIN_PATH "$ENV{ARM_OPENWRT_LINUX_MUSLGNUEABI_ROOT}/bin") +set(CROSS_COMPILE_SYSROOT "$ENV{ARM_OPENWRT_LINUX_MUSLGNUEABI_ROOT}/usr/include") # ??? + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/openwrt.cmake") + +set(OPENWRT 1 CACHE INTERNAL "") diff --git a/tools/polly/bin/build.py b/tools/polly/bin/build.py new file mode 100755 index 0000000..c9de5f6 --- /dev/null +++ b/tools/polly/bin/build.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2014-2015, Ruslan Baratov +# All rights reserved. + +# Note: build.py has been renamed to polly.py. + +from os.path import abspath, dirname, join +exec(open(join(dirname(abspath(__file__)), 'polly.py'), 'r').read()) diff --git a/tools/polly/bin/detail/__init__.py b/tools/polly/bin/detail/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/polly/bin/detail/call.py b/tools/polly/bin/detail/call.py new file mode 100644 index 0000000..618d0cf --- /dev/null +++ b/tools/polly/bin/detail/call.py @@ -0,0 +1,102 @@ +# Copyright (c) 2014-2015, Ruslan Baratov +# All rights reserved. + +# Adapted to python3 version of: http://stackoverflow.com/questions/4984428 + +import os +import platform +import subprocess +import sys +import threading +import time + +# Tests: +# +# Windows: +# * Control Panel -> Region -> Administrative -> Current languange for non-Unicode programs: "Russian (Russia)" +# * cd to directory with name like 'привет' and run 'polly.py --verbose' + +def tee(infile, discard, logging, console=None): + """Print `infile` to `files` in a separate thread.""" + def fanout(): + discard_counter = 0 + for line in iter(infile.readline, b''): + # use the same encoding as stdout/stderr + s = line.decode( + encoding=sys.stdout.encoding, + errors='replace' + ) + s = s.replace('\r', '') + s = s.replace('\t', ' ') + s = s.rstrip() # strip spaces and EOL + s += '\n' # append stripped EOL back + logging.write(s) + if console is None: + continue + if discard is None: + console.write(s) + console.flush() + continue + if discard_counter == 0: + console.write(s) + console.flush() + discard_counter += 1 + if discard_counter == discard: + discard_counter = 0 + infile.close() + t = threading.Thread(target=fanout) + t.daemon = True + t.start() + return t + +def teed_call(cmd_args, logging): + p = subprocess.Popen( + cmd_args, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=os.environ, + bufsize=0 + ) + threads = [] + + if logging.verbosity != 'silent': + threads.append(tee(p.stdout, logging.discard, logging, sys.stdout)) + threads.append(tee(p.stderr, logging.discard, logging, sys.stderr)) + else: + threads.append(tee(p.stdout, logging.discard, logging)) + threads.append(tee(p.stderr, logging.discard, logging)) + + for t in threads: + t.join() # wait for IO completion + + return p.wait() + +def call(call_args, logging, cache_file='', ignore=False, sleep=0): + pretty = 'Execute command: [\n' + for i in call_args: + pretty += ' `{}`\n'.format(i) + pretty += ']\n' + print(pretty) + logging.write(pretty) + + # print one line version + oneline = '' + for i in call_args: + oneline += ' "{}"'.format(i) + oneline = "[{}]>{}\n".format(os.getcwd(), oneline) + if logging.verbosity != 'silent': + print(oneline) + logging.write(oneline) + + x = teed_call(call_args, logging) + if x == 0 or ignore: + time.sleep(sleep) + return + if os.path.exists(cache_file): + os.unlink(cache_file) + logging.log_file.close() + print('Command exit with status "{}": {}'.format(x, oneline)) + print('Log: {}'.format(logging.log_path)) + logging.print_last_lines() + print('*** FAILED ***') + sys.exit(1) diff --git a/tools/polly/bin/detail/cpack_generator.py b/tools/polly/bin/detail/cpack_generator.py new file mode 100644 index 0000000..d0cb479 --- /dev/null +++ b/tools/polly/bin/detail/cpack_generator.py @@ -0,0 +1,54 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +import os +import platform + +available_generators = [ + '7Z', + 'IFW', + 'NSIS', + 'NSIS64', + 'STGZ', + 'TBZ2', + 'TGZ', + 'TXZ', + 'TZ', + 'ZIP', +] + +if platform.system() == 'Darwin': + available_generators += [ + 'Bundle', + 'DragNDrop', + 'OSXX11', + 'PackageMaker', + ] + +if platform.system().startswith('CYGWIN'): + available_generators += [ + 'CygwinBinary', + 'CygwinSource', + 'DEB', + 'RPM', + ] + +if platform.system() == 'Linux': + available_generators += [ + 'DEB', + 'RPM', + ] + +if os.name == 'nt': + available_generators += [ + 'WIX' + ] + +def default(): + if os.name == 'nt': + return 'NSIS' + if platform.system() == 'Darwin': + return 'PackageMaker' + if platform.system() == 'Linux': + return 'DEB' + return 'TGZ' diff --git a/tools/polly/bin/detail/create_archive.py b/tools/polly/bin/detail/create_archive.py new file mode 100644 index 0000000..32833c3 --- /dev/null +++ b/tools/polly/bin/detail/create_archive.py @@ -0,0 +1,35 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +import tarfile +import platform +import os + +def run(install_dir, archives_dir, archive_name, toolchain_name, config): + if not os.path.exists(archives_dir): + os.mkdir(archives_dir) + + version_travis = os.getenv('TRAVIS_TAG') + version_appveyor_present = os.getenv('APPVEYOR_REPO_TAG') + version_appveyor = os.getenv('APPVEYOR_REPO_TAG_NAME') + + if version_travis: + version = '-' + version_travis + elif version_appveyor_present == 'true': + version = '-' + version_appveyor + else: + version = '' + + if config: + config = '-' + config + else: + config = '' + + archive_full_name = archive_name + version + '-' + platform.system() + '-' + toolchain_name + config + '.tar.gz' + archive_full_name = os.path.join(archives_dir, archive_full_name) + + tar = tarfile.open(archive_full_name, 'w:gz') + tar.add(install_dir, arcname='.') + tar.close() + + print('Archive created: {}'.format(archive_full_name)) diff --git a/tools/polly/bin/detail/create_framework.py b/tools/polly/bin/detail/create_framework.py new file mode 100644 index 0000000..cde9cac --- /dev/null +++ b/tools/polly/bin/detail/create_framework.py @@ -0,0 +1,148 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +import detail.call +import detail.rmtree + +import glob +import os +import re +import shutil +import sys + +def get_framework_name(lib_name): + if re.match(r'^lib.*\.a$', lib_name): + return re.sub(r'^lib(.*)\.a$', r'\1', lib_name) + if re.match(r'^lib.*\.dylib$', lib_name): + return re.sub(r'^lib(.*)\.dylib$', r'\1', lib_name) + sys.exit('Incorrect library name `{}`. Expected format lib*.a or lib*.dylib') + +def get_libname_soversion(libs): + name_len = min([len(x) for x in libs]) + for x in libs: + if (len(x) == name_len) and os.path.islink(x): + return x + sys.exit('Unexpected version/soversion format: {}'.format(libs)) + +def run(install_dir, framework_dir, ios, polly_root, device, logging, plist=None, identity=None, lib_regex='*'): + libs_path = os.path.join(install_dir, 'lib') + libs = glob.glob(os.path.join(libs_path, lib_regex)) + try: + libs.remove(os.path.join(libs_path, 'cmake')) + except ValueError: + pass + + if len(libs) == 0: + sys.exit('No libs found in directory: {}'.format(libs_path)) + + if len(libs) == 3: + # SOVERSION install: + # 1) lib.dylib (symlink) + # 2) lib.N.dylib (symlink) + # 3) lib.N.M.dylib (real file) + lib_name = os.path.basename(get_libname_soversion(libs)) + elif len(libs) == 1: + lib_name = os.path.basename(libs[0]) + else: + sys.exit( + 'Expected only one lib in directory: {}'.format(libs_path) + + '\nBut found: {}'.format(libs) + ) + + framework_name = get_framework_name(lib_name) + + framework_dir = os.path.join( + framework_dir, '{}.framework'.format(framework_name) + ) + detail.rmtree.rmtree(framework_dir) + + if ios: + lib_dir = os.path.join(framework_dir) + headers_dir = os.path.join(framework_dir, 'Headers') + else: + lib_dir = os.path.join(framework_dir, 'Versions', 'A') + headers_dir = os.path.join(framework_dir, 'Versions', 'A', 'Headers') + + os.makedirs(lib_dir) + os.makedirs(headers_dir) + + framework_lib = os.path.join(lib_dir, framework_name) + shutil.copy(libs[0], framework_lib) + if libs[0].endswith('.dylib'): + cmd = [ + 'install_name_tool', + '-id', + '@rpath/{}.framework/{}'.format(framework_name, framework_name), + framework_lib + ] + detail.call.call(cmd, logging) + + header_found = False + incl_dir = os.path.join(install_dir, 'include', framework_name) + for root, dirs, files in os.walk(incl_dir): + for d in dirs: + d_rel = os.path.relpath(os.path.join(root, d), incl_dir) + x = os.path.join(headers_dir, d_rel) + if not os.path.exists(x): + os.makedirs(x) + for f in files: + header_found = True + f_rel = os.path.relpath(os.path.join(root, f), incl_dir) + shutil.copy(os.path.join(root, f), os.path.join(headers_dir, f_rel)) + + if not header_found: + print('Warning: no headers found for framework (dir: {})'.format(incl_dir)) + + if not ios: + link = ['ln', '-sfh', 'A', os.path.join(framework_dir, 'Versions', 'Current')] + detail.call.call(link, logging) + + link = [ + 'ln', + '-sfh', + os.path.join('Versions', 'Current', framework_name), + os.path.join(framework_dir, framework_name) + ] + detail.call.call(link, logging) + + link = [ + 'ln', + '-sfh', + os.path.join('Versions', 'Current', 'Headers'), + os.path.join(framework_dir, 'Headers') + ] + detail.call.call(link, logging) + else: + framework_plist = os.path.join(framework_dir, 'Info.plist') + if plist is None: + shutil.copy( + os.path.join(polly_root, 'scripts', 'Info.plist'), + framework_plist); + else: + shutil.copy(plist, framework_plist); + + plist_text = open(framework_plist).read() + plist_text = re.sub(r'__MINIMUM_OS_VERSION__', ios, plist_text) + plist_text = re.sub(r'__BUNDLE_EXECUTABLE__', framework_name, plist_text) + open(framework_plist, 'w').write(plist_text) + if device: + detail.call.call( + ['lipo', '-remove', 'i386', '-output', framework_lib, framework_lib], + logging, + ignore=True + ) + detail.call.call( + ['lipo', '-remove', 'x86_64', '-output', framework_lib, framework_lib], + logging, + ignore=True + ) + + if identity is None: + identity = 'iPhone Developer'; + + sign_cmd = [ + 'codesign', '--force', '--sign', identity, framework_dir + ] + detail.call.call(sign_cmd, logging) + + print('Framework created: {}'.format(framework_dir)) diff --git a/tools/polly/bin/detail/generate_command.py b/tools/polly/bin/detail/generate_command.py new file mode 100644 index 0000000..db72960 --- /dev/null +++ b/tools/polly/bin/detail/generate_command.py @@ -0,0 +1,37 @@ +# Copyright (c) 2014-2015, Ruslan Baratov +# All rights reserved. + +import difflib +import os +import sys + +import detail.call + +def run(generate_command, build_dir, polly_temp_dir, reconfig, logging): + if not os.path.exists(polly_temp_dir): + os.makedirs(polly_temp_dir) + saved_arguments_path = os.path.join(polly_temp_dir, 'saved-arguments') + cache_file = os.path.join(build_dir, 'CMakeCache.txt') + + generate_command_oneline = ' '.join( + [ '"{}"'.format(x) for x in generate_command] + ) + + if reconfig or not os.path.exists(saved_arguments_path): + detail.call.call(generate_command, logging, cache_file=cache_file, sleep=1) + open(saved_arguments_path, 'w').write(generate_command_oneline) + return + + # No need to generate project, just check that arguments not changed + expected = open(saved_arguments_path, 'r').read() + if expected != generate_command_oneline: + sys.exit( + "\n== WARNING ==\n" + "\nLooks like cmake arguments changed." + " You have two options to fix it:\n" + " * Remove build directory completely" + " by adding '--clear' (works 100%)\n" + " * Run configure again by adding '--reconfig'" + " (you must understand how CMake cache variables works/updated)\n\n" + "{}".format("\n".join(difflib.ndiff([expected], [generate_command_oneline]))) + ) diff --git a/tools/polly/bin/detail/get_nmake_environment.py b/tools/polly/bin/detail/get_nmake_environment.py new file mode 100755 index 0000000..6a9ec86 --- /dev/null +++ b/tools/polly/bin/detail/get_nmake_environment.py @@ -0,0 +1,35 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +import detail.util +import os +import sys + +def get(arch, vs_version): + vs_path_env = 'VS{}0COMNTOOLS'.format(vs_version) + vs_path = os.getenv(vs_path_env) + if not vs_path: + sys.exit( + 'Environment variable {} is empty, ' + 'looks like Visual Studio {} is not installed'.format( + vs_path_env, vs_version + ) + ) + + if vs_version == '15': + vcvarsall_dir = os.path.join(vs_path, '..', '..', 'VC', 'Auxiliary', 'Build') + else: + vcvarsall_dir = os.path.join(vs_path, '..', '..', 'VC') + + if not os.path.isdir(vcvarsall_dir): + sys.exit( + 'Directory `{}` not exists ' + '({} environment variable)'.format(vcvarsall_dir, vs_path_env) + ) + vcvarsall_path = os.path.join(vcvarsall_dir, 'vcvarsall.bat') + if not os.path.isfile(vcvarsall_path): + sys.exit( + 'File vcvarsall.bat not found in directory ' + '`{}` ({} environment variable)'.format(vcvarsall_dir, vs_path_env) + ) + return detail.util.get_environment_from_batch_command([vcvarsall_path, arch]) diff --git a/tools/polly/bin/detail/ios_dev_root.py b/tools/polly/bin/detail/ios_dev_root.py new file mode 100644 index 0000000..f95addc --- /dev/null +++ b/tools/polly/bin/detail/ios_dev_root.py @@ -0,0 +1,10 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +import os +import re + +def get(ios_version): + dev_dir = re.sub(r'\.', '_', ios_version) + dev_dir = 'IOS_{}_DEVELOPER_DIR'.format(dev_dir) + return os.getenv(dev_dir) diff --git a/tools/polly/bin/detail/logging.py b/tools/polly/bin/detail/logging.py new file mode 100644 index 0000000..93830a3 --- /dev/null +++ b/tools/polly/bin/detail/logging.py @@ -0,0 +1,49 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +import os +import sys + +class Logging: + def __init__(self, cdir, verbosity, discard, tail_N, polly_toolchain): + self.verbosity = verbosity + self.discard = discard + self.tail_N = tail_N + + # Add extra 'polly_toolchain' directory so we can run two builds on + # one directory with different toolchains in parallel + log_dir = os.path.join(cdir, '_logs', 'polly', polly_toolchain) + if not os.path.exists(log_dir): + os.makedirs(log_dir) + + self.log_path = os.path.join(log_dir, 'log.txt') + if os.path.exists(self.log_path): + for i in range(1000): + try_name = 'log-{}.txt'.format(i) + try_path = os.path.join(log_dir, try_name) + if not os.path.exists(try_path): + os.renames(self.log_path, try_path) + break + else: + sys.exit( + 'Please clean-up your logs in directory: {}'.format(log_dir) + ) + + # https://docs.python.org/3.2/library/functions.html#open + # 'b' - we will be writing byte objects to this file (see 'write' method) + self.log_file = open(self.log_path, 'wb') + + # receive string 's' in various encoding and convert it to UTF-8 + def write(self, s): + self.log_file.write(s.encode('utf-8')) + + def print_last_lines(self): + if self.tail_N is None: + return + lines = open(self.log_path, 'r').readlines() + tail = lines[-self.tail_N:] + print('Last {} lines\n'.format(self.tail_N)) + print('-' * 80) + for i in tail: + print(' {}'.format(i), end='') + print('-' * 80) diff --git a/tools/polly/bin/detail/open_project.py b/tools/polly/bin/detail/open_project.py new file mode 100644 index 0000000..d64d933 --- /dev/null +++ b/tools/polly/bin/detail/open_project.py @@ -0,0 +1,40 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +import os +import subprocess +import sys + +import detail.call + +def find_project(directory, extension): + for file in os.listdir(directory): + if file.endswith(extension): + project_path = os.path.join(directory, file) + print("Open project: {}".format(project_path)) + return project_path + sys.exit( + "Project with extension `{}` not found in `{}`".format( + extension, + directory + ) + ) + +def open(toolchain, build_dir, logging): + if toolchain.is_xcode: + args = ['open'] + dev_root = '' + if toolchain.ios_version: + dev_root = detail.ios_dev_root.get(toolchain.ios_version) + if not dev_root: + dev_root = subprocess.check_output( + ['xcode-select', '--print-path'], universal_newlines=True + ).split('\n')[0] + args.append('-a') + args.append(os.path.join(dev_root, '..', '..')) + args.append(find_project(build_dir, ".xcodeproj")) + detail.call.call(args, logging) + elif toolchain.is_msvc: + os.startfile(find_project(build_dir, ".sln")) + else: + print("Open skipped (not Xcode or Visual Studio)") diff --git a/tools/polly/bin/detail/osx_dev_root.py b/tools/polly/bin/detail/osx_dev_root.py new file mode 100644 index 0000000..b6cf75d --- /dev/null +++ b/tools/polly/bin/detail/osx_dev_root.py @@ -0,0 +1,10 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +import os +import re + +def get(osx_version): + dev_dir = re.sub(r'\.', '_', osx_version) + dev_dir = 'OSX_{}_DEVELOPER_DIR'.format(dev_dir) + return os.getenv(dev_dir) diff --git a/tools/polly/bin/detail/pack_command.py b/tools/polly/bin/detail/pack_command.py new file mode 100644 index 0000000..be79047 --- /dev/null +++ b/tools/polly/bin/detail/pack_command.py @@ -0,0 +1,25 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +import os +import subprocess + +import detail.call + +def run(config, logging, cpack_generator, cpack_bin, cmake_bin): + pack_command = [cpack_bin] + if os.name == 'nt': + # use full path to cpack since Chocolatey pack command has the same name + cmake_list = subprocess.check_output( + ['where', cmake_bin], universal_newlines=True + ) + cmake_path = cmake_list.split('\n')[0] + cpack_path = os.path.join(os.path.dirname(cmake_path), cpack_bin) + pack_command = [cpack_path] + if config: + pack_command.append('-C') + pack_command.append(config) + pack_command.append('--verbose') + if cpack_generator: + pack_command.append('-G{}'.format(cpack_generator)) + detail.call.call(pack_command, logging) diff --git a/tools/polly/bin/detail/rmtree.py b/tools/polly/bin/detail/rmtree.py new file mode 100644 index 0000000..580e652 --- /dev/null +++ b/tools/polly/bin/detail/rmtree.py @@ -0,0 +1,23 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +# Call native tools to remove directory recursively. Use this command instead +# of shutils.rmtree because of different glitches like impossibility to remove +# directory with files with long path on Windows. + +import os +import subprocess +import sys + +def rmtree(dir_path): + if not os.path.exists(dir_path): + return + print("Remove directory: {}".format(dir_path)) + if os.name == 'nt': + subprocess.check_call(['cmd', '/c', 'rmdir', dir_path, '/S', '/Q']) + else: + subprocess.check_call(['rm', '-rf', dir_path]) + + # sanity check + if os.path.exists(dir_path): + sys.exit("Directory removing failed ({})".format(dir_path)) diff --git a/tools/polly/bin/detail/target.py b/tools/polly/bin/detail/target.py new file mode 100644 index 0000000..a9f21c7 --- /dev/null +++ b/tools/polly/bin/detail/target.py @@ -0,0 +1,30 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +import sys + +class Target: + def __init__(self): + self.name = '' + + def add(self, condition, name): + if not condition: + return + if not name: + sys.exit('No name for target') + if not self.name: + self.name = name + return + if self.name == name: + return + sys.exit( + "Can't add target `{}` since another target defined: `{}`".format( + name, self.name + ) + ) + + def args(self): + if self.name: + return ['--target', self.name] + else: + return [] diff --git a/tools/polly/bin/detail/test_command.py b/tools/polly/bin/detail/test_command.py new file mode 100644 index 0000000..c431cba --- /dev/null +++ b/tools/polly/bin/detail/test_command.py @@ -0,0 +1,20 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +import detail.call + +def run(build_dir, config, logging, test_xml, verbose, timeout, ctest_bin): + test_command = [ctest_bin] + if test_xml: + test_command.append('-T') + test_command.append(test_xml) + if config: + test_command.append('-C') + test_command.append(config) + if verbose: + test_command.append('-VV') + if timeout: + test_command.append('--timeout') + test_command.append(str(timeout)) + print('Run tests') + detail.call.call(test_command, logging) diff --git a/tools/polly/bin/detail/timer.py b/tools/polly/bin/detail/timer.py new file mode 100644 index 0000000..27e1b07 --- /dev/null +++ b/tools/polly/bin/detail/timer.py @@ -0,0 +1,61 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +import datetime +import sys +import time + +perf_counter_available = (sys.version_info.minor >= 3) + +class Job: + def __init__(self, job_name): + if perf_counter_available: + self.start = time.perf_counter() + else: + self.start = 0 + self.job_name = job_name + self.stopped = False + + def stop(self): + if self.stopped: + sys.exit('Already stopped') + self.stopped = True + if perf_counter_available: + self.total = time.perf_counter() - self.start + else: + self.total = 0 + + def result(self): + if not self.stopped: + sys.exit("Stop the job before result") + print( + '{}: {}s'.format(self.job_name, datetime.timedelta(seconds=self.total)) + ) + +class Timer: + def __init__(self): + self.jobs = [] + self.total = Job('Total') + + def start(self, job_name): + if job_name == 'Total': + sys.exit('Name reserved') + for i in self.jobs: + if i.job_name == job_name: + sys.exit('Job already exists: {}'.format(job_name)) + self.jobs.append(Job(job_name)) + + def stop(self): + if len(self.jobs) == 0: + sys.exit("No jobs to stop") + self.jobs[-1].stop() + + def result(self): + if not perf_counter_available: + print('timer.perf_counter is not available (update to python 3.3+)') + return + for i in self.jobs: + i.result() + print('-') + self.total.stop() + self.total.result() diff --git a/tools/polly/bin/detail/toolchain_name.py b/tools/polly/bin/detail/toolchain_name.py new file mode 100644 index 0000000..07b0bac --- /dev/null +++ b/tools/polly/bin/detail/toolchain_name.py @@ -0,0 +1,8 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +def get(args_toolchain): + if args_toolchain: + return args_toolchain + else: + return 'default' diff --git a/tools/polly/bin/detail/toolchain_table.py b/tools/polly/bin/detail/toolchain_table.py new file mode 100644 index 0000000..ef187f1 --- /dev/null +++ b/tools/polly/bin/detail/toolchain_table.py @@ -0,0 +1,705 @@ +# Copyright (c) 2014, Ruslan Baratov & Luca Martini +# Copyright (c) 2014, Michele Caini +# Copyright (c) 2017, Robert Nitsch +# Copyright (c) 2018, David Hirvonen +# Copyright (c) 2018, Richard Hodges +# All rights reserved. + +import os +import platform + +class Toolchain: + def __init__( + self, + name, + generator, + toolset='', + arch='', + vs_version='', + ios_version='', + osx_version='', + xp=False, + nocodesign=False, + ): + self.name = name + self.generator = generator + self.toolset = toolset + self.arch = arch + self.vs_version = vs_version + self.ios_version = ios_version + self.osx_version = osx_version + self.is_nmake = (self.generator == 'NMake Makefiles') + self.is_msvc = self.generator.startswith('Visual Studio') + self.is_make = self.generator.endswith('Makefiles') + self.is_ninja = (self.generator == 'Ninja') + self.xp = xp + self.is_xcode = (self.generator == 'Xcode') + self.multiconfig = (self.is_xcode or self.is_msvc) + self.nocodesign = nocodesign + self.verify() + + def verify(self): + if self.arch: + assert(self.is_nmake or self.is_msvc or self.is_ninja) + assert(self.arch == 'amd64' or self.arch == 'x86') + + if self.is_nmake or self.is_msvc: + assert(self.vs_version) + + if self.ios_version or self.osx_version: + assert(self.generator == 'Xcode') + + if self.xp: + assert(self.vs_version) + +toolchain_table = [ + Toolchain('default', ''), + Toolchain('cxx11', ''), + Toolchain('cxx17', ''), + Toolchain('android-ndk-r10e-api-8-armeabi-v7a', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-16-armeabi-v7a-neon', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-16-armeabi-v7a-neon-clang-35-hid-sections', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-16-x86', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-16-x86-hid', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-16-x86-hid-sections', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-19-armeabi-v7a-neon', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-19-armeabi-v7a-neon-c11', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections-lto', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-19-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-armeabi-v7a', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-armeabi-v7a-neon', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-armeabi-v7a-neon-hid-sections', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-armeabi-v7a-neon-clang-35', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-armeabi-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-armeabi', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-arm64-v8a', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-arm64-v8a-gcc-49', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-arm64-v8a-gcc-49-hid-sections', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-arm64-v8a-clang-35', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-x86', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-x86-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-x86-64', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-x86-64-hid', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-x86-64-hid-sections', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-mips', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-mips64', 'Unix Makefiles'), + Toolchain('android-ndk-r10e-api-21-mips-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-8-armeabi-v7a', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-armeabi', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-armeabi-cxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-armeabi-v7a', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-armeabi-v7a-cxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-armeabi-v7a-neon', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-armeabi-v7a-neon-cxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-armeabi-v7a-neon-clang-35-hid', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-x86', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-16-x86-hid', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-19-armeabi-v7a-neon', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-armeabi-v7a', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-armeabi-v7a-neon', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-armeabi-v7a-neon-clang-35', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-armeabi', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-arm64-v8a', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-arm64-v8a-gcc-49', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-arm64-v8a-gcc-49-hid', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-arm64-v8a-clang-35', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-x86', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-x86-64', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-x86-64-hid', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-mips', 'Unix Makefiles'), + Toolchain('android-ndk-r11c-api-21-mips64', 'Unix Makefiles'), + Toolchain('android-ndk-r12b-api-19-armeabi-v7a-neon', 'Unix Makefiles'), + Toolchain('android-ndk-r13b-api-19-armeabi-v7a-neon', 'Unix Makefiles'), + Toolchain('android-ndk-r14-api-16-armeabi-v7a-neon-clang-hid-sections-lto', 'Unix Makefiles'), + Toolchain('android-ndk-r14-api-19-armeabi-v7a-neon-c11', 'Unix Makefiles'), + Toolchain('android-ndk-r14-api-19-armeabi-v7a-neon-clang', 'Unix Makefiles'), + Toolchain('android-ndk-r14-api-19-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r14-api-21-arm64-v8a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r14-api-19-armeabi-v7a-neon-hid-sections-lto', 'Unix Makefiles'), + Toolchain('android-ndk-r14-api-21-arm64-v8a-clang-hid-sections-lto', 'Unix Makefiles'), + Toolchain('android-ndk-r14-api-21-x86-64', 'Unix Makefiles'), + Toolchain('android-ndk-r14b-api-21-armeabi-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r14b-api-21-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r14b-api-21-mips-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r14b-api-21-x86-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-16-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-16-armeabi-v7a-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-16-armeabi-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-16-mips-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-16-x86-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-21-arm64-v8a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-21-arm64-v8a-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-21-armeabi-v7a-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-21-armeabi-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-21-mips-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-21-x86-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-21-x86-64-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r15c-api-24-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-16-armeabi-v7a-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-16-armeabi-v7a-thumb-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-16-x86-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-19-gcc-49-armeabi-v7a-neon-libcxx-hid-sections-lto', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-armeabi-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-armeabi-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-armeabi-v7a-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-arm64-v8a-neon-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-armeabi-v7a-neon-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-x86-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-21-x86-64-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-24-arm64-v8a-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r17-api-24-arm64-v8a-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r17-api-21-arm64-v8a-neon-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r17-api-16-armeabi-v7a-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r17-api-16-x86-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r17-api-21-x86-64-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r17-api-19-armeabi-v7a-neon-hid-sections', 'Unix Makefiles'), + Toolchain('android-ndk-r17-api-19-armeabi-v7a-neon-clang-libcxx', 'Unix Makefiles'), + Toolchain('android-ndk-r18-api-24-arm64-v8a-clang-libcxx14', 'Unix Makefiles'), + Toolchain('android-ndk-r18b-api-24-arm64-v8a-clang-libcxx11', 'Unix Makefiles'), + Toolchain('android-ndk-r18b-api-16-armeabi-v7a-clang-libcxx', 'Unix Makefiles'), + Toolchain('emscripten-cxx11', 'Unix Makefiles'), + Toolchain('emscripten-cxx14', 'Unix Makefiles'), + Toolchain('emscripten-cxx17', 'Unix Makefiles'), + Toolchain('raspberrypi1-cxx11-pic', 'Unix Makefiles'), + Toolchain('raspberrypi1-cxx11-pic-static-std', 'Unix Makefiles'), + Toolchain('raspberrypi2-cxx11', 'Unix Makefiles'), + Toolchain('raspberrypi2-cxx11-pic', 'Unix Makefiles'), + Toolchain('raspberrypi3-gcc-pic-hid-sections', 'Unix Makefiles'), + Toolchain('raspberrypi3-cxx11', 'Unix Makefiles') +] + +if os.name == 'nt': + toolchain_table += [ + Toolchain('mingw', 'MinGW Makefiles'), + Toolchain('mingw-c11', 'MinGW Makefiles'), + Toolchain('mingw-cxx14', 'MinGW Makefiles'), + Toolchain('mingw-cxx17', 'MinGW Makefiles'), + Toolchain('msys', 'MSYS Makefiles'), + Toolchain('msys-cxx14', 'MSYS Makefiles'), + Toolchain('msys-cxx17', 'MSYS Makefiles'), + Toolchain( + 'nmake-vs-12-2013', + 'NMake Makefiles', + arch='x86', + vs_version='12' + ), + Toolchain( + 'nmake-vs-12-2013-win64', + 'NMake Makefiles', + arch='amd64', + vs_version='12' + ), + Toolchain( + 'nmake-vs-15-2017-win64', + 'NMake Makefiles', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'nmake-vs-15-2017-win64-cxx17', + 'NMake Makefiles', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'ninja-vs-12-2013-win64', + 'Ninja', + arch='amd64', + vs_version='12' + ), + Toolchain( + 'ninja-vs-14-2015-win64', + 'Ninja', + arch='amd64', + vs_version='14' + ), + Toolchain( + 'ninja-vs-15-2017-win64', + 'Ninja', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'ninja-vs-15-2017-win64-cxx17', + 'Ninja', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'vs-12-2013', 'Visual Studio 12 2013', arch='x86', vs_version='12' + ), + Toolchain( + 'vs-12-2013-mt', 'Visual Studio 12 2013', arch='x86', vs_version='12' + ), + Toolchain( + 'vs-10-2010', 'Visual Studio 10 2010', arch='x86', vs_version='10' + ), + Toolchain( + 'vs-11-2012', 'Visual Studio 11 2012', arch='x86', vs_version='11' + ), + Toolchain( + 'vs-14-2015', 'Visual Studio 14 2015', arch='x86', vs_version='14' + ), + Toolchain( + 'vs-15-2017', 'Visual Studio 15 2017', arch='x86', vs_version='15' + ), + Toolchain( + 'vs-15-2017-cxx17', 'Visual Studio 15 2017', arch='x86', vs_version='15' + ), + Toolchain( + 'vs-14-2015-sdk-8-1', 'Visual Studio 14 2015', arch='x86', vs_version='14' + ), + Toolchain( + 'vs-9-2008', 'Visual Studio 9 2008', arch='x86', vs_version='9' + ), + Toolchain( + 'vs-8-2005', 'Visual Studio 8 2005', arch='x86', vs_version='8' + ), + Toolchain( + 'vs-12-2013-xp', + 'Visual Studio 12 2013', + arch='x86', + vs_version='12', + xp=True + ), + Toolchain( + 'vs-11-2012-win64', + 'Visual Studio 11 2012 Win64', + arch='amd64', + vs_version='11' + ), + Toolchain( + 'vs-12-2013-win64', + 'Visual Studio 12 2013 Win64', + arch='amd64', + vs_version='12' + ), + Toolchain( + 'vs-14-2015-win64', + 'Visual Studio 14 2015 Win64', + arch='amd64', + vs_version='14' + ), + Toolchain( + 'vs-14-2015-win64-sdk-8-1', + 'Visual Studio 14 2015 Win64', + arch='amd64', + vs_version='14' + ), + Toolchain( + 'vs-11-2012-arm', + 'Visual Studio 11 2012 ARM', + vs_version='11' + ), + Toolchain( + 'vs-12-2013-arm', + 'Visual Studio 12 2013 ARM', + vs_version='12' + ), + Toolchain( + 'vs-14-2015-arm', + 'Visual Studio 14 2015 ARM', + vs_version='14' + ), + Toolchain( + 'vs-15-2017-win64', + 'Visual Studio 15 2017 Win64', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'vs-15-2017-win64-cxx14', + 'Visual Studio 15 2017 Win64', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'vs-15-2017-win64-cxx17', + 'Visual Studio 15 2017 Win64', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'vs-15-2017-win64-llvm', + 'Visual Studio 15 2017 Win64', + toolset='llvm', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'vs-15-2017-win64-llvm-vs2014', + 'Visual Studio 15 2017 Win64', + toolset='LLVM-vs2014', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'vs-15-2017-win64-store-10-zw', + 'Visual Studio 15 2017 Win64', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'vs-15-2017-store-10-zw', + 'Visual Studio 15 2017', + arch='x86', + vs_version='15' + ), + Toolchain( + 'vs-15-2017-win64-store-10-cxx17', + 'Visual Studio 15 2017 Win64', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'vs-15-2017-win64-z7', + 'Visual Studio 15 2017 Win64', + arch='amd64', + vs_version='15' + ), + Toolchain( + 'android-vc-ndk-r10e-api-19-arm-clang-3-6', + 'Visual Studio 14 2015 ARM', + arch='', + vs_version='14' + ), + Toolchain( + 'android-vc-ndk-r10e-api-21-arm-clang-3-6', + 'Visual Studio 14 2015 ARM', + arch='', + vs_version='14' + ), + Toolchain( + 'android-vc-ndk-r10e-api-19-x86-clang-3-6', + 'Visual Studio 14 2015', + arch='', + vs_version='14' + ), + Toolchain( + 'android-vc-ndk-r10e-api-19-arm-gcc-4-9', + 'Visual Studio 14 2015 ARM', + arch='', + vs_version='14' + ), + ] + +if platform.system().startswith('CYGWIN'): + toolchain_table += [ + Toolchain('cygwin', 'Unix Makefiles'), + ] + +if platform.system() == 'Linux': + toolchain_table += [ + Toolchain('sanitize-leak', 'Unix Makefiles'), + Toolchain('sanitize-leak-cxx17', 'Unix Makefiles'), + Toolchain('sanitize-leak-cxx17-pic', 'Unix Makefiles'), + Toolchain('sanitize-memory', 'Unix Makefiles'), + Toolchain('linux-mingw-w32', 'Unix Makefiles'), + Toolchain('linux-mingw-w64', 'Unix Makefiles'), + Toolchain('linux-mingw-w64-cxx98', 'Unix Makefiles'), + Toolchain('linux-mingw-w64-gnuxx11', 'Unix Makefiles'), + Toolchain('linux-gcc-armhf', 'Unix Makefiles'), + Toolchain('linux-gcc-armhf-neon', 'Unix Makefiles'), + Toolchain('linux-gcc-armhf-neon-vfpv4', 'Unix Makefiles'), + Toolchain('linux-gcc-jetson-tk1', 'Unix Makefiles'), + ] + +if platform.system() == 'Darwin': + toolchain_table += [ + Toolchain('ios', 'Xcode'), + Toolchain('ios-12-0-dep-11-0-arm64', 'Xcode', ios_version='12.0'), + Toolchain('ios-12-1-dep-11-0-arm64', 'Xcode', ios_version='12.1'), + Toolchain('ios-12-1-dep-9-3-arm64', 'Xcode', ios_version='12.1'), + Toolchain('ios-11-4-dep-9-3-arm64', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-4-dep-9-3-armv7', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-4-dep-9-3-arm64-armv7', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-4-dep-9-3', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-4-dep-9-4-arm64', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-4-dep-9-3-arm64-hid-sections-lto-cxx11', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-4-dep-8-0-arm64-armv7-hid-sections-lto-cxx11', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-4-dep-8-0-arm64-hid-sections-lto-cxx11', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-3-dep-9-0-arm64', 'Xcode', ios_version='11.3'), + Toolchain('ios-11-4-dep-9-0-device-bitcode-cxx11', 'Xcode', ios_version='11.4'), + Toolchain('ios-12-0-dep-9-0-device-bitcode-cxx11', 'Xcode', ios_version='12.0'), + Toolchain('ios-11-4-dep-9-0-device-bitcode-nocxx', 'Xcode', ios_version='11.4'), + Toolchain('ios-11-3-dep-9-0-device-bitcode', 'Xcode', ios_version='11.3'), + Toolchain('ios-11-3-dep-9-0-device-bitcode-nocxx', 'Xcode', ios_version='11.3'), + Toolchain('ios-11-3-dep-9-0-device-bitcode-cxx11', 'Xcode', ios_version='11.3'), + Toolchain('ios-11-3-dep-9-0-device-bitcode-cxx17', 'Xcode', ios_version='11.3'), + Toolchain('ios-11-2-dep-9-0-device-bitcode-cxx11', 'Xcode', ios_version='11.2'), + Toolchain('ios-11-2-dep-9-0-device-bitcode-nocxx', 'Xcode', ios_version='11.2'), + Toolchain('ios-11-2-dep-9-3-arm64-armv7', 'Xcode', ios_version='11.2'), + Toolchain('ios-11-3-dep-9-3-arm64-armv7', 'Xcode', ios_version='11.3'), + Toolchain('ios-11-1-dep-9-0-bitcode-cxx11', 'Xcode', ios_version='11.1'), + Toolchain('ios-11-1-dep-9-0-device-bitcode-cxx11', 'Xcode', ios_version='11.1'), + Toolchain('ios-11-0-dep-9-0-bitcode-cxx11', 'Xcode', ios_version='11.0'), + Toolchain('ios-11-0-dep-9-0-device-bitcode-cxx11', 'Xcode', ios_version='11.0'), + Toolchain('ios-11-0', 'Xcode', ios_version='11.0'), + Toolchain('ios-10-3', 'Xcode', ios_version='10.3'), + Toolchain('ios-10-3-dep-8-0-bitcode', 'Xcode', ios_version='10.3'), + Toolchain('ios-10-3-dep-9-0-bitcode', 'Xcode', ios_version='10.3'), + Toolchain('ios-10-3-dep-9-3-i386-armv7', 'Xcode', ios_version='10.3'), + Toolchain('ios-10-3-dep-9-3-x86-64-arm64', 'Xcode', ios_version='10.3'), + Toolchain('ios-10-3-lto', 'Xcode', ios_version='10.3'), + Toolchain('ios-10-3-armv7', 'Xcode', ios_version='10.3'), + Toolchain('ios-10-3-arm64', 'Xcode', ios_version='10.3'), + Toolchain('ios-10-2', 'Xcode', ios_version='10.2'), + Toolchain('ios-10-2-dep-9-3-armv7', 'Xcode', ios_version='10.2'), + Toolchain('ios-10-2-dep-9-3-arm64', 'Xcode', ios_version='10.2'), + Toolchain('ios-10-1', 'Xcode', ios_version='10.1'), + Toolchain('ios-10-1-arm64', 'Xcode', ios_version='10.1'), + Toolchain('ios-10-1-arm64-dep-8-0-hid-sections', 'Xcode', ios_version='10.1'), + Toolchain('ios-10-1-armv7', 'Xcode', ios_version='10.1'), + Toolchain('ios-10-1-dep-8-0-hid-sections', 'Xcode', ios_version='10.1'), + Toolchain('ios-10-1-dep-8-0-libcxx-hid-sections', 'Xcode', ios_version='10.1'), + Toolchain('ios-10-1-dep-8-0-libcxx-hid-sections-lto', 'Xcode', ios_version='10.1'), + Toolchain('ios-10-1-wo-armv7s', 'Xcode', ios_version='10.1'), + Toolchain('ios-10-0', 'Xcode', ios_version='10.0'), + Toolchain('ios-10-0-arm64', 'Xcode', ios_version='10.0'), + Toolchain('ios-10-0-arm64-dep-8-0-hid-sections', 'Xcode', ios_version='10.0'), + Toolchain('ios-10-0-armv7', 'Xcode', ios_version='10.0'), + Toolchain('ios-10-0-dep-8-0-hid-sections', 'Xcode', ios_version='10.0'), + Toolchain('ios-10-0-wo-armv7s', 'Xcode', ios_version='10.0'), + Toolchain('ios-9-3', 'Xcode', ios_version='9.3'), + Toolchain('ios-9-3-arm64', 'Xcode', ios_version='9.3'), + Toolchain('ios-9-3-armv7', 'Xcode', ios_version='9.3'), + Toolchain('ios-9-3-wo-armv7s', 'Xcode', ios_version='9.3'), + Toolchain('ios-9-2', 'Xcode', ios_version='9.2'), + Toolchain('ios-9-2-arm64', 'Xcode', ios_version='9.2'), + Toolchain('ios-9-2-armv7', 'Xcode', ios_version='9.2'), + Toolchain('ios-9-2-hid', 'Xcode', ios_version='9.2'), + Toolchain('ios-9-2-hid-sections', 'Xcode', ios_version='9.2'), + Toolchain('ios-9-1-armv7', 'Xcode', ios_version='9.1'), + Toolchain('ios-9-1-arm64', 'Xcode', ios_version='9.1'), + Toolchain('ios-9-1-dep-7-0-armv7', 'Xcode', ios_version='9.1'), + Toolchain('ios-9-1-hid', 'Xcode', ios_version='9.1'), + Toolchain('ios-9-1-dep-8-0-hid', 'Xcode', ios_version='9.1'), + Toolchain('ios-9-1', 'Xcode', ios_version='9.1'), + Toolchain('ios-9-0', 'Xcode', ios_version='9.0'), + Toolchain('ios-9-0-armv7', 'Xcode', ios_version='9.0'), + Toolchain('ios-9-0-i386-armv7', 'Xcode', ios_version='9.0'), + Toolchain('ios-9-0-wo-armv7s', 'Xcode', ios_version='9.0'), + Toolchain('ios-9-0-dep-7-0-armv7', 'Xcode', ios_version='9.0'), + Toolchain('ios-8-4', 'Xcode', ios_version='8.4'), + Toolchain('ios-8-4-arm64', 'Xcode', ios_version='8.4'), + Toolchain('ios-8-4-armv7', 'Xcode', ios_version='8.4'), + Toolchain('ios-8-4-armv7s', 'Xcode', ios_version='8.4'), + Toolchain('ios-8-4-hid', 'Xcode', ios_version='8.4'), + Toolchain('ios-8-2', 'Xcode', ios_version='8.2'), + Toolchain('ios-8-2-i386-arm64', 'Xcode', ios_version='8.2'), + Toolchain('ios-8-2-arm64', 'Xcode', ios_version='8.2'), + Toolchain('ios-8-2-arm64-hid', 'Xcode', ios_version='8.2'), + Toolchain('ios-8-2-cxx98', 'Xcode', ios_version='8.2'), + Toolchain('ios-8-1', 'Xcode', ios_version='8.1'), + Toolchain('ios-8-0', 'Xcode', ios_version='8.0'), + Toolchain('ios-7-1', 'Xcode', ios_version='7.1'), + Toolchain('ios-7-0', 'Xcode', ios_version='7.0'), + Toolchain('ios-dep-8-0-arm64-armv7-hid-sections-lto-cxx11', 'Xcode'), + Toolchain('ios-nocodesign', 'Xcode', nocodesign=True), + Toolchain('ios-nocodesign-arm64', 'Xcode', ios_version='8.1', nocodesign=True), + Toolchain('ios-nocodesign-armv7', 'Xcode', ios_version='8.1', nocodesign=True), + Toolchain('ios-nocodesign-hid-sections', 'Xcode', ios_version='8.1', nocodesign=True), + Toolchain('ios-nocodesign-wo-armv7s', 'Xcode', ios_version='8.1', nocodesign=True), + Toolchain('ios-nocodesign-8-4', 'Xcode', ios_version='8.4', nocodesign=True), + Toolchain('ios-nocodesign-8-1', 'Xcode', ios_version='8.1', nocodesign=True), + Toolchain('ios-nocodesign-9-1', 'Xcode', ios_version='9.1', nocodesign=True), + Toolchain('ios-nocodesign-9-1-arm64', 'Xcode', ios_version='9.1', nocodesign=True), + Toolchain('ios-nocodesign-9-1-armv7', 'Xcode', ios_version='9.1', nocodesign=True), + Toolchain('ios-nocodesign-9-2', 'Xcode', ios_version='9.2', nocodesign=True), + Toolchain('ios-nocodesign-9-2-arm64', 'Xcode', ios_version='9.2', nocodesign=True), + Toolchain('ios-nocodesign-9-2-armv7', 'Xcode', ios_version='9.2', nocodesign=True), + Toolchain('ios-nocodesign-9-3', 'Xcode', ios_version='9.3', nocodesign=True), + Toolchain('ios-nocodesign-9-3-device', 'Xcode', ios_version='9.3', nocodesign=True), + Toolchain('ios-nocodesign-9-3-device-hid-sections', 'Xcode', ios_version='9.3', nocodesign=True), + Toolchain('ios-nocodesign-9-3-arm64', 'Xcode', ios_version='9.3', nocodesign=True), + Toolchain('ios-nocodesign-9-3-armv7', 'Xcode', ios_version='9.3', nocodesign=True), + Toolchain('ios-nocodesign-9-3-wo-armv7s', 'Xcode', ios_version='9.3', nocodesign=True), + Toolchain('ios-nocodesign-10-0', 'Xcode', ios_version='10.0', nocodesign=True), + Toolchain('ios-nocodesign-10-0-arm64', 'Xcode', ios_version='10.0', nocodesign=True), + Toolchain('ios-nocodesign-10-0-armv7', 'Xcode', ios_version='10.0', nocodesign=True), + Toolchain('ios-nocodesign-10-0-wo-armv7s', 'Xcode', ios_version='10.0', nocodesign=True), + Toolchain('ios-nocodesign-10-1', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-1-arm64', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-1-armv7', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-1-wo-armv7s', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections-lto', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-1-dep-8-0-libcxx-hid-sections-lto', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-1-dep-8-0-device-libcxx-hid-sections-lto', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-1-dep-9-0-device-libcxx-hid-sections-lto', 'Xcode', ios_version='10.1', nocodesign=True), + Toolchain('ios-nocodesign-10-2', 'Xcode', ios_version='10.2', nocodesign=True), + Toolchain('ios-nocodesign-10-3', 'Xcode', ios_version='10.3', nocodesign=True), + Toolchain('ios-nocodesign-10-3-cxx14', 'Xcode', ios_version='10.3', nocodesign=True), + Toolchain('ios-nocodesign-10-3-arm64-dep-9-0-device-libcxx-hid-sections', 'Xcode', ios_version='10.3', nocodesign=True), + Toolchain('ios-nocodesign-10-3-dep-9-0-bitcode', 'Xcode', ios_version='10.3', nocodesign=True), + Toolchain('ios-nocodesign-10-3-wo-armv7s', 'Xcode', ios_version='10.3', nocodesign=True), + Toolchain('ios-nocodesign-10-3-arm64', 'Xcode', ios_version='10.3', nocodesign=True), + Toolchain('ios-nocodesign-10-3-armv7', 'Xcode', ios_version='10.3', nocodesign=True), + Toolchain('ios-nocodesign-11-0', 'Xcode', ios_version='11.0', nocodesign=True), + Toolchain('ios-nocodesign-11-0-dep-9-0-bitcode-cxx11', 'Xcode', ios_version='11.0', nocodesign=True), + Toolchain('ios-nocodesign-11-0-arm64-dep-9-0-device-libcxx-hid-sections', 'Xcode', ios_version='11.0', nocodesign=True), + Toolchain('ios-nocodesign-11-1', 'Xcode', ios_version='11.1', nocodesign=True), + Toolchain('ios-nocodesign-11-1-dep-9-0-wo-armv7s-bitcode-cxx11', 'Xcode', ios_version='11.1', nocodesign=True), + Toolchain('ios-nocodesign-11-1-dep-9-0-bitcode-cxx11', 'Xcode', ios_version='11.1', nocodesign=True), + Toolchain('ios-nocodesign-11-2-dep-8-0-wo-armv7s-bitcode-cxx11', 'Xcode', ios_version='11.2', nocodesign=True), + Toolchain('ios-nocodesign-11-2-dep-9-0-bitcode-cxx11', 'Xcode', ios_version='11.2', nocodesign=True), + Toolchain('ios-nocodesign-11-2-dep-9-3', 'Xcode', ios_version='11.2', nocodesign=True), + Toolchain('ios-nocodesign-11-2-dep-9-3-armv7', 'Xcode', ios_version='11.2', nocodesign=True), + Toolchain('ios-nocodesign-11-2-dep-9-3-arm64', 'Xcode', ios_version='11.2', nocodesign=True), + Toolchain('ios-nocodesign-11-2-dep-9-3-arm64-armv7', 'Xcode', ios_version='11.2', nocodesign=True), + Toolchain('ios-nocodesign-11-2-dep-9-3-i386-armv7', 'Xcode', ios_version='11.2', nocodesign=True), + Toolchain('ios-nocodesign-11-2', 'Xcode', ios_version='11.2', nocodesign=True), + Toolchain('ios-nocodesign-11-3-dep-9-3', 'Xcode', ios_version='11.3', nocodesign=True), + Toolchain('ios-nocodesign-11-3-dep-9-3-armv7', 'Xcode', ios_version='11.3', nocodesign=True), + Toolchain('ios-nocodesign-11-3-dep-9-3-arm64', 'Xcode', ios_version='11.3', nocodesign=True), + Toolchain('ios-nocodesign-11-3-dep-9-0-bitcode-cxx11', 'Xcode', ios_version='11.3', nocodesign=True), + Toolchain('ios-nocodesign-11-4-dep-9-0-bitcode-cxx11', 'Xcode', ios_version='11.4', nocodesign=True), + Toolchain('ios-nocodesign-12-0-dep-9-0-bitcode-cxx11', 'Xcode', ios_version='12.0', nocodesign=True), + Toolchain('ios-nocodesign-11-4-dep-9-3', 'Xcode', ios_version='11.4', nocodesign=True), + Toolchain('ios-nocodesign-11-4-dep-9-3-arm64', 'Xcode', ios_version='11.4', nocodesign=True), + Toolchain('ios-nocodesign-11-4-dep-9-3-armv7', 'Xcode', ios_version='11.4', nocodesign=True), + Toolchain('ios-nocodesign-12-1-dep-9-3-armv7', 'Xcode', ios_version='12.1', nocodesign=True), + Toolchain('ios-nocodesign-dep-9-0-cxx14', 'Xcode', nocodesign=True), + Toolchain('xcode', 'Xcode'), + Toolchain('xcode-cxx98', 'Xcode'), + Toolchain('xcode-nocxx', 'Xcode'), + Toolchain('xcode-gcc', 'Xcode'), + Toolchain('xcode-hid-sections', 'Xcode'), + Toolchain('xcode-sections', 'Xcode'), + Toolchain('osx-10-7', 'Xcode', osx_version='10.7'), + Toolchain('osx-10-8', 'Xcode', osx_version='10.8'), + Toolchain('osx-10-9', 'Xcode', osx_version='10.9'), + Toolchain('osx-10-10', 'Xcode', osx_version='10.10'), + Toolchain('osx-10-11', 'Xcode', osx_version='10.11'), + Toolchain('osx-10-11-hid-sections', 'Xcode', osx_version='10.11'), + Toolchain('osx-10-11-hid-sections-lto', 'Xcode', osx_version='10.11'), + Toolchain('osx-10-11-lto', 'Xcode', osx_version='10.11'), + Toolchain('osx-10-12', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-12-hid-sections', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-12-lto', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-12-cxx98', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-12-cxx14', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-12-cxx17', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-10-dep-10-7', 'Xcode', osx_version='10.10'), + Toolchain('osx-10-12-dep-10-10', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-12-dep-10-10-lto', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-10-dep-10-9-make', 'Unix Makefiles'), + Toolchain('osx-10-11-make', 'Unix Makefiles'), + Toolchain('osx-10-12-make', 'Unix Makefiles'), + Toolchain('osx-10-12-ninja', 'Ninja'), + Toolchain('osx-10-11-sanitize-address', 'Xcode', osx_version='10.11'), + Toolchain('osx-10-12-sanitize-address', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-12-sanitize-address-hid-sections', 'Xcode', osx_version='10.12'), + Toolchain('osx-10-13', 'Xcode', osx_version='10.13'), + Toolchain('osx-10-13-dep-10-10', 'Xcode', osx_version='10.13'), + Toolchain('osx-10-13-dep-10-10-cxx14', 'Xcode', osx_version='10.13'), + Toolchain('osx-10-13-dep-10-10-cxx17', 'Xcode', osx_version='10.13'), + Toolchain('osx-10-13-make-cxx14', 'Unix Makefiles'), + Toolchain('osx-10-13-cxx14', 'Xcode', osx_version='10.13'), + Toolchain('osx-10-13-cxx17', 'Xcode', osx_version='10.13'), + Toolchain('osx-10-13-i386-cxx14', 'Xcode', osx_version='10.13'), + Toolchain('osx-10-14', 'Xcode', osx_version='10.14'), + Toolchain('osx-10-14-dep-10-10', 'Xcode', osx_version='10.14'), + Toolchain('osx-10-14-dep-10-10-cxx14', 'Xcode', osx_version='10.14'), + Toolchain('osx-10-14-dep-10-10-cxx17', 'Xcode', osx_version='10.14'), + Toolchain('osx-10-14-cxx14', 'Xcode', osx_version='10.14'), + Toolchain('osx-10-14-cxx17', 'Xcode', osx_version='10.14'), + Toolchain('linux-gcc-x64', 'Unix Makefiles'), + ] + +if os.name == 'posix': + toolchain_table += [ + Toolchain('analyze', 'Unix Makefiles'), + Toolchain('analyze-cxx17', 'Unix Makefiles'), + Toolchain('clang-5', 'Unix Makefiles'), + Toolchain('clang-5-cxx14', 'Unix Makefiles'), + Toolchain('clang-5-cxx17', 'Unix Makefiles'), + Toolchain('clang-cxx17', 'Unix Makefiles'), + Toolchain('clang-cxx14', 'Unix Makefiles'), + Toolchain('clang-cxx14-pic', 'Unix Makefiles'), + Toolchain('clang-libcxx', 'Unix Makefiles'), + Toolchain('clang-libcxx-fpic', 'Unix Makefiles'), + Toolchain('clang-libcxx14', 'Unix Makefiles'), + Toolchain('clang-libcxx14-fpic', 'Unix Makefiles'), + Toolchain('clang-libcxx17', 'Unix Makefiles'), + Toolchain('clang-libcxx17-fpic', 'Unix Makefiles'), + Toolchain('clang-lto', 'Unix Makefiles'), + Toolchain('clang-libstdcxx', 'Unix Makefiles'), + Toolchain('clang-omp', 'Unix Makefiles'), + Toolchain('clang-fpic', 'Unix Makefiles'), + Toolchain('clang-fpic-hid-sections', 'Unix Makefiles'), + Toolchain('clang-fpic-static-std', 'Unix Makefiles'), + Toolchain('clang-tidy', 'Unix Makefiles'), + Toolchain('clang-tidy-libcxx', 'Unix Makefiles'), + Toolchain('gcc', 'Unix Makefiles'), + Toolchain('gcc-ninja', 'Ninja'), + Toolchain('gcc-static', 'Unix Makefiles'), + Toolchain('gcc-static-std', 'Unix Makefiles'), + Toolchain('gcc-musl', 'Unix Makefiles'), + Toolchain('gcc-32bit', 'Unix Makefiles'), + Toolchain('gcc-32bit-pic', 'Unix Makefiles'), + Toolchain('gcc-hid', 'Unix Makefiles'), + Toolchain('gcc-hid-fpic', 'Unix Makefiles'), + Toolchain('gcc-gold', 'Unix Makefiles'), + Toolchain('gcc-pic', 'Unix Makefiles'), + Toolchain('gcc-c11', 'Unix Makefiles'), + Toolchain('gcc-cxx14-c11', 'Unix Makefiles'), + Toolchain('gcc-cxx17-c11', 'Unix Makefiles'), + Toolchain('gcc-4-8', 'Unix Makefiles'), + Toolchain('gcc-4-8-c11', 'Unix Makefiles'), + Toolchain('gcc-4-8-pic', 'Unix Makefiles'), + Toolchain('gcc-4-8-pic-hid-sections', 'Unix Makefiles'), + Toolchain('gcc-pic-hid-sections', 'Unix Makefiles'), + Toolchain('gcc-pic-hid-sections-lto', 'Unix Makefiles'), + Toolchain('gcc-5-pic-hid-sections-lto', 'Unix Makefiles'), + Toolchain('gcc-5-pic-hid-sections', 'Unix Makefiles'), + Toolchain('gcc-5', 'Unix Makefiles'), + Toolchain('gcc-5-cxx14-c11', 'Unix Makefiles'), + Toolchain('gcc-6-32bit-cxx14', 'Unix Makefiles'), + Toolchain('gcc-7', 'Unix Makefiles'), + Toolchain('gcc-7-cxx14', 'Unix Makefiles'), + Toolchain('gcc-7-cxx14-pic', 'Unix Makefiles'), + Toolchain('gcc-7-cxx17', 'Unix Makefiles'), + Toolchain('gcc-7-cxx17-gnu', 'Unix Makefiles'), + Toolchain('gcc-7-cxx17-pic', 'Unix Makefiles'), + Toolchain('gcc-7-pic-hid-sections-lto', 'Unix Makefiles'), + Toolchain('gcc-8-cxx14', 'Unix Makefiles'), + Toolchain('gcc-8-cxx14-fpic', 'Unix Makefiles'), + Toolchain('gcc-8-cxx17', 'Unix Makefiles'), + Toolchain('gcc-8-cxx17-fpic', 'Unix Makefiles'), + Toolchain('gcc-cxx98', 'Unix Makefiles'), + Toolchain('gcc-lto', 'Unix Makefiles'), + Toolchain('libcxx', 'Unix Makefiles'), + Toolchain('libcxx14', 'Unix Makefiles'), + Toolchain('libcxx-no-sdk', 'Unix Makefiles'), + Toolchain('libcxx-hid', 'Unix Makefiles'), + Toolchain('libcxx-hid-fpic', 'Unix Makefiles'), + Toolchain('libcxx-fpic-hid-sections', 'Unix Makefiles'), + Toolchain('libcxx-hid-sections', 'Unix Makefiles'), + Toolchain('sanitize-address', 'Unix Makefiles'), + Toolchain('sanitize-address-cxx17', 'Unix Makefiles'), + Toolchain('sanitize-address-cxx17-pic', 'Unix Makefiles'), + Toolchain('sanitize-thread', 'Unix Makefiles'), + Toolchain('sanitize-thread-cxx17', 'Unix Makefiles'), + Toolchain('sanitize-thread-cxx17-pic', 'Unix Makefiles'), + Toolchain('arm-openwrt-linux-muslgnueabi', 'Unix Makefiles'), + Toolchain('openbsd-egcc-cxx11-static-std', 'Unix Makefiles'), + ] + +def get_by_name(name): + for x in toolchain_table: + if name == x.name: + return x + sys.exit('Internal error: toolchain not found in toolchain table') diff --git a/tools/polly/bin/detail/util.py b/tools/polly/bin/detail/util.py new file mode 100755 index 0000000..4b48a10 --- /dev/null +++ b/tools/polly/bin/detail/util.py @@ -0,0 +1,40 @@ +import sys +import subprocess + +def get_environment_from_batch_command(env_cmd, initial=None): + """ + Take a command (either a single command or list of arguments) + and return the environment created after running that command. + Note that if the command must be a batch file or .cmd file, or the + changes to the environment will not be captured. + + If initial is supplied, it is used as the initial environment passed + to the child process. + """ + if not isinstance(env_cmd, (list, tuple)): + env_cmd = [env_cmd] + # construct the command that will alter the environment + env_cmd = subprocess.list2cmdline(env_cmd) + # create a tag so we can tell in the output when the proc is done + tag = 'Done running command' + # construct a cmd.exe command to do accomplish this + cmd = 'cmd.exe /s /c "{env_cmd} && echo "{tag}" && set"'.format(**vars()) + # launch the process + output = subprocess.check_output(cmd, universal_newlines=True) + list_of_output = output.split('\n') + result = dict() + is_environment = False + for i in list_of_output: + if not is_environment: + if i == '"{}" '.format(tag): + is_environment = True + continue + if not i: + continue + eq_index = i.find('=') + if eq_index == -1: + sys.exit('Expected `=`') + var_name = i[0:eq_index] + var_value = i[eq_index + 1:] + result[var_name] = var_value + return result diff --git a/tools/polly/bin/detail/verify_mingw_path.py b/tools/polly/bin/detail/verify_mingw_path.py new file mode 100644 index 0000000..c7589df --- /dev/null +++ b/tools/polly/bin/detail/verify_mingw_path.py @@ -0,0 +1,21 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +import os +import sys + +def verify(mingw_path): + if not mingw_path: + sys.exit( + "Please set environment variable MINGW_PATH " + "to directory with mingw32-make.exe" + ) + if not os.path.isdir(mingw_path): + sys.exit("MINGW_PATH({}) is not a directory".format(mingw_path)) + + mingw_make = os.path.join(mingw_path, 'mingw32-make.exe') + if not os.path.isfile(mingw_make): + sys.exit( + "File mingw32-make.exe not found in " + "directory `{}` (MINGW_PATH environment variable)".format(mingw_path) + ) diff --git a/tools/polly/bin/detail/verify_msys_path.py b/tools/polly/bin/detail/verify_msys_path.py new file mode 100644 index 0000000..6e95629 --- /dev/null +++ b/tools/polly/bin/detail/verify_msys_path.py @@ -0,0 +1,28 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +import os +import sys + +def verify(msys_path): + if not msys_path: + sys.exit( + "Please set environment variable MSYS_PATH " + "to directory with make.exe" + ) + make_found = False + for path in msys_path.split(';'): + if not os.path.isdir(path): + sys.exit( + "One of the MSYS_PATH components is not a directory: {} ". + format(path) + ) + msys_make = os.path.join(path, 'make.exe') + if os.path.isfile(msys_make): + make_found = True + + if not make_found: + sys.exit( + "File make.exe not found in " + "directories `{}` (MSYS_PATH environment variable)".format(msys_path) + ) diff --git a/tools/polly/bin/detail/win32.py b/tools/polly/bin/detail/win32.py new file mode 100755 index 0000000..c1d3677 --- /dev/null +++ b/tools/polly/bin/detail/win32.py @@ -0,0 +1,20 @@ +import ctypes +from ctypes import wintypes + +_GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW +_GetShortPathNameW.argtypes = [wintypes.LPCWSTR, wintypes.LPWSTR, wintypes.DWORD] +_GetShortPathNameW.restype = wintypes.DWORD + +def get_short_path_name(long_name): + """ + Gets the short path name of a given long path. + http://stackoverflow.com/a/23598461/200291 + """ + output_buf_size = 0 + while True: + output_buf = ctypes.create_unicode_buffer(output_buf_size) + needed = _GetShortPathNameW(long_name, output_buf, output_buf_size) + if output_buf_size >= needed: + return output_buf.value + else: + output_buf_size = needed diff --git a/tools/polly/bin/install-ci-dependencies.py b/tools/polly/bin/install-ci-dependencies.py new file mode 100755 index 0000000..0ff6064 --- /dev/null +++ b/tools/polly/bin/install-ci-dependencies.py @@ -0,0 +1,279 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +import argparse +import hashlib +import os +import platform +import requests +import shutil +import stat +import subprocess +import sys +import tarfile +import tempfile +import time +import zipfile + +print( + 'Python version: {}.{}'.format( + sys.version_info.major, sys.version_info.minor + ) +) + +parser = argparse.ArgumentParser( + description='Install dependencies for CI testing' +) + +parser.add_argument( + '--prune-archives', + action='store_true', + help="Remove downloaded archives after unpack finished" +) + +args = parser.parse_args() + +class FileToDownload: + def __init__(self, url, sha1, local_path, unpack_dir): + self.url = url + self.sha1 = sha1 + self.local_path = local_path + self.unpack_dir = unpack_dir + + self.download() + self.unpack() + + def download(self): + ok = self.hash_match() + if ok: + print('File already downloaded: {}'.format(self.local_path)) + else: + self.real_file_download() + assert(self.hash_match() == True) + + def hash_match(self): + if not os.path.exists(self.local_path): + print('File not exists: {}'.format(self.local_path)) + return False + sha1_of_file = hashlib.sha1(open(self.local_path, 'rb').read()).hexdigest() + ok = (sha1_of_file == self.sha1) + if ok: + return True + else: + print('SHA1 mismatch for file {}:'.format(self.local_path)) + print(' {} (real)'.format(sha1_of_file)) + print(' {} (expected)'.format(self.sha1)) + return False + + def real_file_download(self): + max_retry = 3 + for i in range(max_retry): + try: + self.real_file_download_once() + print('Done') + return + except Exception as exc: + print('Exception catched ({}), retry... ({} of {})'.format(exc, i+1, max_retry)) + time.sleep(60) + sys.exit('Download failed') + + # http://stackoverflow.com/a/16696317/2288008 + def real_file_download_once(self): + print('Downloading:\n {}\n -> {}'.format(self.url, self.local_path)) + r = requests.get(self.url, stream=True) + if not r.ok: + raise Exception('Downloading failed: {}'.format(self.url)) + with open(self.local_path, 'wb') as f: + for chunk in r.iter_content(chunk_size=16*1024): + if chunk: + f.write(chunk) + + def unpack(self): + print('Unpacking {}'.format(self.local_path)) + last_cwd = os.getcwd() + os.chdir(self.unpack_dir) + if self.url.endswith('.tar.gz'): + tar_archive = tarfile.open(self.local_path) + tar_archive.extractall(path=self.unpack_dir) + tar_archive.close() + elif self.url.endswith('.zip'): + # Can't use ZipFile module because permissions will be lost, see bug: + # * https://bugs.python.org/issue15795 + w = tempfile.NamedTemporaryFile() + subprocess.check_call(['unzip', self.local_path], stdout=w, stderr=w, bufsize=0) + elif self.url.endswith('.bin'): + os.chmod(self.local_path, os.stat(self.local_path).st_mode | stat.S_IEXEC) + devnull = open(os.devnull, 'w') # subprocess.DEVNULL is not available for Python 3.2 + subprocess.check_call(self.local_path, stdout=devnull) + else: + sys.exit('Unknown archive format') + os.chdir(last_cwd) + if args.prune_archives: + print('Removing {}'.format(self.local_path)) + os.remove(self.local_path) + +### Parse toolchain name + +toolchain = os.getenv('TOOLCHAIN') +if toolchain is None: + toolchain = '' + print('** WARNING ** Environment variable TOOLCHAIN is empty') + +def get_android_full_version_url(): + if toolchain.startswith('android-ndk-r10e-'): + if platform.system() == 'Darwin': + return 'http://dl.google.com/android/ndk/android-ndk-r10e-darwin-x86_64.bin', 'b57c2b9213251180dcab794352bfc9a241bf2557', + if platform.system() == 'Linux': + return 'http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', 'c685e5f106f8daa9b5449d0a4f21ee8c0afcb2f6', + + if toolchain.startswith('android-ndk-r11c-'): + if platform.system() == 'Darwin': + return 'http://dl.google.com/android/repository/android-ndk-r11c-darwin-x86_64.zip', '4ce8e7ed8dfe08c5fe58aedf7f46be2a97564696', + if platform.system() == 'Linux': + return 'http://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', 'de5ce9bddeee16fb6af2b9117e9566352aa7e279', + + if toolchain.startswith('android-ndk-r15c-'): + if platform.system() == 'Darwin': + return 'https://dl.google.com/android/repository/android-ndk-r15c-darwin-x86_64.zip', 'ea4b5d76475db84745aa8828000d009625fc1f98', + if platform.system() == 'Linux': + return 'https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip', '0bf02d4e8b85fd770fd7b9b2cdec57f9441f27a2', + + if toolchain.startswith('android-ndk-r16b-'): + if platform.system() == 'Darwin': + return 'https://dl.google.com/android/repository/android-ndk-r16b-darwin-x86_64.zip', 'e51e615449b98c716cf912057e2682e75d55e2de', + if platform.system() == 'Linux': + return 'https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip', '42aa43aae89a50d1c66c3f9fdecd676936da6128', + + if toolchain.startswith('android-ndk-r17-'): + if platform.system() == 'Darwin': + return 'https://dl.google.com/android/repository/android-ndk-r17-darwin-x86_64.zip', '08015290bf88ba8fb348d7f5380929c2106524b3', + if platform.system() == 'Linux': + return 'https://dl.google.com/android/repository/android-ndk-r17-linux-x86_64.zip', '1d886a64483adf3f3a3e3aaf7ac5084184006ac7', + + sys.exit('Android supported only for Linux and OSX') + +def get_android_url(): + if not os.getenv('TRAVIS'): + return get_android_full_version_url() + if toolchain == 'android-ndk-r10e-api-19-armeabi-v7a-neon': + if platform.system() == 'Linux': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.0/android-ndk-r10e-arm-linux-androideabi-4.9-gnu-libstdc.-4.9-armeabi-v7a-android-19-arch-arm-Linux.tar.gz', '847177799b0fe4f7480f910bbf1815c3e3fed0da' + if platform.system() == 'Darwin': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.0/android-ndk-r10e-arm-linux-androideabi-4.9-gnu-libstdc.-4.9-armeabi-v7a-android-19-arch-arm-Darwin.tar.gz', 'e568e9a8f562e7d1bc06f93e6f7cc7f44df3ded2' + if toolchain == 'android-ndk-r11c-api-19-armeabi-v7a-neon': + if platform.system() == 'Linux': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.1/android-ndk-r11c-arm-linux-androideabi-4.9-gnu-libstdc.-4.9-armeabi-v7a-android-19-arch-arm-Linux.tar.gz', '2e0da01961e0031bfd7d8db6ce4a15372bd8c3e8' + if platform.system() == 'Darwin': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.1/android-ndk-r11c-arm-linux-androideabi-4.9-gnu-libstdc.-4.9-armeabi-v7a-android-19-arch-arm-Darwin.tar.gz', '664b3c8104142de2af16f887c19d1b2e618725cb' + if toolchain == 'android-ndk-r15c-api-21-armeabi-v7a-neon-clang-libcxx': + if platform.system() == 'Linux': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.1/android-ndk-r15c-arm-linux-androideabi-4.9-llvm-libc.-android-21-arch-arm-Linux.tar.gz', '952403abedc3960b6d6eee35aeed940d935baaea' + if platform.system() == 'Darwin': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.1/android-ndk-r15c-arm-linux-androideabi-4.9-llvm-libc.-android-21-arch-arm-Darwin.tar.gz', '978ef8b724dc3691a128d8f48a8440172478d82b' + if toolchain == 'android-ndk-r16b-api-24-armeabi-v7a-neon-clang-libcxx': + if platform.system() == 'Linux': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.1/android-ndk-r16b-arm-linux-androideabi-4.9-llvm-libc.-android-24-arch-arm-Linux.tar.gz', 'b9ee32e31376fd5fe090172169f14faf50af6b68' + + if toolchain == 'android-ndk-r16b-api-24-arm64-v8a-clang-libcxx14': + if platform.system() == 'Linux': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.1/android-ndk-r16b-aarch64-linux-android-4.9-llvm-libc.-android-24-arch-arm64-Linux.tar.gz', 'b897dcb942df95ffb5903e181d5a2e27706c41f3' + + if toolchain == 'android-ndk-r17-api-24-arm64-v8a-clang-libcxx14': + if platform.system() == 'Linux': + return 'https://github.com/hunter-packages/android-ndk/releases/download/v1.0.2/android-ndk-r17-aarch64-linux-android-4.9-llvm-libc.-android-24-arch-arm64-Linux.tar.gz', 'ebc3a849efcd056d8e8362b9cc2e46b5efd78df6' + + return get_android_full_version_url() + +def get_cmake_url(): + if platform.system() == 'Darwin': + return ( + 'https://github.com/ruslo/CMake/releases/download/v3.13.2/cmake-3.13.2-Darwin-x86_64.tar.gz', + 'c05a2cd2977916e41989808c5061f7b00ac17b7b' + ) + elif platform.system() == 'Linux': + return ( + 'https://github.com/ruslo/CMake/releases/download/v3.13.2/cmake-3.13.2-Linux-x86_64.tar.gz', + 'd5c0aeebc8e313f3e61ec9198059e66f8cd4c3c6' + ) + elif platform.system() == 'Windows': + return ( + 'https://github.com/ruslo/CMake/releases/download/v3.13.2/cmake-3.13.2-win64-x64.zip', + 'f02a6b816d0deb7f8c29dc22c86a233fc418eb8f' + ) + else: + sys.exit('Unknown system: {}'.format(platform.system())) + +is_android = toolchain.startswith('android-') +is_ninja = toolchain.startswith('ninja-') + +### Prepare directories + +ci_dir = os.path.join(os.getcwd(), '_ci') + +if not os.path.exists(ci_dir): + os.mkdir(ci_dir) + +cmake_url, cmake_sha1 = get_cmake_url() +cmake_archive_local = cmake_url.split('/')[-1] +cmake_archive_local = os.path.join(ci_dir, cmake_archive_local) + +ninja_archive_local = os.path.join(ci_dir, 'ninja.zip') + +if is_android: + url, sha1 = get_android_url() + android_archive_local = url.split('/')[-1] +else: + android_archive_local = 'android.bin' +android_archive_local = os.path.join(ci_dir, android_archive_local) + +expected_files = [ + cmake_archive_local, android_archive_local, ninja_archive_local +] + +for i in os.listdir(ci_dir): + dir_item = os.path.join(ci_dir, i) + expected = (dir_item in expected_files) + if os.path.isdir(dir_item): + print('Removing directory: {}'.format(dir_item)) + shutil.rmtree(dir_item) + elif not expected: + print('Removing file: {}'.format(dir_item)) + os.remove(dir_item) + +cmake_dir = os.path.join(ci_dir, 'cmake') +ninja_dir = os.path.join(ci_dir, 'ninja') + +### Downloading files + +# https://cmake.org/download/ + +FileToDownload(cmake_url, cmake_sha1, cmake_archive_local, ci_dir) + +if is_android: + url, sha1 = get_android_url() + FileToDownload(url, sha1, android_archive_local, ci_dir) + +if is_ninja: + ninja = FileToDownload( + 'https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-win.zip', + '637cc6e144f5cc7c6388a30f3c32ad81b2e0442e', + ninja_archive_local, + ci_dir + ) + +### Unify directories + +for i in os.listdir(ci_dir): + src = os.path.join(ci_dir, i) + if i.startswith('cmake') and os.path.isdir(src): + macosx_contents = os.path.join(src, 'CMake.app', 'Contents') + if os.path.isdir(macosx_contents): + os.rename(macosx_contents, cmake_dir) + else: + os.rename(src, cmake_dir) + + if i == 'ninja.exe': + os.mkdir(ninja_dir) + os.rename(src, os.path.join(ninja_dir, i)) diff --git a/tools/polly/bin/polly b/tools/polly/bin/polly new file mode 100755 index 0000000..575f8f9 --- /dev/null +++ b/tools/polly/bin/polly @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 + +from os.path import realpath, dirname, join +from sys import argv + +polly_py = join(dirname(realpath(argv[0])), 'polly.py') +exec(open(polly_py, 'r').read()) diff --git a/tools/polly/bin/polly.bat b/tools/polly/bin/polly.bat new file mode 100644 index 0000000..89e266f --- /dev/null +++ b/tools/polly/bin/polly.bat @@ -0,0 +1 @@ +python %~dp0\\polly.py %* diff --git a/tools/polly/bin/polly.py b/tools/polly/bin/polly.py new file mode 100755 index 0000000..9d817f4 --- /dev/null +++ b/tools/polly/bin/polly.py @@ -0,0 +1,547 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2014-2015, Ruslan Baratov +# All rights reserved. + +import argparse +import os +import platform +import shutil +import sys + +import detail.call +import detail.cpack_generator +import detail.create_archive +import detail.create_framework +import detail.generate_command +import detail.get_nmake_environment +import detail.ios_dev_root +import detail.logging +import detail.open_project +import detail.osx_dev_root +import detail.pack_command +import detail.rmtree +import detail.target +import detail.test_command +import detail.timer +import detail.toolchain_name +import detail.toolchain_table +import detail.verify_mingw_path +import detail.verify_msys_path + +toolchain_table = detail.toolchain_table.toolchain_table + +assert(sys.version_info.major == 3) +assert(sys.version_info.minor >= 2) # Current cygwin version is 3.2.3 + +print( + 'Python version: {}.{}'.format( + sys.version_info.major, sys.version_info.minor + ) +) + +description=""" +Script for building. Available toolchains:\n +""" + +for x in toolchain_table: + description += ' ' + x.name + '\n' + +parser = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, + description=description +) + +parser.add_argument( + '--toolchain', + choices=[x.name for x in toolchain_table], + help="CMake generator/toolchain", +) + +parser.add_argument( + '--config', + help="CMake build type (Release, Debug, ...)", +) + +parser.add_argument( + '--keep-going', + action='store_true', + help="Continue as much as possible after an error. see make -k" +) + +parser.add_argument( + '--config-all', + help="CMake build type for project and hunter packages: --config --fwd HUNTER_CONFIGURATION_TYPES=", +) + +parser.add_argument( + '--home', + help="Project home directory (directory with CMakeLists.txt)" +) + +parser.add_argument( + '--output', + help="Project build directory (i.e., cmake -B)" +) + +parser.add_argument( + '--cache', + help="CMake -C = Pre-load a script to populate the cache." +) + +parser.add_argument('--test', action='store_true', help="Run ctest after build") +parser.add_argument('--test-xml', help="Save ctest output to xml") + +parser.add_argument( + '--pack', + choices=detail.cpack_generator.available_generators, + nargs='?', + const=detail.cpack_generator.default(), + help="Run cpack after build" +) +parser.add_argument( + '--archive', + help="Create an archive of locally installed files" +) +parser.add_argument( + '--nobuild', action='store_true', help="Do not build (only generate)" +) +parser.add_argument( + '--open', action='store_true', help="Open generated project (for IDE)" +) + +verbosity_group=parser.add_mutually_exclusive_group() +verbosity_group.add_argument( + '--verbosity-level', dest='verbosity', help="Verbosity level", + choices=['silent', 'normal', 'full'], default='normal' +) +verbosity_group.add_argument('--verbose', action='store_true', help="Full verbose output") + +parser.add_argument( + '--install', action='store_true', help="Run install (local directory)" +) +parser.add_argument( + '--ios-multiarch', + action='store_true', + help="Build multi-architecture binary (effectively add CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO)" +) +parser.add_argument( + '--ios-combined', + action='store_true', + help="Combine iOS simulator and device libraries on install (effectively add CMAKE_IOS_INSTALL_COMBINED=YES)" +) +parser.add_argument( + '--framework', action='store_true', help="Create framework" +) +parser.add_argument( + '--framework-device', + action='store_true', + help="Create framework for device (exclude simulator architectures)" +) +parser.add_argument( + '--framework-lib', + default='*', + help="Regular expression for the source library used for --framework" +) +parser.add_argument( + '--strip', action='store_true', help="Run strip/install cmake targets" +) +parser.add_argument( + '--identity', + help="Specify code signing identity for --framework" +) +parser.add_argument( + '--plist', + help="User specified Info.plist file for --framework" +) +parser.add_argument( + '--clear', + action='store_true', + help="Remove build and install dirs before build" +) +parser.add_argument( + '--reconfig', + action='store_true', + help="Run configure even if CMakeCache.txt exists. Used to add new args." +) +parser.add_argument( + '--fwd', + nargs='*', + help="Arguments to cmake without '-D', like:\nBOOST_ROOT=/some/path" +) +parser.add_argument( + '--iossim', + action='store_true', + help="Build for ios i386 simulator" +) + +parser.add_argument( + '--jobs', + type=int, + help="Number of concurrent build operations" +) + +parser.add_argument( + '--target', + help="Target to build for the 'cmake --build' command" +) + +def PositiveInt(string): + value = int(string) + if value > 0: + return value + m = 'Should be greater that zero: {}'.format(string) + raise argparse.ArgumentTypeError(m) + +parser.add_argument( + '--discard', + type=PositiveInt, + help='Option to reduce output. Discard every N lines of execution messages' + ' (note that full log is still available in log.txt)' +) + +parser.add_argument( + '--tail', + type=PositiveInt, + help='Print last N lines if build failed' +) + +parser.add_argument( + '--timeout', + type=PositiveInt, + help='Timeout for CTest' +) + +parser.add_argument( + '--cmake', + help="CMake binary (cmake or cmake3)" +) + +parser.add_argument( + '--cpack', + help="CPack binary (cpack or cpack3)" +) + +parser.add_argument( + '--ctest', + help="CTest binary (ctest or ctest3)" +) + +args = parser.parse_args() + +polly_toolchain = detail.toolchain_name.get(args.toolchain) +toolchain_entry = detail.toolchain_table.get_by_name(polly_toolchain) +cpack_generator = args.pack + +polly_root = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..') +polly_root = os.path.realpath(polly_root) + +if args.config and args.config_all: + sys.exit('Must specify --config or --config-all but not both') + +if args.config_all: + args.config = args.config_all + +"""Build directory tag""" +if args.config and not toolchain_entry.multiconfig: + build_tag = "{}-{}".format(polly_toolchain, args.config) +else: + build_tag = polly_toolchain + +"""Tune environment""" +if toolchain_entry.name.startswith('mingw'): + mingw_path = os.getenv("MINGW_PATH") + detail.verify_mingw_path.verify(mingw_path) + os.environ['PATH'] = "{};{}".format(mingw_path, os.getenv('PATH')) + +if toolchain_entry.name.startswith('msys'): + msys_path = os.getenv("MSYS_PATH") + detail.verify_msys_path.verify(msys_path) + os.environ['PATH'] = "{};{}".format(msys_path, os.getenv('PATH')) + +vs_ninja = toolchain_entry.is_ninja and toolchain_entry.vs_version +if toolchain_entry.is_nmake or vs_ninja: + os.environ = detail.get_nmake_environment.get( + toolchain_entry.arch, toolchain_entry.vs_version + ) + +if toolchain_entry.ios_version: + ios_dev_root = detail.ios_dev_root.get(toolchain_entry.ios_version) + if ios_dev_root: + print("Set environment DEVELOPER_DIR to {}".format(ios_dev_root)) + os.environ['DEVELOPER_DIR'] = ios_dev_root + +if toolchain_entry.nocodesign: + xcconfig = os.path.join(polly_root, 'scripts', 'NoCodeSign.xcconfig') + print("Set environment XCODE_XCCONFIG_FILE to {}".format(xcconfig)) + os.environ['XCODE_XCCONFIG_FILE'] = xcconfig + +if toolchain_entry.osx_version: + osx_dev_root = detail.osx_dev_root.get(toolchain_entry.osx_version) + if osx_dev_root: + print("Set environment DEVELOPER_DIR to {}".format(osx_dev_root)) + os.environ['DEVELOPER_DIR'] = osx_dev_root + +toolchain_path = os.path.join(polly_root, "{}.cmake".format(polly_toolchain)) +if not os.path.exists(toolchain_path): + sys.exit("Toolchain file not found: {}".format(toolchain_path)) +toolchain_option = "-DCMAKE_TOOLCHAIN_FILE={}".format(toolchain_path) + +if args.output: + if not os.path.isdir(args.output): + sys.exit("Specified build directory does not exist: {}".format(args.output)) + if not os.access(args.output, os.W_OK): + sys.exit("Specified build directory is not writeable: {}".format(args.output)) + cdir = args.output +else: + cdir = os.getcwd() + +build_dir = os.path.join(cdir, '_builds', build_tag) +print("Build dir: {}".format(build_dir)) +build_dir_option = "-B{}".format(build_dir) + +install_dir = os.path.join(cdir, '_install', polly_toolchain) +local_install = args.install or args.strip or args.framework or args.framework_device or args.archive + +if args.install and args.strip: + sys.exit('Both --install and --strip specified') + +if args.strip: + install_target_name = 'install/strip' +elif local_install: + install_target_name = 'install' +else: + install_target_name = '' # not used + +target = detail.target.Target() + +target.add(condition=local_install, name=install_target_name) +target.add(condition=args.target, name=args.target) + +# After 'target.add' +if args.strip and not toolchain_entry.is_make: + sys.exit('CMake install/strip targets are only supported for the Unix Makefile generator') + +if local_install: + install_dir_option = "-DCMAKE_INSTALL_PREFIX={}".format(install_dir) + +if (args.framework or args.framework_device) and platform.system() != 'Darwin': + sys.exit('Framework creation only for Mac OS X') +framework_dir = os.path.join(cdir, '_framework', polly_toolchain) +archives_dir = os.path.join(cdir, '_archives') + +if args.clear: + detail.rmtree.rmtree(build_dir) + detail.rmtree.rmtree(install_dir) + detail.rmtree.rmtree(framework_dir) + +# --verbose flag triggers full verbosity level +if args.verbose: + args.verbosity='full' + +polly_temp_dir = os.path.join(build_dir, '_3rdParty', 'polly') +if not os.path.exists(polly_temp_dir): + os.makedirs(polly_temp_dir) +logging = detail.logging.Logging( + cdir, args.verbosity, args.discard, args.tail, polly_toolchain +) + +if args.cmake: + cmake_bin = args.cmake +else: + cmake_bin = 'cmake' + +if os.path.isabs(cmake_bin): + if not os.path.exists(cmake_bin): + sys.exit("CMake binary not found: {}".format(cmake_bin)) +else: + if os.name == 'nt': + # Windows + detail.call.call(['where', cmake_bin], logging) + else: + detail.call.call(['which', cmake_bin], logging) +detail.call.call([cmake_bin, '--version'], logging) + +home = '.' +if args.home: + home = args.home + +generate_command = [ + cmake_bin, + '-H{}'.format(home), + build_dir_option +] + +if args.cache: + if not os.path.isfile(args.cache): + sys.exit("Specified cache file does not exist: {}".format(args.cache)) + if not os.access(args.cache, os.R_OK): + sys.exit("Specified cache file is not readable: {}".format(args.cache)) + generate_command.append("-C{}".format(args.cache)) + +if (args.config and not toolchain_entry.multiconfig) or args.config_all: + generate_command.append("-DCMAKE_BUILD_TYPE={}".format(args.config)) + +if toolchain_entry.generator: + generate_command.append('-G{}'.format(toolchain_entry.generator)) + +if toolchain_entry.toolset: + generate_command.append('-T{}'.format(toolchain_entry.toolset)) + +if toolchain_entry.xp: + toolset = 'v{}0_xp'.format(toolchain_entry.vs_version) + generate_command.append('-T{}'.format(toolset)) + +if toolchain_option: + generate_command.append(toolchain_option) + +if args.verbosity == 'full': + generate_command.append('-DCMAKE_VERBOSE_MAKEFILE=ON') + generate_command.append('-DPOLLY_STATUS_DEBUG=ON') + generate_command.append('-DHUNTER_STATUS_DEBUG=ON') + +if args.ios_multiarch: + generate_command.append('-DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO') + +if args.ios_combined: + generate_command.append('-DCMAKE_IOS_INSTALL_COMBINED=YES') + +if local_install: + generate_command.append(install_dir_option) + +if cpack_generator: + generate_command.append('-DCPACK_GENERATOR={}'.format(cpack_generator)) + +if args.fwd != None: + for x in args.fwd: + generate_command.append("-D{}".format(x)) + +if args.config_all: + generate_command.append("-DHUNTER_CONFIGURATION_TYPES={}".format(args.config_all)) + +timer = detail.timer.Timer() + +timer.start('Generate') +detail.generate_command.run( + generate_command, build_dir, polly_temp_dir, args.reconfig, logging +) +timer.stop() + +build_command = [ + cmake_bin, + '--build', + build_dir +] + +if args.config: + build_command.append('--config') + build_command.append(args.config) + +build_command += target.args() + +# NOTE: This must be the last `build_command` modification! +build_command.append('--') + +if args.iossim: + build_command.append('-arch') + build_command.append('i386') + build_command.append('-sdk') + build_command.append('iphonesimulator') + +if args.jobs: + if toolchain_entry.is_xcode: + build_command.append('-jobs') + build_command.append('{}'.format(args.jobs)) + elif toolchain_entry.is_make and not toolchain_entry.is_nmake: + build_command.append('-j') + build_command.append('{}'.format(args.jobs)) + elif toolchain_entry.is_msvc and (int(toolchain_entry.vs_version) >= 12): + build_command.append('/maxcpucount:{}'.format(args.jobs)) + +if args.keep_going: + if toolchain_entry.is_make: + build_command.append('-k') ## keep going + +if not args.nobuild: + timer.start('Build') + + if toolchain_entry.is_xcode: + # Workaround for https://gitlab.kitware.com/cmake/cmake/issues/17851 + zero_check_command = [ + cmake_bin, + '--build', + build_dir, + '--target', + 'ZERO_CHECK' + ] + detail.call.call(zero_check_command, logging, sleep=1) + + detail.call.call(build_command, logging, sleep=1) + timer.stop() + + if args.archive: + timer.start('Archive creation') + detail.create_archive.run( + install_dir, + archives_dir, + args.archive, + toolchain_entry.name, + args.config + ) + timer.stop() + + if args.framework or args.framework_device: + timer.start('Framework creation') + detail.create_framework.run( + install_dir, + framework_dir, + toolchain_entry.ios_version, + polly_root, + args.framework_device, + logging, + args.plist, + args.identity, + args.framework_lib + ) + timer.stop() + +if not args.nobuild: + os.chdir(build_dir) + if args.test or args.test_xml: + timer.start('Test') + + if args.ctest: + ctest_bin = args.ctest + else: + ctest_bin = 'ctest' + + if os.path.isabs(ctest_bin): + if not os.path.exists(ctest_bin): + sys.exit("Ctest binary not found: {}".format(ctest_bin)) + + detail.test_command.run(build_dir, args.config, logging, args.test_xml, args.verbosity == 'full', args.timeout, ctest_bin) + timer.stop() + if args.pack: + timer.start('Pack') + + if args.cpack: + cpack_bin = args.cpack + else: + cpack_bin = 'cpack' + + if os.path.isabs(cpack_bin): + if not os.path.exists(cpack_bin): + sys.exit("CPack binary not found: {}".format(cpack_bin)) + + detail.pack_command.run(args.config, logging, cpack_generator, cpack_bin, cmake_bin) + timer.stop() + +if args.open: + detail.open_project.open(toolchain_entry, build_dir, logging) + +print('-') +print('Log saved: {}'.format(logging.log_path)) +print('-') +timer.result() +print('-') +print('SUCCESS') diff --git a/tools/polly/clang-5-cxx14.cmake b/tools/polly/clang-5-cxx14.cmake new file mode 100644 index 0000000..6a7a598 --- /dev/null +++ b/tools/polly/clang-5-cxx14.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_5_CXX14_CMAKE_) + return() +else() + set(POLLY_CLANG_5_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang 5 / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang-5.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/clang-5-cxx17.cmake b/tools/polly/clang-5-cxx17.cmake new file mode 100644 index 0000000..c979522 --- /dev/null +++ b/tools/polly/clang-5-cxx17.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_5_CXX17_CMAKE_) + return() +else() + set(POLLY_CLANG_5_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang 5 / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang-5.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") diff --git a/tools/polly/clang-5.cmake b/tools/polly/clang-5.cmake new file mode 100644 index 0000000..1d4db43 --- /dev/null +++ b/tools/polly/clang-5.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_5_CMAKE_) + return() +else() + set(POLLY_CLANG_5_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang 5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang-5.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/clang-cxx14-pic.cmake b/tools/polly/clang-cxx14-pic.cmake new file mode 100644 index 0000000..ab3bfa9 --- /dev/null +++ b/tools/polly/clang-cxx14-pic.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_CXX14_PIC_CMAKE_) + return() +else() + set(POLLY_CLANG_CXX14_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / c++14 support / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/clang-cxx14.cmake b/tools/polly/clang-cxx14.cmake new file mode 100644 index 0000000..b8e7716 --- /dev/null +++ b/tools/polly/clang-cxx14.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_CXX14_CMAKE_) + return() +else() + set(POLLY_CLANG_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/clang-cxx17.cmake b/tools/polly/clang-cxx17.cmake new file mode 100644 index 0000000..6edb96f --- /dev/null +++ b/tools/polly/clang-cxx17.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_CXX17_CMAKE_) + return() +else() + set(POLLY_CLANG_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") diff --git a/tools/polly/clang-fpic-hid-sections.cmake b/tools/polly/clang-fpic-hid-sections.cmake new file mode 100644 index 0000000..1059de9 --- /dev/null +++ b/tools/polly/clang-fpic-hid-sections.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2013, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_FPIC_HID_SECTIONS_) + return() +else() + set(POLLY_CLANG_FPIC_HID_SECTIONS_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / PIC / \ +c++11 support / hidden / data-sections / function-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/clang-fpic-static-std.cmake b/tools/polly/clang-fpic-static-std.cmake new file mode 100644 index 0000000..d695f2a --- /dev/null +++ b/tools/polly/clang-fpic-static-std.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBSTDCXX_CMAKE) + return() +else() + set(POLLY_CLANG_LIBSTDCXX_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / GNU Standard C++ Library (libstdc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libstdcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static-std.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-fpic.cmake b/tools/polly/clang-fpic.cmake new file mode 100644 index 0000000..9a33c20 --- /dev/null +++ b/tools/polly/clang-fpic.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBSTDCXX_FPIC_CMAKE) + return() +else() + set(POLLY_CLANG_LIBSTDCXX_FPIC_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / GNU Standard C++ Library (libstdc++) / c++11 support / Position-Independent Code" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libstdcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-libcxx-fpic.cmake b/tools/polly/clang-libcxx-fpic.cmake new file mode 100644 index 0000000..c7b2264 --- /dev/null +++ b/tools/polly/clang-libcxx-fpic.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_FPIC_CMAKE) + return() +else() + set(POLLY_CLANG_LIBCXX_FPIC_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++11 support / Position-Independent Code" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-libcxx.cmake b/tools/polly/clang-libcxx.cmake new file mode 100644 index 0000000..29b05ed --- /dev/null +++ b/tools/polly/clang-libcxx.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_CMAKE) + return() +else() + set(POLLY_CLANG_LIBCXX_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-libcxx14-fpic.cmake b/tools/polly/clang-libcxx14-fpic.cmake new file mode 100644 index 0000000..8733d3e --- /dev/null +++ b/tools/polly/clang-libcxx14-fpic.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX14_FPIC_CMAKE) + return() +else() + set(POLLY_CLANG_LIBCXX14_FPIC_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++14 support / Position-Independent Code" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-libcxx14.cmake b/tools/polly/clang-libcxx14.cmake new file mode 100644 index 0000000..37fd84e --- /dev/null +++ b/tools/polly/clang-libcxx14.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX14_CMAKE) + return() +else() + set(POLLY_CLANG_LIBCXX14_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-libcxx17-fpic.cmake b/tools/polly/clang-libcxx17-fpic.cmake new file mode 100644 index 0000000..917c221 --- /dev/null +++ b/tools/polly/clang-libcxx17-fpic.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX17_FPIC_CMAKE) + return() +else() + set(POLLY_CLANG_LIBCXX17_FPIC_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++17 support / Position-Independent Code" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-libcxx17.cmake b/tools/polly/clang-libcxx17.cmake new file mode 100644 index 0000000..cbd5825 --- /dev/null +++ b/tools/polly/clang-libcxx17.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX17_CMAKE) + return() +else() + set(POLLY_CLANG_LIBCXX17_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-libstdcxx.cmake b/tools/polly/clang-libstdcxx.cmake new file mode 100644 index 0000000..5a96a7d --- /dev/null +++ b/tools/polly/clang-libstdcxx.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBSTDCXX_CMAKE) + return() +else() + set(POLLY_CLANG_LIBSTDCXX_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / GNU Standard C++ Library (libstdc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libstdcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-lto.cmake b/tools/polly/clang-lto.cmake new file mode 100644 index 0000000..1b9c19f --- /dev/null +++ b/tools/polly/clang-lto.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LTO_CMAKE_) + return() +else() + set(POLLY_CLANG_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++11 support / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") diff --git a/tools/polly/clang-omp.cmake b/tools/polly/clang-omp.cmake new file mode 100644 index 0000000..67850df --- /dev/null +++ b/tools/polly/clang-omp.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_OMP_CMAKE_) + return() +else() + set(POLLY_CLANG_OMP_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / OpenMP / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang-omp.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/clang-tidy-libcxx.cmake b/tools/polly/clang-tidy-libcxx.cmake new file mode 100644 index 0000000..05d0aea --- /dev/null +++ b/tools/polly/clang-tidy-libcxx.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_TIDY_LIBCXX_CMAKE_) + return() +else() + set(POLLY_CLANG_TIDY_LIBCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang tidy / LLVM Standard C++ Library (libc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/clang-tidy.cmake") diff --git a/tools/polly/clang-tidy.cmake b/tools/polly/clang-tidy.cmake new file mode 100644 index 0000000..53c20a0 --- /dev/null +++ b/tools/polly/clang-tidy.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_TIDY_CMAKE_) + return() +else() + set(POLLY_CLANG_TIDY_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang tidy / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/clang-tidy.cmake") diff --git a/tools/polly/compiler/cl.cmake b/tools/polly/compiler/cl.cmake new file mode 100644 index 0000000..c98d888 --- /dev/null +++ b/tools/polly/compiler/cl.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_CL_CMAKE_) + return() +else() + set(POLLY_COMPILER_CL_CMAKE_ 1) +endif() + +find_program(CMAKE_C_COMPILER cl) +find_program(CMAKE_CXX_COMPILER cl) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("cl not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("cl not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/clang-5.cmake b/tools/polly/compiler/clang-5.cmake new file mode 100644 index 0000000..025ee4f --- /dev/null +++ b/tools/polly/compiler/clang-5.cmake @@ -0,0 +1,47 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_COMPILER_CLANG_5_CMAKE) + return() +else() + set(POLLY_COMPILER_CLANG_5_CMAKE 1) +endif() + +include(polly_fatal_error) + +if(XCODE_VERSION) + set(_err "This toolchain is not available for Xcode") + set(_err "${_err} because Xcode ignores CMAKE_C(XX)_COMPILER variable.") + set(_err "${_err} Use xcode.cmake toolchain instead.") + polly_fatal_error(${_err}) +endif() + +find_program(CMAKE_C_COMPILER clang-5.0) +find_program(CMAKE_CXX_COMPILER clang++-5.0) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("clang not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("clang++ not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/clang-omp.cmake b/tools/polly/compiler/clang-omp.cmake new file mode 100644 index 0000000..9b0b2b6 --- /dev/null +++ b/tools/polly/compiler/clang-omp.cmake @@ -0,0 +1,58 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_CLANG_OMP_CMAKE) + return() +else() + set(POLLY_COMPILER_CLANG_OMP_CMAKE 1) +endif() + +include(polly_add_cache_flag) +include(polly_fatal_error) + +if(XCODE_VERSION) + set(_err "This toolchain is not available for Xcode") + set(_err "${_err} because Xcode ignores CMAKE_C(XX)_COMPILER variable.") + set(_err "${_err} Use xcode.cmake toolchain instead.") + polly_fatal_error(${_err}) +endif() + +string(COMPARE EQUAL "$ENV{CLANG_OMP_ROOT}" "" _is_empty) +if(_is_empty) + polly_fatal_error("Environment variable CLANG_OMP_ROOT is not set") +endif() + +if(NOT EXISTS "$ENV{CLANG_OMP_ROOT}/bin") + polly_fatal_error("Directory '$ENV{CLANG_OMP_ROOT}/bin' not exists (please check CLANG_OMP_ROOT)") +endif() + +unset(CMAKE_C_COMPILER CACHE) +unset(CMAKE_CXX_COMPILER CACHE) + +find_program( + CMAKE_C_COMPILER + clang + PATHS "$ENV{CLANG_OMP_ROOT}/bin" + NO_DEFAULT_PATH +) + +find_program( + CMAKE_CXX_COMPILER + clang++ + PATHS "$ENV{CLANG_OMP_ROOT}/bin" + NO_DEFAULT_PATH +) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("clang not found (verify CLANG_OMP_ROOT)") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("clang++ not found (verify CLANG_OMP_ROOT)") +endif() + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-fopenmp") +polly_add_cache_flag(CMAKE_C_FLAGS "-fopenmp") + +polly_add_cache_flag(CMAKE_EXE_LINKER_FLAGS "-L$ENV{CLANG_OMP_ROOT}/lib") +polly_add_cache_flag(CMAKE_SHARED_LINKER_FLAGS "-L$ENV{CLANG_OMP_ROOT}/lib") diff --git a/tools/polly/compiler/clang.cmake b/tools/polly/compiler/clang.cmake new file mode 100644 index 0000000..b74c64f --- /dev/null +++ b/tools/polly/compiler/clang.cmake @@ -0,0 +1,46 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_CLANG_CMAKE) + return() +else() + set(POLLY_COMPILER_CLANG_CMAKE 1) +endif() + +include(polly_fatal_error) + +if(XCODE_VERSION) + set(_err "This toolchain is not available for Xcode") + set(_err "${_err} because Xcode ignores CMAKE_C(XX)_COMPILER variable.") + set(_err "${_err} Use xcode.cmake toolchain instead.") + polly_fatal_error(${_err}) +endif() + +find_program(CMAKE_C_COMPILER clang) +find_program(CMAKE_CXX_COMPILER clang++) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("clang not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("clang++ not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/egcc.cmake b/tools/polly/compiler/egcc.cmake new file mode 100644 index 0000000..a170764 --- /dev/null +++ b/tools/polly/compiler/egcc.cmake @@ -0,0 +1,47 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_EGCC_CMAKE) + return() +else() + set(POLLY_COMPILER_EGCC_CMAKE 1) +endif() + +include(polly_fatal_error) + +if(XCODE_VERSION) + set(_err "This toolchain is not available for Xcode") + set(_err "${_err} because Xcode ignores CMAKE_C(XX)_COMPILER variable.") + set(_err "${_err} Use xcode.cmake toolchain instead.") + polly_fatal_error(${_err}) +endif() + +find_program(CMAKE_C_COMPILER egcc) +find_program(CMAKE_CXX_COMPILER eg++) +find_program(CMAKE_CPP_COMPILER egcpp) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("egcc not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("eg++ not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/emscripten.cmake b/tools/polly/compiler/emscripten.cmake new file mode 100644 index 0000000..696b1b4 --- /dev/null +++ b/tools/polly/compiler/emscripten.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_COMPILER_EMSCRIPTEN_CMAKE) + return() +else() + set(POLLY_COMPILER_EMSCRIPTEN_CMAKE 1) +endif() + +include(polly_fatal_error) + +string(COMPARE EQUAL "$ENV{EMSCRIPTEN}" "" _is_empty) +if(_is_empty) + polly_fatal_error( + "EMSCRIPTEN environment variable not set. Emscripten environment variables are in emsdk_env.sh" + ) +endif() + +include("$ENV{EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake") +list(APPEND CMAKE_FIND_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/emscripten") + diff --git a/tools/polly/compiler/emscripten/glew/glewConfig.cmake b/tools/polly/compiler/emscripten/glew/glewConfig.cmake new file mode 100644 index 0000000..62f3ba3 --- /dev/null +++ b/tools/polly/compiler/emscripten/glew/glewConfig.cmake @@ -0,0 +1,11 @@ +# Copyright (c) 2016, Alexandre Pretyman, Ruslan Baratov +# Emscripten CMake target to emulate native glew::glew target +if(NOT TARGET glew::glew) + add_library(glew::glew INTERFACE IMPORTED) + set_target_properties( + glew::glew + PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "GLEWMX" + INTERFACE_LINK_LIBRARIES "-s LEGACY_GL_EMULATION=1" + ) +endif() diff --git a/tools/polly/compiler/emscripten/glfw3/glfw3Config.cmake b/tools/polly/compiler/emscripten/glfw3/glfw3Config.cmake new file mode 100644 index 0000000..8fe516a --- /dev/null +++ b/tools/polly/compiler/emscripten/glfw3/glfw3Config.cmake @@ -0,0 +1,10 @@ +# Copyright (c) 2016, Alexandre Pretyman +# Emscripten CMake target to emulate native glfw target +if(NOT TARGET glfw) + add_library(glfw INTERFACE IMPORTED) + set_target_properties( + glfw + PROPERTIES + INTERFACE_LINK_LIBRARIES "-s LEGACY_GL_EMULATION=1;-s USE_GLFW=3" + ) +endif() diff --git a/tools/polly/compiler/gcc-5.cmake b/tools/polly/compiler/gcc-5.cmake new file mode 100644 index 0000000..c13cb43 --- /dev/null +++ b/tools/polly/compiler/gcc-5.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_GCC_5_CMAKE_) + return() +else() + set(POLLY_COMPILER_GCC_5_CMAKE_ 1) +endif() + +find_program(CMAKE_C_COMPILER gcc-5) +find_program(CMAKE_CXX_COMPILER g++-5) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("gcc not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("g++ not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/gcc-6.cmake b/tools/polly/compiler/gcc-6.cmake new file mode 100644 index 0000000..1894051 --- /dev/null +++ b/tools/polly/compiler/gcc-6.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_GCC_7_CMAKE_) + return() +else() + set(POLLY_COMPILER_GCC_7_CMAKE_ 1) +endif() + +find_program(CMAKE_C_COMPILER gcc-6) +find_program(CMAKE_CXX_COMPILER g++-6) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("gcc not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("g++ not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/gcc-7.cmake b/tools/polly/compiler/gcc-7.cmake new file mode 100644 index 0000000..28927bd --- /dev/null +++ b/tools/polly/compiler/gcc-7.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_COMPILER_GCC_7_CMAKE_) + return() +else() + set(POLLY_COMPILER_GCC_7_CMAKE_ 1) +endif() + +find_program(CMAKE_C_COMPILER gcc-7) +find_program(CMAKE_CXX_COMPILER g++-7) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("gcc not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("g++ not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/gcc-8.cmake b/tools/polly/compiler/gcc-8.cmake new file mode 100644 index 0000000..1093aa4 --- /dev/null +++ b/tools/polly/compiler/gcc-8.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_COMPILER_GCC_8_CMAKE_) + return() +else() + set(POLLY_COMPILER_GCC_8_CMAKE_ 1) +endif() + +find_program(CMAKE_C_COMPILER gcc-8) +find_program(CMAKE_CXX_COMPILER g++-8) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("gcc not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("g++ not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/gcc-cross-compile-raspberry-pi.cmake b/tools/polly/compiler/gcc-cross-compile-raspberry-pi.cmake new file mode 100644 index 0000000..086b396 --- /dev/null +++ b/tools/polly/compiler/gcc-cross-compile-raspberry-pi.cmake @@ -0,0 +1,103 @@ +# Copyright (c) 2017, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_COMPILER_GCC_CROSS_COMPILE_RASPBERRY_PI_CMAKE) + return() +else() + set(POLLY_COMPILER_GCC_CROSS_COMPILE_RASPBERRY_PI_CMAKE 1) +endif() + +include(polly_fatal_error) +include(polly_status_print) + +# Detect Raspberry Pi host +set(_proc_cpuinfo "/proc/cpuinfo") +if(EXISTS "${_proc_cpuinfo}") + # https://en.wikipedia.org/wiki/Raspberry_Pi#Specifications + file( + STRINGS + "${_proc_cpuinfo}" + _proc_cpuinfo_strings + REGEX + "^Hardware[\t ]*:[\t ]*BCM283(5|6|7)$" + ) + string(COMPARE EQUAL "${_proc_cpuinfo_strings}" "" _is_empty) + if(NOT _is_empty) + polly_status_print("Raspberry Pi host") + set(_usr_bin_cpp "/usr/bin/cpp") + if(EXISTS "${_usr_bin_cpp}") + # Needed for 'url_sha1_autotools' Hunter build scheme + set(CMAKE_C_PREPROCESSOR "${_usr_bin_cpp}" CACHE PATH "Preprocessor") + endif() + return() # We are not cross-compiling, exit now. + endif() +endif() + +set(_rpi_error_msg) #if empty, then no errors! +string(COMPARE EQUAL + "$ENV{RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PATH}" + "" + _is_empty +) +if(_is_empty) + set(_rpi_error_msg + "${_rpi_error_msg}\nRASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PATH environment variable not set. Set it to the absolute path of the \"bin\" directory for the toolchain" + ) +endif() + +string(COMPARE EQUAL + "$ENV{RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PREFIX}" + "" + _is_empty +) +if(_is_empty) + set(_rpi_error_msg + "${_rpi_error_msg}\nRASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PREFIX environment variable not set. Set it to the triplet of the toolchain (ex: arm-linux-gnueabihf)" + ) +endif() + +string(COMPARE EQUAL + "$ENV{RASPBERRYPI_CROSS_COMPILE_SYSROOT}" + "" + _is_empty +) +if(_is_empty) + set(_rpi_error_msg + "${_rpi_error_msg}\nRASPBERRYPI_CROSS_COMPILE_SYSROOT environment variable not set. Set it to the sysroot to be used" + ) +endif() + +string(COMPARE NOTEQUAL + "${_rpi_error_msg}" + "" + _has_errors +) +if(_has_errors) + polly_fatal_error( + "RaspberyPi Toolchain configuration failed:" + ${_rpi_error_msg} + ) +endif() + +# We shouldn't try to hardcore the path, since the cross compiler for the Mac +# needs to be in a "case-sensitive" file system +set(CROSS_COMPILE_TOOLCHAIN_PATH + "$ENV{RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PATH}" + CACHE PATH "RaspberryPi Toolchain Path" +) + +# The prefix is what is known as the cross compiler triplet or quadruplet. +# ex: arm-unknown-linux-gnueabihf (note: no dash at the end) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX + "$ENV{RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PREFIX}" + CACHE STRING "RaspberryPi Toolchain Prefix" +) + +# The sysroot for the cross compile +set(CROSS_COMPILE_SYSROOT + "$ENV{RASPBERRYPI_CROSS_COMPILE_SYSROOT}" + CACHE PATH "RaspberryPi sysroot" +) + +include("${CMAKE_CURRENT_LIST_DIR}/gcc-cross-compile.cmake") + diff --git a/tools/polly/compiler/gcc-cross-compile-simple-layout.cmake b/tools/polly/compiler/gcc-cross-compile-simple-layout.cmake new file mode 100644 index 0000000..da60062 --- /dev/null +++ b/tools/polly/compiler/gcc-cross-compile-simple-layout.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2015 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_GCC_CROSS_COMPILE_SIMPLE_LAYOUT_) + return() +else() + set(POLLY_COMPILER_GCC_CROSS_COMPILE_SIMPLE_LAYOUT_ TRUE) +endif() + +string(COMPARE EQUAL "${CROSS_COMPILE_TOOLCHAIN_PREFIX}" "" _is_empty) +if(_is_empty) + polly_fatal_error("CROSS_COMPILE_TOOLCHAIN_PREFIX not set.") +endif() + +set(_gcc_name "${CROSS_COMPILE_TOOLCHAIN_PREFIX}-gcc") +find_program(_gcc_location "${_gcc_name}") +if(NOT _gcc_location) + polly_fatal_error( + "GCC not found: ${_gcc_name} (update PATH environment variable)" + ) +endif() + +get_filename_component( + CROSS_COMPILE_TOOLCHAIN_PATH "${_gcc_location}" DIRECTORY +) +get_filename_component( + CROSS_COMPILE_SYSROOT "${CROSS_COMPILE_TOOLCHAIN_PATH}/.." ABSOLUTE +) + +set(POLLY_SKIP_SYSROOT YES) +include("${CMAKE_CURRENT_LIST_DIR}/gcc-cross-compile.cmake") diff --git a/tools/polly/compiler/gcc-cross-compile.cmake b/tools/polly/compiler/gcc-cross-compile.cmake new file mode 100644 index 0000000..76fb1d0 --- /dev/null +++ b/tools/polly/compiler/gcc-cross-compile.cmake @@ -0,0 +1,87 @@ +# Copyright (c) 2015 Alexandre Pretyman +# All rights reserved. +# +# ------------------------------------------------------------------------------ +# GCC Based Cross Compiler CMake toolchain file +# +# Variables: +# CROSS_COMPILE_TOOLCHAIN_PATH=/path/to/toolchain/bin +# CROSS_COMPILE_TOOLCHAIN_PREFIX=arm-unknown-linux-gnueabihf +# CROSS_COMPILE_SYSROOT=/path/to/sysroot +# ------------------------------------------------------------------------------ + +if(DEFINED POLLY_COMPILER_GCC_CROSS_COMPILE) + return() +else() + set(POLLY_COMPILER_GCC_CROSS_COMPILE TRUE) +endif() + +include(polly_add_cache_flag) + +if( CMAKE_TOOLCHAIN_FILE ) + # touch toolchain variable to suppress "unused variable" warning +endif() + +string(COMPARE EQUAL + "${CROSS_COMPILE_TOOLCHAIN_PATH}" + "" + _is_empty +) +if(_is_empty) + polly_fatal_error("CROSS_COMPILE_TOOLCHAIN_PATH not set.") +endif() + +string(COMPARE EQUAL + "${CROSS_COMPILE_TOOLCHAIN_PREFIX}" + "" + _is_empty +) +if(_is_empty) + polly_fatal_error("CROSS_COMPILE_TOOLCHAIN_PREFIX not set.") +endif() + +string(COMPARE EQUAL + "${CROSS_COMPILE_SYSROOT}" + "" + _is_empty +) +if(_is_empty) + polly_fatal_error("CROSS_COMPILE_SYSROOT not set.") +endif() + +if(POLLY_SKIP_SYSROOT) + # Do not modify CMAKE_{C,CXX}_FLAGS + # Workaround for x86_64-pc-linux-gcc error: + # "this linker was not configured to use sysroots" +else() + set(SYSROOT_COMPILE_FLAG "--sysroot=${CROSS_COMPILE_SYSROOT}") + polly_add_cache_flag( + CMAKE_C_FLAGS + "${SYSROOT_COMPILE_FLAG}" + ) + polly_add_cache_flag( + CMAKE_CXX_FLAGS + "${SYSROOT_COMPILE_FLAG}" + ) +endif() + +# The (...)_PREFIX variable name refers to the Cross Compiler Triplet +set(TOOLCHAIN_PATH_AND_PREFIX ${CROSS_COMPILE_TOOLCHAIN_PATH}/${CROSS_COMPILE_TOOLCHAIN_PREFIX}) +set(CMAKE_C_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-gcc" CACHE PATH "C compiler" ) +set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-g++" CACHE PATH "C++ compiler" ) +set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-as" CACHE PATH "Assembler" ) +set(CMAKE_C_PREPROCESSOR "${TOOLCHAIN_PATH_AND_PREFIX}-cpp" CACHE PATH "Preprocessor" ) +set(CMAKE_STRIP "${TOOLCHAIN_PATH_AND_PREFIX}-strip" CACHE PATH "strip" ) +if( EXISTS "${TOOLCHAIN_PATH_AND_PREFIX}-gcc-ar" ) + # Prefer gcc-ar over binutils ar: https://gcc.gnu.org/wiki/LinkTimeOptimizationFAQ + set(CMAKE_AR "${TOOLCHAIN_PATH_AND_PREFIX}-gcc-ar" CACHE PATH "Archiver" ) +else() + set(CMAKE_AR "${TOOLCHAIN_PATH_AND_PREFIX}-ar" CACHE PATH "Archiver" ) +endif() +set(CMAKE_LINKER "${TOOLCHAIN_PATH_AND_PREFIX}-ld" CACHE PATH "Linker" ) +set(CMAKE_NM "${TOOLCHAIN_PATH_AND_PREFIX}-nm" CACHE PATH "nm" ) +set(CMAKE_OBJCOPY "${TOOLCHAIN_PATH_AND_PREFIX}-objcopy" CACHE PATH "objcopy" ) +set(CMAKE_OBJDUMP "${TOOLCHAIN_PATH_AND_PREFIX}-objdump" CACHE PATH "objdump" ) +set(CMAKE_RANLIB "${TOOLCHAIN_PATH_AND_PREFIX}-ranlib" CACHE PATH "ranlib" ) +set(CMAKE_RC_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-windres" CACHE PATH "WindowsRC" ) +set(CMAKE_Fortran_COMPILER "${TOOLCHAIN_PATH_AND_PREFIX}-gfortran" CACHE PATH "gfortran" ) diff --git a/tools/polly/compiler/gcc.cmake b/tools/polly/compiler/gcc.cmake new file mode 100644 index 0000000..3c3d68a --- /dev/null +++ b/tools/polly/compiler/gcc.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_GCC_CMAKE) + return() +else() + set(POLLY_COMPILER_GCC_CMAKE 1) +endif() + +find_program(CMAKE_C_COMPILER gcc) +find_program(CMAKE_CXX_COMPILER g++) + +if(NOT CMAKE_C_COMPILER) + polly_fatal_error("gcc not found") +endif() + +if(NOT CMAKE_CXX_COMPILER) + polly_fatal_error("g++ not found") +endif() + +set( + CMAKE_C_COMPILER + "${CMAKE_C_COMPILER}" + CACHE + STRING + "C compiler" + FORCE +) + +set( + CMAKE_CXX_COMPILER + "${CMAKE_CXX_COMPILER}" + CACHE + STRING + "C++ compiler" + FORCE +) diff --git a/tools/polly/compiler/gcc48.cmake b/tools/polly/compiler/gcc48.cmake new file mode 100644 index 0000000..6b8cc75 --- /dev/null +++ b/tools/polly/compiler/gcc48.cmake @@ -0,0 +1,11 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_GCC48_CMAKE) + return() +else() + set(POLLY_COMPILER_GCC48_CMAKE 1) +endif() + +set(CMAKE_C_COMPILER gcc-4.8 CACHE STRING "C compiler" FORCE) +set(CMAKE_CXX_COMPILER g++-4.8 CACHE STRING "C++ compiler" FORCE) diff --git a/tools/polly/compiler/xcode.cmake b/tools/polly/compiler/xcode.cmake new file mode 100644 index 0000000..c8cbbe1 --- /dev/null +++ b/tools/polly/compiler/xcode.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_COMPILER_XCODE_CMAKE_) + return() +else() + set(POLLY_COMPILER_XCODE_CMAKE_ 1) +endif() + +include(polly_fatal_error) + +string(COMPARE EQUAL "${POLLY_XCODE_COMPILER}" "" _is_empty) +if(_is_empty) + polly_fatal_error("Please set POLLY_XCODE_COMPILER") +endif() + +set(_cmd xcrun --find "${POLLY_XCODE_COMPILER}") + +execute_process( + COMMAND + ${_cmd} + OUTPUT_VARIABLE _compiler_path + RESULT_VARIABLE _result + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +if(NOT _result EQUAL 0) + polly_fatal_error("Command failed: ${_cmd}") +endif() + +set(CMAKE_XCODE_ATTRIBUTE_CC "${_compiler_path}") + +polly_status_debug("Compiler: ${_compiler_path}") diff --git a/tools/polly/custom-libcxx.cmake b/tools/polly/custom-libcxx.cmake new file mode 100644 index 0000000..5930427 --- /dev/null +++ b/tools/polly/custom-libcxx.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CUSTOM_LIBCXX_CMAKE) + return() +else() + set(POLLY_CUSTOM_LIBCXX_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / Custom LLVM Standard C++ Library (libc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/nolibs.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +# '-lSystem' needed to fix broken compiler report +set( + CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -lSystem" + CACHE + STRING + "C++ linker flags" + FORCE +) + +set(CUSTOM_LIBCXX_LIBRARY_LOCATION TRUE) diff --git a/tools/polly/cxx11.cmake b/tools/polly/cxx11.cmake new file mode 100644 index 0000000..30d3039 --- /dev/null +++ b/tools/polly/cxx11.cmake @@ -0,0 +1,16 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CXX11_CMAKE_) + return() +else() + set(POLLY_CXX11_CMAKE_ 1) +endif() + +# Don't use polly_init (no generator expected) +set(POLLY_TOOLCHAIN_NAME "C++11 support") +set(POLLY_TOOLCHAIN_TAG "cxx11") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_CXX_STANDARD 11) diff --git a/tools/polly/cxx17.cmake b/tools/polly/cxx17.cmake new file mode 100644 index 0000000..fe488c6 --- /dev/null +++ b/tools/polly/cxx17.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# Copyright (c) 2018, Richard Hodges + +# All rights reserved. + +if(DEFINED POLLY_CXX17_CMAKE_) + return() +else() + set(POLLY_CXX17_CMAKE_ 1) +endif() + +# Don't use polly_init (no generator expected) +set(POLLY_TOOLCHAIN_NAME "C++17 support") +set(POLLY_TOOLCHAIN_TAG "cxx17") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_CXX_STANDARD 17) diff --git a/tools/polly/cygwin.cmake b/tools/polly/cygwin.cmake new file mode 100644 index 0000000..08e6682 --- /dev/null +++ b/tools/polly/cygwin.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CYGWIN_CMAKE_) + return() +else() + set(POLLY_CYGWIN_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "cygwin / gcc / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/cygwin.cmake") diff --git a/tools/polly/default.cmake b/tools/polly/default.cmake new file mode 100644 index 0000000..e4658a9 --- /dev/null +++ b/tools/polly/default.cmake @@ -0,0 +1,14 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_DEFAULT_CMAKE) + return() +else() + set(POLLY_DEFAULT_CMAKE 1) +endif() + +# Don't use polly_init (no generator expected) +set(POLLY_TOOLCHAIN_NAME "Default") +set(POLLY_TOOLCHAIN_TAG "default") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/docs/Makefile b/tools/polly/docs/Makefile new file mode 100644 index 0000000..531f052 --- /dev/null +++ b/tools/polly/docs/Makefile @@ -0,0 +1,216 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Polly.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Polly.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Polly" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Polly" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/tools/polly/docs/conf.py b/tools/polly/docs/conf.py new file mode 100644 index 0000000..a81b421 --- /dev/null +++ b/tools/polly/docs/conf.py @@ -0,0 +1,317 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Polly documentation build configuration file, created by +# sphinx-quickstart on Mon Jul 25 21:47:33 2016. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# on_rtd is whether we are on readthedocs.org, this line of code grabbed from docs.readthedocs.org +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +if not on_rtd: + extensions.append('sphinxcontrib.spelling') + spelling_show_suggestions = True + spelling_word_list_filename = 'spelling.txt' + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'Polly' +copyright = '2013-2016, Ruslan Baratov' +author = 'Ruslan Baratov' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.10' +# The full version, including alpha/beta/rc tags. +release = '0.10' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# 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', 'examples/docs.rst'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# From: +# * https://github.com/snide/sphinx_rtd_theme#using-this-theme-locally-then-building-on-read-the-docs + +if not on_rtd: # only import and set the theme if we're building docs locally + import sphinx_rtd_theme + html_theme = 'sphinx_rtd_theme' + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + +# Suppress warnings: http://stackoverflow.com/a/28778969/2288008 +if not on_rtd: + import sphinx.environment + from docutils.utils import get_source_line + + def _warn_node(self, msg, node, **kwargs): + if not msg.startswith('nonlocal image URI found:'): + self._warnfunc(msg, '%s:%s' % get_source_line(node), **kwargs) + + sphinx.environment.BuildEnvironment.warn_node = _warn_node + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static', 'rtfd-css/docs/rtfd-css'] + +# Add custom .css files +# https://github.com/snide/sphinx_rtd_theme/issues/117#issuecomment-41571653 +def setup(app): + app.add_stylesheet("custom.css") + app.add_stylesheet("rtfd-css.css") + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Pollydoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'Polly.tex', 'Polly Documentation', + 'Ruslan Baratov', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'polly', 'Polly Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Polly', 'Polly Documentation', + author, 'Polly', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/tools/polly/docs/index.rst b/tools/polly/docs/index.rst new file mode 100644 index 0000000..93910a8 --- /dev/null +++ b/tools/polly/docs/index.rst @@ -0,0 +1,17 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +Polly: Collection of CMake toolchains +===================================== + +.. warning:: + + Documentation is in process of migrating from + `GitHub wiki `_. + Some information may be missing: blank pages, broken links, etc. + Will be fixed soon... + +.. toctree:: + :maxdepth: 1 + + /toolchains diff --git a/tools/polly/docs/jenkins.sh b/tools/polly/docs/jenkins.sh new file mode 100755 index 0000000..a9a273b --- /dev/null +++ b/tools/polly/docs/jenkins.sh @@ -0,0 +1,34 @@ +#!/bin/bash -e + +function wrong_dir() { + echo "Please run script from 'docs' directory" + exit 1 +} + +[ -f "`pwd`/jenkins.sh" ] || wrong_dir + +venv_dir="`pwd`/_venv" +src="${venv_dir}/bin/activate" + +if [ ! -f "${src}" ]; +then + virtualenv "${venv_dir}" +fi + +source "${src}" + +which python +python --version + +which pip +pip --version + +pip install -U pip +pip install -r requirements.txt + +rm -rf _build _static _spelling + +mkdir _static + +sphinx-build -v -W . _build +sphinx-build -b spelling . _spelling diff --git a/tools/polly/docs/make.sh b/tools/polly/docs/make.sh new file mode 100755 index 0000000..01f12d8 --- /dev/null +++ b/tools/polly/docs/make.sh @@ -0,0 +1,12 @@ +#!/bin/bash -e + +set -x + +mkdir -p _static + +sphinx-build -v . _build + +set +x + +echo "Done:" +echo "`pwd`/_build/index.html" diff --git a/tools/polly/docs/requirements.txt b/tools/polly/docs/requirements.txt new file mode 100644 index 0000000..beca227 --- /dev/null +++ b/tools/polly/docs/requirements.txt @@ -0,0 +1,3 @@ +Sphinx==1.4.5 +sphinx-rtd-theme==0.1.9 +sphinxcontrib-spelling==2.2.0 diff --git a/tools/polly/docs/screens/ios-team-id.png b/tools/polly/docs/screens/ios-team-id.png new file mode 100644 index 0000000000000000000000000000000000000000..c25b52d941fd0b544476c1314186d12967162c5f GIT binary patch literal 55767 zcmZs>bx>Q~8#M|QD5XG)wossbDORj_(G)1q;_g=5LW+B!P@p(Pi@Uo^2r2HaNpOk> zhae&0^1JtsJKxMVbM~Csd*;lX+4IO+>sjGyD)J;xX`kZZ;gNj(@>v59@8KOD-UEgw z5AILQ$=KrWU-+&X^3r%!W3PAbH;-(jl%??SYGa9SzdgR+6Mg@p?}~><+Wo(U-w!IW z#KVI-e*G+^6M;v!`IamHXH7!Mo;58h=VT> zbVBVrzkDGi_~}jDPsCHAAD`YlfAT1g>G>1EI5jD0<2TQhq0<{Q;kCL*^75?PTGtYsV6!M3n2JX&Ye9k*n8==)DLVaCJHYrCC)QHLD zi`v=w{BoXZgfXnh(bP}zwLcyW7fZC*u6-x}5)Xo$qXekGSNW zhrfrCf{v1lwWETLql@+H$i;s%qu!~#Vy?uPu`DRRxZn2N0aEw~1$8vm@poP>9Xn=m z{oHNlWua=TscP$LYOA@j7`nWAa~Lv)Xv;4j6(B%7Yf;a`e~8f#-Y zKMfyLS|U|#xH>NphsFHV#_7&as@ku$MEklu@3>5VKZm|&XJPTycGK{?4Q(I^c|{kg zF?~u-KD|z^K`~dvTx=KP_ogK78E^iZ^+=2MTVl{Oo1 zu>RbSzOMXj1^Y2=lbr?EjO(>-@oi^sasgGY(IA%(9mJgSBj3?!X5JmuPI~Sp2yBE&^Y(Ctwu>y zOp<$yz3>5hjiq+37G*sqkyw+j3O#hnGWPM)8Jzr;>3$Nu6uD<0qhgY2h@^GN6GZ9l z=WPIA5OR+$_}E*Ygx7Gn6A#n=cmF7;5`s#}s@qjc|t#o7yPoGf%Fc01rC4_`Pm zb>Ut-d9?oa@jsKF>C@%k8oXt89G9QR`M!wrrFN38CW)T&eVRXki3rYOD%u-5J#XEvWPg7zZ6oUisL`(lxYqOpJJ$NQDKh}} z1c@nvH*Y1xB)K@=3UY9#>SQrwCsL>Up{0Ovi*nm(`?)Cj@k#Wt6!o(d@I)Ha`&pUa zrk(#3+~u7d9L^_Cn6t96rYbJn?q{tsrH66zib&Y`Ti^8EqB5p}x+1!!$_@zAPdQ?2 zj!K3=Z5iKd?>4AiyY%Jl&&h3 zhzL=BI6MYV&S>P6v?%K7r$H6qhItn9tD`t2ZS+0hwf};mn;t2aN=>h>TTc(&jP0CK zD9+KaZY46O=)7}UG5wB`Ui)1SC)`um=SGRngWIRU4YTbV=Sg*Kied%^Xp>tDyT`iN1>QbA(e2hV8b7PvchcL`H2iO;W=-o)KZbQgqVB0)LV=_+<&SR>m zVrtn!pf+^7Xnnd22xP|erMb!cCl)ANiU3zv7oL%^W1Ql3ISn4}o2?^E^9nqFbh29n zK&EG1-83{P*ay&MDm*FrNOuP3gdBW@+z;{;3ULHJgChj$PyLQxoZ@hCeaj;5#`Q6c zp>uBBj<1a-1fIX(`F3|wEJ{w6tq6A)fLhASO(sXTUQ;H1;Xo!CfaA)Z9o)zBgU$yo zJYA!^vmX%cZ=>#`cmVojK!R8}cRqA-i)79ESh7obAKHg+9EX)Zkf?W2#SQ^yzsgd5 zZM7n5P1oI~tQ_Nx8hx*qno5&k{Ia?BgJk}Pw-%a822O7FI&MRK+U)w1gReLe`0^mwf-=-z`VX_R-sqa<5@22}^(g%&L@>LxHc}xY94LRRFRMgt2 zC|*_+jjc{YzX=viB=}3Qigl^D%g*r4KdU|<6`Pf4E)uJ#5=OZN?Cj#=ZaUz_ZPqhx zer|aO5{P#hhX&x)uDqX%J3ChkRKqD;tlQ%;#_81bDH$ah7*!=6GxT_#t+A7H-a7WY z#ahPWmcaV1T$9f{LAZydu>W0=M*q*5k*j~_SMCiIZ+30Oew6&_2~o_G+2$dR)T5^D zaGQ+ZnLR1x$e-`6{Hi*>keHTC)660$Bq{Qi-QRexFDh!WA|pOyeQ1%3u<1xb-Jrd( zq2@y~u4|8Y?oS`?D!Ho1HF$pvp1`BGK1TA+sLAqtQQ@c~$8^Tdbo1a;Tz5#C$fpEd;bKyJ!v7mR6%~I>_uHD}ZI8 z{m+%)F*!Dm@}JATdH&0e;l55gsZ{?jsJ~JA06!hdemc}|A%Y4;34xwKJ20fdotP)kMODgq zuO2Pq$g+>nBFg}KXIb;kxsM)1YU++U-`s>E7otOm>_Ui2AD2(n=@waW6yFI~DUC&a zg}=;9e32bbm7S54m;9HDR(c~(YS2S*9C}A3SufG zO5l`6^Hc^auMAcwj8??zJ21g*=$z0jZ)L3OzHbn18^C_&_E>8hg*ePDrtQAzhg%+pm!7bv6770_)$bj& zywjH*gv*B0ossjotWVdQPYd-G*{F+h3%WAv;}8uCjl0h5bn6=Y$-VD5!($BF#XTnL z{)9y8j**y(vs!|`?{ux!48Y$KTaOUscl}wInLV+y+kI@edmaAu7138a%RBZ`xPGd) zervCOA;zVNaakRl!^s5YWaU3NPqNyUGf%ro7B)5VYx1=kK91PxNU~|$;7*%sB$>82 zhi6f7`8%hCnRAnJ0UY%EsP?1FJOOOQHRww7b?Vl=P3XQfLVQ4 zk91d0a0hpreZEH`h`G)Fak&&mgH-)bVyPuP4GqAg5c%}`5>E3P$S&?7RA0uu|92Of zazkp&&j@v@Y@0H5&dqP%Bmj~R#Wa2fF2>inudEFpuqs*9vQ~%bm_~hcdE3y=ZRzWO z{yXy9EKL`g>C;M4n%X;~&sIzELv1@yo0OF1pP=&W#(ZlJcZ;i5T+()>Are%0D3Pw` z^U=b=-AF;o?Y6BQ#RYkvK1UBd@0_gfbO$=n5=3(A4Ug$JWxRUdZXOMrU{If?_3<)u z0(yQi?q9sAiqkZ9-EX52NT<%M=W?ta0r7b^2Atv&jpg}?BZRcH5_Ul1VyjHH{583^ zZw~OyT@{0#qW^pTq{r=-pA0HBZ6LjEASoupH+%>Zy(DQK^R}*#Y1k9hhFSP1`&<9y zm}#Rb--w2eg<{u}Ud&%M?P$T-)ExWhL`V80Y`;mg9_ioX2rO{QPHj3^au?yZNa)si z_meA}$hiIeM;FVgxj9-QP+dR2{1Os;E&;GLs<;fBRouH0;rPdUs zyHbA2a%R%eig+Fd{W>1FaF~uctdev;rQ9|+homhLgc zlwCA-S=Bk~8xB)Vo@t9wFEpN>2KJNszO64BG02Xp;JGX`9UCE!rc*nD^ai^D=f+j8U!q0__XBLkG{V+>Y{?24Fmo2>p-0eevp<8WW0g_sb(lEb{(-wzS$aIxZS3BIaE^ zVOh=ln;G=50XS}0+Q%Q=9uM7)zQtB=p}=;)&Y+;ve+L+v3KN=IKkbS2&D`?&F=Hq< zr^nK1gI~m-iqXgfA-TfMei}zrZg_o_qw0FHF^8+d7Hg3_i}fQOMWfd#S#5Umi^*jo zy{ub@(3c*o<~_9zYa|lRGz48^=ONjQe>|H4?tya8i9=*;BX`w-{=&zX%L{<&R^j$m zj+>q&62fsB9ib|v_tC>_kt##6CJC<+vR)-*)PlR`M#IJrTC5Sig9awvZvh}r1KijU zMGEPh(Z^-K{FYL&_8XUl!Qr$0Do*=7qlFn7gLxVQz)KgO@95oSIEh5oLG}!w(sBO2 z2T=IHg!uN5bxjA$4OR{i?-F0z*ZRh1haEgkpom7s_r37c3YnqF3^egniJ zbTDiZr{u{^^^Y97gUE&9ic-~q?*H20lU8)E+T8nvd|dyU3&TU(2nl>gk{J?OBTb^E zT(jW_P!l?plQOvJ?exTx5ICbr2>(n92WR|U`Fo&qOBQw@!!x+}N+ zsJ1cv;x?H*-_)DzJ>t?`BFRaK;wBp%PL^%?9*|_L!m3EQh_eR@Zd0PW^x}b zPkJ9L54aZn5Y=6)rN1Cg2C%`;grmVNxg~dx&?{dF(+uA}UcozmhVUWek{BZRv=9Jj z4xlz(#HDI*VDLNe&6WY5ZX`aKxjc)GB8gq5rGrU;&*l~uGSh{x2?A?k7Yo>({(Su= zZ!pTFbfZkVg-!k~MD0j6VgKrFFYMc^BKdgZdytKkM~2CXRmO~g6+Ms4bX5avJV9dm zzMf=;@tW8WEXVRV_3pD|?I!$196MVsiqPj8_v16HJRu6ENHlaR5lEi7w6p}3knoo% zz(M^Rrgs=Wu%khA4bMnO4fHDA|9AuVap{#YCv-CT4c63_XC4T=C=Q}i-`p#OprjfJ zynuh5#O$_Wmh^V@F-?Z@yS=*~#0Xw*G@T&PwdpLF8lcyR5FbLup@!u54#%D7!%Qfa z{yfd?QX>ztG6Sl;)OTDuuNJXAWH1wJqOXU$!fqyd-Mes#uGu{;9$izIOR z3ZBnD+F)|67d(?)XL$$p#|lW60>0k;eFKLDdprAGz8o*W$ zS1J9Q2v_Z#)3U>&sUntwfafl-3j*NJh5Zi-hWR@6`O|!kbTC12Fj8DV`kQl_D5f>ePc9rbIzRUros>FVI!;8R!EvZ}EKPv<_IVtsklXlYwfeSmYPs%&HD z*3p0WL}Du`u@zhR`Cb5neD75Y`t*k7)&Ch2ld+7u-}f+3*<$yWY4d#{{kBw9u>(^Q zY!Uz!LHmApci&=9wG7}S1Xl{Cj)Yqa>9bc*Lq^S;k)bG|{y6^yUIF|1*gppal^YUh zXFdyVNa7py!Dnr~u}q??o<$2GVLlX8}VDyJO}g!HdHWVP>1wvzykkS>|) zKS8F~-NF73K1HmI{_H4juGVZl?cc=yyFvK@H1BY@&JLUuf@^{yry7(K5ID1qu8xoM}^<<*82$=a&;%5hSJhO%HsyJHAK)46Ek~Qvq0bU+j&!gAq>vTC*a}gbvu{iUIH1Pv8hX|kilBhF^jf+y~Kz@ zF#190hfC)b7)VJ$WR^R~W@R;OUpQ<&)jC_~@qFWWC6qx2*@_EdM-5!S3Asb(+zEv* z9?u)6t1o@1Z)d69GEg^mkUkviY3S14O;4%jii&tU&!Y#;6%cXt1)~rDxyw!tdOJ)h zP767XE5YNRC)A3I+IbuK?6q;}e`R*iDYm4dqOTJ1EP}f=c7t;Rb}Uzp+Y;ux&?agA z1-{mm-iM{Q2~B@dj4IsSO$N@LN(`3#GVoM|N05>>D75UO!9IGP@+5G5qEt?X=)sSP zuyj?7_DgXpXBzz0fVgkx8}g!2Y1|a_sC2x4{V^W(-D;amZJgc4Te;i`mFfNu%=Q>o zmsNR79;w!6;tdLrl>-NO#qIg@2crh#lRo_ZZ+hczAiSq4syTgB#yWE8^S7pSF4A%f zzrT{p4)nP@_0i83Uk@+B39vQrzynL4M(o zFhFHm8(s$XTHOtK;`J2X4HbnD0B$O^!6_FQ&8uyA!3i_*=sw~Q`5n(%`7yP5qf+L+4(M*=6z-J_z(;?@mALu~=y&xE{Tr;qW%fLc+gBgonHy1Oe)`qam=6yQ-$ckMGC>11XqC*^?^ z>F|pS`cMM<8spDSxJHwDq^VI)@RJ3=f2-Z2#n|`HvLad{0~Y}UA8t;V=tb{3F4fwz zO;rKXbb;KFwLijggwl5MNP-88jMOdG(JS44X;Y|E=UE&C9)5=(*()bK!X2wFNs-fU z;<23R|Mn00kjmew6_9o8!{i_M!>c*7=FWdAnSzto@Xsa!;ZBUS^z;l65s&??E1=J7 z##Rwa#<#T$H6MMHWauf+KVMx)D;3EjL*1+<^n5{Y^DtgM4O9sdlUu412X7 z2PQ!iIzRoDa*gg}7(jG(Hk~SK&B%VX0Sr8U{oMTFr@is$6=zL4ZFgmHDK5x8l1TTg z=*|z;@%i01ie3ZPXU+ti&(S9UTYLjOH1ZSgA#y>@vsnGGel}iPx}pFvv|!*p0`8EC zKxg4%Og16-T2o@ro8DV>Pex7_i`p;%@61-NC$QT>S#)~d4H6wUKK8S{7Z6$n)dnX? zw_G<52E(t&aH8?Vt)Y3UYIEf~2+gLH_C}&ISQl&_ z1SjJsR0hO_4Dwkvlf~9l6R)(pp3TwwyoSl{zUVKR75z*XnkA_?A6Plfx7hhv-w!`0 z>H4Iy>6=Gzrbl^x0xH|%P1i;14F`H0&6PHNSCL$Ny&Hh8T;blN2pk)8+Mc~zUj$&% zczmhPU(b#UBpPCCdJPFjh3@-bUdk_j9{pA|d846mo|P=6GUfbQ0-V5i@CmP8_A)bilLj zf7zSk-@_+9Mm|&tzTuL=Qi~ltFTn)PO4;G6;bOK~DRBmBt}Gp=meSgq@Lh*de>7HE z*W%QpI9bOgS;va@Xx#Fn1xYL~IwA8fy>Ee2>N+=;Sh&)M~u=Kbu zaCTzhxiNZjYAY`eSRK%E9nuwwBE{6?N(B<47*BrvUt+^;3;Vsx?%>v*(WB0kE0;=i z8r7F}Zp)yf=qFzcpR}v`0D4mLr2*%Jj) zKstG-N1q=i7iHo>1Z@8<0&E5KQPh#6_KhS+dW)E~bf)}fxqdl%CYh$U<#20;2Ga9% z-!yBugi+s2SsKKZC4od>;ZiC#@Q@0*iP>9AOFMw!9{ zcsB?EzM2|X5gF3{fPhQZT79v2AzkJ~1_gGB4kyKfy2@f}r)pw^zteJu!#x8UsoEz; zXM0^4$xTuRLmaw|vEe(7`>>mlSpM;II$8${nZXztu9PKQRsEZbah^rD+)AXHic|<( zq;=-6S`|U*UG*94%nt!5Khf#b%tVPX_9f%f)dc(u_&=i~H(^6w;=XcphNY*JPda(H z{h<%-Qptwef2sAe4|M21CM_a!1N}=*4``Xlj`XnB*XKeG!6U)KYM=w8k{&CEl zTO-{hxOU{Xpg*jOb<+%B4!v~u-_-th=f(_G>KNNQ0`t(?#{+wB-CXpMirYiiioKapgdOmm< z5`u|PRM4$7X!JT+*XHGwO;@aL@;q47{t9Q{=Zb;{RD1tw!hbk3Kg3`+{6;@|)&(xWpP8Dy;1W!(|JLrHA$ai_0&K+y!sF zJZ+5w^sr{1E6nfMAu&a|4E(M7jhvIYK{1#kA4@D ztH##>!(EaZXRng8*juo*M*gbsOXZpRke@bMVJv0GkXYC^BMU4diA6I~K-!u%+jEaQ z`r2kL(iNJ#hBYR9Y_$>b5K_?xB+Ots*rl)Lu~X~*_dDGdvbC-0sWqdlFVkX{D{B_^ z;j{?r1k&JQAEHe!5gWGleY1Q)I{Ex!xg$d#fkfYDK0_hQhF45Hx%j2N)+*eEyT7O2 z^VZh3laPU+UdL9Bl?#>0CArV~)R5C^6@`5$_F?->76pC#d~5ce=YG$TY_s;rvkR1% zn-W*9!BhJ_-_jb^O-Bm7{}-O0XJOU4lv|E?5lS+ZH>!9uW-E9e9RJqZG`(QMuqTDzJDc9+kY3r@KAdJFQl=pD`y-*iIG8nT+18NzWXcutzyy$GSwK@GHkUp z9jtTs>Em|ignHIgdgkPVa)Ot}>SCiytHNHv=5Xvr z=y4c6r?hJ?0QvBo&Gf=Q~UiAVD-ost?7TDCB7G{uC%{0vfd?-31qqP8Z zKS#WlIJYhAUsEB*th=Yfa~rh4LxBM+DgG>Pxbe+l=w5DWb8XZj0HXJ6=_vcAPK@?~ z1U)%J%>l&Yj8We|UfA8@XXG&*y9=}3ohl4{6b@!Y3O$=1%gs*y)}%g>)hR9@ZdNPO z=X5CUSJ#I2ll7h*4DR2L72eu%9A43Sk=?}1(r78G(K+-lNIN`Ly?nm+o%QG5;(&Hh zpttl^L;)&^-CL1D2)91^O7(7MHXvX<4)(^1-)GCHsDVrqbemAT^h9w^ZJe=z+c(|s!V6Hb|F%5)6D=ypxG0RZPP6*N$*ecBi?7+ zhrBH@D~iXmrw!lavI^CPcbyd#shLZNRbQHGpka-9eEh8AhUlu`t-Sm$LmjT4Sir#X zRrQDK?`OM%VQ0W14mWO9%cRS`m->=|I>hYHMx$~s=OLuA9pHJXEgznIXW62ka~q{U zp?nHyZu(rsIRdj~n5WGqqLbTY%4_en8cZ5yvRjL-6>`ganz3SpFZ3fSHzAD-s`~cb z$=jT{2Jf}%waSZ%ZC+xpev=B%f{$}~QG^u0t=y`?j3v)lQj8ZXy>0UEtlU}#Ld=g3 zo79*lhJ?bDm1kOTJT{-v4uZeTSq{xlWU;LQ3GMGgZV1GE2)~>pjRu}x;}Q1`!>t3$ zytooBOgvajuKl^KJSS(TSCHLK-7Ay5;1=Chdl;lXOtem_5Rj$gv>`J& z3LcDn48&W|1!ESBC6m-71I(Jyx{^6B1xV7A-rce6KZkxqy@o|&pEyHO(FQU2m?z%X z1EcA}AlJjiHvjFd1F?Km^6kb$^rXrD2Ph+A5K}pHiT@hqlH=hl_6E)V!zD%4>263K zUkFV{D#1dBbUq>DxaY11-SY^s6#rXZEZJmoC9(~p+%%c4Yaq71et*mPw__{fdDEk+b6zG!%q@AUJ~&7=M7RCAm0TSu z0xNPbxfeoj4pUhX*7P7Mbhdg!FLDXIIJ?5MUA3H(9NIy-%#CHe0IVRa*aUi7=`t~7 zjDnP>Z{~}Sjq{?fWa?)=XbtuR*WL{brSLoG9yiEiSci3+3GLNrVvFyvow%=vhK-kX z;%0YbAH{JTEg>dFN2*>80o$i~X(LI+Uzw9GE9+C2;7Z!F7z(h}-Mjvg8bO9?7O$76 z?4UZOx}=8Ml(Pm2G7l76{HV^3mIkfb{<;0c6N-g^)?u6kX_qJ8p3zJoq8x)S!}Zv7 znd!A009??m+{ozHQhFv6<#DFAUC^G5#nIIJrS3F*Y#Tu{BqRyp{mUN;!{Zdlet0Yq z7{A&$Mn;(U^P6u@gI4_z;e(+tf-yCPM9_;GAl@0+qg!D!D~WQ5=P16y)1wx&?@`wZzhSioi=_8)uzmvDiyiPf(mBk>uL@ekHP2a%->;C3%owAxc~ zx+Rv1@HdeCyAq3A^q~Z%KYpzyV7CNMDkd+LTPw8 z>v#X*I%8&H<9k6K8^z7Ch9D~TR^HNU-qKdyeV6=s>uRMTW{hdpAF8Ab$bTZj+^)l_ zrU5WZB=5gwk7we8ro?kA1)m+Bgde{*DTyf(nv40Q-fltDDptH_DZz8Q z2m@zLHGcwU*g zia?WvH;696kFj{F6o^QVl2<&It|E%<9&Vzd*|LfDWBDA~we4#BW}Kjrko0Hi!f&nu z?H|U75*K=RO?(o|G*Be+`DXXsX#_!_)rHLpk=wtf5^OW^5!P0njeL=@X>Tf{W^oYi z{d7pf6sVKgi+pqLHY3GWDF}XFOm5N}T-KluBhF_8Oyypp!pNP-#iR2R9=X|8Ob?M$ z+IwRrylAklY`fgUYR&qsPrtN2|AOTUJQc*7@^5;zqrp9W#PCl$;&Na5x(QF!^`iLA zo%Ixtq`>!^HV?X-pHp>_OHJ`B4PnL&-LQHjd{pw$&d%O0>ag(r9$R~Ml>T+Z14Xru z#T#OeO!6Mx#r-G++(946Vy|@*1m|!6a9Ja6&q>v;CyuWw4LzM=mtK2DMUjxjlEg-d zzGm_`J^5{zztQ}qF-)FKF7!1i=J~->Th{OUEZ7zL(+e=-p+-VT0QWj$S;?Y|J{OA^ zMx;ivK3e)(883ZM=zc2o`vytR)X@7hJW64RQ$^48c}fOFLOe}+6MM0nr;>f=UPIRv zNpI~wu|@oux#npeIe$t|p?^kPEvIvL#J`GyMS6h$0dx?&e;E$)2Wgx8_$eH2O-Wpg zrWjUTyoOB}dz=o<-ONFC3Fc=!#{tVMsO(3Xc5Nn$>?Wzr|H1sSU%LF)ak@k!4#t1O zF&vDF$2J?jM#Nt{MUaEgpbub~m$aI;h1uj~ehFXCB2lf=iV60vLOG+0L?x)og3CAe)MgYbH%Ur*EEE;W_j3*0v7scvqG>muy;?E0S|!FX z+QmxtfhO&{qMvD7)Q1owb^iC!BxBW^F^65(du-C(C-dY z@|$0Y?zV`0*b`Gi3QKjkbWJG8m}m41^GHkDvpA)4Gk+nLUuMs zG`N!DdK`$^8%BEo3H+nDYszvRCEaH#n?{kw5q78nEt6?=qg9nnC7GlKukMe-5+pCn zNxyJt(bea7!#~k0>$Swsk(LX+VbUFDZ%|Do&nwhCX$_`b%p?@t*xnU{x{+zrC331!_HBGnqfqW1MG{FCjQ(Q2a%TNN22jq9L56+Q~Y0jy0*fLcVr&G4QfIN zN0(Um?H`Y*zrM_-$=YAj{EHB3{ zcOcWPgWP$JX|*`T{m%X7(_XpQF!RlGp+boGB5#c4?3cxr5R$t_G017TeH6fu)9;L6 zSM#y-bF++Eck|yEcyd5~7!|!-2M-<9>Bl?sa;SzY@HoPHJKT1sm=%-%gvzyS)|dOp zfe`&p>TI5mXp6}aFQ4hr2Mfsqka#twkMc){b}Etn!CO^XxYpks^93}0h5xEl#`Kk^ zvQ0jt8BSS#ceFyiB6J!L+P4AnaiIks~(;BOM(@*#QND zwPJkao*>}F-h-F+eqNlY^WMAPLteGQOH)h3OX=o{4pw|?YHA(exx+7bC97}0ih5sc zwlW@7NwN^2Rs4tb>jGpvpQ3+De|wQa4%A|-<~6$BaJt)ea?{bFpGiLcu+#DOSv30> z$gJyeq8gV``HbcEyYmj>*3t4#DpQj8>J)oV#FcaBZk`;l`yISF)bAj7f0%RlwP9^z z5ulo|p^;o15+;)Vs%|EVxHip7I{#OlXqxZDlbI0-MdO7P7n|0-OZyWA;` z42UYjioJhrvJ=sc;#E)Gcd>d7CuJ$=!NLsb%r9S`6c#;?s3>W=jLCyGk&I8ZOA-{k zHyNnZ9X8%((=$s)(3oV%-aoUhJwH}TYnNw{vkBimXow_ort14%_fCJTTT3ZAm@IlsrT7i; zDOW z`RaAUvpO-FR02W*F6-gAS)r|$ZOUlBee}US!b|NI6|k%&LEca2LqVjmQ6iz~bhM!R zDLq{gu(R?l0`O7p%c8F`wZ}zFuUs3<$Ne?7TFp?m8qS+%gv?*~UwW+E{)cHMjXl9& z$q=DCf=9xJc4w{U9E>Gl z=q$OnSgsQOJUy|VrSJ{df3n}14tzQU%DNppGrftuyPgX0JNqAlj*P9py48i#1i(I> zTnTqvHG;sn@|D~9YRT*Ce%N(LHFkU-mQI)6z|P(JUEAO=VrFE=J+*f5Rr!38d_Rl- z>&$i^UE|wbk8gLo%wqS(*$=#o|qNa9K=R5n4}H#M8@JNxs^=GW|@E@0;V%TvgWLpRix(N z|FelixnKy|f4JPlYp>+B1YrKdz;3tpZOl5fqKW1)23dXL6=XvqwaHLFqnDW?ZA_5F z5!|{;trF|Udp@Ap-dOOcdNxK?ig=6R=p@{WZgfJAB;HZuJC(^!B4~2!9@%x}W6L+& zneGHWMcN-wYGJy@!By7Y;X0e_CHU78%=hh)${sRNuQ`2=x;oobBZ5*Y&18_YC)K3r z)@n1LHnj_qN!B?F$mi6*a#R<5w^b-vvSUN@?4zV}>3;+@zsoO7Mz{d^g<4p{i=|mo z#$3?`TKbnuzon6(T}Zk<|4&bS9^Z3iP`9nnHfO}9CS6r--j8X8q}`vE8JO7c(R0qQS)3wrP~3i_BP3O?P=A)aBy;eVFs7d6fQkcDoy;Ew3K$Dj{F7&e>p^0 zts81d{{Jdh|DR@CLm=&DkeaCJHX$}t>EV()?*nv0$hB_PYvRr|>bt%PB6b5ry%6g= zLS*jgsM~xz1i{Oo1AHaxcwNCBNh!Z4ISVjeFOg~IyB!`FI1VdovscsMm zPqfXqhv5?i%HiRd=DpC2#mkOVc1{D(U`jv&^%BYu)J`Ow!E z_okNPnr>ck0RhxYmxW59^jS$IeM}A9v2aP6@lN?+p>M$5>L53 z(jgE1gM$SqFxU^}qxR+10Of}UK$)1e7nq%$fdgc)49X+>-7%Jh?p1&tT<69#H*b{L z@_MN7ZYBy2>*ehNU+RirLG-V-Y3|~%=?A0;ypMgLNnCDum_Pe}KT&|pe;sD-24JI` zqI)!VZRPt13u04Q)N2!RP+Sb{YKaPJY%Nrz;7eiMsxZ=R;cNY_+?Tu=4j+e}r`rUe z_qR=aFxU4CevxOn=uz)w!08Q{iQn0E$};Xm5$1hzaS6Ub#xY`r&UZ~mabt#3j8@4! z3m$wf$nX%P3OA=%tL<=jVPSusLJaq4c?6eO?Y;FeL{Rr9wm6wlX~opxxu>AG6JFl5 z3;0D{)XL%6;o;TS>U?xecBn7T$nhwbz+Q)rU`hCAF7Ga6?HzP(_uA&ct(GW_Ehxl3 z=+d36OoO5HvS>s3pAHV<3?~Q_tXo-ATp)xw%W7{KUgy>|2KTD`;~)&H(VFzZ(O`L z`=^E}h$;tp;dkEp_xnxD;p8$8^^|o!}8!` zPM-PX@5II5FNWqW@)~qD?c|nx&ezB41%l=-yu&@7UvNr>G)u9SkThx)=jR9{mE6zd z=oF0p|1^@)eqkcr+8tZWgV_rK=Y1c9`W>sj6-~kz)MXPkEx<>&l$%W4S#xf60%^sE z88YecoR^KgVB{#;xAT3UbPGdW6?2^Mu9U@FH(ig4`(vD%NX*3W(E}aSBY^+RV5h@8 zSlu8YyaJ38*4PH?{R}-xDWGNJY3NG`4^Z_4fjqOVCiu))=I|2YzW zAq&Z$qv2BJ2p{A&O)~x+2iXtNUFJe)aAPZ1(yt-qFhM51mLjf(CZ>uevG&m3+qA=9 z6q)xf$8E-az3=UU|E?N;{UNu$`%0MZe}_ovC;1yO;~0B+J=qspXRNK9qJ^21+t1+= z6P`y_`)~f+GCty`8}ha_UXgeftv#JraF@!feVe)d})WMg~Xh4?K?Q`44u4*&blGBb!qgUdY^ ze|KSZLzAv?PC{|?>e}6;m+;@F0I8}&a9^?7B^f1yp~hR)i9macv@gcuNf5w`r?L6! zmFUJiq4OO97o9Jmm5l-0R+ma0+G{#Pz1P0L*7qlgIlSI!gx8`}Wh&JsjpHH9YI&q8 zn-mCu1QVZbRoS^8d|G$vT%#sMg{|UrN@SRX+2}V3Gm2SzDslCmr$ig5*v;lr?YqNa zh|r*RHDiXyB)vHGM3=@mo5s;U%A$nD+bB;wN!cNUEHCEM8t{2m;d>xap&i>^Uh;P?>y3TR>lY;dla;@zY4=!mvmeq^%d@&V z>xLIk=wm2*pFk|27Dim^LU=I@!_N=!eMWR5OzPLMsHr!K)h;KZ#0qDzk26*tnfc;f zKw8Bse=fW%vB4%0bm21hc&fH&=vem zxQ&NP68G_=5?jA3So`xIhj{ zSh2jTDJ*psO%k_r$u3Nz;gmdtf)#t_1pGz4d{qu|Y!a0t1a?EI|K|tj12Mj0_1rGL zwxctnrFD|@fWo#9-B9e2)t){VLR@J#U$ZCTibIMu6#(?f%leN z)t3=Yl>tP?ALIBqZRtEyE%1l0>UT5k2m8bxMO%k@DfRrWitgrX9e;xSPptYknrADx zBu={=7*)`QFjHULsEAma%=@u1E)WqM{<@)_x#ZSS?Yea}BGUCex1XN(2^N|Xg4J{! z8NKvEG72sV<8|lf1FlA2%kTqhK;$%(#&iv?GA^+BUsA1X(7|3qw3=F8-JY3B zmhMII)%P=Ef(>0Jmw8NRpJdk(3`!;WC&ybNtM`(AMi%?&6J0`Gz*C%#4zpf*p>^Ua z^CQq-)mqmU`|=1SZNzU9{in&|7kjSI>gFR?Vw>E4R_Qfo z0s9K>Kw-7Ik@~?gB0fi-f9A>|?@rn?RzoC*W(7R`sfJF;wKr#XwI;XqrG1T`3tAXc zs#2k=3rge4*m5&!=Q4YXIRiQjF!RavDPxL6MBpDJ^4c0?5BD~+h(^9MTzZWZ_jZ+&g zePu;r;X_xT(>f4VIkek-|J#~(LjyZH9yOto+@MS2tswgXm zK%w=OmB9>Rq7b&>va6$q=NA`b&(6ux*nHqTPp8q{uT(I)9ik&nR6{(tw+Af4_deu8 zd4+@<&6>=>Q;7BXM>E?0xx+AHwP~7A76+KsfOyZ?dcu$)y#;lD$-Q}>5mIV24Y+r5 z);HGsy6z^ov|Pmka33YXqjLvhwvn=Q4-3)Mm9wNc)>nqn;H4-#*9wd=k7*_XwPjiSaC1s9hVXDCl z86rz%1N(p2dk>(dwl91XMMXtGK|nx2K%|38lNuE%(n3dSL^=ovNH0-}2nYyBF98AR zz1JuTNbkLb4$?vmkopdK>+jzCX5P%3H}hux88gJ>oPG9LyRNLR*^21YWeL47g zd8Kf=gN$XoOZT3@cgHtMa?GCZujfw^3oE3MF%dWee=Y#l+$3Sv2g^>$u1-x;8_w&+ zzmZVcP#^dq(Y1lv-nbR@{JPO_V-PDY150y%b01DrNEu&f&3v2b~}pJZp`Lp(C44lDql!XMi~tycOhtJM8a zL_?kP*Gy2oA}q_><~xsTB`C|>ZZ2;qbh9rYN(*4iiddGZC=v4MO(>U zH7=?LOYePjAEInFKzJ>A9i3R@AmOSvafvkC%tdkeWVOY+N)KR_=Qb4~&QsamZ%JS- z2n7nXyd0&{Z{qawQkfO=b&ckJYgR8;;ce>JNb&(knRKrb z&7+Lghp>KY=JjjzmJ$2#=M4cO#4-z;S5bEqH80SC#-aKCvPu5>AzY96Y(H0>lDgV) z_Tlu#+6_F}siiYwN*d(;xmj-`7){5hbAdR zl}flh|7yCp-Uc3~mt= z#CwKd!T22Q<9P>=U9}Y*O}*1x-{r;oef=jYmQRcz3P#YrAE{yoM&;`gKknoJJMEhUbDErW zG!NywjRX_LEmG`BC8n=9=Gkq%E>D*r?-nR}+r@1VTgT<<^LS(8V+)U{oL!E>y%+ZV z>7CAb{BN$;-Cfx}rl5c&IBs`zt*!H8vK4-<3-|w4FF(+p@4)*G=dm5NBoWS#S5cb& z(Q|Sx`W)_|WQqIR6+E+X&2fb^QyI>do!ZfDhqDtG@MQzCcXm98`C(|b{LfUGe;(^C z205QYM*grSM8AovvK1lo$KuYL=Js>-%R%JI?A_I8j4WKE`&=aAB{QWE)1lN+%RbMYy@sj2CV#P9CDQX0K=! zut~9AIrnNHQRPq>#-;t>QG0ADw1Iw9SQOZ0tPiwJZ0BC!hiG&9`k-wfI_lqq+M~hcsP{EUI{lc%Q~4oi-NOhO$w9 z+C1>;6&@hn{ytv@) z@=^ymQ$*LNrijEk(DR%9$kgd6iF%+;fHU}o5>&wy^1`S$d16ZpSai#Tydb66&*(Yt zxjMIZ#Vd(cH`%xeH?%vD5lTw_$SxmqG`loQ9B0W~L#Z=O?>#%Pu@?FTQ+y5yXSz~Y z3JrPpkx$wl&&DjIVEkCG-s5|B?_~!nT7rcV>hX5W}5qt2!DfX|JIp6QY?0*oGhg8^78L2)`h z9w(TNWLTYt5m|kkj!_%5M-^Kn;3UA4d)!&E!n4`fai;r^-=oV#6iprdVCEk3S;c}i zhdf`JvOdQo`lTF+asl8(>_Qqi*o$PbpQ6X@swZmt7VjE_WNyhyUb3u$NN$8-5MNC3B zzjoNNNEE->thrk~uee>L^q`)fe)9yxEgtm0Sv%+74dxcPZr#q$i(0YuJ4ql||m6wa<^z4MMypFW$9Dj;(&PsYyKyXW^)2|N|H+gw1aHOig@q7 zyrqn2;qr)FDk_$!6p+&dLN1E$v~(DBz4;DGV=6xOt$OLY>JCQ>zL3t6S?|B#L{-9ZgZF zd_gxu@)^fF-kpJIW#xiZumsH!O5-WYrekHRALAu_E1d68;K&ynyRB2$di-5j zMerBH-J6$BG5uX_eQlv)AI_ltI)jQ8%VL|&R!U+S<)KPBcV)`48bagk{fjWEQM!!6CD>s&%hF^E!}Rp(Y-x0t&`DAw!#i%uJTw|n% z3p-)R?JjUy5#Nsp-$}}-MykC>YZ7~!iDK#M%^B&krHErLAsS4X=s)?$!iM{02;x_G?i@zBKm~bY5APct=;w2k z_MG?#NUTx%-0JLGtr@;EAo$dxsMoi{t)};G<`hBRJ9kvPxrjigvqktSO0sBu z6nQuRjiy&qn*6TP1b}roMHphMlH4tkk#TuWgfw)NQprL)IZ54dD`VHWyt9`C*>Kry z+h%p7e9oNj3OnCkXd(@5s&OKu`d+cUiG8=<)I?xy<^Huu2!py>eaY-lGj>9@wldV& zmezcfwZva{SKqYNy&l&T-Ai*bA~y^9@WUJ>T)wSC(m#TcUrXRSB! zu>Tr`eIpx478yvk7fSy%l%7>Y_|aA20Iv!t(>iL%%-meXok8v5E}m?OM0Ann(Mn7= zU(O}&vC#OA@1oyQbAualLk)j?uZ_!Tm>k<=TfW9>AYSI(R#YDmrg=4ingVopOT5FS z)Z}iY?`Y|uZsu_~<01P9n7az|c6>r1rA{F-+@;BM^6T5eI)zl_n=0BLemvXEd=@&Y zuNoIJMY zsUL*uY6S3xrBpvtdGxZmdCY}$VSsf(q(HIVASV9GvEx+Pm`h~-NRLq+w;z3h;w6JC zv@|J~OKptIrqE~eHJ958GG2~#R61vj1Qfj`HLA5(9?)jtp&~^wwvRPA%p~r=%}oC8 z64*JQxIl`!d3Dn`rrKP)CpJ@sI?xMjpO?oatyX?8mdht^qeMP>Rfn-Xw_w7v;7!?& zNtF5X;)xO$sF`7F*|)BbQf&iO%pPvqK%%v(;d=E_R?SCU(@@{&GM<9W;C8pUA7^>j zC|xUfJMtk>x^UiV{K5v>T(6SZa+tTb&?r^2{$9O>wf$z9U!A#!OQ+L%>|zQ4E!7oi zzK$%Rfmf60X=sG`IiEjK8~QBAlLOJ}E8&EjJTNwLH@187z|P&o$lX!qg`?&RM! zgxP`eFXk(LRjCx?p8PMpl*Ul8+c7gg(WVW(i5X)`d#>xbRJy-Fdz5`D6Z7GuAW#!r zB*RL{;(@yUc#$xN!?ilL%#Smdr8KErqC@NNkcVpa%JwKoZYAL)oM+bm5| zq;wK(GpB7ayZSA2rRCF7%O?x@Yzx_J%eKsw)=x{{GA%S8chwb)eJF@u?9y(h<1OWn zW?IOx@j>N%C|Lc_6+cu^vv25`$-k3u7O1WmJTBW_+tOak9?U>GYC!`ODCEdmx%tT) zSel_9U3Z6tFZ7v<&B)qS)U~9tJJNijEK(6n3xm#7cS)&4XxPoDIhO4o^N*z()(E;d zd$f+=5+uSGH^kL-rsJz|_nlm=zx1$;Pm*WRZ1qfO#ORdi2K(e@Y12(oIHc_k064l&L<(^@LJZZXXX}i@_*NQg?;ynb^NV|>Uz(!6*gBIN zQ9$%II`P8_;$zABzPB6ANP?y9&WS89Yx*_7GC@1rViPy7O|TiBs->M<-nY4CH*;Ao zee~R-@tMWcz!{*P6;O$=hOQyv_BG(WR*$@Wu~Fp4Vd`n8;sAAoPf*e~FH-+Bgwj#; z6!@AML8(*!Qee@~V=vZe@fOxKMd1_PExBk7Wsu{dQGG86b z@nP$UW{nhovCu8s!Mt}^ZR^^8E(YDGaLdIObDD3rF}uMv~it8VFhbt zrnk{f&*FSY0Cv-ZTK;eZQcyeKvH#3X7FYS9Flc_y4JqmC3(+*_j}$yR9JWL@s#;~B zuPh3#NXX-_U~C#O8Z;?fXR3P&pLSUxx4YyjY#c5yZsbv0KjO<_foOR@u$;CTw-TFT zxq=C$r=<~*TNdH%u|K+34MbO5$kaq8Uzqy1u)3bGIvt0OMe5U)BT|Mq8ew%_E_>sO zT*n6wd>)xNfBRH!(qiea*bCf%iA76GLQI?`vgx+v;qm*%IGOySK;{M}V;{DHwF$$H zt;XxVugVJd@*GOq*z8z1#QjxY_DJ{N!MMvS*nwZz9lis~Xy(+RO)4vJYz=_j{9eBD zTA(q*pXDnvx*3|gXMF;`0PhpKQD3b*ReN~#y%+llAFFxXP<{J6y73zu`yth@WBQQn zTNzWGk6s>+FV(L{yTTOsijCoWPn%;q#+vQ!)Uw}UAT<@-H5GKywOlUN8G;Uby7GhM z#15Ied(aMQf9pzqK`+qOIUZMRzJezm z#<^X+S;AvavA=3cAv#p1_hy(rrBXL;p*(EOadL{DVl?~}cBgf3A$lzuvj*Hw8v|D1v6-f67OX(ZC#N!hA zWv&~OHKq{sNJm8>b*?!zZ)u?G=@>5ArFA84MT%i9h?VUIgOqO}JZ;wsKjLFfvUV{q zsndqvL3$!e-J_vw2|Y4VZoL##ewf0YU#sR*8-XGw^Fi&lb|!IywHV=J(4?wUpN@aD z(U_0QTZq1)6$+pc?cuRch747t<#?E=JDaKRJuAcdq2mWWwRpHF?XATv4MUS5aG)IG zmCef+AEUwYi=*;ahk6B`pC9+WRkMMeVvLhHG^CK~qwy}`J9;618`D0s&N>#1WdKHC zq~b5^>|JcPzpR&27^Zm4+Vsth^iicaN4NxB-#q`x?sIyTM_Zj=or}Ea*@-=H?oYg$0`{<%zo7E8I{_a1b4a#J!24vN{Ht1I_Nyr#lOZ?6+^wCN z<{PVrlzIMm$M;#O2h`SRGMtLSTIO?uXMu@ao#PWA?c1{== zyv!7<&T}11AFNO0-?VQ^)bZtY!9;Gl=<@VdT5cAPzsyNTE9$PNNNA_TelP5H4yC8D z6RXdxF=@XQ5-Tg)eRV^ry5(y396O&0J6~v33K@^x1px^O=;ZO+!j*?gN&X_DZ$6{| z!HC}sQ`@&oI!7J%5M`9oh*W$rTv;MxHy1R~oM*3ghWUAl&+J53UOw|?Jr65XQ8g4O zA==ny`_*di&96|zdgG9HD!`aQE=e>X2`IC8Qfe^+D7l!?XG`pah7ccioJrH85tIO0_)_{JtpKhCI#0&!W1JdW{m+#b#G7gxnSAAY}QbH8uhA7v6o7FQ-ypFCiN{GK%%y7 zfwlGgJ-Id4D=>;LmMZ%iMg8)N$_=1QHe}KR^iBm*M^=*sGNYD^wkbXhEYkx|LiOG#?9&VS$T#17_9o&D&`rNZcJTCRY9CPleHQ2RZZsAVaWpUB)7Dn!t}PvV9HM)RN&w-)dq6F~him5P#5<^6WS4BA6b9zF zJ_<;}XGsO*e0OM-IHd{EXJJs5`B0ESS2+Y*%R&Rz>$@7Y!x{?pzO!2lZI~tCtiFJx z8StW@i-ajK8~kYgBlP(ASx7Iu<_O|Tc`N`j{yu+v_9_hHxCp}C+-3GH+eSjGW(kdr z`=RiQnB8Iv-_6l-IC>3<-)t-P`GFDe{UHHD&ufCP18&g$KnKF?9>RN>6oJLl!cP9W zqeH>ohrnjcX#vTd>0ZzdqbF9^6WclnL8B;|9+BZ!Fc9ChAOdQd*=Om;3Lb~)g&s(N zJh4El6N3WSw!vOPn;VSKn+sif_FXXF%ZD7y zt%HjAQA{ZmJD1odt&H85w`KNn=w^mDu4y_H9U&YFjs_7e_~R~Ns5H+U*zy~$pQK`T z4D6%8w*Zoo_|Yq^zbB7u!53HS;`=4?@vCm7(0%+G2zPsH5ZQ)X!t6kgjj^W4Z}@hJ zega0cALhxi44w(b0j=W3>v^pfLFj{!wi)AtA8zw_?B-b8O!)EsWGP`KWf+S0or2-` zQN?&*X|d=z;AsTF%l%BP^Gdi!)MxyuU;n@P8b|!|(`C-zzdL{RDe#nolh>JxCD31= zPM;kE{rdFUPZUEqD2DQB*#CZl`^_C-9t?jya+DZD^7E+K$Zym5z$1w(S@gfRB^h;X z1HuVs#j!3`ovMjIfg~lpcjjC2^0*^^okOI|$g~MDn<`7jSP@)YTzaJrry#gtNU-Fu z3qM_ZQ4NiB+MV5iK7Bfyo1KboL|_`TVZQoTf8NV0YvmTdHlv0p;0vV(J{;pRosC^s zg@qj;jMqX?u$Y(w66iJw48Nc4hMeIG`Pu4cAvxRa>_Lc!_k*+G&KJEX=%^q=TKZP{ zq5pFFIN|$u1u(d`(stB-s-}NrMD9m5!WZL!Uv{wQNq!s{$8Yqp`St5l{racr`-+}c z>dW@~`^75u`hBAD_}Tgm|DIV6t~pIh!lCrg)d^^^%Ms#kkKx+kjaV%O?VrMwA0}s7 zG?XYG7)x-P-^eJql@g;FJgJpuKU61NK|u|lqlZSD8q#K{x}HY>}leX z^c}%R(S|REz*SqZUX;9sHER1i?Qq;ATzvtA{R+yo`wGLh!@SotVd!rh(mP2A?DA@V z2E}Z~D-dB1ls$g9HO;g8QzZA#`TOVBZIqcW_k_H)P2#Shw(`2$=6bO~Jb)(a_2H9uLR~Az1jkFb6|D+hnZlDXUo9}IM@7T1H@mfsjQB!YTjk{C zgWkL;(8+IkRyzLNhK0~W)a!I9kV(R6Y7<6380(*?emG|`U8$#~8aQ;H@qMDYzLvz? zw8||i;WS(nCnG~fQ$s+V8v2Xj#2KP((juA$Y(lR$svPEHc0gFe%L;hUaai-Qk`fV# z8@RH&loiD|u*~rPSnl5U-_}=2FuDJ_=(S*Wg7RjD(W|yxAuga|jKtfh7s4^X`teU{ zxZt3tgqD_;kV)`oBms|vGk2@umTBl}aQsd%iX=qS*3{qZJ zHuABi2Lu99R8(|wD%1HSAt8|)(80A?$kz6hkhxq~SSaDTk!B&(oGueI#CN9D>(HJ% z^Ghxn^ZUf<8b_J>$7x1ifM=5AV&y^TE5cSbHX630#Sk!ih5tu>A@Z$=GxulHz7smF zt>GSKz4+=(AEY4cm}!HVDD8piAiv9qScQ6y(b=9R{S2MKiPzePBOh&VI8C_P=+_fP zXj&^BWZ0B>-?M{0wj#bAxCWLygNX7aO^*DnI*Gwul!$qz&SRm{HpXS)&sW2veGJ*S_-P*5moIEOTOTU1~xke zZ@0_>@v~XSt*=JDny1XNX`13+*5EX0xwA#COE<3#=jWb6T;hFF@~R`|)VCS`Q76o( z>xvx_(I7({)@zV}qAKn6MG3-iYrPq}+~lIkh2t>VgT1p7p0|oBM6p%zihe+1UIk0aSWoX14f@1B$7JDg|b% zrhIIbOi4(1{9|B1LlJa1<(xT6GzDMI)A7|3_*`I?}Qa(&mLxU4HA1a`c$i&rX zJ$OqIJf?0-fD#U&;2$49vMT0#?M-E6W$+0FZ@z+W#mU%30V9 z6hj)X#qCiYb7Kuiis5+iO%2WmeYSkdFCGd=RW71H&dbU(SBNg3zqSN@ULZXOuS6p> zQ4CHQS#@aVcT5Sz^iz_Gh0 zF@l4GgYbnJ`=uV)q{Ob(<91eB+-8%2J49sfuSg$?8OtV1`y|R`G&eUt>~O+l!=oBv z)3We;Ac7#Z+@nWoC_vT4Tq*JK-)+f&$b4S%>hWPf9w9^rl(2eSZzjz{ZB0mGTVs@PeIzdr zIvCRY8U5LwkCnVe@ItMuRxt>IbnsC%9A{_ae6Xf%lN=TG@PhRD$hbK9g_BU4)g}`} zzVlGO5E-tI$$qE^ou`7O39H45FcmkV=wtfMV>wRO;0CQgxF2Ba>wW>L6N4HjY={g9 zfH|kktRow)(hv2RA-@{uxmRF5 z&Y0{S!VWVbvXv$06toPhNuJc*3a3+M>oXKOt%8mz_6~FdV$@};7ssRCZn37t#%cY~ zCB+*Kqc}|7V%*tUqeF!8?y{xy-Z(9K*h!1Zd_qBY&t zI3DR~K`b;RweQ;}DTLt=7Z+z`WyPQL=!89j(5o4R2GvnuO~0~7FJB752aMkA@9$Id z=%_*bS~JthnIzp8TFJgHzuvDaEDWQ^olwrn}Wi56ak3f zYAj^31~)ukLil3(;@1Y%<+n>Ei9QQ`i@VLEyLs;bF{8CD&QOrHSpBCkbZp3yFGZ%!)yahQ}SYMOxdl|m9S@vHY5~IMJamL8_HsiD0Q83 z*gr-Xu93diB+W1s_q8yzz%Xf>9IlsLUB1*Bic+!c%rN$dA|xU$@pw`~I;Ic;iJ7Q_ z1NZ3c6k#N4e9H`8Vt`?58hUk%zqtvslbJadz(+TO+8qnYh%VP$yKXpa9>*u>rt`>f zQtM0M{mE#tD$UtpmI_X?GxjlOhWDP0Ov;dUvkrffEVOt6&LX4E;~D0bXE2ZMN4_{HXsC+e6mx%HX=%r; znw;i3^v#75!r4$Bo@QeSS>Tt+z!sgQ%NBX5Gdj1iw$`4Vb(7iy%1`x<0!tzOux7CH zS9a_bh^@hx+$kxy0$OGgYeu=TYhuaHV}5ZnU7_D9yFua#x-fU}ol+ngRdm|Ldxgj* zGXGUNonMqoJHqyzJd>1YTjraEL+(^EbDI$A3aD0& zJ`1F?1xPeX{z@Jm2{x}U-KefDMmZ>OH>ph6@ebtFtPL@(2{jke#bwxL-5fsk?rjsA z$y-P_pQ(xfN2l>~qOpDx>ttAz5mCx)87l%=Lly#yJmZMssB>l{8OlKY8TX-{$G ziMRb|#mDS?{mr~8F@?c$i@M+;{o0+^gnxkrXCT){@m?T*hU_!(FCqTI(b?Yf#c}>q z%U>qp>+fpUlO>2K&isp9f;_gEUy)q;XD9y;uKa%mx3_UGrW)wtSyDknPd!;qe2QTV zbpFQb`8ibqiVfyhKhDs-z=xsOE&01_#Tj1RS%0}Vp`=S9C*RU}iYT7ur<%{9C{CaM zUA<4mAFP4PR}8l4xUeRPiKHs9rcgp1EFSu1v)zk(gRPBql#ES***5Z_Mu zm%}Pve{-|{suy|TDJ8#gqg7?-C8F7W`G1C)!EvCZB%>!P|D%>O7oP88-+$Hb9UYB>iWE zQ)c*%w@mTFA%dmcmKx5YC_e8$`1gJ%0Nr+b*3a>nz6yTq;ixz=KcJKf&NN z&Y#HdCvu(KiO72#^!!P$(OoglCkI{mkAu_%&!WH!Qza7UH_XGZPNQ+BrDVGQ?i=b5 zJkyBNJZ#8M*;^NA@@iN*_!=fT-)mgF#dMjE>59(D#f|?}jA;B!Fim8_P0Q}8ap4tX ziK*2)Bar7*n@ndvCKmS%UZErUoDs3@DfZp&DdEPewBOAQ_o(o29W3 zCY${$V!BKTgu*8?XD}pB_5a0At%=705t)cV6qto?nk%aigPc7)OA;c?_b9gmdvT>9lt>tEWW z5rM2HJ|EgoXu0gxsqv?!9IeNILXK?>vG{tiq&uFY=8?pMf5eWb6Ze~OBax3Mp`B@) zwAx{JOLOoct8DT+l|}V${f!PiL(|#G{zK;+Ko?_u&ZMPZZ0*&APGYi!+VoN0LH-3l{mT;~ zi7c-X4}WJ7Ck}*2Zot7-g$ZU5f8{QZM;jo@6I*@w(~t1(OA$KdE;-ctQo4iUmK<8_ zqT$&tF1i!LMh4&<>bk1_de_p3t515yP95?6&R;%Pyxt&$tyx4yT0q-AM;wZL|F%ID z@dhVQ0H3-9SQq^->w;E5KTW1S*Vo+AaM2C9K6Tz<^VUkyX_Xl9%SzYOE!FfjNl}mv z?j`#LVrbxBg${RpF@S<^dLl`^=*{Mb^Bz;+)t;!4{9(6AB#uiF7m;`GWDYi0yI6&$ z6!AYwp3`og=1FGXhqy4M;Jo5fE(`aFk?GA6{vgpO=muemuShGlw)XJ_`4$(M+-5a zOSeY!D7jC>DC@Mli5`C#ya|~A{d3V zKcdHQe6XSRskOLWt^Nw~m!`ktAu}K`3~0m-KUZ|__=!GLWq;qa*#vN2f#02%;`7zN zoN*NF9T{orqPc#^Lw}39>JAjX4=Px8V*ArI{sBlJgoGFd{@gJ$*$zthevH&kPQ9I@ z*VCd(s3!D9|LKbV3(9eX=TWHQtaJp8H+Dd9DVr?PCp}u^!gRQLe-ARjYu?EebP{F# z{~ZQF(}OqfMrYev?YGq@HP!D`u((#MVr32Btc%~+C)(fs--JS#)=U--wpHC&hwO55 zO-5Z~*S+PK4+~P=c0AGL#eWZ1&<3vo6tu3lYIi>@y9$P4gcnM~ZSMjVRGujop)4S) z$rJYmgm-Xw{}XKdCEmY{4FN!%^YtCQxdCecd zduRjc-g%AFO!~HrVvZG+(sM;KEff;32qZE-GlZW0)4KlWa(6M7oj&6r;UkZw1c&Fj zu;zP1VmpCH6!CiUC-=znZ=wH2Eg>C@0bAJ+kbDQ442a2og}smqSbsWs{^76xNh@gZ z{wcX1DCnc$8Sf-~<-+of_8Zr$E&m;qI?>`5(9{HN+l!l%7G z>vb^^wpN6Qc{JwgGjge&u+2`@>G+8>sdv|=C788NZtp+16>?KZva~5{Z|B#kgjt_I z!`2J8`5C=RbmVEP6-h|54$s*K>(dt~}z!Vpijn|qI+YstWZ_;(4 z+-nmKM~vgppPcrWx7{j%mhq(P6CJTfPZ0g3LCPHmVAb{O&-EmK>R<3RZlM6Q?R<`e zq$NrF^j{DZMF1H*CAiJx);%HpBYGrV*nnK4A@Y6aUaolm&uCVVAqwLS#37FPPJI3s zYCk2+M#?wnvHy+!AULfrClD=*VopHp4-1TtobTp7^*8E*>;{;l1G4_fAQ^CR^o`#L zy!+x62b~Ll(i6ZWs7@&6%!y=w@gZP{CAs@nH2=)s;vzi6gy81eNDFvN#qZ9!{he*5 zfbuT_DkBure!(NLHoYxBk?#+tDbKWH5%b45Fka+|oCCh?))*m0^iMDb(Bfb2L!Sj8 zw+u0~VAn5zeM$dLCz(9H{jaovhm>trsYg;MtjfCQRfv6toFV!|_d6c^PX|;37;Evq z!{(6}Bo%N}s&3x(nR<(-hz3vp27X`IBL1cz4h856Qxl$o0gUTi{zUYycoBwQDk8P3 zy0YU0%*mepkITfqKSlDiZ&_Xv3M7nwNlnw55EvLpO2g}ZycEX_#X5Rs3dOt?C)#58 zs|tZ!!*7YS?x8V4ODL_spPw-lcM!%P$|U9#5D?77rNXYITKSQY={W2WWe7*J!TYToqO@!Yzu z&-Kz_Nu$c2)HQQ@fZvS12r?gE5Fkz3&eYI zQZ8?nSzDfkH@{hVq#s9>+FdWo+7iFSG5|XowzEm?bMK8-2P?p@?SjkL>%~c zKRLkGFdpKu6oYxOg|Kc9VdbgXQ05{G$JfZk8|j6atxKi$4bjfGWK6EtINmIAo>O6PVXGEfQG}(eT zT%+xxSrCoKoBXcZ1tL7cV)4BHsdU08m846DSQZ6S*^c&`$m6fd@u9a5&AW&3{I5rH zDo*)?jV8ODieuDIyPCHIObLYjN3V)e;4>s7V1P-4H5W|bW0_LqoV!W|JzrnfYoUi$;o|j2cv+E zyDxsfLV3$GbKkbOQEo|#XX5ck-RC|%(FXZ7N>#Iv2t3;k-$v(^ghn1JDPDtp@rTBoIv9qo7L3Ye)F-qJG_R%Sp4q1W&!iN3tpwrXPI{v!Z?_q^Nk-vKR$i7<g@hZ2XZ}SpiqrQB3@Yetoe>a{yDv2q?w?l;xh=okU_b+7J37@)`2;VNW zOuZT7jcvD_(T|7jznRdkjeVPFu&zkclx~Q`FGlzahL>izE@F%BEq#n@gSoGTE!Fqf zW>Xm}vRR&i=e+cq&!zPj6e4ymu72cI)VRPX{}(bO3S1oIWHJoaTzizdjo$w-yf*8v z-@DQM%tcEQiB_^_065nOucow6Ynp@1Tl7Iv92p}rGACmkDCU_BUbXc~rk+GW3 zu9-)N{03#*VMw?gel-^+z?V~0T+IIj?OZl&8M}p~^$CdUdHc@$4Vj@4blJ?KRWd8m z_NikXHW=31$!X4qqUMDjJl<>(e4Ygkls_kRys`0NH=3i@@Kaf+EK+LcDB7V-okHKX zwZUUtoaz%DEK7D%LJv%84qglv9Xe;fRbb{H%kT4sFFm<#oBF81x9xTS)6$Zzv03WD z&VE6PZm}_6ihTDU zJ(*{-%SD4b%7uR6$%YtBjYW>s3y3U~MqN$A==eI93RUI86r*?aZ6{7NUCKlVjSaDR z7TVVO1DMrV(c!8dpLeV7pzwUrrL^O70bf#%kI?*BG-I)^!}aF-rf4Ob%>ZyOCo)w{ zy2OLEY(VU-iRUzt^k38*ya^;si2oqb+MG@~V`&cv0?P!{PMd$#-OVA=o1L{jGEYVy z-BF$yzJPIkJy%cMAx{eCofar-h)ZJUDg5@dxvwm&8L_o1`4Rnd>pAE0Px z_Of^}`7`VE1tv$4owS_)tG%xbi?WN_#YB;K6;MLpRg~^-R6^UUk|JJ&hqI`RGB&oHx}{p`K=TKBqF>;#g5j?X~@ zOrqsF%zEeApL->wsj#WJ0oumMz)&|EOX!nM&fA@-)9;O#6mIjW!1otp{zw~Z{1#vjEpT+-}Yon30pYy9b#U z+I3u@ChdK5k}}41p+VVg(+=XdmFz4!l@MttAL}U-Wk95qu`WnrRne5w3c;QAQ0x>g7-4{wvR8{fec)Lse z$&9N#v!gR|lz?G714tNq^>3wUNP87OZ%RCCKLyL6CIuEng5AICjZrMjLvhl{JovIv znrPR!dRq->8LgR{P9AYl-_QRPPLl z1;0r4@%@luuv*|!l)@(J>B(&7Vov7SaaL`ebe+{D9aUfoap90x!h2$t_Gok_3M}ls z&nd2ARkdgs#NMr`41?Jwq@o^uXg&wKQ|B$)w{jBfH3}~^ug=Z1*Aj4Nj5pf)vNPHR z`}XTakF@%_?JqCFrx zEgmACwnxYWXTwA%QZ-?rR)|tZZWUNlcwqXZeQ1?v0xHGZk^}8y|v%IHN1xPh@ZRs z)M*5LfS^`+;O z%i?=ZCH>X^tZ|En8N2~UK;Ig&%wB0vaB*_-ia&G`CKeH$7jNgbzc64;5LYHI?2nNf zJX}a2na?E>*>0rdNnGMf@PGWyz3mru@Y_;9{q*io_Ok6p*y_~f*$Sso|6BWd@Eh=U z5v*oMh3w9-Eu{q1qFyt*vcKB&+Z{AZ7Xm9?k*Ich&{?(s#!%vj|IjH}nP_ zU4l4R%)sYTxTqU4BV&h_ZS6(E&F5o|IwU7`EbQuo_(7VAAq?(3KUfxEjBgW+KDiGE z?*C{Ep-f3mzIQe@HdZS0B#^nAm2rZX7}90N^2QdGmN`(fxc5XGp0C;Z5MRl8Q<&Hh zXN`(?pSsbY3jfJz)P@d%Hjnu4qtlR)og*Nq_QIeS7BU#RZuzN85oAO&yuQOZ=)Nwq zm}{#ZV(ebh|B2HNmaP*_mszV|;6&ZJ)g|ssg?`*_8aD%apr3jl&*;_u`R`^6nEemp zKz~odPRTeh*dIvw?V#0AIc0b~U`%BVFZZknX@U?iX1+Pm!&bW2aWY%aGNVeh+IO4X zJfo{7A$24**HOemciwgaec6r*lYWu}-M4O_09-)oN^fFfQfS(mOn?K7Y(d9FSMPfk z^q}`@RDi0EV#rkUBKV9fWqM&nMMcNwRH){Q;xlcZ9E=5oEAe=(mh(GsK(uE&Zy1>2 z@hY`Iqx;~QLH&E$%$ATs)`)KK;G;H+m7s+h98v{PYjU^`3C|nz3U_VnDWC806ddBN zxQ)f>U@h(#DIj@Cgo7kI%5P-Oa0Q;9Z`&3p__!@DiATJ z=UxgmbjX6DU~1v20==cMf#Q5-Oz>2iG;=l3jrt!nXBAWie$rZ*d0sgt_3S){zo2L> zn%kpwQ8(df4CHiDXnS+-pac16p`D2~rIJF=c?VW%itjS2PEyCcU|@2C(dZH6qv-WK z`YC=;4N=gB*vunrxd`TsyEm`<+cEa?&$u|%wbXsKG>0LgN~dqV`-(Cd3&E;j4HUtm zl6>=Fbc5T5WXheaWJKTH>~|G$R_C-Dn^KB&QU3L0#=DhBeoP^1k z?lKO4D-9M}-32XBoSd4RMupS$>6n&?DS=_KCJ%=13|+^EWt9|8R1t|@LgxFlb7UrBLL#yS4W!>|BvbZ8bnzgsAaIH# zrO&1Xy6rn8+bgkJk)ls3v=z=*TwwQ&$VzdctXqm9(N?o=_rF~oUmTNq!T4HBWox=# zn0;qYm#6M1ch>~p)0*t;XVQ+_&L&knHciuL8Zw7x94U$TdEooEG`!-w@`8y&=E)9& zD+_uORG+Y5#$8tgEJD&crk_=)&gbEq;1okZ*P}4*6uN$mfjJJv$`l#KOEK;g(sryl z&(Rqxbi5oijlEIxdoN)y*u{oN_=~BreZ|*V)z@-396Cs{pK~d^GF69&8rQcq4IYz{a|6=<`8rA9)Ve8@u@MuJ1k}ixCuI@gXgDbhLh~ ze-bpgM~W=Dj5*gx&QqPy+&dm&yUh=4ph9hnb9^V8$sT|c5Mdk`DW^k5&BOb`*sLY4 z7-@X1NZpG<63U&<52rI%-kud;O&T1O?7kDNAN!y%gS!H#GYMHCj8!neYblG&nUM^! zBI(Dw+5aIn^AuTj+$`G1;DQPh5Bn8gqD;NAeN~-&kgfqULCkwcs-hMLqjaH{e0BbA zysGhc$Q6Z4=CAZ`!3(`)#Y&tQ9zVA9hlu7H1P>!)}5%v$rWG&w}OEvBbz(~#a zEdn|xFuh%mB}2Q0N?(_R6`Xt3sn|I5JlHClWqL2Mqb0+Gs$#WGkRc^4L=Z>h+ab=w z?r(yOK3@~HU{bqFG%LhtvOub)1}#)mkd9VihveKFR*349pEprZ?2!?XPclgN`Xplg zq^(1QoZkOcL<03bg(fT+_9}%^DXLRpwb^XHaL}{rYC<3O-FFi*L5Qt{9!fc5ZqF}Z zZtVvQNAwoiO7wr?c-nR&t_*Lxj)IO8UrIS}-;52}i;e>+S~G|12PNI%ZZ{zK%t4Y# z5-vu_Do8M;*rGh^3P&2R)$1-1q2{Y0U*Kgqjjsdx|Q|KTz+# z=kF*yObJ}OqcuS>wk4^nuco3mofU)$x{(SU2Lt>S zob~5Neni?_Gfi7(%3We&;`T)GL>OSR0Sa4EU5TPWh}UdIRmvr`Qbov}xgo{^n!d=5 zJ|FQ=O9ly}u+*EUsLGX5n~EFqd{q@qCdq#msO~q21vO9<5rijH)pkUZRzQ93&!W=| z>3T$QwHiB&Q0hF{lP>x{?Sv1m1NdbzxI_?ksm{nttFQXa1xxzAw&#V3u+S?M{=G`p z+QBCyE?PBQ^~A*tShOtxqV>>B`nk}cPdtHvl>b?lC9!BP(Py^WXB3zvaGQl<_bGZc zrpAok^eU|;sM#jIp0vF5q3K}gqP|N^o1T$GdBDjt{T4b(r*bf-r_J00AGQ-;Ty5d6 z(i}Qz5CKc~)^O7)v?V~B_r#T|5UfPx*z?rAA(k+sICWq0$jt%51CsjsBLyZcgbd10 z3zAQg)su_he?LMlxAvokcD3ScB93&=YP`Ogu&d?WkRCiOS_yj$(!ZhXzOidomvcuL zbgl}fY{$Bak&0igy{ft3A%#z%-RH@LaXZIkL!;T<+;O{mq(1|8>C4u8eL|n;#Z$XdfoHFfR{p$CMvv#7f4{8WyKFlU{kjNg zQf`N{mi?GCuVxkF27%6&dv#S?it1CxEpFd5 z>3HdP=8)TkXY1^EFuW-hAyXD}U-kw6c7`Cv#@|(c#lROK{7=nXf9SgjM5d5D zncBJ%Fc2pB4l=1Z4#-V)wu#EwQZ5oCI5`3JAY;LO3HN?m}%Ill2X%WJgVqSM&14e#k=uV`QY1K|I+)DO}rG(GUU_Rff zLRDyrXR<8qE6$wf)4EY)5|140nNprptb90!VbWhfS9avy7LTNxH&G|D7rxsqMnup? zJ(PxH^PTAYnZQj{hTSu{sfYxZl3q}maK@b}hK1wC`3k0Y5W)y^skD0ksmpT{?VLZi zQkHNzW$hi!u;~2LC^?v4j7l@FH|nMv^;>D6_SxcXw28qRK~OlUdWC<#L&rOv;=}U{ zTQ9`?_e59&ZN9u=K*yZEFJdhn!J;*Uz_oYW5QSTHp42j0ai~ETG~gAj*|7Sn_FsJ_ z1hcx@`V3}wxYmHnmGdzWWL7tN*MM|LWh5$F=gef5{Wg7l9-4Qd$*#S8U4XwOD@Aa) z@MP;}m}{}zDeu2!4NB%()#h@%-5~J=yK!Lt_Knkc3#AK+zDk12p9K};d=dVCAw+KG zf#FXD%Yzt8?C1S>t{xQnnt#=I|2c2xScc?J_vN@(27LZ42J~Np|4;BR|1VhcXxaVo za{I^f@}J`b?KN|>Io)@b7Zw(PGR%OwYgs2;2EOZ2Ks0_ta6>SO;^2fTac=G{paNS$ zLPDJjsF|5>jm2hLBu=A=q&G{J9 z!-G9mR#uSusEiY z*gKu6zQLTnAs91eVeAY^xZj;buEhOsger|zeD)mM<@7{Jezr+t%UasM&kZ0eK-Sh* z$j=mbTvBuH2P^L=Jr91^+~!mvmP6i7_PA@(VlH%eqAmEfCa#HuSvT5r=x|XoMyI&i zKsgh|d&=l9+dYzv0cs=@&R!z-tFMa6k7VJIPE_w( z?mFJk2a=Dk)YZCqXi(5~74ahN+9c(Br|?^SM2=0^A5?u~h7Z^eJyJ>Oq|{X4?l^va ztr=3M)e*tyrNa=frO^y>xA%QcsVun<6oS{;lBK!hE)-W%`jh@+5t#JCq~SGPrGSJx zsrBsrJAYqscX#(s8vAIpq@jyOUXX=_L&-96%D4qd%;fDnslKTDAUCqf!c$r*#a zvQ^CduVq^l>D|?8eb)Gd>`fh>=!ozq%~tlw#mHTN9F$wsNS`md`eQ7Xl9;@1~E zlzC%x6_mX4q0`~?8{cCm=qom|SWe7Xs}J{z zFMZWG@k!V3GDA(yty$Qdf2f<1)Aj>~*&Lr+;x&W{%>IQCClL$_1%E$_XF-r!N1J8b zK+|iVyMI~vw9kjdSA`rH6esHgiIdOai2q2&0o1_vqKq1V>^b}kmGoal7yrA8E`ZJW zuL8P1Vd;NjSrRgfvCSWwXu!NFIx}Rgm!_S;VCsy%|-6MkjT`)sSw=efJ# z%;~)T-W3^OY@8E5zacy|YpjsMtdmFolpB26DDwPV;)_|=dBe*gGRe0J^hCG2(dP9MQJX z7W-j2J@>L-Yf-x-kmg-5>5(%bscgGXL-tQkv(B2jl|gl*Uv+58Os_8FlpfK_EuNdn zFKRannU!K~b$l-=2uVnhkd zoWt{L>SXvJc75H(-rinH>WmCFkeJ?V0n`sOF*OBRsc06x72y>u3bc8pR@aj3Y%sTt z`aEmU>7gzbb&pG%fL&RYSn<;^s1u*>e3h7JtLhrN8v5iurNc7@S@H8}V~3=j8YJPu z*)96Lcu}of5gL@)Xa$G}gha?wlXY7#G+VwlOVTG>mg$T9r!n!M<4eDBV^0dkV0W(dY0$DtoW6$(PiEp@b3C#M@Prr)_hZaJracqQuPCh z)hp4bZ*hW&D)w(JCz|x=@bHe2#`P}rL2|&G%-d+>eXQEo+(=-fuGBCc(#orob~WFN zdMk86l$>pnrLTo0qG06ov_PyNa20!z`_rVvP#e-+YN_$g?&Km?p4pg(vYUmd7=x$z z(M}{f~6z}mzB(=Bwo>|QV$*m%u_xU)Nj zvXY(zDY$a*hP+`=PH&MyMr)PDlzGmCIvvTAJg@2rbS3&x@&s7zewYF6Hajyju`9vI zAucX%KU6O&JiMp7yRL=4(PV0MVK%&&WI?X@WOh4~9lKjkS@@7(dS#<Qqd+v$pt7&u2--oVf@R^N@lz-M>HZ&Ps;I8QBfwSBoYO!DLTm z-QbE#U+{ZbQKadMTW2B=wC(AFken8eRlL^e;tkQ)A$r(!gnAu~Fc!1t_i>>* zQQU55csLXCQT{Zya(ZUP`yP!~YIB7`3XYCy!#4Ul(;q45O*Kx|jl^^o5ki|RdGV;_ zdN)LRDKr;ihN1aGT^$Wgs*=nGxJuI%s06kngpvSMwmN6?rbSobjnr!lH|Tsm%pS|V z3*8naym_WdQf*dt>C&q z$bkp0TOXYoV5`AEHz&UfSNQn&z9foV=Z}er0lLW;>F6+S5>MF~I;#shma1E8SoA4` z^PcIscZ2jnA5VAi9G^E{HYdwnwTx`uoY3}k9sd$lI1{EPIn&)wcWM#3lp9;ekreP0 z@x3S=NJ|GE`!l7q9?_j{{P5xKph*}D&?Dl~V*CA}MXB2wf+j-QpgJL2xFdut#vhGm zV5ryNRyL#(Vox1%htftb#EAq`6tfXm=0?e6AUaB?oQ+JW)LnGXi!+17)(OCdMY{36 zQAA&wOa1CxtzD46BdVJrZ4kYar7*&!c+J$j-5^|$M>faS4AN{6S)HAqFJ0%Ud%* zH(}=;-k57i(JK2nU0vz!Rm_bZXlQ2PbUu+-F{TFX@?!O$~ zEdkxd(PRFrhPHd z#inbtY@1g%m+f~@r>@6g3o{3O4?Ze4hkhjJlutydBgVU;>C#)hPQ6<^MI6BPEG|-D zC%)qDVx;qcwWbl`O*JdZC6v}LzWK^~N}~IPEdBHMO0Hpy@6Py}rM0_HA=wpUBdH}k z?-z8KWL(>6?Tp@|&UBZ>Cd-R;Iv0KUX+wO1l@U&vc+0lnYs-7sfs5tWVh~#iVwir5 z^AzZ<#tuC=xAL_Y$eqX5R*$L(*|{M-HL)2Ncs)yKdW7znNP$0ShPL!J6+0Fi?iNcg zC9&FEpAFMJ3|>*ArC%m8Xm)mdcBXMJ2le%Ug)O3X_k|G2b zewx#o_0fdGC;5>~PvFj0&C<4-?j)$;$iRqeA?FRT8UjSCWk8-7jzHv+{f*(5hxxR2 z5^+a8L9+@DN*Xstc zH0)Sa~Vn=mUM6)MN1ZdXuB0Ip+_D1R;Xw&mqd$~3uK#S0ui!tbb6aVG}L0{ z#aMCz@?@oW0L4H#{4alR#L{~H{zO2fu8vJnlx}tz^zw>kV5}#)$H~!s?;7M_Il8h0 z)P5c(6+FTGbq5xaMk!A<^;Mp!)O7n@nDpkhOp>B2cu%x3bG?nl zr1E-R)MI<0swJPihI60H4&QZ5=#UA3Quv2AyDT7>&w97nd4@is>=Jj9w0dreu1c51 zD(5co%tbcfxgY&%C^izj-g8nr$&*kTbj9v^dR>Ml9^i{ zY)ixuc6f(M)%|O$839yfYOsSe1&}aLW&0~nxA)QxCfM0iyq1CGDZNBbsmlXtwk&Yx2K z@&(e;&51N-5JTe7a@lG|`-+R?_UTi?#ddgGC;HIwR9oJp1xp^a&g~^KT(xts991M~ zbN}T?3*tG^951saiIo7M5&MXXljNhCHJ&*neJl~07bF@-I1W2#&f~m1^r<`ApkY~b z{}5Skw&M;7ql31#vku}x9jl%u0cn)zS^m)lro-`w9M*2*-o^JCwidHtLl~J#V`eGv zSuRzj)zwh*PEt=reqF+Ln6Z^Kl9f`ig=G3fx}{rF68mIr-`4u-t$=a9@?Nqz`e&aW zeB3Sg@HUSZ$K|*fThd{cI6xT&&~}X?vmif5MUs`L+fwJvBk)z^r9`F80-@Ce^ zhw**gbK@g9%ihEc^H-E)bdmool0Wk;@iAKIct~}rKLpLDp})ag*kbDS$kIlGH-Q!z zWy;({kk0;~yjYJzsN-TyMczzN1h}a0VxI$ZM5ggQeRx=y-YIY6a->`3 zo?}j3@Q!~~{5Ddm4_j9I1atNJvwfSzZlBXg!nwYZ0m}X0^%L ze0=q=BgigwHmuTNFfh?QI#b+;S*%-OP#vv};I*dw$qde;^7hm<@;f>n7{o{??du;|+u?wkKN`-!@I zMBDq&mi%h=+X>HOaVAuBVC}D-NT8d(Do*F~2<)7coG|Y*ao4U48Sqd^$tzdB#rt>0 z3>|7pp`PbwUCYklP)E(8uYTf71us7z`KJ}>dgUe1Vw8+TDUsV@U(ov1VQDZDTedhn zZgT-gMCeFCD!w@!uXabRl#bVcv15y!D=RAip_X$pF6?N4sGV3KCFs7=sgA6?XnO1q|<*{Xlew|zUWEx(G;4}uxmB@uq!t(s4O(l&h91} z?v83(tkwDS#SGj<11;$EOuuYXYd!)y3^an&+Dv?XXax7Nq~b-(O>@Gxwl<(Ff>ju^ z74k%|i!1!RNuj&Ky*Cj?hwFn(KG>5)`0pA2HrCEgUl(ZmV9(xCTnOEN-$RmO+yl){ zv=9SihS~4JQ8WWLUsEPWi-jS94ofAUzo?T~;)5}46uZ%lSvVML2;Q6DUxW8Afa}-L zN}qPGl_VT0t=~+zi~v*p@_zI{Mxd-6)*6m+(nrF%pGR2{Z`q&EgJO)&6{gHje8Aj#NzC{34$aeju3(L0-tio{ArLHn~Va+Ntk-ii6GiW)l6j&XbSYxput`T-DYw zv`>}`rq|r<=Z(0gJs^C|`JfP-tg?5PfL%oj=z93EC*+aIr3c2uk|(#85`plG1(Ig^X^!x6lY--<7N38rr-J z*^zL8B_SgG$hinjEYU%K@sp4Gt4bQ0G+_&H2C6>Pde~$D>s--J7Eg}Ioa3wC#oM_1 zi*(mu7U64*d)hVpE*;pFDF2}(KaG(08o}8q5lpb!(|#8u~b3_{t#NRTJ*&F z4TTXlWLQAN9A|lCv-l&6My(_nuN*SxEu(#rCZ;UbJam&i)gLd%175nKbl-!91IU)v zzWKYfrDB6_qs0@BlnY?Iv4FcK!25~pn+0J%i@>@Z?ZieQ;PK>{9JegL9FHH0@fTI{ zL*xIdh<@n8)c+dr3&{N28lnae*zVZJVBL+WMl_9&C89J#A*`IfZDLN!GwL%Yth9>s zZVk!g#f0j;N3A&CY6V}8wLdb9>PXbqK6&k69Zpnv)=hpOLtrUnkgJamUJ{Ebpx45b zYlsDQC~@G_IJMfx?HLq-9pr{n0pD-P(EotKgznZOuro_1aKew9uz5Lb@$KR{C4P3d z;d{4D-l@x0WH&D;M=vN^FK+g&@Hr1x3{p_J8x0DpQ}DZ+JQm3$i*RSQ}vL*lw85Wg=K#iq!GkFHtgI598`TF@g7+txZGb%A{+$Q(t<0 zc(>6!B=Us?)bE;>j$~rV8@)P9wgyA8Ld#Lr!WEC3BKP7|g8G8FUr8+8RVJ)wswsCe zg9hhy^QFvor}K@4Fg2_{tsjgS&c7GuzgxD(K^hC8AqS-xGU85`Viz=&Gny3GGnY}LXJwDlKWgE?f9~I%xxVi5;MY9ulL2&sPyi?Sz`4+r`Ne?93HD1VXH=rqtAR?ED~705LqJL z$B*Ct30ku?unW5;j%gpq9!}?KUPuLXZY+gix4PGavM;C3(qmW*0xrwGx@jq;miW1z zdig7I{bk~DbeO1T*y*sPObjyutj#0Rql>mC2ohTkIWj}Pe)9$flylhI1U4^7EXD2` z%VB4m&=DT#?>P0-kvpok7pqJ4d>t^mYI@Fw-4vJ4kMl1$C5w+%eXd#@7-UUu*xaKh z*8+7vb%us<|6zvJQn8UC?qxgX<)K9#rLh%v?3W2p{?5#dJj4$DTb`N zW)dV{z;2h3t3DA%Y1~Dl2FF_AAkS}z{MXt3iwQGZo^m8=VMY5tTfS7p$JPbb{?NEr zk{?&J*xn10h@+QA+1)WI^gvMwgKS0KGiW&HtjQGAZ!9Zu-~Qr2i|82TUIzH=vtKc% z2il0JlJ=Gyq{#2N2No$_Iw-&QNTKha`M}N&*-clGKw9STn^SloVNkw!B{MKs822Aw zI;9(Yu0=KTgw|6l&=Z9f`_4*tE5lSU9Hy7dTO92*O*eOC`&>-X|EaP*T(P=jEx0JRqv z^9cX=!Pp)AIiDYV(mmk2_gjuT|G!|~pT_Y70_du~1mBzR4GY@Mle>Tub>wsWc&GbuQo&-oWm80z zML0H}j!#cm45P>FO)%khvP|sv2l;?LY@fFAJpKdVefpm*ou5D-H{Af@f}QUtuHDW* z1_JGv=)j(U2KgpVehQ=mRr*`kwxTMlXHIJN|}hgwgBq3Du>W0r2uqPKCA%k zG*n<&T&A3F7T8XIa0#;P4jMnW!9KPS{AqEE7gdpfV{`HN(zq8SV%WP{Q!<6k^X#Nl z-i#Vdp1)F;z7!L&t>2PVNgKN6y~bifQ!AyjIe2x+GGstt<@#mT!@Wp3`MRYRL;{_> z;qdCq00X7(g8oCWcES&XC<+qh1lK=G-!hz8MtHYmg1Q&<$5Qyk!U!1y?Z=f5wbJLF zlJK>56<5>rWdw*NS}To13;A72-g$C?S^`bBk|DYF_s^Gx1;0$@DS80YrqX`cPzR&` z?%n@tri#;gb&E)DAmF5_!_7jPpkh(Y%h4ZM7y7OGhHL_74ic-&Urh(+-V&VHgD_Zb ze=aU;)2}))>zPID>74j3&51QzN=|RCL!GrI3>; zq)%zk$>bUTI%6&xH$A49Pd_;!-I$FHx9VIotK!nWT22kWP;R(xsnwKG87JLpftk5G zweG{uFH3gHMQ4#NEh~hs1KX#+`KLcl)fx)|9!U=}i1D^iBa*l&;@5ngqcYTeKqUL*gWMClg_R*YTabiy&%Fo*z6EU0as+%?c_H% z{)eC9T!UOY^@@=bM!+AMfn)3_%Mh!Zp(`J4&0qhrBL)La#$O6g4e8sq69B^@{EwyK->9ysT9*=lF^t zYYBmbR#e99W*B~mUvme)b%LMYi-tv9(Z9V+AAEawiJu>$d?~8fTtz~KYIsWpasKFy z>ePq1$&>S3?a&y7jC5hb(Rf>ryAK~DvWqz@$xrS7%ZhqntLXCfgENh8a_FV$z{L)8 z$U~7f18OJH6TfRzVKwxX;-v0`u{3OCP)T27LV&Cg-qBO0sX>`|QOt7-UaQ?nP2BA9 zhkl*>3x0C*3gm-xeJUDPd54<#jQ2TqKytg6;ZSaI)PujB5m6m9?)vHf$$ChT4+FNR z;lmXmJ_1GX2Gj zm{yAKC%(49oSjhZ+K}iHPw@UWmESB!`CFto?;@7s-PFBtwYqJR1_KREkA2(VT&PKu z%97jGxn(Yu=57a0{}){X{^ux3hZbLRwR*Bo>^Hr+I&?|q8>8}@4V&Wvgml|Of7*J9 zD1xigWFZURCaBz^6=CTTkKTkVEne6Tk&0eTxUPuuJ%~(%iaPC@NI+pD{(H?@C6fOC z!A##JVo-hMrH`g!p1NOSfLfJhH~Kxa#E+eevISM{J=h9=k1F!($!Ngcp!776dvp|w zx{IFo4P!q1X_I3w$YNR1Y~0qMK--Gw#!8E;G)*D8u5V@HiwmsuEEl`{VcYd9?v|Xc zMe+uaMa|myBl5%j))zL@h3m+s>UUTl7B$u(1R4>hH@Wn9L&K(}Ej@dC9f!*XX5kd$ z#8*~}%?&#B(qO6vo;+9o{hc4VvQ>!fdL-k#x^m4$lt2k;a4VN)!r??rdS$zvCv@RGN-Q6 zZDEmDiZRmRi`vkT+*6G+r8Jm?m3)i3%?B~QM5LwlqrcNZrm^DtxYT|}+x92l^DXf8 zE7=2_kNLr?6Y{?gG&ca?i+_Hf=#R+Y->}y&6z{Ka>j${}VRQd`!QB5t119{70lRH2 zE4?q|Pt0LXYOCoFewd%`2H>T#ll<(fdk@1)?--qkMi-akR<2b;+$MN%ZvEyG1Ay86 zS)x$QJn~Y#F7HmN$bCGv`f6@Rd90BuGoh0>N29n61FhgyxMs8p9B^!zV65@&~WuKJNH;r$U0Zi_vXTIncg zSK@RZTpm!PFV@Wvh-P#Q&ZsnNu+AX1u-(&`@R-3F_US2f2$&nz8>BL2?SHLTSG@C7 zvFqW0NpMDLlSQH!t7fbd&>rEhKS4G^9}IbvctpsMF9J9GnkHpU1%&2|7Oh z0*hRy;P^gEDpveq+$u727y95 zE2k@L^Ne(d?kX_Fm$bFu;H=giU;7|MEHueO=p~Fx&Eie$_@cdVNrTBES*{+mN_}fE z%sFR!z|4G6u4r|05W2Lpap9af&4toX&NQV{f3OBo@rO{<;H1%~Px6_p-J!)4G#4qS zxg3N0p_+tY@d2TOMn7z)sHwWu`#fVBnm(!s4l*1YrQ^HJnYI%^-op4x^zfOVjUk&_Winau=7(qepDZ9EV=vIUduODb8Mi})+AL~PN|tu> zw|z8$20y>iMxpTS>{lQCQp)>G!|T;sM1}UK`|SjDdsl0MV$!uS3a-z}%FKkb%x}i2 z$q%jecv!|I^2h`v+&6c8tdn)vBjN1Hn~lC;%*?#+G(J=s6o!ja_M6uN95V4Niq_Sr zPgm3|?$gGfz{!(2{&EHm=>EjQG3L@-g=+x)l4o%A?>H_D5G(Nlu7Lt*dk>&AW2ry) zOO$S_U0jbQ@5GT|HLyYVkAE!dZ^!hfzXZZY18heg6A;hC?oJbZLgyM*qk$~cH8_@y z6&U2z0{i$W57el$&{+ZDBQ45?;RgerzvI^!&1r;DGJNI`wKgvIKIW=97gtmXYZ!rRgof=QBeA|L3HMK72;ZqjPl)Tm!y0W+-J3VRF+8!vsbCDsBNDrsUQu0* z*%`Ku0(0+XKm6PW;3Sm_04He%T`o$`YFV~eR_`-!3GWlLP;Y+Or(aqu%Zj?2L9~Qo zI9L>*{6i#fqpw_A1tQk0jCut%XFd0n7{S2#`f~0zXM+gkvQG>}7Z#ndB33I7TewcQ zRZ(OFT~4i56LSvZ$Tbb2!JI~kSc~sK`mVem{Dwz=2F1<0;BMH%>Us>iaOX}lYR>>X z(fP+YV(b>rvprhKcqR-M`0+%~4ddfnO;h{Ni1H6t^gkamJH)JkvEtWW+^c_=o%{An PYM_jiq9p9j{ipv8RIB$q literal 0 HcmV?d00001 diff --git a/tools/polly/docs/spelling.txt b/tools/polly/docs/spelling.txt new file mode 100644 index 0000000..091063d --- /dev/null +++ b/tools/polly/docs/spelling.txt @@ -0,0 +1,54 @@ +AppVeyor +CGold +CMake +CPack +CTest +Config +Cygwin +Dereferenced +Dereferencing +Executables +GCC +GTest +IDE +IDEs +Listfile +Makefile +Makefiles +NMake +OSX +Screenshot +Stackoverflow +Subdirectories +Subdirectory +Toolchain +Uncheck +Uninstall +Unrelocatable +Wikipedia +Workflow +Xcode +autotools +bijective +boolean +breakpoint +checkbox +configs +dereferenced +dereferencing +executables +globbing +hacky +hunterization +iOS +listfile +listfiles +multi +namespace +showstopper +subproject +toolchain +toolchains +wiki +workarounded +workflow diff --git a/tools/polly/docs/toolchains.rst b/tools/polly/docs/toolchains.rst new file mode 100644 index 0000000..7b9e858 --- /dev/null +++ b/tools/polly/docs/toolchains.rst @@ -0,0 +1,15 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +Toolchains +========== + +.. toctree:: + :maxdepth: 1 + + /toolchains/android + /toolchains/ios + /toolchains/gcc-musl + /toolchains/clang-omp + /toolchains/linux-mingw-w64 + /toolchains/raspberry-pi diff --git a/tools/polly/docs/toolchains/android.rst b/tools/polly/docs/toolchains/android.rst new file mode 100644 index 0000000..ab20a26 --- /dev/null +++ b/tools/polly/docs/toolchains/android.rst @@ -0,0 +1,57 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + vc + ndk + api + +Android +------- + +.. seealso:: + + * `Android history by API level `__ + * `Android ABI management `__ + +android-ndk-X-api-Y-* +===================== + +Android toolchain. + +* Name: ``Android NDK X / API Y / ... / c++11 support`` +* Add ``CMAKE_CXX_FLAGS``: ``-std=c++11`` + +.. note:: + + * Minimum version of CMake is 3.7.1 + * `v0.10.2 `__ + is the latest release which do support version of CMake less than 3.7.1 + (based on `taka-no-me`_ toolchain) + +.. toctree:: + :maxdepth: 1 + + /toolchains/android/old + +.. _taka-no-me: https://github.com/taka-no-me/android-cmake + +android-vc-ndk-X-api-Y-* +======================== + +Android toolchains for Visual Studio 14 2015 IDE. + +.. admonition:: CGold + + * You have to install `additional tools`_ before using this toolchain + +.. _additional tools: http://cgold.readthedocs.io/en/latest/platforms/android/windows.html + +* Name: ``Android NDK X / API Y / ... / c++11 support`` +* Add ``CMAKE_CXX_FLAGS``: ``-std=c++11`` + +.. toctree:: + :maxdepth: 1 + + /toolchains/android/developer-notes diff --git a/tools/polly/docs/toolchains/android/developer-notes.rst b/tools/polly/docs/toolchains/android/developer-notes.rst new file mode 100644 index 0000000..8269b01 --- /dev/null +++ b/tools/polly/docs/toolchains/android/developer-notes.rst @@ -0,0 +1,48 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + thru + +Developer notes +=============== + +Visual Studio controlling variables: + +* `CMAKE_VC_MDD_ANDROID_API_LEVEL `__ +* `CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET `__ +* `CMAKE_VC_MDD_ANDROID_USE_OF_STL `__ + +Provide Information: + +* `VC_MDD `__ +* `VC_MDD_ANDROID `__ +* `VC_MDD_ANDROID_VERSION `__ + +Mapping: + ++---------------------------------------+--------------------------------------------+ +| `Polly`_ | `VCMDDAndroid`_ | ++=======================================+============================================+ +| ANDROID_NDK_VERSION | Always set to ``r10e`` [1]_. | +| | Used to verify ANDROID_NDK [2]_ | ++---------------------------------------+--------------------------------------------+ +| ANDROID_NATIVE_API_LEVEL | Used to set CMAKE_VC_MDD_ANDROID_API_LEVEL | ++---------------------------------------+--------------------------------------------+ +| ANDROID_ABI | Used to set ANDROID_ARCH_NAME [3]_ | ++---------------------------------------+--------------------------------------------+ +| CMAKE_VC_MDD_ANDROID_PLATFORM_TOOLSET | Used as is | ++---------------------------------------+--------------------------------------------+ + +.. note:: + + * CMAKE_VC_MDD_ANDROID_USE_OF_STL set by default to ``gnustl_static`` + +.. _Polly: https://github.com/ruslo/polly +.. _VCMDDAndroid: https://github.com/Microsoft/CMake/tree/feature/VCMDDAndroid + +.. [1] From `comments `__: + "This is not exposed thru CMake". +.. [2] NDK dir taken from [HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\VisualStudio\\14.0_Config\\Setup\\vs\\SecondaryInstall\\AndroidNDK64\\NDK_HOME] +.. [3] ANDROID_ARCH_NAME used to set ANDROID_TOOLCHAIN_NAME and ANDROID_TOOLCHAIN_MACHINE_NAME diff --git a/tools/polly/docs/toolchains/android/old.rst b/tools/polly/docs/toolchains/android/old.rst new file mode 100644 index 0000000..5396faa --- /dev/null +++ b/tools/polly/docs/toolchains/android/old.rst @@ -0,0 +1,59 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + taka + +Migration to CMake 3.7.1+ +------------------------- + +Here is the table for migrating from toolchain based on `taka-no-me`_ project to +CMake 3.7.1+: + ++---------------------------------+-------------------------------------------+ +| taka-no-me | CMake 3.7.1+ | ++=================================+===========================================+ +| ANDROID_NATIVE_API_LEVEL | `CMAKE_SYSTEM_VERSION`_ | ++---------------------------------+-------------------------------------------+ +| ANDROID_NDK | `CMAKE_ANDROID_NDK`_ | ++---------------------------------+-------------------------------------------+ +| ANDROID_STL | `CMAKE_ANDROID_STL_TYPE`_ | ++---------------------------------+-------------------------------------------+ +| ANDROID_NDK_ABI_NAME | `CMAKE_ANDROID_ARCH_ABI`_ | ++---------------------------------+-------------------------------------------+ +| ANDROID_ARCH_NAME | `CMAKE_ANDROID_ARCH`_ | ++---------------------------------+-------------------------------------------+ +| ANDROID_ABI | `CMAKE_ANDROID_ARCH_ABI`_ [1]_ | ++---------------------------------+-------------------------------------------+ +| ANDROID_TOOLCHAIN_MACHINE_NAME | `CMAKE__ANDROID_TOOLCHAIN_MACHINE`_ | ++---------------------------------+-------------------------------------------+ +| ANDROID_COMPILER_VERSION | `CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION`_ | ++---------------------------------+-------------------------------------------+ +| ANDROID_NDK_HOST_SYSTEM_NAME | `CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG`_ | ++---------------------------------+-------------------------------------------+ + +.. _taka-no-me: https://github.com/taka-no-me/android-cmake +.. _CMAKE_SYSTEM_VERSION: https://cmake.org/cmake/help/latest/variable/CMAKE_SYSTEM_VERSION.html +.. _CMAKE_ANDROID_NDK: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_NDK.html +.. _CMAKE_ANDROID_ARCH_ABI: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_ARCH_ABI.html +.. _CMAKE_ANDROID_ARCH: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_ARCH.html +.. _CMAKE_ANDROID_STL_TYPE: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_STL_TYPE.html +.. _CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE: https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE.html +.. _CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION.html + + +.. [1] Additionally `CMAKE_ANDROID_ARM_MODE`_ and `CMAKE_ANDROID_ARM_NEON`_ + should be used for obtaining more accurate information about ABI + +.. note:: + + ``ANDROID_TOOLCHAIN_NAME`` has no analogy in CMake 3.7+. + Closest is `CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE`_ with `CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION`_. + +.. _CMAKE_ANDROID_ARM_MODE: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_ARM_MODE.html +.. _CMAKE_ANDROID_ARM_NEON: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_ARM_NEON.html + +.. _CMAKE__ANDROID_TOOLCHAIN_MACHINE: https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_ANDROID_TOOLCHAIN_MACHINE.html +.. _CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION.html +.. _CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG: https://cmake.org/cmake/help/latest/variable/CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG.html diff --git a/tools/polly/docs/toolchains/clang-omp.rst b/tools/polly/docs/toolchains/clang-omp.rst new file mode 100644 index 0000000..965e764 --- /dev/null +++ b/tools/polly/docs/toolchains/clang-omp.rst @@ -0,0 +1,32 @@ +.. Copyright (c) 2017, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + omp + +clang-omp +--------- + +Download Clang from (tested with Clang 4.0): + +* http://releases.llvm.org/ + +Save directory with Clang in environment variable ``CLANG_OMP_ROOT``. +Verify path: + +.. code-block:: none + + > ls ${CLANG_OMP_ROOT}/bin/clang++ + /.../clang-4.0.0/bin/clang++ + +Runtime +======= + +To run executable you should provide a path to shared OpenMP library. + +Modify ``DYLD_LIBRARY_PATH`` on OSX: + +.. code-block:: none + + > export DYLD_LIBRARY_PATH=${CLANG_OMP_ROOT}/lib:${DYLD_LIBRARY_PATH} diff --git a/tools/polly/docs/toolchains/gcc-musl.rst b/tools/polly/docs/toolchains/gcc-musl.rst new file mode 100644 index 0000000..abed692 --- /dev/null +++ b/tools/polly/docs/toolchains/gcc-musl.rst @@ -0,0 +1,60 @@ +.. Copyright (c) 2017, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + gcc + musl + libc + +gcc-musl +======== + +GCC toolchain with `musl libc `__ instead of +GNU libc. + +You have to build/install GCC and save path to compiler in ``GCC_MUSL_ROOT`` +environment variable. Instructions for Ubuntu are below. + +Install GCC dependencies: + +.. code-block:: none + + > sudo apt-get -y install libgmp-dev libmpfr-dev libmpc-dev + +Download building scripts: + +.. code-block:: none + + > git clone https://github.com/sabotage-linux/musl-cross + > cd musl-cross + [musl-cross]> + +Set installation path by updating ``CC_BASE_PREFIX`` variable: + +.. code-block:: none + + [musl-cross]> vim config.sh + +Run build/install: + +.. code-block:: none + + [musl-cross]> ./build.sh + +Save path to ``GCC_MUSL_ROOT`` variable +(you may want to save it in ``.bashrc``): + +.. code-block:: none + + > export GCC_MUSL_ROOT=/.../x86_64-linux-musl/bin + +Verify path: + +.. code-block:: none + + > "$GCC_MUSL_ROOT/x86_64-linux-musl-gcc" --version + x86_64-linux-musl-gcc (GCC) 5.3.0 + Copyright (C) 2015 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. diff --git a/tools/polly/docs/toolchains/ios.rst b/tools/polly/docs/toolchains/ios.rst new file mode 100644 index 0000000..9c5cf2c --- /dev/null +++ b/tools/polly/docs/toolchains/ios.rst @@ -0,0 +1,155 @@ +.. Copyright (c) 2016-2017, Ruslan Baratov +.. All rights reserved. + +iOS +--- + +.. spelling:: + + ios + multiarch + nocodesign + +ios-X-Y-* +========= + +.. toctree:: + :hidden: + + ios/bundle-id + +.. warning:: + + Please check before you start: + + * Xcode version >= 5.0 + * CMake version >= 3.5 + * Since ``iOS 10.0`` you have to define ``POLLY_IOS_DEVELOPMENT_TEAM`` + variable. See + :doc:`POLLY_IOS_DEVELOPMENT_TEAM ` + for details + * Check :doc:`code signing works ` + +* Name: ``iOS X.Y Universal (iphoneos + iphonesimulator) / c++11 support`` +* Add ``CMAKE_CXX_FLAGS``: ``-std=c++11`` +* Defaults to fix `try_compile `__ command: + + * Set ``MACOSX_BUNDLE_GUI_IDENTIFIER`` to ``com.example`` + * Set ``CMAKE_MACOSX_BUNDLE`` to ``YES`` + * Set ``CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY`` to ``iPhone Developer`` + +* Set ``CMAKE_OSX_SYSROOT`` to ``iphoneos`` +* Set ``IPHONEOS_ARCHS`` to ``armv7;armv7s;arm64`` +* Set ``IPHONESIMULATOR_ARCHS`` to ``i386;x86_64`` +* Set ``XCODE_DEVELOPER_ROOT`` to ``xcode-select -print-path`` (e.g. ``/Applications/Xcode.app/Contents/Developer/``) +* Set ``IPHONESIMULATOR_ROOT``/``IPHONEOS_ROOT`` (e.g. + ``/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer``) +* Set ``IPHONESIMULATOR_SDK_ROOT``/``IPHONEOS_SDK_ROOT`` using ``IPHONE*_ROOT`` and ``IOS_SDK_VERSION`` + (e.g. ``/.../Xcode.app/.../iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/``) + +.. note:: + + * ``build.py --ios-multiarch`` will **build** multi-architecture binary + (apply ``CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO``). + I.e. ``armv7 armv7s arm64`` instead of ``armv7`` only + * ``build.py --ios-combined`` will **install** combined simulator + device + binary (apply ``CMAKE_IOS_INSTALL_COMBINED=YES``). I.e. ``armv7 i386`` instead of ``armv7`` + * ``build.py --ios-multiarch --ios-combined`` will build multiarch binary and + combine device/simulator binaries, i.e. final binary will be + ``i386 armv7 armv7s x86_64 arm64`` + +.. note:: + + * `Keychain unlock note `__ + +.. note:: + + * ``build.py`` script can detect environment variables + ``IOS_X_Y_DEVELOPER_DIR`` to set ``DEVELOPER_DIR`` to appropriate value, + e.g. switching between `7.0` and `7.1`: + + .. code-block:: bash + + export IOS_7_1_DEVELOPER_DIR=/Applications/xcode/5.1.1/Xcode.app/Contents/Developer + export IOS_7_0_DEVELOPER_DIR=/Applications/xcode/5.0.2/Xcode.app/Contents/Developer + +Xcode SDK installed by default: + ++-------+------+-------+-----+ +| Xcode | OS X | OS X | iOS | ++-------+------+-------+-----+ +| 4.6.3 | 10.7 | 10.8 | 6.1 | ++-------+------+-------+-----+ +| 5.0.2 | 10.8 | 10.9 | 7.0 | ++-------+------+-------+-----+ +| 5.1.1 | 10.8 | 10.9 | 7.1 | ++-------+------+-------+-----+ +| 6.0.1 | 10.9 | | 8.0 | ++-------+------+-------+-----+ +| 6.1.1 | 10.9 | 10.10 | 8.1 | ++-------+------+-------+-----+ +| 6.2 | 10.9 | 10.10 | 8.2 | ++-------+------+-------+-----+ +| 6.4 | 10.9 | 10.10 | 8.4 | ++-------+------+-------+-----+ +| 7.0 | 10.11| | 9.0 | ++-------+------+-------+-----+ +| 7.1 | 10.11| | 9.1 | ++-------+------+-------+-----+ +| 7.2 | 10.11| | 9.2 | ++-------+------+-------+-----+ +| 7.2.1 | 10.11| | 9.2 | ++-------+------+-------+-----+ +| 7.3 | 10.11| | 9.3 | ++-------+------+-------+-----+ +| 8.0 | 10.12| |10.0 | ++-------+------+-------+-----+ +| 8.1 | 10.12| |10.1 | ++-------+------+-------+-----+ +| 8.2 | 10.12| |10.2 | ++-------+------+-------+-----+ +| 8.3.1 | 10.12| |10.3 | ++-------+------+-------+-----+ +| 9.0 | 10.13| |11.0 | ++-------+------+-------+-----+ +| 9.1 | 10.13| |11.1 | ++-------+------+-------+-----+ +| 9.2 | 10.13| |11.2 | ++-------+------+-------+-----+ +| 9.3 | 10.13| |11.3 | ++-------+------+-------+-----+ +| 9.4 | 10.13| |11.4 | ++-------+------+-------+-----+ +| 10.0 | 10.14| |12.0 | ++-------+------+-------+-----+ +| 10.1 | 10.14| |12.1 | ++-------+------+-------+-----+ + +ios-X-Y-- +======================= + +* Name: ``iOS X.Y Universal (iphoneos + iphonesimulator) / / / c++11 support`` +* Same as ``ios-*``, but limited to ```` and ```` architectures +* Example: ``ios-9-0-i386-armv7`` + +ios-nocodesign-X-Y +================== + +* Name: ``iOS X.Y Universal (iphoneos + iphonesimulator) / No code sign / c++11 support`` +* Same as ``ios-*``, but without ``CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY`` +* Very helpful in server testing (no need to install developer certificate) + +.. warning:: + + * If you're not using ``polly.py`` script you have to define + ``XCODE_XCCONFIG_FILE`` environment variable with path + to ``$POLLY_ROOT/scripts/NoCodeSign.xcconfig`` file (do not forget ``export``!) + +Errors +====== + +.. toctree:: + :maxdepth: 1 + :glob: + + /toolchains/ios/errors/* diff --git a/tools/polly/docs/toolchains/ios/bundle-id.rst b/tools/polly/docs/toolchains/ios/bundle-id.rst new file mode 100644 index 0000000..0019780 --- /dev/null +++ b/tools/polly/docs/toolchains/ios/bundle-id.rst @@ -0,0 +1,60 @@ +.. Copyright (c) 2017, Ruslan Baratov +.. All rights reserved. + +Bundle ID +--------- + +By default Polly will try to use ``com.example`` bundle ID in iOS projects. +Please follow this steps before you start working with iOS toolchains: + +* Create **native** simple Xcode project without using CMake: start Xcode + and click :menuselection:`File --> New --> Project...`: + + .. image:: screens/01_new_project.png + :align: center + +* Choose some template (e.g. ``Single View App``) and click ``Next``: + + .. image:: screens/02_single_view_app.png + :align: center + +* Fill "Product Name" with any name and set "Organization Identifier" + to ``com.example``, click ``Next``: + + .. image:: screens/03_project_options.png + :align: center + +* Verify that "Automatically manage signing" is checked. + **Set "Bundle Identifier" to "com.example" (!)**: + + .. image:: screens/04_bundle_identifier.png + :align: center + +* If you see this error + + .. code-block:: none + + The app ID "com.example" cannot be registered to your development team. + Change your bundle identifier to a unique string to try again. + + .. image:: screens/bad_bundle_id.png + :align: center + + it means you can't use ``com.example`` as default bundle ID and have + to find and save another one. Try ``com.example.polly`` or any other random + string. Then **save this string** to + :doc:`POLLY_IOS_BUNDLE_IDENTIFIER ` + environment variable so Polly can use it. + +* Run example on real device. By this you will verify that build and signing + is working correctly: + + .. image:: screens/05_run_app.png + :align: center + +.. note:: + + Related issues: + + * https://github.com/ruslo/polly/issues/102 + * https://github.com/ruslo/polly/issues/170 diff --git a/tools/polly/docs/toolchains/ios/errors/polly_ios_bundle_identifier.rst b/tools/polly/docs/toolchains/ios/errors/polly_ios_bundle_identifier.rst new file mode 100644 index 0000000..b52a9aa --- /dev/null +++ b/tools/polly/docs/toolchains/ios/errors/polly_ios_bundle_identifier.rst @@ -0,0 +1,24 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +POLLY_IOS_BUNDLE_IDENTIFIER +=========================== +When using an Apple Enterprise developer account, the ``CMAKE_TRY_COMPILE`` step +can fail with this message + +.. code-block:: none + + No profiles for 'com.example' were found: Xcode couldn't find a + provisioning profile matching 'com.example'. + + +You can bypass this problem by creating a project with a unique bundle +identifier, i.e. ``com..example`` and setting the environment +variable ``POLLY_IOS_BUNDLE_IDENTIFIER``. If the environment variable exists, +Polly will set the corresponding CMake variable ``MACOSX_BUNDLE_GUI_IDENTIFIER`` +, otherwise it is set to ``com.example``. + +.. code-block:: none + + > grep POLLY_IOS_BUNDLE_IDENTIFIER ~/.bashrc + export POLLY_IOS_BUNDLE_IDENTIFIER="com..example" diff --git a/tools/polly/docs/toolchains/ios/errors/polly_ios_development_team.rst b/tools/polly/docs/toolchains/ios/errors/polly_ios_development_team.rst new file mode 100644 index 0000000..dbfae36 --- /dev/null +++ b/tools/polly/docs/toolchains/ios/errors/polly_ios_development_team.rst @@ -0,0 +1,29 @@ +.. Copyright (c) 2016, Ruslan Baratov +.. All rights reserved. + +POLLY_IOS_DEVELOPMENT_TEAM +========================== + +Since ``iOS 10.0`` users have to +`set Team ID explicitly `__ +in CMake code. Polly will set corresponding global Xcode attribute +``CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM`` automatically using value of +environment variable ``POLLY_IOS_DEVELOPMENT_TEAM``. + +You can find your Team ID by visiting this page: + +* https://developer.apple.com/account/#/membership + +.. image:: /screens/ios-team-id.png + :align: center + +Example: + +.. code-block:: none + + > grep POLLY_IOS_DEVELOPMENT_TEAM ~/.bashrc + export POLLY_IOS_DEVELOPMENT_TEAM="KDKA6UJ6WT" + +.. admonition:: Stackoverflow + + * `How can I find my Apple Developer Team ID? `__ diff --git a/tools/polly/docs/toolchains/ios/errors/signing-request-development-team.rst b/tools/polly/docs/toolchains/ios/errors/signing-request-development-team.rst new file mode 100644 index 0000000..66b60e0 --- /dev/null +++ b/tools/polly/docs/toolchains/ios/errors/signing-request-development-team.rst @@ -0,0 +1,21 @@ +.. Copyright (c) 2017, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + xxx + +Signing for "xxx" requires a development team +--------------------------------------------- + +If configure step fails with the error similar to: + +.. code-block:: none + + Signing for "xxxxxx" requires a development team. Select a development + team in the project editor. + +First check that variable +:doc:`POLLY_IOS_DEVELOPMENT_TEAM ` +is set. Second verify that ``com.example`` can be used as a +:doc:`bundle ID `. diff --git a/tools/polly/docs/toolchains/ios/screens/01_new_project.png b/tools/polly/docs/toolchains/ios/screens/01_new_project.png new file mode 100644 index 0000000000000000000000000000000000000000..0a4dc06c97948ebabf51e8df5d8d3bfc3c6a8c35 GIT binary patch literal 65127 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 z zpmP^aZ36Ka)*h=Cf4mbc3F%Cmk99_{y$mLz<3-e%Y~_Kb1FI{Ovm%z2l0E!OK3fgj znFHOyG)z#U4>J(ZL{31+lnn8MBdPEr?MJq#H0la$J* zk^ZVIJm>~ku5kT^*jEitb;l~U85PIot@CP%^)sWH-iFtYvOS3D@|P4^`#a#_V@!|# zrYCGRgXB?S%H#*o{K*FOrT{_bed)86y`EI)%fsO26Naa{>^hUF%M+x6#o4a2-><&l zN>og~A0JV}eRmG4^_!;7+zQc6rW6<==psNv=t8qwz=%VBbT5%q*FJliv?^zDqUsJc zDlbn7B_5Y6CEG;kX}MJRTQ#yOE4{rTI{bYNH&|A4KKDBHg9J|8XJX4V3(Z>PRr8F_ zr1brquzn6FgNllln==3hx)D2SH4i+fx7NG`9BrTjCC}L!VVYt%&ppI=DKc=J)WspVc!Ptbl$I{Ku;253Co?QZ_$$-L+Dg5*6k3 z2xfJNqBdxet$8AKQzapr$1%AUXE!?BG9j}}@~j{K0I*LCx~Fqif6-+}`4X>Cr4(a8s2Z~@G^yn)gKlp%#9Vb&XRLF}xehz? z9Ij~MM$P;=y2Yh^YlWna7Qq;)JSND?+=

`u1qDO~?{dr}4J*0Aul3O;*Px7SAd2 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 literal 0 HcmV?d00001 diff --git a/tools/polly/docs/toolchains/ios/screens/02_single_view_app.png b/tools/polly/docs/toolchains/ios/screens/02_single_view_app.png new file mode 100644 index 0000000000000000000000000000000000000000..b889d433ae0ca608d99953f28ecef2b9b1b854d8 GIT binary patch literal 52903 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 Yxt(}o8~55r7<3@Qc^~0!fz#9RL6T literal 0 HcmV?d00001 diff --git a/tools/polly/docs/toolchains/ios/screens/03_project_options.png b/tools/polly/docs/toolchains/ios/screens/03_project_options.png new file mode 100644 index 0000000000000000000000000000000000000000..05c2f141cd2e981f0173437c73469fc45f796615 GIT binary patch literal 45606 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 z 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 literal 0 HcmV?d00001 diff --git a/tools/polly/docs/toolchains/ios/screens/04_bundle_identifier.png b/tools/polly/docs/toolchains/ios/screens/04_bundle_identifier.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9e1b37585292b4a0d5d54068a8c615b0a696a1 GIT binary patch literal 45957 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 sudo apt-get -y install mingw-w64 + +Test if the compiler is installed correctly + +.. code-block:: none + + > x86_64-w64-mingw32-gcc --version + x86_64-w64-mingw32-gcc (GCC) 5.3.1 20160211 + Copyright (C) 2015 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. diff --git a/tools/polly/docs/toolchains/raspberry-pi.rst b/tools/polly/docs/toolchains/raspberry-pi.rst new file mode 100644 index 0000000..3ecbfd5 --- /dev/null +++ b/tools/polly/docs/toolchains/raspberry-pi.rst @@ -0,0 +1,111 @@ +.. Copyright (c) 2017, Ruslan Baratov +.. All rights reserved. + +.. spelling:: + + Raspbian + +Raspberry Pi +------------ + +.. seealso:: + + * `Official `__ + * `Hardware Guide `__ + * `Formatting SDCard `__ + * `Download Software `__ + * `What password to use to log in after the first boot? `__ + +Raspbian (native) +================= + +Instructions for `Raspbian `__: + +.. code-block:: none + :emphasize-lines: 3 + + > lsb_release -a + No LSB modules are available. + Distributor ID: Raspbian + Description: Raspbian GNU/Linux 8.0 (jessie) + Release: 8.0 + Codename: jessie + + +.. code-block:: none + + > sudo apt-get install python3 + > sudo apt-get install g++ + > sudo apt-get install cmake + +Use ``raspberrypi*-cxx11`` toolchain, e.g. ``raspberrypi3-cxx11``: + +.. code-block:: none + :emphasize-lines: 3 + + > polly.py --toolchain raspberrypi3-cxx11 --verbose --config Release + ... + -- [polly] Raspberry Pi host + ... + +Cross-compiling +=============== + +Ubuntu +~~~~~~ + +.. seealso:: + + * `Kernel building `__ + +Download tools: + +.. code-block:: none + + > git clone https://github.com/raspberrypi/tools raspberrypi-tools + +Save paths in environment variables: + +.. code-block:: none + + > export RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PATH=/.../raspberrypi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin + > export RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PREFIX=arm-linux-gnueabihf + > export RASPBERRYPI_CROSS_COMPILE_SYSROOT=/.../raspberrypi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc + + +GCC 4.9 configuration: + +.. code-block:: none + + > export RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PATH=/.../raspberrypi-tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/ + > export RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PREFIX=arm-linux-gnueabihf + > export RASPBERRYPI_CROSS_COMPILE_SYSROOT=/.../raspberrypi-tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/sysroot + +Use ``raspberrypi*-cxx11`` toolchain, e.g. ``raspberrypi3-cxx11``: + +.. code-block:: none + + > polly.py --toolchain raspberrypi3-cxx11 --verbose --config Release + +OSX +~~~ + +Download tools: + +.. code-block:: none + + > git clone https://github.com/pretyman/raspberrypi2-mac-crosscompiler raspberrypi-tools + +Save paths in environment variables: + +.. code-block:: none + + > export RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PATH=/.../raspberrypi-tools/x-tools/arm-unknown-linux-gnueabihf/bin/ + > export RASPBERRYPI_CROSS_COMPILE_TOOLCHAIN_PREFIX=arm-unknown-linux-gnueabihf + > export RASPBERRYPI_CROSS_COMPILE_SYSROOT=/.../raspberrypi-tools/x-tools/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot + +Use ``raspberrypi*-cxx11`` toolchain, e.g. ``raspberrypi3-cxx11``: + +.. code-block:: none + + > polly.py --toolchain raspberrypi3-cxx11 --verbose --config Release diff --git a/tools/polly/emscripten-cxx11.cmake b/tools/polly/emscripten-cxx11.cmake new file mode 100644 index 0000000..728d540 --- /dev/null +++ b/tools/polly/emscripten-cxx11.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_EMSCRIPTEN_CXX11_CMAKE) + return() +else() + set(POLLY_EMSCRIPTEN_CXX11_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Emscripten Cross Compile / C++11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include(polly_clear_environment_variables) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/emscripten.cmake") + diff --git a/tools/polly/emscripten-cxx14.cmake b/tools/polly/emscripten-cxx14.cmake new file mode 100644 index 0000000..b9822ee --- /dev/null +++ b/tools/polly/emscripten-cxx14.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_EMSCRIPTEN_CXX14_CMAKE) + return() +else() + set(POLLY_EMSCRIPTEN_CXX14_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Emscripten Cross Compile / C++14" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include(polly_clear_environment_variables) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/emscripten.cmake") + diff --git a/tools/polly/emscripten-cxx17.cmake b/tools/polly/emscripten-cxx17.cmake new file mode 100644 index 0000000..d317dbe --- /dev/null +++ b/tools/polly/emscripten-cxx17.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_EMSCRIPTEN_CXX17_CMAKE) + return() +else() + set(POLLY_EMSCRIPTEN_CXX17_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Emscripten Cross Compile / C++17" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include(polly_clear_environment_variables) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/emscripten.cmake") + diff --git a/tools/polly/examples/01-executable/CMakeLists.txt b/tools/polly/examples/01-executable/CMakeLists.txt new file mode 100644 index 0000000..77b6307 --- /dev/null +++ b/tools/polly/examples/01-executable/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2013-2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 2.8.8) +project(01-executable) + +add_executable(simple "./main.cpp") + +install(TARGETS simple DESTINATION bin) + +enable_testing() +if(IOS) + add_test(NAME SimpleTest COMMAND "${CMAKE_COMMAND}" -E echo "Skip iOS test") +elseif(ANDROID) + add_test(NAME SimpleTest COMMAND "${CMAKE_COMMAND}" -E echo "Skip Android test") +else() + add_test(NAME SimpleTest COMMAND simple) +endif() diff --git a/tools/polly/examples/01-executable/main.cpp b/tools/polly/examples/01-executable/main.cpp new file mode 100644 index 0000000..4a1c395 --- /dev/null +++ b/tools/polly/examples/01-executable/main.cpp @@ -0,0 +1,47 @@ +#include // EXIT_SUCCESS +#include // std::cout + +#if __cplusplus >= 201703L +# include +#elif __cplusplus >= 201402L +# include +# include + +auto f() // this function returns multiple values +{ + int x = 5; + // not "return {x,7};" because the corresponding + // tuple constructor is explicit (LWG 2051) + return std::make_tuple(x, 7); +} + +#endif + +int main() { + std::cout << "Hello!" << std::endl; + +#if __cplusplus >= 201703L + // C++ 17 + auto x1 = { 1, 2 }; + std::cout << "C++17: "; + for ( auto a : x1 ) { std::cout << a << " "; } + std::cout << std::endl; +#elif __cplusplus >= 201402L + // heterogeneous tuple construction + int n = 1; + auto t = std::make_tuple(10, "Test", 3.14, std::ref(n), n); + n = 7; + std::cout << "C++14: The value of t is " << "(" + << std::get<0>(t) << ", " << std::get<1>(t) << ", " + << std::get<2>(t) << ", " << std::get<3>(t) << ", " + << std::get<4>(t) << ")\n"; + + // function returning multiple values + int a, b; + std::tie(a, b) = f(); + std::cout << "C++14: " << a << " " << b << "\n"; +#endif + return EXIT_SUCCESS; +} + + diff --git a/tools/polly/examples/02-library/CMakeLists.txt b/tools/polly/examples/02-library/CMakeLists.txt new file mode 100644 index 0000000..7b4a485 --- /dev/null +++ b/tools/polly/examples/02-library/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) 2013-2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 2.8.8) +project(02-library) + +add_library(foo "./foo.cpp") +install(TARGETS foo DESTINATION lib) + +add_executable(simple "./main.cpp") +target_link_libraries(simple foo) + +enable_testing() +if(IOS) + add_test(NAME SimpleTest COMMAND "${CMAKE_COMMAND}" -E echo "Skip iOS test") +elseif(ANDROID) + add_test(NAME SimpleTest COMMAND "${CMAKE_COMMAND}" -E echo "Skip Android test") +else() + add_test(NAME SimpleTest COMMAND simple) +endif() diff --git a/tools/polly/examples/02-library/foo.cpp b/tools/polly/examples/02-library/foo.cpp new file mode 100644 index 0000000..70d65c6 --- /dev/null +++ b/tools/polly/examples/02-library/foo.cpp @@ -0,0 +1,6 @@ +#include // std::cout + +int foo() { + std::cout << "Hello from foo" << std::endl; + return 42; +} diff --git a/tools/polly/examples/02-library/main.cpp b/tools/polly/examples/02-library/main.cpp new file mode 100755 index 0000000..63290cb --- /dev/null +++ b/tools/polly/examples/02-library/main.cpp @@ -0,0 +1,8 @@ +#include + +int foo(); + +int main() { + std::cout << "Foo say:" << std::endl; + foo(); +} diff --git a/tools/polly/examples/03-shared-link/CMakeLists.txt b/tools/polly/examples/03-shared-link/CMakeLists.txt new file mode 100644 index 0000000..c8f99d0 --- /dev/null +++ b/tools/polly/examples/03-shared-link/CMakeLists.txt @@ -0,0 +1,31 @@ +# Copyright (c) 2013-2016, Ruslan Baratov +# All rights reserved. + +cmake_minimum_required(VERSION 2.8.8) +project(03-shared-link) + +include(GenerateExportHeader) + +add_library(foo SHARED foo.cpp) +add_library(boo SHARED boo.cpp) + +generate_export_header(foo) +generate_export_header(boo) + +include_directories("${CMAKE_CURRENT_BINARY_DIR}") + +target_link_libraries(boo foo) + +install(TARGETS boo DESTINATION lib) + +add_executable(simple "./main.cpp") +target_link_libraries(simple boo) + +enable_testing() +if(IOS) + add_test(NAME SimpleTest COMMAND "${CMAKE_COMMAND}" -E echo "Skip iOS test") +elseif(ANDROID) + add_test(NAME SimpleTest COMMAND "${CMAKE_COMMAND}" -E echo "Skip Android test") +else() + add_test(NAME SimpleTest COMMAND simple) +endif() diff --git a/tools/polly/examples/03-shared-link/boo.cpp b/tools/polly/examples/03-shared-link/boo.cpp new file mode 100644 index 0000000..5926621 --- /dev/null +++ b/tools/polly/examples/03-shared-link/boo.cpp @@ -0,0 +1,10 @@ +#include + +#include "boo_export.h" + +int foo(); + +BOO_EXPORT int boo() { + std::cout << "boo: " << foo() << std::endl; + return 42; +} diff --git a/tools/polly/examples/03-shared-link/foo.cpp b/tools/polly/examples/03-shared-link/foo.cpp new file mode 100644 index 0000000..77b8538 --- /dev/null +++ b/tools/polly/examples/03-shared-link/foo.cpp @@ -0,0 +1,8 @@ +#include + +#include "foo_export.h" + +FOO_EXPORT int foo() { + std::cout << "foo" << std::endl; + return 0x42; +} diff --git a/tools/polly/examples/03-shared-link/main.cpp b/tools/polly/examples/03-shared-link/main.cpp new file mode 100755 index 0000000..7463ce6 --- /dev/null +++ b/tools/polly/examples/03-shared-link/main.cpp @@ -0,0 +1,8 @@ +#include + +int boo(); + +int main() { + std::cout << "Boo say:" << std::endl; + boo(); +} diff --git a/tools/polly/find/FindLibcxx.cmake b/tools/polly/find/FindLibcxx.cmake new file mode 100644 index 0000000..7313fcc --- /dev/null +++ b/tools/polly/find/FindLibcxx.cmake @@ -0,0 +1,101 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(NOT Libcxx_FIND_QUIETLY) + # TODO ??? +endif() + +if(NOT Libcxx_FIND_REQUIRED) + # TODO ??? +endif() + +if(NOT LIBCXX_ROOT) + set(LIBCXX_ROOT $ENV{LIBCXX_ROOT}) +endif() + +include(polly_fatal_error) +include(polly_status_print) + +if(NOT LIBCXX_ROOT) + polly_fatal_error( + "LIBCXX_ROOT not found. Please set cmake or environment variable" + ) +endif() + +if(Libcxx_FOUND) + return() +endif() + +polly_status_print("Libcxx root: ${LIBCXX_ROOT}") + +set( + Libcxx_INCLUDE_DIRS + "${LIBCXX_ROOT}/include/c++/v1" +) + +set(_find_libcxx_save_find_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES}) +if(Libcxx_USE_STATIC_LIBS) + polly_status_print("Libcxx static libraries: ON") + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) +else() + polly_status_print("Libcxx static libraries: OFF") + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX}) +endif() + +set(_find_libcxx_install_path "${LIBCXX_ROOT}/lib") + +if(CMAKE_DEBUG_POSTFIX) + set(_find_libcxx_debug_name c++${CMAKE_DEBUG_POSTFIX}) +else() + polly_status_print("CMAKE_DEBUG_POSTFIX is empty, no Debug library variant") + set(_find_libcxx_debug_name c++) +endif() + +find_library( + Libcxx_LIBRARY_DEBUG + ${_find_libcxx_debug_name} + PATH + "${_find_libcxx_install_path}" + NO_DEFAULT_PATH +) + +if(NOT Libcxx_LIBRARY_DEBUG) + polly_fatal_error( + "Libcxx library(debug): ${_find_libcxx_debug_name}, " + "not found in: ${_find_libcxx_install_path}" + ) +endif() + +find_library( + Libcxx_LIBRARY_RELEASE + c++ + PATH + "${_find_libcxx_install_path}" + NO_DEFAULT_PATH +) + +if(NOT Libcxx_LIBRARY_RELEASE) + polly_fatal_error( + "Libcxx library(release) not found in: ${_find_libcxx_install_path}" + ) +endif() + +set( + Libcxx_LIBRARY + debug + "${Libcxx_LIBRARY_DEBUG}" + optimized + "${Libcxx_LIBRARY_RELEASE}" +) + +# revert cmake suffixes +set(CMAKE_FIND_LIBRARY_SUFFIXES ${_find_libcxx_save_find_suffixes}) + +find_library(LibcxxAbi_LIBRARY c++abi) +if(NOT LibcxxAbi_LIBRARY) + polly_fatal_error("libc++abi not found") +endif() + +set(Libcxx_LIBRARIES ${Libcxx_LIBRARY} ${LibcxxAbi_LIBRARY}) + +set(Libcxx_FOUND TRUE) diff --git a/tools/polly/flags/32bit.cmake b/tools/polly/flags/32bit.cmake new file mode 100644 index 0000000..f7143ff --- /dev/null +++ b/tools/polly/flags/32bit.cmake @@ -0,0 +1,13 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_32BIT_CMAKE) + return() +else() + set(POLLY_FLAGS_32BIT_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-m32") +polly_add_cache_flag(CMAKE_C_FLAGS "-m32") diff --git a/tools/polly/flags/bitcode.cmake b/tools/polly/flags/bitcode.cmake new file mode 100644 index 0000000..cd49e73 --- /dev/null +++ b/tools/polly/flags/bitcode.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_BITCODE_) + return() +else() + set(POLLY_FLAGS_BITCODE_ 1) +endif() + +set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE YES) + +# It is not enough to set ENABLE_BITCODE to get binaries built with real bitcode information inside +# We should set BITCODE_GENERATION_MODE to "bitcode" for release builds and to "marker" for debug builds +# Only release builds usually need real bitcode for submission to Apple AppStore, so we'll save time on build +# +# https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9 + +set(CMAKE_XCODE_ATTRIBUTE_BITCODE_GENERATION_MODE[variant=Debug] "marker") +set(CMAKE_XCODE_ATTRIBUTE_BITCODE_GENERATION_MODE "bitcode") + +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "bitcode.3") + diff --git a/tools/polly/flags/c11.cmake b/tools/polly/flags/c11.cmake new file mode 100644 index 0000000..85eadcc --- /dev/null +++ b/tools/polly/flags/c11.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_C11_CMAKE_) + return() +else() + set(POLLY_FLAGS_C11_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +# Do not add this flag to 'flags/cxx11': +# * FAIL: OpenSSL + gcc-4-8-c11 +# * FAIL: lzma + gcc-4-8 +polly_add_cache_flag(CMAKE_C_FLAGS_INIT "-std=c11") + +# Hunter doesn't run toolchain-id calculation for C compiler +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "c11") diff --git a/tools/polly/flags/clang-tidy.cmake b/tools/polly/flags/clang-tidy.cmake new file mode 100644 index 0000000..49b6864 --- /dev/null +++ b/tools/polly/flags/clang-tidy.cmake @@ -0,0 +1,12 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_CLANG_TIDY_CMAKE_) + return() +else() + set(POLLY_FLAGS_CLANG_TIDY_CMAKE_ 1) +endif() + +set(CMAKE_CXX_CLANG_TIDY clang-tidy) +set(CMAKE_C_CLANG_TIDY clang-tidy) +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "clang-tidy") diff --git a/tools/polly/flags/cxx11.cmake b/tools/polly/flags/cxx11.cmake new file mode 100644 index 0000000..84a02af --- /dev/null +++ b/tools/polly/flags/cxx11.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_CXX11_CMAKE) + return() +else() + set(POLLY_FLAGS_CXX11_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _not_android) + +# TODO: test other platfroms, CMAKE_CXX_FLAGS_INIT should work for all +if(_not_android) + polly_add_cache_flag(CMAKE_CXX_FLAGS "-std=c++11") +else() + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-std=c++11") +endif() + +# Set CMAKE_CXX_STANDARD to cache to override project local value if present. +# FORCE added in case CMAKE_CXX_STANDARD already set in cache +# (e.g. set before 'project' by user). +set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ Standard (toolchain)" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED YES CACHE BOOL "C++ Standard required" FORCE) +set(CMAKE_CXX_EXTENSIONS NO CACHE BOOL "C++ Standard extensions" FORCE) diff --git a/tools/polly/flags/cxx14.cmake b/tools/polly/flags/cxx14.cmake new file mode 100644 index 0000000..1750df5 --- /dev/null +++ b/tools/polly/flags/cxx14.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_CXX14_CMAKE) + return() +else() + set(POLLY_FLAGS_CXX14_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _not_android) + +# TODO: test other platfroms, CMAKE_CXX_FLAGS_INIT should work for all +if(_not_android) + polly_add_cache_flag(CMAKE_CXX_FLAGS "-std=c++14") +else() + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-std=c++14") +endif() + +# Set CMAKE_CXX_STANDARD to cache to override project local value if present. +# FORCE added in case CMAKE_CXX_STANDARD already set in cache +# (e.g. set before 'project' by user). +set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ Standard (toolchain)" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED YES CACHE BOOL "C++ Standard required" FORCE) +set(CMAKE_CXX_EXTENSIONS NO CACHE BOOL "C++ Standard extensions" FORCE) diff --git a/tools/polly/flags/cxx17-gnu.cmake b/tools/polly/flags/cxx17-gnu.cmake new file mode 100644 index 0000000..15d84ed --- /dev/null +++ b/tools/polly/flags/cxx17-gnu.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2013, 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_CXX17_GNU_CMAKE_) + return() +else() + set(POLLY_FLAGS_CXX17_GNU_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) +include(polly_fatal_error) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _not_android) + +# TODO: test other platfroms, CMAKE_CXX_FLAGS_INIT should work for all +if(HUNTER_CMAKE_GENERATOR MATCHES "^Visual Studio.*$") + polly_fatal_error("Use flags/vs-cxx17.cmake instead") +elseif(_not_android) + polly_add_cache_flag(CMAKE_CXX_FLAGS "-std=gnu++17") +else() + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-std=gnu++17") +endif() + +# Set CMAKE_CXX_STANDARD to cache to override project local value if present. +# FORCE added in case CMAKE_CXX_STANDARD already set in cache +# (e.g. set before 'project' by user). +set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ Standard (toolchain)" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED YES CACHE BOOL "C++ Standard required" FORCE) +set(CMAKE_CXX_EXTENSIONS ON CACHE BOOL "C++ Standard extensions" FORCE) # GNU diff --git a/tools/polly/flags/cxx17.cmake b/tools/polly/flags/cxx17.cmake new file mode 100644 index 0000000..cb98b8f --- /dev/null +++ b/tools/polly/flags/cxx17.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_CXX17_CMAKE) + return() +else() + set(POLLY_FLAGS_CXX17_CMAKE 1) +endif() + +include(polly_add_cache_flag) +include(polly_fatal_error) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _not_android) + +# TODO: test other platfroms, CMAKE_CXX_FLAGS_INIT should work for all +if(HUNTER_CMAKE_GENERATOR MATCHES "^Visual Studio.*$") + polly_fatal_error("Use flags/vs-cxx17.cmake instead") +elseif(_not_android) + polly_add_cache_flag(CMAKE_CXX_FLAGS "-std=c++17") +else() + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-std=c++17") +endif() + +# Set CMAKE_CXX_STANDARD to cache to override project local value if present. +# FORCE added in case CMAKE_CXX_STANDARD already set in cache +# (e.g. set before 'project' by user). +set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ Standard (toolchain)" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED YES CACHE BOOL "C++ Standard required" FORCE) +set(CMAKE_CXX_EXTENSIONS NO CACHE BOOL "C++ Standard extensions" FORCE) diff --git a/tools/polly/flags/cxx98.cmake b/tools/polly/flags/cxx98.cmake new file mode 100644 index 0000000..e28dbd6 --- /dev/null +++ b/tools/polly/flags/cxx98.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_CXX98_CMAKE_) + return() +else() + set(POLLY_FLAGS_CXX98_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-std=c++98") + +# Set CMAKE_CXX_STANDARD to cache to override project local value if present. +# FORCE added in case CMAKE_CXX_STANDARD already set in cache +# (e.g. set before 'project' by user). +set(CMAKE_CXX_STANDARD 98 CACHE STRING "C++ Standard (toolchain)" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED YES CACHE BOOL "C++ Standard required" FORCE) +set(CMAKE_CXX_EXTENSIONS NO CACHE BOOL "C++ Standard extensions" FORCE) diff --git a/tools/polly/flags/data-sections.cmake b/tools/polly/flags/data-sections.cmake new file mode 100644 index 0000000..b3174da --- /dev/null +++ b/tools/polly/flags/data-sections.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2013-2016, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_FLAGS_DATA_SECTIONS_CMAKE) + return() +else() + set(POLLY_FLAGS_DATA_SECTIONS_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _not_android) + +# TODO: test other platfroms, CMAKE_CXX_FLAGS_INIT should work for all +if(_not_android) + polly_add_cache_flag(CMAKE_CXX_FLAGS "-fdata-sections") + polly_add_cache_flag(CMAKE_C_FLAGS "-fdata-sections") +else() + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-fdata-sections") + polly_add_cache_flag(CMAKE_C_FLAGS_INIT "-fdata-sections") +endif() + +# There is no macro to detect this flags on toolchain calculation so we must +# mark this toolchain explicitly. +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "data-sections") diff --git a/tools/polly/flags/fpic.cmake b/tools/polly/flags/fpic.cmake new file mode 100644 index 0000000..ee7108d --- /dev/null +++ b/tools/polly/flags/fpic.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2015, Ruslan Baratov, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_FLAGS_FPIC_CMAKE_) + return() +else() + set(POLLY_FLAGS_FPIC_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _not_android) + +# TODO: test other platfroms, CMAKE_CXX_FLAGS_INIT should work for all +if(_not_android) + polly_add_cache_flag(CMAKE_CXX_FLAGS "-fPIC") + polly_add_cache_flag(CMAKE_C_FLAGS "-fPIC") + polly_add_cache_flag(CMAKE_Fortran_FLAGS "-fPIC") +else() + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-fPIC") + polly_add_cache_flag(CMAKE_C_FLAGS_INIT "-fPIC") + polly_add_cache_flag(CMAKE_Fortran_FLAGS_INIT "-fPIC") +endif() + +set( + CMAKE_POSITION_INDEPENDENT_CODE + TRUE + CACHE + BOOL + "Position independent code" + FORCE +) diff --git a/tools/polly/flags/function-sections.cmake b/tools/polly/flags/function-sections.cmake new file mode 100644 index 0000000..029f4c2 --- /dev/null +++ b/tools/polly/flags/function-sections.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2013-2016, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_FLAGS_FUNCTION_SECTIONS_CMAKE) + return() +else() + set(POLLY_FLAGS_FUNCTION_SECTIONS_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _not_android) + +# TODO: test other platfroms, CMAKE_CXX_FLAGS_INIT should work for all +if(_not_android) + polly_add_cache_flag(CMAKE_CXX_FLAGS "-ffunction-sections") + polly_add_cache_flag(CMAKE_C_FLAGS "-ffunction-sections") +else() + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-ffunction-sections") + polly_add_cache_flag(CMAKE_C_FLAGS_INIT "-ffunction-sections") +endif() + +# There is no macro to detect this flags on toolchain calculation so we must +# mark this toolchain explicitly. +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "function-sections") diff --git a/tools/polly/flags/gnuxx11.cmake b/tools/polly/flags/gnuxx11.cmake new file mode 100644 index 0000000..1844e59 --- /dev/null +++ b/tools/polly/flags/gnuxx11.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2018, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_FLAGS_GNUXX11_CMAKE) + return() +else() + set(POLLY_FLAGS_GNUXX11_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-std=gnu++11") + +# Set CMAKE_CXX_STANDARD to cache to override project local value if present. +# FORCE added in case CMAKE_CXX_STANDARD already set in cache +# (e.g. set before 'project' by user). +set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ Standard (toolchain)" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED YES CACHE BOOL "C++ Standard required" FORCE) diff --git a/tools/polly/flags/gold.cmake b/tools/polly/flags/gold.cmake new file mode 100644 index 0000000..2e58f26 --- /dev/null +++ b/tools/polly/flags/gold.cmake @@ -0,0 +1,13 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_GOLD_CMAKE_) + return() +else() + set(POLLY_FLAGS_GOLD_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-fuse-ld=gold") +polly_add_cache_flag(CMAKE_C_FLAGS "-fuse-ld=gold") diff --git a/tools/polly/flags/hardfloat.cmake b/tools/polly/flags/hardfloat.cmake new file mode 100644 index 0000000..ab67666 --- /dev/null +++ b/tools/polly/flags/hardfloat.cmake @@ -0,0 +1,13 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_FLAGS_HARDFLOAT_CMAKE_) + return() +else() + set(POLLY_FLAGS_HARDFLOAT_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-mfloat-abi=hard") +polly_add_cache_flag(CMAKE_C_FLAGS "-mfloat-abi=hard") diff --git a/tools/polly/flags/hidden.cmake b/tools/polly/flags/hidden.cmake new file mode 100644 index 0000000..c1f6f25 --- /dev/null +++ b/tools/polly/flags/hidden.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_HIDDEN_CMAKE_) + return() +else() + set(POLLY_FLAGS_HIDDEN_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _not_android) + +# TODO: test other platfroms, CMAKE_CXX_FLAGS_INIT should work for all +if(_not_android) + polly_add_cache_flag(CMAKE_CXX_FLAGS "-fvisibility=hidden") + polly_add_cache_flag(CMAKE_CXX_FLAGS "-fvisibility-inlines-hidden") # only C++ + polly_add_cache_flag(CMAKE_C_FLAGS "-fvisibility=hidden") +else() + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-fvisibility=hidden") + polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "-fvisibility-inlines-hidden") # only C++ + polly_add_cache_flag(CMAKE_C_FLAGS_INIT "-fvisibility=hidden") +endif() + +# There is no macro to detect this flags on toolchain calculation so we must +# mark this toolchain explicitly. +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "hidden") diff --git a/tools/polly/flags/ios_nocodesign.cmake b/tools/polly/flags/ios_nocodesign.cmake new file mode 100644 index 0000000..d65e65f --- /dev/null +++ b/tools/polly/flags/ios_nocodesign.cmake @@ -0,0 +1,52 @@ +# Copyright (c) 2014-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_IOS_NOCODESIGN_CMAKE_) + return() +else() + set(POLLY_FLAGS_IOS_NOCODESIGN_CMAKE_ 1) +endif() + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/../scripts/NoCodeSign.xcconfig" +) + +get_filename_component( + _polly_xcode_xcconfig_file_path + "${_polly_xcode_xcconfig_file_path}" + ABSOLUTE +) + +get_filename_component( + _polly_xcode_xcconfig_file_path_env + "$ENV{XCODE_XCCONFIG_FILE}" + ABSOLUTE +) + +if(NOT EXISTS "${_polly_xcode_xcconfig_file_path_env}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "${_polly_xcode_xcconfig_file_path_env}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + message( + WARNING + "Unexpected XCODE_XCCONFIG_FILE value: " + " ${_polly_xcode_xcconfig_file_path_env}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() diff --git a/tools/polly/flags/lto.cmake b/tools/polly/flags/lto.cmake new file mode 100644 index 0000000..7d83008 --- /dev/null +++ b/tools/polly/flags/lto.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_LTO_CMAKE_) + return() +else() + set(POLLY_FLAGS_LTO_CMAKE_ 1) +endif() + +include(polly_fatal_error) + +if(NOT POLICY CMP0069) + polly_fatal_error("Bad CMake version") +endif() + +set(CMAKE_INTERPROCEDURAL_OPTIMIZATION YES) +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "lto.v2") diff --git a/tools/polly/flags/mtune_cortex-a15.cmake b/tools/polly/flags/mtune_cortex-a15.cmake new file mode 100644 index 0000000..1eb6998 --- /dev/null +++ b/tools/polly/flags/mtune_cortex-a15.cmake @@ -0,0 +1,16 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_FLAGS_MTUNE_CORTEX-A15_CMAKE_) + return() +else() + set(POLLY_FLAGS_MTUNE_CORTEX-A15_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +# generate code that works best on the specified hardware +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "cortex-a15") +polly_add_cache_flag(CMAKE_CXX_FLAGS "-mtune=cortex-a15") +polly_add_cache_flag(CMAKE_C_FLAGS "-mtune=cortex-a15") + diff --git a/tools/polly/flags/neon-vfpv4.cmake b/tools/polly/flags/neon-vfpv4.cmake new file mode 100644 index 0000000..20fcb0d --- /dev/null +++ b/tools/polly/flags/neon-vfpv4.cmake @@ -0,0 +1,13 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_FLAGS_NEON_VFPV4_CMAKE_) + return() +else() + set(POLLY_FLAGS_NEON_VFPV4_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-mfpu=neon-vfpv4") +polly_add_cache_flag(CMAKE_C_FLAGS "-mfpu=neon-vfpv4") diff --git a/tools/polly/flags/neon.cmake b/tools/polly/flags/neon.cmake new file mode 100644 index 0000000..b44f5c9 --- /dev/null +++ b/tools/polly/flags/neon.cmake @@ -0,0 +1,13 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_FLAGS_NEON_CMAKE_) + return() +else() + set(POLLY_FLAGS_NEON_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-mfpu=neon") +polly_add_cache_flag(CMAKE_C_FLAGS "-mfpu=neon") diff --git a/tools/polly/flags/openwrt.cmake b/tools/polly/flags/openwrt.cmake new file mode 100644 index 0000000..b56f2d7 --- /dev/null +++ b/tools/polly/flags/openwrt.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2017, NeroBurner +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_OPENWRT_CMAKE_) + return() +else() + set(POLLY_FLAGS_OPENWRT_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +set( + _openwrt_flags + -pipe + -march=armv7-a + -mcpu=cortex-a9 + -mtune=cortex-a9 + -msoft-float + -mfloat-abi=soft + -fno-caller-saves + -fno-plt + "-DNEED_PRINTF=1" # http://www.dd-wrt.com/phpBB2/viewtopic.php?p=552124 +) + +foreach(_openwrt_flag ${_openwrt_flags}) + polly_add_cache_flag(CMAKE_C_FLAGS "${_openwrt_flag}") + polly_add_cache_flag(CMAKE_CXX_FLAGS "${_openwrt_flag}") +endforeach() diff --git a/tools/polly/flags/sanitize_address.cmake b/tools/polly/flags/sanitize_address.cmake new file mode 100644 index 0000000..f61a314 --- /dev/null +++ b/tools/polly/flags/sanitize_address.cmake @@ -0,0 +1,81 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_SANITIZE_ADDRESS_CMAKE_) + return() +else() + set(POLLY_FLAGS_SANITIZE_ADDRESS_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) +include(polly_fatal_error) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-fsanitize=address") +polly_add_cache_flag(CMAKE_CXX_FLAGS "-g") + +set( + CMAKE_CXX_FLAGS_RELEASE + "-O1 -DNDEBUG" + CACHE + STRING + "C++ compiler flags" + FORCE +) + +polly_add_cache_flag(CMAKE_C_FLAGS "-fsanitize=address") +polly_add_cache_flag(CMAKE_C_FLAGS "-g") + +set( + CMAKE_C_FLAGS_RELEASE + "-O1 -DNDEBUG" + CACHE + STRING + "C compiler flags" + FORCE +) + +if(XCODE) + polly_add_cache_flag(CMAKE_C_FLAGS "-D_LIBCPP_HAS_NO_ASAN") + polly_add_cache_flag(CMAKE_CXX_FLAGS "-D_LIBCPP_HAS_NO_ASAN") + + string(COMPARE EQUAL "${CMAKE_XCODE_ATTRIBUTE_CC}" "" _is_empty) + if(_is_empty) + polly_fatal_error("CMAKE_XCODE_ATTRIBUTE_CC is empty") + endif() + + get_filename_component(_xcode_root "${CMAKE_XCODE_ATTRIBUTE_CC}" DIRECTORY) + + set(_xcode_asan_lib_name "libclang_rt.asan_osx_dynamic") + set( + _xcode_asan_pattern + "${_xcode_root}/../lib/clang/*/lib/darwin/${_xcode_asan_lib_name}.dylib" + ) + + file(GLOB _xcode_asan_lib "${_xcode_asan_pattern}") + list(LENGTH _xcode_asan_lib _xcode_asan_lib_length) + if(_xcode_asan_lib_length EQUAL 1) + get_filename_component(_xcode_asan_lib "${_xcode_asan_lib}" ABSOLUTE) + get_filename_component(_xcode_asan_lib_dir "${_xcode_asan_lib}" DIRECTORY) + polly_status_debug("Using ASAN library:\n") + polly_status_debug(" * ${_xcode_asan_lib}") + elseif(_xcode_asan_lib_length EQUAL 0) + polly_fatal_error("File not found by pattern: ${_xcode_asan_pattern}") + else() + polly_fatal_error("Unexpected: '${_xcode_asan_lib}'") + endif() + + polly_add_cache_flag(CMAKE_EXE_LINKER_FLAGS "${_xcode_asan_lib}") + polly_add_cache_flag(CMAKE_SHARED_LINKER_FLAGS "${_xcode_asan_lib}") + + if(CMAKE_VERSION VERSION_LESS 3.8.0) + polly_fatal_error("At least CMake 3.8.0 required (BUILD_RPATH feature)") + endif() + + set(CMAKE_BUILD_RPATH "${_xcode_asan_lib_dir}") + + # Hunter copying rules { + set_property(GLOBAL APPEND PROPERTY HUNTER_COPY_FILES "${_xcode_asan_lib}") + # Do not use SOURCE property because it's visible only for current directory + set_property(GLOBAL PROPERTY "HUNTER_DST_RELATIVE_DIR_${_xcode_asan_lib}" "lib") + # } +endif() diff --git a/tools/polly/flags/sanitize_leak.cmake b/tools/polly/flags/sanitize_leak.cmake new file mode 100644 index 0000000..1c7c045 --- /dev/null +++ b/tools/polly/flags/sanitize_leak.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_SANITIZE_LEAK_CMAKE_) + return() +else() + set(POLLY_FLAGS_SANITIZE_LEAK_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-fsanitize=leak") +polly_add_cache_flag(CMAKE_CXX_FLAGS "-g") + +polly_add_cache_flag(CMAKE_C_FLAGS "-fsanitize=leak") +polly_add_cache_flag(CMAKE_C_FLAGS "-g") + +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "sanitize-leak") diff --git a/tools/polly/flags/sanitize_memory.cmake b/tools/polly/flags/sanitize_memory.cmake new file mode 100644 index 0000000..a53295e --- /dev/null +++ b/tools/polly/flags/sanitize_memory.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_SANITIZE_MEMORY_CMAKE_) + return() +else() + set(POLLY_FLAGS_SANITIZE_MEMORY_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-fsanitize=memory") +polly_add_cache_flag(CMAKE_CXX_FLAGS "-fsanitize-memory-track-origins") +polly_add_cache_flag(CMAKE_CXX_FLAGS "-g") + +polly_add_cache_flag(CMAKE_C_FLAGS "-fsanitize=memory") +polly_add_cache_flag(CMAKE_C_FLAGS "-fsanitize-memory-track-origins") +polly_add_cache_flag(CMAKE_C_FLAGS "-g") diff --git a/tools/polly/flags/sanitize_thread.cmake b/tools/polly/flags/sanitize_thread.cmake new file mode 100644 index 0000000..4b9690a --- /dev/null +++ b/tools/polly/flags/sanitize_thread.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2014-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_SANITIZE_THREAD_CMAKE_) + return() +else() + set(POLLY_FLAGS_SANITIZE_THREAD_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-fsanitize=thread") +polly_add_cache_flag(CMAKE_CXX_FLAGS "-g") + +polly_add_cache_flag(CMAKE_C_FLAGS "-fsanitize=thread") +polly_add_cache_flag(CMAKE_C_FLAGS "-g") + +# NOTE: +# +# PIE flags removed because it's not a requirement anymore: +# * https://github.com/google/sanitizers/issues/503#issuecomment-137946595 +# +# With PIE flags sanitizer doesn't work on Ubuntu 14.04/16.04 +# producing runtime error "ThreadSanitizer: unexpected memory mapping": +# * https://github.com/google/sanitizers/issues/503 diff --git a/tools/polly/flags/static-std.cmake b/tools/polly/flags/static-std.cmake new file mode 100644 index 0000000..c9f7b35 --- /dev/null +++ b/tools/polly/flags/static-std.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_STATIC_STD_CMAKE_) + return() +else() + set(POLLY_FLAGS_STATIC_STD_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-static-libgcc") +polly_add_cache_flag(CMAKE_CXX_FLAGS "-static-libstdc++") + +polly_add_cache_flag(CMAKE_C_FLAGS "-static-libgcc") + +# There is no macro to detect this flags on toolchain calculation so we must +# mark this toolchain explicitly. +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "static-std-v2") diff --git a/tools/polly/flags/static.cmake b/tools/polly/flags/static.cmake new file mode 100644 index 0000000..05ae8e8 --- /dev/null +++ b/tools/polly/flags/static.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_STATIC_CMAKE_) + return() +else() + set(POLLY_FLAGS_STATIC_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-static") +polly_add_cache_flag(CMAKE_C_FLAGS "-static") + +# There is no macro to detect this flags on toolchain calculation so we must +# mark this toolchain explicitly. +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "static") diff --git a/tools/polly/flags/vs-cxx14.cmake b/tools/polly/flags/vs-cxx14.cmake new file mode 100644 index 0000000..4429668 --- /dev/null +++ b/tools/polly/flags/vs-cxx14.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2013, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_VS_CXX14_CMAKE_) + return() +else() + set(POLLY_FLAGS_VS_CXX14_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "/std:c++14") + +# Set CMAKE_CXX_STANDARD to cache to override project local value if present. +# FORCE added in case CMAKE_CXX_STANDARD already set in cache +# (e.g. set before 'project' by user). +set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ Standard (toolchain)" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED YES CACHE BOOL "C++ Standard required" FORCE) +set(CMAKE_CXX_EXTENSIONS NO CACHE BOOL "C++ Standard extensions" FORCE) diff --git a/tools/polly/flags/vs-cxx17.cmake b/tools/polly/flags/vs-cxx17.cmake new file mode 100644 index 0000000..56b5612 --- /dev/null +++ b/tools/polly/flags/vs-cxx17.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2013, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_VS_CXX17_CMAKE_) + return() +else() + set(POLLY_FLAGS_VS_CXX17_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "/std:c++17") + +# Set CMAKE_CXX_STANDARD to cache to override project local value if present. +# FORCE added in case CMAKE_CXX_STANDARD already set in cache +# (e.g. set before 'project' by user). +set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ Standard (toolchain)" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED YES CACHE BOOL "C++ Standard required" FORCE) +set(CMAKE_CXX_EXTENSIONS NO CACHE BOOL "C++ Standard extensions" FORCE) diff --git a/tools/polly/flags/vs-mt.cmake b/tools/polly/flags/vs-mt.cmake new file mode 100644 index 0000000..657f251 --- /dev/null +++ b/tools/polly/flags/vs-mt.cmake @@ -0,0 +1,15 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_VS_MT_CMAKE_) + return() +else() + set(POLLY_FLAGS_VS_MT_CMAKE_ 1) +endif() + +foreach(_lang C CXX) + set(CMAKE_${_lang}_FLAGS_DEBUG "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1" CACHE STRING "" FORCE) + set(CMAKE_${_lang}_FLAGS_MINSIZEREL "/MT /O1 /Ob1 /DNDEBUG" CACHE STRING "" FORCE) + set(CMAKE_${_lang}_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG" CACHE STRING "" FORCE) + set(CMAKE_${_lang}_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /DNDEBUG" CACHE STRING "" FORCE) +endforeach() diff --git a/tools/polly/flags/vs-z7.cmake b/tools/polly/flags/vs-z7.cmake new file mode 100644 index 0000000..ce8aedf --- /dev/null +++ b/tools/polly/flags/vs-z7.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_VS_Z7_CMAKE_) + return() +else() + set(POLLY_FLAGS_VS_Z7_CMAKE_ 1) +endif() + +foreach(_lang C CXX) + set(CMAKE_${_lang}_FLAGS_DEBUG "/D_DEBUG /MDd /Z7 /Ob0 /Od /RTC1" CACHE STRING "" FORCE) + set(CMAKE_${_lang}_FLAGS_MINSIZEREL "/MD /O1 /Ob1 /DNDEBUG" CACHE STRING "" FORCE) + set(CMAKE_${_lang}_FLAGS_RELEASE "/MD /O2 /Ob2 /DNDEBUG" CACHE STRING "" FORCE) + set(CMAKE_${_lang}_FLAGS_RELWITHDEBINFO "/MD /Z7 /O2 /Ob1 /DNDEBUG" CACHE STRING "" FORCE) +endforeach() + +list(APPEND HUNTER_TOOLCHAIN_UNDETECTABLE_ID "/Z7") diff --git a/tools/polly/flags/vs-zw.cmake b/tools/polly/flags/vs-zw.cmake new file mode 100644 index 0000000..7fec8d2 --- /dev/null +++ b/tools/polly/flags/vs-zw.cmake @@ -0,0 +1,14 @@ +# Copyright (c) 2013, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_FLAGS_VS_ZW_CMAKE_) + return() +else() + set(POLLY_FLAGS_VS_ZW_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +# https://msdn.microsoft.com/en-us/library/hh561383.aspx +polly_add_cache_flag(CMAKE_CXX_FLAGS_INIT "/ZW") +polly_add_cache_flag(CMAKE_C_FLAGS_INIT "/ZW") diff --git a/tools/polly/gcc-32bit-pic.cmake b/tools/polly/gcc-32bit-pic.cmake new file mode 100644 index 0000000..7779d43 --- /dev/null +++ b/tools/polly/gcc-32bit-pic.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_32BIT_PIC_CMAKE_) + return() +else() + set(POLLY_GCC_32BIT_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / PIC / c++11 support / 32 bit" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/32bit.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/gcc-32bit.cmake b/tools/polly/gcc-32bit.cmake new file mode 100644 index 0000000..9bd0dfb --- /dev/null +++ b/tools/polly/gcc-32bit.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_32BIT_CMAKE) + return() +else() + set(POLLY_GCC_32BIT_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / 32 bit" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/32bit.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/gcc-4-8-c11.cmake b/tools/polly/gcc-4-8-c11.cmake new file mode 100644 index 0000000..2786b72 --- /dev/null +++ b/tools/polly/gcc-4-8-c11.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC48_C11_CMAKE_) + return() +else() + set(POLLY_GCC48_C11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 4.8 / c++11 support / C11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc48.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/c11.cmake") diff --git a/tools/polly/gcc-4-8-pic-hid-sections.cmake b/tools/polly/gcc-4-8-pic-hid-sections.cmake new file mode 100644 index 0000000..0808636 --- /dev/null +++ b/tools/polly/gcc-4-8-pic-hid-sections.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC48_PIC_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_GCC48_PIC_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 4.8 / PIC / c++11 support / hidden / function-sections / data-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc48.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/gcc-4-8-pic.cmake b/tools/polly/gcc-4-8-pic.cmake new file mode 100644 index 0000000..db0ebbf --- /dev/null +++ b/tools/polly/gcc-4-8-pic.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC48_PIC_CMAKE_) + return() +else() + set(POLLY_GCC48_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 4.8 / PIC / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc48.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/gcc-4-8.cmake b/tools/polly/gcc-4-8.cmake new file mode 100644 index 0000000..7488fa9 --- /dev/null +++ b/tools/polly/gcc-4-8.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC48_CMAKE) + return() +else() + set(POLLY_GCC48_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 4.8 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc48.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/gcc-5-cxx14-c11.cmake b/tools/polly/gcc-5-cxx14-c11.cmake new file mode 100644 index 0000000..d0e533e --- /dev/null +++ b/tools/polly/gcc-5-cxx14-c11.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_5_CXX14_C11_CMAKE_) + return() +else() + set(POLLY_GCC_5_CXX14_C11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 5 / c++14 support / C11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-5.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/c11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") + diff --git a/tools/polly/gcc-5-pic-hid-sections-lto.cmake b/tools/polly/gcc-5-pic-hid-sections-lto.cmake new file mode 100644 index 0000000..ce177f0 --- /dev/null +++ b/tools/polly/gcc-5-pic-hid-sections-lto.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_5_PIC_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_GCC_5_PIC_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 5 / PIC / c++11 support / hidden / function-sections / data-sections / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-5.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") diff --git a/tools/polly/gcc-5-pic-hid-sections.cmake b/tools/polly/gcc-5-pic-hid-sections.cmake new file mode 100644 index 0000000..8a9a22a --- /dev/null +++ b/tools/polly/gcc-5-pic-hid-sections.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_GCC_5_PIC_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_GCC_5_PIC_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 5 / PIC / c++11 support / hidden / function-sections / data-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-5.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/gcc-5.cmake b/tools/polly/gcc-5.cmake new file mode 100644 index 0000000..a8743e6 --- /dev/null +++ b/tools/polly/gcc-5.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_5_CMAKE_) + return() +else() + set(POLLY_GCC_5_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 5 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-5.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/gcc-6-32bit-cxx14.cmake b/tools/polly/gcc-6-32bit-cxx14.cmake new file mode 100644 index 0000000..3a7df7f --- /dev/null +++ b/tools/polly/gcc-6-32bit-cxx14.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_32BIT_CMAKE) + return() +else() + set(POLLY_GCC_32BIT_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 6 / c++14 support / 32 bit" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-6.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/32bit.cmake") diff --git a/tools/polly/gcc-7-cxx14-pic.cmake b/tools/polly/gcc-7-cxx14-pic.cmake new file mode 100644 index 0000000..47de556 --- /dev/null +++ b/tools/polly/gcc-7-cxx14-pic.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_GCC_7_CXX14_PIC_CMAKE_) + return() +else() + set(POLLY_GCC_7_CXX14_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 7 / c++14 support / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-7.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/gcc-7-cxx14.cmake b/tools/polly/gcc-7-cxx14.cmake new file mode 100644 index 0000000..ade241a --- /dev/null +++ b/tools/polly/gcc-7-cxx14.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_GCC_7_CXX14_CMAKE_) + return() +else() + set(POLLY_GCC_7_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 7 / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-7.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/gcc-7-cxx17-gnu.cmake b/tools/polly/gcc-7-cxx17-gnu.cmake new file mode 100644 index 0000000..71f0876 --- /dev/null +++ b/tools/polly/gcc-7-cxx17-gnu.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2018, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_GCC_7_CXX17_GNU_CMAKE_) + return() +else() + set(POLLY_GCC_7_CXX17_GNU_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 7 / c++17 support / GNU" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-7.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17-gnu.cmake") diff --git a/tools/polly/gcc-7-cxx17-pic.cmake b/tools/polly/gcc-7-cxx17-pic.cmake new file mode 100644 index 0000000..029edca --- /dev/null +++ b/tools/polly/gcc-7-cxx17-pic.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_GCC_7_CXX17_PIC_CMAKE_) + return() +else() + set(POLLY_GCC_7_CXX17_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 7 / c++17 support / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-7.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/gcc-7-cxx17.cmake b/tools/polly/gcc-7-cxx17.cmake new file mode 100644 index 0000000..57a01c0 --- /dev/null +++ b/tools/polly/gcc-7-cxx17.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_GCC_7_CXX17_CMAKE_) + return() +else() + set(POLLY_GCC_7_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 7 / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-7.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") diff --git a/tools/polly/gcc-7-pic-hid-sections-lto.cmake b/tools/polly/gcc-7-pic-hid-sections-lto.cmake new file mode 100644 index 0000000..c0482d1 --- /dev/null +++ b/tools/polly/gcc-7-pic-hid-sections-lto.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_7_PIC_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_GCC_7_PIC_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 7 / PIC / c++11 support / hidden / function-sections / data-sections / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-7.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") diff --git a/tools/polly/gcc-7.cmake b/tools/polly/gcc-7.cmake new file mode 100644 index 0000000..cf7d650 --- /dev/null +++ b/tools/polly/gcc-7.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_GCC_7_CMAKE_) + return() +else() + set(POLLY_GCC_7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 7 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-7.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/gcc-8-cxx14-fpic.cmake b/tools/polly/gcc-8-cxx14-fpic.cmake new file mode 100644 index 0000000..19363c8 --- /dev/null +++ b/tools/polly/gcc-8-cxx14-fpic.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_8_CXX14_FPIC_CMAKE) + return() +else() + set(POLLY_GCC_8_CXX14_FPIC_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 8 / c++14 support / Position-Independent Code" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-8.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/gcc-8-cxx14.cmake b/tools/polly/gcc-8-cxx14.cmake new file mode 100644 index 0000000..beb5c44 --- /dev/null +++ b/tools/polly/gcc-8-cxx14.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_8_CXX14_CMAKE) + return() +else() + set(POLLY_GCC_8_CXX14_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 8 / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-8.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/gcc-8-cxx17-fpic.cmake b/tools/polly/gcc-8-cxx17-fpic.cmake new file mode 100644 index 0000000..019047f --- /dev/null +++ b/tools/polly/gcc-8-cxx17-fpic.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_8_CXX17_FPIC_CMAKE) + return() +else() + set(POLLY_GCC_8_CXX17_FPIC_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 8 / c++17 support / Position-Independent Code" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-8.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/gcc-8-cxx17.cmake b/tools/polly/gcc-8-cxx17.cmake new file mode 100644 index 0000000..47432f6 --- /dev/null +++ b/tools/polly/gcc-8-cxx17.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_8_CXX17_CMAKE) + return() +else() + set(POLLY_GCC_8_CXX17_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc 8 / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-8.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") diff --git a/tools/polly/gcc-c11.cmake b/tools/polly/gcc-c11.cmake new file mode 100644 index 0000000..d302add --- /dev/null +++ b/tools/polly/gcc-c11.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_C11_CMAKE_) + return() +else() + set(POLLY_GCC_C11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / C11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/c11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/gcc-cxx14-c11.cmake b/tools/polly/gcc-cxx14-c11.cmake new file mode 100644 index 0000000..69f71fd --- /dev/null +++ b/tools/polly/gcc-cxx14-c11.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_CXX14_C11_CMAKE_) + return() +else() + set(POLLY_GCC_CXX14_C11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++14 support / C11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/c11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") + diff --git a/tools/polly/gcc-cxx17-c11.cmake b/tools/polly/gcc-cxx17-c11.cmake new file mode 100644 index 0000000..c41e392 --- /dev/null +++ b/tools/polly/gcc-cxx17-c11.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_CXX17_C11_CMAKE_) + return() +else() + set(POLLY_GCC_CXX14_C17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++17 support / C11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/c11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") + diff --git a/tools/polly/gcc-cxx98.cmake b/tools/polly/gcc-cxx98.cmake new file mode 100644 index 0000000..0e65edf --- /dev/null +++ b/tools/polly/gcc-cxx98.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_CXX98_CMAKE) + return() +else() + set(POLLY_GCC_CXX98_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx98.cmake") diff --git a/tools/polly/gcc-gold.cmake b/tools/polly/gcc-gold.cmake new file mode 100644 index 0000000..87c3815 --- /dev/null +++ b/tools/polly/gcc-gold.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_GOLD_CMAKE_) + return() +else() + set(POLLY_GCC_GOLD_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / gold" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/gold.cmake") diff --git a/tools/polly/gcc-hid-fpic.cmake b/tools/polly/gcc-hid-fpic.cmake new file mode 100644 index 0000000..837dd51 --- /dev/null +++ b/tools/polly/gcc-hid-fpic.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_GCC_HID_FPIC_CMAKE_) + return() +else() + set(POLLY_GCC_HID_FPIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / hidden / FPIC" + "Unix Makefiles" + ) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") + diff --git a/tools/polly/gcc-hid.cmake b/tools/polly/gcc-hid.cmake new file mode 100644 index 0000000..e477ba9 --- /dev/null +++ b/tools/polly/gcc-hid.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_HID_CMAKE_) + return() +else() + set(POLLY_GCC_HID_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / hidden" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/gcc-lto.cmake b/tools/polly/gcc-lto.cmake new file mode 100644 index 0000000..42d9e49 --- /dev/null +++ b/tools/polly/gcc-lto.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_LTO_CMAKE_) + return() +else() + set(POLLY_GCC_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/gcc-musl.cmake b/tools/polly/gcc-musl.cmake new file mode 100644 index 0000000..2c13989 --- /dev/null +++ b/tools/polly/gcc-musl.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_MUSL_CMAKE_) + return() +else() + set(POLLY_GCC_MUSL_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / musl / static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CROSS_COMPILE_TOOLCHAIN_PATH "$ENV{GCC_MUSL_ROOT}") +string(COMPARE EQUAL "${CROSS_COMPILE_TOOLCHAIN_PATH}" "" _is_empty) +if(_is_empty) + polly_fatal_error("Environment variable GCC_MUSL_ROOT is not set") +endif() + +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "x86_64-linux-musl") + +set(POLLY_SKIP_SYSROOT TRUE) +set(CROSS_COMPILE_SYSROOT "dummy/path") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static.cmake") diff --git a/tools/polly/gcc-ninja.cmake b/tools/polly/gcc-ninja.cmake new file mode 100644 index 0000000..bc4daa0 --- /dev/null +++ b/tools/polly/gcc-ninja.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2013, 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_NINJA_CMAKE_) + return() +else() + set(POLLY_GCC_NINJA_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support" + "Ninja" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/gcc-pic-hid-sections-lto.cmake b/tools/polly/gcc-pic-hid-sections-lto.cmake new file mode 100644 index 0000000..5f1658f --- /dev/null +++ b/tools/polly/gcc-pic-hid-sections-lto.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_PIC_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_GCC_PIC_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / PIC / c++11 support / hidden / function-sections / data-sections / LTO" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") diff --git a/tools/polly/gcc-pic-hid-sections.cmake b/tools/polly/gcc-pic-hid-sections.cmake new file mode 100644 index 0000000..c3754c4 --- /dev/null +++ b/tools/polly/gcc-pic-hid-sections.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_PIC_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_GCC_PIC_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / PIC / c++11 support / hidden / function-sections / data-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/gcc-pic.cmake b/tools/polly/gcc-pic.cmake new file mode 100644 index 0000000..e2b27d0 --- /dev/null +++ b/tools/polly/gcc-pic.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_PIC_CMAKE_) + return() +else() + set(POLLY_GCC_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / PIC / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/gcc-static-std.cmake b/tools/polly/gcc-static-std.cmake new file mode 100644 index 0000000..52e0903 --- /dev/null +++ b/tools/polly/gcc-static-std.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_STATIC_STD_CMAKE_) + return() +else() + set(POLLY_GCC_STATIC_STD_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / static (libgcc, libstdc++)" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static-std.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/gcc-static.cmake b/tools/polly/gcc-static.cmake new file mode 100644 index 0000000..69a90c0 --- /dev/null +++ b/tools/polly/gcc-static.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_STATIC_CMAKE_) + return() +else() + set(POLLY_GCC_STATIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support / static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/gcc.cmake b/tools/polly/gcc.cmake new file mode 100644 index 0000000..98229a7 --- /dev/null +++ b/tools/polly/gcc.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_GCC_CMAKE) + return() +else() + set(POLLY_GCC_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "gcc / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/ios-10-0-arm64-dep-8-0-hid-sections.cmake b/tools/polly/ios-10-0-arm64-dep-8-0-hid-sections.cmake new file mode 100644 index 0000000..cc9fa8f --- /dev/null +++ b/tools/polly/ios-10-0-arm64-dep-8-0-hid-sections.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_10_0_ARM64_DEP_8_0_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_10_0_ARM64_DEP_8_0_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-0-arm64.cmake b/tools/polly/ios-10-0-arm64.cmake new file mode 100644 index 0000000..1e12dd9 --- /dev/null +++ b/tools/polly/ios-10-0-arm64.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_0_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_10_0_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-0-armv7.cmake b/tools/polly/ios-10-0-armv7.cmake new file mode 100644 index 0000000..eccf9af --- /dev/null +++ b/tools/polly/ios-10-0-armv7.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_0_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_10_0_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-0-dep-8-0-hid-sections.cmake b/tools/polly/ios-10-0-dep-8-0-hid-sections.cmake new file mode 100644 index 0000000..f6cb2d4 --- /dev/null +++ b/tools/polly/ios-10-0-dep-8-0-hid-sections.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_10_0_DEP_8_0_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_10_0_DEP_8_0_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-0-wo-armv7s.cmake b/tools/polly/ios-10-0-wo-armv7s.cmake new file mode 100644 index 0000000..ad1ece8 --- /dev/null +++ b/tools/polly/ios-10-0-wo-armv7s.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_0_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_10_0_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +armv7 arm64 / i386 x86_64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-0.cmake b/tools/polly/ios-10-0.cmake new file mode 100644 index 0000000..2ced3a4 --- /dev/null +++ b/tools/polly/ios-10-0.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2015, Tomas Zemaitis +# All rights reserved. + +if(DEFINED POLLY_IOS_10_0_CMAKE_) + return() +else() + set(POLLY_IOS_10_0_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-1-arm64-dep-8-0-hid-sections.cmake b/tools/polly/ios-10-1-arm64-dep-8-0-hid-sections.cmake new file mode 100644 index 0000000..7d7c4c8 --- /dev/null +++ b/tools/polly/ios-10-1-arm64-dep-8-0-hid-sections.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_10_1_ARM64_DEP_8_0_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_10_1_ARM64_DEP_8_0_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-1-arm64.cmake b/tools/polly/ios-10-1-arm64.cmake new file mode 100644 index 0000000..3707fb7 --- /dev/null +++ b/tools/polly/ios-10-1-arm64.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_1_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_10_1_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-1-armv7.cmake b/tools/polly/ios-10-1-armv7.cmake new file mode 100644 index 0000000..9bbab5c --- /dev/null +++ b/tools/polly/ios-10-1-armv7.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_1_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_10_1_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-1-dep-8-0-hid-sections.cmake b/tools/polly/ios-10-1-dep-8-0-hid-sections.cmake new file mode 100644 index 0000000..9fc9878 --- /dev/null +++ b/tools/polly/ios-10-1-dep-8-0-hid-sections.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_10_1_DEP_8_0_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_10_1_DEP_8_0_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-1-dep-8-0-libcxx-hid-sections-lto.cmake b/tools/polly/ios-10-1-dep-8-0-libcxx-hid-sections-lto.cmake new file mode 100644 index 0000000..8e70626 --- /dev/null +++ b/tools/polly/ios-10-1-dep-8-0-libcxx-hid-sections-lto.cmake @@ -0,0 +1,47 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_10_1_DEP_8_0_LIBCXX_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_IOS_10_1_DEP_8_0_LIBCXX_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-1-dep-8-0-libcxx-hid-sections.cmake b/tools/polly/ios-10-1-dep-8-0-libcxx-hid-sections.cmake new file mode 100644 index 0000000..f06e3d4 --- /dev/null +++ b/tools/polly/ios-10-1-dep-8-0-libcxx-hid-sections.cmake @@ -0,0 +1,46 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_10_1_DEP_8_0_LIBCXX_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_10_1_DEP_8_0_HID_LIBCXX_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-1-wo-armv7s.cmake b/tools/polly/ios-10-1-wo-armv7s.cmake new file mode 100644 index 0000000..4ffee38 --- /dev/null +++ b/tools/polly/ios-10-1-wo-armv7s.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_1_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_10_1_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +armv7 arm64 / i386 x86_64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-1.cmake b/tools/polly/ios-10-1.cmake new file mode 100644 index 0000000..614fa6a --- /dev/null +++ b/tools/polly/ios-10-1.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2015, Tomas Zemaitis +# All rights reserved. + +if(DEFINED POLLY_IOS_10_1_CMAKE_) + return() +else() + set(POLLY_IOS_10_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-2-dep-9-3-arm64.cmake b/tools/polly/ios-10-2-dep-9-3-arm64.cmake new file mode 100644 index 0000000..f478003 --- /dev/null +++ b/tools/polly/ios-10-2-dep-9-3-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_2_DEP_9_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_10_2_DEP_9_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-2-dep-9-3-armv7.cmake b/tools/polly/ios-10-2-dep-9-3-armv7.cmake new file mode 100644 index 0000000..dc4e47f --- /dev/null +++ b/tools/polly/ios-10-2-dep-9-3-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_2_DEP_9_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_10_2_DEP_9_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-2.cmake b/tools/polly/ios-10-2.cmake new file mode 100644 index 0000000..f6a6a91 --- /dev/null +++ b/tools/polly/ios-10-2.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_2_CMAKE_) + return() +else() + set(POLLY_IOS_10_2_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-3-arm64.cmake b/tools/polly/ios-10-3-arm64.cmake new file mode 100644 index 0000000..89b254f --- /dev/null +++ b/tools/polly/ios-10-3-arm64.cmake @@ -0,0 +1,41 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_10_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-3-armv7.cmake b/tools/polly/ios-10-3-armv7.cmake new file mode 100644 index 0000000..41f0abf --- /dev/null +++ b/tools/polly/ios-10-3-armv7.cmake @@ -0,0 +1,41 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_10_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-3-dep-8-0-bitcode.cmake b/tools/polly/ios-10-3-dep-8-0-bitcode.cmake new file mode 100644 index 0000000..5a14d97 --- /dev/null +++ b/tools/polly/ios-10-3-dep-8-0-bitcode.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_3_DEP_8_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_10_3_DEP_8_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-3-dep-9-0-bitcode.cmake b/tools/polly/ios-10-3-dep-9-0-bitcode.cmake new file mode 100644 index 0000000..a77f4ed --- /dev/null +++ b/tools/polly/ios-10-3-dep-9-0-bitcode.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_3_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_10_3_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-3-dep-9-3-i386-armv7.cmake b/tools/polly/ios-10-3-dep-9-3-i386-armv7.cmake new file mode 100644 index 0000000..b909790 --- /dev/null +++ b/tools/polly/ios-10-3-dep-9-3-i386-armv7.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_3_DEP_9_3_I386_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_10_3_DEP_9_3_I386_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +i386 / armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS i386) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-3-dep-9-3-x86-64-arm64.cmake b/tools/polly/ios-10-3-dep-9-3-x86-64-arm64.cmake new file mode 100644 index 0000000..0dbd8ac --- /dev/null +++ b/tools/polly/ios-10-3-dep-9-3-x86-64-arm64.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_3_DEP_9_3_X86_64_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_10_3_DEP_9_3_X86_64_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +x86_64 / arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-3-lto.cmake b/tools/polly/ios-10-3-lto.cmake new file mode 100644 index 0000000..48a9b86 --- /dev/null +++ b/tools/polly/ios-10-3-lto.cmake @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_3_LTO_CMAKE_) + return() +else() + set(POLLY_IOS_10_3_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-10-3.cmake b/tools/polly/ios-10-3.cmake new file mode 100644 index 0000000..3f91de5 --- /dev/null +++ b/tools/polly/ios-10-3.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_10_3_CMAKE_) + return() +else() + set(POLLY_IOS_10_3_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-0-dep-9-0-bitcode-cxx11.cmake b/tools/polly/ios-11-0-dep-9-0-bitcode-cxx11.cmake new file mode 100644 index 0000000..4e6b3b6 --- /dev/null +++ b/tools/polly/ios-11-0-dep-9-0-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_0_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_11_0_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.0) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-0-dep-9-0-device-bitcode-cxx11.cmake b/tools/polly/ios-11-0-dep-9-0-device-bitcode-cxx11.cmake new file mode 100644 index 0000000..0dea6a2 --- /dev/null +++ b/tools/polly/ios-11-0-dep-9-0-device-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_0_DEP_9_0_DEVICE_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_11_0_DEP_9_0_DEVICE_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.0) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-0.cmake b/tools/polly/ios-11-0.cmake new file mode 100644 index 0000000..383c571 --- /dev/null +++ b/tools/polly/ios-11-0.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_0_CMAKE_) + return() +else() + set(POLLY_IOS_11_0_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-1-dep-9-0-bitcode-cxx11.cmake b/tools/polly/ios-11-1-dep-9-0-bitcode-cxx11.cmake new file mode 100644 index 0000000..d34019e --- /dev/null +++ b/tools/polly/ios-11-1-dep-9-0-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_1_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_11_1_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-1-dep-9-0-device-bitcode-cxx11.cmake b/tools/polly/ios-11-1-dep-9-0-device-bitcode-cxx11.cmake new file mode 100644 index 0000000..1315f8f --- /dev/null +++ b/tools/polly/ios-11-1-dep-9-0-device-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_1_DEP_9_0_DEVICE_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_11_1_DEP_9_0_DEVICE_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-2-dep-9-0-device-bitcode-cxx11.cmake b/tools/polly/ios-11-2-dep-9-0-device-bitcode-cxx11.cmake new file mode 100644 index 0000000..12d8a6d --- /dev/null +++ b/tools/polly/ios-11-2-dep-9-0-device-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_2_DEP_9_0_DEVICE_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_11_2_DEP_9_0_DEVICE_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-2-dep-9-0-device-bitcode-nocxx.cmake b/tools/polly/ios-11-2-dep-9-0-device-bitcode-nocxx.cmake new file mode 100644 index 0000000..d1aa5a7 --- /dev/null +++ b/tools/polly/ios-11-2-dep-9-0-device-bitcode-nocxx.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_2_DEP_9_0_DEVICE_BITCODE_NOCXX_CMAKE_) + return() +else() + set(POLLY_IOS_11_2_DEP_9_0_DEVICE_BITCODE_NOCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +any c++ support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-2-dep-9-3-arm64-armv7.cmake b/tools/polly/ios-11-2-dep-9-3-arm64-armv7.cmake new file mode 100644 index 0000000..b4a0697 --- /dev/null +++ b/tools/polly/ios-11-2-dep-9-3-arm64-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_2_DEP_9_3_ARM64_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_11_2_DEP_9_3_ARM64_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-3-dep-9-0-arm64.cmake b/tools/polly/ios-11-3-dep-9-0-arm64.cmake new file mode 100644 index 0000000..93e3198 --- /dev/null +++ b/tools/polly/ios-11-3-dep-9-0-arm64.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_11_3_DEP_9_0_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_11_3_DEP_9_0_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-3-dep-9-0-device-bitcode-cxx11.cmake b/tools/polly/ios-11-3-dep-9-0-device-bitcode-cxx11.cmake new file mode 100644 index 0000000..5dba22b --- /dev/null +++ b/tools/polly/ios-11-3-dep-9-0-device-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_3_DEP_9_0_DEVICE_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_11_3_DEP_9_0_DEVICE_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-3-dep-9-0-device-bitcode-cxx17.cmake b/tools/polly/ios-11-3-dep-9-0-device-bitcode-cxx17.cmake new file mode 100644 index 0000000..391126f --- /dev/null +++ b/tools/polly/ios-11-3-dep-9-0-device-bitcode-cxx17.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_3_DEP_9_0_DEVICE_BITCODE_CXX17_CMAKE_) + return() +else() + set(POLLY_IOS_11_3_DEP_9_0_DEVICE_BITCODE_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++17 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-3-dep-9-0-device-bitcode-nocxx.cmake b/tools/polly/ios-11-3-dep-9-0-device-bitcode-nocxx.cmake new file mode 100644 index 0000000..4730e53 --- /dev/null +++ b/tools/polly/ios-11-3-dep-9-0-device-bitcode-nocxx.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_3_DEP_9_0_DEVICE_BITCODE_NOCXX_CMAKE_) + return() +else() + set(POLLY_IOS_11_3_DEP_9_0_DEVICE_BITCODE_NOCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +any c++ support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-3-dep-9-0-device-bitcode.cmake b/tools/polly/ios-11-3-dep-9-0-device-bitcode.cmake new file mode 100644 index 0000000..e3f3b59 --- /dev/null +++ b/tools/polly/ios-11-3-dep-9-0-device-bitcode.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_3_DEP_9_0_DEVICE_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_11_3_DEP_9_0_DEVICE_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-3-dep-9-3-arm64-armv7.cmake b/tools/polly/ios-11-3-dep-9-3-arm64-armv7.cmake new file mode 100644 index 0000000..28b9418 --- /dev/null +++ b/tools/polly/ios-11-3-dep-9-3-arm64-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_3_DEP_9_3_ARM64_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_11_3_DEP_9_3_ARM64_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-8-0-arm64-armv7-hid-sections-lto-cxx11.cmake b/tools/polly/ios-11-4-dep-8-0-arm64-armv7-hid-sections-lto-cxx11.cmake new file mode 100644 index 0000000..af0a7bc --- /dev/null +++ b/tools/polly/ios-11-4-dep-8-0-arm64-armv7-hid-sections-lto-cxx11.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_8_0_ARM64_ARMV7_HID_SECTIONS_LTO_CXX11_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_8_0_ARM64_ARMV7_HID_SECTIONS_LTO_CXX11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64;armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-8-0-arm64-hid-sections-lto-cxx11.cmake b/tools/polly/ios-11-4-dep-8-0-arm64-hid-sections-lto-cxx11.cmake new file mode 100644 index 0000000..cee8479 --- /dev/null +++ b/tools/polly/ios-11-4-dep-8-0-arm64-hid-sections-lto-cxx11.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_8_0_ARM64_HID_SECTIONS_LTO_CXX11_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_8_0_ARM64_HID_SECTIONS_LTO_CXX11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-9-0-device-bitcode-cxx11.cmake b/tools/polly/ios-11-4-dep-9-0-device-bitcode-cxx11.cmake new file mode 100644 index 0000000..5aa8902 --- /dev/null +++ b/tools/polly/ios-11-4-dep-9-0-device-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_9_0_DEVICE_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_9_0_DEVICE_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-9-0-device-bitcode-nocxx.cmake b/tools/polly/ios-11-4-dep-9-0-device-bitcode-nocxx.cmake new file mode 100644 index 0000000..8d57c84 --- /dev/null +++ b/tools/polly/ios-11-4-dep-9-0-device-bitcode-nocxx.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_9_0_DEVICE_BITCODE_NOCXX_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_9_0_DEVICE_BITCODE_NOCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +any c++ support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-9-3-arm64-armv7.cmake b/tools/polly/ios-11-4-dep-9-3-arm64-armv7.cmake new file mode 100644 index 0000000..74e7377 --- /dev/null +++ b/tools/polly/ios-11-4-dep-9-3-arm64-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_9_3_ARM64_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_9_3_ARM64_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-9-3-arm64-hid-sections-lto-cxx11.cmake b/tools/polly/ios-11-4-dep-9-3-arm64-hid-sections-lto-cxx11.cmake new file mode 100644 index 0000000..933e01b --- /dev/null +++ b/tools/polly/ios-11-4-dep-9-3-arm64-hid-sections-lto-cxx11.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_9_3_ARM64_HID_SECTIONS_LTO_CXX11_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_9_3_ARM64_HID_SECTIONS_LTO_CXX11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-9-3-arm64.cmake b/tools/polly/ios-11-4-dep-9-3-arm64.cmake new file mode 100644 index 0000000..c5c0256 --- /dev/null +++ b/tools/polly/ios-11-4-dep-9-3-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_9_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_9_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-9-3-armv7.cmake b/tools/polly/ios-11-4-dep-9-3-armv7.cmake new file mode 100644 index 0000000..d3296f3 --- /dev/null +++ b/tools/polly/ios-11-4-dep-9-3-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_9_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_9_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-9-3.cmake b/tools/polly/ios-11-4-dep-9-3.cmake new file mode 100644 index 0000000..acc75bd --- /dev/null +++ b/tools/polly/ios-11-4-dep-9-3.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_9_3_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_9_3_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-11-4-dep-9-4-arm64.cmake b/tools/polly/ios-11-4-dep-9-4-arm64.cmake new file mode 100644 index 0000000..8c6d60b --- /dev/null +++ b/tools/polly/ios-11-4-dep-9-4-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_11_4_DEP_9_4_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_11_4_DEP_9_4_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.4) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-12-0-dep-11-0-arm64.cmake b/tools/polly/ios-12-0-dep-11-0-arm64.cmake new file mode 100644 index 0000000..909ca99 --- /dev/null +++ b/tools/polly/ios-12-0-dep-11-0-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_12_0_DEP_11_0_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_12_0_DEP_11_0_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 12.0) +set(IOS_DEPLOYMENT_SDK_VERSION 11.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-12-0-dep-9-0-device-bitcode-cxx11.cmake b/tools/polly/ios-12-0-dep-9-0-device-bitcode-cxx11.cmake new file mode 100644 index 0000000..7614bcb --- /dev/null +++ b/tools/polly/ios-12-0-dep-9-0-device-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_12_0_DEP_9_0_DEVICE_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_12_0_DEP_9_0_DEVICE_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 12.0) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-12-1-dep-11-0-arm64.cmake b/tools/polly/ios-12-1-dep-11-0-arm64.cmake new file mode 100644 index 0000000..914e394 --- /dev/null +++ b/tools/polly/ios-12-1-dep-11-0-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_12_1_DEP_11_0_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_12_1_DEP_11_0_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 12.1) +set(IOS_DEPLOYMENT_SDK_VERSION 11.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-12-1-dep-9-3-arm64.cmake b/tools/polly/ios-12-1-dep-9-3-arm64.cmake new file mode 100644 index 0000000..e3e664f --- /dev/null +++ b/tools/polly/ios-12-1-dep-9-3-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_12_1_DEP_9_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_12_1_DEP_9_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 12.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_ios_development_team.cmake") diff --git a/tools/polly/ios-7-0.cmake b/tools/polly/ios-7-0.cmake new file mode 100644 index 0000000..4769961 --- /dev/null +++ b/tools/polly/ios-7-0.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_7_0_CMAKE_) + return() +else() + set(POLLY_IOS_7_0_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 7.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-7-1.cmake b/tools/polly/ios-7-1.cmake new file mode 100644 index 0000000..1c7e70f --- /dev/null +++ b/tools/polly/ios-7-1.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_7_1_CMAKE_) + return() +else() + set(POLLY_IOS_7_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 7.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-0.cmake b/tools/polly/ios-8-0.cmake new file mode 100644 index 0000000..809c390 --- /dev/null +++ b/tools/polly/ios-8-0.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_0_CMAKE_) + return() +else() + set(POLLY_IOS_8_0_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-1.cmake b/tools/polly/ios-8-1.cmake new file mode 100644 index 0000000..0bc7f67 --- /dev/null +++ b/tools/polly/ios-8-1.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_1_CMAKE_) + return() +else() + set(POLLY_IOS_8_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-2-arm64-hid.cmake b/tools/polly/ios-8-2-arm64-hid.cmake new file mode 100644 index 0000000..e19f943 --- /dev/null +++ b/tools/polly/ios-8-2-arm64-hid.cmake @@ -0,0 +1,39 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_2_ARM64_HID_) + return() +else() + set(POLLY_IOS_8_2_ARM64_HID_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / hidden visibility / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/ios-8-2-arm64.cmake b/tools/polly/ios-8-2-arm64.cmake new file mode 100644 index 0000000..ddd5d39 --- /dev/null +++ b/tools/polly/ios-8-2-arm64.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_2_ARM64_) + return() +else() + set(POLLY_IOS_8_2_ARM64_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-2-cxx98.cmake b/tools/polly/ios-8-2-cxx98.cmake new file mode 100644 index 0000000..daaf6ff --- /dev/null +++ b/tools/polly/ios-8-2-cxx98.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_2_CMAKE_) + return() +else() + set(POLLY_IOS_8_2_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++98" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx98.cmake") diff --git a/tools/polly/ios-8-2-i386-arm64.cmake b/tools/polly/ios-8-2-i386-arm64.cmake new file mode 100644 index 0000000..5a1e527 --- /dev/null +++ b/tools/polly/ios-8-2-i386-arm64.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2013-2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_2_I386_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_8_2_I386_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +i386 / arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS i386) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-2.cmake b/tools/polly/ios-8-2.cmake new file mode 100644 index 0000000..97372ab --- /dev/null +++ b/tools/polly/ios-8-2.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_2_CMAKE_) + return() +else() + set(POLLY_IOS_8_2_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-4-arm64.cmake b/tools/polly/ios-8-4-arm64.cmake new file mode 100644 index 0000000..8103907 --- /dev/null +++ b/tools/polly/ios-8-4-arm64.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_4_ARM64_) + return() +else() + set(POLLY_IOS_8_4_ARM64_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.4) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-4-armv7.cmake b/tools/polly/ios-8-4-armv7.cmake new file mode 100644 index 0000000..06cfd8f --- /dev/null +++ b/tools/polly/ios-8-4-armv7.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_4_ARMV7_) + return() +else() + set(POLLY_IOS_8_4_ARMV7_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.4) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-4-armv7s.cmake b/tools/polly/ios-8-4-armv7s.cmake new file mode 100644 index 0000000..670cb19 --- /dev/null +++ b/tools/polly/ios-8-4-armv7s.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_4_ARMV7S_) + return() +else() + set(POLLY_IOS_8_4_ARMV7S_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.4) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7s / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7s) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-8-4-hid.cmake b/tools/polly/ios-8-4-hid.cmake new file mode 100644 index 0000000..d89e053 --- /dev/null +++ b/tools/polly/ios-8-4-hid.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_8_4_HID_) + return() +else() + set(POLLY_IOS_8_4_HID_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.4) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +hidden visibility / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/ios-8-4.cmake b/tools/polly/ios-8-4.cmake new file mode 100644 index 0000000..a4349c7 --- /dev/null +++ b/tools/polly/ios-8-4.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_8_4_CMAKE_) + return() +else() + set(POLLY_IOS_8_4_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.4) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-0-armv7.cmake b/tools/polly/ios-9-0-armv7.cmake new file mode 100644 index 0000000..aadb5b6 --- /dev/null +++ b/tools/polly/ios-9-0-armv7.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_0_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_9_0_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-0-dep-7-0-armv7.cmake b/tools/polly/ios-9-0-dep-7-0-armv7.cmake new file mode 100644 index 0000000..989c270 --- /dev/null +++ b/tools/polly/ios-9-0-dep-7-0-armv7.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_0_DEP_7_0_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_9_0_DEP_7_0_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.0) +set(IOS_DEPLOYMENT_SDK_VERSION 7.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-0-i386-armv7.cmake b/tools/polly/ios-9-0-i386-armv7.cmake new file mode 100644 index 0000000..2bcbd30 --- /dev/null +++ b/tools/polly/ios-9-0-i386-armv7.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_0_CMAKE_) + return() +else() + set(POLLY_IOS_9_0_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +i386 / armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS i386) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-0-wo-armv7s.cmake b/tools/polly/ios-9-0-wo-armv7s.cmake new file mode 100644 index 0000000..07fd05d --- /dev/null +++ b/tools/polly/ios-9-0-wo-armv7s.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_0_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_9_0_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +armv7 arm64 / i386 x86_64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-0.cmake b/tools/polly/ios-9-0.cmake new file mode 100644 index 0000000..b6d3edf --- /dev/null +++ b/tools/polly/ios-9-0.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_0_CMAKE_) + return() +else() + set(POLLY_IOS_9_0_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-1-arm64.cmake b/tools/polly/ios-9-1-arm64.cmake new file mode 100644 index 0000000..a105db4 --- /dev/null +++ b/tools/polly/ios-9-1-arm64.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_1_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_9_1_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-1-armv7.cmake b/tools/polly/ios-9-1-armv7.cmake new file mode 100644 index 0000000..9e88ac8 --- /dev/null +++ b/tools/polly/ios-9-1-armv7.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_1_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_9_1_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-1-dep-7-0-armv7.cmake b/tools/polly/ios-9-1-dep-7-0-armv7.cmake new file mode 100644 index 0000000..c5dd458 --- /dev/null +++ b/tools/polly/ios-9-1-dep-7-0-armv7.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_1_DEP_7_0_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_9_1_DEP_7_0_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(IOS_DEPLOYMENT_SDK_VERSION 7.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-1-dep-8-0-hid.cmake b/tools/polly/ios-9-1-dep-8-0-hid.cmake new file mode 100644 index 0000000..5627efc --- /dev/null +++ b/tools/polly/ios-9-1-dep-8-0-hid.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_9_1_DEP_8_0_HID_) + return() +else() + set(POLLY_IOS_9_1_DEP_8_0_HID_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/ios-9-1-hid.cmake b/tools/polly/ios-9-1-hid.cmake new file mode 100644 index 0000000..b6307e9 --- /dev/null +++ b/tools/polly/ios-9-1-hid.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_9_1_HID_) + return() +else() + set(POLLY_IOS_9_1_HID_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +hidden visibility / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/ios-9-1.cmake b/tools/polly/ios-9-1.cmake new file mode 100644 index 0000000..34bb556 --- /dev/null +++ b/tools/polly/ios-9-1.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Tomas Zemaitis +# All rights reserved. + +if(DEFINED POLLY_IOS_9_1_CMAKE_) + return() +else() + set(POLLY_IOS_9_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-2-arm64.cmake b/tools/polly/ios-9-2-arm64.cmake new file mode 100644 index 0000000..f87685b --- /dev/null +++ b/tools/polly/ios-9-2-arm64.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_2_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_9_2_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-2-armv7.cmake b/tools/polly/ios-9-2-armv7.cmake new file mode 100644 index 0000000..adbbeff --- /dev/null +++ b/tools/polly/ios-9-2-armv7.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_2_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_9_2_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-2-hid-sections.cmake b/tools/polly/ios-9-2-hid-sections.cmake new file mode 100644 index 0000000..d80948a --- /dev/null +++ b/tools/polly/ios-9-2-hid-sections.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2015-2016, Ruslan Baratov +# Copyright (c) 2015-2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_9_2_HID_SECTIONS_) + return() +else() + set(POLLY_IOS_9_2_HID_SECTIONS_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +hidden visibility / function-sections / data-sections \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") diff --git a/tools/polly/ios-9-2-hid.cmake b/tools/polly/ios-9-2-hid.cmake new file mode 100644 index 0000000..19f8519 --- /dev/null +++ b/tools/polly/ios-9-2-hid.cmake @@ -0,0 +1,40 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2015, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_9_2_HID_) + return() +else() + set(POLLY_IOS_9_2_HID_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +hidden visibility / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/ios-9-2.cmake b/tools/polly/ios-9-2.cmake new file mode 100644 index 0000000..2df1d75 --- /dev/null +++ b/tools/polly/ios-9-2.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Tomas Zemaitis +# All rights reserved. + +if(DEFINED POLLY_IOS_9_2_CMAKE_) + return() +else() + set(POLLY_IOS_9_2_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-3-arm64.cmake b/tools/polly/ios-9-3-arm64.cmake new file mode 100644 index 0000000..e5ca002 --- /dev/null +++ b/tools/polly/ios-9-3-arm64.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_9_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +arm64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-3-armv7.cmake b/tools/polly/ios-9-3-armv7.cmake new file mode 100644 index 0000000..0e1d110 --- /dev/null +++ b/tools/polly/ios-9-3-armv7.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_9_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +armv7 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-3-wo-armv7s.cmake b/tools/polly/ios-9-3-wo-armv7s.cmake new file mode 100644 index 0000000..3e02209 --- /dev/null +++ b/tools/polly/ios-9-3-wo-armv7s.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2015-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_9_3_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_9_3_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +armv7 arm64 / i386 x86_64 / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-9-3.cmake b/tools/polly/ios-9-3.cmake new file mode 100644 index 0000000..a48362d --- /dev/null +++ b/tools/polly/ios-9-3.cmake @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Tomas Zemaitis +# All rights reserved. + +if(DEFINED POLLY_IOS_9_3_CMAKE_) + return() +else() + set(POLLY_IOS_9_3_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-dep-8-0-arm64-armv7-hid-sections-lto-cxx11.cmake b/tools/polly/ios-dep-8-0-arm64-armv7-hid-sections-lto-cxx11.cmake new file mode 100644 index 0000000..fed0b3f --- /dev/null +++ b/tools/polly/ios-dep-8-0-arm64-armv7-hid-sections-lto-cxx11.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_DEP_8_0_ARM64_ARMV7_HID_SECTIONS_LTO_CXX11_CMAKE_) + return() +else() + set(POLLY_IOS_DEP_8_0_ARM64_ARMV7_HID_SECTIONS_LTO_CXX11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_module_path.cmake") +include(polly_clear_environment_variables) +include(polly_init) +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone-default-sdk.cmake") # -> IOS_SDK_VERSION + +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7) / \ +${POLLY_XCODE_COMPILER} / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include(polly_common) +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +set(IPHONEOS_ARCHS arm64;armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +if(NOT IOS_SDK_VERSION VERSION_LESS 10.0) + include(polly_ios_development_team) +endif() diff --git a/tools/polly/ios-nocodesign-10-0-arm64.cmake b/tools/polly/ios-nocodesign-10-0-arm64.cmake new file mode 100644 index 0000000..bdfa7a9 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-0-arm64.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_0_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_0_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-0-armv7.cmake b/tools/polly/ios-nocodesign-10-0-armv7.cmake new file mode 100644 index 0000000..cc59c2d --- /dev/null +++ b/tools/polly/ios-nocodesign-10-0-armv7.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_0_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_0_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-0-wo-armv7s.cmake b/tools/polly/ios-nocodesign-10-0-wo-armv7s.cmake new file mode 100644 index 0000000..b3b341d --- /dev/null +++ b/tools/polly/ios-nocodesign-10-0-wo-armv7s.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_0_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_0_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / No armv7s / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-0.cmake b/tools/polly/ios-nocodesign-10-0.cmake new file mode 100644 index 0000000..771c008 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-0.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_0_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_0_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections-lto.cmake b/tools/polly/ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections-lto.cmake new file mode 100644 index 0000000..2c506cb --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections-lto.cmake @@ -0,0 +1,76 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_ARM64_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_ARM64_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} / Universal (arm64) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") diff --git a/tools/polly/ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections.cmake b/tools/polly/ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections.cmake new file mode 100644 index 0000000..88ed844 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1-arm64-dep-9-0-device-libcxx-hid-sections.cmake @@ -0,0 +1,75 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_ARM64_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_ARM64_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} / Universal (arm64) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") diff --git a/tools/polly/ios-nocodesign-10-1-arm64.cmake b/tools/polly/ios-nocodesign-10-1-arm64.cmake new file mode 100644 index 0000000..e554596 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1-arm64.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-1-armv7.cmake b/tools/polly/ios-nocodesign-10-1-armv7.cmake new file mode 100644 index 0000000..f41fadf --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1-armv7.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-1-dep-8-0-device-libcxx-hid-sections-lto.cmake b/tools/polly/ios-nocodesign-10-1-dep-8-0-device-libcxx-hid-sections-lto.cmake new file mode 100644 index 0000000..d980aa0 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1-dep-8-0-device-libcxx-hid-sections-lto.cmake @@ -0,0 +1,76 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_DEP_8_0_DEVICE_LIBCXX_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_DEP_8_0_DEVICE_LIBCXX_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") diff --git a/tools/polly/ios-nocodesign-10-1-dep-8-0-libcxx-hid-sections-lto.cmake b/tools/polly/ios-nocodesign-10-1-dep-8-0-libcxx-hid-sections-lto.cmake new file mode 100644 index 0000000..00dc00a --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1-dep-8-0-libcxx-hid-sections-lto.cmake @@ -0,0 +1,76 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_DEP_8_0_LIBCXX_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_DEP_8_0_LIBCXX_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") diff --git a/tools/polly/ios-nocodesign-10-1-dep-9-0-device-libcxx-hid-sections-lto.cmake b/tools/polly/ios-nocodesign-10-1-dep-9-0-device-libcxx-hid-sections-lto.cmake new file mode 100644 index 0000000..ac1e6a7 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1-dep-9-0-device-libcxx-hid-sections-lto.cmake @@ -0,0 +1,76 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support / hidden / data-sections / function-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") diff --git a/tools/polly/ios-nocodesign-10-1-wo-armv7s.cmake b/tools/polly/ios-nocodesign-10-1-wo-armv7s.cmake new file mode 100644 index 0000000..59df2bc --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1-wo-armv7s.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / No armv7s / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-1.cmake b/tools/polly/ios-nocodesign-10-1.cmake new file mode 100644 index 0000000..8cb178c --- /dev/null +++ b/tools/polly/ios-nocodesign-10-1.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_1_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-2.cmake b/tools/polly/ios-nocodesign-10-2.cmake new file mode 100644 index 0000000..87c5f95 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-2.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_2_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_2_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-3-arm64-dep-9-0-device-libcxx-hid-sections.cmake b/tools/polly/ios-nocodesign-10-3-arm64-dep-9-0-device-libcxx-hid-sections.cmake new file mode 100644 index 0000000..7d22cea --- /dev/null +++ b/tools/polly/ios-nocodesign-10-3-arm64-dep-9-0-device-libcxx-hid-sections.cmake @@ -0,0 +1,75 @@ +# Copyright (c) 2015-2017, Tomas Zemaitis +# Copyright (c) 2016-2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_3_ARM64_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_3_ARM64_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} / Universal (arm64) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") diff --git a/tools/polly/ios-nocodesign-10-3-arm64.cmake b/tools/polly/ios-nocodesign-10-3-arm64.cmake new file mode 100644 index 0000000..a5a517a --- /dev/null +++ b/tools/polly/ios-nocodesign-10-3-arm64.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-3-armv7.cmake b/tools/polly/ios-nocodesign-10-3-armv7.cmake new file mode 100644 index 0000000..ac3a02b --- /dev/null +++ b/tools/polly/ios-nocodesign-10-3-armv7.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-3-cxx14.cmake b/tools/polly/ios-nocodesign-10-3-cxx14.cmake new file mode 100644 index 0000000..45beab8 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-3-cxx14.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_3_CXX14_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_3_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-10-3-dep-9-0-bitcode.cmake b/tools/polly/ios-nocodesign-10-3-dep-9-0-bitcode.cmake new file mode 100644 index 0000000..9577f17 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-3-dep-9-0-bitcode.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2014-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_3_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_3_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-10-3-wo-armv7s.cmake b/tools/polly/ios-nocodesign-10-3-wo-armv7s.cmake new file mode 100644 index 0000000..82b6700 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-3-wo-armv7s.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_3_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_3_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / No armv7s / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-10-3.cmake b/tools/polly/ios-nocodesign-10-3.cmake new file mode 100644 index 0000000..4053b61 --- /dev/null +++ b/tools/polly/ios-nocodesign-10-3.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_10_3_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_10_3_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 10.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-11-0-arm64-dep-9-0-device-libcxx-hid-sections.cmake b/tools/polly/ios-nocodesign-11-0-arm64-dep-9-0-device-libcxx-hid-sections.cmake new file mode 100644 index 0000000..fa20756 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-0-arm64-dep-9-0-device-libcxx-hid-sections.cmake @@ -0,0 +1,75 @@ +# Copyright (c) 2015, Tomas Zemaitis +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_0_ARM64_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_0_ARM64_DEP_9_0_DEVICE_LIBCXX_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.0) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") + +polly_init( + "iOS ${IOS_SDK_VERSION} / Universal (arm64) / \ +Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") diff --git a/tools/polly/ios-nocodesign-11-0-dep-9-0-bitcode-cxx11.cmake b/tools/polly/ios-nocodesign-11-0-dep-9-0-bitcode-cxx11.cmake new file mode 100644 index 0000000..4fa17bc --- /dev/null +++ b/tools/polly/ios-nocodesign-11-0-dep-9-0-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_0_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_0_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.0) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-11-0.cmake b/tools/polly/ios-nocodesign-11-0.cmake new file mode 100644 index 0000000..c4fe917 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-0.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_0_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_0_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-1-dep-9-0-bitcode-cxx11.cmake b/tools/polly/ios-nocodesign-11-1-dep-9-0-bitcode-cxx11.cmake new file mode 100644 index 0000000..1928638 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-1-dep-9-0-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_1_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_1_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-11-1-dep-9-0-wo-armv7s-bitcode-cxx11.cmake b/tools/polly/ios-nocodesign-11-1-dep-9-0-wo-armv7s-bitcode-cxx11.cmake new file mode 100644 index 0000000..4410dae --- /dev/null +++ b/tools/polly/ios-nocodesign-11-1-dep-9-0-wo-armv7s-bitcode-cxx11.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_1_DEP_9_0_WO_ARMV7S_BITCODE_CXX11_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_1_DEP_9_0_WO_ARMV7S_BITCODE_CXX11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +armv7 arm64 / i386 x86_64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-11-1.cmake b/tools/polly/ios-nocodesign-11-1.cmake new file mode 100644 index 0000000..cda6519 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-1.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_1_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-2-dep-8-0-wo-armv7s-bitcode-cxx11.cmake b/tools/polly/ios-nocodesign-11-2-dep-8-0-wo-armv7s-bitcode-cxx11.cmake new file mode 100644 index 0000000..e80248d --- /dev/null +++ b/tools/polly/ios-nocodesign-11-2-dep-8-0-wo-armv7s-bitcode-cxx11.cmake @@ -0,0 +1,45 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_2_DEP_8_0_WO_ARMV7S_BITCODE_CXX11_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_2_DEP_8_0_WO_ARMV7S_BITCODE_CXX11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 8.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +armv7 arm64 / i386 x86_64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-11-2-dep-9-0-bitcode-cxx11.cmake b/tools/polly/ios-nocodesign-11-2-dep-9-0-bitcode-cxx11.cmake new file mode 100644 index 0000000..67d6571 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-2-dep-9-0-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_2_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_2_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-11-2-dep-9-3-arm64-armv7.cmake b/tools/polly/ios-nocodesign-11-2-dep-9-3-arm64-armv7.cmake new file mode 100644 index 0000000..366157d --- /dev/null +++ b/tools/polly/ios-nocodesign-11-2-dep-9-3-arm64-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_ARM64_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_ARM64_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (arm64 armv7) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-2-dep-9-3-arm64.cmake b/tools/polly/ios-nocodesign-11-2-dep-9-3-arm64.cmake new file mode 100644 index 0000000..5aaf553 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-2-dep-9-3-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-2-dep-9-3-armv7.cmake b/tools/polly/ios-nocodesign-11-2-dep-9-3-armv7.cmake new file mode 100644 index 0000000..8eb0ad2 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-2-dep-9-3-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-2-dep-9-3-i386-armv7.cmake b/tools/polly/ios-nocodesign-11-2-dep-9-3-i386-armv7.cmake new file mode 100644 index 0000000..4339879 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-2-dep-9-3-i386-armv7.cmake @@ -0,0 +1,43 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_I386_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_I386_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / \ +${POLLY_XCODE_COMPILER} / \ +i386 / armv7 / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS i386) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-2-dep-9-3.cmake b/tools/polly/ios-nocodesign-11-2-dep-9-3.cmake new file mode 100644 index 0000000..ab41103 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-2-dep-9-3.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_2_DEP_9_3_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-2.cmake b/tools/polly/ios-nocodesign-11-2.cmake new file mode 100644 index 0000000..efef5c3 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-2.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_2_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_2_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-3-dep-9-0-bitcode-cxx11.cmake b/tools/polly/ios-nocodesign-11-3-dep-9-0-bitcode-cxx11.cmake new file mode 100644 index 0000000..38a3f2e --- /dev/null +++ b/tools/polly/ios-nocodesign-11-3-dep-9-0-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_3_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_3_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-11-3-dep-9-3-arm64.cmake b/tools/polly/ios-nocodesign-11-3-dep-9-3-arm64.cmake new file mode 100644 index 0000000..4e535f9 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-3-dep-9-3-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_3_DEP_9_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_3_DEP_9_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-3-dep-9-3-armv7.cmake b/tools/polly/ios-nocodesign-11-3-dep-9-3-armv7.cmake new file mode 100644 index 0000000..2232022 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-3-dep-9-3-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_3_DEP_9_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_3_DEP_9_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-3-dep-9-3.cmake b/tools/polly/ios-nocodesign-11-3-dep-9-3.cmake new file mode 100644 index 0000000..a483068 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-3-dep-9-3.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_3_DEP_9_3_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_3_DEP_9_3_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.3) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-4-dep-9-0-bitcode-cxx11.cmake b/tools/polly/ios-nocodesign-11-4-dep-9-0-bitcode-cxx11.cmake new file mode 100644 index 0000000..86f2da0 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-4-dep-9-0-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_4_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_4_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-11-4-dep-9-3-arm64.cmake b/tools/polly/ios-nocodesign-11-4-dep-9-3-arm64.cmake new file mode 100644 index 0000000..5f9ec7b --- /dev/null +++ b/tools/polly/ios-nocodesign-11-4-dep-9-3-arm64.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_4_DEP_9_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_4_DEP_9_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-4-dep-9-3-armv7.cmake b/tools/polly/ios-nocodesign-11-4-dep-9-3-armv7.cmake new file mode 100644 index 0000000..1c37696 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-4-dep-9-3-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_4_DEP_9_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_4_DEP_9_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-11-4-dep-9-3.cmake b/tools/polly/ios-nocodesign-11-4-dep-9-3.cmake new file mode 100644 index 0000000..cb81e20 --- /dev/null +++ b/tools/polly/ios-nocodesign-11-4-dep-9-3.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_11_4_DEP_9_3_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_11_4_DEP_9_3_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 11.4) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-12-0-dep-9-0-bitcode-cxx11.cmake b/tools/polly/ios-nocodesign-12-0-dep-9-0-bitcode-cxx11.cmake new file mode 100644 index 0000000..93d6585 --- /dev/null +++ b/tools/polly/ios-nocodesign-12-0-dep-9-0-bitcode-cxx11.cmake @@ -0,0 +1,44 @@ +# Copyright (c) 2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_12_0_DEP_9_0_BITCODE_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_12_0_DEP_9_0_BITCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 12.0) +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +bitcode / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/bitcode.cmake") # after os/iphone.cmake diff --git a/tools/polly/ios-nocodesign-12-1-dep-9-3-armv7.cmake b/tools/polly/ios-nocodesign-12-1-dep-9-3-armv7.cmake new file mode 100644 index 0000000..153852f --- /dev/null +++ b/tools/polly/ios-nocodesign-12-1-dep-9-3-armv7.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_12_1_DEP_9_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_12_1_DEP_9_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 12.1) +set(IOS_DEPLOYMENT_SDK_VERSION 9.3) + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) + +set(CMAKE_MACOSX_BUNDLE YES) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/ios_nocodesign.cmake") + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-8-1.cmake b/tools/polly/ios-nocodesign-8-1.cmake new file mode 100644 index 0000000..6cfce5c --- /dev/null +++ b/tools/polly/ios-nocodesign-8-1.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_8_1_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_8_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-8-4.cmake b/tools/polly/ios-nocodesign-8-4.cmake new file mode 100644 index 0000000..9b87e07 --- /dev/null +++ b/tools/polly/ios-nocodesign-8-4.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_8_4_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_8_4_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.4) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-1-arm64.cmake b/tools/polly/ios-nocodesign-9-1-arm64.cmake new file mode 100644 index 0000000..aa6a75e --- /dev/null +++ b/tools/polly/ios-nocodesign-9-1-arm64.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2015, Ruslan Baratov & Luca Martini +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_1_ARM64_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_1_ARM64_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} arm64 (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-1-armv7.cmake b/tools/polly/ios-nocodesign-9-1-armv7.cmake new file mode 100644 index 0000000..44eeba1 --- /dev/null +++ b/tools/polly/ios-nocodesign-9-1-armv7.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2015, Ruslan Baratov & Luca Martini +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_1_ARMV7_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_1_ARMV7_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} armv7 (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-1.cmake b/tools/polly/ios-nocodesign-9-1.cmake new file mode 100644 index 0000000..3f2fc8b --- /dev/null +++ b/tools/polly/ios-nocodesign-9-1.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014, Ruslan Baratov & Luca Martini +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_1_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_1_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-2-arm64.cmake b/tools/polly/ios-nocodesign-9-2-arm64.cmake new file mode 100644 index 0000000..74fe6b0 --- /dev/null +++ b/tools/polly/ios-nocodesign-9-2-arm64.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2015, Ruslan Baratov & Michele Caini +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_2_ARM64_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_2_ARM64_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} arm64 (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-2-armv7.cmake b/tools/polly/ios-nocodesign-9-2-armv7.cmake new file mode 100644 index 0000000..fc5c493 --- /dev/null +++ b/tools/polly/ios-nocodesign-9-2-armv7.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2015, Ruslan Baratov & Michele Caini +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_2_ARMV7_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_2_ARMV7_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} armv7 (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-2.cmake b/tools/polly/ios-nocodesign-9-2.cmake new file mode 100644 index 0000000..a6ed044 --- /dev/null +++ b/tools/polly/ios-nocodesign-9-2.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014, Ruslan Baratov & Michele Caini +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_2_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_2_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.2) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-3-arm64.cmake b/tools/polly/ios-nocodesign-9-3-arm64.cmake new file mode 100644 index 0000000..9a40491 --- /dev/null +++ b/tools/polly/ios-nocodesign-9-3-arm64.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_3_ARM64_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_3_ARM64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / arm64 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-3-armv7.cmake b/tools/polly/ios-nocodesign-9-3-armv7.cmake new file mode 100644 index 0000000..486e9b2 --- /dev/null +++ b/tools/polly/ios-nocodesign-9-3-armv7.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_3_ARMV7_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_3_ARMV7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / armv7 / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-3-device-hid-sections.cmake b/tools/polly/ios-nocodesign-9-3-device-hid-sections.cmake new file mode 100644 index 0000000..04e425a --- /dev/null +++ b/tools/polly/ios-nocodesign-9-3-device-hid-sections.cmake @@ -0,0 +1,71 @@ +# Copyright (c) 2016, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_3_DEVICE_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_3_DEVICE_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/ios-nocodesign-9-3-device.cmake b/tools/polly/ios-nocodesign-9-3-device.cmake new file mode 100644 index 0000000..248ebc2 --- /dev/null +++ b/tools/polly/ios-nocodesign-9-3-device.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_3_DEVICE_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_3_DEVICE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Universal (arm64 armv7s armv7) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-3-wo-armv7s.cmake b/tools/polly/ios-nocodesign-9-3-wo-armv7s.cmake new file mode 100644 index 0000000..8c58c6d --- /dev/null +++ b/tools/polly/ios-nocodesign-9-3-wo-armv7s.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_3_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_3_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / No armv7s / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-9-3.cmake b/tools/polly/ios-nocodesign-9-3.cmake new file mode 100644 index 0000000..f7602ea --- /dev/null +++ b/tools/polly/ios-nocodesign-9-3.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_9_3_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_9_3_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 9.3) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-arm64.cmake b/tools/polly/ios-nocodesign-arm64.cmake new file mode 100644 index 0000000..5807dd5 --- /dev/null +++ b/tools/polly/ios-nocodesign-arm64.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_ARM64_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_ARM64_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS arm64) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-armv7.cmake b/tools/polly/ios-nocodesign-armv7.cmake new file mode 100644 index 0000000..2fe075e --- /dev/null +++ b/tools/polly/ios-nocodesign-armv7.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_ARMV7_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_ARMV7_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7) +set(IPHONESIMULATOR_ARCHS "") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign-dep-9-0-cxx14.cmake b/tools/polly/ios-nocodesign-dep-9-0-cxx14.cmake new file mode 100644 index 0000000..49fd881 --- /dev/null +++ b/tools/polly/ios-nocodesign-dep-9-0-cxx14.cmake @@ -0,0 +1,68 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_DEP_9_0_CXX14_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_DEP_9_0_CXX14_CMAKE_ 1) +endif() + + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_module_path.cmake") +include(polly_clear_environment_variables) +include(polly_init) +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone-default-sdk.cmake") # -> IOS_SDK_VERSION + + +set(IOS_DEPLOYMENT_SDK_VERSION 9.0) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} / Deployment ${IOS_DEPLOYMENT_SDK_VERSION} / Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include(polly_common) +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios-nocodesign-hid-sections.cmake b/tools/polly/ios-nocodesign-hid-sections.cmake new file mode 100644 index 0000000..6a6c801 --- /dev/null +++ b/tools/polly/ios-nocodesign-hid-sections.cmake @@ -0,0 +1,71 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_HID_SECTIONS_CMAKE) + return() +else() + set(POLLY_IOS_NOCODESIGN_HID_SECTIONS_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / function-sections / data-sections / hidden visibility / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;armv7s;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") diff --git a/tools/polly/ios-nocodesign-wo-armv7s.cmake b/tools/polly/ios-nocodesign-wo-armv7s.cmake new file mode 100644 index 0000000..482d1e1 --- /dev/null +++ b/tools/polly/ios-nocodesign-wo-armv7s.cmake @@ -0,0 +1,67 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_WO_ARMV7S_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_WO_ARMV7S_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_clear_environment_variables.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(IOS_SDK_VERSION 8.1) +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / No armv7s / \ +${POLLY_XCODE_COMPILER} / \ +No code sign / \ +c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +set(IPHONEOS_ARCHS armv7;arm64) +set(IPHONESIMULATOR_ARCHS i386;x86_64) + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ios-nocodesign.cmake b/tools/polly/ios-nocodesign.cmake new file mode 100644 index 0000000..c39c26d --- /dev/null +++ b/tools/polly/ios-nocodesign.cmake @@ -0,0 +1,73 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_NOCODESIGN_CMAKE_) + return() +else() + set(POLLY_IOS_NOCODESIGN_CMAKE_ 1) +endif() + + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_module_path.cmake") +include(polly_clear_environment_variables) +include(polly_init) +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone-default-sdk.cmake") # -> IOS_SDK_VERSION + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include(polly_common) +include(polly_fatal_error) + +# Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +# Verify XCODE_XCCONFIG_FILE +set( + _polly_xcode_xcconfig_file_path + "${CMAKE_CURRENT_LIST_DIR}/scripts/NoCodeSign.xcconfig" +) +if(NOT EXISTS "$ENV{XCODE_XCCONFIG_FILE}") + polly_fatal_error( + "Path specified by XCODE_XCCONFIG_FILE environment variable not found" + "($ENV{XCODE_XCCONFIG_FILE})" + "Use this command to set: " + " export XCODE_XCCONFIG_FILE=${_polly_xcode_xcconfig_file_path}" + ) +else() + string( + COMPARE + NOTEQUAL + "$ENV{XCODE_XCCONFIG_FILE}" + "${_polly_xcode_xcconfig_file_path}" + _polly_wrong_xcconfig_path + ) + if(_polly_wrong_xcconfig_path) + polly_fatal_error( + "Unexpected XCODE_XCCONFIG_FILE value: " + " $ENV{XCODE_XCCONFIG_FILE}" + "expected: " + " ${_polly_xcode_xcconfig_file_path}" + ) + endif() +endif() + +# 32 bits support was dropped from iPhoneSdk11.0 +if(IOS_SDK_VERSION VERSION_LESS "11.0") + set(IPHONEOS_ARCHS armv7;armv7s;arm64) + set(IPHONESIMULATOR_ARCHS i386;x86_64) +else() + polly_status_debug("iPhone11.0+ SDK detected, forcing 64 bits builds.") + set(IPHONEOS_ARCHS arm64) + set(IPHONESIMULATOR_ARCHS x86_64) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/ios.cmake b/tools/polly/ios.cmake new file mode 100644 index 0000000..0b00532 --- /dev/null +++ b/tools/polly/ios.cmake @@ -0,0 +1,48 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_IOS_CMAKE_) + return() +else() + set(POLLY_IOS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_module_path.cmake") +include(polly_clear_environment_variables) +include(polly_init) +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone-default-sdk.cmake") # -> IOS_SDK_VERSION + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "iOS ${IOS_SDK_VERSION} Universal (iphoneos + iphonesimulator) / \ +${POLLY_XCODE_COMPILER} / \ +c++14 support" + "Xcode" +) + +include(polly_common) +include(polly_fatal_error) + +# # Fix try_compile +include(polly_ios_bundle_identifier) +set(CMAKE_MACOSX_BUNDLE YES) + +set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer") + +# 32 bits support was dropped from iPhoneSdk11.0 +if(IOS_SDK_VERSION VERSION_LESS "11.0") + set(IPHONEOS_ARCHS armv7;armv7s;arm64) + set(IPHONESIMULATOR_ARCHS i386;x86_64) +else() + polly_status_debug("iPhone11.0+ SDK detected, forcing 64 bits builds.") + set(IPHONEOS_ARCHS arm64) + set(IPHONESIMULATOR_ARCHS x86_64) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/iphone.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +if(NOT IOS_SDK_VERSION VERSION_LESS 10.0) + include(polly_ios_development_team) +endif() diff --git a/tools/polly/libcxx-fpic-hid-sections.cmake b/tools/polly/libcxx-fpic-hid-sections.cmake new file mode 100644 index 0000000..35b84ed --- /dev/null +++ b/tools/polly/libcxx-fpic-hid-sections.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2013, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_CXX11_FPIC_HID_SECTIONS_) + return() +else() + set(POLLY_CLANG_LIBCXX_CXX11_FPIC_HID_SECTIONS_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / \ +c++11 support / hidden / data-sections / function-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/libcxx-hid-fpic.cmake b/tools/polly/libcxx-hid-fpic.cmake new file mode 100644 index 0000000..f734377 --- /dev/null +++ b/tools/polly/libcxx-hid-fpic.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013, Ruslan Baratov, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_CXX11_HID_FPIC) + return() +else() + set(POLLY_CLANG_LIBCXX_CXX11_HID_FPIC 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++11 support / hidden / FPIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/libcxx-hid-sections.cmake b/tools/polly/libcxx-hid-sections.cmake new file mode 100644 index 0000000..c3fb28d --- /dev/null +++ b/tools/polly/libcxx-hid-sections.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2013, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_CXX11_HID_SECTIONS_) + return() +else() + set(POLLY_CLANG_LIBCXX_CXX11_HID_SECTIONS_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / \ +c++11 support / hidden / data-sections / function-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/libcxx-hid.cmake b/tools/polly/libcxx-hid.cmake new file mode 100644 index 0000000..4a9793e --- /dev/null +++ b/tools/polly/libcxx-hid.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_CXX11_HID_) + return() +else() + set(POLLY_CLANG_LIBCXX_CXX11_HID_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++11 support / hidden" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/libcxx-no-sdk.cmake b/tools/polly/libcxx-no-sdk.cmake new file mode 100644 index 0000000..84482b2 --- /dev/null +++ b/tools/polly/libcxx-no-sdk.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2013-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_NO_SDK_CMAKE_) + return() +else() + set(POLLY_CLANG_LIBCXX_NO_SDK_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++11 support / No OSX SDK" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/libcxx.cmake b/tools/polly/libcxx.cmake new file mode 100644 index 0000000..8cbf974 --- /dev/null +++ b/tools/polly/libcxx.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_CXX11_CMAKE) + return() +else() + set(POLLY_CLANG_LIBCXX_CXX11_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/libcxx14.cmake b/tools/polly/libcxx14.cmake new file mode 100644 index 0000000..15b2562 --- /dev/null +++ b/tools/polly/libcxx14.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013-2018, Ruslan Baratov +# Copyright (c) 2018, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_CLANG_LIBCXX_CXX14_CMAKE) + return() +else() + set(POLLY_CLANG_LIBCXX_CXX14_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "clang / LLVM Standard C++ Library (libc++) / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/library/std/libcxx.cmake b/tools/polly/library/std/libcxx.cmake new file mode 100644 index 0000000..1a11f8d --- /dev/null +++ b/tools/polly/library/std/libcxx.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2013, 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_LIBRARY_STD_LIBCXX_CMAKE) + return() +else() + set(POLLY_LIBRARY_STD_LIBCXX_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-stdlib=libc++") + +if(XCODE) + if(XCODE_VERSION VERSION_LESS 6) + polly_add_cache_flag(CMAKE_EXE_LINKER_FLAGS "-stdlib=libc++") + polly_add_cache_flag(CMAKE_SHARED_LINKER_FLAGS "-stdlib=libc++") + endif() +endif() diff --git a/tools/polly/library/std/libstdcxx.cmake b/tools/polly/library/std/libstdcxx.cmake new file mode 100644 index 0000000..2821866 --- /dev/null +++ b/tools/polly/library/std/libstdcxx.cmake @@ -0,0 +1,14 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_LIBRARY_STD_LIBSTDCXX_CMAKE) + return() +else() + set(POLLY_LIBRARY_STD_LIBSTDCXX_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-stdlib=libstdc++") +polly_add_cache_flag(CMAKE_EXE_LINKER_FLAGS "-stdlib=libstdc++") +polly_add_cache_flag(CMAKE_SHARED_LINKER_FLAGS "-stdlib=libstdc++") diff --git a/tools/polly/library/std/nolibs.cmake b/tools/polly/library/std/nolibs.cmake new file mode 100644 index 0000000..282a56e --- /dev/null +++ b/tools/polly/library/std/nolibs.cmake @@ -0,0 +1,13 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_LIBRARY_STD_NOLIBS_CMAKE) + return() +else() + set(POLLY_LIBRARY_STD_NOLIBS_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-nostdinc++") +polly_add_cache_flag(CMAKE_EXE_LINKER_FLAGS "-nodefaultlibs") diff --git a/tools/polly/linux-gcc-armhf-neon-vfpv4.cmake b/tools/polly/linux-gcc-armhf-neon-vfpv4.cmake new file mode 100644 index 0000000..1c0ab13 --- /dev/null +++ b/tools/polly/linux-gcc-armhf-neon-vfpv4.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +# install cross compiler on Ubuntu +# - sudo apt install g++-arm-linux-gnueabihf +# - with gfortran: sudo apt install gfortran-arm-linux-gnueabihf + +if(DEFINED POLLY_LINUX_GCC_ARMHF_NEON_VFPV4_) + return() +else() + set(POLLY_LINUX_GCC_ARMHF_NEON_VFPV4_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Linux / gcc / armhf / c++11 support / neon-vfpv4" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +# set system name, this sets the variable CMAKE_CROSSCOMPILING +set(CMAKE_SYSTEM_NAME Linux) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "arm-linux-gnueabihf") +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-arm) # used for try_run calls + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hardfloat.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/neon-vfpv4.cmake") + diff --git a/tools/polly/linux-gcc-armhf-neon.cmake b/tools/polly/linux-gcc-armhf-neon.cmake new file mode 100644 index 0000000..0a1ad64 --- /dev/null +++ b/tools/polly/linux-gcc-armhf-neon.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +# install cross compiler on Ubuntu +# - sudo apt install g++-arm-linux-gnueabihf +# - with gfortran: sudo apt install gfortran-arm-linux-gnueabihf + +if(DEFINED POLLY_LINUX_GCC_ARMHF_NEON_) + return() +else() + set(POLLY_LINUX_GCC_ARMHF_NEON_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Linux / gcc / armhf / c++11 support / neon" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +# set system name, this sets the variable CMAKE_CROSSCOMPILING +set(CMAKE_SYSTEM_NAME Linux) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "arm-linux-gnueabihf") +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-arm) # used for try_run calls + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hardfloat.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/neon.cmake") + diff --git a/tools/polly/linux-gcc-armhf.cmake b/tools/polly/linux-gcc-armhf.cmake new file mode 100644 index 0000000..cd5fc9f --- /dev/null +++ b/tools/polly/linux-gcc-armhf.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +# install cross compiler on Ubuntu +# - sudo apt install g++-arm-linux-gnueabihf +# - with gfortran: sudo apt install gfortran-arm-linux-gnueabihf + +if(DEFINED POLLY_LINUX_GCC_ARMHF_) + return() +else() + set(POLLY_LINUX_GCC_ARMHF_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Linux / gcc / armhf / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +# set system name, this sets the variable CMAKE_CROSSCOMPILING +set(CMAKE_SYSTEM_NAME Linux) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "arm-linux-gnueabihf") +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-arm) # used for try_run calls + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hardfloat.cmake") + diff --git a/tools/polly/linux-gcc-jetson-tk1.cmake b/tools/polly/linux-gcc-jetson-tk1.cmake new file mode 100644 index 0000000..e5dce65 --- /dev/null +++ b/tools/polly/linux-gcc-jetson-tk1.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +# install cross compiler on Ubuntu +# - sudo apt install g++-arm-linux-gnueabihf +# - with gfortran: sudo apt install gfortran-arm-linux-gnueabihf + +if(DEFINED POLLY_LINUX_GCC_JETSON_TK1_) + return() +else() + set(POLLY_LINUX_GCC_JETSON_TK1_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Linux / gcc / armhf / c++11 support / neon-vfpv4 / cortex-a15" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +# set system name, this sets the variable CMAKE_CROSSCOMPILING +set(CMAKE_SYSTEM_NAME Linux) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "arm-linux-gnueabihf") +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-arm) # used for try_run calls + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hardfloat.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/neon-vfpv4.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/mtune_cortex-a15.cmake") + diff --git a/tools/polly/linux-gcc-x64.cmake b/tools/polly/linux-gcc-x64.cmake new file mode 100644 index 0000000..c771c53 --- /dev/null +++ b/tools/polly/linux-gcc-x64.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_LINUX_GCC_X64_) + return() +else() + set(POLLY_LINUX_GCC_X64_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Linux / gcc / x86_64 / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "x86_64-pc-linux") + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static.cmake") diff --git a/tools/polly/linux-mingw-w32.cmake b/tools/polly/linux-mingw-w32.cmake new file mode 100644 index 0000000..f233a8c --- /dev/null +++ b/tools/polly/linux-mingw-w32.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_LINUX_MINGW_W32_) + return() +else() + set(POLLY_LINUX_MINGW_W32_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Windows / mingw-w64 / i686 / c++11 support / static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +# need to set system name for cross compiling from linux to windows +set(CMAKE_SYSTEM_NAME Windows) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "i686-w64-mingw32") +set(CMAKE_CROSSCOMPILING_EMULATOR wine64) # used for try_run calls + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static.cmake") + diff --git a/tools/polly/linux-mingw-w64-cxx98.cmake b/tools/polly/linux-mingw-w64-cxx98.cmake new file mode 100644 index 0000000..3427738 --- /dev/null +++ b/tools/polly/linux-mingw-w64-cxx98.cmake @@ -0,0 +1,28 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_LINUX_MINGW_W64_CXX98_) + return() +else() + set(POLLY_LINUX_MINGW_W64_CXX98_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Windows / mingw-w64 / x86_64 / c++98 support / static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +# need to set system name for cross compiling from linux to windows +set(CMAKE_SYSTEM_NAME Windows) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "x86_64-w64-mingw32") +set(CMAKE_CROSSCOMPILING_EMULATOR wine64) # used for try_run calls + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/static.cmake") diff --git a/tools/polly/linux-mingw-w64-gnuxx11.cmake b/tools/polly/linux-mingw-w64-gnuxx11.cmake new file mode 100644 index 0000000..21319d8 --- /dev/null +++ b/tools/polly/linux-mingw-w64-gnuxx11.cmake @@ -0,0 +1,28 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_LINUX_MINGW_W64_GNUXX11_) + return() +else() + set(POLLY_LINUX_MINGW_W64_GNUXX11_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Windows / mingw-w64 / x86_64 / gnu++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +# need to set system name for cross compiling from linux to windows +set(CMAKE_SYSTEM_NAME Windows) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "x86_64-w64-mingw32") +set(CMAKE_CROSSCOMPILING_EMULATOR wine64) # used for try_run calls + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/gnuxx11.cmake") + diff --git a/tools/polly/linux-mingw-w64.cmake b/tools/polly/linux-mingw-w64.cmake new file mode 100644 index 0000000..1f26709 --- /dev/null +++ b/tools/polly/linux-mingw-w64.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2017, NeroBurner +# All rights reserved. + +if(DEFINED POLLY_LINUX_MINGW_W64_) + return() +else() + set(POLLY_LINUX_MINGW_W64_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Windows / mingw-w64 / x86_64 / c++11 support / static" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +# need to set system name for cross compiling from linux to windows +set(CMAKE_SYSTEM_NAME Windows) +set(CROSS_COMPILE_TOOLCHAIN_PREFIX "x86_64-w64-mingw32") +set(CMAKE_CROSSCOMPILING_EMULATOR wine64) # used for try_run calls + +include( + "${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-simple-layout.cmake" +) +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static.cmake") + diff --git a/tools/polly/mingw-c11.cmake b/tools/polly/mingw-c11.cmake new file mode 100644 index 0000000..faa1c2a --- /dev/null +++ b/tools/polly/mingw-c11.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_MINGW_CMAKE_) + return() +else() + set(POLLY_MINGW_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "mingw / gcc / c++11 support / C11" + "MinGW Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/c11.cmake") diff --git a/tools/polly/mingw-cxx14.cmake b/tools/polly/mingw-cxx14.cmake new file mode 100644 index 0000000..76cd749 --- /dev/null +++ b/tools/polly/mingw-cxx14.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_MINGW_CXX14_CMAKE_) + return() +else() + set(POLLY_MINGW_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "mingw / gcc / c++14 support" + "MinGW Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/mingw-cxx17.cmake b/tools/polly/mingw-cxx17.cmake new file mode 100644 index 0000000..b660210 --- /dev/null +++ b/tools/polly/mingw-cxx17.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_MINGW_CXX17_CMAKE_) + return() +else() + set(POLLY_MINGW_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "mingw / gcc / c++17 support" + "MinGW Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") diff --git a/tools/polly/mingw.cmake b/tools/polly/mingw.cmake new file mode 100644 index 0000000..165e335 --- /dev/null +++ b/tools/polly/mingw.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_MINGW_CMAKE_) + return() +else() + set(POLLY_MINGW_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "mingw / gcc / c++11 support" + "MinGW Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/msys-cxx14.cmake b/tools/polly/msys-cxx14.cmake new file mode 100644 index 0000000..6e1d0b2 --- /dev/null +++ b/tools/polly/msys-cxx14.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_MSYS_CXX14_CMAKE_) + return() +else() + set(POLLY_MSYS_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "MSYS / gcc / c++14 support" + "MSYS Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") diff --git a/tools/polly/msys-cxx17.cmake b/tools/polly/msys-cxx17.cmake new file mode 100644 index 0000000..57e4ca7 --- /dev/null +++ b/tools/polly/msys-cxx17.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_MSYS_CXX17_CMAKE_) + return() +else() + set(POLLY_MSYS_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "MSYS / gcc / c++17 support" + "MSYS Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") diff --git a/tools/polly/msys.cmake b/tools/polly/msys.cmake new file mode 100644 index 0000000..74b4451 --- /dev/null +++ b/tools/polly/msys.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_MSYS_CMAKE_) + return() +else() + set(POLLY_MSYS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "MSYS / gcc / c++11 support" + "MSYS Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/ninja-vs-12-2013-win64.cmake b/tools/polly/ninja-vs-12-2013-win64.cmake new file mode 100644 index 0000000..641d317 --- /dev/null +++ b/tools/polly/ninja-vs-12-2013-win64.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_NINJA_VS_12_2013_WIN64_CMAKE_) + return() +else() + set(POLLY_NINJA_VS_12_2013_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Ninja / Visual Studio 2013 / x64" + "Ninja" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/cl.cmake") diff --git a/tools/polly/ninja-vs-14-2015-win64.cmake b/tools/polly/ninja-vs-14-2015-win64.cmake new file mode 100644 index 0000000..68a3a50 --- /dev/null +++ b/tools/polly/ninja-vs-14-2015-win64.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_NINJA_VS_14_2015_WIN64_CMAKE_) + return() +else() + set(POLLY_NINJA_VS_14_2015_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Ninja / Visual Studio 2015 / x64" + "Ninja" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/cl.cmake") diff --git a/tools/polly/ninja-vs-15-2017-win64-cxx17.cmake b/tools/polly/ninja-vs-15-2017-win64-cxx17.cmake new file mode 100644 index 0000000..1412a9b --- /dev/null +++ b/tools/polly/ninja-vs-15-2017-win64-cxx17.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2016, 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_NINJA_VS_15_2017_WIN64_CXX17_CMAKE_) + return() +else() + set(POLLY_NINJA_VS_15_2017_WIN64_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Ninja / Visual Studio 2017 / x64 / C++17" + "Ninja" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/cl.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-cxx17.cmake") diff --git a/tools/polly/ninja-vs-15-2017-win64.cmake b/tools/polly/ninja-vs-15-2017-win64.cmake new file mode 100644 index 0000000..c4953da --- /dev/null +++ b/tools/polly/ninja-vs-15-2017-win64.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2016, 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_NINJA_VS_15_2017_WIN64_CMAKE_) + return() +else() + set(POLLY_NINJA_VS_15_2017_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Ninja / Visual Studio 2017 / x64" + "Ninja" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/cl.cmake") diff --git a/tools/polly/nmake-vs-12-2013-win64.cmake b/tools/polly/nmake-vs-12-2013-win64.cmake new file mode 100644 index 0000000..50e9540 --- /dev/null +++ b/tools/polly/nmake-vs-12-2013-win64.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_NMAKE_VS_12_2013_WIN64_CMAKE_) + return() +else() + set(POLLY_NMAKE_VS_12_2013_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "NMake / Visual Studio 2013 / x64" + "NMake Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/nmake-vs-12-2013.cmake b/tools/polly/nmake-vs-12-2013.cmake new file mode 100644 index 0000000..20f21ce --- /dev/null +++ b/tools/polly/nmake-vs-12-2013.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_NMAKE_VS_12_2013_CMAKE_) + return() +else() + set(POLLY_NMAKE_VS_12_2013_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "NMake / Visual Studio 2013 / x86" + "NMake Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/nmake-vs-15-2017-win64-cxx17.cmake b/tools/polly/nmake-vs-15-2017-win64-cxx17.cmake new file mode 100644 index 0000000..8e353d9 --- /dev/null +++ b/tools/polly/nmake-vs-15-2017-win64-cxx17.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2014, 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_NMAKE_VS_15_2017_WIN64_CXX17_CMAKE_) + return() +else() + set(POLLY_NMAKE_VS_15_2017_WIN64_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "NMake / Visual Studio 2017 / x64 / C++17" + "NMake Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-cxx17.cmake") diff --git a/tools/polly/nmake-vs-15-2017-win64.cmake b/tools/polly/nmake-vs-15-2017-win64.cmake new file mode 100644 index 0000000..511767f --- /dev/null +++ b/tools/polly/nmake-vs-15-2017-win64.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014, 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_NMAKE_VS_15_2017_WIN64_CMAKE_) + return() +else() + set(POLLY_NMAKE_VS_15_2017_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "NMake / Visual Studio 2017 / x64" + "NMake Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/openbsd-egcc-cxx11-static-std.cmake b/tools/polly/openbsd-egcc-cxx11-static-std.cmake new file mode 100644 index 0000000..f309ea1 --- /dev/null +++ b/tools/polly/openbsd-egcc-cxx11-static-std.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_CLANG_OPENBSD_CMAKE) + return() +else() + set(POLLY_CLANG_OPENBSD_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "openbsd / egcc / GNU Standard C++ Library (libstdc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/egcc.cmake") +#include("${CMAKE_CURRENT_LIST_DIR}/library/std/libstdcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static-std.cmake") + diff --git a/tools/polly/os/android.cmake b/tools/polly/os/android.cmake new file mode 100644 index 0000000..f7e05de --- /dev/null +++ b/tools/polly/os/android.cmake @@ -0,0 +1,64 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OS_ANDROID_CMAKE_) + return() +else() + set(POLLY_OS_ANDROID_CMAKE_ 1) +endif() + +include(polly_fatal_error) + +string(COMPARE EQUAL "${ANDROID_NDK_VERSION}" "" _is_empty) +if(_is_empty) + polly_fatal_error("ANDROID_NDK_VERSION is not defined") +endif() + +set(_env_ndk "$ENV{ANDROID_NDK_${ANDROID_NDK_VERSION}}") +string(COMPARE EQUAL "${_env_ndk}" "" _is_empty) +if(_is_empty) + polly_fatal_error( + "Environment variable 'ANDROID_NDK_${ANDROID_NDK_VERSION}' not set" + ) +endif() + +set(ANDROID_NDK "${_env_ndk}") + +string(COMPARE EQUAL "${CMAKE_SYSTEM_VERSION}" "" _is_empty) +if(_is_empty) + polly_fatal_error("CMAKE_SYSTEM_VERSION is not defined") +endif() + +set(CMAKE_SYSTEM_NAME "Android") + +if(CMAKE_VERSION VERSION_LESS 3.7.1) + polly_fatal_error( + "Minimum CMake version for Android is 3.7.1:" + "* http://polly.readthedocs.io/en/latest/toolchains/android.html#android-ndk-x-api-y" + ) +endif() + +macro(find_host_program) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + if(CMAKE_HOST_WIN32) + set(WIN32 1) + set(UNIX) + elseif(CMAKE_HOST_APPLE) + set(APPLE 1) + set(UNIX) + endif() + find_program(${ARGN}) + set(WIN32) + set(APPLE) + set(UNIX 1) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endmacro() + +# ANDROID macro is not defined by CMake 3.7+, however it is used by +# some packages like OpenCV +# (https://gitlab.kitware.com/cmake/cmake/merge_requests/62) +add_definitions("-DANDROID") diff --git a/tools/polly/os/cygwin.cmake b/tools/polly/os/cygwin.cmake new file mode 100644 index 0000000..cc268a0 --- /dev/null +++ b/tools/polly/os/cygwin.cmake @@ -0,0 +1,12 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OS_CYGWIN_CMAKE_) + return() +else() + set(POLLY_OS_CYGWIN_CMAKE_ 1) +endif() + +include(polly_add_cache_flag) + +polly_add_cache_flag(CMAKE_CXX_FLAGS "-U__STRICT_ANSI__") diff --git a/tools/polly/os/iphone-default-sdk.cmake b/tools/polly/os/iphone-default-sdk.cmake new file mode 100644 index 0000000..6ba5f33 --- /dev/null +++ b/tools/polly/os/iphone-default-sdk.cmake @@ -0,0 +1,73 @@ +# This script sets the following variables : +# IOS_SDK_VERSION : will contain the version number of the default iOS SDK (example : 11.0) +# IPHONEOS_SDK_ROOT : full path to the SDK +# IPHONEOS_ROOT +# XCODE_DEVELOPER_ROOT + +if(DEFINED POLLY_IPHONE_DEFAULT_SDK_CMAKE) + return() +else() + set(POLLY_IPHONE_DEFAULT_SDK_CMAKE 1) +endif() + +include(polly_status_debug) + +# polly_find_xcode_ios_defaults : +# fills +# * XCODE_DEVELOPER_ROOT +# * IPHONEOS_ROOT +# * IPHONEOS_SDK_ROOT +macro (polly_find_xcode_ios_defaults) + find_program(XCODE_SELECT_EXECUTABLE xcode-select) + if(NOT XCODE_SELECT_EXECUTABLE) + polly_fatal_error("xcode-select not found") + endif() + execute_process( + COMMAND + ${XCODE_SELECT_EXECUTABLE} + "-print-path" + OUTPUT_VARIABLE + XCODE_DEVELOPER_ROOT # /.../Xcode.app/Contents/Developer + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE + _XCODE_DEVELOPER_ROOT_STATUS + ) + if(NOT "${_XCODE_DEVELOPER_ROOT_STATUS}" EQUAL "0") + polly_fatal_error("Could not find XCODE_DEVELOPER_ROOT. + The command + ${XCODE_SELECT_EXECUTABLE} -print-path + failed with the following status : ${_XCODE_DEVELOPER_ROOT_STATUS} + ") + endif() + + set(IPHONEOS_ROOT "${XCODE_DEVELOPER_ROOT}/Platforms/iPhoneOS.platform/Developer") + # The defautl SDK is at ${IPHONEOS_ROOT}/SDKs/iPhoneOS.sdk + set(IPHONEOS_SDK_ROOT "${IPHONEOS_ROOT}/SDKs/iPhoneOS.sdk") + polly_status_debug("XCODE_DEVELOPER_ROOT=${XCODE_DEVELOPER_ROOT}") + polly_status_debug("IPHONEOS_ROOT=${IPHONEOS_ROOT}") + polly_status_debug("IPHONEOS_SDK_ROOT=${IPHONEOS_SDK_ROOT}") +endmacro() + +polly_find_xcode_ios_defaults() + +# The version number of the SDK can be accessed by reading the SDKSettings.plist file with the command : +# defaults read ${IPHONEOS_SDK_ROOT}/SDKSettings.plist DefaultDeploymentTarget +execute_process( + COMMAND + "defaults" + read + ${IPHONEOS_SDK_ROOT}/SDKSettings.plist + DefaultDeploymentTarget + RESULT_VARIABLE _POLLY_PROCESS_RESULT + OUTPUT_VARIABLE IOS_SDK_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE +) +if(NOT "${_POLLY_PROCESS_RESULT}" EQUAL "0") + polly_fatal_error("Could not read the iPhoneSDK version (). + The command + defaults read ${IPHONEOS_SDK_ROOT}/SDKSettings.plist DefaultDeploymentTarget + failed with the following status : ${_POLLY_PROCESS_RESULT} + ") +endif() +polly_status_debug("IOS_SDK_VERSION=${IOS_SDK_VERSION}") diff --git a/tools/polly/os/iphone.cmake b/tools/polly/os/iphone.cmake new file mode 100644 index 0000000..30cb297 --- /dev/null +++ b/tools/polly/os/iphone.cmake @@ -0,0 +1,165 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OS_IPHONE_CMAKE) + return() +else() + set(POLLY_OS_IPHONE_CMAKE 1) +endif() + +set(CMAKE_OSX_SYSROOT "iphoneos" CACHE STRING "System root for iOS" FORCE) +set(CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos;-iphonesimulator") + +# find 'iphoneos' and 'iphonesimulator' roots and version +find_program(XCODE_SELECT_EXECUTABLE xcode-select) +if(NOT XCODE_SELECT_EXECUTABLE) + polly_fatal_error("xcode-select not found") +endif() + +if(XCODE_VERSION VERSION_LESS "5.0.0") + polly_fatal_error("Works since Xcode 5.0.0 (current ver: ${XCODE_VERSION})") +endif() + +if(CMAKE_VERSION VERSION_LESS "3.5") + polly_fatal_error( + "CMake minimum required version for iOS is 3.5 (current ver: ${CMAKE_VERSION})" + ) +endif() + +string(COMPARE EQUAL "$ENV{DEVELOPER_DIR}" "" _is_empty) +if(NOT _is_empty) + polly_status_debug("Developer root (env): $ENV{DEVELOPER_DIR}") +endif() + +execute_process( + COMMAND + ${XCODE_SELECT_EXECUTABLE} + "-print-path" + OUTPUT_VARIABLE + XCODE_DEVELOPER_ROOT # /.../Xcode.app/Contents/Developer + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +polly_status_debug("Developer root: ${XCODE_DEVELOPER_ROOT}") + +find_program(XCODEBUILD_EXECUTABLE xcodebuild) +if(NOT XCODEBUILD_EXECUTABLE) + polly_fatal_error("xcodebuild not found") +endif() + +# Check version exists +execute_process( + COMMAND + "${XCODEBUILD_EXECUTABLE}" + -showsdks + -sdk + "iphoneos${IOS_SDK_VERSION}" + RESULT_VARIABLE + IOS_SDK_VERSION_RESULT + OUTPUT_QUIET + ERROR_QUIET +) +if(NOT "${IOS_SDK_VERSION_RESULT}" EQUAL 0) + polly_fatal_error("iOS version `${IOS_SDK_VERSION}` not found (${IOS_SDK_VERSION_RESULT})") +endif() + +# iPhone simulator root +set( + IPHONESIMULATOR_ROOT + "${XCODE_DEVELOPER_ROOT}/Platforms/iPhoneSimulator.platform/Developer" +) +if(NOT EXISTS "${IPHONESIMULATOR_ROOT}") + polly_fatal_error( + "IPHONESIMULATOR_ROOT not found (${IPHONESIMULATOR_ROOT})\n" + "XCODE_DEVELOPER_ROOT: ${XCODE_DEVELOPER_ROOT}\n" + ) +endif() + +# iPhone simulator SDK root +set( + IPHONESIMULATOR_SDK_ROOT + "${IPHONESIMULATOR_ROOT}/SDKs/iPhoneSimulator${IOS_SDK_VERSION}.sdk" +) + +if(NOT EXISTS ${IPHONESIMULATOR_SDK_ROOT}) + polly_fatal_error( + "IPHONESIMULATOR_SDK_ROOT not found (${IPHONESIMULATOR_SDK_ROOT})\n" + "IPHONESIMULATOR_ROOT: ${IPHONESIMULATOR_ROOT}\n" + "IOS_SDK_VERSION: ${IOS_SDK_VERSION}\n" + ) +endif() + +# iPhone root +set( + IPHONEOS_ROOT + "${XCODE_DEVELOPER_ROOT}/Platforms/iPhoneOS.platform/Developer" +) +if(NOT EXISTS "${IPHONEOS_ROOT}") + polly_fatal_error( + "IPHONEOS_ROOT not found (${IPHONEOS_ROOT})\n" + "XCODE_DEVELOPER_ROOT: ${XCODE_DEVELOPER_ROOT}\n" + ) +endif() + +# iPhone SDK root +set(IPHONEOS_SDK_ROOT "${IPHONEOS_ROOT}/SDKs/iPhoneOS${IOS_SDK_VERSION}.sdk") + +if(NOT EXISTS ${IPHONEOS_SDK_ROOT}) + hunter_fatal_error( + "IPHONEOS_SDK_ROOT not found (${IPHONEOS_SDK_ROOT})\n" + "IPHONEOS_ROOT: ${IPHONEOS_ROOT}\n" + "IOS_SDK_VERSION: ${IOS_SDK_VERSION}\n" + ) +endif() + +string(COMPARE EQUAL "${IOS_DEPLOYMENT_SDK_VERSION}" "" _is_empty) +if(_is_empty) + set( + CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET + "${IOS_SDK_VERSION}" + ) +else() + set( + CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET + "${IOS_DEPLOYMENT_SDK_VERSION}" + ) +endif() + +# Emulate OpenCV toolchain -- +set(IOS YES) +# -- end + +# Set iPhoneOS architectures +set(archs "") +foreach(arch ${IPHONEOS_ARCHS}) + set(archs "${archs} ${arch}") +endforeach() +set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "${archs}") +set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "${archs}") + +# Set iPhoneSimulator architectures +set(archs "") +foreach(arch ${IPHONESIMULATOR_ARCHS}) + set(archs "${archs} ${arch}") +endforeach() +set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "${archs}") +set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "${archs}") + +# Introduced in iOS 9.0 +set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO) + +# This will set CMAKE_CROSSCOMPILING to TRUE. +# CMAKE_CROSSCOMPILING needed for try_run: +# * https://cmake.org/cmake/help/latest/command/try_run.html#behavior-when-cross-compiling +# (used in CURL) +set(CMAKE_SYSTEM_NAME "Darwin") + +# Set CMAKE_SYSTEM_PROCESSOR for one-arch toolchain +# (needed for OpenCV 3.3) +set(_all_archs ${IPHONESIMULATOR_ARCHS} ${IPHONEOS_ARCHS}) +list(LENGTH _all_archs _all_archs_len) +if(_all_archs_len EQUAL 1) + set(CMAKE_SYSTEM_PROCESSOR ${_all_archs}) +else() + set(CMAKE_SYSTEM_PROCESSOR "") +endif() diff --git a/tools/polly/os/osx.cmake b/tools/polly/os/osx.cmake new file mode 100644 index 0000000..088e6c0 --- /dev/null +++ b/tools/polly/os/osx.cmake @@ -0,0 +1,103 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OS_OSX_CMAKE_) + return() +else() + set(POLLY_OS_OSX_CMAKE_ 1) +endif() + +# Toolchain can be loaded from Linux too (e.g. by libcxx or gcc) +if(NOT APPLE) + return() +endif() + +if(IOS) + polly_fatal_error("Not for iOS") +endif() + +# find 'osx' root +find_program(XCODE_SELECT_EXECUTABLE xcode-select) +if(NOT XCODE_SELECT_EXECUTABLE) + polly_fatal_error("xcode-select not found") +endif() + +string(COMPARE EQUAL "$ENV{DEVELOPER_DIR}" "" _is_empty) +if(NOT _is_empty) + polly_status_debug("Developer root (env): $ENV{DEVELOPER_DIR}") +endif() + +execute_process( + COMMAND + ${XCODE_SELECT_EXECUTABLE} + "-print-path" + OUTPUT_VARIABLE + XCODE_DEVELOPER_ROOT # /.../Xcode.app/Contents/Developer + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +polly_status_debug("Developer root: ${XCODE_DEVELOPER_ROOT}") + +string(COMPARE EQUAL "${OSX_SDK_VERSION}" "" _is_empty) +if(_is_empty) + execute_process( + COMMAND xcrun --show-sdk-version + RESULT_VARIABLE _result + OUTPUT_VARIABLE OSX_SDK_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + if(NOT _result EQUAL 0) + polly_fatal_error("'xcrun --show-sdk-version' failed") + endif() +endif() + +set( + __osx_sysroot_suggestion_1 + "${XCODE_DEVELOPER_ROOT}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${OSX_SDK_VERSION}.sdk" +) + +# With a full Xcode install, typically `xcode-select -print-path` is something like: +# /Applications/Xcode.app/Contents/Developer +# +# But with just Xcode command line tools installed, the path is: +# /Library/Developer/CommandLineTools +# +# In the CommandLineTools case, the SDKs folder is at a different relative path. +set( + __osx_sysroot_suggestion_2 + "${XCODE_DEVELOPER_ROOT}/SDKs/MacOSX${OSX_SDK_VERSION}.sdk" +) + +if(EXISTS "${__osx_sysroot_suggestion_1}") + set(__osx_sysroot "${__osx_sysroot_suggestion_1}") +elseif(EXISTS "${__osx_sysroot_suggestion_2}") + set(__osx_sysroot "${__osx_sysroot_suggestion_2}") +else() + # If OSX_SDK_VERSION is not set, the SDK version is computed using + # xcrun. However, it is possible for the version reported by xcrun to not + # be present in the SDKs folder. In that case, xcrun can also give the + # full path to a valid SDK. + execute_process( + COMMAND xcrun --show-sdk-path + RESULT_VARIABLE _result + OUTPUT_VARIABLE __osx_sysroot_suggestion_3 + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + if(NOT _result EQUAL 0) + polly_fatal_error("'xcrun --show-sdk-path' failed") + endif() + + if(EXISTS "${__osx_sysroot_suggestion_3}") + set(__osx_sysroot "${__osx_sysroot_suggestion_3}") + else() + polly_fatal_error("OS X SDK does not exist at ${__osx_sysroot_suggestion_1} or ${__osx_sysroot_suggestion_2} or ${__osx_sysroot_suggestion_3}") + endif() +endif() + +set( + CMAKE_OSX_SYSROOT + "${__osx_sysroot}" + CACHE STRING "System root for OSX" FORCE +) diff --git a/tools/polly/os/raspberry-pi-hardfloat.cmake b/tools/polly/os/raspberry-pi-hardfloat.cmake new file mode 100644 index 0000000..a15b7f6 --- /dev/null +++ b/tools/polly/os/raspberry-pi-hardfloat.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2017, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_OS_RASPBERRY_PI_HARDFLOAT_CMAKE) + return() +else() + set(POLLY_OS_RASPBERRY_PI_HARDFLOAT_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +foreach(_flag -mfloat-abi=hard -mlittle-endian -munaligned-access) + polly_add_cache_flag(CMAKE_C_FLAGS "${_flag}") + polly_add_cache_flag(CMAKE_CXX_FLAGS "${_flag}") +endforeach() + +set(CMAKE_SYSTEM_NAME "Linux" CACHE STRING "") + diff --git a/tools/polly/os/raspberry-pi1.cmake b/tools/polly/os/raspberry-pi1.cmake new file mode 100644 index 0000000..340b8c8 --- /dev/null +++ b/tools/polly/os/raspberry-pi1.cmake @@ -0,0 +1,20 @@ +# Copyright (c) 2017, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_OS_RASPBERRY_PI1_CMAKE) + return() +else() + set(POLLY_OS_RASPBERRY_PI1_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +# -mcpu=arm1176jzf-s not compatible, removed +foreach(_flag -mfpu=vfp) + polly_add_cache_flag(CMAKE_C_FLAGS "${_flag}") + polly_add_cache_flag(CMAKE_CXX_FLAGS "${_flag}") +endforeach() + +set(CMAKE_SYSTEM_PROCESSOR "armv6" CACHE INTERNAL "") +set(RASPBERRY_PI 1 CACHE INTERNAL "") +set(CMAKE_SYSTEM_NAME "Linux" CACHE INTERNAL "") diff --git a/tools/polly/os/raspberry-pi2.cmake b/tools/polly/os/raspberry-pi2.cmake new file mode 100644 index 0000000..7c44405 --- /dev/null +++ b/tools/polly/os/raspberry-pi2.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2017, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_OS_RASPBERRY_PI2_CMAKE) + return() +else() + set(POLLY_OS_RASPBERRY_PI2_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +foreach(_flag -mcpu=cortex-a7 -mfpu=neon-vfpv4) + polly_add_cache_flag(CMAKE_C_FLAGS "${_flag}") + polly_add_cache_flag(CMAKE_CXX_FLAGS "${_flag}") +endforeach() + +set(CMAKE_SYSTEM_PROCESSOR "armv7-a" CACHE INTERNAL "") +set(RASPBERRY_PI 2 CACHE INTERNAL "") + diff --git a/tools/polly/os/raspberry-pi3.cmake b/tools/polly/os/raspberry-pi3.cmake new file mode 100644 index 0000000..7370fca --- /dev/null +++ b/tools/polly/os/raspberry-pi3.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2017, Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_OS_RASPBERRY_PI3_CMAKE) + return() +else() + set(POLLY_OS_RASPBERRY_PI3_CMAKE 1) +endif() + +include(polly_add_cache_flag) + +foreach(_flag -mcpu=cortex-a53 -mfpu=neon-fp-armv8) + polly_add_cache_flag(CMAKE_C_FLAGS "${_flag}") + polly_add_cache_flag(CMAKE_CXX_FLAGS "${_flag}") +endforeach() + +set(CMAKE_SYSTEM_PROCESSOR "armv7-l" CACHE INTERNAL "") +set(RASPBERRY_PI 3 CACHE INTERNAL "") + diff --git a/tools/polly/os/vc-mdd-android.cmake b/tools/polly/os/vc-mdd-android.cmake new file mode 100644 index 0000000..abd9079 --- /dev/null +++ b/tools/polly/os/vc-mdd-android.cmake @@ -0,0 +1,215 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OS_VC_MDD_ANDROID_CMAKE_) + return() +else() + set(POLLY_OS_VC_MDD_ANDROID_CMAKE_ 1) +endif() + +cmake_minimum_required(VERSION 3.4) + +include(polly_fatal_error) + +if("${ANDROID_NDK_VERSION}" STREQUAL "") + polly_fatal_error("ANDROID_NDK_VERSION not set") +endif() + +if("${ANDROID_NATIVE_API_LEVEL}" STREQUAL "") + polly_fatal_error("ANDROID_NATIVE_API_LEVEL not set") +endif() + +set( + CMAKE_VC_MDD_ANDROID_API_LEVEL + "android-${ANDROID_NATIVE_API_LEVEL}" + CACHE + INTERNAL + "Android API" +) + +if("${ANDROID_ABI}" STREQUAL "") + polly_fatal_error("ANDROID_ABI not set") +endif() + +set( + CMAKE_VC_MDD_ANDROID_USE_OF_STL + "gnustl_static" + CACHE + INTERNAL + "STL variant" +) + +set( + CMAKE_SYSTEM_NAME + "VCMDDAndroid" + CACHE + INTERNAL + "System name" +) + +set(_expected_platform_module "${CMAKE_ROOT}/Modules/Platform/VCMDDAndroid.cmake") + +if(NOT EXISTS "${_expected_platform_module}") + polly_fatal_error( + "File not found:\n ${_expected_platform_module}" + "You are using non-patched CMake version!" + "See http://cgold.readthedocs.io/en/latest/platforms/android/windows.html#experimental-cmake for fix." + ) +endif() + +set(ANDROID "TRUE" CACHE STRING "Is platform Android?") + +get_filename_component( + ANDROID_NDK + "[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\VisualStudio\\14.0_Config\\Setup\\vs\\SecondaryInstaller\\AndroidNDK64;NDK_HOME]" + ABSOLUTE + CACHE +) + +if(EXISTS "${ANDROID_NDK}") + polly_status_debug("Android NDK: ${ANDROID_NDK}") +else() + polly_fatal_error("Directory not found: ${ANDROID_NDK}") +endif() + +get_filename_component(_android_dirname "${ANDROID_NDK}" NAME) +if(NOT "${_android_dirname}" STREQUAL "android-ndk-${ANDROID_NDK_VERSION}") + polly_fatal_error( + "Inconsistent ANDROID_NDK_VERSION/ANDROID_NDK:" + " ${ANDROID_NDK_VERSION}/${ANDROID_NDK}" + ) +endif() + +get_filename_component( + ANDROID_ANT_HOME + "[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\VisualStudio\\14.0_Config\\Setup\\vs\\SecondaryInstaller\\Ant;ANT_HOME]" + ABSOLUTE + CACHE +) + +if(EXISTS "${ANDROID_ANT_HOME}") + polly_status_debug("Ant HOME: ${ANDROID_ANT_HOME}") +else() + polly_fatal_error("Directory not found: ${ANDROID_ANT_HOME}") +endif() + +if("${ANDROID_ABI}" STREQUAL "armeabi") + set(ANDROID_ARCH_NAME "arm") +elseif("${ANDROID_ABI}" STREQUAL "mips") + set(ANDROID_ARCH_NAME "mips") +elseif("${ANDROID_ABI}" STREQUAL "x86") + set(ANDROID_ARCH_NAME "x86") +else() + polly_fatal_error("Unexpected ANDROID_ABI: ${ANDROID_ABI}") +endif() + +if("${ANDROID_ARCH_NAME}" STREQUAL "x86") + set(ANDROID_TOOLCHAIN_NAME "x86-4.9") + set(ANDROID_TOOLCHAIN_MACHINE_NAME "i686-linux-android") +elseif("${ANDROID_ARCH_NAME}" STREQUAL "arm") + set(ANDROID_TOOLCHAIN_NAME "arm-linux-androideabi-4.9") + set(ANDROID_TOOLCHAIN_MACHINE_NAME "arm-linux-androideabi") +else() + polly_fatal_error("Unexpected ANDROID_ARCH_NAME: ${ANDROID_ARCH_NAME}") +endif() + +set(ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/prebuilt/windows-x86_64") +if(NOT EXISTS "${ANDROID_TOOLCHAIN_ROOT}") + polly_fatal_error("Directory not found: ${ANDROID_TOOLCHAIN_ROOT}") +endif() + +set( + ANDROID_SYSROOT + "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}" + CACHE + INTERNAL + "Android system root" +) + +if(NOT EXISTS "${ANDROID_SYSROOT}") + polly_fatal_error("Directory not found: ${ANDROID_SYSROOT}") +endif() + +set(_dir1 "${ANDROID_TOOLCHAIN_ROOT}/bin") +if(NOT EXISTS "${_dir1}") + polly_fatal_error("Directory not found: ${_dir1}") +endif() + +set(_dir2 "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}") +if(NOT EXISTS "${_dir2}") + polly_fatal_error("Directory not found: ${_dir2}") +endif() + +set(CMAKE_FIND_ROOT_PATH "${_dir1}" "${_dir2}" "${ANDROID_SYSROOT}") + +# Support AndroidApk.cmake (https://github.com/hunter-packages/android-apk) { + +set( + ANDROID_ANT_COMMAND + "${ANDROID_ANT_HOME}/bin/ant.bat" + CACHE + INTERNAL + "Path to ant" +) + +set( + CMAKE_GDBSERVER + "${ANDROID_NDK}/prebuilt/android-${ANDROID_ARCH_NAME}/gdbserver/gdbserver" + CACHE + INTERNAL + "Path to 'gdbserver'" +) +if(NOT EXISTS "${CMAKE_GDBSERVER}") + polly_fatal_error("File not found: ${CMAKE_GDBSERVER}") +endif() + +set(ANDROID_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}") + +# only search for libraries and includes in the ndk toolchain +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# macro to find packages on the host OS +macro(find_host_package) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + if(CMAKE_HOST_WIN32) + set(WIN32 1) + set(UNIX) + elseif(CMAKE_HOST_APPLE) + set(APPLE 1) + set(UNIX) + endif() + find_package(${ARGN}) + set(WIN32) + set(APPLE) + set(UNIX 1) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endmacro() + +# macro to find programs on the host OS +macro(find_host_program) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + if(CMAKE_HOST_WIN32) + set(WIN32 1) + set(UNIX) + elseif(CMAKE_HOST_APPLE) + set(APPLE 1) + set(UNIX) + endif() + find_program(${ARGN}) + set(WIN32) + set(APPLE) + set(UNIX 1) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endmacro() + +# } diff --git a/tools/polly/osx-10-10-dep-10-7.cmake b/tools/polly/osx-10-10-dep-10-7.cmake new file mode 100644 index 0000000..8f1993c --- /dev/null +++ b/tools/polly/osx-10-10-dep-10-7.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_10_DEP_10_7_CMAKE_) + return() +else() + set(POLLY_OSX_10_10_DEP_10_7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.10") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.7) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.7" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-10-dep-10-9-make.cmake b/tools/polly/osx-10-10-dep-10-9-make.cmake new file mode 100644 index 0000000..7f66faa --- /dev/null +++ b/tools/polly/osx-10-10-dep-10-9-make.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_10_DEP_10_9_MAKE_CMAKE_) + return() +else() + set(POLLY_OSX_10_10_DEP_10_9_MAKE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.10") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Makefile (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-10.cmake b/tools/polly/osx-10-10.cmake new file mode 100644 index 0000000..57f3a2f --- /dev/null +++ b/tools/polly/osx-10-10.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_10_CMAKE_) + return() +else() + set(POLLY_OSX_10_10_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.10") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-11-hid-sections-lto.cmake b/tools/polly/osx-10-11-hid-sections-lto.cmake new file mode 100644 index 0000000..3e0d1d6 --- /dev/null +++ b/tools/polly/osx-10-11-hid-sections-lto.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_OSX_10_11_HID_SECTIONS_LTO_CMAKE_) + return() +else() + set(POLLY_OSX_10_11_HID_SECTIONS_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.11") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support / hidden / function-sections / data-sections / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-11-hid-sections.cmake b/tools/polly/osx-10-11-hid-sections.cmake new file mode 100644 index 0000000..c486c1e --- /dev/null +++ b/tools/polly/osx-10-11-hid-sections.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2015, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_OSX_10_11_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_OSX_10_11_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.11") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support / hidden / function-sections / data-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-11-lto.cmake b/tools/polly/osx-10-11-lto.cmake new file mode 100644 index 0000000..51724b1 --- /dev/null +++ b/tools/polly/osx-10-11-lto.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_11_LTO_CMAKE_) + return() +else() + set(POLLY_OSX_10_11_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.11") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-11-make.cmake b/tools/polly/osx-10-11-make.cmake new file mode 100644 index 0000000..78c224a --- /dev/null +++ b/tools/polly/osx-10-11-make.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_11_MAKE_CMAKE_) + return() +else() + set(POLLY_OSX_10_11_MAKE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.11") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Makefile (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-11-sanitize-address.cmake b/tools/polly/osx-10-11-sanitize-address.cmake new file mode 100644 index 0000000..bd2fab0 --- /dev/null +++ b/tools/polly/osx-10-11-sanitize-address.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_11_SANITIZE_ADDRESS_CMAKE_) + return() +else() + set(POLLY_OSX_10_11_SANITIZE_ADDRESS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.11") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / Clang address sanitizer / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_address.cmake") diff --git a/tools/polly/osx-10-11.cmake b/tools/polly/osx-10-11.cmake new file mode 100644 index 0000000..5c9b165 --- /dev/null +++ b/tools/polly/osx-10-11.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_11_CMAKE_) + return() +else() + set(POLLY_OSX_10_11_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.11") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-cxx14.cmake b/tools/polly/osx-10-12-cxx14.cmake new file mode 100644 index 0000000..4f15256 --- /dev/null +++ b/tools/polly/osx-10-12-cxx14.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_CXX14_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-cxx17.cmake b/tools/polly/osx-10-12-cxx17.cmake new file mode 100644 index 0000000..e61cdec --- /dev/null +++ b/tools/polly/osx-10-12-cxx17.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_CXX17_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++17 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-cxx98.cmake b/tools/polly/osx-10-12-cxx98.cmake new file mode 100644 index 0000000..f89fa7c --- /dev/null +++ b/tools/polly/osx-10-12-cxx98.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_CXX98_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_CXX98_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++98 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx98.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-dep-10-10-lto.cmake b/tools/polly/osx-10-12-dep-10-10-lto.cmake new file mode 100644 index 0000000..621523c --- /dev/null +++ b/tools/polly/osx-10-12-dep-10-10-lto.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2015, 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_DEP_10_10_LTO_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_DEP_10_10_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.10) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-dep-10-10.cmake b/tools/polly/osx-10-12-dep-10-10.cmake new file mode 100644 index 0000000..893fc81 --- /dev/null +++ b/tools/polly/osx-10-12-dep-10-10.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_DEP_10_10_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_DEP_10_10_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.10) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-hid-sections.cmake b/tools/polly/osx-10-12-hid-sections.cmake new file mode 100644 index 0000000..251dc17 --- /dev/null +++ b/tools/polly/osx-10-12-hid-sections.cmake @@ -0,0 +1,33 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# Copyright (c) 2016-2017, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support / hidden / function-sections / data-sections " + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/osx-10-12-lto.cmake b/tools/polly/osx-10-12-lto.cmake new file mode 100644 index 0000000..0036b86 --- /dev/null +++ b/tools/polly/osx-10-12-lto.cmake @@ -0,0 +1,30 @@ +# Copyright (c) 2016-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_LTO_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_LTO_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support / LTO" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/lto.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-make.cmake b/tools/polly/osx-10-12-make.cmake new file mode 100644 index 0000000..2dbf8e4 --- /dev/null +++ b/tools/polly/osx-10-12-make.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_MAKE_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_MAKE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Makefile (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-ninja.cmake b/tools/polly/osx-10-12-ninja.cmake new file mode 100644 index 0000000..92f5f56 --- /dev/null +++ b/tools/polly/osx-10-12-ninja.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_MAKE_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_MAKE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Ninja (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Ninja" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-12-sanitize-address-hid-sections.cmake b/tools/polly/osx-10-12-sanitize-address-hid-sections.cmake new file mode 100644 index 0000000..13bade4 --- /dev/null +++ b/tools/polly/osx-10-12-sanitize-address-hid-sections.cmake @@ -0,0 +1,34 @@ +# Copyright (c) 2016, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_SANITIZE_ADDRESS_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_SANITIZE_ADDRESS_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / Clang address sanitizer / c++11 support / hidden / function-sections / data-sections " + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_address.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/osx-10-12-sanitize-address.cmake b/tools/polly/osx-10-12-sanitize-address.cmake new file mode 100644 index 0000000..a294c06 --- /dev/null +++ b/tools/polly/osx-10-12-sanitize-address.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2016, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_SANITIZE_ADDRESS_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_SANITIZE_ADDRESS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / Clang address sanitizer / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_address.cmake") diff --git a/tools/polly/osx-10-12.cmake b/tools/polly/osx-10-12.cmake new file mode 100644 index 0000000..cffd6fb --- /dev/null +++ b/tools/polly/osx-10-12.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_12_CMAKE_) + return() +else() + set(POLLY_OSX_10_12_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.12") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-13-cxx14.cmake b/tools/polly/osx-10-13-cxx14.cmake new file mode 100644 index 0000000..48d7479 --- /dev/null +++ b/tools/polly/osx-10-13-cxx14.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_13_CXX14_CMAKE_) + return() +else() + set(POLLY_OSX_10_13_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.13") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-13-cxx17.cmake b/tools/polly/osx-10-13-cxx17.cmake new file mode 100644 index 0000000..d4632aa --- /dev/null +++ b/tools/polly/osx-10-13-cxx17.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_13_CXX17_CMAKE_) + return() +else() + set(POLLY_OSX_10_13_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.13") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++17 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-13-dep-10-10-cxx14.cmake b/tools/polly/osx-10-13-dep-10-10-cxx14.cmake new file mode 100644 index 0000000..7c7a558 --- /dev/null +++ b/tools/polly/osx-10-13-dep-10-10-cxx14.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_13_DEP_10_10_CXX14_CMAKE_) + return() +else() + set(POLLY_OSX_10_13_DEP_10_10_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.13") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.10) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-13-dep-10-10-cxx17.cmake b/tools/polly/osx-10-13-dep-10-10-cxx17.cmake new file mode 100644 index 0000000..5a33269 --- /dev/null +++ b/tools/polly/osx-10-13-dep-10-10-cxx17.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_13_DEP_10_10_CXX17_CMAKE_) + return() +else() + set(POLLY_OSX_10_13_DEP_10_10_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.13") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.10) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++17 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-13-dep-10-10.cmake b/tools/polly/osx-10-13-dep-10-10.cmake new file mode 100644 index 0000000..1927833 --- /dev/null +++ b/tools/polly/osx-10-13-dep-10-10.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_13_DEP_10_10_CMAKE_) + return() +else() + set(POLLY_OSX_10_13_DEP_10_10_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.13") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.10) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-13-i386-cxx14.cmake b/tools/polly/osx-10-13-i386-cxx14.cmake new file mode 100644 index 0000000..e50254d --- /dev/null +++ b/tools/polly/osx-10-13-i386-cxx14.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_13_CXX14_CMAKE_) + return() +else() + set(POLLY_OSX_10_13_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.13") +set(POLLY_XCODE_COMPILER "clang") + +set(CMAKE_OSX_ARCHITECTURES i386 CACHE INTERNAL "") + +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / ${CMAKE_OSX_ARCHITECTURES} \ +LLVM Standard C++ Library (libc++) / c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-13-make-cxx14.cmake b/tools/polly/osx-10-13-make-cxx14.cmake new file mode 100644 index 0000000..8683ff9 --- /dev/null +++ b/tools/polly/osx-10-13-make-cxx14.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_13_MAKE_CXX14_CMAKE_) + return() +else() + set(POLLY_OSX_10_13_MAKE_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.13") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Makefile (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++14 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-13.cmake b/tools/polly/osx-10-13.cmake new file mode 100644 index 0000000..453c86e --- /dev/null +++ b/tools/polly/osx-10-13.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_13_CMAKE_) + return() +else() + set(POLLY_OSX_10_13_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.13") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-14-cxx14.cmake b/tools/polly/osx-10-14-cxx14.cmake new file mode 100644 index 0000000..28dab93 --- /dev/null +++ b/tools/polly/osx-10-14-cxx14.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_14_CXX14_CMAKE_) + return() +else() + set(POLLY_OSX_10_14_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.14") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.14" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-14-cxx17.cmake b/tools/polly/osx-10-14-cxx17.cmake new file mode 100644 index 0000000..47c7d57 --- /dev/null +++ b/tools/polly/osx-10-14-cxx17.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_14_CXX17_CMAKE_) + return() +else() + set(POLLY_OSX_10_14_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.14") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++17 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.14" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-14-dep-10-10-cxx14.cmake b/tools/polly/osx-10-14-dep-10-10-cxx14.cmake new file mode 100644 index 0000000..0e05fae --- /dev/null +++ b/tools/polly/osx-10-14-dep-10-10-cxx14.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_14_DEP_10_10_CXX14_CMAKE_) + return() +else() + set(POLLY_OSX_10_14_DEP_10_10_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.14") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.10) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++14 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx14.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-14-dep-10-10-cxx17.cmake b/tools/polly/osx-10-14-dep-10-10-cxx17.cmake new file mode 100644 index 0000000..4ae7e0e --- /dev/null +++ b/tools/polly/osx-10-14-dep-10-10-cxx17.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_14_DEP_10_10_CXX17_CMAKE_) + return() +else() + set(POLLY_OSX_10_14_DEP_10_10_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.14") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.10) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++17 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-14-dep-10-10.cmake b/tools/polly/osx-10-14-dep-10-10.cmake new file mode 100644 index 0000000..aa96091 --- /dev/null +++ b/tools/polly/osx-10-14-dep-10-10.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_14_DEP_10_10_CMAKE_) + return() +else() + set(POLLY_OSX_10_14_DEP_10_10_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.14") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION} | Deployment 10.10) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-14.cmake b/tools/polly/osx-10-14.cmake new file mode 100644 index 0000000..6fe06cf --- /dev/null +++ b/tools/polly/osx-10-14.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_14_CMAKE_) + return() +else() + set(POLLY_OSX_10_14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.14") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.14" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-7.cmake b/tools/polly/osx-10-7.cmake new file mode 100644 index 0000000..e2fa795 --- /dev/null +++ b/tools/polly/osx-10-7.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_7_CMAKE_) + return() +else() + set(POLLY_OSX_10_7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.7") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.7" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-8.cmake b/tools/polly/osx-10-8.cmake new file mode 100644 index 0000000..e663a34 --- /dev/null +++ b/tools/polly/osx-10-8.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_8_CMAKE_) + return() +else() + set(POLLY_OSX_10_8_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.8") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/osx-10-9.cmake b/tools/polly/osx-10-9.cmake new file mode 100644 index 0000000..0e488a3 --- /dev/null +++ b/tools/polly/osx-10-9.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_OSX_10_9_CMAKE_) + return() +else() + set(POLLY_OSX_10_9_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(OSX_SDK_VERSION "10.9") +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode (OS X ${OSX_SDK_VERSION}) / \ +${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") + +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "OS X Deployment target" FORCE) + +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/osx.cmake") diff --git a/tools/polly/raspberrypi1-cxx11-pic-static-std.cmake b/tools/polly/raspberrypi1-cxx11-pic-static-std.cmake new file mode 100644 index 0000000..2a13df1 --- /dev/null +++ b/tools/polly/raspberrypi1-cxx11-pic-static-std.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2015, 2017 Alexandre Pretyman +# Copyright (c) 2017 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_RASPBERRYPI1_CXX11_PIC_CMAKE_) + return() +else() + set(POLLY_RASPBERRYPI1_CXX11_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "RaspberryPi 1 Cross Compile / C++11 / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_clear_environment_variables) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/static-std.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-raspberry-pi.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi1.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/raspberrypi1-cxx11-pic.cmake b/tools/polly/raspberrypi1-cxx11-pic.cmake new file mode 100644 index 0000000..ba8e52a --- /dev/null +++ b/tools/polly/raspberrypi1-cxx11-pic.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2015, 2017 Alexandre Pretyman +# Copyright (c) 2017 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_RASPBERRYPI1_CXX11_PIC_CMAKE_) + return() +else() + set(POLLY_RASPBERRYPI1_CXX11_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "RaspberryPi 1 Cross Compile / C++11 / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_clear_environment_variables) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-raspberry-pi.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi1.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/raspberrypi2-cxx11-pic.cmake b/tools/polly/raspberrypi2-cxx11-pic.cmake new file mode 100644 index 0000000..76b1207 --- /dev/null +++ b/tools/polly/raspberrypi2-cxx11-pic.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2015, 2017 Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_RASPBERRYPI2_CXX11_CMAKE) + return() +else() + set(POLLY_RASPBERRYPI2_CXX11_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "RaspberryPi 2 Cross Compile / C++11 / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_clear_environment_variables) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-raspberry-pi.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi2.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi-hardfloat.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") diff --git a/tools/polly/raspberrypi2-cxx11.cmake b/tools/polly/raspberrypi2-cxx11.cmake new file mode 100644 index 0000000..e1b6dfb --- /dev/null +++ b/tools/polly/raspberrypi2-cxx11.cmake @@ -0,0 +1,25 @@ +# Copyright (c) 2015, 2017 Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_RASPBERRYPI2_CXX11_CMAKE) + return() +else() + set(POLLY_RASPBERRYPI2_CXX11_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "RaspberryPi 2 Cross Compile / C++11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_clear_environment_variables) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-raspberry-pi.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi2.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi-hardfloat.cmake") + diff --git a/tools/polly/raspberrypi3-cxx11.cmake b/tools/polly/raspberrypi3-cxx11.cmake new file mode 100644 index 0000000..cbfb5c1 --- /dev/null +++ b/tools/polly/raspberrypi3-cxx11.cmake @@ -0,0 +1,24 @@ +# Copyright (c) 2015, 2017 Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_RASPBERRYPI3_CXX11_CMAKE) + return() +else() + set(POLLY_RASPBERRYPI3_CXX11_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "RaspberryPi 3 Cross Compile / C++11" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_clear_environment_variables) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-raspberry-pi.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi3.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi-hardfloat.cmake") diff --git a/tools/polly/raspberrypi3-gcc-pic-hid-sections.cmake b/tools/polly/raspberrypi3-gcc-pic-hid-sections.cmake new file mode 100644 index 0000000..9dfd323 --- /dev/null +++ b/tools/polly/raspberrypi3-gcc-pic-hid-sections.cmake @@ -0,0 +1,29 @@ +# Copyright (c) 2015, 2017 Alexandre Pretyman +# All rights reserved. + +if(DEFINED POLLY_RASPBERRYPI3_CXX11_CMAKE) + return() +else() + set(POLLY_RASPBERRYPI3_CXX11_CMAKE 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "RaspberryPi 3 / gcc / PIC / c++11 support / hidden / function-sections / data-sections" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include(polly_clear_environment_variables) + +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/compiler/gcc-cross-compile-raspberry-pi.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi3.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/os/raspberry-pi-hardfloat.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/sanitize-address-cxx17-pic.cmake b/tools/polly/sanitize-address-cxx17-pic.cmake new file mode 100644 index 0000000..06fa3ef --- /dev/null +++ b/tools/polly/sanitize-address-cxx17-pic.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_ADDRESS_CXX17_PIC_CMAKE_) + return() +else() + set(POLLY_SANITIZE_ADDRESS_CXX17_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang address sanitizer / c++17 support / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_address.cmake") diff --git a/tools/polly/sanitize-address-cxx17.cmake b/tools/polly/sanitize-address-cxx17.cmake new file mode 100644 index 0000000..b15b329 --- /dev/null +++ b/tools/polly/sanitize-address-cxx17.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_ADDRESS_CXX17_CMAKE_) + return() +else() + set(POLLY_SANITIZE_ADDRESS_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang address sanitizer / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_address.cmake") diff --git a/tools/polly/sanitize-address.cmake b/tools/polly/sanitize-address.cmake new file mode 100644 index 0000000..f69a4b6 --- /dev/null +++ b/tools/polly/sanitize-address.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_ADDRESS_CMAKE_) + return() +else() + set(POLLY_SANITIZE_ADDRESS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang address sanitizer / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_address.cmake") diff --git a/tools/polly/sanitize-leak-cxx17-pic.cmake b/tools/polly/sanitize-leak-cxx17-pic.cmake new file mode 100644 index 0000000..2003130 --- /dev/null +++ b/tools/polly/sanitize-leak-cxx17-pic.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_LEAK_CXX17_PIC_CMAKE_) + return() +else() + set(POLLY_SANITIZE_LEAK_CXX17_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang memory leaks sanitizer / c++17 support / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_leak.cmake") diff --git a/tools/polly/sanitize-leak-cxx17.cmake b/tools/polly/sanitize-leak-cxx17.cmake new file mode 100644 index 0000000..3847422 --- /dev/null +++ b/tools/polly/sanitize-leak-cxx17.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_LEAK_CXX17_CMAKE_) + return() +else() + set(POLLY_SANITIZE_LEAK_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang memory leaks sanitizer / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_leak.cmake") diff --git a/tools/polly/sanitize-leak.cmake b/tools/polly/sanitize-leak.cmake new file mode 100644 index 0000000..a5ff6ae --- /dev/null +++ b/tools/polly/sanitize-leak.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_LEAK_CMAKE_) + return() +else() + set(POLLY_SANITIZE_LEAK_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang memory leaks sanitizer / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_leak.cmake") diff --git a/tools/polly/sanitize-memory.cmake b/tools/polly/sanitize-memory.cmake new file mode 100644 index 0000000..9ed77fb --- /dev/null +++ b/tools/polly/sanitize-memory.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_MEMORY_CMAKE_) + return() +else() + set(POLLY_SANITIZE_MEMORY_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang memory sanitizer / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_memory.cmake") diff --git a/tools/polly/sanitize-thread-cxx17-pic.cmake b/tools/polly/sanitize-thread-cxx17-pic.cmake new file mode 100644 index 0000000..3bb2252 --- /dev/null +++ b/tools/polly/sanitize-thread-cxx17-pic.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_THREAD_CXX17_PIC_CMAKE_) + return() +else() + set(POLLY_SANITIZE_THREAD_CXX17_PIC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang thread sanitizer / c++17 support / PIC" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/fpic.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_thread.cmake") diff --git a/tools/polly/sanitize-thread-cxx17.cmake b/tools/polly/sanitize-thread-cxx17.cmake new file mode 100644 index 0000000..ba105c7 --- /dev/null +++ b/tools/polly/sanitize-thread-cxx17.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2014, 2018 Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_THREAD_CXX17_CMAKE_) + return() +else() + set(POLLY_SANITIZE_THREAD_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang thread sanitizer / c++17 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx17.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_thread.cmake") diff --git a/tools/polly/sanitize-thread.cmake b/tools/polly/sanitize-thread.cmake new file mode 100644 index 0000000..b86182f --- /dev/null +++ b/tools/polly/sanitize-thread.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_SANITIZE_THREAD_CMAKE_) + return() +else() + set(POLLY_SANITIZE_THREAD_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Clang thread sanitizer / c++11 support" + "Unix Makefiles" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/clang.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/sanitize_thread.cmake") diff --git a/tools/polly/scripts/Info.plist b/tools/polly/scripts/Info.plist new file mode 100644 index 0000000..c6a6112 --- /dev/null +++ b/tools/polly/scripts/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleExecutable + __BUNDLE_EXECUTABLE__ + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.github.ruslo.polly + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + MinimumOSVersion + __MINIMUM_OS_VERSION__ + + diff --git a/tools/polly/scripts/NoCodeSign.xcconfig b/tools/polly/scripts/NoCodeSign.xcconfig new file mode 100644 index 0000000..b963993 --- /dev/null +++ b/tools/polly/scripts/NoCodeSign.xcconfig @@ -0,0 +1,4 @@ +CODE_SIGN_IDENTITY="" +CODE_SIGNING_REQUIRED="NO" +CODE_SIGN_ENTITLEMENTS="" +CODE_SIGNING_ALLOWED="NO" diff --git a/tools/polly/scripts/clang-analyze.sh b/tools/polly/scripts/clang-analyze.sh new file mode 100755 index 0000000..2d3cd07 --- /dev/null +++ b/tools/polly/scripts/clang-analyze.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +set -x + +for x in "$@"; +do + if [ "${x}" == "-c" ]; + then + temp_out="`mktemp /tmp/polly-clang-analyze.out.XXXXX`" + temp_bin="`mktemp /tmp/polly-clang-analyze.bin.XXXXX`" + + # analyze + # -w : ignore regular compiler warnings so 'temp_out' only contains + # messages from analyzer. '-w' should not be a part of toolchain flags + # since Hunter toolchain-id calculated using '#pragma message' output which + # is implemented as a warning message (hence will be suppressed by '-w') + clang --analyze -w "$@" -o "${temp_bin}" 2> "${temp_out}" + + RESULT=0 + [ "$?" == 0 ] || RESULT=1 + [ -s "${temp_out}" ] && RESULT=1 + + cat "${temp_out}"; + rm -f "${temp_out}" + rm -f "${temp_bin}" + + if [ "${RESULT}" == "1" ]; + then + exit 1; + fi + fi +done + +# compile real code +clang "$@" diff --git a/tools/polly/scripts/clangxx-analyze.sh b/tools/polly/scripts/clangxx-analyze.sh new file mode 100755 index 0000000..e2d1bb7 --- /dev/null +++ b/tools/polly/scripts/clangxx-analyze.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +set -x + +for x in "$@"; +do + if [ "${x}" == "-c" ]; + then + temp_out="`mktemp /tmp/polly-clang-analyze.out.XXXXX`" + temp_bin="`mktemp /tmp/polly-clang-analyze.bin.XXXXX`" + + # analyze + # -w : ignore regular compiler warnings so 'temp_out' only contains + # messages from analyzer. '-w' should not be a part of toolchain flags + # since Hunter toolchain-id calculated using '#pragma message' output which + # is implemented as a warning message (hence will be suppressed by '-w') + clang++ --analyze -w "$@" -o "${temp_bin}" 2> "${temp_out}" + + RESULT=0 + [ "$?" == 0 ] || RESULT=1 + [ -s "${temp_out}" ] && RESULT=1 + + cat "${temp_out}"; + rm -f "${temp_out}" + rm -f "${temp_bin}" + + if [ "${RESULT}" == "1" ]; + then + exit 1; + fi + fi +done + +# compile real code +clang++ "$@" diff --git a/tools/polly/utilities/polly_add_cache_flag.cmake b/tools/polly/utilities/polly_add_cache_flag.cmake new file mode 100644 index 0000000..53209cc --- /dev/null +++ b/tools/polly/utilities/polly_add_cache_flag.cmake @@ -0,0 +1,31 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +# Add flag to CACHE variable. Do nothing if flag already exists. +# +# Note: +# flags should be added one by one since this function check that +# substring "flag" already exists in string "var_name". +# +# Bad: +# polly_add_cache_flag(CMAKE_CXX_FLAGS "-opt1 -opt2 -opt3") +# +# Good: +# polly_add_cache_flag(CMAKE_CXX_FLAGS "-opt1") +# polly_add_cache_flag(CMAKE_CXX_FLAGS "-opt2") +# polly_add_cache_flag(CMAKE_CXX_FLAGS "-opt3") +# +function(polly_add_cache_flag var_name flag) + set(spaced_string " ${${var_name}} ") + string(FIND "${spaced_string}" " ${flag} " flag_index) + if(NOT flag_index EQUAL -1) + return() + endif() + string(COMPARE EQUAL "" "${${var_name}}" is_empty) + if(is_empty) + # beautify: avoid extra space at the end if var_name is empty + set("${var_name}" "${flag}" CACHE STRING "" FORCE) + else() + set("${var_name}" "${flag} ${${var_name}}" CACHE STRING "" FORCE) + endif() +endfunction() diff --git a/tools/polly/utilities/polly_clear_environment_variables.cmake b/tools/polly/utilities/polly_clear_environment_variables.cmake new file mode 100644 index 0000000..3ce8136 --- /dev/null +++ b/tools/polly/utilities/polly_clear_environment_variables.cmake @@ -0,0 +1,290 @@ +# Error while building using 'ExternalProject_Add': + +#CMake Error at /.../share/cmake/Modules/Platform/Darwin.cmake:211 (message): +# CMAKE_OSX_DEPLOYMENT_TARGET is '10.9' but CMAKE_OSX_SYSROOT: +# "iphoneos" +# is not set to a MacOSX SDK with a recognized version. Either set +# CMAKE_OSX_SYSROOT to a valid SDK or set CMAKE_OSX_DEPLOYMENT_TARGET to +# empty. + +unset(ENV{ACTION}) +unset(ENV{AD_HOC_CODE_SIGNING_ALLOWED}) +unset(ENV{ALTERNATE_GROUP}) +unset(ENV{ALTERNATE_MODE}) +unset(ENV{ALTERNATE_OWNER}) +unset(ENV{ALWAYS_SEARCH_USER_PATHS}) +unset(ENV{ALWAYS_USE_SEPARATE_HEADERMAPS}) +unset(ENV{APPLE_INTERNAL_DEVELOPER_DIR}) +unset(ENV{APPLE_INTERNAL_DIR}) +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{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{AVAILABLE_PLATFORMS}) +unset(ENV{BUILD_COMPONENTS}) +unset(ENV{BUILD_DIR}) +unset(ENV{BUILD_ROOT}) +unset(ENV{BUILD_STYLE}) +unset(ENV{BUILD_VARIANTS}) +unset(ENV{BUILT_PRODUCTS_DIR}) +unset(ENV{CACHE_ROOT}) +unset(ENV{CCHROOT}) +unset(ENV{CHMOD}) +unset(ENV{CHOWN}) +unset(ENV{CLASS_FILE_DIR}) +unset(ENV{CLEAN_PRECOMPS}) +unset(ENV{CLONE_HEADERS}) +unset(ENV{CMAKE_OSX_DEPLOYMENT_TARGET}) +unset(ENV{CODESIGNING_FOLDER_PATH}) +unset(ENV{CODE_SIGNING_ALLOWED}) +unset(ENV{CODE_SIGNING_REQUIRED}) +unset(ENV{CODE_SIGN_CONTEXT_CLASS}) +unset(ENV{COMBINE_HIDPI_IMAGES}) +unset(ENV{COMMAND_MODE}) +unset(ENV{COMPOSITE_SDK_DIRS}) +unset(ENV{COMPRESS_PNG_FILES}) +unset(ENV{CONFIGURATION_BUILD_DIR}) +unset(ENV{CONFIGURATION_TEMP_DIR}) +unset(ENV{CONFIGURATION}) +unset(ENV{COPYING_PRESERVES_HFS_DATA}) +unset(ENV{COPY_PHASE_STRIP}) +unset(ENV{COPY_RESOURCES_FROM_STATIC_FRAMEWORKS}) +unset(ENV{CP}) +unset(ENV{CREATE_INFOPLIST_SECTION_IN_BINARY}) +unset(ENV{CURRENT_ARCH}) +unset(ENV{CURRENT_VARIANT}) +unset(ENV{DEAD_CODE_STRIPPING}) +unset(ENV{DEBUGGING_SYMBOLS}) +unset(ENV{DEBUG_INFORMATION_FORMAT}) +unset(ENV{DEFAULT_COMPILER}) +unset(ENV{DEFAULT_KEXT_INSTALL_PATH}) +unset(ENV{DEPLOYMENT_LOCATION}) +unset(ENV{DEPLOYMENT_POSTPROCESSING}) +unset(ENV{DERIVED_FILES_DIR}) +unset(ENV{DERIVED_FILE_DIR}) +unset(ENV{DERIVED_SOURCES_DIR}) +unset(ENV{DEVELOPER_APPLICATIONS_DIR}) +unset(ENV{DEVELOPER_BIN_DIR}) +# unset(ENV{DEVELOPER_DIR}) # Keep it to allow Xcode switching +unset(ENV{DEVELOPER_FRAMEWORKS_DIR_QUOTED}) +unset(ENV{DEVELOPER_FRAMEWORKS_DIR}) +unset(ENV{DEVELOPER_LIBRARY_DIR}) +unset(ENV{DEVELOPER_SDK_DIR}) +unset(ENV{DEVELOPER_TOOLS_DIR}) +unset(ENV{DEVELOPER_USR_DIR}) +unset(ENV{DEVELOPMENT_LANGUAGE}) +unset(ENV{DO_HEADER_SCANNING_IN_JAM}) +unset(ENV{DSTROOT}) +unset(ENV{DT_TOOLCHAIN_DIR}) +unset(ENV{DWARF_DSYM_FILE_NAME}) +unset(ENV{DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT}) +unset(ENV{DWARF_DSYM_FOLDER_PATH}) +unset(ENV{EFFECTIVE_PLATFORM_NAME}) +unset(ENV{EMBEDDED_PROFILE_NAME}) +unset(ENV{ENABLE_HEADER_DEPENDENCIES}) +unset(ENV{ENTITLEMENTS_REQUIRED}) +unset(ENV{EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS}) +unset(ENV{EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES}) +unset(ENV{FILE_LIST}) +unset(ENV{FIXED_FILES_DIR}) +unset(ENV{FRAMEWORK_VERSION}) +unset(ENV{GCC3_VERSION}) +unset(ENV{GCC_GENERATE_DEBUGGING_SYMBOLS}) +unset(ENV{GCC_INLINES_ARE_PRIVATE_EXTERN}) +unset(ENV{GCC_OPTIMIZATION_LEVEL}) +unset(ENV{GCC_PFE_FILE_C_DIALECTS}) +unset(ENV{GCC_PREPROCESSOR_DEFINITIONS}) +unset(ENV{GCC_SYMBOLS_PRIVATE_EXTERN}) +unset(ENV{GCC_THUMB_SUPPORT}) +unset(ENV{GCC_TREAT_WARNINGS_AS_ERRORS}) +unset(ENV{GCC_VERSION_IDENTIFIER}) +unset(ENV{GCC_VERSION}) +unset(ENV{GENERATE_MASTER_OBJECT_FILE}) +unset(ENV{GENERATE_PKGINFO_FILE}) +unset(ENV{GENERATE_PROFILING_CODE}) +unset(ENV{GID}) +unset(ENV{GROUP}) +unset(ENV{HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT}) +unset(ENV{HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES}) +unset(ENV{HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS}) +unset(ENV{HEADERMAP_INCLUDES_PROJECT_HEADERS}) +unset(ENV{HEADER_SEARCH_PATHS}) +unset(ENV{ICONV}) +unset(ENV{INFOPLIST_EXPAND_BUILD_SETTINGS}) +unset(ENV{INFOPLIST_OUTPUT_FORMAT}) +unset(ENV{INFOPLIST_PREPROCESS}) +unset(ENV{INSTALL_DIR}) +unset(ENV{INSTALL_GROUP}) +unset(ENV{INSTALL_MODE_FLAG}) +unset(ENV{INSTALL_OWNER}) +unset(ENV{INSTALL_ROOT}) +unset(ENV{IPHONEOS_DEPLOYMENT_TARGET}) # ! +unset(ENV{JAVAC_DEFAULT_FLAGS}) +unset(ENV{JAVA_APP_STUB}) +unset(ENV{JAVA_ARCHIVE_CLASSES}) +unset(ENV{JAVA_ARCHIVE_TYPE}) +unset(ENV{JAVA_COMPILER}) +unset(ENV{JAVA_FRAMEWORK_RESOURCES_DIRS}) +unset(ENV{JAVA_JAR_FLAGS}) +unset(ENV{JAVA_SOURCE_SUBDIR}) +unset(ENV{JAVA_USE_DEPENDENCIES}) +unset(ENV{JAVA_ZIP_FLAGS}) +unset(ENV{JIKES_DEFAULT_FLAGS}) +unset(ENV{KEEP_PRIVATE_EXTERNS}) +unset(ENV{LD_DEPENDENCY_INFO_FILE}) +unset(ENV{LD_GENERATE_MAP_FILE}) +unset(ENV{LD_MAP_FILE_PATH}) +unset(ENV{LD_NO_PIE}) +unset(ENV{LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER}) +unset(ENV{LEGACY_DEVELOPER_DIR}) +unset(ENV{LEX}) +unset(ENV{LIBRARY_FLAG_NOSPACE}) +unset(ENV{LIBRARY_KEXT_INSTALL_PATH}) +unset(ENV{LINKER_DISPLAYS_MANGLED_NAMES}) +unset(ENV{LINK_FILE_LIST_normal_armv7}) +unset(ENV{LINK_WITH_STANDARD_LIBRARIES}) +unset(ENV{LOCAL_ADMIN_APPS_DIR}) +unset(ENV{LOCAL_APPS_DIR}) +unset(ENV{LOCAL_DEVELOPER_DIR}) +unset(ENV{LOCAL_LIBRARY_DIR}) +unset(ENV{MAC_OS_X_PRODUCT_BUILD_VERSION}) +unset(ENV{MAC_OS_X_VERSION_ACTUAL}) +unset(ENV{MAC_OS_X_VERSION_MAJOR}) +unset(ENV{MAC_OS_X_VERSION_MINOR}) +unset(ENV{MAKEFLAGS}) +unset(ENV{MAKELEVEL}) +unset(ENV{MFLAGS}) +unset(ENV{MODULE_CACHE_DIR}) +unset(ENV{NATIVE_ARCH_32_BIT}) +unset(ENV{NATIVE_ARCH_64_BIT}) +unset(ENV{NATIVE_ARCH_ACTUAL}) +unset(ENV{NATIVE_ARCH}) +unset(ENV{NO_COMMON}) +unset(ENV{OBJECT_FILE_DIR_normal}) +unset(ENV{OBJECT_FILE_DIR}) +unset(ENV{OBJROOT}) +unset(ENV{ONLY_ACTIVE_ARCH}) +unset(ENV{OPTIMIZATION_LEVEL}) +unset(ENV{OSAC}) +unset(ENV{OS}) +unset(ENV{OTHER_CFLAGS}) +unset(ENV{OTHER_CPLUSPLUSFLAGS}) +unset(ENV{OTHER_LDFLAGS}) +unset(ENV{PASCAL_STRINGS}) +unset(ENV{PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES}) +unset(ENV{PKGINFO_FILE_PATH}) +unset(ENV{PLATFORM_DEVELOPER_APPLICATIONS_DIR}) +unset(ENV{PLATFORM_DEVELOPER_BIN_DIR}) +unset(ENV{PLATFORM_DEVELOPER_LIBRARY_DIR}) +unset(ENV{PLATFORM_DEVELOPER_SDK_DIR}) +unset(ENV{PLATFORM_DEVELOPER_TOOLS_DIR}) +unset(ENV{PLATFORM_DEVELOPER_USR_DIR}) +unset(ENV{PLATFORM_DIR}) +unset(ENV{PLATFORM_NAME}) +unset(ENV{PLATFORM_PREFERRED_ARCH}) +unset(ENV{PLATFORM_PRODUCT_BUILD_VERSION}) +unset(ENV{PLIST_FILE_OUTPUT_FORMAT}) +unset(ENV{PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR}) +unset(ENV{PRECOMP_DESTINATION_DIR}) +unset(ENV{PRESERVE_DEAD_CODE_INITS_AND_TERMS}) +unset(ENV{PRODUCT_NAME}) +unset(ENV{PRODUCT_SETTINGS_PATH}) +unset(ENV{PROFILING_CODE}) +unset(ENV{PROJECT_DERIVED_FILE_DIR}) +unset(ENV{PROJECT_DIR}) +unset(ENV{PROJECT_FILE_PATH}) +unset(ENV{PROJECT_NAME}) +unset(ENV{PROJECT_TEMP_DIR}) +unset(ENV{PROJECT_TEMP_ROOT}) +unset(ENV{PROJECT}) +unset(ENV{RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS}) +unset(ENV{REMOVE_CVS_FROM_RESOURCES}) +unset(ENV{REMOVE_GIT_FROM_RESOURCES}) +unset(ENV{REMOVE_HG_FROM_RESOURCES}) +unset(ENV{REMOVE_SVN_FROM_RESOURCES}) +unset(ENV{REZ_COLLECTOR_DIR}) +unset(ENV{REZ_OBJECTS_DIR}) +unset(ENV{SCAN_ALL_SOURCE_FILES_FOR_INCLUDES}) +unset(ENV{SCRIPT_INPUT_FILE_COUNT}) +unset(ENV{SCRIPT_OUTPUT_FILE_COUNT}) +unset(ENV{SDKROOT}) # ! +unset(ENV{SDK_DIR}) +unset(ENV{SDK_NAME}) +unset(ENV{SDK_PRODUCT_BUILD_VERSION}) +unset(ENV{SED}) +unset(ENV{SEPARATE_STRIP}) +unset(ENV{SEPARATE_SYMBOL_EDIT}) +unset(ENV{SET_DIR_MODE_OWNER_GROUP}) +unset(ENV{SET_FILE_MODE_OWNER_GROUP}) +unset(ENV{SHARED_DERIVED_FILE_DIR}) +unset(ENV{SHARED_PRECOMPS_DIR}) +unset(ENV{SKIP_INSTALL}) +unset(ENV{SOURCE_ROOT}) +unset(ENV{SRCROOT}) +unset(ENV{STRINGS_FILE_OUTPUT_ENCODING}) +unset(ENV{STRIP_INSTALLED_PRODUCT}) +unset(ENV{STRIP_STYLE}) +unset(ENV{SUPPORTED_DEVICE_FAMILIES}) +unset(ENV{SUPPORTED_PLATFORMS}) +unset(ENV{SYMROOT}) +unset(ENV{SYSTEM_ADMIN_APPS_DIR}) +unset(ENV{SYSTEM_APPS_DIR}) +unset(ENV{SYSTEM_CORE_SERVICES_DIR}) +unset(ENV{SYSTEM_DEMOS_DIR}) +unset(ENV{SYSTEM_DEVELOPER_APPS_DIR}) +unset(ENV{SYSTEM_DEVELOPER_BIN_DIR}) +unset(ENV{SYSTEM_DEVELOPER_DEMOS_DIR}) +unset(ENV{SYSTEM_DEVELOPER_DIR}) +unset(ENV{SYSTEM_DEVELOPER_DOC_DIR}) +unset(ENV{SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR}) +unset(ENV{SYSTEM_DEVELOPER_JAVA_TOOLS_DIR}) +unset(ENV{SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR}) +unset(ENV{SYSTEM_DEVELOPER_RELEASENOTES_DIR}) +unset(ENV{SYSTEM_DEVELOPER_TOOLS_DOC_DIR}) +unset(ENV{SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR}) +unset(ENV{SYSTEM_DEVELOPER_TOOLS}) +unset(ENV{SYSTEM_DEVELOPER_USR_DIR}) +unset(ENV{SYSTEM_DEVELOPER_UTILITIES_DIR}) +unset(ENV{SYSTEM_DOCUMENTATION_DIR}) +unset(ENV{SYSTEM_KEXT_INSTALL_PATH}) +unset(ENV{SYSTEM_LIBRARY_DIR}) +unset(ENV{TARGETED_DEVICE_FAMILY}) +unset(ENV{TARGETNAME}) +unset(ENV{TARGET_BUILD_DIR}) +unset(ENV{TARGET_NAME}) +unset(ENV{TARGET_TEMP_DIR}) +unset(ENV{TEMP_DIR}) +unset(ENV{TEMP_FILES_DIR}) +unset(ENV{TEMP_FILE_DIR}) +unset(ENV{TEMP_ROOT}) +unset(ENV{TOOLCHAINS}) +unset(ENV{UID}) +unset(ENV{UNSTRIPPED_PRODUCT}) +unset(ENV{USER_APPS_DIR}) +unset(ENV{USER_LIBRARY_DIR}) +unset(ENV{USE_DYNAMIC_NO_PIC}) +unset(ENV{USE_HEADERMAP}) +unset(ENV{USE_HEADER_SYMLINKS}) +unset(ENV{VALIDATE_PRODUCT}) +unset(ENV{VALID_ARCHS}) +unset(ENV{VERBOSE_PBXCP}) +unset(ENV{VERSION_INFO_BUILDER}) +unset(ENV{VERSION_INFO_FILE}) +unset(ENV{VERSION_INFO_STRING}) +unset(ENV{WARNING_CFLAGS}) +unset(ENV{XCODE_APP_SUPPORT_DIR}) +unset(ENV{XCODE_PRODUCT_BUILD_VERSION}) +unset(ENV{XCODE_VERSION_ACTUAL}) +unset(ENV{XCODE_VERSION_MAJOR}) +unset(ENV{XCODE_VERSION_MINOR}) +unset(ENV{XPCSERVICES_FOLDER_PATH}) +unset(ENV{YACC}) +unset(ENV{arch}) +unset(ENV{variant}) diff --git a/tools/polly/utilities/polly_common.cmake b/tools/polly/utilities/polly_common.cmake new file mode 100644 index 0000000..8173b33 --- /dev/null +++ b/tools/polly/utilities/polly_common.cmake @@ -0,0 +1,49 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_UTILITIES_COMMON_CMAKE) + return() +else() + set(POLLY_UTILITIES_COMMON_CMAKE 1) +endif() + +option(POLLY_STATUS_PRINT "Print process messages" ON) +option(POLLY_STATUS_DEBUG "Print all process messages" OFF) + +# Add extra cmake modules +include("${CMAKE_CURRENT_LIST_DIR}/polly_module_path.cmake") + +include(polly_fatal_error) +include(polly_status_debug) +include(polly_status_print) + +# All well-known variables must be CACHE type: +# http://www.cmake.org/pipermail/cmake/2012-January/048429.html + +# Check and print customization variables +if(NOT POLLY_TOOLCHAIN_NAME) + polly_fatal_error("POLLY_TOOLCHAIN_NAME is empty") +endif() + +if(NOT POLLY_TOOLCHAIN_TAG) + polly_fatal_error("POLLY_TOOLCHAIN_TAG is empty") +endif() + +polly_status_print("Used toolchain: ${POLLY_TOOLCHAIN_NAME}") +polly_status_debug("Used tag: ${POLLY_TOOLCHAIN_TAG}") + +# support for hunter (github.com/ruslo/hunter) +set(HUNTER_INSTALL_TAG ${POLLY_TOOLCHAIN_TAG}) + +# Other +if(NOT CMAKE_DEBUG_POSTFIX) + polly_status_debug("CMAKE_DEBUG_POSTFIX is empty") + set( + CMAKE_DEBUG_POSTFIX + "d" + CACHE + STRING + "Debug postfix (e.g. libmy.a libmyd.a)" + ) + polly_status_debug("CMAKE_DEBUG_POSTFIX set to '${CMAKE_DEBUG_POSTFIX}'") +endif() diff --git a/tools/polly/utilities/polly_fatal_error.cmake b/tools/polly/utilities/polly_fatal_error.cmake new file mode 100644 index 0000000..7116c8f --- /dev/null +++ b/tools/polly/utilities/polly_fatal_error.cmake @@ -0,0 +1,11 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +function(polly_fatal_error) + foreach(print_message ${ARGV}) + message("") + message(${print_message}) + message("") + endforeach() + message(FATAL_ERROR "") +endfunction() diff --git a/tools/polly/utilities/polly_init.cmake b/tools/polly/utilities/polly_init.cmake new file mode 100644 index 0000000..99ee401 --- /dev/null +++ b/tools/polly/utilities/polly_init.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_UTILITIES_POLLY_INIT_CMAKE_) + return() +else() + set(POLLY_UTILITIES_POLLY_INIT_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/polly_fatal_error.cmake") + +macro(polly_init name generator) + set(POLLY_TOOLCHAIN_NAME "${name}") + get_filename_component( + POLLY_TOOLCHAIN_TAG "${CMAKE_CURRENT_LIST_FILE}" NAME_WE + ) + + string(COMPARE EQUAL "${CMAKE_GENERATOR}" "${generator}" _polly_correct) + if(NOT _polly_correct) + polly_fatal_error( + "Please change generator to: ${generator}\n" + "(Current generator: ${CMAKE_GENERATOR})" + ) + endif() + set(HUNTER_CMAKE_GENERATOR "${generator}") +endmacro() diff --git a/tools/polly/utilities/polly_ios_bundle_identifier.cmake b/tools/polly/utilities/polly_ios_bundle_identifier.cmake new file mode 100644 index 0000000..1189996 --- /dev/null +++ b/tools/polly/utilities/polly_ios_bundle_identifier.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_UTILITIES_POLLY_IOS_BUNDLE_IDENTIFIER_CMAKE_) + return() +else() + set(POLLY_UTILITIES_POLLY_IOS_BUNDLE_IDENTIFIER_CMAKE_ 1) +endif() + +include(polly_status_debug) + +string(COMPARE EQUAL "$ENV{POLLY_IOS_BUNDLE_IDENTIFIER}" "" _is_empty) +if(_is_empty) + set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.example") +else() + set(MACOSX_BUNDLE_GUI_IDENTIFIER $ENV{POLLY_IOS_BUNDLE_IDENTIFIER}) +endif() + +polly_status_debug( + "Using Xcode bundle identifier: ${MACOSX_BUNDLE_GUI_IDENTIFIER}" +) diff --git a/tools/polly/utilities/polly_ios_development_team.cmake b/tools/polly/utilities/polly_ios_development_team.cmake new file mode 100644 index 0000000..506f363 --- /dev/null +++ b/tools/polly/utilities/polly_ios_development_team.cmake @@ -0,0 +1,28 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_UTILITIES_POLLY_IOS_DEVELOPMENT_TEAM_CMAKE_) + return() +else() + set(POLLY_UTILITIES_POLLY_IOS_DEVELOPMENT_TEAM_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/polly_fatal_error.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/polly_status_debug.cmake") + +string(COMPARE EQUAL "$ENV{POLLY_IOS_DEVELOPMENT_TEAM}" "" _is_empty) +if(_is_empty) + polly_fatal_error( + "Environment variable POLLY_IOS_DEVELOPMENT_TEAM is empty" + " (see details: http://polly.readthedocs.io/en/latest/toolchains/ios/errors/polly_ios_development_team.html)" + ) +endif() + +set( + CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM + "$ENV{POLLY_IOS_DEVELOPMENT_TEAM}" +) + +polly_status_debug( + "Using iOS development team id: ${CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM}" +) diff --git a/tools/polly/utilities/polly_module_path.cmake b/tools/polly/utilities/polly_module_path.cmake new file mode 100644 index 0000000..683c257 --- /dev/null +++ b/tools/polly/utilities/polly_module_path.cmake @@ -0,0 +1,3 @@ +# Add extra cmake modules +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../find") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/tools/polly/utilities/polly_status_debug.cmake b/tools/polly/utilities/polly_status_debug.cmake new file mode 100644 index 0000000..bfa9e8d --- /dev/null +++ b/tools/polly/utilities/polly_status_debug.cmake @@ -0,0 +1,10 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +function(polly_status_debug) + foreach(print_message ${ARGV}) + if(POLLY_STATUS_DEBUG) + message(STATUS "[polly *** DEBUG ***] ${print_message}") + endif() + endforeach() +endfunction() diff --git a/tools/polly/utilities/polly_status_print.cmake b/tools/polly/utilities/polly_status_print.cmake new file mode 100644 index 0000000..04e65fc --- /dev/null +++ b/tools/polly/utilities/polly_status_print.cmake @@ -0,0 +1,10 @@ +# Copyright (c) 2013, Ruslan Baratov +# All rights reserved. + +function(polly_status_print) + foreach(print_message ${ARGV}) + if(POLLY_STATUS_PRINT OR POLLY_STATUS_DEBUG) + message(STATUS "[polly] ${print_message}") + endif() + endforeach() +endfunction() diff --git a/tools/polly/vs-10-2010.cmake b/tools/polly/vs-10-2010.cmake new file mode 100644 index 0000000..804615d --- /dev/null +++ b/tools/polly/vs-10-2010.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_10_2010_CMAKE_) + return() +else() + set(POLLY_VS_10_2010_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 10 2010" + "Visual Studio 10 2010" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-11-2012-arm.cmake b/tools/polly/vs-11-2012-arm.cmake new file mode 100644 index 0000000..96a419f --- /dev/null +++ b/tools/polly/vs-11-2012-arm.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_11_2012_ARM_CMAKE_) + return() +else() + set(POLLY_VS_11_2012_ARM_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 11 2012 ARM" + "Visual Studio 11 2012 ARM" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-11-2012-win64.cmake b/tools/polly/vs-11-2012-win64.cmake new file mode 100644 index 0000000..ec11791 --- /dev/null +++ b/tools/polly/vs-11-2012-win64.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_11_2012_WIN64_CMAKE_) + return() +else() + set(POLLY_VS_11_2012_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 11 2012 Win64" + "Visual Studio 11 2012 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-11-2012.cmake b/tools/polly/vs-11-2012.cmake new file mode 100644 index 0000000..6e1e623 --- /dev/null +++ b/tools/polly/vs-11-2012.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_11_2012_CMAKE_) + return() +else() + set(POLLY_VS_11_2012_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 11 2012" + "Visual Studio 11 2012" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-12-2013-arm.cmake b/tools/polly/vs-12-2013-arm.cmake new file mode 100644 index 0000000..d55ff1d --- /dev/null +++ b/tools/polly/vs-12-2013-arm.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_12_2013_ARM_CMAKE_) + return() +else() + set(POLLY_VS_12_2013_ARM_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 12 2013 ARM" + "Visual Studio 12 2013 ARM" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-12-2013-mt.cmake b/tools/polly/vs-12-2013-mt.cmake new file mode 100644 index 0000000..abccfcf --- /dev/null +++ b/tools/polly/vs-12-2013-mt.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_12_2013_CMAKE_) + return() +else() + set(POLLY_VS_12_2013_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 12 2013 / MT (static)" + "Visual Studio 12 2013" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-mt.cmake") diff --git a/tools/polly/vs-12-2013-win64.cmake b/tools/polly/vs-12-2013-win64.cmake new file mode 100644 index 0000000..4910289 --- /dev/null +++ b/tools/polly/vs-12-2013-win64.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_12_2013_WIN64_CMAKE_) + return() +else() + set(POLLY_VS_12_2013_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 12 2013 Win64" + "Visual Studio 12 2013 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-12-2013-xp.cmake b/tools/polly/vs-12-2013-xp.cmake new file mode 100644 index 0000000..1d648f4 --- /dev/null +++ b/tools/polly/vs-12-2013-xp.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_12_2013_XP_CMAKE_) + return() +else() + set(POLLY_VS_12_2013_XP_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 12 2013" + "Visual Studio 12 2013" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-12-2013.cmake b/tools/polly/vs-12-2013.cmake new file mode 100644 index 0000000..b69e717 --- /dev/null +++ b/tools/polly/vs-12-2013.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_12_2013_CMAKE_) + return() +else() + set(POLLY_VS_12_2013_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 12 2013" + "Visual Studio 12 2013" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-14-2015-arm.cmake b/tools/polly/vs-14-2015-arm.cmake new file mode 100644 index 0000000..81c0022 --- /dev/null +++ b/tools/polly/vs-14-2015-arm.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2016 +# All rights reserved. + +if(DEFINED POLLY_VS_14_2015_ARM_CMAKE_) + return() +else() + set(POLLY_VS_14_2015_ARM_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 14 2015 ARM" + "Visual Studio 14 2015 ARM" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-14-2015-sdk-8-1.cmake b/tools/polly/vs-14-2015-sdk-8-1.cmake new file mode 100644 index 0000000..09655a7 --- /dev/null +++ b/tools/polly/vs-14-2015-sdk-8-1.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_14_2015_SDK_8_1_CMAKE_) + return() +else() + set(POLLY_VS_14_2015_SDK_8_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 14 2015 | SDK 8.1" + "Visual Studio 14 2015" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_SYSTEM_VERSION 8.1) diff --git a/tools/polly/vs-14-2015-win64-sdk-8-1.cmake b/tools/polly/vs-14-2015-win64-sdk-8-1.cmake new file mode 100644 index 0000000..5ee7d5e --- /dev/null +++ b/tools/polly/vs-14-2015-win64-sdk-8-1.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_14_2015_WIN64_SDK_8_1_CMAKE_) + return() +else() + set(POLLY_VS_14_2015_WIN64_SDK_8_1_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 14 2015 Win64 | SDK 8.1" + "Visual Studio 14 2015 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +set(CMAKE_SYSTEM_VERSION 8.1) diff --git a/tools/polly/vs-14-2015-win64.cmake b/tools/polly/vs-14-2015-win64.cmake new file mode 100644 index 0000000..8282f51 --- /dev/null +++ b/tools/polly/vs-14-2015-win64.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2016 +# All rights reserved. + +if(DEFINED POLLY_VS_14_2015_WIN64_CMAKE_) + return() +else() + set(POLLY_VS_14_2015_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 14 2015 Win64" + "Visual Studio 14 2015 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-14-2015.cmake b/tools/polly/vs-14-2015.cmake new file mode 100644 index 0000000..3120676 --- /dev/null +++ b/tools/polly/vs-14-2015.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_14_2015_CMAKE_) + return() +else() + set(POLLY_VS_14_2015_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 14 2015" + "Visual Studio 14 2015" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-15-2017-cxx17.cmake b/tools/polly/vs-15-2017-cxx17.cmake new file mode 100644 index 0000000..937ed84 --- /dev/null +++ b/tools/polly/vs-15-2017-cxx17.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_CXX17_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 15 2017 / C++17" + "Visual Studio 15 2017" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-cxx17.cmake") diff --git a/tools/polly/vs-15-2017-store-10-zw.cmake b/tools/polly/vs-15-2017-store-10-zw.cmake new file mode 100644 index 0000000..2c92f49 --- /dev/null +++ b/tools/polly/vs-15-2017-store-10-zw.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_STORE_10_ZW_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_STORE_10_ZW_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(CMAKE_SYSTEM_NAME WindowsStore) +set(CMAKE_SYSTEM_VERSION 10.0) + +polly_init( + "Visual Studio 15 2017 / ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} / ZW" + "Visual Studio 15 2017" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-zw.cmake") diff --git a/tools/polly/vs-15-2017-win64-cxx14.cmake b/tools/polly/vs-15-2017-win64-cxx14.cmake new file mode 100644 index 0000000..48f92fa --- /dev/null +++ b/tools/polly/vs-15-2017-win64-cxx14.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_WIN64_CXX14_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_WIN64_CXX14_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 15 2017 Win64 / C++14" + "Visual Studio 15 2017 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-cxx14.cmake") diff --git a/tools/polly/vs-15-2017-win64-cxx17.cmake b/tools/polly/vs-15-2017-win64-cxx17.cmake new file mode 100644 index 0000000..e3c320a --- /dev/null +++ b/tools/polly/vs-15-2017-win64-cxx17.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_WIN64_CXX17_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_WIN64_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 15 2017 Win64 / C++17" + "Visual Studio 15 2017 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-cxx17.cmake") diff --git a/tools/polly/vs-15-2017-win64-llvm-vs2014.cmake b/tools/polly/vs-15-2017-win64-llvm-vs2014.cmake new file mode 100644 index 0000000..0c3430a --- /dev/null +++ b/tools/polly/vs-15-2017-win64-llvm-vs2014.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_WIN64_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 15 2017 Win64 LLVM vs2014" + "Visual Studio 15 2017 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-15-2017-win64-llvm.cmake b/tools/polly/vs-15-2017-win64-llvm.cmake new file mode 100644 index 0000000..7c8ca6d --- /dev/null +++ b/tools/polly/vs-15-2017-win64-llvm.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_WIN64_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 15 2017 Win64 LLVM" + "Visual Studio 15 2017 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-15-2017-win64-store-10-cxx17.cmake b/tools/polly/vs-15-2017-win64-store-10-cxx17.cmake new file mode 100644 index 0000000..384b174 --- /dev/null +++ b/tools/polly/vs-15-2017-win64-store-10-cxx17.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_WIN64_STORE_10_CXX17_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_WIN64_STORE_10_CXX17_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(CMAKE_SYSTEM_NAME WindowsStore) +set(CMAKE_SYSTEM_VERSION 10.0) + +polly_init( + "Visual Studio 15 2017 Win64 / ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} / C++17" + "Visual Studio 15 2017 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-cxx17.cmake") diff --git a/tools/polly/vs-15-2017-win64-store-10-zw.cmake b/tools/polly/vs-15-2017-win64-store-10-zw.cmake new file mode 100644 index 0000000..79c587b --- /dev/null +++ b/tools/polly/vs-15-2017-win64-store-10-zw.cmake @@ -0,0 +1,21 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_WIN64_STORE_10_ZW_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_WIN64_STORE_10_ZW_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(CMAKE_SYSTEM_NAME WindowsStore) +set(CMAKE_SYSTEM_VERSION 10.0) + +polly_init( + "Visual Studio 15 2017 Win64 / ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} / ZW" + "Visual Studio 15 2017 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-zw.cmake") diff --git a/tools/polly/vs-15-2017-win64-z7.cmake b/tools/polly/vs-15-2017-win64-z7.cmake new file mode 100644 index 0000000..26772c8 --- /dev/null +++ b/tools/polly/vs-15-2017-win64-z7.cmake @@ -0,0 +1,18 @@ +# Copyright (c) 2015-2018, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_WIN64_Z7_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_WIN64_Z7_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 15 2017 Win64" + "Visual Studio 15 2017 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/vs-z7.cmake") diff --git a/tools/polly/vs-15-2017-win64.cmake b/tools/polly/vs-15-2017-win64.cmake new file mode 100644 index 0000000..d6db379 --- /dev/null +++ b/tools/polly/vs-15-2017-win64.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_WIN64_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_WIN64_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 15 2017 Win64" + "Visual Studio 15 2017 Win64" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-15-2017.cmake b/tools/polly/vs-15-2017.cmake new file mode 100644 index 0000000..30638d4 --- /dev/null +++ b/tools/polly/vs-15-2017.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015-2017, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_15_2017_CMAKE_) + return() +else() + set(POLLY_VS_15_2017_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 15 2017" + "Visual Studio 15 2017" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-8-2005.cmake b/tools/polly/vs-8-2005.cmake new file mode 100644 index 0000000..d5c26f3 --- /dev/null +++ b/tools/polly/vs-8-2005.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2014, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_8_2005_CMAKE_) + return() +else() + set(POLLY_VS_8_2005_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 8 2005" + "Visual Studio 8 2005" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/vs-9-2008.cmake b/tools/polly/vs-9-2008.cmake new file mode 100644 index 0000000..e547310 --- /dev/null +++ b/tools/polly/vs-9-2008.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_VS_9_2008_CMAKE_) + return() +else() + set(POLLY_VS_9_2008_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +polly_init( + "Visual Studio 9 2008" + "Visual Studio 9 2008" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") diff --git a/tools/polly/xcode-cxx98.cmake b/tools/polly/xcode-cxx98.cmake new file mode 100644 index 0000000..799732c --- /dev/null +++ b/tools/polly/xcode-cxx98.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_XCODE_CXX98_CMAKE_) + return() +else() + set(POLLY_XCODE_CXX98_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode / ${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++98 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx98.cmake") diff --git a/tools/polly/xcode-gcc.cmake b/tools/polly/xcode-gcc.cmake new file mode 100644 index 0000000..b03ae2a --- /dev/null +++ b/tools/polly/xcode-gcc.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_XCODE_GCC_CMAKE_) + return() +else() + set(POLLY_XCODE_GCC_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(POLLY_XCODE_COMPILER "gcc") +polly_init( + "Xcode / ${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") diff --git a/tools/polly/xcode-hid-sections.cmake b/tools/polly/xcode-hid-sections.cmake new file mode 100644 index 0000000..be9077c --- /dev/null +++ b/tools/polly/xcode-hid-sections.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_XCODE_HID_SECTIONS_CMAKE_) + return() +else() + set(POLLY_XCODE_HID_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode / ${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support / hidden / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/hidden.cmake") diff --git a/tools/polly/xcode-nocxx.cmake b/tools/polly/xcode-nocxx.cmake new file mode 100644 index 0000000..902411f --- /dev/null +++ b/tools/polly/xcode-nocxx.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_XCODE_NOCXX_CMAKE_) + return() +else() + set(POLLY_XCODE_NOCXX_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode / ${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++)" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") diff --git a/tools/polly/xcode-sections.cmake b/tools/polly/xcode-sections.cmake new file mode 100644 index 0000000..c109f00 --- /dev/null +++ b/tools/polly/xcode-sections.cmake @@ -0,0 +1,26 @@ +# Copyright (c) 2014-2016, Ruslan Baratov +# Copyright (c) 2016, David Hirvonen +# All rights reserved. + +if(DEFINED POLLY_XCODE_SECTIONS_CMAKE_) + return() +else() + set(POLLY_XCODE_SECTIONS_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode / ${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support / data-sections / function-sections" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/function-sections.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/data-sections.cmake") diff --git a/tools/polly/xcode.cmake b/tools/polly/xcode.cmake new file mode 100644 index 0000000..7def9e2 --- /dev/null +++ b/tools/polly/xcode.cmake @@ -0,0 +1,23 @@ +# Copyright (c) 2014-2015, Ruslan Baratov +# All rights reserved. + +if(DEFINED POLLY_XCODE_CMAKE_) + return() +else() + set(POLLY_XCODE_CMAKE_ 1) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_init.cmake") + +set(POLLY_XCODE_COMPILER "clang") +polly_init( + "Xcode / ${POLLY_XCODE_COMPILER} / \ +LLVM Standard C++ Library (libc++) / c++11 support" + "Xcode" +) + +include("${CMAKE_CURRENT_LIST_DIR}/utilities/polly_common.cmake") + +include("${CMAKE_CURRENT_LIST_DIR}/compiler/xcode.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/library/std/libcxx.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/flags/cxx11.cmake") From cb9103024761262e62b7c26567e0b52e04bcb14b Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 3 Jan 2019 10:11:58 +0300 Subject: [PATCH 108/133] update huner gate --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 86f161f..f06f21d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which # you should have received as part of this distribution. From dccc5b1bc7ab6b6d23dff398481b80a6f668fced Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 3 Jan 2019 10:19:31 +0300 Subject: [PATCH 109/133] remove old hunter gate --- cmake/HunterGate.cmake | 508 ----------------------------------------- 1 file changed, 508 deletions(-) delete mode 100644 cmake/HunterGate.cmake diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake deleted file mode 100644 index 99882d2..0000000 --- a/cmake/HunterGate.cmake +++ /dev/null @@ -1,508 +0,0 @@ -# Copyright (c) 2013-2015, 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.0) -# -# 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 - -cmake_minimum_required(VERSION 3.0) # Minimum for Hunter -include(CMakeParseArguments) # cmake_parse_arguments - -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_WIKI "https://github.com/ruslo/hunter/wiki") - -function(hunter_gate_status_print) - foreach(print_message ${ARGV}) - if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) - message(STATUS "[hunter] ${print_message}") - endif() - endforeach() -endfunction() - -function(hunter_gate_status_debug) - foreach(print_message ${ARGV}) - if(HUNTER_STATUS_DEBUG) - string(TIMESTAMP timestamp) - message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") - endif() - endforeach() -endfunction() - -function(hunter_gate_wiki wiki_page) - message("------------------------------ WIKI -------------------------------") - message(" ${HUNTER_WIKI}/${wiki_page}") - 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_wiki("error.internal") -endfunction() - -function(hunter_gate_fatal_error) - cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}") - string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki) - if(have_no_wiki) - hunter_gate_internal_error("Expected wiki") - 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_wiki("${hunter_WIKI}") -endfunction() - -function(hunter_gate_user_error) - hunter_gate_fatal_error(${ARGV} WIKI "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) - - if(EXISTS "${root}/cmake/Hunter") - set(hunter_self "${root}") - else() - set( - hunter_self - "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" - ) - endif() - - 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" - WIKI "error.detect.hunter.root" - ) -endfunction() - -macro(hunter_gate_lock dir) - if(NOT HUNTER_SKIP_LOCK) - if("${CMAKE_VERSION}" VERSION_LESS "3.2") - hunter_gate_fatal_error( - "Can't lock, upgrade to CMake 3.2 or use HUNTER_SKIP_LOCK" - WIKI "error.can.not.lock" - ) - endif() - hunter_gate_status_debug("Locking directory: ${dir}") - file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) - hunter_gate_status_debug("Lock done") - endif() -endmacro() - -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}" - WIKI "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_lock("${dir}") - 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.0)\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" - " 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}") - set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}") - else() - # 'toolchain_arg' can't be empty - set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") - endif() - - execute_process( - COMMAND "${CMAKE_COMMAND}" "-H${dir}" "-B${build_dir}" "-G${CMAKE_GENERATOR}" "${toolchain_arg}" - WORKING_DIRECTORY "${dir}" - RESULT_VARIABLE download_result - ${logging_params} - ) - - if(NOT download_result EQUAL 0) - hunter_gate_internal_error("Configure project failed") - 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() - 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_LIST_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}" - WIKI "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!)" - WIKI "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") - if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") - # Hunter downloaded manually (e.g. by 'git clone') - set(_unused "xxxxxxxxxx") - set(HUNTER_GATE_SHA1 "${_unused}") - set(HUNTER_GATE_VERSION "${_unused}") - else() - 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() - endif() - include("${_master_location}") - set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) - endif() -endmacro() From cb68a65521c82094bf0765f75e94d8b7afe642c0 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Thu, 3 Jan 2019 10:35:09 +0300 Subject: [PATCH 110/133] formatting cmake config file --- CMakeLists.txt | 101 ++++++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 56 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f06f21d..821569c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,16 +35,12 @@ set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) -#include($ENV{POLLY_ROOT}/analyze.cmake OPTIONAL) - set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") option(BUILD_TESTS "Build tests" OFF) option(BUILD_EXAMPLES "Build Examples" OFF) -option(BUILD_PKGCONFIG "Build in PKGCONFIG mode" OFF) - option(WDC_VERBOSE "Print verbose information" OFF) hunter_add_package(OpenSSL) @@ -67,12 +63,10 @@ endif() target_link_libraries(libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) target_include_directories(libwdc PUBLIC - $ - $ + $ + $ ) -# Install - set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") set(CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}") @@ -85,20 +79,20 @@ set(NAMESPACE "${PROJECT_NAME}::") include(CMakePackageConfigHelpers) write_basic_package_version_file( - "${VERSION_CONFIG}" COMPATIBILITY SameMajorVersion + "${VERSION_CONFIG}" COMPATIBILITY SameMajorVersion ) configure_package_config_file( - "${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in" - "${PROJECT_CONFIG}" - INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}" + "${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in" + "${PROJECT_CONFIG}" + INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}" ) install(TARGETS libwdc - EXPORT "${TARGETS_EXPORT_NAME}" - RUNTIME DESTINATION bin - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib + EXPORT "${TARGETS_EXPORT_NAME}" + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib ) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include) @@ -106,58 +100,53 @@ install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include) install( FILES "${PROJECT_CONFIG}" "${VERSION_CONFIG}" DESTINATION "${CONFIG_INSTALL_DIR}" - ) - -install(EXPORT "${TARGETS_EXPORT_NAME}" - NAMESPACE "${NAMESPACE}" - DESTINATION "${CONFIG_INSTALL_DIR}") +) -if(BUILD_PKGCONFIG) - configure_file(scripts/wdc.pc.in ${PROJECT_BINARY_DIR}/wdc.pc @ONLY) - install(FILES ${PROJECT_BINARY_DIR}/wdc.pc DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig) -endif() +install(EXPORT "${TARGETS_EXPORT_NAME}" + NAMESPACE "${NAMESPACE}" + DESTINATION "${CONFIG_INSTALL_DIR}" +) if(BUILD_TESTS) - hunter_add_package(Boost COMPONENTS system filesystem) - find_package(Boost CONFIG REQUIRED system filesystem) - hunter_add_package(Catch) - find_package(Catch CONFIG REQUIRED) - - enable_testing() + hunter_add_package(Boost COMPONENTS system filesystem) + find_package(Boost CONFIG REQUIRED system filesystem) + hunter_add_package(Catch) + find_package(Catch CONFIG REQUIRED) - file(GLOB ${PROJECT_NAME}_TEST_SOURCES tests/*.cpp) - add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) - target_link_libraries(check libwdc Catch::Catch Boost::filesystem Boost::system) + enable_testing() - if (${CMAKE_BUILD_TYPE} MATCHES "Coverage") + file(GLOB ${PROJECT_NAME}_TEST_SOURCES tests/*.cpp) + add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) + target_link_libraries(check libwdc Catch::Catch Boost::filesystem Boost::system) - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") - include(CodeCoverage) + if (${CMAKE_BUILD_TYPE} MATCHES "Coverage") + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") + include(CodeCoverage) - set(CMAKE_CXX_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage") - set(LCOV_REMOVE_EXTRA "'tests/*'") - add_executable(unit_tests ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_TEST_SOURCES}) - target_link_libraries(unit_tests Catch::Catch Boost::filesystem Boost::system libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) + set(CMAKE_CXX_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage") + set(LCOV_REMOVE_EXTRA "'tests/*'") + add_executable(unit_tests ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_TEST_SOURCES}) + target_link_libraries(unit_tests Catch::Catch Boost::filesystem Boost::system libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) - setup_target_for_coverage(unit_tests_coverage unit_tests coverage) - else() - add_test(NAME unit_tests COMMAND check "-s" "-r" "compact" "--use-colour" "yes") - endif() + setup_target_for_coverage(unit_tests_coverage unit_tests coverage) + else() + add_test(NAME unit_tests COMMAND check "-s" "-r" "compact" "--use-colour" "yes") + endif() endif() if(BUILD_EXAMPLES) - file(GLOB EXAMPLE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/examples/*/*.cpp") - foreach(EXAMPLE_SOURCE ${EXAMPLE_SOURCES}) - get_filename_component(EXAMPLE_NAME ${EXAMPLE_SOURCE} NAME_WE) - set(EXAMPLE_TARGET_NAME example_${EXAMPLE_NAME}) - add_executable(${EXAMPLE_TARGET_NAME} ${EXAMPLE_SOURCE}) - target_link_libraries(${EXAMPLE_TARGET_NAME} libwdc) - set_target_properties(${EXAMPLE_TARGET_NAME} PROPERTIES OUTPUT_NAME ${EXAMPLE_NAME}) - install(TARGETS ${EXAMPLE_TARGET_NAME} - RUNTIME DESTINATION bin - ) - endforeach(EXAMPLE_SOURCE ${EXAMPLE_SOURCES}) + file(GLOB EXAMPLE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/examples/*/*.cpp") + foreach(EXAMPLE_SOURCE ${EXAMPLE_SOURCES}) + get_filename_component(EXAMPLE_NAME ${EXAMPLE_SOURCE} NAME_WE) + set(EXAMPLE_TARGET_NAME example_${EXAMPLE_NAME}) + add_executable(${EXAMPLE_TARGET_NAME} ${EXAMPLE_SOURCE}) + target_link_libraries(${EXAMPLE_TARGET_NAME} libwdc) + set_target_properties(${EXAMPLE_TARGET_NAME} PROPERTIES OUTPUT_NAME ${EXAMPLE_NAME}) + install(TARGETS ${EXAMPLE_TARGET_NAME} + RUNTIME DESTINATION bin + ) + endforeach(EXAMPLE_SOURCE ${EXAMPLE_SOURCES}) endif() include(CPackConfig.cmake) From 15c3570ee7384633374e0f7fccf51aba9c93ae1f Mon Sep 17 00:00:00 2001 From: vagrant Date: Thu, 3 Jan 2019 12:47:30 +0000 Subject: [PATCH 111/133] removed vendor dir --- .gitmodules | 9 --------- vendor/curl | 1 - vendor/openssl | 1 - vendor/pugixml | 1 - 4 files changed, 12 deletions(-) delete mode 160000 vendor/curl delete mode 160000 vendor/openssl delete mode 160000 vendor/pugixml diff --git a/.gitmodules b/.gitmodules index f3af409..d7e0da3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,3 @@ -[submodule "vendor/curl"] - path = vendor/curl - url = https://github.com/curl/curl.git -[submodule "vendor/pugixml"] - path = vendor/pugixml - url = https://github.com/zeux/pugixml.git -[submodule "vendor/openssl"] - path = vendor/openssl - url = https://github.com/openssl/openssl [submodule "tools/gate"] path = tools/gate url = https://github.com/hunter-packages/gate diff --git a/vendor/curl b/vendor/curl deleted file mode 160000 index eb51993..0000000 --- a/vendor/curl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit eb5199317ee729ab1893fc629a8f4f0ca7f7aa1e diff --git a/vendor/openssl b/vendor/openssl deleted file mode 160000 index 2b68739..0000000 --- a/vendor/openssl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2b687397fda5ebaa413a3f35b1c989c84114cefe diff --git a/vendor/pugixml b/vendor/pugixml deleted file mode 160000 index f53bddd..0000000 --- a/vendor/pugixml +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f53bddd7d5c79c35145ab506e48b18c457026543 From d5a6ca4a26696b8f1f7373a94c10d4e01fa7c9a8 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 09:05:06 +0000 Subject: [PATCH 112/133] fixed copy example --- examples/client/copy.cpp | 78 ++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/examples/client/copy.cpp b/examples/client/copy.cpp index d364638..a4bcf73 100644 --- a/examples/client/copy.cpp +++ b/examples/client/copy.cpp @@ -24,58 +24,60 @@ #include #include +#include +#include -std::string resources_to_string(std::vector & resources) +std::string resources_to_string(const std::vector& resources) { - std::stringstream stream; - for (const auto& resource : resources) - { - stream << "\t" << "- " << resource << std::endl; - } - return stream.str(); + std::stringstream result; + for (const auto& resource : resources) + { + result << "\t" << "- " << resource << std::endl; + } + return result.str(); } -int main() { - - auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); - auto username_ptr = std::getenv("WEBDAV_USERNAME"); - auto password_ptr = std::getenv("WEBDAV_PASSWORD"); - auto root_ptr = std::getenv("WEBDAV_ROOT"); +int main() +{ + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); - if (hostname_ptr == nullptr) return -1; - if (username_ptr == nullptr) return -1; - if (password_ptr == nullptr) return -1; + if (hostname_ptr == nullptr) return -1; + if (username_ptr == nullptr) return -1; + if (password_ptr == nullptr) return -1; - std::map options = - { - { "webdav_hostname", hostname_ptr }, - { "webdav_username", username_ptr }, - { "webdav_password", password_ptr } - }; + std::map options = + { + { "webdav_hostname", hostname_ptr }, + { "webdav_username", username_ptr }, + { "webdav_password", password_ptr } + }; - if (root_ptr != nullptr) { - options["webdav_root"] = root_ptr; - } + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto remote_file = "file.dat"; - auto remote_directory = "dir/"; + auto remote_file = "file.dat"; + auto remote_directory = "dir/"; - auto copy_remote_file = "file2.dat"; - auto copy_remote_directory = "dir2/"; + auto copy_remote_file = "file2.dat"; + auto copy_remote_directory = "dir2/"; - auto resources = client->list(); - std::cout << "\"/\" resource contain:" << std::endl; - std::cout << resources_to_string(resources) << std::endl; + auto resources = client->list(); + std::cout << "\"/\" resource contain:" << std::endl; + std::cout << resources_to_string(resources) << std::endl; - client->copy(remote_file, copy_remote_file); - client->copy(remote_directory, copy_remote_directory); + client->copy(remote_file, copy_remote_file); + client->copy(remote_directory, copy_remote_directory); - resources = client->list(); + resources = client->list(); - std::cout << "\"/\" resource contain:" << std::endl; - std::cout << resources_to_string(resources) << std::endl; + std::cout << "\"/\" resource contain:" << std::endl; + std::cout << resources_to_string(resources) << std::endl; } /// "/" resource contain: From 3a4cbed46311e97518ab45103ca319b67826b82f Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 09:26:19 +0000 Subject: [PATCH 113/133] fixed check example --- examples/client/check.cpp | 66 +++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/examples/client/check.cpp b/examples/client/check.cpp index 292926b..57fc271 100644 --- a/examples/client/check.cpp +++ b/examples/client/check.cpp @@ -22,45 +22,49 @@ #include +#include +#include #include +#include -int main() { +int main() +{ + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); - auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); - auto username_ptr = std::getenv("WEBDAV_USERNAME"); - auto password_ptr = std::getenv("WEBDAV_PASSWORD"); - auto root_ptr = std::getenv("WEBDAV_ROOT"); + if (hostname_ptr == nullptr) return -1; + if (username_ptr == nullptr) return -1; + if (password_ptr == nullptr) return -1; - if (hostname_ptr == nullptr) return -1; - if (username_ptr == nullptr) return -1; - if (password_ptr == nullptr) return -1; + std::map options = + { + { "webdav_hostname", hostname_ptr }, + { "webdav_username", username_ptr }, + { "webdav_password", password_ptr } + }; - std::map options = - { - { "webdav_hostname", hostname_ptr }, - { "webdav_username", username_ptr }, - { "webdav_password", password_ptr } - }; + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } - if (root_ptr != nullptr) { - options["webdav_root"] = root_ptr; - } + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + auto remote_resources = { + "existing_file.dat", + "not_existing_file.dat", + "existing_directory", + "existing_directory/", + "not_existing_directory", + "not_existing_directory/" + }; - auto remote_resources = { - "existing_file.dat", - "not_existing_file.dat", - "existing_directory", - "existing_directory/", - "not_existing_directory", - "not_existing_directory/" - }; - - for (const auto& remote_resource : remote_resources) { - bool is_existed = client->check(remote_resource); - std::cout << "Resource: " << remote_resource << " is " << (is_existed ? "" : "not ") << "existed" << std::endl; - } + for (const auto& remote_resource : remote_resources) { + bool is_existed = client->check(remote_resource); + std::cout << "Resource: " << remote_resource + << " is " << (is_existed ? "" : "not ") << "existed" << std::endl; + } } /// Resource: existing_file.dat is existed From 9b03c71ba0f19269a89ee6becbadb714ae3a0ff0 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 09:35:18 +0000 Subject: [PATCH 114/133] update CMakeLists.txt --- CMakeLists.txt | 15 +++++---------- scripts/wdc.pc.in | 10 ---------- 2 files changed, 5 insertions(+), 20 deletions(-) delete mode 100644 scripts/wdc.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 821569c..23a6767 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2018, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which # you should have received as part of this distribution. @@ -20,7 +20,7 @@ # ############################################################################ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.4) include("tools/gate/cmake/HunterGate.cmake") huntergate( @@ -31,13 +31,13 @@ huntergate( set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 1) set(WDC_VERSION_PATCH 4) +set(WDC_VERSION_TWEAK 0) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") option(BUILD_TESTS "Build tests" OFF) option(BUILD_EXAMPLES "Build Examples" OFF) @@ -50,8 +50,7 @@ find_package(CURL CONFIG REQUIRED) hunter_add_package(pugixml) find_package(pugixml CONFIG REQUIRED) -file(GLOB ${PROJECT_NAME}_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/sources/*.cpp") -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/) +file(GLOB WDC_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/sources/*.cpp") add_library(libwdc ${${PROJECT_NAME}_SOURCES}) set_target_properties(libwdc PROPERTIES PREFIX "") @@ -63,10 +62,6 @@ endif() target_link_libraries(libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) target_include_directories(libwdc PUBLIC - $ - $ -) - set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") set(CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}") @@ -119,7 +114,7 @@ if(BUILD_TESTS) add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) target_link_libraries(check libwdc Catch::Catch Boost::filesystem Boost::system) - if (${CMAKE_BUILD_TYPE} MATCHES "Coverage") + if(${CMAKE_BUILD_TYPE} MATCHES "Coverage") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") include(CodeCoverage) diff --git a/scripts/wdc.pc.in b/scripts/wdc.pc.in deleted file mode 100644 index 9541c3a..0000000 --- a/scripts/wdc.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${exec_prefix}/include -Name: wdc -Description: Modern and convenient C++ WebDAV Client library -Version: @WDC_VERSION@ -Libs: -L${libdir} -lwdc -Libs.private: -lpthread -lpugixml -lm -lcurl -lssl -lcrypto -Cflags: -I${includedir} From ac65fe003d815b8dfee5d3b167ee4ab9043f6240 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 09:36:19 +0000 Subject: [PATCH 115/133] added polly tool --- .gitmodules | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitmodules b/.gitmodules index d7e0da3..b4b19c5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "tools/gate"] path = tools/gate url = https://github.com/hunter-packages/gate +[submodule "tools/polly"] + path = tools/polly + url = https://github.com/ruslo/polly From bd1c9fd23e7041cac5eea77667bc667a7987c767 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 10:13:13 +0000 Subject: [PATCH 116/133] refactored --- CMakeLists.txt | 13 +++++-- README.md | 79 ++++++++++++++++++++------------------- include/webdav/client.hpp | 30 +++++++-------- sources/client.cpp | 11 +++--- 4 files changed, 71 insertions(+), 62 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23a6767..c66a082 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,11 +43,14 @@ option(BUILD_TESTS "Build tests" OFF) option(BUILD_EXAMPLES "Build Examples" OFF) option(WDC_VERBOSE "Print verbose information" OFF) +hunter_add_package(Boost) hunter_add_package(OpenSSL) -find_package(OpenSSL REQUIRED) hunter_add_package(CURL) -find_package(CURL CONFIG REQUIRED) hunter_add_package(pugixml) + +find_package(Boost CONFIG REQUIRED) +find_package(OpenSSL REQUIRED) +find_package(CURL CONFIG REQUIRED) find_package(pugixml CONFIG REQUIRED) file(GLOB WDC_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/sources/*.cpp") @@ -59,9 +62,13 @@ if(WDC_VERBOSE) target_compile_definitions(libwdc PUBLIC WDC_VERBOSE=1) endif() -target_link_libraries(libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) +target_link_libraries(libwdc Boost::boost OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) target_include_directories(libwdc PUBLIC + $ + $ +) + set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") set(CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}") diff --git a/README.md b/README.md index 90eaf0a..967b5c2 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Build Building WebDAV Client from sources: ```ShellSession -$ git clone https://github.com/designerror/webdav-client-cpp +$ git clone https://github.com/CloudPolis/webdav-client-cpp $ cd webdav-client-cpp $ cmake -H. -B_builds # -DCMAKE_INSTALL_PREFIX=install $ cmake --build _builds @@ -61,11 +61,12 @@ $ cmake --build _builds --target test -- ARGS=--verbose Usage === -**example.cpp** ```C++ +#include + #include +#include #include -#include int main() { @@ -82,55 +83,55 @@ int main() std::unique_ptr client{ new WebDAV::Client{ options } }; - auto check_connection = client->check(); - std::cout << "test connection with WebDAV drive is " - << (check_connection ? "" : "not ") - << "successful"<< std::endl; + bool check_connection = client->check(); + std::cout << "test connection with WebDAV drive is " + << (check_connection ? "" : "not ") + << "successful"<< std::endl; - auto is_dir = client->is_directory("/path/to/remote/resource"); - std::cout << "remote resource is " - << (is_dir ? "" : "not ") - << "directory" << std::endl; + bool is_dir = client->is_directory("/path/to/remote/resource"); + std::cout << "remote resource is " + << (is_dir ? "" : "not ") + << "directory" << std::endl; - client->create_directory("/path/to/remote/directory/"); - client->clean("/path/to/remote/directory/"); - - std::cout << "On WebDAV-disk available free space: " - << client->free_size() - << std::endl; + client->create_directory("/path/to/remote/directory/"); + client->clean("/path/to/remote/directory/"); + + std::cout << "On WebDAV-disk available free space: " + << client->free_size() + << std::endl; std::cout << "remote_directory_name"; - for(auto& resource_name : client->list("/path/to/remote/directory/")) { + for (const auto& resource_name : client->list("/path/to/remote/directory/")) + { std::cout << "\t" << "-" << resource_name; - } - std::cout << std::endl; + } + std::cout << std::endl; - client->download("/path/to/remote/file", "/path/to/local/file"); - client->clean("/path/to/remote/file"); - client->upload("/path/to/remote/file", "/path/to/local/file"); - - auto meta_info = client->info("/path/to/remote/resource"); - for(auto& field : meta_info) { - std::cout << field.first << ":" << "\t" << field.second; - } - std::cout << std::endl; - - client->copy("/path/to/remote/file1", "/path/to/remote/file2"); - client->move("/path/to/remote/file1", "/path/to/remote/file3"); - - client->async_upload("/path/to/remote/file", "/path/to/local/file"); - client->async_download("/path/to/remote/file", "/path/to/local/file"); + client->download("/path/to/remote/file", "/path/to/local/file"); + client->clean("/path/to/remote/file"); + client->upload("/path/to/remote/file", "/path/to/local/file"); + + const auto meta_info = client->info("/path/to/remote/resource"); + for (const auto& field : meta_info) { + std::cout << field.first << ":" << "\t" << field.second; + } + std::cout << std::endl; + + client->copy("/path/to/remote/file1", "/path/to/remote/file2"); + client->move("/path/to/remote/file1", "/path/to/remote/file3"); + + client->async_upload("/path/to/remote/file", "/path/to/local/file"); + client->async_download("/path/to/remote/file", "/path/to/local/file"); } ``` **CMakeLists.txt** ```cmake -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.4) -include(cmake/HunterGate.cmake) HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.19.79.tar.gz" - SHA1 "f4ac704bdf9f32b52f718b1ac520bb6aca2d9be4" + URL "https://github.com/ruslo/hunter/archive/v0.23.83.tar.gz" + SHA1 "12dec078717539eb7b03e6d2a17797cba9be9ba9" ) project(example) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 4141599..35a7159 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -71,28 +71,28 @@ namespace WebDAV /// \return size in bytes /// \include client/size.cpp /// - auto free_size() const noexcept -> unsigned long long; + auto free_size() const -> unsigned long long; /// /// Check for existence of a remote resource /// \param[in] remote_resource /// \include client/check.cpp /// - auto check(const std::string& remote_resource = "/") const noexcept -> bool; + auto check(const std::string& remote_resource = "/") const -> bool; /// /// Get information of a remote resource /// \param[in] remote_resource /// \include client/info.cpp /// - auto info(const std::string& remote_resource) const noexcept -> dict_t; + auto info(const std::string& remote_resource) const -> dict_t; /// /// Clean an remote resource /// \param[in] remote_resource /// \include client/clean.cpp /// - auto clean(const std::string& remote_resource) const noexcept -> bool; + auto clean(const std::string& remote_resource) const -> bool; /// /// Checks whether the resource directory @@ -105,7 +105,7 @@ namespace WebDAV /// \param[in] remote_directory /// \include client/list.cpp /// - auto list(const std::string& remote_directory = "") const noexcept -> strings_t; + auto list(const std::string& remote_directory = "") const -> strings_t; /// /// Create a remote directory @@ -116,7 +116,7 @@ namespace WebDAV auto create_directory( const std::string& remote_directory, bool recursive = false - ) const noexcept -> bool; + ) const -> bool; /// /// Move a remote resource @@ -127,7 +127,7 @@ namespace WebDAV auto move( const std::string& remote_source_resource, const std::string& remote_destination_resource - ) const noexcept -> bool; + ) const -> bool; /// /// Copy a remote resource @@ -138,7 +138,7 @@ namespace WebDAV auto copy( const std::string& remote_source_resource, const std::string& remote_destination_resource - ) const noexcept -> bool; + ) const -> bool; /// /// Download a remote file to a local file @@ -151,7 +151,7 @@ namespace WebDAV const std::string& remote_file, const std::string& local_file, progress_t progress = nullptr - ) const noexcept -> bool; + ) const -> bool; /// /// Download a remote file to a buffer @@ -166,7 +166,7 @@ namespace WebDAV char * & buffer_ptr, unsigned long long & buffer_size, progress_t progress = nullptr - ) const noexcept -> bool; + ) const -> bool; /// /// Download a remote file to a stream @@ -179,7 +179,7 @@ namespace WebDAV const std::string& remote_file, std::ostream& stream, progress_t progress = nullptr - ) const noexcept -> bool; + ) const -> bool; /// /// Asynchronously download a remote file to a local file @@ -194,7 +194,7 @@ namespace WebDAV const std::string& local_file, callback_t callback = nullptr, progress_t progress = nullptr - ) const noexcept -> void; + ) const -> void; /// /// Upload a remote file from a local file @@ -207,7 +207,7 @@ namespace WebDAV const std::string& remote_file, const std::string& local_file, progress_t progress = nullptr - ) const noexcept -> bool; + ) const -> bool; /// /// Upload a remote file from a buffer @@ -222,7 +222,7 @@ namespace WebDAV char * buffer_ptr, unsigned long long buffer_size, progress_t progress = nullptr - ) const noexcept -> bool; + ) const -> bool; /// /// Upload a remote file from a stream @@ -235,7 +235,7 @@ namespace WebDAV const std::string& remote_file, std::istream& stream, progress_t progress = nullptr - ) const noexcept -> bool; + ) const -> bool; /// /// Asynchronously upload a remote file from a local file diff --git a/sources/client.cpp b/sources/client.cpp index 51c8101..7bcd248 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -20,18 +20,19 @@ # ############################################################################*/ - -#include -#include -#include #include + #include "callback.hpp" -#include "header.hpp" #include "fsinfo.hpp" +#include "header.hpp" #include "pugiext.hpp" #include "request.hpp" #include "urn.hpp" +#include +#include +#include + namespace WebDAV { auto inline get(const dict_t& options, const std::string&& name) -> std::string From 922bc538c0863013bf30f924e0c2a2a09294b5a4 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 10:43:17 +0000 Subject: [PATCH 117/133] refactored --- include/webdav/client.hpp | 570 +++++++++---------- sources/client.cpp | 1104 ++++++++++++++++++------------------- 2 files changed, 837 insertions(+), 837 deletions(-) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 35a7159..248e729 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -31,289 +31,289 @@ namespace WebDAV { - using progress_t = std::function ; - - using callback_t = std::function ; - - using strings_t = std::vector; - using dict_t = std::map; - - /// - /// \brief WebDAV Client - /// \author designerror - /// \version 1.1.4 - /// \date 3/16/2018 - /// - class Client - { - public: - - /// - /// \param[in] webdav_hostname - /// \param[in] webdav_root - /// \param[in] webdav_username - /// \param[in] webdav_password - /// \param[in] proxy_hostname - /// \param[in] proxy_username - /// \param[in] proxy_password - /// \param[in] cert_path - /// \param[in] key_path - /// \include client/init.cpp - /// - explicit Client(const dict_t& options); - - /// - /// Get free size of the WebDAV server - /// \return size in bytes - /// \include client/size.cpp - /// - auto free_size() const -> unsigned long long; - - /// - /// Check for existence of a remote resource - /// \param[in] remote_resource - /// \include client/check.cpp - /// - auto check(const std::string& remote_resource = "/") const -> bool; - - /// - /// Get information of a remote resource - /// \param[in] remote_resource - /// \include client/info.cpp - /// - auto info(const std::string& remote_resource) const -> dict_t; - - /// - /// Clean an remote resource - /// \param[in] remote_resource - /// \include client/clean.cpp - /// - auto clean(const std::string& remote_resource) const -> bool; - - /// - /// Checks whether the resource directory - /// \param[in] remote_resource - /// - auto is_directory(const std::string& remote_resource) const noexcept -> bool; - - /// - /// List a remote directory - /// \param[in] remote_directory - /// \include client/list.cpp - /// - auto list(const std::string& remote_directory = "") const -> strings_t; - - /// - /// Create a remote directory - /// \param[in] remote_directory - /// \param[in] recursive - /// \include client/mkdir.cpp - /// - auto create_directory( - const std::string& remote_directory, - bool recursive = false - ) const -> bool; - - /// - /// Move a remote resource - /// \param[in] remote_source_resource - /// \param[in] remote_destination_resource - /// \include client/move.cpp - /// - auto move( - const std::string& remote_source_resource, - const std::string& remote_destination_resource - ) const -> bool; - - /// - /// Copy a remote resource - /// \param[in] remote_source_resource - /// \param[in] remote_destination_resource - /// \include client/copy.cpp - /// - auto copy( - const std::string& remote_source_resource, - const std::string& remote_destination_resource - ) const -> bool; - - /// - /// Download a remote file to a local file - /// \param[in] remote_file - /// \param[in] local_file - /// \param[in] progress - /// \snippet client/download.cpp download_to_file - /// - auto download( - const std::string& remote_file, - const std::string& local_file, - progress_t progress = nullptr - ) const -> bool; - - /// - /// Download a remote file to a buffer - /// \param[in] remote_file - /// \param[out] buffer_ptr - /// \param[out] buffer_size - /// \param[in] progress - /// \snippet client/download.cpp download_to_buffer - /// - auto download_to( - const std::string& remote_file, - char * & buffer_ptr, - unsigned long long & buffer_size, - progress_t progress = nullptr - ) const -> bool; - - /// - /// Download a remote file to a stream - /// \param[in] remote_file - /// \param[out] stream - /// \param[in] progress - /// \snippet client/download.cpp download_to_stream - /// - auto download_to( - const std::string& remote_file, - std::ostream& stream, - progress_t progress = nullptr - ) const -> bool; - - /// - /// Asynchronously download a remote file to a local file - /// \param[in] remote_file - /// \param[in] local_file - /// \param[in] callback - /// \param[in] progress - /// \snippet client/download.cpp async_download_to_file - /// - auto async_download( - const std::string& remote_file, - const std::string& local_file, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const -> void; - - /// - /// Upload a remote file from a local file - /// \param[in] remote_file - /// \param[in] local_file - /// \param[in] progress - /// \snippet client/upload.cpp upload_from_file - /// - auto upload( - const std::string& remote_file, - const std::string& local_file, - progress_t progress = nullptr - ) const -> bool; - - /// - /// Upload a remote file from a buffer - /// \param[in] remote_file - /// \param[in] buffer_ptr - /// \param[in] buffer_size - /// \param[in] progress - /// \snippet client/upload.cpp upload_from_buffer - /// - auto upload_from( - const std::string& remote_file, - char * buffer_ptr, - unsigned long long buffer_size, - progress_t progress = nullptr - ) const -> bool; - - /// - /// Upload a remote file from a stream - /// \param[in] remote_file - /// \param[in] stream - /// \param[in] progress - /// \snippet client/upload.cpp upload_from_stream - /// - auto upload_from( - const std::string& remote_file, - std::istream& stream, - progress_t progress = nullptr - ) const -> bool; - - /// - /// Asynchronously upload a remote file from a local file - /// \param[in] remote_file - /// \param[in] local_file - /// \param[in] callback - /// \param[in] progress - /// \snippet client/upload.cpp async_upload_from_file - /// - auto async_upload( - const std::string& remote_file, - const std::string& local_file, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept -> void; - - private: - - auto sync_download( - const std::string& remote_file, - const std::string& local_file, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept -> bool; - - auto sync_download_to( - const std::string& remote_file, - char * & buffer_ptr, - unsigned long long & buffer_size, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept -> bool; - - bool sync_download_to( - const std::string& remote_file, - std::ostream& stream, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept; - - bool sync_upload( - const std::string& remote_file, - const std::string& local_file, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept; - - auto sync_upload_from( - const std::string& remote_file, - char * buffer_ptr, - unsigned long long buffer_size, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept -> bool; - - auto sync_upload_from( - const std::string& remote_file, - std::istream& stream, - callback_t callback = nullptr, - progress_t progress = nullptr - ) const noexcept -> bool; - - enum { buffer_size = 1000 * 1000 }; - - std::string webdav_hostname; - std::string webdav_root; - std::string webdav_username; - std::string webdav_password; - - std::string proxy_hostname; - std::string proxy_username; - std::string proxy_password; - - std::string cert_path; - std::string key_path; - - dict_t options() const noexcept; - }; + using progress_t = std::function ; + + using callback_t = std::function ; + + using strings_t = std::vector; + using dict_t = std::map; + + /// + /// \brief WebDAV Client + /// \author designerror + /// \version 1.1.4 + /// \date 3/16/2018 + /// + class Client + { + public: + + /// + /// \param[in] webdav_hostname + /// \param[in] webdav_root + /// \param[in] webdav_username + /// \param[in] webdav_password + /// \param[in] proxy_hostname + /// \param[in] proxy_username + /// \param[in] proxy_password + /// \param[in] cert_path + /// \param[in] key_path + /// \include client/init.cpp + /// + explicit Client(const dict_t& options); + + /// + /// Get free size of the WebDAV server + /// \return size in bytes + /// \include client/size.cpp + /// + auto free_size() const -> unsigned long long; + + /// + /// Check for existence of a remote resource + /// \param[in] remote_resource + /// \include client/check.cpp + /// + auto check(const std::string& remote_resource = "/") const -> bool; + + /// + /// Get information of a remote resource + /// \param[in] remote_resource + /// \include client/info.cpp + /// + auto info(const std::string& remote_resource) const -> dict_t; + + /// + /// Clean an remote resource + /// \param[in] remote_resource + /// \include client/clean.cpp + /// + auto clean(const std::string& remote_resource) const -> bool; + + /// + /// Checks whether the resource directory + /// \param[in] remote_resource + /// + auto is_directory(const std::string& remote_resource) const -> bool; + + /// + /// List a remote directory + /// \param[in] remote_directory + /// \include client/list.cpp + /// + auto list(const std::string& remote_directory = "") const -> strings_t; + + /// + /// Create a remote directory + /// \param[in] remote_directory + /// \param[in] recursive + /// \include client/mkdir.cpp + /// + auto create_directory( + const std::string& remote_directory, + bool recursive = false + ) const -> bool; + + /// + /// Move a remote resource + /// \param[in] remote_source_resource + /// \param[in] remote_destination_resource + /// \include client/move.cpp + /// + auto move( + const std::string& remote_source_resource, + const std::string& remote_destination_resource + ) const -> bool; + + /// + /// Copy a remote resource + /// \param[in] remote_source_resource + /// \param[in] remote_destination_resource + /// \include client/copy.cpp + /// + auto copy( + const std::string& remote_source_resource, + const std::string& remote_destination_resource + ) const -> bool; + + /// + /// Download a remote file to a local file + /// \param[in] remote_file + /// \param[in] local_file + /// \param[in] progress + /// \snippet client/download.cpp download_to_file + /// + auto download( + const std::string& remote_file, + const std::string& local_file, + progress_t progress = nullptr + ) const -> bool; + + /// + /// Download a remote file to a buffer + /// \param[in] remote_file + /// \param[out] buffer_ptr + /// \param[out] buffer_size + /// \param[in] progress + /// \snippet client/download.cpp download_to_buffer + /// + auto download_to( + const std::string& remote_file, + char * & buffer_ptr, + unsigned long long & buffer_size, + progress_t progress = nullptr + ) const -> bool; + + /// + /// Download a remote file to a stream + /// \param[in] remote_file + /// \param[out] stream + /// \param[in] progress + /// \snippet client/download.cpp download_to_stream + /// + auto download_to( + const std::string& remote_file, + std::ostream& stream, + progress_t progress = nullptr + ) const -> bool; + + /// + /// Asynchronously download a remote file to a local file + /// \param[in] remote_file + /// \param[in] local_file + /// \param[in] callback + /// \param[in] progress + /// \snippet client/download.cpp async_download_to_file + /// + auto async_download( + const std::string& remote_file, + const std::string& local_file, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const -> void; + + /// + /// Upload a remote file from a local file + /// \param[in] remote_file + /// \param[in] local_file + /// \param[in] progress + /// \snippet client/upload.cpp upload_from_file + /// + auto upload( + const std::string& remote_file, + const std::string& local_file, + progress_t progress = nullptr + ) const -> bool; + + /// + /// Upload a remote file from a buffer + /// \param[in] remote_file + /// \param[in] buffer_ptr + /// \param[in] buffer_size + /// \param[in] progress + /// \snippet client/upload.cpp upload_from_buffer + /// + auto upload_from( + const std::string& remote_file, + char * buffer_ptr, + unsigned long long buffer_size, + progress_t progress = nullptr + ) const -> bool; + + /// + /// Upload a remote file from a stream + /// \param[in] remote_file + /// \param[in] stream + /// \param[in] progress + /// \snippet client/upload.cpp upload_from_stream + /// + auto upload_from( + const std::string& remote_file, + std::istream& stream, + progress_t progress = nullptr + ) const -> bool; + + /// + /// Asynchronously upload a remote file from a local file + /// \param[in] remote_file + /// \param[in] local_file + /// \param[in] callback + /// \param[in] progress + /// \snippet client/upload.cpp async_upload_from_file + /// + auto async_upload( + const std::string& remote_file, + const std::string& local_file, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const -> void; + + private: + + auto sync_download( + const std::string& remote_file, + const std::string& local_file, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const -> bool; + + auto sync_download_to( + const std::string& remote_file, + char * & buffer_ptr, + unsigned long long & buffer_size, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const -> bool; + + bool sync_download_to( + const std::string& remote_file, + std::ostream& stream, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const ; + + bool sync_upload( + const std::string& remote_file, + const std::string& local_file, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const ; + + auto sync_upload_from( + const std::string& remote_file, + char * buffer_ptr, + unsigned long long buffer_size, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const -> bool; + + auto sync_upload_from( + const std::string& remote_file, + std::istream& stream, + callback_t callback = nullptr, + progress_t progress = nullptr + ) const -> bool; + + enum { buffer_size = 1000 * 1000 }; + + std::string webdav_hostname; + std::string webdav_root; + std::string webdav_username; + std::string webdav_password; + + std::string proxy_hostname; + std::string proxy_username; + std::string proxy_password; + + std::string cert_path; + std::string key_path; + + dict_t options() const ; + }; } // namespace WebDAV #endif diff --git a/sources/client.cpp b/sources/client.cpp index 7bcd248..b32ce0b 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -35,19 +35,19 @@ namespace WebDAV { - auto inline get(const dict_t& options, const std::string&& name) -> std::string - { - auto it = options.find(name); - if (it == options.end()) return ""; - else return it->second; - } + auto inline get(const dict_t& options, const std::string&& name) -> std::string + { + auto it = options.find(name); + if (it == options.end()) return ""; + else return it->second; + } using Urn::Path; - using progress_funptr = int(*)(void *context, size_t dltotal, size_t dlnow, size_t ultotal, size_t ulnow); + using progress_funptr = int(*)(void *context, size_t dltotal, size_t dlnow, size_t ultotal, size_t ulnow); dict_t - Client::options() const noexcept + Client::options() const { return dict_t { @@ -63,702 +63,702 @@ namespace WebDAV }; } - bool + bool Client::sync_download( const std::string& remote_file, const std::string& local_file, callback_t callback, progress_t progress - ) const noexcept - { - bool is_existed = this->check(remote_file); - if (!is_existed) return false; + ) const + { + bool is_existed = this->check(remote_file); + if (!is_existed) return false; - auto root_urn = Path(this->webdav_root, true); - auto file_urn = root_urn + remote_file; + auto root_urn = Path(this->webdav_root, true); + auto file_urn = root_urn + remote_file; - std::ofstream file_stream(local_file, std::ios::binary); + std::ofstream file_stream(local_file, std::ios::binary); - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + file_urn.quote(request.handle); + auto url = this->webdav_hostname + file_urn.quote(request.handle); - request.set(CURLOPT_CUSTOMREQUEST, "GET"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HEADER, 0L); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&file_stream)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Write::stream)); + request.set(CURLOPT_CUSTOMREQUEST, "GET"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HEADER, 0L); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&file_stream)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Write::stream)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); - request.set(CURLOPT_NOPROGRESS, 0L); - } + if (progress != nullptr) { + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); + request.set(CURLOPT_NOPROGRESS, 0L); + } - bool is_performed = request.perform(); + bool is_performed = request.perform(); - if (callback != nullptr) callback(is_performed); - return is_performed; - } + if (callback != nullptr) callback(is_performed); + return is_performed; + } - bool + bool Client::sync_download_to( const std::string& remote_file, char * & buffer_ptr, unsigned long long & buffer_size, callback_t callback, progress_t progress - ) const noexcept - { - bool is_existed = this->check(remote_file); - if (!is_existed) return false; + ) const + { + bool is_existed = this->check(remote_file); + if (!is_existed) return false; - auto root_urn = Path(this->webdav_root, true); - auto file_urn = root_urn + remote_file; + auto root_urn = Path(this->webdav_root, true); + auto file_urn = root_urn + remote_file; - Data data = { nullptr, 0, 0 }; + Data data = { nullptr, 0, 0 }; - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + file_urn.quote(request.handle); + auto url = this->webdav_hostname + file_urn.quote(request.handle); - request.set(CURLOPT_CUSTOMREQUEST, "GET"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HEADER, 0L); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); + request.set(CURLOPT_CUSTOMREQUEST, "GET"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HEADER, 0L); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); - request.set(CURLOPT_NOPROGRESS, 0L); - } + if (progress != nullptr) { + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); + request.set(CURLOPT_NOPROGRESS, 0L); + } - bool is_performed = request.perform(); - if (callback != nullptr) callback(is_performed); - if (!is_performed) return false; + bool is_performed = request.perform(); + if (callback != nullptr) callback(is_performed); + if (!is_performed) return false; - buffer_ptr = data.buffer; - buffer_size = data.size; + buffer_ptr = data.buffer; + buffer_size = data.size; data.reset(); - return true; - } + return true; + } - bool + bool Client::sync_download_to( const std::string& remote_file, std::ostream & stream, callback_t callback, progress_t progress - ) const noexcept - { - bool is_existed = this->check(remote_file); - if (!is_existed) return false; + ) const + { + bool is_existed = this->check(remote_file); + if (!is_existed) return false; - auto root_urn = Path(this->webdav_root, true); - auto file_urn = root_urn + remote_file; + auto root_urn = Path(this->webdav_root, true); + auto file_urn = root_urn + remote_file; - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + file_urn.quote(request.handle); + auto url = this->webdav_hostname + file_urn.quote(request.handle); - request.set(CURLOPT_CUSTOMREQUEST, "GET"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HEADER, 0L); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&stream)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Write::stream)); + request.set(CURLOPT_CUSTOMREQUEST, "GET"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HEADER, 0L); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&stream)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Write::stream)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); - request.set(CURLOPT_NOPROGRESS, 0L); - } - - bool is_performed = request.perform(); - if (callback != nullptr) callback(is_performed); - + if (progress != nullptr) { + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); + request.set(CURLOPT_NOPROGRESS, 0L); + } + + bool is_performed = request.perform(); + if (callback != nullptr) callback(is_performed); + return is_performed; - } + } - bool + bool Client::sync_upload( const std::string& remote_file, const std::string& local_file, callback_t callback, progress_t progress - ) const noexcept - { - bool is_existed = FileInfo::exists(local_file); - if (!is_existed) return false; + ) const + { + bool is_existed = FileInfo::exists(local_file); + if (!is_existed) return false; - auto root_urn = Path(this->webdav_root, true); - auto file_urn = root_urn + remote_file; + auto root_urn = Path(this->webdav_root, true); + auto file_urn = root_urn + remote_file; - std::ifstream file_stream(local_file, std::ios::binary); - auto size = FileInfo::size(local_file); + std::ifstream file_stream(local_file, std::ios::binary); + auto size = FileInfo::size(local_file); - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + file_urn.quote(request.handle); + auto url = this->webdav_hostname + file_urn.quote(request.handle); - Data response = { nullptr, 0, 0 }; + Data response = { nullptr, 0, 0 }; - request.set(CURLOPT_UPLOAD, 1L); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_READDATA, reinterpret_cast(&file_stream)); - request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::stream)); - request.set(CURLOPT_INFILESIZE_LARGE, static_cast(size)); - request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); + request.set(CURLOPT_UPLOAD, 1L); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_READDATA, reinterpret_cast(&file_stream)); + request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::stream)); + request.set(CURLOPT_INFILESIZE_LARGE, static_cast(size)); + request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); - request.set(CURLOPT_NOPROGRESS, 0L); - } + if (progress != nullptr) { + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); + request.set(CURLOPT_NOPROGRESS, 0L); + } - bool is_performed = request.perform(); + bool is_performed = request.perform(); - if (callback != nullptr) callback(is_performed); - return is_performed; - } + if (callback != nullptr) callback(is_performed); + return is_performed; + } - bool + bool Client::sync_upload_from( const std::string& remote_file, char * buffer_ptr, unsigned long long buffer_size, callback_t callback, progress_t progress - ) const noexcept - { - auto root_urn = Path(this->webdav_root, true); - auto file_urn = root_urn + remote_file; + ) const + { + auto root_urn = Path(this->webdav_root, true); + auto file_urn = root_urn + remote_file; - Data data = { buffer_ptr, 0, buffer_size }; + Data data = { buffer_ptr, 0, buffer_size }; - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + file_urn.quote(request.handle); + auto url = this->webdav_hostname + file_urn.quote(request.handle); Data response = { nullptr, 0, 0 }; - request.set(CURLOPT_UPLOAD, 1L); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_READDATA, reinterpret_cast(&data)); - request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::buffer)); - request.set(CURLOPT_INFILESIZE_LARGE, static_cast(buffer_size)); - request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); + request.set(CURLOPT_UPLOAD, 1L); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_READDATA, reinterpret_cast(&data)); + request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::buffer)); + request.set(CURLOPT_INFILESIZE_LARGE, static_cast(buffer_size)); + request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); - request.set(CURLOPT_NOPROGRESS, 0L); - } + if (progress != nullptr) { + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); + request.set(CURLOPT_NOPROGRESS, 0L); + } - bool is_performed = request.perform(); + bool is_performed = request.perform(); - if (callback != nullptr) callback(is_performed); + if (callback != nullptr) callback(is_performed); data.reset(); - return is_performed; - } + return is_performed; + } - bool + bool Client::sync_upload_from( const std::string& remote_file, std::istream& stream, callback_t callback, progress_t progress - ) const noexcept - { - auto root_urn = Path(this->webdav_root, true); - auto file_urn = root_urn + remote_file; - - Request request(this->options()); - - auto url = this->webdav_hostname + file_urn.quote(request.handle); - stream.seekg(0, std::ios::end); - size_t stream_size = stream.tellg(); - stream.seekg(0, std::ios::beg); - - Data response = { nullptr, 0, 0 }; - - request.set(CURLOPT_UPLOAD, 1L); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_READDATA, reinterpret_cast(&stream)); - request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::stream)); - request.set(CURLOPT_INFILESIZE_LARGE, static_cast(stream_size)); - request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); + ) const + { + auto root_urn = Path(this->webdav_root, true); + auto file_urn = root_urn + remote_file; + + Request request(this->options()); + + auto url = this->webdav_hostname + file_urn.quote(request.handle); + stream.seekg(0, std::ios::end); + size_t stream_size = stream.tellg(); + stream.seekg(0, std::ios::beg); + + Data response = { nullptr, 0, 0 }; + + request.set(CURLOPT_UPLOAD, 1L); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_READDATA, reinterpret_cast(&stream)); + request.set(CURLOPT_READFUNCTION, reinterpret_cast(Callback::Read::stream)); + request.set(CURLOPT_INFILESIZE_LARGE, static_cast(stream_size)); + request.set(CURLOPT_BUFFERSIZE, static_cast(Client::buffer_size)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&response)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { - request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); - request.set(CURLOPT_NOPROGRESS, 0L); - } - - bool is_performed = request.perform(); - - if (callback != nullptr) callback(is_performed); - return is_performed; - } - - Client::Client(const dict_t& options) - { - this->webdav_hostname = get(options, "webdav_hostname"); - this->webdav_root = get(options, "webdav_root"); - this->webdav_username = get(options, "webdav_username"); - this->webdav_password = get(options, "webdav_password"); - - this->proxy_hostname = get(options, "proxy_hostname"); - this->proxy_username = get(options, "proxy_username"); - this->proxy_password = get(options, "proxy_password"); - - this->cert_path = get(options, "cert_path"); - this->key_path = get(options, "key_path"); - } - - unsigned long long - Client::free_size() const noexcept - { - Header header = { - "Accept: */*", - "Depth: 0", - "Content-Type: text/xml" - }; - - pugi::xml_document document; - auto propfind = document.append_child("D:propfind"); - propfind.append_attribute("xmlns:D") = "DAV:"; - - auto prop = propfind.append_child("D:prop"); - prop.append_child("D:quokta-available-bytes"); - prop.append_child("D:quota-used-bytes"); - - auto document_print = pugi::node_to_string(document); - size_t size = document_print.length() * sizeof((document_print.c_str())[0]); - - Data data = { nullptr, 0, 0 }; - - Request request(this->options()); - - request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); - request.set(CURLOPT_POSTFIELDS, document_print.c_str()); - request.set(CURLOPT_POSTFIELDSIZE, static_cast(size)); - request.set(CURLOPT_HEADER, 0); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); + if (progress != nullptr) { + request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); + request.set(CURLOPT_NOPROGRESS, 0L); + } + + bool is_performed = request.perform(); + + if (callback != nullptr) callback(is_performed); + return is_performed; + } + + Client::Client(const dict_t& options) + { + this->webdav_hostname = get(options, "webdav_hostname"); + this->webdav_root = get(options, "webdav_root"); + this->webdav_username = get(options, "webdav_username"); + this->webdav_password = get(options, "webdav_password"); + + this->proxy_hostname = get(options, "proxy_hostname"); + this->proxy_username = get(options, "proxy_username"); + this->proxy_password = get(options, "proxy_password"); + + this->cert_path = get(options, "cert_path"); + this->key_path = get(options, "key_path"); + } + + unsigned long long + Client::free_size() const + { + Header header = { + "Accept: */*", + "Depth: 0", + "Content-Type: text/xml" + }; + + pugi::xml_document document; + auto propfind = document.append_child("D:propfind"); + propfind.append_attribute("xmlns:D") = "DAV:"; + + auto prop = propfind.append_child("D:prop"); + prop.append_child("D:quokta-available-bytes"); + prop.append_child("D:quota-used-bytes"); + + auto document_print = pugi::node_to_string(document); + size_t size = document_print.length() * sizeof((document_print.c_str())[0]); + + Data data = { nullptr, 0, 0 }; + + Request request(this->options()); + + request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_POSTFIELDS, document_print.c_str()); + request.set(CURLOPT_POSTFIELDSIZE, static_cast(size)); + request.set(CURLOPT_HEADER, 0); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - auto is_performed = request.perform(); - if (!is_performed) return 0; + auto is_performed = request.perform(); + if (!is_performed) return 0; - document.load_buffer(data.buffer, static_cast(data.size)); + document.load_buffer(data.buffer, static_cast(data.size)); - pugi::xml_node multistatus = document.select_node("*[local-name()='multistatus']").node(); - pugi::xml_node response = multistatus.select_node("*[local-name()='response']").node(); - pugi::xml_node propstat = response.select_node("*[local-name()='propstat']").node(); - prop = propstat.select_node("*[local-name()='prop']").node(); - pugi::xml_node quota_available_bytes = prop.select_node("*[local-name()='quota-available-bytes']").node(); - std::string free_size_text = quota_available_bytes.first_child().value(); + pugi::xml_node multistatus = document.select_node("*[local-name()='multistatus']").node(); + pugi::xml_node response = multistatus.select_node("*[local-name()='response']").node(); + pugi::xml_node propstat = response.select_node("*[local-name()='propstat']").node(); + prop = propstat.select_node("*[local-name()='prop']").node(); + pugi::xml_node quota_available_bytes = prop.select_node("*[local-name()='quota-available-bytes']").node(); + std::string free_size_text = quota_available_bytes.first_child().value(); - auto free_size = std::atoll(free_size_text.c_str()); - return free_size; - } + auto free_size = std::atoll(free_size_text.c_str()); + return free_size; + } - bool - Client::check(const std::string& remote_resource) const noexcept - { - auto root_urn = Path(this->webdav_root, true); - auto resource_urn = root_urn + remote_resource; + bool + Client::check(const std::string& remote_resource) const + { + auto root_urn = Path(this->webdav_root, true); + auto resource_urn = root_urn + remote_resource; - Header header = { - "Accept: */*", - "Depth: 1" - }; + Header header = { + "Accept: */*", + "Depth: 1" + }; - Data data = { nullptr, 0, 0 }; + Data data = { nullptr, 0, 0 }; - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + resource_urn.quote(request.handle); + auto url = this->webdav_hostname + resource_urn.quote(request.handle); - request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); + request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - return request.perform(); - } + return request.perform(); + } - dict_t - Client::info(const std::string& remote_resource) const noexcept - { - auto root_urn = Path(this->webdav_root, true); - auto target_urn = root_urn + remote_resource; + dict_t + Client::info(const std::string& remote_resource) const + { + auto root_urn = Path(this->webdav_root, true); + auto target_urn = root_urn + remote_resource; - Header header = { - "Accept: */*", - "Depth: 1" - }; + Header header = { + "Accept: */*", + "Depth: 1" + }; - Data data = { nullptr, 0, 0 }; + Data data = { nullptr, 0, 0 }; - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + target_urn.quote(request.handle); + auto url = this->webdav_hostname + target_urn.quote(request.handle); - request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); + request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - bool is_performed = request.perform(); + bool is_performed = request.perform(); - if (!is_performed) return dict_t{}; + if (!is_performed) return dict_t{}; - pugi::xml_document document; - document.load_buffer(data.buffer, static_cast(data.size)); + pugi::xml_document document; + document.load_buffer(data.buffer, static_cast(data.size)); #ifdef WDC_VERBOSE - document.save(std::cout); + document.save(std::cout); #endif - auto multistatus = document.select_node("*[local-name()='multistatus']").node(); - auto responses = multistatus.select_nodes("*[local-name()='response']"); - for (auto response : responses) - { - pugi::xml_node href = response.node().select_node("*[local-name()='href']").node(); - std::string encode_file_name = href.first_child().value(); - std::string resource_path = curl_unescape(encode_file_name.c_str(), static_cast(encode_file_name.length())); - auto target_path = target_urn.path(); - auto target_path_without_sep = target_urn.path(); - if (!target_path_without_sep.empty() && target_path_without_sep.back() == '/') - target_path_without_sep.resize(target_path_without_sep.length() - 1); - auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind('/') + 1); - if (resource_path_without_sep == target_path_without_sep) { - auto propstat = response.node().select_node("*[local-name()='propstat']").node(); - auto prop = propstat.select_node("*[local-name()='prop']").node(); - auto creation_date = prop.select_node("*[local-name()='creationdate']").node(); - auto display_name = prop.select_node("*[local-name()='displayname']").node(); - auto content_length = prop.select_node("*[local-name()='getcontentlength']").node(); - auto modified_date = prop.select_node("*[local-name()='getlastmodified']").node(); - auto resource_type = prop.select_node("*[local-name()='resourcetype']").node(); - - dict_t information = { - { "created", creation_date.first_child().value() }, - { "name", display_name.first_child().value() }, - { "size", content_length.first_child().value() }, - { "modified", modified_date.first_child().value() }, - { "type", resource_type.first_child().name() } - }; - - return information; - } - } - - return dict_t{}; - } - - bool - Client::is_directory(const std::string& remote_resource) const noexcept - { - auto information = this->info(remote_resource); - auto resource_type = information["type"]; - bool is_dir = resource_type == "d:collection" || resource_type == "D:collection"; - return is_dir; - } - - strings_t - Client::list(const std::string& remote_directory) const noexcept - { - bool is_existed = this->check(remote_directory); - if (!is_existed) return strings_t{}; - - auto target_urn = Path(this->webdav_root, true) + remote_directory; - target_urn = Path(target_urn.path(), true); - - Header header = { - "Accept: */*", - "Depth: 1" - }; - - Data data = { nullptr, 0, 0 }; - - Request request(this->options()); - - auto url = this->webdav_hostname + target_urn.quote(request.handle); - - request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); - request.set(CURLOPT_HEADER, 0); - request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); - request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); + auto multistatus = document.select_node("*[local-name()='multistatus']").node(); + auto responses = multistatus.select_nodes("*[local-name()='response']"); + for (auto response : responses) + { + pugi::xml_node href = response.node().select_node("*[local-name()='href']").node(); + std::string encode_file_name = href.first_child().value(); + std::string resource_path = curl_unescape(encode_file_name.c_str(), static_cast(encode_file_name.length())); + auto target_path = target_urn.path(); + auto target_path_without_sep = target_urn.path(); + if (!target_path_without_sep.empty() && target_path_without_sep.back() == '/') + target_path_without_sep.resize(target_path_without_sep.length() - 1); + auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind('/') + 1); + if (resource_path_without_sep == target_path_without_sep) { + auto propstat = response.node().select_node("*[local-name()='propstat']").node(); + auto prop = propstat.select_node("*[local-name()='prop']").node(); + auto creation_date = prop.select_node("*[local-name()='creationdate']").node(); + auto display_name = prop.select_node("*[local-name()='displayname']").node(); + auto content_length = prop.select_node("*[local-name()='getcontentlength']").node(); + auto modified_date = prop.select_node("*[local-name()='getlastmodified']").node(); + auto resource_type = prop.select_node("*[local-name()='resourcetype']").node(); + + dict_t information = { + { "created", creation_date.first_child().value() }, + { "name", display_name.first_child().value() }, + { "size", content_length.first_child().value() }, + { "modified", modified_date.first_child().value() }, + { "type", resource_type.first_child().name() } + }; + + return information; + } + } + + return dict_t{}; + } + + bool + Client::is_directory(const std::string& remote_resource) const + { + auto information = this->info(remote_resource); + auto resource_type = information["type"]; + bool is_dir = resource_type == "d:collection" || resource_type == "D:collection"; + return is_dir; + } + + strings_t + Client::list(const std::string& remote_directory) const + { + bool is_existed = this->check(remote_directory); + if (!is_existed) return strings_t{}; + + auto target_urn = Path(this->webdav_root, true) + remote_directory; + target_urn = Path(target_urn.path(), true); + + Header header = { + "Accept: */*", + "Depth: 1" + }; + + Data data = { nullptr, 0, 0 }; + + Request request(this->options()); + + auto url = this->webdav_hostname + target_urn.quote(request.handle); + + request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HEADER, 0); + request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); + request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - bool is_performed = request.perform(); + bool is_performed = request.perform(); - if (!is_performed) return strings_t{}; + if (!is_performed) return strings_t{}; - strings_t resources; + strings_t resources; - pugi::xml_document document; - document.load_buffer(data.buffer, static_cast(data.size)); - auto multistatus = document.select_node("*[local-name()='multistatus']").node(); - auto responses = multistatus.select_nodes("*[local-name()='response']"); - for (auto response : responses) - { - pugi::xml_node href = response.node().select_node("*[local-name()='href']").node(); - std::string encode_file_name = href.first_child().value(); - std::string resource_path = curl_unescape(encode_file_name.c_str(), static_cast(encode_file_name.length())); - auto target_path = target_urn.path(); - Path resource_urn(resource_path); + pugi::xml_document document; + document.load_buffer(data.buffer, static_cast(data.size)); + auto multistatus = document.select_node("*[local-name()='multistatus']").node(); + auto responses = multistatus.select_nodes("*[local-name()='response']"); + for (auto response : responses) + { + pugi::xml_node href = response.node().select_node("*[local-name()='href']").node(); + std::string encode_file_name = href.first_child().value(); + std::string resource_path = curl_unescape(encode_file_name.c_str(), static_cast(encode_file_name.length())); + auto target_path = target_urn.path(); + Path resource_urn(resource_path); if (resource_urn == target_urn) continue; - resources.push_back(resource_urn.name()); - } - - return resources; - } - - bool Client::download( - const std::string& remote_file, - const std::string& local_file, - progress_t progress - ) const noexcept - { - return this->sync_download(remote_file, local_file, nullptr, std::move(progress)); - } - - void - Client::async_download( - const std::string& remote_file, - const std::string& local_file, - callback_t callback, - progress_t progress - ) const noexcept - { - std::thread downloading([=]() { this->sync_download(remote_file, local_file, callback, std::move(progress)); }); - downloading.detach(); - } - - bool - Client::download_to( - const std::string& remote_file, - char * & buffer_ptr, - unsigned long long & buffer_size, - progress_t progress - ) const noexcept - { - return this->sync_download_to(remote_file, buffer_ptr, buffer_size, nullptr, std::move(progress)); - } - - bool - Client::download_to( - const std::string& remote_file, - std::ostream& stream, - progress_t progress - ) const noexcept - { - return this->sync_download_to(remote_file, stream, nullptr, std::move(progress)); - } - - bool - Client::create_directory(const std::string& remote_directory, bool recursive) const noexcept - { - bool is_existed = this->check(remote_directory); - if (is_existed) return true; - - bool resource_is_dir = true; - Path directory_urn(remote_directory, resource_is_dir); - - if (recursive) { - auto remote_parent_directory = directory_urn.parent().path(); - if (remote_parent_directory == remote_directory) return false; - bool is_created = this->create_directory(remote_parent_directory, true); - if (!is_created) return false; - } - - Header header = { - "Accept: */*", - "Connection: Keep-Alive" - }; - - auto target_urn = Path(this->webdav_root, true) + remote_directory; - target_urn = Path(target_urn.path(), true); - - Request request(this->options()); - - auto url = this->webdav_hostname + target_urn.quote(request.handle); - - request.set(CURLOPT_CUSTOMREQUEST, "MKCOL"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + resources.push_back(resource_urn.name()); + } + + return resources; + } + + bool Client::download( + const std::string& remote_file, + const std::string& local_file, + progress_t progress + ) const + { + return this->sync_download(remote_file, local_file, nullptr, std::move(progress)); + } + + void + Client::async_download( + const std::string& remote_file, + const std::string& local_file, + callback_t callback, + progress_t progress + ) const + { + std::thread downloading([=]() { this->sync_download(remote_file, local_file, callback, std::move(progress)); }); + downloading.detach(); + } + + bool + Client::download_to( + const std::string& remote_file, + char * & buffer_ptr, + unsigned long long & buffer_size, + progress_t progress + ) const + { + return this->sync_download_to(remote_file, buffer_ptr, buffer_size, nullptr, std::move(progress)); + } + + bool + Client::download_to( + const std::string& remote_file, + std::ostream& stream, + progress_t progress + ) const + { + return this->sync_download_to(remote_file, stream, nullptr, std::move(progress)); + } + + bool + Client::create_directory(const std::string& remote_directory, bool recursive) const + { + bool is_existed = this->check(remote_directory); + if (is_existed) return true; + + bool resource_is_dir = true; + Path directory_urn(remote_directory, resource_is_dir); + + if (recursive) { + auto remote_parent_directory = directory_urn.parent().path(); + if (remote_parent_directory == remote_directory) return false; + bool is_created = this->create_directory(remote_parent_directory, true); + if (!is_created) return false; + } + + Header header = { + "Accept: */*", + "Connection: Keep-Alive" + }; + + auto target_urn = Path(this->webdav_root, true) + remote_directory; + target_urn = Path(target_urn.path(), true); + + Request request(this->options()); + + auto url = this->webdav_hostname + target_urn.quote(request.handle); + + request.set(CURLOPT_CUSTOMREQUEST, "MKCOL"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - return request.perform(); - } + return request.perform(); + } - bool - Client::move(const std::string& remote_source_resource, const std::string& remote_destination_resource) const noexcept - { - bool is_existed = this->check(remote_source_resource); - if (!is_existed) return false; + bool + Client::move(const std::string& remote_source_resource, const std::string& remote_destination_resource) const + { + bool is_existed = this->check(remote_source_resource); + if (!is_existed) return false; - Path root_urn(this->webdav_root, true); + Path root_urn(this->webdav_root, true); - auto source_resource_urn = root_urn + remote_source_resource; - auto destination_resource_urn = root_urn + remote_destination_resource; + auto source_resource_urn = root_urn + remote_source_resource; + auto destination_resource_urn = root_urn + remote_destination_resource; - Header header = { - "Accept: */*", - "Destination: " + destination_resource_urn.path() - }; + Header header = { + "Accept: */*", + "Destination: " + destination_resource_urn.path() + }; - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + source_resource_urn.quote(request.handle); + auto url = this->webdav_hostname + source_resource_urn.quote(request.handle); - request.set(CURLOPT_CUSTOMREQUEST, "MOVE"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_CUSTOMREQUEST, "MOVE"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - return request.perform(); - } + return request.perform(); + } - bool - Client::copy(const std::string& remote_source_resource, const std::string& remote_destination_resource) const noexcept - { - bool is_existed = this->check(remote_source_resource); - if (!is_existed) return false; + bool + Client::copy(const std::string& remote_source_resource, const std::string& remote_destination_resource) const + { + bool is_existed = this->check(remote_source_resource); + if (!is_existed) return false; - Path root_urn(this->webdav_root, true); + Path root_urn(this->webdav_root, true); - auto source_resource_urn = root_urn + remote_source_resource; - auto destination_resource_urn = root_urn + remote_destination_resource; + auto source_resource_urn = root_urn + remote_source_resource; + auto destination_resource_urn = root_urn + remote_destination_resource; - Header header = { - "Accept: */*", - "Destination: " + destination_resource_urn.path() - }; + Header header = { + "Accept: */*", + "Destination: " + destination_resource_urn.path() + }; - Request request(this->options()); + Request request(this->options()); - auto url = this->webdav_hostname + source_resource_urn.quote(request.handle); + auto url = this->webdav_hostname + source_resource_urn.quote(request.handle); - request.set(CURLOPT_CUSTOMREQUEST, "COPY"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_CUSTOMREQUEST, "COPY"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - return request.perform(); - } - - bool - Client::upload( - const std::string& remote_file, - const std::string& local_file, - progress_t progress - ) const noexcept - { - return this->sync_upload(remote_file, local_file, nullptr, std::move(progress)); - } - - void - Client::async_upload( - const std::string& remote_file, - const std::string& local_file, - callback_t callback, - progress_t progress - ) const noexcept - { - std::thread uploading([=]() { this->sync_upload(remote_file, local_file, callback, std::move(progress)); }); - uploading.detach(); - } - - bool - Client::upload_from( - const std::string& remote_file, - std::istream& stream, - progress_t progress - ) const noexcept - { - return this->sync_upload_from(remote_file, stream, nullptr, std::move(progress)); - } - - bool - Client::upload_from( - const std::string& remote_file, - char * buffer_ptr, - unsigned long long buffer_size, - progress_t progress - ) const noexcept - { - return this->sync_upload_from(remote_file, buffer_ptr, buffer_size, nullptr, std::move(progress)); - } - - bool - Client::clean(const std::string& remote_resource) const noexcept - { - bool is_existed = this->check(remote_resource); - if (!is_existed) return true; - - auto root_urn = Path(this->webdav_root, true); - auto resource_urn = root_urn + remote_resource; - - Header header = { - "Accept: */*", - "Connection: Keep-Alive" - }; - - Request request(this->options()); - - auto url = this->webdav_hostname + resource_urn.quote(request.handle); - - request.set(CURLOPT_CUSTOMREQUEST, "DELETE"); - request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + return request.perform(); + } + + bool + Client::upload( + const std::string& remote_file, + const std::string& local_file, + progress_t progress + ) const + { + return this->sync_upload(remote_file, local_file, nullptr, std::move(progress)); + } + + void + Client::async_upload( + const std::string& remote_file, + const std::string& local_file, + callback_t callback, + progress_t progress + ) const + { + std::thread uploading([=]() { this->sync_upload(remote_file, local_file, callback, std::move(progress)); }); + uploading.detach(); + } + + bool + Client::upload_from( + const std::string& remote_file, + std::istream& stream, + progress_t progress + ) const + { + return this->sync_upload_from(remote_file, stream, nullptr, std::move(progress)); + } + + bool + Client::upload_from( + const std::string& remote_file, + char * buffer_ptr, + unsigned long long buffer_size, + progress_t progress + ) const + { + return this->sync_upload_from(remote_file, buffer_ptr, buffer_size, nullptr, std::move(progress)); + } + + bool + Client::clean(const std::string& remote_resource) const + { + bool is_existed = this->check(remote_resource); + if (!is_existed) return true; + + auto root_urn = Path(this->webdav_root, true); + auto resource_urn = root_urn + remote_resource; + + Header header = { + "Accept: */*", + "Connection: Keep-Alive" + }; + + Request request(this->options()); + + auto url = this->webdav_hostname + resource_urn.quote(request.handle); + + request.set(CURLOPT_CUSTOMREQUEST, "DELETE"); + request.set(CURLOPT_URL, url.c_str()); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE - request.set(CURLOPT_VERBOSE, 1); + request.set(CURLOPT_VERBOSE, 1); #endif - return request.perform(); - } + return request.perform(); + } class Environment { public: - Environment() noexcept { + Environment() { curl_global_init(CURL_GLOBAL_ALL); } - ~Environment() noexcept { + ~Environment() { curl_global_cleanup(); } }; From fac2a63e951591fddf2a4b39df73674d89148947 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 10:48:41 +0000 Subject: [PATCH 118/133] refactored --- README.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 967b5c2..682f97d 100644 --- a/README.md +++ b/README.md @@ -70,26 +70,26 @@ Usage int main() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "webdav_username"}, - {"webdav_password", "webdav_password"} - }; - // additional keys: - // - webdav_root - // - cert_path, key_path - // - proxy_hostname, proxy_username, proxy_password + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "webdav_username"}, + {"webdav_password", "webdav_password"} + }; + // additional keys: + // - webdav_root + // - cert_path, key_path + // - proxy_hostname, proxy_username, proxy_password - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - bool check_connection = client->check(); - std::cout << "test connection with WebDAV drive is " + bool check_connection = client->check(); + std::cout << "test connection with WebDAV drive is " << (check_connection ? "" : "not ") << "successful"<< std::endl; - bool is_dir = client->is_directory("/path/to/remote/resource"); - std::cout << "remote resource is " + bool is_dir = client->is_directory("/path/to/remote/resource"); + std::cout << "remote resource is " << (is_dir ? "" : "not ") << "directory" << std::endl; @@ -100,10 +100,10 @@ int main() << client->free_size() << std::endl; - std::cout << "remote_directory_name"; - for (const auto& resource_name : client->list("/path/to/remote/directory/")) + std::cout << "remote_directory_name"; + for (const auto& resource_name : client->list("/path/to/remote/directory/")) { - std::cout << "\t" << "-" << resource_name; + std::cout << "\t" << "-" << resource_name; } std::cout << std::endl; From 73d2daa911637d881a36e1b14eec7f92f378fcb8 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 10:55:18 +0000 Subject: [PATCH 119/133] fixed indent --- sources/client.cpp | 184 ++++++++++++++++++++++----------------------- 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/sources/client.cpp b/sources/client.cpp index b32ce0b..dd4e2a2 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -49,27 +49,27 @@ namespace WebDAV dict_t Client::options() const { - return dict_t - { - { "webdav_hostname", this->webdav_hostname }, - { "webdav_root", this->webdav_root }, - { "webdav_username", this->webdav_username }, - { "webdav_password", this->webdav_password }, - { "proxy_hostname", this->proxy_hostname }, - { "proxy_username", this->proxy_username }, - { "proxy_password", this->proxy_password }, - { "cert_path", this->cert_path }, - { "key_path", this->key_path }, - }; + return dict_t + { + { "webdav_hostname", this->webdav_hostname }, + { "webdav_root", this->webdav_root }, + { "webdav_username", this->webdav_username }, + { "webdav_password", this->webdav_password }, + { "proxy_hostname", this->proxy_hostname }, + { "proxy_username", this->proxy_username }, + { "proxy_password", this->proxy_password }, + { "cert_path", this->cert_path }, + { "key_path", this->key_path }, + }; } bool - Client::sync_download( - const std::string& remote_file, - const std::string& local_file, - callback_t callback, - progress_t progress - ) const + Client::sync_download( + const std::string& remote_file, + const std::string& local_file, + callback_t callback, + progress_t progress + ) const { bool is_existed = this->check(remote_file); if (!is_existed) return false; @@ -103,13 +103,13 @@ namespace WebDAV } bool - Client::sync_download_to( - const std::string& remote_file, - char * & buffer_ptr, - unsigned long long & buffer_size, - callback_t callback, - progress_t progress - ) const + Client::sync_download_to( + const std::string& remote_file, + char * & buffer_ptr, + unsigned long long & buffer_size, + callback_t callback, + progress_t progress + ) const { bool is_existed = this->check(remote_file); if (!is_existed) return false; @@ -142,17 +142,17 @@ namespace WebDAV buffer_ptr = data.buffer; buffer_size = data.size; - data.reset(); + data.reset(); return true; } bool - Client::sync_download_to( - const std::string& remote_file, - std::ostream & stream, - callback_t callback, - progress_t progress - ) const + Client::sync_download_to( + const std::string& remote_file, + std::ostream & stream, + callback_t callback, + progress_t progress + ) const { bool is_existed = this->check(remote_file); if (!is_existed) return false; @@ -179,17 +179,17 @@ namespace WebDAV bool is_performed = request.perform(); if (callback != nullptr) callback(is_performed); - - return is_performed; + + return is_performed; } bool - Client::sync_upload( - const std::string& remote_file, - const std::string& local_file, - callback_t callback, - progress_t progress - ) const + Client::sync_upload( + const std::string& remote_file, + const std::string& local_file, + callback_t callback, + progress_t progress + ) const { bool is_existed = FileInfo::exists(local_file); if (!is_existed) return false; @@ -229,13 +229,13 @@ namespace WebDAV } bool - Client::sync_upload_from( - const std::string& remote_file, - char * buffer_ptr, - unsigned long long buffer_size, - callback_t callback, - progress_t progress - ) const + Client::sync_upload_from( + const std::string& remote_file, + char * buffer_ptr, + unsigned long long buffer_size, + callback_t callback, + progress_t progress + ) const { auto root_urn = Path(this->webdav_root, true); auto file_urn = root_urn + remote_file; @@ -246,7 +246,7 @@ namespace WebDAV auto url = this->webdav_hostname + file_urn.quote(request.handle); - Data response = { nullptr, 0, 0 }; + Data response = { nullptr, 0, 0 }; request.set(CURLOPT_UPLOAD, 1L); request.set(CURLOPT_URL, url.c_str()); @@ -268,17 +268,17 @@ namespace WebDAV if (callback != nullptr) callback(is_performed); - data.reset(); + data.reset(); return is_performed; } bool - Client::sync_upload_from( - const std::string& remote_file, - std::istream& stream, - callback_t callback, - progress_t progress - ) const + Client::sync_upload_from( + const std::string& remote_file, + std::istream& stream, + callback_t callback, + progress_t progress + ) const { auto root_urn = Path(this->webdav_root, true); auto file_urn = root_urn + remote_file; @@ -330,7 +330,7 @@ namespace WebDAV } unsigned long long - Client::free_size() const + Client::free_size() const { Header header = { "Accept: */*", @@ -381,7 +381,7 @@ namespace WebDAV } bool - Client::check(const std::string& remote_resource) const + Client::check(const std::string& remote_resource) const { auto root_urn = Path(this->webdav_root, true); auto resource_urn = root_urn + remote_resource; @@ -410,7 +410,7 @@ namespace WebDAV } dict_t - Client::info(const std::string& remote_resource) const + Client::info(const std::string& remote_resource) const { auto root_urn = Path(this->webdav_root, true); auto target_urn = root_urn + remote_resource; @@ -480,7 +480,7 @@ namespace WebDAV } bool - Client::is_directory(const std::string& remote_resource) const + Client::is_directory(const std::string& remote_resource) const { auto information = this->info(remote_resource); auto resource_type = information["type"]; @@ -489,7 +489,7 @@ namespace WebDAV } strings_t - Client::list(const std::string& remote_directory) const + Client::list(const std::string& remote_directory) const { bool is_existed = this->check(remote_directory); if (!is_existed) return strings_t{}; @@ -683,50 +683,50 @@ namespace WebDAV } bool - Client::upload( - const std::string& remote_file, - const std::string& local_file, - progress_t progress - ) const + Client::upload( + const std::string& remote_file, + const std::string& local_file, + progress_t progress + ) const { return this->sync_upload(remote_file, local_file, nullptr, std::move(progress)); } void - Client::async_upload( - const std::string& remote_file, - const std::string& local_file, - callback_t callback, - progress_t progress - ) const + Client::async_upload( + const std::string& remote_file, + const std::string& local_file, + callback_t callback, + progress_t progress + ) const { std::thread uploading([=]() { this->sync_upload(remote_file, local_file, callback, std::move(progress)); }); uploading.detach(); } bool - Client::upload_from( - const std::string& remote_file, - std::istream& stream, - progress_t progress - ) const + Client::upload_from( + const std::string& remote_file, + std::istream& stream, + progress_t progress + ) const { return this->sync_upload_from(remote_file, stream, nullptr, std::move(progress)); } bool - Client::upload_from( - const std::string& remote_file, - char * buffer_ptr, - unsigned long long buffer_size, - progress_t progress - ) const + Client::upload_from( + const std::string& remote_file, + char * buffer_ptr, + unsigned long long buffer_size, + progress_t progress + ) const { return this->sync_upload_from(remote_file, buffer_ptr, buffer_size, nullptr, std::move(progress)); } bool - Client::clean(const std::string& remote_resource) const + Client::clean(const std::string& remote_resource) const { bool is_existed = this->check(remote_resource); if (!is_existed) return true; @@ -753,15 +753,15 @@ namespace WebDAV return request.perform(); } - class Environment { - public: - Environment() { - curl_global_init(CURL_GLOBAL_ALL); - } - ~Environment() { - curl_global_cleanup(); - } - }; + class Environment { + public: + Environment() { + curl_global_init(CURL_GLOBAL_ALL); + } + ~Environment() { + curl_global_cleanup(); + } + }; } // namespace WebDAV static const WebDAV::Environment env; From 36fc7ff3569098986b0ebdf00386adf7de00a569 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 11:30:06 +0000 Subject: [PATCH 120/133] fixed indent --- .gitignore | 1 + CMakeLists.txt | 6 +- tests/check.cpp | 122 +++++++++++------------ tests/clean.cpp | 236 +++++++++++++++++++++++---------------------- tests/download.cpp | 116 +++++++++++----------- tests/fixture.cpp | 128 ++++++++++++------------ tests/fixture.hpp | 12 +-- tests/list.cpp | 143 +++++++++++++-------------- tests/upload.cpp | 151 +++++++++++++++-------------- 9 files changed, 467 insertions(+), 448 deletions(-) diff --git a/.gitignore b/.gitignore index 3a8afcb..e9558d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.dat .idea/ *build*/ +*logs*/ *.swp .DS_Store *build*/ diff --git a/CMakeLists.txt b/CMakeLists.txt index c66a082..3ea0089 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,13 +113,13 @@ if(BUILD_TESTS) hunter_add_package(Boost COMPONENTS system filesystem) find_package(Boost CONFIG REQUIRED system filesystem) hunter_add_package(Catch) - find_package(Catch CONFIG REQUIRED) + find_package(Catch2 CONFIG REQUIRED) enable_testing() file(GLOB ${PROJECT_NAME}_TEST_SOURCES tests/*.cpp) add_executable(check ${${PROJECT_NAME}_TEST_SOURCES}) - target_link_libraries(check libwdc Catch::Catch Boost::filesystem Boost::system) + target_link_libraries(check libwdc Catch2::Catch Boost::filesystem Boost::system) if(${CMAKE_BUILD_TYPE} MATCHES "Coverage") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") @@ -128,7 +128,7 @@ if(BUILD_TESTS) set(CMAKE_CXX_FLAGS "-g -O0 -Wall -fprofile-arcs -ftest-coverage") set(LCOV_REMOVE_EXTRA "'tests/*'") add_executable(unit_tests ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_TEST_SOURCES}) - target_link_libraries(unit_tests Catch::Catch Boost::filesystem Boost::system libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) + target_link_libraries(unit_tests Catch2::Catch Boost::filesystem Boost::system libwdc OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) setup_target_for_coverage(unit_tests_coverage unit_tests coverage) else() diff --git a/tests/check.cpp b/tests/check.cpp index 6f23993..ea7c27b 100644 --- a/tests/check.cpp +++ b/tests/check.cpp @@ -20,91 +20,93 @@ # ############################################################################*/ -#include #include + #include "fixture.hpp" #include -SCENARIO("Client must check an existing remote resources", "[check]") { - - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto dirname = fixture::get_dir_name(); - auto filename = fixture::get_file_name(); - - CAPTURE(dirname); - CAPTURE(filename); - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - GIVEN("An existing remote resource") { - - std::string existing_file = filename; - std::string existing_directory = dirname; +#include - client->upload_from(existing_file, (char *)content.c_str(), content.length()); - client->create_directory(existing_directory); +SCENARIO("Client must check an existing remote resources", "[check]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto dirname = fixture::get_dir_name(); + auto filename = fixture::get_file_name(); - WHEN("Check for existence of an existing remote file") { + CAPTURE(dirname); + CAPTURE(filename); - REQUIRE(client->check(existing_file)); + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto is_success = client->check(existing_file); + GIVEN("An existing remote resource") + { + std::string existing_file = filename; + std::string existing_directory = dirname; - THEN("Check must be success") { + client->upload_from(existing_file, (char *)content.c_str(), content.length()); + client->create_directory(existing_directory); - CHECK(is_success); - } - } + WHEN("Check for existence of an existing remote file") + { + REQUIRE(client->check(existing_file)); - WHEN("Check for existence of an existing remote directory") { + auto is_success = client->check(existing_file); - REQUIRE(client->check(existing_directory)); + THEN("Check must be success") + { + CHECK(is_success); + } + } - auto is_success = client->check(existing_directory); + WHEN("Check for existence of an existing remote directory") + { + REQUIRE(client->check(existing_directory)); - THEN("The directory is cleaning") { + auto is_success = client->check(existing_directory); - CHECK(is_success); - } - } - } + THEN("The directory is cleaning") + { + CHECK(is_success); + } + } + } } -SCENARIO("Client must check not an existing remote resources", "[check]") { - - auto options = fixture::get_options(); - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - GIVEN("Not an existing remote resource") { - - std::string not_existing_file = "not_existing_file.dat"; - std::string not_existing_directory = "not_existing_directory/"; - - WHEN("Check for existence of not an existing remote file") { +SCENARIO("Client must check not an existing remote resources", "[check]") +{ + auto options = fixture::get_options(); - REQUIRE(client->clean(not_existing_file)); + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto is_success = client->check(not_existing_file); + GIVEN("Not an existing remote resource") + { + std::string not_existing_file = "not_existing_file.dat"; + std::string not_existing_directory = "not_existing_directory/"; - THEN("Check must be not success") { + WHEN("Check for existence of not an existing remote file") + { + REQUIRE(client->clean(not_existing_file)); - CHECK_FALSE(is_success); - } - } + auto is_success = client->check(not_existing_file); - WHEN("Check for existence of an existing remote directory") { + THEN("Check must be not success") { - REQUIRE(client->clean(not_existing_directory)); + CHECK_FALSE(is_success); + } + } - auto is_success = client->check(not_existing_directory); + WHEN("Check for existence of an existing remote directory") + { + REQUIRE(client->clean(not_existing_directory)); - THEN("Check must be not success") { + auto is_success = client->check(not_existing_directory); - CHECK_FALSE(is_success); - } - } - } + THEN("Check must be not success") + { + CHECK_FALSE(is_success); + } + } + } } diff --git a/tests/clean.cpp b/tests/clean.cpp index f547b54..8a57065 100644 --- a/tests/clean.cpp +++ b/tests/clean.cpp @@ -20,165 +20,167 @@ # ############################################################################*/ -#include #include -#include "fixture.hpp" - -#include - -SCENARIO("Client must clean an existing remote resources", "[clean]") { - - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto dirname = fixture::get_dir_name(); - auto filename = fixture::get_file_name(); - CAPTURE(dirname); - CAPTURE(filename); - - std::unique_ptr client{ new WebDAV::Client{ options } }; +#include "fixture.hpp" - GIVEN("An existing remote resource") { +#include - std::string existing_file = filename; - std::string existing_directory = dirname; +#include - client->upload_from(existing_file, (char *)content.c_str(), content.length()); - client->create_directory(existing_directory); +SCENARIO("Client must clean an existing remote resources", "[clean]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto dirname = fixture::get_dir_name(); + auto filename = fixture::get_file_name(); - WHEN("Clean an existing remote file") { + CAPTURE(dirname); + CAPTURE(filename); - REQUIRE(client->check(existing_file)); + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto is_success = client->clean(existing_file); + GIVEN("An existing remote resource") + { + std::string existing_file = filename; + std::string existing_directory = dirname; - THEN("The file is cleaning") { + client->upload_from(existing_file, (char *)content.c_str(), content.length()); + client->create_directory(existing_directory); - CHECK(is_success); - CHECK_FALSE(client->check(existing_file)); - } - } + WHEN("Clean an existing remote file") + { + REQUIRE(client->check(existing_file)); - WHEN("Clean an existing directory") { + auto is_success = client->clean(existing_file); - REQUIRE(client->check(existing_directory)); + THEN("The file is cleaning") + { + CHECK(is_success); + CHECK_FALSE(client->check(existing_file)); + } + } - auto is_success = client->clean(existing_directory); + WHEN("Clean an existing directory") + { + REQUIRE(client->check(existing_directory)); - THEN("The directory is cleaning") { + auto is_success = client->clean(existing_directory); - CHECK(is_success); - CHECK_FALSE(client->check(existing_directory)); - } - } - } + THEN("The directory is cleaning") + { + CHECK(is_success); + CHECK_FALSE(client->check(existing_directory)); + } + } + } } -SCENARIO("Client must clean not an existing remote resources", "[clean]") { - - auto options = fixture::get_options(); +SCENARIO("Client must clean not an existing remote resources", "[clean]") +{ + auto options = fixture::get_options(); - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - GIVEN("Not an existing remote resource") { + GIVEN("Not an existing remote resource") + { + std::string not_existing_file = "not_existing_file.dat"; + std::string not_existing_directory = "not_existing_directory/"; - std::string not_existing_file = "not_existing_file.dat"; - std::string not_existing_directory = "not_existing_directory/"; + WHEN("Clean not an existing remote file") + { + REQUIRE_FALSE(client->check(not_existing_file)); - WHEN("Clean not an existing remote file") { + auto is_success = client->clean(not_existing_file); - REQUIRE_FALSE(client->check(not_existing_file)); + THEN("The file is cleaning") + { + CHECK(is_success); + CHECK_FALSE(client->check(not_existing_file)); + } + } - auto is_success = client->clean(not_existing_file); + WHEN("Clean not an existing directory") + { + REQUIRE_FALSE(client->check(not_existing_directory)); - THEN("The file is cleaning") { + auto is_success = client->clean(not_existing_directory); - CHECK(is_success); - CHECK_FALSE(client->check(not_existing_file)); - } - } - - WHEN("Clean not an existing directory") { - - REQUIRE_FALSE(client->check(not_existing_directory)); - - auto is_success = client->clean(not_existing_directory); - - THEN("The directory is cleaning") { - - CHECK(is_success); - CHECK_FALSE(client->check(not_existing_directory)); - } - } - } + THEN("The directory is cleaning") + { + CHECK(is_success); + CHECK_FALSE(client->check(not_existing_directory)); + } + } + } } -SCENARIO("Client must clean not an empty remote directories", "[clean]") { - - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto dirname = fixture::get_dir_name(); +SCENARIO("Client must clean not an empty remote directories", "[clean]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto dirname = fixture::get_dir_name(); - CAPTURE(dirname); + CAPTURE(dirname); - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - GIVEN("Not an empty remote directory") { + GIVEN("Not an empty remote directory") + { + std::string not_empty_directory = dirname; + std::string attached_file = not_empty_directory + "/" + "attached_file.dat"; + std::string attached_directory = not_empty_directory + "/" + "attached_directory/"; - std::string not_empty_directory = dirname; - std::string attached_file = not_empty_directory + "/" + "attached_file.dat"; - std::string attached_directory = not_empty_directory + "/" + "attached_directory/"; + client->create_directory(not_empty_directory); + client->upload_from(attached_file, (char *)content.c_str(), content.length()); + client->create_directory(attached_directory); - client->create_directory(not_empty_directory); - client->upload_from(attached_file, (char *)content.c_str(), content.length()); - client->create_directory(attached_directory); + WHEN("Clean not an empty directory") + { + REQUIRE(client->check(not_empty_directory)); + REQUIRE(client->check(attached_file)); + REQUIRE(client->check(attached_directory)); - WHEN("Clean not an empty directory") { + auto is_success = client->clean(not_empty_directory); - REQUIRE(client->check(not_empty_directory)); - REQUIRE(client->check(attached_file)); - REQUIRE(client->check(attached_directory)); + REQUIRE(is_success); - auto is_success = client->clean(not_empty_directory); - - REQUIRE(is_success); - - THEN("The directory and the attached resources are cleaning") { - - CHECK_FALSE(client->check(not_empty_directory)); - CHECK_FALSE(client->check(attached_file)); - CHECK_FALSE(client->check(attached_directory)); - } - } - } + THEN("The directory and the attached resources are cleaning") + { + CHECK_FALSE(client->check(not_empty_directory)); + CHECK_FALSE(client->check(attached_file)); + CHECK_FALSE(client->check(attached_directory)); + } + } + } } -SCENARIO("Client must clean a remote directory", "[clean]") { - - auto options = fixture::get_options(); - auto dirname = fixture::get_dir_name(); - - CAPTURE(dirname); +SCENARIO("Client must clean a remote directory", "[clean]") +{ + auto options = fixture::get_options(); + auto dirname = fixture::get_dir_name(); - std::unique_ptr client{ new WebDAV::Client{ options } }; + CAPTURE(dirname); - GIVEN("An existing directory") { - - std::string directory_name = dirname; - client->create_directory(directory_name); + std::unique_ptr client{ new WebDAV::Client{ options } }; - WHEN("Clean directory by a name") { + GIVEN("An existing directory") + { + std::string directory_name = dirname; + client->create_directory(directory_name); - REQUIRE(client->check(directory_name)); + WHEN("Clean directory by a name") + { + REQUIRE(client->check(directory_name)); - auto is_success = client->clean(directory_name); - - REQUIRE(is_success); + auto is_success = client->clean(directory_name); - THEN("The directory is cleaning") { + REQUIRE(is_success); - CHECK_FALSE(client->check(directory_name)); - } - } - } + THEN("The directory is cleaning") + { + CHECK_FALSE(client->check(directory_name)); + } + } + } } diff --git a/tests/download.cpp b/tests/download.cpp index b51bff3..06db4b8 100644 --- a/tests/download.cpp +++ b/tests/download.cpp @@ -20,85 +20,87 @@ # ############################################################################*/ -#include #include -#include "fixture.hpp" - -#include -SCENARIO("Client must download into buffer", "[download][buffer]") { - - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto filename = fixture::get_file_name(); +#include "fixture.hpp" - CAPTURE(filename); +#include - std::unique_ptr client{ new WebDAV::Client{ options } }; +#include +#include - GIVEN("A buffer") { +SCENARIO("Client must download into buffer", "[download][buffer]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); - std::string source_buffer = content; - std::string remote_resource = filename; + CAPTURE(filename); - auto buffer_pointer = const_cast(source_buffer.c_str()); - unsigned long long buffer_size = (source_buffer.length() + 1)* sizeof(source_buffer.c_str()[0]); + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto is_success = client->upload_from(remote_resource, buffer_pointer, buffer_size); - REQUIRE(is_success); + GIVEN("A buffer") + { + std::string source_buffer = content; + std::string remote_resource = filename; - WHEN("Download into the buffer") { + auto buffer_pointer = const_cast(source_buffer.c_str()); + unsigned long long buffer_size = (source_buffer.length() + 1)* sizeof(source_buffer.c_str()[0]); - REQUIRE(client->check(remote_resource)); + auto is_success = client->upload_from(remote_resource, buffer_pointer, buffer_size); + REQUIRE(is_success); - auto is_success = client->download_to(remote_resource, buffer_pointer, buffer_size); + WHEN("Download into the buffer") + { + REQUIRE(client->check(remote_resource)); - THEN("buffer must be downloaded") { + auto is_success = client->download_to(remote_resource, buffer_pointer, buffer_size); - CHECK(is_success); - std::string destination_buffer(buffer_pointer); - CHECK(destination_buffer == source_buffer); - } - } - } + THEN("buffer must be downloaded") + { + CHECK(is_success); + std::string destination_buffer(buffer_pointer); + CHECK(destination_buffer == source_buffer); + } + } + } } -SCENARIO("Client must download stream", "[download][stream]") { - - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto filename = fixture::get_file_name(); - - CAPTURE(filename); - - std::unique_ptr client{ new WebDAV::Client{ options } }; +SCENARIO("Client must download stream", "[download][stream]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); - GIVEN("A stream") { + CAPTURE(filename); - std::stringstream destination_stream; + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::stringstream source_stream(content); - std::string remote_resource = filename; + GIVEN("A stream") + { + std::stringstream destination_stream; - auto is_success = client->upload_from(remote_resource, source_stream); - REQUIRE(is_success); + std::stringstream source_stream(content); + std::string remote_resource = filename; - WHEN("Upload the stream") { + auto is_success = client->upload_from(remote_resource, source_stream); + REQUIRE(is_success); - REQUIRE(client->check(remote_resource)); + WHEN("Upload the stream") + { + REQUIRE(client->check(remote_resource)); - auto is_success = client->download_to(remote_resource, destination_stream); + auto is_success = client->download_to(remote_resource, destination_stream); - THEN("stream must be uploaded") { + THEN("stream must be uploaded") + { + CHECK(is_success); - CHECK(is_success); + std::string source_buffer = source_stream.str(); + std::string destination_buffer = source_stream.str(); - std::string source_buffer = source_stream.str(); - std::string destination_buffer = source_stream.str(); - - CHECK(destination_buffer == source_buffer); - - } - } - } -} + CHECK(destination_buffer == source_buffer); + } + } + } +} diff --git a/tests/fixture.cpp b/tests/fixture.cpp index 58d935c..f235085 100644 --- a/tests/fixture.cpp +++ b/tests/fixture.cpp @@ -20,15 +20,15 @@ # ############################################################################*/ -#include -#include -#include +#include "fixture.hpp" #include #include #include -#include "fixture.hpp" +#include +#include +#include using dict_t = std::map; @@ -38,70 +38,78 @@ std::string buff_content = "static std::wstring buff_content = L\"static std::ws namespace fixture { - auto get_file_content() -> std::string { - return file_content; - } + auto get_file_content() -> std::string + { + return file_content; + } - auto get_buff_content() -> std::string { - return buff_content; - } + auto get_buff_content() -> std::string + { + return buff_content; + } - auto get_file_name() -> std::string { - - boost::uuids::random_generator gen; - boost::uuids::uuid id = gen(); - auto ciid = to_string(id); - return ciid + file_ext;; - } + auto get_file_name() -> std::string + { + boost::uuids::random_generator gen; + boost::uuids::uuid id = gen(); + auto ciid = to_string(id); + return ciid + file_ext;; + } - auto get_dir_name() -> std::string { - - boost::uuids::random_generator gen; - boost::uuids::uuid id = gen(); - auto ciid = to_string(id); - return ciid + "/"; - } + auto get_dir_name() -> std::string + { + boost::uuids::random_generator gen; + boost::uuids::uuid id = gen(); + auto ciid = to_string(id); + return ciid + "/"; + } - auto get_options() -> dict_t { + auto get_options() -> dict_t + { + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); - auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); - auto username_ptr = std::getenv("WEBDAV_USERNAME"); - auto password_ptr = std::getenv("WEBDAV_PASSWORD"); - auto root_ptr = std::getenv("WEBDAV_ROOT"); + if (hostname_ptr == nullptr) + { + throw std::runtime_error("undefined WEBDAV_HOSTNAME environment variable"); + } + if (username_ptr == nullptr) + { + throw std::runtime_error("undefined WEBDAV_USERNAME environment variable"); + } + if (password_ptr == nullptr) + { + throw std::runtime_error("undefined WEBDAV_PASSWORD environment variable"); + } - if (hostname_ptr == nullptr) { - throw std::runtime_error("undefined WEBDAV_HOSTNAME environment variable"); - } - if (username_ptr == nullptr) { - throw std::runtime_error("undefined WEBDAV_USERNAME environment variable"); - } - if (password_ptr == nullptr) { - throw std::runtime_error("undefined WEBDAV_PASSWORD environment variable"); - } + std::map options = { + {"webdav_hostname", hostname_ptr}, + {"webdav_username", username_ptr}, + {"webdav_password", password_ptr} + }; - std::map options = { - {"webdav_hostname", hostname_ptr}, - {"webdav_username", username_ptr}, - {"webdav_password", password_ptr} - }; + if (root_ptr != nullptr) { + options["webdav_root"] = root_ptr; + } - if (root_ptr != nullptr) { - options["webdav_root"] = root_ptr; - } - - auto proxy_hostname_ptr = std::getenv("PROXY_HOSTNAME"); - auto proxy_username_ptr = std::getenv("PROXY_USERNAME"); - auto proxy_password_ptr = std::getenv("PROXY_PASSWORD"); + const auto proxy_hostname_ptr = std::getenv("PROXY_HOSTNAME"); + const auto proxy_username_ptr = std::getenv("PROXY_USERNAME"); + const auto proxy_password_ptr = std::getenv("PROXY_PASSWORD"); - if (proxy_hostname_ptr != nullptr) { - options["proxy_hostname"] = proxy_hostname_ptr; - } - if (proxy_username_ptr != nullptr) { - options["proxy_username"] = proxy_username_ptr; - } - if (proxy_password_ptr != nullptr && proxy_username_ptr != nullptr) { - options["proxy_password"] = proxy_password_ptr; - } - return options; + if (proxy_hostname_ptr != nullptr) + { + options["proxy_hostname"] = proxy_hostname_ptr; + } + if (proxy_username_ptr != nullptr) + { + options["proxy_username"] = proxy_username_ptr; + } + if (proxy_password_ptr != nullptr && proxy_username_ptr != nullptr) + { + options["proxy_password"] = proxy_password_ptr; } + return options; + } } diff --git a/tests/fixture.hpp b/tests/fixture.hpp index de70097..d41d044 100644 --- a/tests/fixture.hpp +++ b/tests/fixture.hpp @@ -27,13 +27,13 @@ using dict_t = std::map; namespace fixture { - auto get_file_content() -> std::string; + auto get_file_content() -> std::string; - auto get_buff_content() -> std::string; + auto get_buff_content() -> std::string; - auto get_file_name() -> std::string; - - auto get_dir_name() -> std::string; + auto get_file_name() -> std::string; - auto get_options() -> dict_t; + auto get_dir_name() -> std::string; + + auto get_options() -> dict_t; } diff --git a/tests/list.cpp b/tests/list.cpp index 334bbae..1f697e5 100644 --- a/tests/list.cpp +++ b/tests/list.cpp @@ -20,108 +20,109 @@ # ############################################################################*/ -#include #include -#include "fixture.hpp" - -#include - -SCENARIO("Client must list a remote files and a remote directories", "[list]") { - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto dirname = fixture::get_dir_name(); - - CAPTURE(dirname); +#include "fixture.hpp" - std::unique_ptr client{ new WebDAV::Client{ options } }; +#include - GIVEN("A remote directory with 5 files and 5 directories") { +#include - std::string root = dirname; +SCENARIO("Client must list a remote files and a remote directories", "[list]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto dirname = fixture::get_dir_name(); - std::string template_filename = "file"; - std::string template_dirname = "dir"; + CAPTURE(dirname); - CHECK(client->clean(root)); - REQUIRE(client->create_directory(root)); + std::unique_ptr client{ new WebDAV::Client{ options } }; - for (auto i = 1; i <= 5; ++i) - { - auto number = std::to_string(i); - auto directory = root + "/" + template_dirname + number; - auto file = root + "/"+ template_filename + number; - client->create_directory(directory); - client->upload_from(file, (char *)content.c_str(), content.length()); - } + GIVEN("A remote directory with 5 files and 5 directories") + { + std::string root = dirname; + std::string template_filename = "file"; + std::string template_dirname = "dir"; - WHEN("List the directory") { + CHECK(client->clean(root)); + REQUIRE(client->create_directory(root)); - auto resources = client->list(root); + for (auto i = 1; i <= 5; ++i) + { + auto number = std::to_string(i); + auto directory = root + "/" + template_dirname + number; + auto file = root + "/"+ template_filename + number; + client->create_directory(directory); + client->upload_from(file, (char *)content.c_str(), content.length()); + } - THEN("Get 10 resources") { + WHEN("List the directory") + { + auto resources = client->list(root); - CHECK(resources.size() == 10); - } - } + THEN("Get 10 resources") + { + CHECK(resources.size() == 10); + } } + } } -SCENARIO("Client can not list a remote file", "[list][file]") { - - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto filename = fixture::get_file_name(); - - CAPTURE(filename); - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - GIVEN("An existing remote file") { +SCENARIO("Client can not list a remote file", "[list][file]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); - std::string existing_file = filename; + CAPTURE(filename); - client->upload_from(existing_file, (char *)content.c_str(), content.length()); + std::unique_ptr client{ new WebDAV::Client{ options } }; - WHEN("List content of the file") { + GIVEN("An existing remote file") + { + std::string existing_file = filename; - REQUIRE(client->check(existing_file)); + client->upload_from(existing_file, (char *)content.c_str(), content.length()); - auto resources = client->list(existing_file); + WHEN("List content of the file") + { + REQUIRE(client->check(existing_file)); - THEN("Get an empty list") { + auto resources = client->list(existing_file); - CHECK(resources.empty()); - } - } + THEN("Get an empty list") + { + CHECK(resources.empty()); + } } + } } -SCENARIO("Client can list an empty remote directory", "[list][empty]") { - - auto options = fixture::get_options(); - auto dirname = fixture::get_dir_name(); - - CAPTURE(dirname); - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - GIVEN("An empty remote directory") { +SCENARIO("Client can list an empty remote directory", "[list][empty]") +{ + auto options = fixture::get_options(); + auto dirname = fixture::get_dir_name(); - std::string empty_directory = dirname; + CAPTURE(dirname); - client->create_directory(empty_directory); + std::unique_ptr client{ new WebDAV::Client{ options } }; - WHEN("List content of the directory") { + GIVEN("An empty remote directory") + { + std::string empty_directory = dirname; - REQUIRE(client->check(empty_directory)); + client->create_directory(empty_directory); - auto resources = client->list(empty_directory); + WHEN("List content of the directory") + { + REQUIRE(client->check(empty_directory)); - THEN("Get an empty list") { + auto resources = client->list(empty_directory); - CHECK(resources.empty()); - } - } + THEN("Get an empty list") + { + CHECK(resources.empty()); + } } + } } diff --git a/tests/upload.cpp b/tests/upload.cpp index a5c65e9..d612241 100644 --- a/tests/upload.cpp +++ b/tests/upload.cpp @@ -20,107 +20,110 @@ # ############################################################################*/ -#include #include + #include "fixture.hpp" +#include + #include #include +#include -SCENARIO("Client must upload buffer", "[upload][buffer]") { - - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto filename = fixture::get_file_name(); +SCENARIO("Client must upload buffer", "[upload][buffer]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); - CAPTURE(filename); + CAPTURE(filename); - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - GIVEN("A buffer") { + GIVEN("A buffer") + { + std::string remote_resource = filename; - std::string remote_resource = filename; + auto buffer_pointer = const_cast(content.c_str()); + auto buffer_size = content.length() * sizeof(content.c_str()[0]); - auto buffer_pointer = const_cast(content.c_str()); - auto buffer_size = content.length() * sizeof(content.c_str()[0]); + WHEN("Upload the buffer") + { + REQUIRE(client->clean(remote_resource)); + REQUIRE(!client->check(remote_resource)); - WHEN("Upload the buffer") { + auto is_success = client->upload_from(remote_resource, buffer_pointer, buffer_size); - REQUIRE(client->clean(remote_resource)); - REQUIRE(!client->check(remote_resource)); + THEN("buffer must be uploaded") { - auto is_success = client->upload_from(remote_resource, buffer_pointer, buffer_size); - - THEN("buffer must be uploaded") { - - CHECK(is_success); - CHECK(client->check(remote_resource)); - } - } - } + CHECK(is_success); + CHECK(client->check(remote_resource)); + } + } + } } -SCENARIO("Client must upload string stream", "[upload][string][stream]") { - - auto options = fixture::get_options(); - auto content = fixture::get_buff_content(); - auto filename = fixture::get_file_name(); - - CAPTURE(filename); +SCENARIO("Client must upload string stream", "[upload][string][stream]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_buff_content(); + auto filename = fixture::get_file_name(); - std::unique_ptr client{ new WebDAV::Client{ options } }; + CAPTURE(filename); - GIVEN("A stream") { + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::stringstream stream(content); - std::string remote_resource = filename; + GIVEN("A stream") + { + std::stringstream stream(content); + std::string remote_resource = filename; - WHEN("Upload the stream") { + WHEN("Upload the stream") + { + REQUIRE(client->clean(remote_resource)); + REQUIRE(!client->check(remote_resource)); - REQUIRE(client->clean(remote_resource)); - REQUIRE(!client->check(remote_resource)); + auto is_success = client->upload_from(remote_resource, stream); - auto is_success = client->upload_from(remote_resource, stream); - - THEN("stream must be uploaded") { - - CHECK(is_success); - CHECK(client->check(remote_resource)); - } - } - } -} - -SCENARIO("Client must upload file stream", "[upload][file][stream]") { - - auto options = fixture::get_options(); - auto content = fixture::get_file_content(); - auto filename = fixture::get_file_name(); - - CAPTURE(filename); - - std::unique_ptr client{ new WebDAV::Client{ options } }; + THEN("stream must be uploaded") + { + CHECK(is_success); + CHECK(client->check(remote_resource)); + } + } + } +} - GIVEN("A stream") { +SCENARIO("Client must upload file stream", "[upload][file][stream]") +{ + auto options = fixture::get_options(); + auto content = fixture::get_file_content(); + auto filename = fixture::get_file_name(); - std::ofstream out(filename); - out << content; + CAPTURE(filename); - std::ifstream in(filename, std::ios::binary); - std::string remote_resource = filename; + std::unique_ptr client{ new WebDAV::Client{ options } }; - WHEN("Upload the stream") { + GIVEN("A stream") + { + std::ofstream out(filename); + out << content; - REQUIRE(client->clean(remote_resource)); - REQUIRE(!client->check(remote_resource)); + std::ifstream in(filename, std::ios::binary); + std::string remote_resource = filename; - auto is_success = client->upload_from(remote_resource, in); + WHEN("Upload the stream") + { + REQUIRE(client->clean(remote_resource)); + REQUIRE(!client->check(remote_resource)); - THEN("stream must be uploaded") { + auto is_success = client->upload_from(remote_resource, in); - CHECK(is_success); - CHECK(client->check(remote_resource)); - } - } - } -} + THEN("stream must be uploaded") + { + CHECK(is_success); + CHECK(client->check(remote_resource)); + } + } + } +} From 8e4a1fc09d1b64b46089506f4c533bc3ae2ccac5 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 11:35:14 +0000 Subject: [PATCH 121/133] change atol to lexical_cast --- sources/client.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sources/client.cpp b/sources/client.cpp index dd4e2a2..150c88f 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -29,7 +29,8 @@ #include "request.hpp" #include "urn.hpp" -#include +#include + #include #include @@ -376,8 +377,7 @@ namespace WebDAV pugi::xml_node quota_available_bytes = prop.select_node("*[local-name()='quota-available-bytes']").node(); std::string free_size_text = quota_available_bytes.first_child().value(); - auto free_size = std::atoll(free_size_text.c_str()); - return free_size; + return boost::lexical_cast(free_size_text); } bool From f4c203fb3a1ac9e64541125cd69c5cb22d89702c Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 14:44:01 +0300 Subject: [PATCH 122/133] Update README.md --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 682f97d..668f876 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,9 @@ Build Building WebDAV Client from sources: ```ShellSession -$ git clone https://github.com/CloudPolis/webdav-client-cpp +$ git clone --recursive https://github.com/CloudPolis/webdav-client-cpp $ cd webdav-client-cpp -$ cmake -H. -B_builds # -DCMAKE_INSTALL_PREFIX=install -$ cmake --build _builds -$ cmake --build _builds --target install +$ ./tools/polly/bin/polly --install ``` Building documentation: @@ -53,9 +51,7 @@ For run tests you need to set environment variables `WEBDAV_HOSTNAME`, $ export WEBDAV_HOSTNAME= $ export WEBDAV_USERNAME= $ export WEBDAV_PASSWORD= -$ cmake -H. -B_builds -DBUILD_TESTS=ON -$ cmake --build _builds -$ cmake --build _builds --target test -- ARGS=--verbose +$ ./tools/polly/bin/polly --test --reconfig --fwd BUILD_TESTS=yes ``` Usage From 2e656ab37f6266f73bd881fd9a72d557630a107f Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 11:45:03 +0000 Subject: [PATCH 123/133] added submodules for CI --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6fe7c25..6b6e7b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ dist: trusty sudo: required git: depth: 1 - submodules: false + submodules: true addons: apt: packages: From 82971c04829fc747ed159302759d16f53e614050 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 12:20:11 +0000 Subject: [PATCH 124/133] update copyright --- CMakeLists.txt | 2 +- include/webdav/client.hpp | 2 +- sources/callback.cpp | 6 +- sources/callback.hpp | 6 +- sources/client.cpp | 2 +- sources/fsinfo.cpp | 7 +- sources/fsinfo.hpp | 6 +- sources/header.cpp | 6 +- sources/header.hpp | 29 ++-- sources/pugiext.hpp | 36 ++--- sources/request.cpp | 225 +++++++++++++-------------- sources/request.hpp | 82 +++++----- sources/urn.cpp | 312 ++++++++++++++++++++------------------ sources/urn.hpp | 58 ++++--- 14 files changed, 389 insertions(+), 390 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ea0089..3f9f13a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ huntergate( set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 1) set(WDC_VERSION_PATCH 4) -set(WDC_VERSION_TWEAK 0) +set(WDC_VERSION_TWEAK 1) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 248e729..f515307 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -6,7 +6,7 @@ # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which # you should have received as part of this distribution. diff --git a/sources/callback.cpp b/sources/callback.cpp index a8b3c98..9b04f39 100644 --- a/sources/callback.cpp +++ b/sources/callback.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 diff --git a/sources/callback.hpp b/sources/callback.hpp index 8746923..c3c7bee 100644 --- a/sources/callback.hpp +++ b/sources/callback.hpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 diff --git a/sources/client.cpp b/sources/client.cpp index 150c88f..47ee504 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -6,7 +6,7 @@ # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which # you should have received as part of this distribution. diff --git a/sources/fsinfo.cpp b/sources/fsinfo.cpp index 9140867..dd39b29 100644 --- a/sources/fsinfo.cpp +++ b/sources/fsinfo.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -20,7 +20,6 @@ # ############################################################################*/ - #include "fsinfo.hpp" #include diff --git a/sources/fsinfo.hpp b/sources/fsinfo.hpp index 1acdca0..478227a 100644 --- a/sources/fsinfo.hpp +++ b/sources/fsinfo.hpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 diff --git a/sources/header.cpp b/sources/header.cpp index 52e3885..50e36af 100644 --- a/sources/header.cpp +++ b/sources/header.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 diff --git a/sources/header.hpp b/sources/header.hpp index be46b3f..9470aec 100644 --- a/sources/header.hpp +++ b/sources/header.hpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -31,25 +31,20 @@ namespace WebDAV class Header final { public: - void * handle; + void * handle; - Header(const std::initializer_list& init_list) noexcept; + Header(const std::initializer_list& init_list) noexcept; + Header(const Header& other) = delete; + Header(Header&& other) noexcept; + ~Header() noexcept; - ~Header() noexcept; + auto operator=(const Header& other) -> Header& = delete; + auto operator=(Header&& other) noexcept -> Header&; - Header(const Header& other) = delete; - - auto operator=(const Header& other) -> Header& = delete; - - Header(Header&& other) noexcept; - - auto operator=(Header&& other) noexcept -> Header&; - - void append(const std::string& item) noexcept; + void append(const std::string& item) noexcept; private: - - auto swap(Header& other) noexcept -> void; + auto swap(Header& other) noexcept -> void; }; } // namespace WebDAV diff --git a/sources/pugiext.hpp b/sources/pugiext.hpp index 8d6d270..a071cb1 100644 --- a/sources/pugiext.hpp +++ b/sources/pugiext.hpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -27,24 +27,24 @@ namespace pugi { - class PUGIXML_CLASS xml_string_writer: public xml_writer - { - public: - std::string result; + class PUGIXML_CLASS xml_string_writer: public xml_writer + { + public: + std::string result; - void write(const void* data, size_t size) final - { - result += std::string(static_cast(data), size); - } - }; + void write(const void* data, size_t size) final + { + result += std::string(static_cast(data), size); + } + }; - inline std::string node_to_string(const pugi::xml_node& node) - { - xml_string_writer writer; - node.print(writer); + inline std::string node_to_string(const pugi::xml_node& node) + { + xml_string_writer writer; + node.print(writer); - return writer.result; - } + return writer.result; + } } // namespace pugi #endif diff --git a/sources/request.cpp b/sources/request.cpp index 355fa10..69efe8f 100644 --- a/sources/request.cpp +++ b/sources/request.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -25,130 +25,131 @@ namespace WebDAV { - auto inline get(const dict_t& options, const std::string&& name) -> std::string - { - auto it = options.find(name); - if (it == options.end()) { - return std::string{""}; - } - else { - return it->second; - } - } - - Request::Request(dict_t&& options_) : options(options_) - { - auto webdav_hostname = get(options, "webdav_hostname"); - auto webdav_username = get(options, "webdav_username"); - auto webdav_password = get(options, "webdav_password"); - - auto proxy_hostname = get(options, "proxy_hostname"); - auto proxy_username = get(options, "proxy_username"); - auto proxy_password = get(options, "proxy_password"); - - auto cert_path = get(options, "cert_path"); - auto key_path = get(options, "key_path"); - - this->handle = curl_easy_init(); - - this->set(CURLOPT_SSL_VERIFYHOST, 0); - this->set(CURLOPT_SSL_VERIFYPEER, 0); + auto inline get(const dict_t& options, const std::string&& name) -> std::string + { + auto it = options.find(name); + if (it == options.end()) + { + return std::string{""}; + } + else + { + return it->second; + } + } -#ifdef _DEBUG - this->set(CURLOPT_VERBOSE, 1); -#else - this->set(CURLOPT_VERBOSE, 0); -#endif - if (this->cert_required()){ + Request::Request(dict_t&& options_) : options(options_) + { + auto webdav_hostname = get(options, "webdav_hostname"); + auto webdav_username = get(options, "webdav_username"); + auto webdav_password = get(options, "webdav_password"); - this->set(CURLOPT_SSLCERTTYPE, "PEM"); - this->set(CURLOPT_SSLKEYTYPE, "PEM"); - this->set(CURLOPT_SSLCERT, const_cast(cert_path.c_str())); - this->set(CURLOPT_SSLKEY, const_cast(key_path.c_str())); + auto proxy_hostname = get(options, "proxy_hostname"); + auto proxy_username = get(options, "proxy_username"); + auto proxy_password = get(options, "proxy_password"); - } - - this->set(CURLOPT_URL, const_cast(webdav_hostname.c_str())); - this->set(CURLOPT_HTTPAUTH, static_cast(CURLAUTH_BASIC)); - auto token = webdav_username + ":" + webdav_password; - this->set(CURLOPT_USERPWD, const_cast(token.c_str())); + auto cert_path = get(options, "cert_path"); + auto key_path = get(options, "key_path"); - if (!this->proxy_enabled()) return; + this->handle = curl_easy_init(); - this->set(CURLOPT_PROXY, const_cast(proxy_hostname.c_str())); - this->set(CURLOPT_PROXYAUTH, static_cast(CURLAUTH_BASIC)); + this->set(CURLOPT_SSL_VERIFYHOST, 0); + this->set(CURLOPT_SSL_VERIFYPEER, 0); - if (proxy_username.empty()) return; +#ifdef _DEBUG + this->set(CURLOPT_VERBOSE, 1); +#else + this->set(CURLOPT_VERBOSE, 0); +#endif + if (this->cert_required()) + { + this->set(CURLOPT_SSLCERTTYPE, "PEM"); + this->set(CURLOPT_SSLKEYTYPE, "PEM"); + this->set(CURLOPT_SSLCERT, const_cast(cert_path.c_str())); + this->set(CURLOPT_SSLKEY, const_cast(key_path.c_str())); + } + + this->set(CURLOPT_URL, const_cast(webdav_hostname.c_str())); + this->set(CURLOPT_HTTPAUTH, static_cast(CURLAUTH_BASIC)); + auto token = webdav_username + ":" + webdav_password; + this->set(CURLOPT_USERPWD, const_cast(token.c_str())); - if (proxy_password.empty()) - { - this->set(CURLOPT_PROXYUSERNAME, const_cast(proxy_username.c_str())); - } - else - { - token = proxy_username + ":" + proxy_password; - this->set(CURLOPT_PROXYUSERPWD, const_cast(token.c_str())); - } - } + if (!this->proxy_enabled()) return; - Request::~Request() noexcept - { - if (this->handle != nullptr) curl_easy_cleanup(this->handle); - } + this->set(CURLOPT_PROXY, const_cast(proxy_hostname.c_str())); + this->set(CURLOPT_PROXYAUTH, static_cast(CURLAUTH_BASIC)); + if (proxy_username.empty()) return; - auto Request::swap(Request& other) noexcept -> void + if (proxy_password.empty()) { - using std::swap; - swap(handle, other.handle); + this->set(CURLOPT_PROXYUSERNAME, const_cast(proxy_username.c_str())); } - - Request::Request(Request&& other) noexcept : handle{ other.handle } + else { - other.handle = nullptr; + token = proxy_username + ":" + proxy_password; + this->set(CURLOPT_PROXYUSERPWD, const_cast(token.c_str())); } + } - auto Request::operator=(Request&& other) noexcept -> Request & - { - if (this != &other) { - Request(std::move(other)).swap(*this); - } + Request::~Request() noexcept + { + if (this->handle != nullptr) curl_easy_cleanup(this->handle); + } - return *this; - } - bool Request::perform() const noexcept - { - if (this->handle == nullptr) return false; - auto is_performed = check_code(curl_easy_perform(this->handle)); - if (!is_performed) return false; - long http_code = 0; - curl_easy_getinfo(this->handle, CURLINFO_RESPONSE_CODE, &http_code); - if (http_code < 200 || http_code > 299) return false; - return true; - } - - bool Request::proxy_enabled() const noexcept - { - auto proxy_hostname = get(options, "proxy_hostname"); - auto proxy_username = get(options, "proxy_username"); - auto proxy_password = get(options, "proxy_password"); - bool proxy_hostname_presented = !proxy_hostname.empty(); - if (!proxy_hostname_presented) return false; - bool proxy_username_presented = !proxy_username.empty(); - bool proxy_password_presented = !proxy_password.empty(); - if (proxy_password_presented && !proxy_username_presented) return false; - return true; - } - - bool Request::cert_required() const noexcept - { - const auto cert_path = get(options, "cert_path"); - const auto key_path = get(options, "key_path"); - if (cert_path.empty()) return false; - bool cert_is_existed = FileInfo::exists(cert_path); - if (!cert_is_existed) return false; - if (key_path.empty()) return false; - return FileInfo::exists(key_path); - } + auto Request::swap(Request& other) noexcept -> void + { + using std::swap; + swap(handle, other.handle); + } + + Request::Request(Request&& other) noexcept : handle{ other.handle } + { + other.handle = nullptr; + } + + auto Request::operator=(Request&& other) noexcept -> Request & + { + if (this != &other) + { + Request(std::move(other)).swap(*this); + } + return *this; + } + + bool Request::perform() const noexcept + { + if (this->handle == nullptr) return false; + auto is_performed = check_code(curl_easy_perform(this->handle)); + if (!is_performed) return false; + long http_code = 0; + curl_easy_getinfo(this->handle, CURLINFO_RESPONSE_CODE, &http_code); + if (http_code < 200 || http_code > 299) return false; + return true; + } + + bool Request::proxy_enabled() const noexcept + { + auto proxy_hostname = get(options, "proxy_hostname"); + auto proxy_username = get(options, "proxy_username"); + auto proxy_password = get(options, "proxy_password"); + bool proxy_hostname_presented = !proxy_hostname.empty(); + if (!proxy_hostname_presented) return false; + bool proxy_username_presented = !proxy_username.empty(); + bool proxy_password_presented = !proxy_password.empty(); + if (proxy_password_presented && !proxy_username_presented) return false; + return true; + } + + bool Request::cert_required() const noexcept + { + const auto cert_path = get(options, "cert_path"); + const auto key_path = get(options, "key_path"); + if (cert_path.empty()) return false; + bool cert_is_existed = FileInfo::exists(cert_path); + if (!cert_is_existed) return false; + if (key_path.empty()) return false; + return FileInfo::exists(key_path); + } } // namespace WebDAV diff --git a/sources/request.hpp b/sources/request.hpp index b67b74a..2a312d9 100644 --- a/sources/request.hpp +++ b/sources/request.hpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -29,48 +29,40 @@ namespace WebDAV { - bool inline check_code(CURLcode code) - { - return code == CURLE_OK; - } - - using dict_t = std::map; - - class Request - { - const dict_t options; - - bool proxy_enabled() const noexcept; - - bool cert_required() const noexcept; - - auto swap(Request& other) noexcept -> void; - - public: - - explicit Request(dict_t&& options_); - - ~Request() noexcept; - - Request(const Request& other) = delete; - - Request(Request&& other) noexcept; - - auto operator=(const Request& other) -> Request & = delete; - - auto operator=(Request&& other) noexcept -> Request &; - - template - auto set(CURLoption option, T value) const noexcept -> bool - { - if (this->handle == nullptr) return false; - return check_code(curl_easy_setopt(this->handle, option, value)); - } - - bool perform() const noexcept; - - void * handle; - }; + bool inline check_code(CURLcode code) + { + return code == CURLE_OK; + } + + using dict_t = std::map; + + class Request + { + public: + explicit Request(dict_t&& options_); + Request(const Request& other) = delete; + Request(Request&& other) noexcept; + ~Request() noexcept; + + auto operator=(const Request& other) -> Request & = delete; + auto operator=(Request&& other) noexcept -> Request &; + + template + auto set(CURLoption option, T value) const noexcept -> bool + { + if (this->handle == nullptr) return false; + return check_code(curl_easy_setopt(this->handle, option, value)); + } + + bool perform() const noexcept; + void * handle; + + private: + const dict_t options; + bool proxy_enabled() const noexcept; + bool cert_required() const noexcept; + auto swap(Request& other) noexcept -> void; + }; } // namespace WebDAV #endif diff --git a/sources/urn.cpp b/sources/urn.cpp index 17cb97c..5a02d5a 100644 --- a/sources/urn.cpp +++ b/sources/urn.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -20,173 +20,191 @@ # ############################################################################*/ +#include + #include +#include #include #include #include -#include using std::string; using std::vector; #include "urn.hpp" -namespace WebDAV +namespace WebDAV { - namespace Urn - { - - const string Path::separate = "/"; - const string Path::root = "/"; - - Path::Path(const string& path_, bool force_dir) { - - string path = path_; - if (path_.empty()) path = Path::root; - auto first_position = path.find(Path::separate); - if (first_position != 0) path = Path::root + path; - auto last_symbol_index = path.length() - 1; - auto last_symbol = path.substr(last_symbol_index, 1); - auto is_dir = last_symbol == Path::separate; - if (force_dir && !is_dir) path += Path::separate; - m_path = path; - - auto double_separte = Path::separate + Path::separate; - bool is_find = false; - do { - auto first_position = m_path.find(double_separte); - is_find = first_position != m_path.npos; - if (is_find) { - m_path.replace(first_position, double_separte.size(), Path::separate); - } - } while (is_find); - } - - Path::Path(std::nullptr_t) { - m_path = nullptr; - } - - auto Path::path() const -> string { - return m_path; - } - - auto escape(void * request, const string& name) -> string { - - string path = curl_easy_escape(request, name.c_str(), static_cast(name.length())); - return path; - } - - auto split(const string& text, const string& delims) -> vector { - - vector tokens; - auto start = text.find_first_not_of(delims); - auto end = text.npos; - - while ((end = text.find_first_of(delims, start)) != text.npos){ - - tokens.push_back(text.substr(start, end-start)); - start = text.find_first_not_of(delims, end); - } - if (start != text.npos) { - tokens.push_back(text.substr(start)); - } - return tokens; - } - - auto Path::quote(void *request) const -> string { - - if (this->is_root()) return m_path; - - auto names = split(m_path, Path::separate); - string quote_path; - - std::for_each(names.begin(), names.end(), ["e_path, request](string& name) { - auto escape_name = escape(request, name); - quote_path.append(Path::separate); - quote_path.append(escape_name); - }); - - if (is_directory()) { - quote_path.append(Path::separate); - } - return quote_path; - } - - auto Path::name() const -> string { - - auto path = this->path(); - auto is_root = path == Path::separate; - if (is_root) return string{""}; + namespace Urn + { - if (this->is_directory()) { + const string Path::separate = "/"; + const string Path::root = "/"; - auto path_without_slash = path.substr(0, path.length() - 1); - auto pre_last_separate_position = path_without_slash.rfind(Path::separate); - auto name = path.substr(pre_last_separate_position + 1); - return name; - } - else { - - auto last_separate_position = path.rfind(Path::separate); - auto name = path.substr(last_separate_position + 1); - return name; - } + Path::Path(const string& path_, bool force_dir) + { + string path = path_; + if (path_.empty()) path = Path::root; + auto first_position = path.find(Path::separate); + if (first_position != 0) path = Path::root + path; + + auto last_symbol_index = path.length() - 1; + auto last_symbol = path.substr(last_symbol_index, 1); + auto is_dir = last_symbol == Path::separate; + + if (force_dir && !is_dir) path += Path::separate; + m_path = path; + + auto double_separte = Path::separate + Path::separate; + bool is_find = false; + do + { + auto first_position = m_path.find(double_separte); + is_find = first_position != m_path.npos; + if (is_find) + { + m_path.replace(first_position, double_separte.size(), Path::separate); } + } while (is_find); + } - auto Path::parent() const -> Path { + Path::Path(std::nullptr_t) + { + m_path = nullptr; + } - if (this->is_root()) return Path{m_path}; + auto Path::path() const -> string + { + return m_path; + } - auto last_separate_position = m_path.rfind(Path::separate, m_path.length() - 2); - if (last_separate_position == 0) return Path{Path::separate}; + auto escape(void * request, const string& name) -> string + { + string path = curl_easy_escape(request, name.c_str(), static_cast(name.length())); + return path; + } - auto parent = m_path.substr(0, last_separate_position + 1); - return Path{parent}; - } + auto split(const string& text, const string& delims) -> vector + { + vector tokens; + auto start = text.find_first_not_of(delims); + auto end = text.npos; + + while ((end = text.find_first_of(delims, start)) != text.npos) + { + tokens.push_back(text.substr(start, end-start)); + start = text.find_first_not_of(delims, end); + } + if (start != text.npos) + { + tokens.push_back(text.substr(start)); + } + return tokens; + } + + auto Path::quote(void *request) const -> string + { + if (this->is_root()) return m_path; + + auto names = split(m_path, Path::separate); + string quote_path; + + std::for_each(names.begin(), names.end(), ["e_path, request](string& name) + { + auto escape_name = escape(request, name); + quote_path.append(Path::separate); + quote_path.append(escape_name); + }); + + if (is_directory()) + { + quote_path.append(Path::separate); + } + return quote_path; + } + + auto Path::name() const -> string + { + auto path = this->path(); + auto is_root = path == Path::separate; + if (is_root) return string{""}; + + if (this->is_directory()) + { + auto path_without_slash = path.substr(0, path.length() - 1); + auto pre_last_separate_position = path_without_slash.rfind(Path::separate); + auto name = path.substr(pre_last_separate_position + 1); + return name; + } + else + { + auto last_separate_position = path.rfind(Path::separate); + auto name = path.substr(last_separate_position + 1); + return name; + } + } + + auto Path::parent() const -> Path + { + if (this->is_root()) return Path{m_path}; - auto Path::is_directory() const -> bool { + auto last_separate_position = m_path.rfind(Path::separate, m_path.length() - 2); + if (last_separate_position == 0) return Path{Path::separate}; - auto path = this->path(); - auto last_symbol_index = path.length() - 1; - auto last_symbol = path.substr(last_symbol_index, 1); - auto is_equal = last_symbol == Path::separate; - return is_equal; - } + auto parent = m_path.substr(0, last_separate_position + 1); + return Path{parent}; + } - auto Path::is_root() const -> bool { - return m_path == Path::separate; - } + auto Path::is_directory() const -> bool + { + auto path = this->path(); + auto last_symbol_index = path.length() - 1; + auto last_symbol = path.substr(last_symbol_index, 1); + auto is_equal = last_symbol == Path::separate; + return is_equal; + } + + auto Path::is_root() const -> bool + { + return m_path == Path::separate; + } - auto Path::operator+(const string& rhs) const -> Path { - return Path{ m_path + rhs }; - } + auto Path::operator+(const string& rhs) const -> Path + { + return Path{ m_path + rhs }; + } - auto Path::operator==(const Path& rhs) const -> bool { - - if (this->is_root() && rhs.is_root()) return true; - if (!this->is_root() && rhs.is_root()) return false; - - string lhs_path; - bool is_dir = is_directory(); - if (is_dir) { - lhs_path = m_path.substr(0, m_path.length()-1); - } - else { - lhs_path = m_path; - } - string rhs_path; - if (rhs.is_directory()) { - rhs_path = rhs.path(); - rhs_path = rhs_path.substr(0, rhs_path.length()-1); - } - else { - rhs_path = rhs.path(); - } - return lhs_path == rhs_path; - } - } // namespace Urn + auto Path::operator==(const Path& rhs) const -> bool + { + if (this->is_root() && rhs.is_root()) return true; + if (!this->is_root() && rhs.is_root()) return false; + + string lhs_path; + bool is_dir = is_directory(); + if (is_dir) + { + lhs_path = m_path.substr(0, m_path.length()-1); + } + else + { + lhs_path = m_path; + } + string rhs_path; + if (rhs.is_directory()) + { + rhs_path = rhs.path(); + rhs_path = rhs_path.substr(0, rhs_path.length()-1); + } + else + { + rhs_path = rhs.path(); + } + return lhs_path == rhs_path; + } + } // namespace Urn } // namespace WebDAV -auto operator<<(std::ostream& stream, const WebDAV::Urn::Path& path) -> std::ostream& { - return stream << path.path(); +auto operator<<(std::ostream& stream, const WebDAV::Urn::Path& path) -> std::ostream& +{ + return stream << path.path(); } diff --git a/sources/urn.hpp b/sources/urn.hpp index d7b2bca..defc0cc 100644 --- a/sources/urn.hpp +++ b/sources/urn.hpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -29,42 +29,36 @@ namespace WebDAV { - namespace Urn - { - - using std::string; - - class Path { - - static const string separate; - - static const string root; - - string m_path; + namespace Urn + { + using std::string; + using std::nullptr_t; - public: - - explicit Path(const string& path_, bool force_dir = false); - - explicit Path(std::nullptr_t); - - auto path() const -> string; - - auto quote(void * request) const -> string; + class Path + { + public: - auto name() const -> string; + explicit Path(const string& path_, bool force_dir = false); + explicit Path(nullptr_t); - auto parent() const -> Path; + auto operator+(const std::string& rhs) const -> Path; + auto operator==(const Path& rhs) const -> bool; - auto is_directory() const -> bool; + auto is_directory() const -> bool; + auto is_root() const -> bool; + auto name() const -> string; + auto parent() const -> Path; + auto path() const -> string; + auto quote(void * request) const -> string; - auto is_root() const -> bool; + private: - auto operator+(const std::string& rhs) const -> Path; + string m_path; - auto operator==(const Path& rhs) const -> bool; - }; - } + static const string separate; + static const string root; + }; + } } auto operator<<(std::ostream& stream, const WebDAV::Urn::Path& path) -> std::ostream&; From 8608da19578f52b6e5548a5e1710f1d56f4723f0 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 12:21:23 +0000 Subject: [PATCH 125/133] update project version --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f9f13a..8120375 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,8 +30,8 @@ huntergate( set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 1) -set(WDC_VERSION_PATCH 4) -set(WDC_VERSION_TWEAK 1) +set(WDC_VERSION_PATCH 5) +set(WDC_VERSION_TWEAK 0) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) From 7ceddc4c49f9310e49e249d9992fa3affc6a70e0 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 15:21:15 +0000 Subject: [PATCH 126/133] moved HunterGate in cmake module dir --- .gitmodules | 3 - CMakeLists.txt | 4 +- TODO.md | 0 cmake/Hunter/config.cmake | 1 - cmake/HunterGate.cmake | 540 ++++++++++++++++++++++++++++++++++++++ tools/gate | 1 - 6 files changed, 542 insertions(+), 7 deletions(-) delete mode 100644 TODO.md delete mode 100644 cmake/Hunter/config.cmake create mode 100644 cmake/HunterGate.cmake delete mode 160000 tools/gate diff --git a/.gitmodules b/.gitmodules index b4b19c5..a80f7a9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "tools/gate"] - path = tools/gate - url = https://github.com/hunter-packages/gate [submodule "tools/polly"] path = tools/polly url = https://github.com/ruslo/polly diff --git a/CMakeLists.txt b/CMakeLists.txt index 8120375..26661e6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ cmake_minimum_required(VERSION 3.4) -include("tools/gate/cmake/HunterGate.cmake") +include("cmake/HunterGate.cmake") huntergate( URL "https://github.com/ruslo/hunter/archive/v0.23.83.tar.gz" SHA1 "12dec078717539eb7b03e6d2a17797cba9be9ba9" @@ -31,7 +31,7 @@ huntergate( set(WDC_VERSION_MAJOR 1) set(WDC_VERSION_MINOR 1) set(WDC_VERSION_PATCH 5) -set(WDC_VERSION_TWEAK 0) +set(WDC_VERSION_TWEAK 1) set(WDC_VERSION ${WDC_VERSION_MAJOR}.${WDC_VERSION_MINOR}.${WDC_VERSION_PATCH}) project(WDC VERSION ${WDC_VERSION}) diff --git a/TODO.md b/TODO.md deleted file mode 100644 index e69de29..0000000 diff --git a/cmake/Hunter/config.cmake b/cmake/Hunter/config.cmake deleted file mode 100644 index 3550326..0000000 --- a/cmake/Hunter/config.cmake +++ /dev/null @@ -1 +0,0 @@ -hunter_config(OpenSSL VERSION 1.0.2j) diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake new file mode 100644 index 0000000..887557a --- /dev/null +++ b/cmake/HunterGate.cmake @@ -0,0 +1,540 @@ +# Copyright (c) 2013-2018, 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_WIKI "https://github.com/ruslo/hunter/wiki") + +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_wiki wiki_page) + message("------------------------------ WIKI -------------------------------") + message(" ${HUNTER_WIKI}/${wiki_page}") + 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_wiki("error.internal") +endfunction() + +function(hunter_gate_fatal_error) + cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}") + string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki) + if(have_no_wiki) + hunter_gate_internal_error("Expected wiki") + 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_wiki("${hunter_WIKI}") +endfunction() + +function(hunter_gate_user_error) + hunter_gate_fatal_error(${ARGV} WIKI "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) + + if(EXISTS "${root}/cmake/Hunter") + set(hunter_self "${root}") + else() + set( + hunter_self + "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" + ) + endif() + + 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" + WIKI "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}" + WIKI "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}" + WIKI "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!)" + WIKI "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") + if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") + # Hunter downloaded manually (e.g. by 'git clone') + set(_unused "xxxxxxxxxx") + set(HUNTER_GATE_SHA1 "${_unused}") + set(HUNTER_GATE_VERSION "${_unused}") + else() + 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() + endif() + include("${_master_location}") + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() +endmacro() diff --git a/tools/gate b/tools/gate deleted file mode 160000 index 42c1c27..0000000 --- a/tools/gate +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 42c1c27cdd556dcbc358c6ba8ad7a72a68ee2a62 From fa8dd7c61aeaaedb32a350a2705ae9c076f66d32 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 4 Jan 2019 19:16:57 +0000 Subject: [PATCH 127/133] fixed access modificator --- CMakeLists.txt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 26661e6..eda3bde 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -62,11 +62,16 @@ if(WDC_VERBOSE) target_compile_definitions(libwdc PUBLIC WDC_VERBOSE=1) endif() -target_link_libraries(libwdc Boost::boost OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml) +target_link_libraries(libwdc + PUBLIC OpenSSL::SSL OpenSSL::Crypto CURL::libcurl pugixml +) +target_include_directories(libwdc + PRIVATE $ +) target_include_directories(libwdc PUBLIC - $ - $ + $ + $ ) set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") @@ -132,7 +137,7 @@ if(BUILD_TESTS) setup_target_for_coverage(unit_tests_coverage unit_tests coverage) else() - add_test(NAME unit_tests COMMAND check "-s" "-r" "compact" "--use-colour" "yes") + add_test(NAME unit_tests COMMAND check "-s" "-r" "compact" "--use-colour" "yes") endif() endif() From 850963b028710c0e1260834d10c35173cff78470 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 5 Jan 2019 07:59:28 +0000 Subject: [PATCH 128/133] fixed formatting errors --- include/webdav/client.hpp | 4 +- sources/callback.cpp | 156 +++++++++++++++++++------------------- sources/callback.hpp | 54 ++++++------- sources/client.cpp | 2 +- sources/fsinfo.cpp | 28 +++---- sources/fsinfo.hpp | 11 ++- sources/header.cpp | 3 +- sources/request.cpp | 2 +- sources/request.hpp | 4 +- sources/urn.hpp | 2 +- 10 files changed, 132 insertions(+), 134 deletions(-) diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index f515307..967bd66 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -49,7 +49,7 @@ namespace WebDAV /// \date 3/16/2018 /// class Client - { + { public: /// @@ -251,7 +251,7 @@ namespace WebDAV callback_t callback = nullptr, progress_t progress = nullptr ) const -> void; - + private: auto sync_download( diff --git a/sources/callback.cpp b/sources/callback.cpp index 9b04f39..21d70ac 100644 --- a/sources/callback.cpp +++ b/sources/callback.cpp @@ -28,82 +28,82 @@ namespace WebDAV { - namespace Callback - { - namespace Read - { - size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) - { - auto in_stream = reinterpret_cast(stream); - auto read_bytes = static_cast(item_size * item_count); - auto position = static_cast(in_stream->tellg()); - in_stream->seekg(0, std::ios::end); - auto size = static_cast(in_stream->tellg()); - in_stream->seekg(position, std::ios::beg); - auto rest_bytes = size - position; - read_bytes = std::min(read_bytes, rest_bytes); - in_stream->read(ptr, read_bytes); - return read_bytes; - } - - size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) - { - auto data = (Data*)buffer; - auto size = static_cast(item_size * item_count); - auto rest_bytes = data->size - data->position; - auto copied_bytes = std::min(size, rest_bytes); - memcpy(ptr, data->buffer, copied_bytes); - data->position += copied_bytes; - return copied_bytes; - } - } // namespace Read - - namespace Write - { - size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) - { - auto out_stream = reinterpret_cast(stream); - size_t write_bytes = item_size * item_count; - out_stream->write(ptr, write_bytes); - return write_bytes; - } - - size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) - { - auto data = reinterpret_cast(buffer); - auto size = static_cast(item_size * item_count); - auto rest_bytes = data->size - data->position; - auto copied_bytes = std::min(size, rest_bytes); - memcpy(data->buffer, ptr, copied_bytes); - data->position += copied_bytes; - return copied_bytes; - } - } // namespace Write - - namespace Append - { - size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) - { - auto data = reinterpret_cast(buffer); - auto append_size = item_size * item_count; - auto new_buffer_size = data->size + append_size; - auto new_buffer = new char[new_buffer_size]; - if (data->size != 0) memcpy(new_buffer, data->buffer, data->size); - memcpy(new_buffer + data->size, ptr, append_size); - delete[] data->buffer; - data->buffer = new_buffer; - data->size = new_buffer_size; - return append_size; - } - - size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) - { - auto out_stream = reinterpret_cast(stream); - size_t write_bytes = item_size * item_count; - out_stream->seekp(0, std::ios::end); - out_stream->write(ptr, write_bytes); - return write_bytes; - } - } // namespace Append - } // namespace Callback + namespace Callback + { + namespace Read + { + size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) + { + auto in_stream = reinterpret_cast(stream); + auto read_bytes = static_cast(item_size * item_count); + auto position = static_cast(in_stream->tellg()); + in_stream->seekg(0, std::ios::end); + auto size = static_cast(in_stream->tellg()); + in_stream->seekg(position, std::ios::beg); + auto rest_bytes = size - position; + read_bytes = std::min(read_bytes, rest_bytes); + in_stream->read(ptr, read_bytes); + return read_bytes; + } + + size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) + { + auto data = (Data*)buffer; + auto size = static_cast(item_size * item_count); + auto rest_bytes = data->size - data->position; + auto copied_bytes = std::min(size, rest_bytes); + memcpy(ptr, data->buffer, copied_bytes); + data->position += copied_bytes; + return copied_bytes; + } + } // namespace Read + + namespace Write + { + size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) + { + auto out_stream = reinterpret_cast(stream); + size_t write_bytes = item_size * item_count; + out_stream->write(ptr, write_bytes); + return write_bytes; + } + + size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) + { + auto data = reinterpret_cast(buffer); + auto size = static_cast(item_size * item_count); + auto rest_bytes = data->size - data->position; + auto copied_bytes = std::min(size, rest_bytes); + memcpy(data->buffer, ptr, copied_bytes); + data->position += copied_bytes; + return copied_bytes; + } + } // namespace Write + + namespace Append + { + size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) + { + auto data = reinterpret_cast(buffer); + auto append_size = item_size * item_count; + auto new_buffer_size = data->size + append_size; + auto new_buffer = new char[new_buffer_size]; + if (data->size != 0) memcpy(new_buffer, data->buffer, data->size); + memcpy(new_buffer + data->size, ptr, append_size); + data->buffer = new_buffer; + delete[] data->buffer; + data->size = new_buffer_size; + return append_size; + } + + size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) + { + auto out_stream = reinterpret_cast(stream); + size_t write_bytes = item_size * item_count; + out_stream->seekp(0, std::ios::end); + out_stream->write(ptr, write_bytes); + return write_bytes; + } + } // namespace Append + } // namespace Callback } // namespace WebDAV diff --git a/sources/callback.hpp b/sources/callback.hpp index c3c7bee..77eac5c 100644 --- a/sources/callback.hpp +++ b/sources/callback.hpp @@ -25,11 +25,11 @@ namespace WebDAV { - struct Data - { - char * buffer; - unsigned long long position; - unsigned long long size; + struct Data + { + char * buffer; + unsigned long long position; + unsigned long long size; void reset() { buffer = nullptr; position = 0; @@ -38,28 +38,28 @@ namespace WebDAV ~Data() { delete[] buffer; } - }; - - namespace Callback - { - namespace Read - { - size_t stream(char * data, size_t size, size_t count, void * stream); - size_t buffer(char * data, size_t size, size_t count, void * buffer); - } - - namespace Write - { - size_t stream(char * data, size_t size, size_t count, void * stream); - size_t buffer(char * data, size_t size, size_t count, void * buffer); - } - - namespace Append - { - size_t stream(char * data, size_t size, size_t count, void * stream); - size_t buffer(char * data, size_t size, size_t count, void * buffer); - } - } + }; + + namespace Callback + { + namespace Read + { + size_t stream(char * data, size_t size, size_t count, void * stream); + size_t buffer(char * data, size_t size, size_t count, void * buffer); + } + + namespace Write + { + size_t stream(char * data, size_t size, size_t count, void * stream); + size_t buffer(char * data, size_t size, size_t count, void * buffer); + } + + namespace Append + { + size_t stream(char * data, size_t size, size_t count, void * stream); + size_t buffer(char * data, size_t size, size_t count, void * buffer); + } + } } // namespace WebDAV #endif diff --git a/sources/client.cpp b/sources/client.cpp index 47ee504..9a3d966 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -31,8 +31,8 @@ #include -#include #include +#include namespace WebDAV { diff --git a/sources/fsinfo.cpp b/sources/fsinfo.cpp index dd39b29..0f15205 100644 --- a/sources/fsinfo.cpp +++ b/sources/fsinfo.cpp @@ -25,18 +25,18 @@ namespace WebDAV { - namespace FileInfo - { - auto exists(const std::string& path) -> bool - { - std::ifstream file(path); - return file.good(); - } - - auto size(const std::string& path_file) -> unsigned long long - { - std::ifstream file(path_file, std::ios::binary | std::ios::ate); - return static_cast(file.tellg()); - } - } // namespace FileInfo + namespace FileInfo + { + auto exists(const std::string& path) -> bool + { + std::ifstream file(path); + return file.good(); + } + + auto size(const std::string& path_file) -> unsigned long long + { + std::ifstream file(path_file, std::ios::binary | std::ios::ate); + return static_cast(file.tellg()); + } + } // namespace FileInfo } // namespace WebDAV diff --git a/sources/fsinfo.hpp b/sources/fsinfo.hpp index 478227a..94b927b 100644 --- a/sources/fsinfo.hpp +++ b/sources/fsinfo.hpp @@ -28,12 +28,11 @@ namespace WebDAV { - namespace FileInfo - { - auto exists(const std::string& path) -> bool; - - auto size(const std::string& path_file) -> unsigned long long; - } // namespace FileInfo + namespace FileInfo + { + auto exists(const std::string& path) -> bool; + auto size(const std::string& path_file) -> unsigned long long; + } // namespace FileInfo } // namespace WebDAV #endif diff --git a/sources/header.cpp b/sources/header.cpp index 50e36af..3aa3347 100644 --- a/sources/header.cpp +++ b/sources/header.cpp @@ -42,7 +42,7 @@ namespace WebDAV Header::Header(Header&& other) noexcept { handle = other.handle; - other.handle = nullptr; + other.handle = nullptr; } auto Header::operator=(Header&& other) noexcept -> Header& @@ -59,7 +59,6 @@ namespace WebDAV using std::swap; swap(handle, other.handle); } - void Header::append(const std::string& item) noexcept diff --git a/sources/request.cpp b/sources/request.cpp index 69efe8f..c1bb34c 100644 --- a/sources/request.cpp +++ b/sources/request.cpp @@ -68,7 +68,7 @@ namespace WebDAV this->set(CURLOPT_SSLCERT, const_cast(cert_path.c_str())); this->set(CURLOPT_SSLKEY, const_cast(key_path.c_str())); } - + this->set(CURLOPT_URL, const_cast(webdav_hostname.c_str())); this->set(CURLOPT_HTTPAUTH, static_cast(CURLAUTH_BASIC)); auto token = webdav_username + ":" + webdav_password; diff --git a/sources/request.hpp b/sources/request.hpp index 2a312d9..e35094c 100644 --- a/sources/request.hpp +++ b/sources/request.hpp @@ -34,8 +34,8 @@ namespace WebDAV return code == CURLE_OK; } - using dict_t = std::map; - + using dict_t = std::map; + class Request { public: diff --git a/sources/urn.hpp b/sources/urn.hpp index defc0cc..f8b0945 100644 --- a/sources/urn.hpp +++ b/sources/urn.hpp @@ -29,7 +29,7 @@ namespace WebDAV { - namespace Urn + namespace Urn { using std::string; using std::nullptr_t; From 4eb7fb223c1a347aaa50cdf1f4768e8265415ee7 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 5 Jan 2019 08:14:30 +0000 Subject: [PATCH 129/133] updated copyright in tests --- tests/check.cpp | 8 ++++---- tests/clean.cpp | 8 ++++---- tests/download.cpp | 6 +++--- tests/fixture.cpp | 2 +- tests/fixture.hpp | 10 +++------- tests/list.cpp | 6 +++--- tests/main.cpp | 6 +++--- tests/upload.cpp | 6 +++--- 8 files changed, 24 insertions(+), 28 deletions(-) diff --git a/tests/check.cpp b/tests/check.cpp index ea7c27b..b1d3b36 100644 --- a/tests/check.cpp +++ b/tests/check.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -43,7 +43,7 @@ SCENARIO("Client must check an existing remote resources", "[check]") GIVEN("An existing remote resource") { std::string existing_file = filename; - std::string existing_directory = dirname; + std::string existing_directory = dirname; client->upload_from(existing_file, (char *)content.c_str(), content.length()); client->create_directory(existing_directory); diff --git a/tests/clean.cpp b/tests/clean.cpp index 8a57065..5e9e517 100644 --- a/tests/clean.cpp +++ b/tests/clean.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -166,7 +166,7 @@ SCENARIO("Client must clean a remote directory", "[clean]") GIVEN("An existing directory") { - std::string directory_name = dirname; + std::string directory_name = dirname; client->create_directory(directory_name); WHEN("Clean directory by a name") diff --git a/tests/download.cpp b/tests/download.cpp index 06db4b8..f02852f 100644 --- a/tests/download.cpp +++ b/tests/download.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 diff --git a/tests/fixture.cpp b/tests/fixture.cpp index f235085..9a907f3 100644 --- a/tests/fixture.cpp +++ b/tests/fixture.cpp @@ -6,7 +6,7 @@ # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which # you should have received as part of this distribution. diff --git a/tests/fixture.hpp b/tests/fixture.hpp index d41d044..d3666f8 100644 --- a/tests/fixture.hpp +++ b/tests/fixture.hpp @@ -6,7 +6,7 @@ # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which # you should have received as part of this distribution. @@ -27,13 +27,9 @@ using dict_t = std::map; namespace fixture { - auto get_file_content() -> std::string; - auto get_buff_content() -> std::string; - - auto get_file_name() -> std::string; - auto get_dir_name() -> std::string; - + auto get_file_content() -> std::string; + auto get_file_name() -> std::string; auto get_options() -> dict_t; } diff --git a/tests/list.cpp b/tests/list.cpp index 1f697e5..2e8d222 100644 --- a/tests/list.cpp +++ b/tests/list.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 diff --git a/tests/main.cpp b/tests/main.cpp index 0b9ea93..4985851 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 diff --git a/tests/upload.cpp b/tests/upload.cpp index d612241..22f0b48 100644 --- a/tests/upload.cpp +++ b/tests/upload.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # -# Copyright (C) 2016, The WDC Project, , et al. +# Copyright (C) 2018, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 From 494c6722d8e533853bc260e3aab76fdb6407bb47 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Sat, 5 Jan 2019 10:33:59 +0000 Subject: [PATCH 130/133] formatted with astyle util --- .astylerc | 19 +++ examples/cli/cli.cpp | 226 ++++++++++++++++++++--------------- examples/client/check.cpp | 17 +-- examples/client/copy.cpp | 15 +-- examples/client/download.cpp | 155 ++++++++++++------------ examples/client/info.cpp | 83 +++++++------ examples/client/init.cpp | 78 ++++++------ examples/client/list.cpp | 83 +++++++------ examples/client/mkdir.cpp | 49 ++++---- examples/client/move.cpp | 60 +++++----- examples/client/remove.cpp | 49 ++++---- examples/client/size.cpp | 25 ++-- examples/client/upload.cpp | 153 ++++++++++++------------ include/webdav/client.hpp | 22 ++-- sources/callback.cpp | 22 ++-- sources/callback.hpp | 32 ++--- sources/client.cpp | 190 ++++++++++++++++------------- sources/header.cpp | 61 +++++----- sources/header.hpp | 28 ++--- sources/request.cpp | 21 ++-- sources/request.hpp | 4 +- sources/urn.cpp | 17 +-- sources/urn.hpp | 2 +- tests/check.cpp | 5 +- tests/clean.cpp | 4 +- tests/download.cpp | 4 +- tests/fixture.cpp | 6 +- tests/list.cpp | 6 +- tests/upload.cpp | 5 +- 29 files changed, 781 insertions(+), 660 deletions(-) create mode 100644 .astylerc diff --git a/.astylerc b/.astylerc new file mode 100644 index 0000000..ded2a30 --- /dev/null +++ b/.astylerc @@ -0,0 +1,19 @@ +--convert-tabs # 4.2 +--indent=spaces=2 # 4.2 +--indent-namespaces +--style=break # 4.3.1 +--indent-cases # 4.3.2 +--pad-comma # 4.5.1 +--pad-header # 4.5.5 +--pad-oper # 4.5.6 +--align-pointer=type # 4.5.7 +--align-reference=type # 4.5.7 +--indent-col1-comments +--mode=c +# --indent-preproc-block +# --delete-empty-lines +# --remove-braces +# --attach-return-type +# --close-templates +# --max-code-length=80 +# --break-after-logical \ No newline at end of file diff --git a/examples/cli/cli.cpp b/examples/cli/cli.cpp index 5eec7f5..25ccc35 100644 --- a/examples/cli/cli.cpp +++ b/examples/cli/cli.cpp @@ -28,106 +28,142 @@ using dict_t = std::map; using strings_t = std::vector; -auto operator<<(std::ostream& out, const dict_t& dict) -> std::ostream& { - for(auto& item : dict) { - out << item.first << ": " << item.second << std::endl; - } - return out; +auto operator<<(std::ostream& out, const dict_t& dict) -> std::ostream& +{ + for (auto& item : dict) + { + out << item.first << ": " << item.second << std::endl; + } + return out; } -auto operator<<(std::ostream& out, const strings_t& dict) -> std::ostream& { - for(auto& item : dict) { - out << "- " << item << std::endl; - } - return out; +auto operator<<(std::ostream& out, const strings_t& dict) -> std::ostream& +{ + for (auto& item : dict) + { + out << "- " << item << std::endl; + } + return out; } -int main(int argc, char * argv[]) { - - try { - - auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); - auto username_ptr = std::getenv("WEBDAV_USERNAME"); - auto password_ptr = std::getenv("WEBDAV_PASSWORD"); - auto root_ptr = std::getenv("WEBDAV_ROOT"); - - if (hostname_ptr == nullptr) { - throw std::runtime_error("undefined WEBDAV_HOSTNAME environment variable"); - } - if (username_ptr == nullptr) { - throw std::runtime_error("undefined WEBDAV_USERNAME environment variable"); - } - if (password_ptr == nullptr) { - throw std::runtime_error("undefined WEBDAV_PASSWORD environment variable"); - } - - if (argc < 2) { - throw std::invalid_argument("command"); - } - - if (argc < 3) { - throw std::invalid_argument("resource"); - } - - std::string command = argv[1]; - std::string remote_resource = argv[2]; - - std::map options = { - {"webdav_hostname", hostname_ptr}, - {"webdav_username", username_ptr}, - {"webdav_password", password_ptr} - }; - - if (root_ptr != nullptr) { - options["webdav_root"] = root_ptr; - } - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - if (command == "check") { - bool is_existed = client->check(remote_resource); - std::cout << "Resource: " << remote_resource << " is " << (is_existed ? "" : "not ") << "existed" - << std::endl; - } else if (command == "copy") { - if (argc < 4) { - throw std::invalid_argument("to"); - } - std::string target_resource = argv[3]; - client->copy(remote_resource, target_resource); - } else if (command == "download") { - if (argc < 4) { - throw std::invalid_argument("to"); - } - std::string target_resource = argv[3]; - client->download(remote_resource, target_resource); - } else if (command == "info") { - auto info = client->info(remote_resource); - std::cout << info << std::endl; - } else if (command == "list") { - auto list = client->list(remote_resource); - std::cout << list << std::endl; - } else if (command == "mkdir") { - client->create_directory(remote_resource); - } else if (command == "move") { - if (argc < 4) { - throw std::invalid_argument("to"); - } - std::string target_resource = argv[3]; - client->move(remote_resource, target_resource); - } else if (command == "remove") { - client->clean(remote_resource); - } else if (command == "upload") { - if (argc < 4) { - throw std::invalid_argument("from"); - } - std::string target_resource = argv[3]; - client->upload(remote_resource, target_resource); - } +int main(int argc, char* argv[]) +{ + + try + { + + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); + + if (hostname_ptr == nullptr) + { + throw std::runtime_error("undefined WEBDAV_HOSTNAME environment variable"); + } + if (username_ptr == nullptr) + { + throw std::runtime_error("undefined WEBDAV_USERNAME environment variable"); + } + if (password_ptr == nullptr) + { + throw std::runtime_error("undefined WEBDAV_PASSWORD environment variable"); + } + + if (argc < 2) + { + throw std::invalid_argument("command"); + } + + if (argc < 3) + { + throw std::invalid_argument("resource"); + } + + std::string command = argv[1]; + std::string remote_resource = argv[2]; + + std::map options = + { + {"webdav_hostname", hostname_ptr}, + {"webdav_username", username_ptr}, + {"webdav_password", password_ptr} + }; + + if (root_ptr != nullptr) + { + options["webdav_root"] = root_ptr; + } + + std::unique_ptr client{ new WebDAV::Client{ options } }; + + if (command == "check") + { + bool is_existed = client->check(remote_resource); + std::cout << "Resource: " << remote_resource << " is " << (is_existed ? "" : "not ") << "existed" + << std::endl; + } + else if (command == "copy") + { + if (argc < 4) + { + throw std::invalid_argument("to"); + } + std::string target_resource = argv[3]; + client->copy(remote_resource, target_resource); + } + else if (command == "download") + { + if (argc < 4) + { + throw std::invalid_argument("to"); + } + std::string target_resource = argv[3]; + client->download(remote_resource, target_resource); + } + else if (command == "info") + { + auto info = client->info(remote_resource); + std::cout << info << std::endl; + } + else if (command == "list") + { + auto list = client->list(remote_resource); + std::cout << list << std::endl; + } + else if (command == "mkdir") + { + client->create_directory(remote_resource); + } + else if (command == "move") + { + if (argc < 4) + { + throw std::invalid_argument("to"); + } + std::string target_resource = argv[3]; + client->move(remote_resource, target_resource); } - catch (std::invalid_argument& error) { - std::cout << "use: []" << std::endl; + else if (command == "remove") + { + client->clean(remote_resource); } - catch (std::runtime_error& error) { - std::cout << error.what() << std::endl; + else if (command == "upload") + { + if (argc < 4) + { + throw std::invalid_argument("from"); + } + std::string target_resource = argv[3]; + client->upload(remote_resource, target_resource); } + } + catch (std::invalid_argument& error) + { + std::cout << "use: []" << std::endl; + } + catch (std::runtime_error& error) + { + std::cout << error.what() << std::endl; + } } diff --git a/examples/client/check.cpp b/examples/client/check.cpp index 57fc271..dcc316c 100644 --- a/examples/client/check.cpp +++ b/examples/client/check.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -45,13 +45,15 @@ int main() { "webdav_password", password_ptr } }; - if (root_ptr != nullptr) { - options["webdav_root"] = root_ptr; + if (root_ptr != nullptr) + { + options["webdav_root"] = root_ptr; } std::unique_ptr client{ new WebDAV::Client{ options } }; - auto remote_resources = { + auto remote_resources = + { "existing_file.dat", "not_existing_file.dat", "existing_directory", @@ -60,9 +62,10 @@ int main() "not_existing_directory/" }; - for (const auto& remote_resource : remote_resources) { + for (const auto& remote_resource : remote_resources) + { bool is_existed = client->check(remote_resource); - std::cout << "Resource: " << remote_resource + std::cout << "Resource: " << remote_resource << " is " << (is_existed ? "" : "not ") << "existed" << std::endl; } } diff --git a/examples/client/copy.cpp b/examples/client/copy.cpp index a4bcf73..99b4e4e 100644 --- a/examples/client/copy.cpp +++ b/examples/client/copy.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -50,13 +50,14 @@ int main() std::map options = { - { "webdav_hostname", hostname_ptr }, - { "webdav_username", username_ptr }, - { "webdav_password", password_ptr } + { "webdav_hostname", hostname_ptr }, + { "webdav_username", username_ptr }, + { "webdav_password", password_ptr } }; - if (root_ptr != nullptr) { - options["webdav_root"] = root_ptr; + if (root_ptr != nullptr) + { + options["webdav_root"] = root_ptr; } std::unique_ptr client{ new WebDAV::Client{ options } }; diff --git a/examples/client/download.cpp b/examples/client/download.cpp index ac9c3d5..cd32b72 100644 --- a/examples/client/download.cpp +++ b/examples/client/download.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -29,20 +29,20 @@ void download_to_file() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::string remote_file = "dir/file.dat"; - auto local_file = "/home/user/Downloads/file.dat"; - bool is_downloaded = client->download(remote_file, local_file); + std::string remote_file = "dir/file.dat"; + auto local_file = "/home/user/Downloads/file.dat"; + bool is_downloaded = client->download(remote_file, local_file); - std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; } /// dir/file.dat resource is downloaded @@ -53,22 +53,22 @@ void download_to_file() void async_download_to_file() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - std::string remote_file = "dir/file.dat"; - std::string local_file = "/home/user/Downloads/file.dat"; - - client->async_download(remote_file, local_file, [remote_file](bool is_downloaded) - { - std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; - }); + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; + + std::unique_ptr client{ new WebDAV::Client{ options } }; + + std::string remote_file = "dir/file.dat"; + std::string local_file = "/home/user/Downloads/file.dat"; + + client->async_download(remote_file, local_file, [remote_file](bool is_downloaded) + { + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; + }); } /// dir/file.dat resource is downloaded @@ -79,22 +79,22 @@ void async_download_to_file() void download_to_buffer() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::string remote_file = "dir/file.dat"; - char * buffer_ptr = nullptr; - unsigned long long buffer_size = 0; + std::string remote_file = "dir/file.dat"; + char* buffer_ptr = nullptr; + unsigned long long buffer_size = 0; - bool is_downloaded = client->download_to(remote_file, buffer_ptr, buffer_size); + bool is_downloaded = client->download_to(remote_file, buffer_ptr, buffer_size); - std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; } /// dir/file.dat resource is downloaded @@ -105,25 +105,25 @@ void download_to_buffer() void async_download_to_buffer() { - /* - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - std::string remote_file = "dir/file.dat"; - char * buffer_ptr = nullptr; - unsigned long long buffer_size = 0; - - client->async_download(remote_file, buffer_ptr, buffer_size, [remote_file](bool is_downloaded) - { - std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; - }); - */ + /* + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; + + std::unique_ptr client{ new WebDAV::Client{ options } }; + + std::string remote_file = "dir/file.dat"; + char * buffer_ptr = nullptr; + unsigned long long buffer_size = 0; + + client->async_download(remote_file, buffer_ptr, buffer_size, [remote_file](bool is_downloaded) + { + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; + }); + */ } /// dir/file.dat resource is downloaded @@ -134,31 +134,32 @@ void async_download_to_buffer() void download_from_stream() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::string remote_file = "dir/file.dat"; - std::ofstream stream("/home/user/Downloads/file.dat"); + std::string remote_file = "dir/file.dat"; + std::ofstream stream("/home/user/Downloads/file.dat"); - bool is_downloaded = client->download_to(remote_file, stream); + bool is_downloaded = client->download_to(remote_file, stream); - std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; + std::cout << remote_file << " resource is" << (is_downloaded ? "" : "not") << "downloaded" << std::endl; } /// dir/file.dat resource is downloaded //! [download_from_stream] -int main() { - download_to_file(); - download_to_buffer(); - async_download_to_file(); - async_download_to_buffer(); - download_from_stream(); +int main() +{ + download_to_file(); + download_to_buffer(); + async_download_to_file(); + async_download_to_buffer(); + download_from_stream(); } diff --git a/examples/client/info.cpp b/examples/client/info.cpp index 03f0b99..5e79832 100644 --- a/examples/client/info.cpp +++ b/examples/client/info.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -25,53 +25,58 @@ #include #include -std::string info_to_string(std::map & info) { +std::string info_to_string(std::map& info) +{ - std::stringstream stream; - for (const auto& option : info){ - stream << "/t" << option.first << ": " << option.second << std::endl; - } - return stream.str(); + std::stringstream stream; + for (const auto& option : info) + { + stream << "/t" << option.first << ": " << option.second << std::endl; + } + return stream.str(); } -int main() { +int main() +{ - auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); - auto username_ptr = std::getenv("WEBDAV_USERNAME"); - auto password_ptr = std::getenv("WEBDAV_PASSWORD"); - auto root_ptr = std::getenv("WEBDAV_ROOT"); + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); - if (hostname_ptr == nullptr) return -1; - if (username_ptr == nullptr) return -1; - if (password_ptr == nullptr) return -1; + if (hostname_ptr == nullptr) return -1; + if (username_ptr == nullptr) return -1; + if (password_ptr == nullptr) return -1; - std::map options = - { - { "webdav_hostname", hostname_ptr }, - { "webdav_username", username_ptr }, - { "webdav_password", password_ptr } - }; + std::map options = + { + { "webdav_hostname", hostname_ptr }, + { "webdav_username", username_ptr }, + { "webdav_password", password_ptr } + }; - if (root_ptr != nullptr) { - options["webdav_root"] = root_ptr; - } + if (root_ptr != nullptr) + { + options["webdav_root"] = root_ptr; + } - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto remote_resources = { - "existing_file.dat", - "not_existing_file.dat", - "existing_directory", - "not_existing_directory" - }; + auto remote_resources = + { + "existing_file.dat", + "not_existing_file.dat", + "existing_directory", + "not_existing_directory" + }; - for (const auto& remote_resource : remote_resources) - { - auto info = client->info(remote_resource); - std::cout << "Information about " << remote_resource << ":" << std::endl; - std::cout << info_to_string(info); - std::cout << std::endl; - } + for (const auto& remote_resource : remote_resources) + { + auto info = client->info(remote_resource); + std::cout << "Information about " << remote_resource << ":" << std::endl; + std::cout << info_to_string(info); + std::cout << std::endl; + } } ///Information about existing_file: diff --git a/examples/client/init.cpp b/examples/client/init.cpp index 93f913b..9615cab 100644 --- a/examples/client/init.cpp +++ b/examples/client/init.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -27,55 +27,59 @@ std::map base_options = { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } + { "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}" } + { "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" } + { "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(); +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() { +int main() +{ - auto various_options = { - base_options, - options_with_proxy, - options_with_cert - }; + 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; - std::cout << options_to_string(options); - std::cout << " is " << (is_connected ? " " : "not ") << "connected" << std::endl; - std::cout << std::endl; - } + 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; + std::cout << options_to_string(options); + std::cout << " is " << (is_connected ? " " : "not ") << "connected" << std::endl; + std::cout << std::endl; + } } /// Client with options: diff --git a/examples/client/list.cpp b/examples/client/list.cpp index fa2605c..7719075 100644 --- a/examples/client/list.cpp +++ b/examples/client/list.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -25,53 +25,58 @@ #include #include -std::string resources_to_string(std::vector & resources) +std::string resources_to_string(std::vector& resources) { - std::stringstream ss; - for (const auto& resource : resources){ - ss << "\t" << "- " << resource << std::endl; - } - return ss.str(); + std::stringstream ss; + for (const auto& resource : resources) + { + ss << "\t" << "- " << resource << std::endl; + } + return ss.str(); } -int main() { +int main() +{ - auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); - auto username_ptr = std::getenv("WEBDAV_USERNAME"); - auto password_ptr = std::getenv("WEBDAV_PASSWORD"); - auto root_ptr = std::getenv("WEBDAV_ROOT"); + auto hostname_ptr = std::getenv("WEBDAV_HOSTNAME"); + auto username_ptr = std::getenv("WEBDAV_USERNAME"); + auto password_ptr = std::getenv("WEBDAV_PASSWORD"); + auto root_ptr = std::getenv("WEBDAV_ROOT"); - if (hostname_ptr == nullptr) return -1; - if (username_ptr == nullptr) return -1; - if (password_ptr == nullptr) return -1; + if (hostname_ptr == nullptr) return -1; + if (username_ptr == nullptr) return -1; + if (password_ptr == nullptr) return -1; - std::map options = - { - { "webdav_hostname", hostname_ptr }, - { "webdav_username", username_ptr }, - { "webdav_password", password_ptr } - }; + std::map options = + { + { "webdav_hostname", hostname_ptr }, + { "webdav_username", username_ptr }, + { "webdav_password", password_ptr } + }; - if (root_ptr != nullptr) { - options["webdav_root"] = root_ptr; - } + if (root_ptr != nullptr) + { + options["webdav_root"] = root_ptr; + } - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto remote_resources = { - "/", - "existing_file.dat", - "not_existing_file.dat", - "existing_directory", - "not_existing_directory" - }; + auto remote_resources = + { + "/", + "existing_file.dat", + "not_existing_file.dat", + "existing_directory", + "not_existing_directory" + }; - for (const auto& remote_resource : remote_resources) { - auto resources = client->list(remote_resource); - std::cout << remote_resource << " resource contain:" << std::endl; - std::cout << resources_to_string(resources); - std::cout << std::endl; - } + for (const auto& remote_resource : remote_resources) + { + auto resources = client->list(remote_resource); + std::cout << remote_resource << " resource contain:" << std::endl; + std::cout << resources_to_string(resources); + std::cout << std::endl; + } } /// existing_file.dat resource contain: diff --git a/examples/client/mkdir.cpp b/examples/client/mkdir.cpp index 1f32290..a0396c7 100644 --- a/examples/client/mkdir.cpp +++ b/examples/client/mkdir.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -24,32 +24,35 @@ #include -int main() { +int main() +{ - std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; + std::map options = + { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto remote_directories = { - "existing_directory", - "existing_directory/new_directory", - "not_existing_directory/new_directory", - }; + auto remote_directories = + { + "existing_directory", + "existing_directory/new_directory", + "not_existing_directory/new_directory", + }; - for (const auto& remote_directory : remote_directories) { - bool is_created = client->create_directory(remote_directory); - std::cout << "Directory: " << remote_directory << " is " << (is_created ? "" : "not ") << "created" << std::endl; - } - - auto remote_directory = "not_existing_directory/new_directory"; - bool recursive = true; - bool is_created = client->create_directory("not_existing_directory/new_directory", recursive); + for (const auto& remote_directory : remote_directories) + { + bool is_created = client->create_directory(remote_directory); std::cout << "Directory: " << remote_directory << " is " << (is_created ? "" : "not ") << "created" << std::endl; + } + + auto remote_directory = "not_existing_directory/new_directory"; + bool recursive = true; + bool is_created = client->create_directory("not_existing_directory/new_directory", recursive); + std::cout << "Directory: " << remote_directory << " is " << (is_created ? "" : "not ") << "created" << std::endl; } /// Directory: existing_directory is created diff --git a/examples/client/move.cpp b/examples/client/move.cpp index 5007366..d72f09a 100644 --- a/examples/client/move.cpp +++ b/examples/client/move.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -25,41 +25,43 @@ #include #include -std::string resources_to_string(const std::vector & resources) { - std::stringstream stream; - for (const auto& resource : resources) - { - stream << "\t" << "- " << resource << std::endl; - } - return stream.str(); +std::string resources_to_string(const std::vector& resources) +{ + std::stringstream stream; + for (const auto& resource : resources) + { + stream << "\t" << "- " << resource << std::endl; + } + return stream.str(); } -int main() { +int main() +{ - std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; + std::map options = + { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto remote_file = "file.dat"; - auto remote_directory = "dir/"; - auto new_remote_file = "file2.dat"; - auto new_remote_directory = "dir2/"; + auto remote_file = "file.dat"; + auto remote_directory = "dir/"; + auto new_remote_file = "file2.dat"; + auto new_remote_directory = "dir2/"; - auto resources = client->list(); - std::cout << "\"/\" resource contain:" << std::endl; - std::cout << resources_to_string(resources) << std::endl; + auto resources = client->list(); + std::cout << "\"/\" resource contain:" << std::endl; + std::cout << resources_to_string(resources) << std::endl; - client->move(remote_file, new_remote_file); - client->move(remote_directory, new_remote_directory); + client->move(remote_file, new_remote_file); + client->move(remote_directory, new_remote_directory); - resources = client->list(); - std::cout << "\"/\" resource contain:" << std::endl; - std::cout << resources_to_string(resources) << std::endl; + resources = client->list(); + std::cout << "\"/\" resource contain:" << std::endl; + std::cout << resources_to_string(resources) << std::endl; } /// "/" resource contain: diff --git a/examples/client/remove.cpp b/examples/client/remove.cpp index 66057e1..78aa6cb 100644 --- a/examples/client/remove.cpp +++ b/examples/client/remove.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -24,32 +24,35 @@ #include -int main() { +int main() +{ - std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; + std::map options = + { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - bool is_connected = client->check(); + bool is_connected = client->check(); - auto remote_resources = { - "existing_file.dat", - "not_existing_file.dat", - "existing_directory", - "existing_directory/", - "not_existing_directory", - "not_existing_directory/" - }; + auto remote_resources = + { + "existing_file.dat", + "not_existing_file.dat", + "existing_directory", + "existing_directory/", + "not_existing_directory", + "not_existing_directory/" + }; - for (const auto& remote_resource : remote_resources) { - bool is_clean = client->clean(remote_resource); - std::cout << "Resource: " << remote_resource << " is " << (is_clean ? "" : "not ") << "clean" << std::endl; - } + for (const auto& remote_resource : remote_resources) + { + bool is_clean = client->clean(remote_resource); + std::cout << "Resource: " << remote_resource << " is " << (is_clean ? "" : "not ") << "clean" << std::endl; + } } /// Resource: existing_file.dat is clean diff --git a/examples/client/size.cpp b/examples/client/size.cpp index 3e704b6..69f0b2a 100644 --- a/examples/client/size.cpp +++ b/examples/client/size.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -24,19 +24,20 @@ #include -int main() { +int main() +{ - std::map options = - { - { "webdav_hostname", "https://webdav.yandex.ru" }, - { "webdav_username", "{webdav_username}" }, - { "webdav_password", "{webdav_password}" } - }; + std::map options = + { + { "webdav_hostname", "https://webdav.yandex.ru" }, + { "webdav_username", "{webdav_username}" }, + { "webdav_password", "{webdav_password}" } + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - auto free_size = client->free_size(); - std::cout << "Free size: " << free_size << " bytes" << std::endl; + auto free_size = client->free_size(); + std::cout << "Free size: " << free_size << " bytes" << std::endl; } /// Free size: 8234213123 bytes diff --git a/examples/client/upload.cpp b/examples/client/upload.cpp index d46be61..0ae6284 100644 --- a/examples/client/upload.cpp +++ b/examples/client/upload.cpp @@ -2,14 +2,14 @@ # __ __ _____ _____ # Project | | | | | \ / ___| # | |__| | | |\ \ / / -# | | | | ) ) ( ( +# | | | | ) ) ( ( # | /\ | | |/ / \ \___ # \_/ \_/ |_____/ \_____| # # Copyright (C) 2016, The WDC Project, , et al. # # This software is licensed as described in the file LICENSE, which -# you should have received as part of this distribution. +# you should have received as part of this distribution. # # 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 @@ -29,21 +29,21 @@ void upload_from_file() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::string remote_file = "dir/file.dat"; - std::string local_file = "/home/user/Downloads/file.dat"; + std::string remote_file = "dir/file.dat"; + std::string local_file = "/home/user/Downloads/file.dat"; - bool is_uploaded = client->upload(remote_file, local_file); + bool is_uploaded = client->upload(remote_file, local_file); - std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; } /// dir/file.dat resource is uploaded @@ -54,22 +54,22 @@ void upload_from_file() void async_upload_from_file() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - std::string remote_file = "dir/file.dat"; - std::string local_file = "/home/user/Downloads/file.dat"; - - client->async_upload(remote_file, local_file, [remote_file](bool is_uploaded) - { - std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; - }); + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; + + std::unique_ptr client{ new WebDAV::Client{ options } }; + + std::string remote_file = "dir/file.dat"; + std::string local_file = "/home/user/Downloads/file.dat"; + + client->async_upload(remote_file, local_file, [remote_file](bool is_uploaded) + { + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; + }); } /// dir/file.dat resource is uploaded @@ -80,22 +80,22 @@ void async_upload_from_file() void upload_from_buffer() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::string remote_file = "dir/file.dat"; - char * buffer_ptr = nullptr; - unsigned long long buffer_size = 0; + std::string remote_file = "dir/file.dat"; + char* buffer_ptr = nullptr; + unsigned long long buffer_size = 0; - bool is_uploaded = client->upload_from(remote_file, buffer_ptr, buffer_size); + bool is_uploaded = client->upload_from(remote_file, buffer_ptr, buffer_size); - std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; } /// dir/file.dat resource is uploaded @@ -106,24 +106,24 @@ void upload_from_buffer() void async_upload_from_buffer() { - /*std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; - - std::unique_ptr client{ new WebDAV::Client{ options } }; - - std::string remote_file = "dir/file.dat"; - char * buffer_ptr = nullptr; - unsigned long long buffer_size = 0; - - client->async_upload(remote_file, buffer_ptr, buffer_size, [remote_file](bool is_uploaded) - { - std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; - }); - */ + /*std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; + + std::unique_ptr client{ new WebDAV::Client{ options } }; + + std::string remote_file = "dir/file.dat"; + char * buffer_ptr = nullptr; + unsigned long long buffer_size = 0; + + client->async_upload(remote_file, buffer_ptr, buffer_size, [remote_file](bool is_uploaded) + { + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; + }); + */ } /// dir/file.dat resource is uploaded @@ -134,31 +134,32 @@ void async_upload_from_buffer() void upload_from_stream() { - std::map options = - { - {"webdav_hostname", "https://webdav.yandex.ru"}, - {"webdav_username", "{webdav_username}"}, - {"webdav_password", "{webdav_password}"} - }; + std::map options = + { + {"webdav_hostname", "https://webdav.yandex.ru"}, + {"webdav_username", "{webdav_username}"}, + {"webdav_password", "{webdav_password}"} + }; - std::unique_ptr client{ new WebDAV::Client{ options } }; + std::unique_ptr client{ new WebDAV::Client{ options } }; - std::string remote_file = "dir/file.dat"; - std::ifstream stream("/home/user/Downloads/file.dat"); + std::string remote_file = "dir/file.dat"; + std::ifstream stream("/home/user/Downloads/file.dat"); - bool is_uploaded = client->upload_from(remote_file, stream); + bool is_uploaded = client->upload_from(remote_file, stream); - std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; + std::cout << remote_file << " resource is" << (is_uploaded ? "" : "not") << "uploaded" << std::endl; } /// dir/file.dat resource is uploaded //! [upload_from_stream] -int main() { - upload_from_file(); - upload_from_buffer(); - upload_from_stream(); - async_upload_from_file(); - async_upload_from_buffer(); +int main() +{ + upload_from_file(); + upload_from_buffer(); + upload_from_stream(); + async_upload_from_file(); + async_upload_from_buffer(); } diff --git a/include/webdav/client.hpp b/include/webdav/client.hpp index 967bd66..51efd1d 100644 --- a/include/webdav/client.hpp +++ b/include/webdav/client.hpp @@ -31,11 +31,11 @@ namespace WebDAV { - using progress_t = std::function ; + using progress_t = std::function ; using callback_t = std::function ; @@ -163,8 +163,8 @@ namespace WebDAV /// auto download_to( const std::string& remote_file, - char * & buffer_ptr, - unsigned long long & buffer_size, + char*& buffer_ptr, + unsigned long long& buffer_size, progress_t progress = nullptr ) const -> bool; @@ -219,7 +219,7 @@ namespace WebDAV /// auto upload_from( const std::string& remote_file, - char * buffer_ptr, + char* buffer_ptr, unsigned long long buffer_size, progress_t progress = nullptr ) const -> bool; @@ -263,8 +263,8 @@ namespace WebDAV auto sync_download_to( const std::string& remote_file, - char * & buffer_ptr, - unsigned long long & buffer_size, + char*& buffer_ptr, + unsigned long long& buffer_size, callback_t callback = nullptr, progress_t progress = nullptr ) const -> bool; @@ -285,7 +285,7 @@ namespace WebDAV auto sync_upload_from( const std::string& remote_file, - char * buffer_ptr, + char* buffer_ptr, unsigned long long buffer_size, callback_t callback = nullptr, progress_t progress = nullptr diff --git a/sources/callback.cpp b/sources/callback.cpp index 21d70ac..8c55868 100644 --- a/sources/callback.cpp +++ b/sources/callback.cpp @@ -32,9 +32,9 @@ namespace WebDAV { namespace Read { - size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) + size_t stream(char* ptr, size_t item_size, size_t item_count, void* stream) { - auto in_stream = reinterpret_cast(stream); + auto in_stream = reinterpret_cast(stream); auto read_bytes = static_cast(item_size * item_count); auto position = static_cast(in_stream->tellg()); in_stream->seekg(0, std::ios::end); @@ -46,7 +46,7 @@ namespace WebDAV return read_bytes; } - size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) + size_t buffer(char* ptr, size_t item_size, size_t item_count, void* buffer) { auto data = (Data*)buffer; auto size = static_cast(item_size * item_count); @@ -60,17 +60,17 @@ namespace WebDAV namespace Write { - size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) + size_t stream(char* ptr, size_t item_size, size_t item_count, void* stream) { - auto out_stream = reinterpret_cast(stream); + auto out_stream = reinterpret_cast(stream); size_t write_bytes = item_size * item_count; out_stream->write(ptr, write_bytes); return write_bytes; } - size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) + size_t buffer(char* ptr, size_t item_size, size_t item_count, void* buffer) { - auto data = reinterpret_cast(buffer); + auto data = reinterpret_cast(buffer); auto size = static_cast(item_size * item_count); auto rest_bytes = data->size - data->position; auto copied_bytes = std::min(size, rest_bytes); @@ -82,9 +82,9 @@ namespace WebDAV namespace Append { - size_t buffer(char * ptr, size_t item_size, size_t item_count, void * buffer) + size_t buffer(char* ptr, size_t item_size, size_t item_count, void* buffer) { - auto data = reinterpret_cast(buffer); + auto data = reinterpret_cast(buffer); auto append_size = item_size * item_count; auto new_buffer_size = data->size + append_size; auto new_buffer = new char[new_buffer_size]; @@ -96,9 +96,9 @@ namespace WebDAV return append_size; } - size_t stream(char * ptr, size_t item_size, size_t item_count, void * stream) + size_t stream(char* ptr, size_t item_size, size_t item_count, void* stream) { - auto out_stream = reinterpret_cast(stream); + auto out_stream = reinterpret_cast(stream); size_t write_bytes = item_size * item_count; out_stream->seekp(0, std::ios::end); out_stream->write(ptr, write_bytes); diff --git a/sources/callback.hpp b/sources/callback.hpp index 77eac5c..c5c700d 100644 --- a/sources/callback.hpp +++ b/sources/callback.hpp @@ -27,37 +27,39 @@ namespace WebDAV { struct Data { - char * buffer; + char* buffer; unsigned long long position; unsigned long long size; - void reset() { - buffer = nullptr; - position = 0; - size = 0; - } - ~Data() { - delete[] buffer; - } + void reset() + { + buffer = nullptr; + position = 0; + size = 0; + } + ~Data() + { + delete[] buffer; + } }; namespace Callback { namespace Read { - size_t stream(char * data, size_t size, size_t count, void * stream); - size_t buffer(char * data, size_t size, size_t count, void * buffer); + size_t stream(char* data, size_t size, size_t count, void* stream); + size_t buffer(char* data, size_t size, size_t count, void* buffer); } namespace Write { - size_t stream(char * data, size_t size, size_t count, void * stream); - size_t buffer(char * data, size_t size, size_t count, void * buffer); + size_t stream(char* data, size_t size, size_t count, void* stream); + size_t buffer(char* data, size_t size, size_t count, void* buffer); } namespace Append { - size_t stream(char * data, size_t size, size_t count, void * stream); - size_t buffer(char * data, size_t size, size_t count, void * buffer); + size_t stream(char* data, size_t size, size_t count, void* stream); + size_t buffer(char* data, size_t size, size_t count, void* buffer); } } } // namespace WebDAV diff --git a/sources/client.cpp b/sources/client.cpp index 9a3d966..9f2e7b2 100644 --- a/sources/client.cpp +++ b/sources/client.cpp @@ -43,26 +43,26 @@ namespace WebDAV else return it->second; } - using Urn::Path; + using Urn::Path; - using progress_funptr = int(*)(void *context, size_t dltotal, size_t dlnow, size_t ultotal, size_t ulnow); + using progress_funptr = int(*)(void* context, size_t dltotal, size_t dlnow, size_t ultotal, size_t ulnow); - dict_t - Client::options() const + dict_t + Client::options() const + { + return dict_t { - return dict_t - { - { "webdav_hostname", this->webdav_hostname }, - { "webdav_root", this->webdav_root }, - { "webdav_username", this->webdav_username }, - { "webdav_password", this->webdav_password }, - { "proxy_hostname", this->proxy_hostname }, - { "proxy_username", this->proxy_username }, - { "proxy_password", this->proxy_password }, - { "cert_path", this->cert_path }, - { "key_path", this->key_path }, - }; - } + { "webdav_hostname", this->webdav_hostname }, + { "webdav_root", this->webdav_root }, + { "webdav_username", this->webdav_username }, + { "webdav_password", this->webdav_password }, + { "proxy_hostname", this->proxy_hostname }, + { "proxy_username", this->proxy_username }, + { "proxy_password", this->proxy_password }, + { "cert_path", this->cert_path }, + { "key_path", this->key_path }, + }; + } bool Client::sync_download( @@ -92,7 +92,8 @@ namespace WebDAV #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { + if (progress != nullptr) + { request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -106,8 +107,8 @@ namespace WebDAV bool Client::sync_download_to( const std::string& remote_file, - char * & buffer_ptr, - unsigned long long & buffer_size, + char*& buffer_ptr, + unsigned long long& buffer_size, callback_t callback, progress_t progress ) const @@ -132,7 +133,8 @@ namespace WebDAV #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { + if (progress != nullptr) + { request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -150,7 +152,7 @@ namespace WebDAV bool Client::sync_download_to( const std::string& remote_file, - std::ostream & stream, + std::ostream& stream, callback_t callback, progress_t progress ) const @@ -173,7 +175,8 @@ namespace WebDAV #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { + if (progress != nullptr) + { request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -218,7 +221,8 @@ namespace WebDAV #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { + if (progress != nullptr) + { request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -232,7 +236,7 @@ namespace WebDAV bool Client::sync_upload_from( const std::string& remote_file, - char * buffer_ptr, + char* buffer_ptr, unsigned long long buffer_size, callback_t callback, progress_t progress @@ -260,7 +264,8 @@ namespace WebDAV #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { + if (progress != nullptr) + { request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -275,10 +280,10 @@ namespace WebDAV bool Client::sync_upload_from( - const std::string& remote_file, - std::istream& stream, - callback_t callback, - progress_t progress + const std::string& remote_file, + std::istream& stream, + callback_t callback, + progress_t progress ) const { auto root_urn = Path(this->webdav_root, true); @@ -304,7 +309,8 @@ namespace WebDAV #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif - if (progress != nullptr) { + if (progress != nullptr) + { request.set(CURLOPT_XFERINFOFUNCTION, reinterpret_cast(progress.target())); request.set(CURLOPT_NOPROGRESS, 0L); } @@ -333,7 +339,8 @@ namespace WebDAV unsigned long long Client::free_size() const { - Header header = { + Header header = + { "Accept: */*", "Depth: 0", "Content-Type: text/xml" @@ -355,7 +362,7 @@ namespace WebDAV Request request(this->options()); request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); request.set(CURLOPT_POSTFIELDS, document_print.c_str()); request.set(CURLOPT_POSTFIELDSIZE, static_cast(size)); request.set(CURLOPT_HEADER, 0); @@ -386,7 +393,8 @@ namespace WebDAV auto root_urn = Path(this->webdav_root, true); auto resource_urn = root_urn + remote_resource; - Header header = { + Header header = + { "Accept: */*", "Depth: 1" }; @@ -399,7 +407,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE @@ -415,7 +423,8 @@ namespace WebDAV auto root_urn = Path(this->webdav_root, true); auto target_urn = root_urn + remote_resource; - Header header = { + Header header = + { "Accept: */*", "Depth: 1" }; @@ -428,7 +437,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); #ifdef WDC_VERBOSE @@ -453,9 +462,10 @@ namespace WebDAV auto target_path = target_urn.path(); auto target_path_without_sep = target_urn.path(); if (!target_path_without_sep.empty() && target_path_without_sep.back() == '/') - target_path_without_sep.resize(target_path_without_sep.length() - 1); + target_path_without_sep.resize(target_path_without_sep.length() - 1); auto resource_path_without_sep = std::string(resource_path, 0, resource_path.rfind('/') + 1); - if (resource_path_without_sep == target_path_without_sep) { + if (resource_path_without_sep == target_path_without_sep) + { auto propstat = response.node().select_node("*[local-name()='propstat']").node(); auto prop = propstat.select_node("*[local-name()='prop']").node(); auto creation_date = prop.select_node("*[local-name()='creationdate']").node(); @@ -464,7 +474,8 @@ namespace WebDAV auto modified_date = prop.select_node("*[local-name()='getlastmodified']").node(); auto resource_type = prop.select_node("*[local-name()='resourcetype']").node(); - dict_t information = { + dict_t information = + { { "created", creation_date.first_child().value() }, { "name", display_name.first_child().value() }, { "size", content_length.first_child().value() }, @@ -497,7 +508,8 @@ namespace WebDAV auto target_urn = Path(this->webdav_root, true) + remote_directory; target_urn = Path(target_urn.path(), true); - Header header = { + Header header = + { "Accept: */*", "Depth: 1" }; @@ -510,7 +522,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "PROPFIND"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); request.set(CURLOPT_HEADER, 0); request.set(CURLOPT_WRITEDATA, reinterpret_cast(&data)); request.set(CURLOPT_WRITEFUNCTION, reinterpret_cast(Callback::Append::buffer)); @@ -535,7 +547,7 @@ namespace WebDAV std::string resource_path = curl_unescape(encode_file_name.c_str(), static_cast(encode_file_name.length())); auto target_path = target_urn.path(); Path resource_urn(resource_path); - if (resource_urn == target_urn) continue; + if (resource_urn == target_urn) continue; resources.push_back(resource_urn.name()); } @@ -552,40 +564,43 @@ namespace WebDAV } void - Client::async_download( - const std::string& remote_file, - const std::string& local_file, - callback_t callback, - progress_t progress - ) const + Client::async_download( + const std::string& remote_file, + const std::string& local_file, + callback_t callback, + progress_t progress + ) const { - std::thread downloading([=]() { this->sync_download(remote_file, local_file, callback, std::move(progress)); }); + std::thread downloading([ = ]() + { + this->sync_download(remote_file, local_file, callback, std::move(progress)); + }); downloading.detach(); } bool - Client::download_to( - const std::string& remote_file, - char * & buffer_ptr, - unsigned long long & buffer_size, - progress_t progress - ) const + Client::download_to( + const std::string& remote_file, + char*& buffer_ptr, + unsigned long long& buffer_size, + progress_t progress + ) const { return this->sync_download_to(remote_file, buffer_ptr, buffer_size, nullptr, std::move(progress)); } bool - Client::download_to( - const std::string& remote_file, - std::ostream& stream, - progress_t progress - ) const + Client::download_to( + const std::string& remote_file, + std::ostream& stream, + progress_t progress + ) const { return this->sync_download_to(remote_file, stream, nullptr, std::move(progress)); } bool - Client::create_directory(const std::string& remote_directory, bool recursive) const + Client::create_directory(const std::string& remote_directory, bool recursive) const { bool is_existed = this->check(remote_directory); if (is_existed) return true; @@ -593,14 +608,16 @@ namespace WebDAV bool resource_is_dir = true; Path directory_urn(remote_directory, resource_is_dir); - if (recursive) { + if (recursive) + { auto remote_parent_directory = directory_urn.parent().path(); if (remote_parent_directory == remote_directory) return false; bool is_created = this->create_directory(remote_parent_directory, true); if (!is_created) return false; } - Header header = { + Header header = + { "Accept: */*", "Connection: Keep-Alive" }; @@ -614,7 +631,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "MKCOL"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -623,7 +640,7 @@ namespace WebDAV } bool - Client::move(const std::string& remote_source_resource, const std::string& remote_destination_resource) const + Client::move(const std::string& remote_source_resource, const std::string& remote_destination_resource) const { bool is_existed = this->check(remote_source_resource); if (!is_existed) return false; @@ -633,7 +650,8 @@ namespace WebDAV auto source_resource_urn = root_urn + remote_source_resource; auto destination_resource_urn = root_urn + remote_destination_resource; - Header header = { + Header header = + { "Accept: */*", "Destination: " + destination_resource_urn.path() }; @@ -644,7 +662,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "MOVE"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -653,7 +671,7 @@ namespace WebDAV } bool - Client::copy(const std::string& remote_source_resource, const std::string& remote_destination_resource) const + Client::copy(const std::string& remote_source_resource, const std::string& remote_destination_resource) const { bool is_existed = this->check(remote_source_resource); if (!is_existed) return false; @@ -663,7 +681,8 @@ namespace WebDAV auto source_resource_urn = root_urn + remote_source_resource; auto destination_resource_urn = root_urn + remote_destination_resource; - Header header = { + Header header = + { "Accept: */*", "Destination: " + destination_resource_urn.path() }; @@ -674,7 +693,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "COPY"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -700,7 +719,10 @@ namespace WebDAV progress_t progress ) const { - std::thread uploading([=]() { this->sync_upload(remote_file, local_file, callback, std::move(progress)); }); + std::thread uploading([ = ]() + { + this->sync_upload(remote_file, local_file, callback, std::move(progress)); + }); uploading.detach(); } @@ -717,7 +739,7 @@ namespace WebDAV bool Client::upload_from( const std::string& remote_file, - char * buffer_ptr, + char* buffer_ptr, unsigned long long buffer_size, progress_t progress ) const @@ -734,7 +756,8 @@ namespace WebDAV auto root_urn = Path(this->webdav_root, true); auto resource_urn = root_urn + remote_resource; - Header header = { + Header header = + { "Accept: */*", "Connection: Keep-Alive" }; @@ -745,7 +768,7 @@ namespace WebDAV request.set(CURLOPT_CUSTOMREQUEST, "DELETE"); request.set(CURLOPT_URL, url.c_str()); - request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); + request.set(CURLOPT_HTTPHEADER, reinterpret_cast(header.handle)); #ifdef WDC_VERBOSE request.set(CURLOPT_VERBOSE, 1); #endif @@ -753,14 +776,17 @@ namespace WebDAV return request.perform(); } - class Environment { + class Environment + { public: - Environment() { - curl_global_init(CURL_GLOBAL_ALL); - } - ~Environment() { - curl_global_cleanup(); - } + Environment() + { + curl_global_init(CURL_GLOBAL_ALL); + } + ~Environment() + { + curl_global_cleanup(); + } }; } // namespace WebDAV diff --git a/sources/header.cpp b/sources/header.cpp index 3aa3347..fef6fdf 100644 --- a/sources/header.cpp +++ b/sources/header.cpp @@ -26,43 +26,44 @@ namespace WebDAV { - Header::Header(const std::initializer_list& init_list) noexcept : handle(nullptr) + Header::Header(const std::initializer_list& init_list) noexcept : handle(nullptr) + { + for (auto& item : init_list) { - for (auto& item : init_list) - { - this->append(item); - } + this->append(item); } + } - Header::~Header() noexcept - { - curl_slist_free_all(reinterpret_cast(this->handle)); - } + Header::~Header() noexcept + { + curl_slist_free_all(reinterpret_cast(this->handle)); + } - Header::Header(Header&& other) noexcept - { - handle = other.handle; - other.handle = nullptr; - } + Header::Header(Header&& other) noexcept + { + handle = other.handle; + other.handle = nullptr; + } - auto Header::operator=(Header&& other) noexcept -> Header& + auto Header::operator=(Header&& other) noexcept -> Header& + { + if (this != &other) { - if (this != &other) { - Header(std::move(other)).swap(*this); - } - - return *this; + Header(std::move(other)).swap(*this); } - auto Header::swap(Header& other) noexcept -> void - { - using std::swap; - swap(handle, other.handle); - } + return *this; + } - void - Header::append(const std::string& item) noexcept - { - this->handle = curl_slist_append(reinterpret_cast(this->handle), item.c_str()); - } + auto Header::swap(Header& other) noexcept -> void + { + using std::swap; + swap(handle, other.handle); + } + + void + Header::append(const std::string& item) noexcept + { + this->handle = curl_slist_append(reinterpret_cast(this->handle), item.c_str()); + } } // namespace WebDAV diff --git a/sources/header.hpp b/sources/header.hpp index 9470aec..1e1fc7c 100644 --- a/sources/header.hpp +++ b/sources/header.hpp @@ -28,24 +28,24 @@ namespace WebDAV { - class Header final - { - public: - void * handle; + class Header final + { + public: + void* handle; - Header(const std::initializer_list& init_list) noexcept; - Header(const Header& other) = delete; - Header(Header&& other) noexcept; - ~Header() noexcept; + Header(const std::initializer_list& init_list) noexcept; + Header(const Header& other) = delete; + Header(Header&& other) noexcept; + ~Header() noexcept; - auto operator=(const Header& other) -> Header& = delete; - auto operator=(Header&& other) noexcept -> Header&; + auto operator=(const Header& other) -> Header& = delete; + auto operator=(Header&& other) noexcept -> Header&; - void append(const std::string& item) noexcept; + void append(const std::string& item) noexcept; - private: - auto swap(Header& other) noexcept -> void; - }; + private: + auto swap(Header& other) noexcept -> void; + }; } // namespace WebDAV #endif diff --git a/sources/request.cpp b/sources/request.cpp index c1bb34c..b017e8b 100644 --- a/sources/request.cpp +++ b/sources/request.cpp @@ -65,30 +65,30 @@ namespace WebDAV { this->set(CURLOPT_SSLCERTTYPE, "PEM"); this->set(CURLOPT_SSLKEYTYPE, "PEM"); - this->set(CURLOPT_SSLCERT, const_cast(cert_path.c_str())); - this->set(CURLOPT_SSLKEY, const_cast(key_path.c_str())); + this->set(CURLOPT_SSLCERT, const_cast(cert_path.c_str())); + this->set(CURLOPT_SSLKEY, const_cast(key_path.c_str())); } - this->set(CURLOPT_URL, const_cast(webdav_hostname.c_str())); + this->set(CURLOPT_URL, const_cast(webdav_hostname.c_str())); this->set(CURLOPT_HTTPAUTH, static_cast(CURLAUTH_BASIC)); auto token = webdav_username + ":" + webdav_password; - this->set(CURLOPT_USERPWD, const_cast(token.c_str())); + this->set(CURLOPT_USERPWD, const_cast(token.c_str())); if (!this->proxy_enabled()) return; - this->set(CURLOPT_PROXY, const_cast(proxy_hostname.c_str())); + this->set(CURLOPT_PROXY, const_cast(proxy_hostname.c_str())); this->set(CURLOPT_PROXYAUTH, static_cast(CURLAUTH_BASIC)); if (proxy_username.empty()) return; if (proxy_password.empty()) { - this->set(CURLOPT_PROXYUSERNAME, const_cast(proxy_username.c_str())); + this->set(CURLOPT_PROXYUSERNAME, const_cast(proxy_username.c_str())); } else { token = proxy_username + ":" + proxy_password; - this->set(CURLOPT_PROXYUSERPWD, const_cast(token.c_str())); + this->set(CURLOPT_PROXYUSERPWD, const_cast(token.c_str())); } } @@ -104,12 +104,15 @@ namespace WebDAV swap(handle, other.handle); } - Request::Request(Request&& other) noexcept : handle{ other.handle } + Request::Request(Request&& other) noexcept : handle + { + other.handle + } { other.handle = nullptr; } - auto Request::operator=(Request&& other) noexcept -> Request & + auto Request::operator=(Request&& other) noexcept -> Request& { if (this != &other) { diff --git a/sources/request.hpp b/sources/request.hpp index e35094c..1881f96 100644 --- a/sources/request.hpp +++ b/sources/request.hpp @@ -44,7 +44,7 @@ namespace WebDAV Request(Request&& other) noexcept; ~Request() noexcept; - auto operator=(const Request& other) -> Request & = delete; + auto operator=(const Request& other) -> Request& = delete; auto operator=(Request&& other) noexcept -> Request &; template @@ -55,7 +55,7 @@ namespace WebDAV } bool perform() const noexcept; - void * handle; + void* handle; private: const dict_t options; diff --git a/sources/urn.cpp b/sources/urn.cpp index 5a02d5a..7ddbace 100644 --- a/sources/urn.cpp +++ b/sources/urn.cpp @@ -65,7 +65,8 @@ namespace WebDAV { m_path.replace(first_position, double_separte.size(), Path::separate); } - } while (is_find); + } + while (is_find); } Path::Path(std::nullptr_t) @@ -78,7 +79,7 @@ namespace WebDAV return m_path; } - auto escape(void * request, const string& name) -> string + auto escape(void* request, const string& name) -> string { string path = curl_easy_escape(request, name.c_str(), static_cast(name.length())); return path; @@ -92,7 +93,7 @@ namespace WebDAV while ((end = text.find_first_of(delims, start)) != text.npos) { - tokens.push_back(text.substr(start, end-start)); + tokens.push_back(text.substr(start, end - start)); start = text.find_first_not_of(delims, end); } if (start != text.npos) @@ -102,14 +103,14 @@ namespace WebDAV return tokens; } - auto Path::quote(void *request) const -> string + auto Path::quote(void* request) const -> string { if (this->is_root()) return m_path; auto names = split(m_path, Path::separate); string quote_path; - std::for_each(names.begin(), names.end(), ["e_path, request](string& name) + std::for_each(names.begin(), names.end(), ["e_path, request](string & name) { auto escape_name = escape(request, name); quote_path.append(Path::separate); @@ -183,7 +184,7 @@ namespace WebDAV bool is_dir = is_directory(); if (is_dir) { - lhs_path = m_path.substr(0, m_path.length()-1); + lhs_path = m_path.substr(0, m_path.length() - 1); } else { @@ -193,11 +194,11 @@ namespace WebDAV if (rhs.is_directory()) { rhs_path = rhs.path(); - rhs_path = rhs_path.substr(0, rhs_path.length()-1); + rhs_path = rhs_path.substr(0, rhs_path.length() - 1); } else { - rhs_path = rhs.path(); + rhs_path = rhs.path(); } return lhs_path == rhs_path; } diff --git a/sources/urn.hpp b/sources/urn.hpp index f8b0945..aa082f9 100644 --- a/sources/urn.hpp +++ b/sources/urn.hpp @@ -49,7 +49,7 @@ namespace WebDAV auto name() const -> string; auto parent() const -> Path; auto path() const -> string; - auto quote(void * request) const -> string; + auto quote(void* request) const -> string; private: diff --git a/tests/check.cpp b/tests/check.cpp index b1d3b36..6306169 100644 --- a/tests/check.cpp +++ b/tests/check.cpp @@ -45,7 +45,7 @@ SCENARIO("Client must check an existing remote resources", "[check]") std::string existing_file = filename; std::string existing_directory = dirname; - client->upload_from(existing_file, (char *)content.c_str(), content.length()); + client->upload_from(existing_file, (char*)content.c_str(), content.length()); client->create_directory(existing_directory); WHEN("Check for existence of an existing remote file") @@ -91,7 +91,8 @@ SCENARIO("Client must check not an existing remote resources", "[check]") auto is_success = client->check(not_existing_file); - THEN("Check must be not success") { + THEN("Check must be not success") + { CHECK_FALSE(is_success); } diff --git a/tests/clean.cpp b/tests/clean.cpp index 5e9e517..4d1049c 100644 --- a/tests/clean.cpp +++ b/tests/clean.cpp @@ -45,7 +45,7 @@ SCENARIO("Client must clean an existing remote resources", "[clean]") std::string existing_file = filename; std::string existing_directory = dirname; - client->upload_from(existing_file, (char *)content.c_str(), content.length()); + client->upload_from(existing_file, (char*)content.c_str(), content.length()); client->create_directory(existing_directory); WHEN("Clean an existing remote file") @@ -132,7 +132,7 @@ SCENARIO("Client must clean not an empty remote directories", "[clean]") std::string attached_directory = not_empty_directory + "/" + "attached_directory/"; client->create_directory(not_empty_directory); - client->upload_from(attached_file, (char *)content.c_str(), content.length()); + client->upload_from(attached_file, (char*)content.c_str(), content.length()); client->create_directory(attached_directory); WHEN("Clean not an empty directory") diff --git a/tests/download.cpp b/tests/download.cpp index f02852f..2521d2e 100644 --- a/tests/download.cpp +++ b/tests/download.cpp @@ -44,8 +44,8 @@ SCENARIO("Client must download into buffer", "[download][buffer]") std::string source_buffer = content; std::string remote_resource = filename; - auto buffer_pointer = const_cast(source_buffer.c_str()); - unsigned long long buffer_size = (source_buffer.length() + 1)* sizeof(source_buffer.c_str()[0]); + auto buffer_pointer = const_cast(source_buffer.c_str()); + unsigned long long buffer_size = (source_buffer.length() + 1) * sizeof(source_buffer.c_str()[0]); auto is_success = client->upload_from(remote_resource, buffer_pointer, buffer_size); REQUIRE(is_success); diff --git a/tests/fixture.cpp b/tests/fixture.cpp index 9a907f3..2c8f976 100644 --- a/tests/fixture.cpp +++ b/tests/fixture.cpp @@ -84,13 +84,15 @@ namespace fixture throw std::runtime_error("undefined WEBDAV_PASSWORD environment variable"); } - std::map options = { + std::map options = + { {"webdav_hostname", hostname_ptr}, {"webdav_username", username_ptr}, {"webdav_password", password_ptr} }; - if (root_ptr != nullptr) { + if (root_ptr != nullptr) + { options["webdav_root"] = root_ptr; } diff --git a/tests/list.cpp b/tests/list.cpp index 2e8d222..1ae461e 100644 --- a/tests/list.cpp +++ b/tests/list.cpp @@ -51,9 +51,9 @@ SCENARIO("Client must list a remote files and a remote directories", "[list]") { auto number = std::to_string(i); auto directory = root + "/" + template_dirname + number; - auto file = root + "/"+ template_filename + number; + auto file = root + "/" + template_filename + number; client->create_directory(directory); - client->upload_from(file, (char *)content.c_str(), content.length()); + client->upload_from(file, (char*)content.c_str(), content.length()); } WHEN("List the directory") @@ -82,7 +82,7 @@ SCENARIO("Client can not list a remote file", "[list][file]") { std::string existing_file = filename; - client->upload_from(existing_file, (char *)content.c_str(), content.length()); + client->upload_from(existing_file, (char*)content.c_str(), content.length()); WHEN("List content of the file") { diff --git a/tests/upload.cpp b/tests/upload.cpp index 22f0b48..83f940e 100644 --- a/tests/upload.cpp +++ b/tests/upload.cpp @@ -44,7 +44,7 @@ SCENARIO("Client must upload buffer", "[upload][buffer]") { std::string remote_resource = filename; - auto buffer_pointer = const_cast(content.c_str()); + auto buffer_pointer = const_cast(content.c_str()); auto buffer_size = content.length() * sizeof(content.c_str()[0]); WHEN("Upload the buffer") @@ -54,7 +54,8 @@ SCENARIO("Client must upload buffer", "[upload][buffer]") auto is_success = client->upload_from(remote_resource, buffer_pointer, buffer_size); - THEN("buffer must be uploaded") { + THEN("buffer must be uploaded") + { CHECK(is_success); CHECK(client->check(remote_resource)); From 25e8270e1c1af685af02f786372b8a75e45d4389 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Fri, 11 Jan 2019 17:38:24 +0300 Subject: [PATCH 131/133] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 668f876..eb689f5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ WebDAV Client === -[![version](https://img.shields.io/badge/hunter-v0.19.79-blue.svg)](https://github.com/ruslo/hunter/tree/v0.19.79) -[![version](https://img.shields.io/badge/wdc-v1.1.4-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.4) +[![version](https://img.shields.io/badge/hunter-v0.23.86-blue.svg)](https://github.com/ruslo/hunter/releases/tag/v0.23.86) +[![version](https://img.shields.io/badge/wdc-v1.1.5-blue.svg)](https://github.com/CloudPolis/webdav-client-cpp/releases/tag/v1.1.4) [![Build Status](https://travis-ci.org/CloudPolis/webdav-client-cpp.svg?branch=master)](https://travis-ci.org/CloudPolis/webdav-client-cpp) [![Build status](https://ci.appveyor.com/api/projects/status/cr2xwpwe3iiafbwg?svg=true)](https://ci.appveyor.com/project/rusdevops/webdav-client-cpp) [![Join the chat at https://gitter.im/CloudPolis/webdav-client-cpp](https://badges.gitter.im/CloudPolis/webdav-client-cpp.svg)](https://gitter.im/CloudPolis/webdav-client-cpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) From 2707650eea9786918eacfd8a6ae3116687b8c564 Mon Sep 17 00:00:00 2001 From: rusdevops Date: Mon, 8 Apr 2019 17:44:43 +0300 Subject: [PATCH 132/133] Update NEWS --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 8b13789..c10e378 100644 --- a/NEWS +++ b/NEWS @@ -1 +1 @@ - +new package From 28f5ff85e4612e799b21d45c541cc286026d7244 Mon Sep 17 00:00:00 2001 From: Gennadiy Filatov Date: Tue, 21 May 2019 00:16:19 +0300 Subject: [PATCH 133/133] AddressSanitizer: attempting double-free --- sources/callback.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/callback.cpp b/sources/callback.cpp index 8c55868..d67a612 100644 --- a/sources/callback.cpp +++ b/sources/callback.cpp @@ -90,8 +90,8 @@ namespace WebDAV auto new_buffer = new char[new_buffer_size]; if (data->size != 0) memcpy(new_buffer, data->buffer, data->size); memcpy(new_buffer + data->size, ptr, append_size); - data->buffer = new_buffer; delete[] data->buffer; + data->buffer = new_buffer; data->size = new_buffer_size; return append_size; }