diff --git a/CMakeLists.txt b/CMakeLists.txt index 6693fbccea7..776e31e293a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,30 @@ add_library(of::openframeworks ALIAS openframeworks) include(${CMAKE_CURRENT_LIST_DIR}/libs/openFrameworks/CMakeLists.txt) # This downloads and configures the dependencies for us -include(${CMAKE_CURRENT_LIST_DIR}/cmake/download_and_link_deps.cmake) +# include(${CMAKE_CURRENT_LIST_DIR}/cmake/download_and_link_deps.cmake) + + +# of::tess2 +# of::glm +# of::utf8 +# of::FreeImage +# of::uriparser +# of::openssl +# of::curl +# of::freetype +# of::pugixml +# of::json + +# find_package(unofficial-libtess2 CONFIG REQUIRED) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_BINARY_DIR}") +find_package(glm CONFIG REQUIRED) +find_package(utf8cpp CONFIG REQUIRED) +find_package(FreeImage CONFIG REQUIRED) +find_package(uriparser CONFIG REQUIRED) +find_package(curl CONFIG REQUIRED) +find_package(freetype CONFIG REQUIRED) +find_package(pugixml CONFIG REQUIRED) +find_package(nlohmann_json CONFIG REQUIRED) # C++ standard version and disabling non-standard compiler specific features target_compile_features(openframeworks PUBLIC cxx_std_17) @@ -44,9 +67,9 @@ target_compile_definitions(openframeworks PUBLIC if(MSVC) target_compile_options(openframeworks PUBLIC "/Zc:__cplusplus") # Force MSVC to set __cplusplus macro correctly target_compile_options(openframeworks PUBLIC "/MP") # Enable multi-core compilation - target_link_options(openframeworks PUBLIC "/ignore:4099") # Suppress compiler warning that no .pdb file is available for debugging (in third-party libraries) - target_link_options(openframeworks PUBLIC "/NODEFAULTLIB:LIBCMT") # Don't link to the default C runtime library (Conflicting with third-party libraries) - target_link_options(openframeworks PUBLIC "/NODEFAULTLIB:$,MSVCRT,MSVCRTd>") # Don't link to the default C++ standard library (Conflicting with third-party libraries) + # target_link_options(openframeworks PUBLIC "/ignore:4099") # Suppress compiler warning that no .pdb file is available for debugging (in third-party libraries) + # target_link_options(openframeworks PUBLIC "/NODEFAULTLIB:LIBCMT") # Don't link to the default C runtime library (Conflicting with third-party libraries) + # target_link_options(openframeworks PUBLIC "/NODEFAULTLIB:$,MSVCRT,MSVCRTd>") # Don't link to the default C++ standard library (Conflicting with third-party libraries) endif() # Where compiled binaries should be placed diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index e7c050dd87c..103abc8ba7e 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -54,8 +54,8 @@ add_subdirectory(ofxNetwork) add_subdirectory(ofxOpenCv) add_subdirectory(ofxOsc) add_subdirectory(ofxPoco) -add_subdirectory(ofxSvg) +# add_subdirectory(ofxSvg) add_subdirectory(ofxThreadedImageLoader) add_subdirectory(ofxUnitTests) add_subdirectory(ofxVectorGraphics) -add_subdirectory(ofxXmlSettings) \ No newline at end of file +# add_subdirectory(ofxXmlSettings) diff --git a/addons/ofxAssimpModelLoader/CMakeLists.txt b/addons/ofxAssimpModelLoader/CMakeLists.txt index 7ab90031118..a430b701460 100644 --- a/addons/ofxAssimpModelLoader/CMakeLists.txt +++ b/addons/ofxAssimpModelLoader/CMakeLists.txt @@ -1,2 +1,4 @@ define_addon(ofxAssimpModelLoader) -target_link_libraries(ofxAssimpModelLoader of::assimp) \ No newline at end of file + +find_package(assimp CONFIG REQUIRED) +target_link_libraries(ofxAssimpModelLoader assimp::assimp) \ No newline at end of file diff --git a/addons/ofxKinect/CMakeLists.txt b/addons/ofxKinect/CMakeLists.txt index cc3098e6b23..7c52e6607c8 100644 --- a/addons/ofxKinect/CMakeLists.txt +++ b/addons/ofxKinect/CMakeLists.txt @@ -8,4 +8,5 @@ if (WIN32) target_include_directories(ofxKinect PUBLIC libs/libfreenect/platform/windows) endif () -target_link_libraries(ofxKinect of::libusb) \ No newline at end of file +find_package(libusb REQUIRED) +target_link_libraries(ofxKinect libusb::libusb) \ No newline at end of file diff --git a/addons/ofxOpenCv/CMakeLists.txt b/addons/ofxOpenCv/CMakeLists.txt index a8b84c98e50..99eb211fc68 100644 --- a/addons/ofxOpenCv/CMakeLists.txt +++ b/addons/ofxOpenCv/CMakeLists.txt @@ -1,6 +1,8 @@ define_addon(ofxOpenCv) -target_link_libraries(ofxOpenCv of::opencv) -if (WIN32) # We only need ippicv on Windows - target_link_libraries(ofxOpenCv of::ippicv) -endif() \ No newline at end of file +find_package(OpenCV REQUIRED) +target_link_libraries(ofxOpenCv opencv::opencv) + +# if (WIN32) # We only need ippicv on Windows +# target_link_libraries(ofxOpenCv opencv::ippicv) +# endif() diff --git a/addons/ofxPoco/CMakeLists.txt b/addons/ofxPoco/CMakeLists.txt index 71f2f42cff9..89c71222cc1 100644 --- a/addons/ofxPoco/CMakeLists.txt +++ b/addons/ofxPoco/CMakeLists.txt @@ -1,2 +1,4 @@ define_addon(ofxPoco) -target_link_libraries(ofxPoco of::poco) \ No newline at end of file + +find_package(Poco REQUIRED COMPONENTS Foundation Util Net XML JSON Zip) +target_link_libraries(ofxPoco Poco::Foundation Poco::Util Poco::Net Poco::XML Poco::JSON Poco::Zip) \ No newline at end of file diff --git a/addons/ofxSvg/CMakeLists.txt b/addons/ofxSvg/CMakeLists.txt index df64a1c1649..ec7fd75629a 100644 --- a/addons/ofxSvg/CMakeLists.txt +++ b/addons/ofxSvg/CMakeLists.txt @@ -1,2 +1,5 @@ define_addon(ofxSvg) -target_link_libraries(ofxSvg of::svgtiny of::libxml2) \ No newline at end of file + +find_package(svgtiny REQUIRED) +find_package(libxml2 REQUIRED) +target_link_libraries(ofxSvg svgtiny::svgtiny libxml2::libxml2) \ No newline at end of file diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake deleted file mode 100644 index c01a5b221a9..00000000000 --- a/cmake/CPM.cmake +++ /dev/null @@ -1,1131 +0,0 @@ -# CPM.cmake - CMake's missing package manager -# =========================================== -# See https://github.com/cpm-cmake/CPM.cmake for usage and update instructions. -# -# MIT License -# ----------- -#[[ - Copyright (c) 2019-2022 Lars Melchior and contributors - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -]] - -cmake_minimum_required(VERSION 3.14 FATAL_ERROR) - -# Initialize logging prefix -if(NOT CPM_INDENT) - set(CPM_INDENT - "CPM:" - CACHE INTERNAL "" - ) -endif() - -if(NOT COMMAND cpm_message) - function(cpm_message) - message(${ARGV}) - endfunction() -endif() - -set(CURRENT_CPM_VERSION 0.37.0) - -get_filename_component(CPM_CURRENT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" REALPATH) -if(CPM_DIRECTORY) - if(NOT CPM_DIRECTORY STREQUAL CPM_CURRENT_DIRECTORY) - if(CPM_VERSION VERSION_LESS CURRENT_CPM_VERSION) - message( - AUTHOR_WARNING - "${CPM_INDENT} \ -A dependency is using a more recent CPM version (${CURRENT_CPM_VERSION}) than the current project (${CPM_VERSION}). \ -It is recommended to upgrade CPM to the most recent version. \ -See https://github.com/cpm-cmake/CPM.cmake for more information." - ) - endif() - if(${CMAKE_VERSION} VERSION_LESS "3.17.0") - include(FetchContent) - endif() - return() - endif() - - get_property( - CPM_INITIALIZED GLOBAL "" - PROPERTY CPM_INITIALIZED - SET - ) - if(CPM_INITIALIZED) - return() - endif() -endif() - -if(CURRENT_CPM_VERSION MATCHES "development-version") - message( - WARNING "${CPM_INDENT} Your project is using an unstable development version of CPM.cmake. \ -Please update to a recent release if possible. \ -See https://github.com/cpm-cmake/CPM.cmake for details." - ) -endif() - -set_property(GLOBAL PROPERTY CPM_INITIALIZED true) - -macro(cpm_set_policies) - # the policy allows us to change options without caching - cmake_policy(SET CMP0077 NEW) - set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) - - # the policy allows us to change set(CACHE) without caching - if(POLICY CMP0126) - cmake_policy(SET CMP0126 NEW) - set(CMAKE_POLICY_DEFAULT_CMP0126 NEW) - endif() - - # The policy uses the download time for timestamp, instead of the timestamp in the archive. This - # allows for proper rebuilds when a projects url changes - if(POLICY CMP0135) - cmake_policy(SET CMP0135 NEW) - set(CMAKE_POLICY_DEFAULT_CMP0135 NEW) - endif() -endmacro() -cpm_set_policies() - -option(CPM_USE_LOCAL_PACKAGES "Always try to use `find_package` to get dependencies" - $ENV{CPM_USE_LOCAL_PACKAGES} -) -option(CPM_LOCAL_PACKAGES_ONLY "Only use `find_package` to get dependencies" - $ENV{CPM_LOCAL_PACKAGES_ONLY} -) -option(CPM_DOWNLOAD_ALL "Always download dependencies from source" $ENV{CPM_DOWNLOAD_ALL}) -option(CPM_DONT_UPDATE_MODULE_PATH "Don't update the module path to allow using find_package" - $ENV{CPM_DONT_UPDATE_MODULE_PATH} -) -option(CPM_DONT_CREATE_PACKAGE_LOCK "Don't create a package lock file in the binary path" - $ENV{CPM_DONT_CREATE_PACKAGE_LOCK} -) -option(CPM_INCLUDE_ALL_IN_PACKAGE_LOCK - "Add all packages added through CPM.cmake to the package lock" - $ENV{CPM_INCLUDE_ALL_IN_PACKAGE_LOCK} -) -option(CPM_USE_NAMED_CACHE_DIRECTORIES - "Use additional directory of package name in cache on the most nested level." - $ENV{CPM_USE_NAMED_CACHE_DIRECTORIES} -) - -set(CPM_VERSION - ${CURRENT_CPM_VERSION} - CACHE INTERNAL "" -) -set(CPM_DIRECTORY - ${CPM_CURRENT_DIRECTORY} - CACHE INTERNAL "" -) -set(CPM_FILE - ${CMAKE_CURRENT_LIST_FILE} - CACHE INTERNAL "" -) -set(CPM_PACKAGES - "" - CACHE INTERNAL "" -) -set(CPM_DRY_RUN - OFF - CACHE INTERNAL "Don't download or configure dependencies (for testing)" -) - -if(DEFINED ENV{CPM_SOURCE_CACHE}) - set(CPM_SOURCE_CACHE_DEFAULT $ENV{CPM_SOURCE_CACHE}) -else() - set(CPM_SOURCE_CACHE_DEFAULT OFF) -endif() - -set(CPM_SOURCE_CACHE - ${CPM_SOURCE_CACHE_DEFAULT} - CACHE PATH "Directory to download CPM dependencies" -) - -if(NOT CPM_DONT_UPDATE_MODULE_PATH) - set(CPM_MODULE_PATH - "${CMAKE_BINARY_DIR}/CPM_modules" - CACHE INTERNAL "" - ) - # remove old modules - file(REMOVE_RECURSE ${CPM_MODULE_PATH}) - file(MAKE_DIRECTORY ${CPM_MODULE_PATH}) - # locally added CPM modules should override global packages - set(CMAKE_MODULE_PATH "${CPM_MODULE_PATH};${CMAKE_MODULE_PATH}") -endif() - -if(NOT CPM_DONT_CREATE_PACKAGE_LOCK) - set(CPM_PACKAGE_LOCK_FILE - "${CMAKE_BINARY_DIR}/cpm-package-lock.cmake" - CACHE INTERNAL "" - ) - file(WRITE ${CPM_PACKAGE_LOCK_FILE} - "# CPM Package Lock\n# This file should be committed to version control\n\n" - ) -endif() - -include(FetchContent) - -# Try to infer package name from git repository uri (path or url) -function(cpm_package_name_from_git_uri URI RESULT) - if("${URI}" MATCHES "([^/:]+)/?.git/?$") - set(${RESULT} - ${CMAKE_MATCH_1} - PARENT_SCOPE - ) - else() - unset(${RESULT} PARENT_SCOPE) - endif() -endfunction() - -# Try to infer package name and version from a url -function(cpm_package_name_and_ver_from_url url outName outVer) - if(url MATCHES "[/\\?]([a-zA-Z0-9_\\.-]+)\\.(tar|tar\\.gz|tar\\.bz2|zip|ZIP)(\\?|/|$)") - # We matched an archive - set(filename "${CMAKE_MATCH_1}") - - if(filename MATCHES "([a-zA-Z0-9_\\.-]+)[_-]v?(([0-9]+\\.)*[0-9]+[a-zA-Z0-9]*)") - # We matched - (ie foo-1.2.3) - set(${outName} - "${CMAKE_MATCH_1}" - PARENT_SCOPE - ) - set(${outVer} - "${CMAKE_MATCH_2}" - PARENT_SCOPE - ) - elseif(filename MATCHES "(([0-9]+\\.)+[0-9]+[a-zA-Z0-9]*)") - # We couldn't find a name, but we found a version - # - # In many cases (which we don't handle here) the url would look something like - # `irrelevant/ACTUAL_PACKAGE_NAME/irrelevant/1.2.3.zip`. In such a case we can't possibly - # distinguish the package name from the irrelevant bits. Moreover if we try to match the - # package name from the filename, we'd get bogus at best. - unset(${outName} PARENT_SCOPE) - set(${outVer} - "${CMAKE_MATCH_1}" - PARENT_SCOPE - ) - else() - # Boldly assume that the file name is the package name. - # - # Yes, something like `irrelevant/ACTUAL_NAME/irrelevant/download.zip` will ruin our day, but - # such cases should be quite rare. No popular service does this... we think. - set(${outName} - "${filename}" - PARENT_SCOPE - ) - unset(${outVer} PARENT_SCOPE) - endif() - else() - # No ideas yet what to do with non-archives - unset(${outName} PARENT_SCOPE) - unset(${outVer} PARENT_SCOPE) - endif() -endfunction() - -function(cpm_find_package NAME VERSION) - string(REPLACE " " ";" EXTRA_ARGS "${ARGN}") - find_package(${NAME} ${VERSION} ${EXTRA_ARGS} QUIET) - if(${CPM_ARGS_NAME}_FOUND) - if(DEFINED ${CPM_ARGS_NAME}_VERSION) - set(VERSION ${${CPM_ARGS_NAME}_VERSION}) - endif() - cpm_message(STATUS "${CPM_INDENT} Using local package ${CPM_ARGS_NAME}@${VERSION}") - CPMRegisterPackage(${CPM_ARGS_NAME} "${VERSION}") - set(CPM_PACKAGE_FOUND - YES - PARENT_SCOPE - ) - else() - set(CPM_PACKAGE_FOUND - NO - PARENT_SCOPE - ) - endif() -endfunction() - -# Create a custom FindXXX.cmake module for a CPM package This prevents `find_package(NAME)` from -# finding the system library -function(cpm_create_module_file Name) - if(NOT CPM_DONT_UPDATE_MODULE_PATH) - # erase any previous modules - file(WRITE ${CPM_MODULE_PATH}/Find${Name}.cmake - "include(\"${CPM_FILE}\")\n${ARGN}\nset(${Name}_FOUND TRUE)" - ) - endif() -endfunction() - -# Find a package locally or fallback to CPMAddPackage -function(CPMFindPackage) - set(oneValueArgs NAME VERSION GIT_TAG FIND_PACKAGE_ARGUMENTS) - - cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "" ${ARGN}) - - if(NOT DEFINED CPM_ARGS_VERSION) - if(DEFINED CPM_ARGS_GIT_TAG) - cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION) - endif() - endif() - - set(downloadPackage ${CPM_DOWNLOAD_ALL}) - if(DEFINED CPM_DOWNLOAD_${CPM_ARGS_NAME}) - set(downloadPackage ${CPM_DOWNLOAD_${CPM_ARGS_NAME}}) - elseif(DEFINED ENV{CPM_DOWNLOAD_${CPM_ARGS_NAME}}) - set(downloadPackage $ENV{CPM_DOWNLOAD_${CPM_ARGS_NAME}}) - endif() - if(downloadPackage) - CPMAddPackage(${ARGN}) - cpm_export_variables(${CPM_ARGS_NAME}) - return() - endif() - - cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}") - if(CPM_PACKAGE_ALREADY_ADDED) - cpm_export_variables(${CPM_ARGS_NAME}) - return() - endif() - - cpm_find_package(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" ${CPM_ARGS_FIND_PACKAGE_ARGUMENTS}) - - if(NOT CPM_PACKAGE_FOUND) - CPMAddPackage(${ARGN}) - cpm_export_variables(${CPM_ARGS_NAME}) - endif() - -endfunction() - -# checks if a package has been added before -function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION) - if("${CPM_ARGS_NAME}" IN_LIST CPM_PACKAGES) - CPMGetPackageVersion(${CPM_ARGS_NAME} CPM_PACKAGE_VERSION) - if("${CPM_PACKAGE_VERSION}" VERSION_LESS "${CPM_ARGS_VERSION}") - message( - WARNING - "${CPM_INDENT} Requires a newer version of ${CPM_ARGS_NAME} (${CPM_ARGS_VERSION}) than currently included (${CPM_PACKAGE_VERSION})." - ) - endif() - cpm_get_fetch_properties(${CPM_ARGS_NAME}) - set(${CPM_ARGS_NAME}_ADDED NO) - set(CPM_PACKAGE_ALREADY_ADDED - YES - PARENT_SCOPE - ) - cpm_export_variables(${CPM_ARGS_NAME}) - else() - set(CPM_PACKAGE_ALREADY_ADDED - NO - PARENT_SCOPE - ) - endif() -endfunction() - -# Parse the argument of CPMAddPackage in case a single one was provided and convert it to a list of -# arguments which can then be parsed idiomatically. For example gh:foo/bar@1.2.3 will be converted -# to: GITHUB_REPOSITORY;foo/bar;VERSION;1.2.3 -function(cpm_parse_add_package_single_arg arg outArgs) - # Look for a scheme - if("${arg}" MATCHES "^([a-zA-Z]+):(.+)$") - string(TOLOWER "${CMAKE_MATCH_1}" scheme) - set(uri "${CMAKE_MATCH_2}") - - # Check for CPM-specific schemes - if(scheme STREQUAL "gh") - set(out "GITHUB_REPOSITORY;${uri}") - set(packageType "git") - elseif(scheme STREQUAL "gl") - set(out "GITLAB_REPOSITORY;${uri}") - set(packageType "git") - elseif(scheme STREQUAL "bb") - set(out "BITBUCKET_REPOSITORY;${uri}") - set(packageType "git") - # A CPM-specific scheme was not found. Looks like this is a generic URL so try to determine - # type - elseif(arg MATCHES ".git/?(@|#|$)") - set(out "GIT_REPOSITORY;${arg}") - set(packageType "git") - else() - # Fall back to a URL - set(out "URL;${arg}") - set(packageType "archive") - - # We could also check for SVN since FetchContent supports it, but SVN is so rare these days. - # We just won't bother with the additional complexity it will induce in this function. SVN is - # done by multi-arg - endif() - else() - if(arg MATCHES ".git/?(@|#|$)") - set(out "GIT_REPOSITORY;${arg}") - set(packageType "git") - else() - # Give up - message(FATAL_ERROR "${CPM_INDENT} Can't determine package type of '${arg}'") - endif() - endif() - - # For all packages we interpret @... as version. Only replace the last occurrence. Thus URIs - # containing '@' can be used - string(REGEX REPLACE "@([^@]+)$" ";VERSION;\\1" out "${out}") - - # Parse the rest according to package type - if(packageType STREQUAL "git") - # For git repos we interpret #... as a tag or branch or commit hash - string(REGEX REPLACE "#([^#]+)$" ";GIT_TAG;\\1" out "${out}") - elseif(packageType STREQUAL "archive") - # For archives we interpret #... as a URL hash. - string(REGEX REPLACE "#([^#]+)$" ";URL_HASH;\\1" out "${out}") - # We don't try to parse the version if it's not provided explicitly. cpm_get_version_from_url - # should do this at a later point - else() - # We should never get here. This is an assertion and hitting it means there's a bug in the code - # above. A packageType was set, but not handled by this if-else. - message(FATAL_ERROR "${CPM_INDENT} Unsupported package type '${packageType}' of '${arg}'") - endif() - - set(${outArgs} - ${out} - PARENT_SCOPE - ) -endfunction() - -# Check that the working directory for a git repo is clean -function(cpm_check_git_working_dir_is_clean repoPath gitTag isClean) - - find_package(Git REQUIRED) - - if(NOT GIT_EXECUTABLE) - # No git executable, assume directory is clean - set(${isClean} - TRUE - PARENT_SCOPE - ) - return() - endif() - - # check for uncommitted changes - execute_process( - COMMAND ${GIT_EXECUTABLE} status --porcelain - RESULT_VARIABLE resultGitStatus - OUTPUT_VARIABLE repoStatus - OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET - WORKING_DIRECTORY ${repoPath} - ) - if(resultGitStatus) - # not supposed to happen, assume clean anyway - message(WARNING "${CPM_INDENT} Calling git status on folder ${repoPath} failed") - set(${isClean} - TRUE - PARENT_SCOPE - ) - return() - endif() - - if(NOT "${repoStatus}" STREQUAL "") - set(${isClean} - FALSE - PARENT_SCOPE - ) - return() - endif() - - # check for committed changes - execute_process( - COMMAND ${GIT_EXECUTABLE} diff -s --exit-code ${gitTag} - RESULT_VARIABLE resultGitDiff - OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_QUIET - WORKING_DIRECTORY ${repoPath} - ) - - if(${resultGitDiff} EQUAL 0) - set(${isClean} - TRUE - PARENT_SCOPE - ) - else() - set(${isClean} - FALSE - PARENT_SCOPE - ) - endif() - -endfunction() - -# method to overwrite internal FetchContent properties, to allow using CPM.cmake to overload -# FetchContent calls. As these are internal cmake properties, this method should be used carefully -# and may need modification in future CMake versions. Source: -# https://github.com/Kitware/CMake/blob/dc3d0b5a0a7d26d43d6cfeb511e224533b5d188f/Modules/FetchContent.cmake#L1152 -function(cpm_override_fetchcontent contentName) - cmake_parse_arguments(PARSE_ARGV 1 arg "" "SOURCE_DIR;BINARY_DIR" "") - if(NOT "${arg_UNPARSED_ARGUMENTS}" STREQUAL "") - message(FATAL_ERROR "${CPM_INDENT} Unsupported arguments: ${arg_UNPARSED_ARGUMENTS}") - endif() - - string(TOLOWER ${contentName} contentNameLower) - set(prefix "_FetchContent_${contentNameLower}") - - set(propertyName "${prefix}_sourceDir") - define_property( - GLOBAL - PROPERTY ${propertyName} - BRIEF_DOCS "Internal implementation detail of FetchContent_Populate()" - FULL_DOCS "Details used by FetchContent_Populate() for ${contentName}" - ) - set_property(GLOBAL PROPERTY ${propertyName} "${arg_SOURCE_DIR}") - - set(propertyName "${prefix}_binaryDir") - define_property( - GLOBAL - PROPERTY ${propertyName} - BRIEF_DOCS "Internal implementation detail of FetchContent_Populate()" - FULL_DOCS "Details used by FetchContent_Populate() for ${contentName}" - ) - set_property(GLOBAL PROPERTY ${propertyName} "${arg_BINARY_DIR}") - - set(propertyName "${prefix}_populated") - define_property( - GLOBAL - PROPERTY ${propertyName} - BRIEF_DOCS "Internal implementation detail of FetchContent_Populate()" - FULL_DOCS "Details used by FetchContent_Populate() for ${contentName}" - ) - set_property(GLOBAL PROPERTY ${propertyName} TRUE) -endfunction() - -# Download and add a package from source -function(CPMAddPackage) - cpm_set_policies() - - list(LENGTH ARGN argnLength) - if(argnLength EQUAL 1) - cpm_parse_add_package_single_arg("${ARGN}" ARGN) - - # The shorthand syntax implies EXCLUDE_FROM_ALL - set(ARGN "${ARGN};EXCLUDE_FROM_ALL;YES") - endif() - - set(oneValueArgs - NAME - FORCE - VERSION - GIT_TAG - DOWNLOAD_ONLY - GITHUB_REPOSITORY - GITLAB_REPOSITORY - BITBUCKET_REPOSITORY - GIT_REPOSITORY - SOURCE_DIR - DOWNLOAD_COMMAND - FIND_PACKAGE_ARGUMENTS - NO_CACHE - GIT_SHALLOW - EXCLUDE_FROM_ALL - SOURCE_SUBDIR - ) - - set(multiValueArgs URL OPTIONS) - - cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") - - # Set default values for arguments - - if(NOT DEFINED CPM_ARGS_VERSION) - if(DEFINED CPM_ARGS_GIT_TAG) - cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION) - endif() - endif() - - if(CPM_ARGS_DOWNLOAD_ONLY) - set(DOWNLOAD_ONLY ${CPM_ARGS_DOWNLOAD_ONLY}) - else() - set(DOWNLOAD_ONLY NO) - endif() - - if(DEFINED CPM_ARGS_GITHUB_REPOSITORY) - set(CPM_ARGS_GIT_REPOSITORY "https://github.com/${CPM_ARGS_GITHUB_REPOSITORY}.git") - elseif(DEFINED CPM_ARGS_GITLAB_REPOSITORY) - set(CPM_ARGS_GIT_REPOSITORY "https://gitlab.com/${CPM_ARGS_GITLAB_REPOSITORY}.git") - elseif(DEFINED CPM_ARGS_BITBUCKET_REPOSITORY) - set(CPM_ARGS_GIT_REPOSITORY "https://bitbucket.org/${CPM_ARGS_BITBUCKET_REPOSITORY}.git") - endif() - - if(DEFINED CPM_ARGS_GIT_REPOSITORY) - list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_REPOSITORY ${CPM_ARGS_GIT_REPOSITORY}) - if(NOT DEFINED CPM_ARGS_GIT_TAG) - set(CPM_ARGS_GIT_TAG v${CPM_ARGS_VERSION}) - endif() - - # If a name wasn't provided, try to infer it from the git repo - if(NOT DEFINED CPM_ARGS_NAME) - cpm_package_name_from_git_uri(${CPM_ARGS_GIT_REPOSITORY} CPM_ARGS_NAME) - endif() - endif() - - set(CPM_SKIP_FETCH FALSE) - - if(DEFINED CPM_ARGS_GIT_TAG) - list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_TAG ${CPM_ARGS_GIT_TAG}) - # If GIT_SHALLOW is explicitly specified, honor the value. - if(DEFINED CPM_ARGS_GIT_SHALLOW) - list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SHALLOW ${CPM_ARGS_GIT_SHALLOW}) - endif() - endif() - - if(DEFINED CPM_ARGS_URL) - # If a name or version aren't provided, try to infer them from the URL - list(GET CPM_ARGS_URL 0 firstUrl) - cpm_package_name_and_ver_from_url(${firstUrl} nameFromUrl verFromUrl) - # If we fail to obtain name and version from the first URL, we could try other URLs if any. - # However multiple URLs are expected to be quite rare, so for now we won't bother. - - # If the caller provided their own name and version, they trump the inferred ones. - if(NOT DEFINED CPM_ARGS_NAME) - set(CPM_ARGS_NAME ${nameFromUrl}) - endif() - if(NOT DEFINED CPM_ARGS_VERSION) - set(CPM_ARGS_VERSION ${verFromUrl}) - endif() - - list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS URL "${CPM_ARGS_URL}") - endif() - - # Check for required arguments - - if(NOT DEFINED CPM_ARGS_NAME) - message( - FATAL_ERROR - "${CPM_INDENT} 'NAME' was not provided and couldn't be automatically inferred for package added with arguments: '${ARGN}'" - ) - endif() - - # Check if package has been added before - cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}") - if(CPM_PACKAGE_ALREADY_ADDED) - cpm_export_variables(${CPM_ARGS_NAME}) - return() - endif() - - # Check for manual overrides - if(NOT CPM_ARGS_FORCE AND NOT "${CPM_${CPM_ARGS_NAME}_SOURCE}" STREQUAL "") - set(PACKAGE_SOURCE ${CPM_${CPM_ARGS_NAME}_SOURCE}) - set(CPM_${CPM_ARGS_NAME}_SOURCE "") - CPMAddPackage( - NAME "${CPM_ARGS_NAME}" - SOURCE_DIR "${PACKAGE_SOURCE}" - EXCLUDE_FROM_ALL "${CPM_ARGS_EXCLUDE_FROM_ALL}" - OPTIONS "${CPM_ARGS_OPTIONS}" - SOURCE_SUBDIR "${CPM_ARGS_SOURCE_SUBDIR}" - DOWNLOAD_ONLY "${DOWNLOAD_ONLY}" - FORCE True - ) - cpm_export_variables(${CPM_ARGS_NAME}) - return() - endif() - - # Check for available declaration - if(NOT CPM_ARGS_FORCE AND NOT "${CPM_DECLARATION_${CPM_ARGS_NAME}}" STREQUAL "") - set(declaration ${CPM_DECLARATION_${CPM_ARGS_NAME}}) - set(CPM_DECLARATION_${CPM_ARGS_NAME} "") - CPMAddPackage(${declaration}) - cpm_export_variables(${CPM_ARGS_NAME}) - # checking again to ensure version and option compatibility - cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}") - return() - endif() - - if(CPM_USE_LOCAL_PACKAGES OR CPM_LOCAL_PACKAGES_ONLY) - cpm_find_package(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" ${CPM_ARGS_FIND_PACKAGE_ARGUMENTS}) - - if(CPM_PACKAGE_FOUND) - cpm_export_variables(${CPM_ARGS_NAME}) - return() - endif() - - if(CPM_LOCAL_PACKAGES_ONLY) - message( - SEND_ERROR - "${CPM_INDENT} ${CPM_ARGS_NAME} not found via find_package(${CPM_ARGS_NAME} ${CPM_ARGS_VERSION})" - ) - endif() - endif() - - CPMRegisterPackage("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}") - - if(DEFINED CPM_ARGS_GIT_TAG) - set(PACKAGE_INFO "${CPM_ARGS_GIT_TAG}") - elseif(DEFINED CPM_ARGS_SOURCE_DIR) - set(PACKAGE_INFO "${CPM_ARGS_SOURCE_DIR}") - else() - set(PACKAGE_INFO "${CPM_ARGS_VERSION}") - endif() - - if(DEFINED FETCHCONTENT_BASE_DIR) - # respect user's FETCHCONTENT_BASE_DIR if set - set(CPM_FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR}) - else() - set(CPM_FETCHCONTENT_BASE_DIR ${CMAKE_BINARY_DIR}/_deps) - endif() - - if(DEFINED CPM_ARGS_DOWNLOAD_COMMAND) - list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS DOWNLOAD_COMMAND ${CPM_ARGS_DOWNLOAD_COMMAND}) - elseif(DEFINED CPM_ARGS_SOURCE_DIR) - list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${CPM_ARGS_SOURCE_DIR}) - if(NOT IS_ABSOLUTE ${CPM_ARGS_SOURCE_DIR}) - # Expand `CPM_ARGS_SOURCE_DIR` relative path. This is important because EXISTS doesn't work - # for relative paths. - get_filename_component( - source_directory ${CPM_ARGS_SOURCE_DIR} REALPATH BASE_DIR ${CMAKE_CURRENT_BINARY_DIR} - ) - else() - set(source_directory ${CPM_ARGS_SOURCE_DIR}) - endif() - if(NOT EXISTS ${source_directory}) - string(TOLOWER ${CPM_ARGS_NAME} lower_case_name) - # remove timestamps so CMake will re-download the dependency - file(REMOVE_RECURSE "${CPM_FETCHCONTENT_BASE_DIR}/${lower_case_name}-subbuild") - endif() - elseif(CPM_SOURCE_CACHE AND NOT CPM_ARGS_NO_CACHE) - string(TOLOWER ${CPM_ARGS_NAME} lower_case_name) - set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS}) - list(SORT origin_parameters) - if(CPM_USE_NAMED_CACHE_DIRECTORIES) - string(SHA1 origin_hash "${origin_parameters};NEW_CACHE_STRUCTURE_TAG") - set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}/${CPM_ARGS_NAME}) - else() - string(SHA1 origin_hash "${origin_parameters}") - set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}) - endif() - # Expand `download_directory` relative path. This is important because EXISTS doesn't work for - # relative paths. - get_filename_component(download_directory ${download_directory} ABSOLUTE) - list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${download_directory}) - - file(LOCK ${download_directory}/../cmake.lock) - - if(EXISTS ${download_directory}) - cpm_store_fetch_properties( - ${CPM_ARGS_NAME} "${download_directory}" - "${CPM_FETCHCONTENT_BASE_DIR}/${lower_case_name}-build" - ) - cpm_get_fetch_properties("${CPM_ARGS_NAME}") - - if(DEFINED CPM_ARGS_GIT_TAG AND NOT (PATCH_COMMAND IN_LIST CPM_ARGS_UNPARSED_ARGUMENTS)) - # warn if cache has been changed since checkout - cpm_check_git_working_dir_is_clean(${download_directory} ${CPM_ARGS_GIT_TAG} IS_CLEAN) - if(NOT ${IS_CLEAN}) - message( - WARNING "${CPM_INDENT} Cache for ${CPM_ARGS_NAME} (${download_directory}) is dirty" - ) - endif() - endif() - - cpm_add_subdirectory( - "${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}" - "${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}" - "${CPM_ARGS_EXCLUDE_FROM_ALL}" "${CPM_ARGS_OPTIONS}" - ) - set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}") - - # As the source dir is already cached/populated, we override the call to FetchContent. - set(CPM_SKIP_FETCH TRUE) - cpm_override_fetchcontent( - "${lower_case_name}" SOURCE_DIR "${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" - BINARY_DIR "${${CPM_ARGS_NAME}_BINARY_DIR}" - ) - - else() - # Enable shallow clone when GIT_TAG is not a commit hash. Our guess may not be accurate, but - # it should guarantee no commit hash get mis-detected. - if(NOT DEFINED CPM_ARGS_GIT_SHALLOW) - cpm_is_git_tag_commit_hash("${CPM_ARGS_GIT_TAG}" IS_HASH) - if(NOT ${IS_HASH}) - list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SHALLOW TRUE) - endif() - endif() - - # remove timestamps so CMake will re-download the dependency - file(REMOVE_RECURSE ${CPM_FETCHCONTENT_BASE_DIR}/${lower_case_name}-subbuild) - set(PACKAGE_INFO "${PACKAGE_INFO} to ${download_directory}") - endif() - endif() - - cpm_create_module_file(${CPM_ARGS_NAME} "CPMAddPackage(\"${ARGN}\")") - - if(CPM_PACKAGE_LOCK_ENABLED) - if((CPM_ARGS_VERSION AND NOT CPM_ARGS_SOURCE_DIR) OR CPM_INCLUDE_ALL_IN_PACKAGE_LOCK) - cpm_add_to_package_lock(${CPM_ARGS_NAME} "${ARGN}") - elseif(CPM_ARGS_SOURCE_DIR) - cpm_add_comment_to_package_lock(${CPM_ARGS_NAME} "local directory") - else() - cpm_add_comment_to_package_lock(${CPM_ARGS_NAME} "${ARGN}") - endif() - endif() - - cpm_message( - STATUS "${CPM_INDENT} Adding package ${CPM_ARGS_NAME}@${CPM_ARGS_VERSION} (${PACKAGE_INFO})" - ) - - if(NOT CPM_SKIP_FETCH) - cpm_declare_fetch( - "${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}" - ) - cpm_fetch_package("${CPM_ARGS_NAME}" populated) - if(${populated}) - cpm_add_subdirectory( - "${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}" - "${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}" - "${CPM_ARGS_EXCLUDE_FROM_ALL}" "${CPM_ARGS_OPTIONS}" - ) - endif() - cpm_get_fetch_properties("${CPM_ARGS_NAME}") - endif() - - if(EXISTS ${download_directory}/../cmake.lock) - file(LOCK ${download_directory}/../cmake.lock RELEASE) - endif() - - set(${CPM_ARGS_NAME}_ADDED YES) - cpm_export_variables("${CPM_ARGS_NAME}") -endfunction() - -# Fetch a previously declared package -macro(CPMGetPackage Name) - if(DEFINED "CPM_DECLARATION_${Name}") - CPMAddPackage(NAME ${Name}) - else() - message(SEND_ERROR "${CPM_INDENT} Cannot retrieve package ${Name}: no declaration available") - endif() -endmacro() - -# export variables available to the caller to the parent scope expects ${CPM_ARGS_NAME} to be set -macro(cpm_export_variables name) - set(${name}_SOURCE_DIR - "${${name}_SOURCE_DIR}" - PARENT_SCOPE - ) - set(${name}_BINARY_DIR - "${${name}_BINARY_DIR}" - PARENT_SCOPE - ) - set(${name}_ADDED - "${${name}_ADDED}" - PARENT_SCOPE - ) - set(CPM_LAST_PACKAGE_NAME - "${name}" - PARENT_SCOPE - ) -endmacro() - -# declares a package, so that any call to CPMAddPackage for the package name will use these -# arguments instead. Previous declarations will not be overridden. -macro(CPMDeclarePackage Name) - if(NOT DEFINED "CPM_DECLARATION_${Name}") - set("CPM_DECLARATION_${Name}" "${ARGN}") - endif() -endmacro() - -function(cpm_add_to_package_lock Name) - if(NOT CPM_DONT_CREATE_PACKAGE_LOCK) - cpm_prettify_package_arguments(PRETTY_ARGN false ${ARGN}) - file(APPEND ${CPM_PACKAGE_LOCK_FILE} "# ${Name}\nCPMDeclarePackage(${Name}\n${PRETTY_ARGN})\n") - endif() -endfunction() - -function(cpm_add_comment_to_package_lock Name) - if(NOT CPM_DONT_CREATE_PACKAGE_LOCK) - cpm_prettify_package_arguments(PRETTY_ARGN true ${ARGN}) - file(APPEND ${CPM_PACKAGE_LOCK_FILE} - "# ${Name} (unversioned)\n# CPMDeclarePackage(${Name}\n${PRETTY_ARGN}#)\n" - ) - endif() -endfunction() - -# includes the package lock file if it exists and creates a target `cpm-update-package-lock` to -# update it -macro(CPMUsePackageLock file) - if(NOT CPM_DONT_CREATE_PACKAGE_LOCK) - get_filename_component(CPM_ABSOLUTE_PACKAGE_LOCK_PATH ${file} ABSOLUTE) - if(EXISTS ${CPM_ABSOLUTE_PACKAGE_LOCK_PATH}) - include(${CPM_ABSOLUTE_PACKAGE_LOCK_PATH}) - endif() - if(NOT TARGET cpm-update-package-lock) - add_custom_target( - cpm-update-package-lock COMMAND ${CMAKE_COMMAND} -E copy ${CPM_PACKAGE_LOCK_FILE} - ${CPM_ABSOLUTE_PACKAGE_LOCK_PATH} - ) - endif() - set(CPM_PACKAGE_LOCK_ENABLED true) - endif() -endmacro() - -# registers a package that has been added to CPM -function(CPMRegisterPackage PACKAGE VERSION) - list(APPEND CPM_PACKAGES ${PACKAGE}) - set(CPM_PACKAGES - ${CPM_PACKAGES} - CACHE INTERNAL "" - ) - set("CPM_PACKAGE_${PACKAGE}_VERSION" - ${VERSION} - CACHE INTERNAL "" - ) -endfunction() - -# retrieve the current version of the package to ${OUTPUT} -function(CPMGetPackageVersion PACKAGE OUTPUT) - set(${OUTPUT} - "${CPM_PACKAGE_${PACKAGE}_VERSION}" - PARENT_SCOPE - ) -endfunction() - -# declares a package in FetchContent_Declare -function(cpm_declare_fetch PACKAGE VERSION INFO) - if(${CPM_DRY_RUN}) - cpm_message(STATUS "${CPM_INDENT} Package not declared (dry run)") - return() - endif() - - FetchContent_Declare(${PACKAGE} ${ARGN}) -endfunction() - -# returns properties for a package previously defined by cpm_declare_fetch -function(cpm_get_fetch_properties PACKAGE) - if(${CPM_DRY_RUN}) - return() - endif() - - set(${PACKAGE}_SOURCE_DIR - "${CPM_PACKAGE_${PACKAGE}_SOURCE_DIR}" - PARENT_SCOPE - ) - set(${PACKAGE}_BINARY_DIR - "${CPM_PACKAGE_${PACKAGE}_BINARY_DIR}" - PARENT_SCOPE - ) -endfunction() - -function(cpm_store_fetch_properties PACKAGE source_dir binary_dir) - if(${CPM_DRY_RUN}) - return() - endif() - - set(CPM_PACKAGE_${PACKAGE}_SOURCE_DIR - "${source_dir}" - CACHE INTERNAL "" - ) - set(CPM_PACKAGE_${PACKAGE}_BINARY_DIR - "${binary_dir}" - CACHE INTERNAL "" - ) -endfunction() - -# adds a package as a subdirectory if viable, according to provided options -function( - cpm_add_subdirectory - PACKAGE - DOWNLOAD_ONLY - SOURCE_DIR - BINARY_DIR - EXCLUDE - OPTIONS -) - if(NOT DOWNLOAD_ONLY AND EXISTS ${SOURCE_DIR}/CMakeLists.txt) - if(EXCLUDE) - set(addSubdirectoryExtraArgs EXCLUDE_FROM_ALL) - else() - set(addSubdirectoryExtraArgs "") - endif() - if(OPTIONS) - foreach(OPTION ${OPTIONS}) - cpm_parse_option("${OPTION}") - set(${OPTION_KEY} "${OPTION_VALUE}") - endforeach() - endif() - set(CPM_OLD_INDENT "${CPM_INDENT}") - set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:") - add_subdirectory(${SOURCE_DIR} ${BINARY_DIR} ${addSubdirectoryExtraArgs}) - set(CPM_INDENT "${CPM_OLD_INDENT}") - endif() -endfunction() - -# downloads a previously declared package via FetchContent and exports the variables -# `${PACKAGE}_SOURCE_DIR` and `${PACKAGE}_BINARY_DIR` to the parent scope -function(cpm_fetch_package PACKAGE populated) - set(${populated} - FALSE - PARENT_SCOPE - ) - if(${CPM_DRY_RUN}) - cpm_message(STATUS "${CPM_INDENT} Package ${PACKAGE} not fetched (dry run)") - return() - endif() - - FetchContent_GetProperties(${PACKAGE}) - - string(TOLOWER "${PACKAGE}" lower_case_name) - - if(NOT ${lower_case_name}_POPULATED) - FetchContent_Populate(${PACKAGE}) - set(${populated} - TRUE - PARENT_SCOPE - ) - endif() - - cpm_store_fetch_properties( - ${CPM_ARGS_NAME} ${${lower_case_name}_SOURCE_DIR} ${${lower_case_name}_BINARY_DIR} - ) - - set(${PACKAGE}_SOURCE_DIR - ${${lower_case_name}_SOURCE_DIR} - PARENT_SCOPE - ) - set(${PACKAGE}_BINARY_DIR - ${${lower_case_name}_BINARY_DIR} - PARENT_SCOPE - ) -endfunction() - -# splits a package option -function(cpm_parse_option OPTION) - string(REGEX MATCH "^[^ ]+" OPTION_KEY "${OPTION}") - string(LENGTH "${OPTION}" OPTION_LENGTH) - string(LENGTH "${OPTION_KEY}" OPTION_KEY_LENGTH) - if(OPTION_KEY_LENGTH STREQUAL OPTION_LENGTH) - # no value for key provided, assume user wants to set option to "ON" - set(OPTION_VALUE "ON") - else() - math(EXPR OPTION_KEY_LENGTH "${OPTION_KEY_LENGTH}+1") - string(SUBSTRING "${OPTION}" "${OPTION_KEY_LENGTH}" "-1" OPTION_VALUE) - endif() - set(OPTION_KEY - "${OPTION_KEY}" - PARENT_SCOPE - ) - set(OPTION_VALUE - "${OPTION_VALUE}" - PARENT_SCOPE - ) -endfunction() - -# guesses the package version from a git tag -function(cpm_get_version_from_git_tag GIT_TAG RESULT) - string(LENGTH ${GIT_TAG} length) - if(length EQUAL 40) - # GIT_TAG is probably a git hash - set(${RESULT} - 0 - PARENT_SCOPE - ) - else() - string(REGEX MATCH "v?([0123456789.]*).*" _ ${GIT_TAG}) - set(${RESULT} - ${CMAKE_MATCH_1} - PARENT_SCOPE - ) - endif() -endfunction() - -# guesses if the git tag is a commit hash or an actual tag or a branch name. -function(cpm_is_git_tag_commit_hash GIT_TAG RESULT) - string(LENGTH "${GIT_TAG}" length) - # full hash has 40 characters, and short hash has at least 7 characters. - if(length LESS 7 OR length GREATER 40) - set(${RESULT} - 0 - PARENT_SCOPE - ) - else() - if(${GIT_TAG} MATCHES "^[a-fA-F0-9]+$") - set(${RESULT} - 1 - PARENT_SCOPE - ) - else() - set(${RESULT} - 0 - PARENT_SCOPE - ) - endif() - endif() -endfunction() - -function(cpm_prettify_package_arguments OUT_VAR IS_IN_COMMENT) - set(oneValueArgs - NAME - FORCE - VERSION - GIT_TAG - DOWNLOAD_ONLY - GITHUB_REPOSITORY - GITLAB_REPOSITORY - GIT_REPOSITORY - SOURCE_DIR - DOWNLOAD_COMMAND - FIND_PACKAGE_ARGUMENTS - NO_CACHE - GIT_SHALLOW - ) - set(multiValueArgs OPTIONS) - cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - foreach(oneArgName ${oneValueArgs}) - if(DEFINED CPM_ARGS_${oneArgName}) - if(${IS_IN_COMMENT}) - string(APPEND PRETTY_OUT_VAR "#") - endif() - if(${oneArgName} STREQUAL "SOURCE_DIR") - string(REPLACE ${CMAKE_SOURCE_DIR} "\${CMAKE_SOURCE_DIR}" CPM_ARGS_${oneArgName} - ${CPM_ARGS_${oneArgName}} - ) - endif() - string(APPEND PRETTY_OUT_VAR " ${oneArgName} ${CPM_ARGS_${oneArgName}}\n") - endif() - endforeach() - foreach(multiArgName ${multiValueArgs}) - if(DEFINED CPM_ARGS_${multiArgName}) - if(${IS_IN_COMMENT}) - string(APPEND PRETTY_OUT_VAR "#") - endif() - string(APPEND PRETTY_OUT_VAR " ${multiArgName}\n") - foreach(singleOption ${CPM_ARGS_${multiArgName}}) - if(${IS_IN_COMMENT}) - string(APPEND PRETTY_OUT_VAR "#") - endif() - string(APPEND PRETTY_OUT_VAR " \"${singleOption}\"\n") - endforeach() - endif() - endforeach() - - if(NOT "${CPM_ARGS_UNPARSED_ARGUMENTS}" STREQUAL "") - if(${IS_IN_COMMENT}) - string(APPEND PRETTY_OUT_VAR "#") - endif() - string(APPEND PRETTY_OUT_VAR " ") - foreach(CPM_ARGS_UNPARSED_ARGUMENT ${CPM_ARGS_UNPARSED_ARGUMENTS}) - string(APPEND PRETTY_OUT_VAR " ${CPM_ARGS_UNPARSED_ARGUMENT}") - endforeach() - string(APPEND PRETTY_OUT_VAR "\n") - endif() - - set(${OUT_VAR} - ${PRETTY_OUT_VAR} - PARENT_SCOPE - ) - -endfunction() diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index 4576a435eb8..1118ee74c1c 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -3,159 +3,159 @@ include(${CMAKE_CURRENT_LIST_DIR}/utils.cmake) include(${CMAKE_CURRENT_LIST_DIR}/import_deps.cmake) include(${CMAKE_CURRENT_LIST_DIR}/CPM.cmake) -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/modules) - -set(OF_TARGET_ARCHITECTURE "auto" CACHE STRING "The target platform for openFrameworks. 'auto' to detect automatically") -option(OF_VERBOSE "Enable verbose printing while downloading the compiled binaries for OF" OFF) - -set(_AVAILABLE_ARCHITECTURES "msvc, androidarmeabi, androidarm64, androidx86, ios, tvos, macos, msys-mingw, msys-clang, msys-ucrt, mingw, linux64, linuxarmv6l, linuxarmv7l, emscripten") - -if(OF_TARGET_ARCHITECTURE STREQUAL "auto") - if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) - message(FATAL_ERROR "OpenFrameworks no longer supports 32-bit build systems. Please upgrade your compiler to 64-bit.") - endif() - - message(STATUS "[openframeworks] Auto-detecting platform...") - - if (MSVC) - set(OF_TARGET_ARCHITECTURE "msvc" CACHE STRING "" FORCE) - elseif (EMSCRIPTEN) - set(OF_TARGET_ARCHITECTURE "emscripten" CACHE STRING "" FORCE) - elseif (ANDROID) - if (CMAKE_ANDROID_ARCH_ABI MATCHES "arm64") - set(OF_TARGET_ARCHITECTURE "androidarm64" CACHE STRING "" FORCE) - else () - if (CMAKE_ANDROID_ARCH_ABI MATCHES "armeabi") - set(OF_TARGET_ARCHITECTURE "androidarmeabi" CACHE STRING "" FORCE) - else () - if (CMAKE_ANDROID_ARCH_ABI MATCHES "x86") - set(OF_TARGET_ARCHITECTURE "androidx86" CACHE STRING "" FORCE) - else () - message(FATAL_ERROR "The target platform could not be detected automatically. Please specify it manually using '-DOF_TARGET_ARCHITECTURE= to your cmake call'. Possible values are: ${_AVAILABLE_ARCHITECTURES}.") - endif () - endif () - endif () - elseif (APPLE) - if (CMAKE_SYSTEM_NAME STREQUAL "iOS") - set(OF_TARGET_ARCHITECTURE "ios" CACHE STRING "" FORCE) - elseif (CMAKE_SYSTEM_NAME STREQUAL "tvOS") - set(OF_TARGET_ARCHITECTURE "tvos" CACHE STRING "" FORCE) - else() - set(OF_TARGET_ARCHITECTURE "macos" CACHE STRING "" FORCE) - endif() - elseif (MSYS) - set(OF_TARGET_ARCHITECTURE "msys-mingw" CACHE STRING "" FORCE) - # msys-clang and msys-ucrt must be specified manually - elseif (MINGW) - set(OF_TARGET_ARCHITECTURE "mingw" CACHE STRING "" FORCE) - elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") - set(OF_TARGET_ARCHITECTURE "linux64" CACHE STRING "" FORCE) - # 'linuxarmv6l' and 'linuxarmv7l' must be specified manually - else () - message(FATAL_ERROR "The target platform could not be detected automatically. Please specify it manually using '-DOF_TARGET_ARCHITECTURE= to your cmake call'. Possible values are: ${_AVAILABLE_ARCHITECTURES}.") - endif() - -endif() - -function(get_packages_and_link) - if (OF_VERBOSE) - Set(FETCHCONTENT_QUIET FALSE) - endif() - message(STATUS "[openframeworks] Using ${OF_TARGET_ARCHITECTURE} toolchain, downloading dependencies (-DOF_VERBOSE=ON for progress)") - foreach(dependency IN LISTS ARGN) - - # Download and extract the compressed archive - if (NOT of-deps-${dependency}_CONFIGURED) - set(_URL "http://ci.openframeworks.cc/libs/openFrameworksLibs_master_${dependency}") - message(STATUS "[openframeworks] Fetching ${_URL}") - CPMAddPackage( - NAME of-deps-${dependency} - DOWNLOAD_EXTRACT_TIMESTAMP TRUE - DOWNLOAD_ONLY YES - URL ${_URL} - ) - set(of-deps-${dependency}_SOURCE_DIR ${of-deps-${dependency}_SOURCE_DIR} CACHE BOOL "" FORCE) - set(of-deps-${dependency}_CONFIGURED ON CACHE BOOL "" FORCE) - else() - message(STATUS "[openframeworks] Skipping check of ${dependency} to save build time. To force a re-download, delete CMakeCache.txt and re-run cmake.") - endif() - - if (NOT ${dependency} STREQUAL "osx4.tar.bz2") # All normal packages - # Now, create the targets and link all files to them - file(GLOB deps "${of-deps-${dependency}_SOURCE_DIR}/**") - foreach(DEP_ROOT IN LISTS deps) - get_filename_component(DEP_NAME ${DEP_ROOT} NAME) # vvv This is called for each dependency in each downloaded package - - if (OF_TARGET_ARCHITECTURE MATCHES "linux" AND DEP_NAME STREQUAL "poco") # We do not want to use the embedded poco on linux as it's deprecated. We use the system's package instead - continue() - endif () - - import_dependency(${DEP_NAME} ${DEP_ROOT}) - endforeach() - else() # osx4.tar.bz2 is another huge exception, it contains just opencv in *NOT* a subfolder - import_dependency("opencv" "${of-deps-${dependency}_SOURCE_DIR}") - endif() - - endforeach() - if (OF_VERBOSE) - Set(FETCHCONTENT_QUIET TRUE) - endif() -endfunction() +# list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/modules) + +# set(OF_TARGET_ARCHITECTURE "auto" CACHE STRING "The target platform for openFrameworks. 'auto' to detect automatically") +# option(OF_VERBOSE "Enable verbose printing while downloading the compiled binaries for OF" OFF) + +# set(_AVAILABLE_ARCHITECTURES "msvc, androidarmeabi, androidarm64, androidx86, ios, tvos, macos, msys-mingw, msys-clang, msys-ucrt, mingw, linux64, linuxarmv6l, linuxarmv7l, emscripten") + +# if(OF_TARGET_ARCHITECTURE STREQUAL "auto") +# if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) +# message(FATAL_ERROR "OpenFrameworks no longer supports 32-bit build systems. Please upgrade your compiler to 64-bit.") +# endif() + +# message(STATUS "[openframeworks] Auto-detecting platform...") + +# if (MSVC) +# set(OF_TARGET_ARCHITECTURE "msvc" CACHE STRING "" FORCE) +# elseif (EMSCRIPTEN) +# set(OF_TARGET_ARCHITECTURE "emscripten" CACHE STRING "" FORCE) +# elseif (ANDROID) +# if (CMAKE_ANDROID_ARCH_ABI MATCHES "arm64") +# set(OF_TARGET_ARCHITECTURE "androidarm64" CACHE STRING "" FORCE) +# else () +# if (CMAKE_ANDROID_ARCH_ABI MATCHES "armeabi") +# set(OF_TARGET_ARCHITECTURE "androidarmeabi" CACHE STRING "" FORCE) +# else () +# if (CMAKE_ANDROID_ARCH_ABI MATCHES "x86") +# set(OF_TARGET_ARCHITECTURE "androidx86" CACHE STRING "" FORCE) +# else () +# message(FATAL_ERROR "The target platform could not be detected automatically. Please specify it manually using '-DOF_TARGET_ARCHITECTURE= to your cmake call'. Possible values are: ${_AVAILABLE_ARCHITECTURES}.") +# endif () +# endif () +# endif () +# elseif (APPLE) +# if (CMAKE_SYSTEM_NAME STREQUAL "iOS") +# set(OF_TARGET_ARCHITECTURE "ios" CACHE STRING "" FORCE) +# elseif (CMAKE_SYSTEM_NAME STREQUAL "tvOS") +# set(OF_TARGET_ARCHITECTURE "tvos" CACHE STRING "" FORCE) +# else() +# set(OF_TARGET_ARCHITECTURE "macos" CACHE STRING "" FORCE) +# endif() +# elseif (MSYS) +# set(OF_TARGET_ARCHITECTURE "msys-mingw" CACHE STRING "" FORCE) +# # msys-clang and msys-ucrt must be specified manually +# elseif (MINGW) +# set(OF_TARGET_ARCHITECTURE "mingw" CACHE STRING "" FORCE) +# elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") +# set(OF_TARGET_ARCHITECTURE "linux64" CACHE STRING "" FORCE) +# # 'linuxarmv6l' and 'linuxarmv7l' must be specified manually +# else () +# message(FATAL_ERROR "The target platform could not be detected automatically. Please specify it manually using '-DOF_TARGET_ARCHITECTURE= to your cmake call'. Possible values are: ${_AVAILABLE_ARCHITECTURES}.") +# endif() + +# endif() + +# function(get_packages_and_link) +# if (OF_VERBOSE) +# Set(FETCHCONTENT_QUIET FALSE) +# endif() +# message(STATUS "[openframeworks] Using ${OF_TARGET_ARCHITECTURE} toolchain, downloading dependencies (-DOF_VERBOSE=ON for progress)") +# foreach(dependency IN LISTS ARGN) + +# # Download and extract the compressed archive +# if (NOT of-deps-${dependency}_CONFIGURED) +# set(_URL "http://ci.openframeworks.cc/libs/openFrameworksLibs_master_${dependency}") +# message(STATUS "[openframeworks] Fetching ${_URL}") +# CPMAddPackage( +# NAME of-deps-${dependency} +# DOWNLOAD_EXTRACT_TIMESTAMP TRUE +# DOWNLOAD_ONLY YES +# URL ${_URL} +# ) +# set(of-deps-${dependency}_SOURCE_DIR ${of-deps-${dependency}_SOURCE_DIR} CACHE BOOL "" FORCE) +# set(of-deps-${dependency}_CONFIGURED ON CACHE BOOL "" FORCE) +# else() +# message(STATUS "[openframeworks] Skipping check of ${dependency} to save build time. To force a re-download, delete CMakeCache.txt and re-run cmake.") +# endif() + +# if (NOT ${dependency} STREQUAL "osx4.tar.bz2") # All normal packages +# # Now, create the targets and link all files to them +# file(GLOB deps "${of-deps-${dependency}_SOURCE_DIR}/**") +# foreach(DEP_ROOT IN LISTS deps) +# get_filename_component(DEP_NAME ${DEP_ROOT} NAME) # vvv This is called for each dependency in each downloaded package + +# if (OF_TARGET_ARCHITECTURE MATCHES "linux" AND DEP_NAME STREQUAL "poco") # We do not want to use the embedded poco on linux as it's deprecated. We use the system's package instead +# continue() +# endif () + +# import_dependency(${DEP_NAME} ${DEP_ROOT}) +# endforeach() +# else() # osx4.tar.bz2 is another huge exception, it contains just opencv in *NOT* a subfolder +# import_dependency("opencv" "${of-deps-${dependency}_SOURCE_DIR}") +# endif() + +# endforeach() +# if (OF_VERBOSE) +# Set(FETCHCONTENT_QUIET TRUE) +# endif() +# endfunction() # And now download the archives, depending on the platform we're on -if (OF_TARGET_ARCHITECTURE STREQUAL "msvc") - get_packages_and_link("vs2017_64_1.zip" "vs2017_64_2.zip" "vs2017_64_3.zip" "vs2017_64_4.zip") +# if (OF_TARGET_ARCHITECTURE STREQUAL "msvc") +# get_packages_and_link("vs2017_64_1.zip" "vs2017_64_2.zip" "vs2017_64_3.zip" "vs2017_64_4.zip") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "emscripten") # TODO: Implement Emscripten dependencies - message(SEND_ERROR "Emscripten is not yet implemented in CMake! You are welcome to contribute!") - get_packages_and_link() +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "emscripten") # TODO: Implement Emscripten dependencies +# message(SEND_ERROR "Emscripten is not yet implemented in CMake! You are welcome to contribute!") +# get_packages_and_link() -elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarmeabi") - get_packages_and_link("androidarmv7.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarmeabi") +# get_packages_and_link("androidarmv7.tar.bz2") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm64") - get_packages_and_link("androidarm64.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm64") +# get_packages_and_link("androidarm64.tar.bz2") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidx86") - get_packages_and_link("androidx86.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidx86") +# get_packages_and_link("androidx86.tar.bz2") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "ios") - get_packages_and_link("ios1.tar.bz2" "ios2.tar.bz2" "ios3.tar.bz2" "ios4.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "ios") +# get_packages_and_link("ios1.tar.bz2" "ios2.tar.bz2" "ios3.tar.bz2" "ios4.tar.bz2") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "tvos") - get_packages_and_link("tvos1.tar.bz2" "tvos2.tar.bz2" "tvos3.tar.bz2" "tvos4.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "tvos") +# get_packages_and_link("tvos1.tar.bz2" "tvos2.tar.bz2" "tvos3.tar.bz2" "tvos4.tar.bz2") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "macos") - get_packages_and_link("osx1.tar.bz2" "osx2.tar.bz2" "osx3.tar.bz2" "osx4.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "macos") +# get_packages_and_link("osx1.tar.bz2" "osx2.tar.bz2" "osx3.tar.bz2" "osx4.tar.bz2") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-mingw") - message(SEND_ERROR "MSYS2/MinGW is not yet implemented in CMake! You are welcome to contribute!") -# get_packages_and_link("msys2_mingw64.zip") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-mingw") +# message(SEND_ERROR "MSYS2/MinGW is not yet implemented in CMake! You are welcome to contribute!") +# # get_packages_and_link("msys2_mingw64.zip") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-ucrt") - message(SEND_ERROR "MSYS2/ucrt64 is not yet implemented in CMake! You are welcome to contribute!") -# get_packages_and_link("msys2_ucrt64.zip") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-ucrt") +# message(SEND_ERROR "MSYS2/ucrt64 is not yet implemented in CMake! You are welcome to contribute!") +# # get_packages_and_link("msys2_ucrt64.zip") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-clang") - message(SEND_ERROR "MSYS2/clang64 is not yet implemented in CMake! You are welcome to contribute!") -# get_packages_and_link("msys2_clang64.zip") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-clang") +# message(SEND_ERROR "MSYS2/clang64 is not yet implemented in CMake! You are welcome to contribute!") +# # get_packages_and_link("msys2_clang64.zip") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "mingw") - message(SEND_ERROR "Raw MinGW is not yet implemented in CMake! You are welcome to contribute!") -# get_packages_and_link("msys2_mingw64.zip") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "mingw") +# message(SEND_ERROR "Raw MinGW is not yet implemented in CMake! You are welcome to contribute!") +# # get_packages_and_link("msys2_mingw64.zip") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "linux64") - get_packages_and_link("linux64gcc6.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "linux64") +# get_packages_and_link("linux64gcc6.tar.bz2") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv6l") - get_packages_and_link("linuxarmv6l.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv6l") +# get_packages_and_link("linuxarmv6l.tar.bz2") -elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv7l") - get_packages_and_link("linuxarmv7l.tar.bz2") +# elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv7l") +# get_packages_and_link("linuxarmv7l.tar.bz2") -else () - message(FATAL_ERROR "No target platform was chosen. Please specify it manually using ' -DOF_TARGET_ARCHITECTURE='. Possible values are: ${_AVAILABLE_ARCHITECTURES}.") -endif() +# else () +# message(FATAL_ERROR "No target platform was chosen. Please specify it manually using ' -DOF_TARGET_ARCHITECTURE='. Possible values are: ${_AVAILABLE_ARCHITECTURES}.") +# endif() # Find system packages @@ -175,59 +175,59 @@ endif() # TODO: Now, download glut since it's somehow not part of the apothecary. Glut support seems to be deprecated -if (WIN32) - if (NOT of-deps-glut_CONFIGURED) - CPMAddPackage( - NAME of-deps-glut - GIT_REPOSITORY "https://github.com/markkilgard/glut" - GIT_TAG "8cd96cb440f1f2fac3a154227937be39d06efa53" - DOWNLOAD_EXTRACT_TIMESTAMP TRUE - DOWNLOAD_ONLY YES - ) - set(of-deps-glut_SOURCE_DIR ${of-deps-glut_SOURCE_DIR} CACHE PATH "" FORCE) - set(of-deps-glut_CONFIGURED ON CACHE BOOL "" FORCE) - else() - message(STATUS "[openframeworks] Skipping check of of-deps-glut to save build time. To force a re-download, delete CMakeCache.txt and and re-run cmake.") - endif() - - add_library(of-deps-glut INTERFACE) - add_library(of::glut ALIAS of-deps-glut) - target_include_directories(of-deps-glut INTERFACE ${of-deps-glut_SOURCE_DIR}/include) - target_include_directories(of-deps-glut INTERFACE ${of-deps-glut_SOURCE_DIR}/include/GL) -endif() +# if (WIN32) +# if (NOT of-deps-glut_CONFIGURED) +# CPMAddPackage( +# NAME of-deps-glut +# GIT_REPOSITORY "https://github.com/markkilgard/glut" +# GIT_TAG "8cd96cb440f1f2fac3a154227937be39d06efa53" +# DOWNLOAD_EXTRACT_TIMESTAMP TRUE +# DOWNLOAD_ONLY YES +# ) +# set(of-deps-glut_SOURCE_DIR ${of-deps-glut_SOURCE_DIR} CACHE PATH "" FORCE) +# set(of-deps-glut_CONFIGURED ON CACHE BOOL "" FORCE) +# else() +# message(STATUS "[openframeworks] Skipping check of of-deps-glut to save build time. To force a re-download, delete CMakeCache.txt and and re-run cmake.") +# endif() + +# add_library(of-deps-glut INTERFACE) +# add_library(of::glut ALIAS of-deps-glut) +# target_include_directories(of-deps-glut INTERFACE ${of-deps-glut_SOURCE_DIR}/include) +# target_include_directories(of-deps-glut INTERFACE ${of-deps-glut_SOURCE_DIR}/include/GL) +# endif() # And link to all the dependencies we depend upon -target_link_libraries(openframeworks - of::tess2 - of::glm - of::utf8 - of::FreeImage - of::uriparser - of::openssl - of::curl - of::freetype - of::pugixml - of::json -) +# target_link_libraries(openframeworks +# of::tess2 +# of::glm +# of::utf8 +# of::FreeImage +# of::uriparser +# of::openssl +# of::curl +# of::freetype +# of::pugixml +# of::json +# ) # Conditional dependencies -if(WIN32) # Linking to WinAPI system libraries - target_link_libraries(openframeworks of::videoInput of::glut) # videoInput library is Windows-only - target_link_libraries(openframeworks winmm ws2_32 wldap32 crypt32 dsound setupapi) -endif() - -if (OF_TARGET_ARCHITECTURE MATCHES "linux") - target_link_libraries(openframeworks of::OpenAL of::KissFFT of::sndfile of::gstreamer of::glib of::fontconfig of::udev) - target_link_libraries(openframeworks -lX11) - find_linux_deps() # All Linux-only packages (that are part of apothecary on all other platforms, but not on Linux) -endif() - -if (OF_TARGET_ARCHITECTURE STREQUAL "msvc" OR # GLEW is only a requirement on these systems - OF_TARGET_ARCHITECTURE STREQUAL "macos" OR - OF_TARGET_ARCHITECTURE MATCHES "linux") - target_link_libraries(openframeworks of::rtAudio of::fmod of::glfw of::cairo of::glew) -endif() +# if(WIN32) # Linking to WinAPI system libraries +# target_link_libraries(openframeworks of::videoInput of::glut) # videoInput library is Windows-only +# target_link_libraries(openframeworks winmm ws2_32 wldap32 crypt32 dsound setupapi) +# endif() + +# if (OF_TARGET_ARCHITECTURE MATCHES "linux") +# target_link_libraries(openframeworks of::OpenAL of::KissFFT of::sndfile of::gstreamer of::glib of::fontconfig of::udev) +# target_link_libraries(openframeworks -lX11) +# find_linux_deps() # All Linux-only packages (that are part of apothecary on all other platforms, but not on Linux) +# endif() + +# if (OF_TARGET_ARCHITECTURE STREQUAL "msvc" OR # GLEW is only a requirement on these systems +# OF_TARGET_ARCHITECTURE STREQUAL "macos" OR +# OF_TARGET_ARCHITECTURE MATCHES "linux") +# target_link_libraries(openframeworks of::rtAudio of::fmod of::glfw of::cairo of::glew) +# endif() # And finally find all shared libraries that are part of the dependencies, to be used later -file(GLOB_RECURSE _OF_DEPS_SHARED_LIBS "${CMAKE_BINARY_DIR}/_deps/**/${CMAKE_SHARED_LIBRARY_PREFIX}**${CMAKE_SHARED_LIBRARY_SUFFIX}") -set(OF_DEPS_SHARED_LIBS ${_OF_DEPS_SHARED_LIBS} CACHE INTERNAL "") +# file(GLOB_RECURSE _OF_DEPS_SHARED_LIBS "${CMAKE_BINARY_DIR}/_deps/**/${CMAKE_SHARED_LIBRARY_PREFIX}**${CMAKE_SHARED_LIBRARY_SUFFIX}") +# set(OF_DEPS_SHARED_LIBS ${_OF_DEPS_SHARED_LIBS} CACHE INTERNAL "") diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 023f1054b97..a8bd097f552 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -30,12 +30,12 @@ function(copy_file_after_build TARGET_NAME SOURCE_FILE TARGET_FILE) endfunction() # After compilation copy the dll files to the binary dir -function(of_copy_runtime_to_bin_dir_after_build TARGET BIN_DIR) - if (NOT DEFINED OF_DEPS_SHARED_LIBS) - message(FATAL_ERROR "INTERNAL ERROR: of_copy_runtime_to_bin_dir_after_build: OF_DEPS_SHARED_LIBS is not defined") - endif() - foreach(lib_path IN LISTS OF_DEPS_SHARED_LIBS) - get_filename_component(lib_name ${lib_path} NAME) - add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${lib_path}" "${BIN_DIR}/${lib_name}") - endforeach() -endfunction() +# function(of_copy_runtime_to_bin_dir_after_build TARGET BIN_DIR) +# if (NOT DEFINED OF_DEPS_SHARED_LIBS) +# message(FATAL_ERROR "INTERNAL ERROR: of_copy_runtime_to_bin_dir_after_build: OF_DEPS_SHARED_LIBS is not defined") +# endif() +# foreach(lib_path IN LISTS OF_DEPS_SHARED_LIBS) +# get_filename_component(lib_name ${lib_path} NAME) +# add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${lib_path}" "${BIN_DIR}/${lib_name}") +# endforeach() +# endfunction() diff --git a/conan/libdom/CMakeLists.txt b/conan/libdom/CMakeLists.txt new file mode 100644 index 00000000000..ce54d95b185 --- /dev/null +++ b/conan/libdom/CMakeLists.txt @@ -0,0 +1,219 @@ +cmake_minimum_required(VERSION 3.16) +project(libdom) + +set(LIBDOM_CORE_SOURCES + source/src/core/attr.c + source/src/core/attr.h + source/src/core/cdatasection.c + source/src/core/cdatasection.h + source/src/core/characterdata.c + source/src/core/characterdata.h + source/src/core/comment.c + source/src/core/comment.h + source/src/core/document.c + source/src/core/document.h + source/src/core/document_type.c + source/src/core/document_type.h + source/src/core/doc_fragment.c + source/src/core/doc_fragment.h + source/src/core/element.c + source/src/core/element.h + source/src/core/entity_ref.c + source/src/core/entity_ref.h + source/src/core/implementation.c + source/src/core/namednodemap.c + source/src/core/namednodemap.h + source/src/core/node.c + source/src/core/node.h + source/src/core/nodelist.c + source/src/core/nodelist.h + source/src/core/pi.c + source/src/core/pi.h + source/src/core/string.c + source/src/core/string.h + source/src/core/text.c + source/src/core/text.h + source/src/core/typeinfo.c +) + +set(LIBDOM_EVENTS_SOURCES + source/src/events/custom_event.c + source/src/events/custom_event.h + source/src/events/dispatch.c + source/src/events/dispatch.h + source/src/events/document_event.c + source/src/events/document_event.h + source/src/events/event.c + source/src/events/event.h + source/src/events/event_listener.c + source/src/events/event_listener.h + source/src/events/event_target.c + source/src/events/event_target.h + source/src/events/keyboard_event.c + source/src/events/keyboard_event.h + source/src/events/mouse_event.c + source/src/events/mouse_event.h + source/src/events/mouse_multi_wheel_event.c + source/src/events/mouse_multi_wheel_event.h + source/src/events/mouse_wheel_event.c + source/src/events/mouse_wheel_event.h + source/src/events/mutation_event.c + source/src/events/mutation_event.h + source/src/events/mutation_name_event.c + source/src/events/mutation_name_event.h + source/src/events/text_event.c + source/src/events/text_event.h + source/src/events/ui_event.c + source/src/events/ui_event.h +) + +set(LIBDOM_HTML_SOURCES + source/src/html/html_anchor_element.c + source/src/html/html_anchor_element.h + source/src/html/html_applet_element.c + source/src/html/html_applet_element.h + source/src/html/html_area_element.c + source/src/html/html_area_element.h + source/src/html/html_basefont_element.c + source/src/html/html_basefont_element.h + source/src/html/html_base_element.c + source/src/html/html_base_element.h + source/src/html/html_body_element.c + source/src/html/html_body_element.h + source/src/html/html_br_element.c + source/src/html/html_br_element.h + source/src/html/html_button_element.c + source/src/html/html_button_element.h + source/src/html/html_canvas_element.c + source/src/html/html_canvas_element.h + source/src/html/html_collection.c + source/src/html/html_collection.h + source/src/html/html_directory_element.c + source/src/html/html_directory_element.h + source/src/html/html_div_element.c + source/src/html/html_div_element.h + source/src/html/html_dlist_element.c + source/src/html/html_dlist_element.h + source/src/html/html_document.c + source/src/html/html_document.h + source/src/html/html_document_strings.h + source/src/html/html_element.c + source/src/html/html_element.h + source/src/html/html_fieldset_element.c + source/src/html/html_fieldset_element.h + source/src/html/html_font_element.c + source/src/html/html_font_element.h + source/src/html/html_form_element.c + source/src/html/html_form_element.h + source/src/html/html_frameset_element.c + source/src/html/html_frameset_element.h + source/src/html/html_frame_element.c + source/src/html/html_frame_element.h + source/src/html/html_heading_element.c + source/src/html/html_heading_element.h + source/src/html/html_head_element.c + source/src/html/html_head_element.h + source/src/html/html_hr_element.c + source/src/html/html_hr_element.h + source/src/html/html_html_element.c + source/src/html/html_html_element.h + source/src/html/html_iframe_element.c + source/src/html/html_iframe_element.h + source/src/html/html_image_element.c + source/src/html/html_image_element.h + source/src/html/html_input_element.c + source/src/html/html_input_element.h + source/src/html/html_isindex_element.c + source/src/html/html_isindex_element.h + source/src/html/html_label_element.c + source/src/html/html_label_element.h + source/src/html/html_legend_element.c + source/src/html/html_legend_element.h + source/src/html/html_link_element.c + source/src/html/html_link_element.h + source/src/html/html_li_element.c + source/src/html/html_li_element.h + source/src/html/html_map_element.c + source/src/html/html_map_element.h + source/src/html/html_menu_element.c + source/src/html/html_menu_element.h + source/src/html/html_meta_element.c + source/src/html/html_meta_element.h + source/src/html/html_mod_element.c + source/src/html/html_mod_element.h + source/src/html/html_object_element.c + source/src/html/html_object_element.h + source/src/html/html_olist_element.c + source/src/html/html_olist_element.h + source/src/html/html_options_collection.c + source/src/html/html_options_collection.h + source/src/html/html_option_element.c + source/src/html/html_option_element.h + source/src/html/html_opt_group_element.c + source/src/html/html_opt_group_element.h + source/src/html/html_paragraph_element.c + source/src/html/html_paragraph_element.h + source/src/html/html_param_element.c + source/src/html/html_param_element.h + source/src/html/html_pre_element.c + source/src/html/html_pre_element.h + source/src/html/html_quote_element.c + source/src/html/html_quote_element.h + source/src/html/html_script_element.c + source/src/html/html_script_element.h + source/src/html/html_select_element.c + source/src/html/html_select_element.h + source/src/html/html_style_element.c + source/src/html/html_style_element.h + source/src/html/html_tablecaption_element.c + source/src/html/html_tablecaption_element.h + source/src/html/html_tablecell_element.c + source/src/html/html_tablecell_element.h + source/src/html/html_tablecol_element.c + source/src/html/html_tablecol_element.h + source/src/html/html_tablerow_element.c + source/src/html/html_tablerow_element.h + source/src/html/html_tablesection_element.c + source/src/html/html_tablesection_element.h + source/src/html/html_table_element.c + source/src/html/html_table_element.h + source/src/html/html_text_area_element.c + source/src/html/html_text_area_element.h + source/src/html/html_title_element.c + source/src/html/html_title_element.h + source/src/html/html_ulist_element.c + source/src/html/html_ulist_element.h +) + +set(LIBDOM_UTILS_SOURCES + source/src/utils/character_valid.c + source/src/utils/character_valid.h + source/src/utils/hashtable.c + source/src/utils/hashtable.h + source/src/utils/list.h + source/src/utils/namespace.c + source/src/utils/namespace.h + source/src/utils/utils.h + source/src/utils/validate.c + source/src/utils/validate.h +) + +add_library(libdom_core STATIC ${LIBDOM_CORE_SOURCES}) +add_library(libdom_events STATIC ${LIBDOM_EVENTS_SOURCES}) +add_library(libdom_html STATIC ${LIBDOM_HTML_SOURCES}) +add_library(libdom_utils STATIC ${LIBDOM_UTILS_SOURCES}) + +add_library(libdom::core ALIAS libdom_core) +add_library(libdom::events ALIAS libdom_events) +add_library(libdom::html ALIAS libdom_html) +add_library(libdom::utils ALIAS libdom_utils) + +target_include_directories(libdom_core PUBLIC source/include) +target_include_directories(libdom_events PUBLIC source/include) +target_include_directories(libdom_html PUBLIC source/include) +target_include_directories(libdom_utils PUBLIC source/include) + +target_compile_features(libdom_core PUBLIC c_std_99) +target_compile_features(libdom_events PUBLIC c_std_99) +target_compile_features(libdom_html PUBLIC c_std_99) +target_compile_features(libdom_utils PUBLIC c_std_99) diff --git a/conan/libdom/conanfile.py b/conan/libdom/conanfile.py new file mode 100644 index 00000000000..86a92eae8e2 --- /dev/null +++ b/conan/libdom/conanfile.py @@ -0,0 +1,31 @@ +from conan import ConanFile +from conan.tools.scm import Git +from conan.tools.files import copy +from conan.tools.cmake import CMake +import os + +class LibDomConan(ConanFile): + name = "libdom" + version = "0.4.1" + package_type = "python-require" + exports = "*" + settings = "os", "compiler", "build_type", "arch" + generators = "CMakeDeps", "CMakeToolchain" + + def export_sources(self): + copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder) + + def source(self): + git = Git(self) + git.clone(url="git://git.netsurf-browser.org/libdom.git", target="source") + git.folder = "source" + git.checkout("release/0.4.1") + + def requirements(self): + self.requires("libparserutils/0.2.4@user/stable") + + def build(self): + cmake = CMake(self) + cmake.configure(build_script_folder=self.export_sources_folder) + cmake.build() + diff --git a/conan/libparserutils/CMakeLists.txt b/conan/libparserutils/CMakeLists.txt new file mode 100644 index 00000000000..dc3ad3beb07 --- /dev/null +++ b/conan/libparserutils/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.16) +project(libparserutils) + +set(LIBPARSERUTILS_SOURCES + source/src/charset/codecs/8859_tables.h + source/src/charset/codecs/codec_8859.c + source/src/charset/codecs/codec_ascii.c + source/src/charset/codecs/codec_ext8.c + source/src/charset/codecs/codec_impl.h + source/src/charset/codecs/codec_utf8.c + source/src/charset/codecs/codec_utf16.c + source/src/charset/codecs/ext8_tables.h + source/src/charset/encodings/utf8.c + source/src/charset/encodings/utf8impl.h + source/src/charset/encodings/utf16.c + source/src/charset/aliases.c + source/src/charset/aliases.h + source/src/charset/codec.c + source/src/input/filter.c + source/src/input/filter.h + source/src/input/inputstream.c + source/src/utils/buffer.c + source/src/utils/endian.h + source/src/utils/errors.c + source/src/utils/stack.c + source/src/utils/utils.h + source/src/utils/vector.c +) + + +add_library(libparserutils STATIC ${LIBPARSERUTILS_SOURCES}) +add_library(libparserutils::libparserutils ALIAS libparserutils) +target_include_directories(libparserutils PUBLIC source/include) +target_include_directories(libparserutils PUBLIC source/src) +target_compile_features(libparserutils PUBLIC c_std_99) diff --git a/conan/libparserutils/conanfile.py b/conan/libparserutils/conanfile.py new file mode 100644 index 00000000000..abce9f00aeb --- /dev/null +++ b/conan/libparserutils/conanfile.py @@ -0,0 +1,28 @@ +from conan import ConanFile +from conan.tools.scm import Git +from conan.tools.files import copy +from conan.tools.cmake import CMake +import os + +class LibParserUtilsConan(ConanFile): + name = "libparserutils" + version = "0.2.4" + package_type = "python-require" + exports = "*" + settings = "os", "compiler", "build_type", "arch" + generators = "CMakeDeps", "CMakeToolchain" + + def export_sources(self): + copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder) + + def source(self): + git = Git(self) + git.clone(url="git://git.netsurf-browser.org/libparserutils.git", target="source") + git.folder = "source" + git.checkout("release/0.2.4") + + def build(self): + cmake = CMake(self) + cmake.configure(build_script_folder=self.export_sources_folder) + cmake.build() + diff --git a/conan/svgtiny/CMakeLists.txt b/conan/svgtiny/CMakeLists.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/conan/svgtiny/conanfile.py b/conan/svgtiny/conanfile.py new file mode 100644 index 00000000000..1bb64803904 --- /dev/null +++ b/conan/svgtiny/conanfile.py @@ -0,0 +1,27 @@ +from conan import ConanFile +from conan.tools.scm import Git +from conan.tools.cmake import CMake +from conan.tools.files import copy +import os + +class SvgTinyConan(ConanFile): + name = "svgtiny" + version = "0.1.7" + package_type = "python-require" + exports = "*" + + def export_sources(self): + copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder) + + def source(self): + git = Git(self) + git.clone(url="git://git.netsurf-browser.org/libsvgtiny.git", target=".") + git.checkout("release/0.1.7") + + def requirements(self): + self.requires("libdom/0.4.1@user/stable") + + def build(self): + cmake = CMake(self) + cmake.configure(build_script_folder=os.path.join(self.source_folder, os.pardir)) + cmake.build() diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 00000000000..1c707f14a86 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,54 @@ +from conan import ConanFile +from conan.tools.cmake import CMakeToolchain +from conan.tools.cmake import CMake +import os + +class OFConan(ConanFile): + name = "openFrameworks" + version = "0.11.2" + license = "MIT" + url = "https://openframeworks.cc/" + generators = "CMakeDeps", "CMakeToolchain" + settings = "os", "compiler", "build_type", "arch" + + def include_package(self, name, version): + thisfilepath = os.path.dirname(os.path.realpath(__file__)) + recipes_path = os.path.join(thisfilepath, "conan", name) + self.run("conan export --user=user --channel=stable conanfile.py", cwd=recipes_path) + + def configure(self): + self.settings.compiler.cppstd = "17" + + self.options["poco/*"].enable_data_sqlite = False + self.options["poco/*"].enable_data_postgresql = False + self.options["poco/*"].enable_data_mysql = False + + def requirements(self): + self.requires("libtiff/4.6.0", force=True) # Unfortunately we have to override these versions and hope they work + self.requires("libwebp/1.3.2", force=True) # This is a conflict between OpenCV and FreeImage + self.requires("freeimage/3.18.0") + self.requires("opencv/3.4.17") + + self.requires("glm/cci.20230113") + self.requires("utfcpp/3.2.3") + self.requires("uriparser/0.9.7") + self.requires("libcurl/8.5.0") + self.requires("freetype/2.13.2") + self.requires("pugixml/1.13") + self.requires("nlohmann_json/3.11.3") + self.requires("assimp/5.2.2") + self.requires("libusb/1.0.26") + self.requires("poco/1.12.5p2") + self.requires("libxml2/2.12.2") + + # self.include_package("svgtiny", "0.1.7") + # self.include_package("libdom", "0.4.1") + # self.include_package("libparserutils", "0.2.4") + #self.requires("svgtiny/0.1.7@user/stable") + + def build(self): + cmake = CMake(self) + cmake.configure() # equivalent to self.run("cmake . ") + cmake.build() # equivalent to self.run("cmake --build . ") + cmake.test() # equivalent to self.run("cmake --target=RUN_TESTS") + diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index bad59c64f61..79bfd2d4faf 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -24,7 +24,7 @@ macro(define_example TARGET_NAME) # A macro is executed in the caller's sc set_target_properties(${TARGET_NAME} PROPERTIES CXX_EXTENSIONS OFF) set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${BIN_DIR}") set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${BIN_DIR}") - of_copy_runtime_to_bin_dir_after_build(${TARGET_NAME} "${BIN_DIR}") + # of_copy_runtime_to_bin_dir_after_build(${TARGET_NAME} "${BIN_DIR}") get_filename_component(parent_path ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) get_filename_component(example_name ${parent_path} NAME) diff --git a/examples/input_output/CMakeLists.txt b/examples/input_output/CMakeLists.txt index b4ee75cc45d..925ac85fb84 100644 --- a/examples/input_output/CMakeLists.txt +++ b/examples/input_output/CMakeLists.txt @@ -13,7 +13,7 @@ add_subdirectory(jsonExample) add_subdirectory(loadTextFileExample) add_subdirectory(pdfExample) add_subdirectory(pugiXmlExample) -add_subdirectory(svgExample) +# add_subdirectory(svgExample) add_subdirectory(systemSpeakExample) add_subdirectory(xmlExample) -add_subdirectory(xmlSettingsExample) +# add_subdirectory(xmlSettingsExample) diff --git a/examples/input_output/pdfExample/CMakeLists.txt b/examples/input_output/pdfExample/CMakeLists.txt index 71c0b4a610a..2051966a8bd 100644 --- a/examples/input_output/pdfExample/CMakeLists.txt +++ b/examples/input_output/pdfExample/CMakeLists.txt @@ -1,2 +1,2 @@ define_example(pdfExample) -target_link_libraries(pdfExample of::cairo) \ No newline at end of file +target_link_libraries(pdfExample) diff --git a/examples/templates/CMakeLists.txt b/examples/templates/CMakeLists.txt index 72ab508f93e..14c8de78dbe 100644 --- a/examples/templates/CMakeLists.txt +++ b/examples/templates/CMakeLists.txt @@ -1,3 +1,3 @@ -add_subdirectory(allAddonsExample) +# add_subdirectory(allAddonsExample) add_subdirectory(emptyExample) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ac8057d82af..9428890b368 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -17,7 +17,7 @@ function(define_test TARGET_NAME) # A CMake function li set_target_properties(${TARGET_NAME} PROPERTIES CXX_EXTENSIONS OFF) set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${BIN_DIR}") set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${BIN_DIR}") - of_copy_runtime_to_bin_dir_after_build(${TARGET_NAME} "${BIN_DIR}") + # of_copy_runtime_to_bin_dir_after_build(${TARGET_NAME} "${BIN_DIR}") get_filename_component(parent_path ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) get_filename_component(test_name ${parent_path} NAME)