From 318ecf07ec72fdedcbfa76cce1c45c3e82dea320 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Thu, 2 Mar 2023 16:39:47 +0100 Subject: [PATCH 01/49] Added CPM.cmake package manager and download_deps.cmake and utils --- cmake/CPM.cmake | 1131 +++++++++++++++++++++++++++++++++++++ cmake/download_deps.cmake | 106 ++++ cmake/utils.cmake | 22 + 3 files changed, 1259 insertions(+) create mode 100644 cmake/CPM.cmake create mode 100644 cmake/download_deps.cmake create mode 100644 cmake/utils.cmake diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake new file mode 100644 index 00000000000..c01a5b221a9 --- /dev/null +++ b/cmake/CPM.cmake @@ -0,0 +1,1131 @@ +# 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_deps.cmake b/cmake/download_deps.cmake new file mode 100644 index 00000000000..d4786f3cf4e --- /dev/null +++ b/cmake/download_deps.cmake @@ -0,0 +1,106 @@ +include(FetchContent) +include(${CMAKE_CURRENT_LIST_DIR}/utils.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/CPM.cmake) + +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, androidarm7, androidarm64, androidx86, ios, tvos, macos, msys-mingw, msys-clang, msys-ucrt, mingw, linux64, linuxarmv6l, linuxarmv7l") + +if(OF_TARGET_ARCHITECTURE STREQUAL "auto") + if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) + message(FATAL_ERROR "OpenFrameworks does no longer support 32-bit build systems. Please upgrade your compiler to 64-bit.") + endif() + + message(STATUS "Auto-detecting platform...") + + if (MSVC) + set(OF_TARGET_ARCHITECTURE "msvc" CACHE STRING "" FORCE) + elseif (ANDROID) + set(OF_TARGET_ARCHITECTURE "androidarm7" CACHE STRING "" FORCE) + # androidx86 and androidarm64 must be specified manually + elseif (APPLE) + if (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 (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='. Possible values are: ${_AVAILABLE_ARCHITECTURES}.") + endif() + +endif() + +# Macro to download and extract the dependency archive +function(make_dependencies_available) + #Set(FETCHCONTENT_QUIET FALSE) + message(STATUS "[openframeworks] Using ${OF_TARGET_ARCHITECTURE} toolchain, downloading dependencies") + foreach(dependency IN LISTS ARGN) + set(_URL "http://ci.openframeworks.cc/libs/openFrameworksLibs_master_${dependency}") + #message(STATUS "[openframeworks] Fetching ${_URL}") + CPMAddPackage( + NAME of-deps-${dependency} + URL ${_URL} + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + DOWNLOAD_ONLY YES + ) + endforeach() + #Set(FETCHCONTENT_QUIET TRUE) +endfunction() + +# And now download the archives, depending on the platform we're on +if (OF_TARGET_ARCHITECTURE STREQUAL "msvc") + make_dependencies_available("vs2017_64_1.zip" "vs2017_64_2.zip" "vs2017_64_3.zip" "vs2017_64_4.zip") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm7") + make_dependencies_available("androidarmv7.tar.bz2") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm64") + make_dependencies_available("androidarm64.tar.bz2") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidx86") + make_dependencies_available("androidx86.tar.bz2") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "ios") + make_dependencies_available("ios1.tar.bz2" "ios2.tar.bz2" "ios3.tar.bz2" "ios4.tar.bz2") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "tvos") + make_dependencies_available("tvos1.tar.bz2" "tvos2.tar.bz2" "tvos3.tar.bz2" "tvos4.tar.bz2") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "macos") + make_dependencies_available("osx1.tar.bz2" "osx2.tar.bz2" "osx3.tar.bz2" "osx4.tar.bz2") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-mingw") + make_dependencies_available("msys2_mingw64.zip") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-ucrt") + make_dependencies_available("msys2_ucrt64.zip") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-clang") + make_dependencies_available("msys2_clang64.zip") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "mingw") + make_dependencies_available("msys2_mingw64.zip") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "linux64") + make_dependencies_available("linux64gcc6.tar.bz2") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv6l") + make_dependencies_available("linuxarmv6l.tar.bz2") + +elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv7l") + make_dependencies_available("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() \ No newline at end of file diff --git a/cmake/utils.cmake b/cmake/utils.cmake new file mode 100644 index 00000000000..12ad7f2bebf --- /dev/null +++ b/cmake/utils.cmake @@ -0,0 +1,22 @@ + +# This function test-compiles a tiny program to see if a definition is defined or not (compiler internal) +function(TEST_IF_DEFINED OUTPUT_VAR DEFINE) + + set(SOURCE " + #ifndef ${DEFINE} + #error + #endif + int main() {}" + ) + + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/try_compile/main.cpp ${SOURCE}) + + try_compile( + ${OUTPUT_VAR} + ${CMAKE_CURRENT_BINARY_DIR}/try_compile/ + ${CMAKE_CURRENT_BINARY_DIR}/try_compile/main.cpp + ) + + file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/try_compile) + +endfunction() \ No newline at end of file From 0719b68a324c2a516df068f8b07f09f7e9c48cee Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sat, 4 Mar 2023 20:12:46 +0100 Subject: [PATCH 02/49] Implemented CMake support for the core library --- CMakeLists.txt | 58 ++++++++++++++++++++ cmake/download_deps.cmake | 85 ++++++++++++++++++++++++------ libs/openFrameworks/CMakeLists.txt | 24 +++++++++ 3 files changed, 150 insertions(+), 17 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 libs/openFrameworks/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000000..844137da9ba --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,58 @@ +cmake_minimum_required(VERSION 3.25) +project(openframeworks) + +# Here are all the options you can set for customizing your build +#set(OF_WINDOW_PROVIDER "GLFW" CACHE STRING "The preferred window manager to use: GLFW, GLUT, EGL, NONE") +option(BUILD_SHARED_LIBS "Build OF as a shared library instead of a static one" OFF) + +# This defines the actual library +if (BUILD_SHARED_LIBS) + add_library(openframeworks-core SHARED) +else() + add_library(openframeworks-core STATIC) +endif() +add_library(openframeworks::core ALIAS openframeworks-core) + +# C++ standard version +target_compile_features(openframeworks-core PUBLIC cxx_std_17) + +# Preprocessor defines +target_compile_definitions(openframeworks-core PUBLIC + OF_USING_STD_FS # Use the new C++17 filesystem library instead of boost + UNICODE # WinAPI setup + _UNICODE +) + +# if(OF_WINDOW_PROVIDER STREQUAL "GLFW") +# target_compile_definitions(openframeworks-core PUBLIC TARGET_GLFW_WINDOW) +# elseif(OF_WINDOW_PROVIDER STREQUAL "GLUT") + +if(MSVC) + target_compile_options(openframeworks-core PUBLIC "/Zc:__cplusplus") # Force MSVC to set macro correctly + target_compile_options(openframeworks-core PUBLIC "/MP") # Enable multi-core compilation +endif() + +# This is another CMake script that adds the source files +add_subdirectory(libs/openFrameworks) + +# This downloads and configures the dependencies for us +include(${CMAKE_CURRENT_LIST_DIR}/cmake/download_deps.cmake) + +# And link to all the dependencies we depend upon +target_link_libraries(openframeworks-core + openframeworks::glew + openframeworks::tess2 + openframeworks::cairo + openframeworks::glm + openframeworks::utf8 + openframeworks::glfw + openframeworks::glut + openframeworks::fmod + openframeworks::FreeImage + openframeworks::rtAudio + openframeworks::videoInput + openframeworks::uriparser + openframeworks::curl + openframeworks::freetype + openframeworks::pugixml +) \ No newline at end of file diff --git a/cmake/download_deps.cmake b/cmake/download_deps.cmake index d4786f3cf4e..5c62bf00cba 100644 --- a/cmake/download_deps.cmake +++ b/cmake/download_deps.cmake @@ -5,7 +5,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/CPM.cmake) 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, androidarm7, androidarm64, androidx86, ios, tvos, macos, msys-mingw, msys-clang, msys-ucrt, mingw, linux64, linuxarmv6l, linuxarmv7l") +set(_AVAILABLE_ARCHITECTURES "msvc, androidarm7, 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) @@ -16,6 +16,8 @@ if(OF_TARGET_ARCHITECTURE STREQUAL "auto") if (MSVC) set(OF_TARGET_ARCHITECTURE "msvc" CACHE STRING "" FORCE) + elseif (EMSCRIPTEN) + set(OF_TARGET_ARCHITECTURE "emscripten" CACHE STRING "" FORCE) elseif (ANDROID) set(OF_TARGET_ARCHITECTURE "androidarm7" CACHE STRING "" FORCE) # androidx86 and androidarm64 must be specified manually @@ -41,66 +43,115 @@ if(OF_TARGET_ARCHITECTURE STREQUAL "auto") endif() + # Macro to download and extract the dependency archive -function(make_dependencies_available) +function(get_dependency_and_link) #Set(FETCHCONTENT_QUIET FALSE) message(STATUS "[openframeworks] Using ${OF_TARGET_ARCHITECTURE} toolchain, downloading dependencies") foreach(dependency IN LISTS ARGN) set(_URL "http://ci.openframeworks.cc/libs/openFrameworksLibs_master_${dependency}") #message(STATUS "[openframeworks] Fetching ${_URL}") + + # Download and extract the compressed archive CPMAddPackage( NAME of-deps-${dependency} URL ${_URL} DOWNLOAD_EXTRACT_TIMESTAMP TRUE DOWNLOAD_ONLY YES ) + + # Now, create the targets and link all files to them + file(GLOB deps "${of-deps-${dependency}_SOURCE_DIR}/**") + foreach(dep_root IN LISTS deps) # <- looping over all dependencies in each binary package + get_filename_component(dep_name ${dep_root} NAME) + set(target_name of-deps-${dep_name}) + + # Declaring the target for each dependency so we can later link to it one by one + add_library(${target_name} STATIC IMPORTED) + add_library(openframeworks::${dep_name} ALIAS ${target_name}) + + # Header file directories + if (${dep_name} STREQUAL "cairo") # Unfortunately cairo and freetype are inconsistent in the apothecary + target_include_directories(${target_name} INTERFACE ${dep_root}/include/cairo) + elseif(${dep_name} STREQUAL "freetype") + target_include_directories(${target_name} INTERFACE ${dep_root}/include/freetype2) + else() + target_include_directories(${target_name} INTERFACE ${dep_root}/include) + endif() + + # Now we link to every static library file found in the given dependency's folder + file(GLOB_RECURSE libraries "${of-deps-${dependency}_SOURCE_DIR}/**/${CMAKE_STATIC_LIBRARY_PREFIX}**${CMAKE_STATIC_LIBRARY_SUFFIX}") + foreach(lib IN LISTS libraries) + set_target_properties(${target_name} PROPERTIES IMPORTED_LOCATION ${lib}) + endforeach() + endforeach() + endforeach() #Set(FETCHCONTENT_QUIET TRUE) endfunction() + # And now download the archives, depending on the platform we're on if (OF_TARGET_ARCHITECTURE STREQUAL "msvc") - make_dependencies_available("vs2017_64_1.zip" "vs2017_64_2.zip" "vs2017_64_3.zip" "vs2017_64_4.zip") + get_dependency_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 + message(SEND_ERROR "Emscripten dependencies are not yet implemented in CMake! Please edit cmake/download_deps.cmake to add support yourself!") + get_dependency_and_link() elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm7") - make_dependencies_available("androidarmv7.tar.bz2") + get_dependency_and_link("androidarmv7.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm64") - make_dependencies_available("androidarm64.tar.bz2") + get_dependency_and_link("androidarm64.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidx86") - make_dependencies_available("androidx86.tar.bz2") + get_dependency_and_link("androidx86.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "ios") - make_dependencies_available("ios1.tar.bz2" "ios2.tar.bz2" "ios3.tar.bz2" "ios4.tar.bz2") + get_dependency_and_link("ios1.tar.bz2" "ios2.tar.bz2" "ios3.tar.bz2" "ios4.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "tvos") - make_dependencies_available("tvos1.tar.bz2" "tvos2.tar.bz2" "tvos3.tar.bz2" "tvos4.tar.bz2") + get_dependency_and_link("tvos1.tar.bz2" "tvos2.tar.bz2" "tvos3.tar.bz2" "tvos4.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "macos") - make_dependencies_available("osx1.tar.bz2" "osx2.tar.bz2" "osx3.tar.bz2" "osx4.tar.bz2") + get_dependency_and_link("osx1.tar.bz2" "osx2.tar.bz2" "osx3.tar.bz2" "osx4.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-mingw") - make_dependencies_available("msys2_mingw64.zip") + get_dependency_and_link("msys2_mingw64.zip") elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-ucrt") - make_dependencies_available("msys2_ucrt64.zip") + get_dependency_and_link("msys2_ucrt64.zip") elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-clang") - make_dependencies_available("msys2_clang64.zip") + get_dependency_and_link("msys2_clang64.zip") elseif (OF_TARGET_ARCHITECTURE STREQUAL "mingw") - make_dependencies_available("msys2_mingw64.zip") + get_dependency_and_link("msys2_mingw64.zip") elseif (OF_TARGET_ARCHITECTURE STREQUAL "linux64") - make_dependencies_available("linux64gcc6.tar.bz2") + get_dependency_and_link("linux64gcc6.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv6l") - make_dependencies_available("linuxarmv6l.tar.bz2") + get_dependency_and_link("linuxarmv6l.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv7l") - make_dependencies_available("linuxarmv7l.tar.bz2") + get_dependency_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() \ No newline at end of file +endif() + + + +# TODO: Now, download glut since it's somehow not part of the apothecary. Glut support seems to be deprecated +CPMAddPackage( + NAME of-deps-glut + GIT_REPOSITORY "https://github.com/markkilgard/glut" + GIT_TAG "8cd96cb440f1f2fac3a154227937be39d06efa53" + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + DOWNLOAD_ONLY YES +) +add_library(of-deps-glut INTERFACE) +add_library(openframeworks::glut ALIAS of-deps-glut) +target_include_directories(of-deps-glut INTERFACE ${of-deps-glut_SOURCE_DIR}/include/GL) diff --git a/libs/openFrameworks/CMakeLists.txt b/libs/openFrameworks/CMakeLists.txt new file mode 100644 index 00000000000..26e5716d9bd --- /dev/null +++ b/libs/openFrameworks/CMakeLists.txt @@ -0,0 +1,24 @@ + +# A macro that will add all the files in the given module directory +macro(add_module MODULE_NAME) + target_include_directories(openframeworks-core PUBLIC ${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}) # Include directory + file(GLOB OF_SOURCES "${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}/**") # Find and add all the source files + target_sources(openframeworks-core PRIVATE ${OF_SOURCES}) + + # Find all obj-c files and exclude them from parallel builds + #file(GLOB OBJC_FILES "${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}/**.m") + #set_source_files_properties(${OBJC_FILES} PROPERTIES COMPILE_FLAGS "/MP") + # TODO: Implement parallel builds in MSVC!!! +endmacro() + +add_module(3d) +add_module(app) +add_module(communication) +add_module(events) +add_module(gl) +add_module(graphics) +add_module(math) +add_module(sound) +add_module(types) +add_module(utils) +add_module(video) From 6022ad6f59d2388e214194f66934424484736fc0 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sat, 4 Mar 2023 20:14:13 +0100 Subject: [PATCH 03/49] Add compile guards around source files --- libs/openFrameworks/app/ofAppEGLWindow.cpp | 7 +++++++ libs/openFrameworks/video/ofAVFoundationGrabber.mm | 6 ++++++ libs/openFrameworks/video/ofAVFoundationPlayer.mm | 7 +++++++ libs/openFrameworks/video/ofAVFoundationVideoPlayer.m | 6 ++++++ libs/openFrameworks/video/ofGstUtils.cpp | 6 ++++++ libs/openFrameworks/video/ofGstVideoGrabber.cpp | 5 +++++ libs/openFrameworks/video/ofGstVideoPlayer.cpp | 5 +++++ 7 files changed, 42 insertions(+) diff --git a/libs/openFrameworks/app/ofAppEGLWindow.cpp b/libs/openFrameworks/app/ofAppEGLWindow.cpp index dcc2660b6b2..acf6eae23c6 100644 --- a/libs/openFrameworks/app/ofAppEGLWindow.cpp +++ b/libs/openFrameworks/app/ofAppEGLWindow.cpp @@ -1,3 +1,8 @@ + +#include "ofConstants.h" + +#ifdef TARGET_OPENGLES + #include "ofAppEGLWindow.h" #include "ofGraphics.h" // used in runAppViaInfiniteLoop() @@ -2300,3 +2305,5 @@ void ofAppEGLWindow::handleX11Event(const XEvent& event){ }*/ } } + +#endif // TARGET_OPENGLES diff --git a/libs/openFrameworks/video/ofAVFoundationGrabber.mm b/libs/openFrameworks/video/ofAVFoundationGrabber.mm index 47ed71330c9..17ffc8bf595 100644 --- a/libs/openFrameworks/video/ofAVFoundationGrabber.mm +++ b/libs/openFrameworks/video/ofAVFoundationGrabber.mm @@ -2,6 +2,10 @@ * ofAVFoundationGrabber.mm */ +#include "ofConstants.h" + +#ifdef OF_VIDEO_PLAYER_AVFOUNDATION + #include "ofAVFoundationGrabber.h" #include "ofVectorMath.h" #include "ofRectangle.h" @@ -538,3 +542,5 @@ - (void)eraseGrabberPtr { } #endif + +#endif // OF_VIDEO_PLAYER_AVFOUNDATION diff --git a/libs/openFrameworks/video/ofAVFoundationPlayer.mm b/libs/openFrameworks/video/ofAVFoundationPlayer.mm index 24c78410de0..02fd3147169 100644 --- a/libs/openFrameworks/video/ofAVFoundationPlayer.mm +++ b/libs/openFrameworks/video/ofAVFoundationPlayer.mm @@ -5,6 +5,11 @@ // //-------------------------------------------------------------- + +#include "ofConstants.h" + +#ifdef OF_VIDEO_PLAYER_AVFOUNDATION + #import "ofAVFoundationPlayer.h" #import "ofAVFoundationVideoPlayer.h" #include "ofRectangle.h" @@ -777,3 +782,5 @@ ofTexture * ofAVFoundationPlayer::getTexture() { return getTexturePtr(); } + +#endif // OF_VIDEO_PLAYER_AVFOUNDATION diff --git a/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m b/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m index b33ea7ee280..c504124a648 100644 --- a/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m +++ b/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m @@ -4,6 +4,10 @@ // Merged with code by Sam Kronick, James George and Elie Zananiri. // +#include "ofConstants.h" + +#ifdef OF_VIDEO_PLAYER_AVFOUNDATION + #import "ofAVFoundationVideoPlayer.h" #define IS_OS_6_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) @@ -1447,3 +1451,5 @@ - (void)setStreaming:(BOOL)value { } @end + +#endif // OF_VIDEO_PLAYER_AVFOUNDATION diff --git a/libs/openFrameworks/video/ofGstUtils.cpp b/libs/openFrameworks/video/ofGstUtils.cpp index 4ab125d692f..712d1daab1c 100644 --- a/libs/openFrameworks/video/ofGstUtils.cpp +++ b/libs/openFrameworks/video/ofGstUtils.cpp @@ -1,3 +1,7 @@ + +#include "ofConstants.h" +#if defined( TARGET_LINUX ) && defined (OF_USING_GTK) + #include "ofGstUtils.h" #ifndef TARGET_ANDROID #include @@ -1455,3 +1459,5 @@ void ofGstVideoUtils::eos_cb(){ } #endif + +#endif // defined( TARGET_LINUX ) && defined (OF_USING_GTK) diff --git a/libs/openFrameworks/video/ofGstVideoGrabber.cpp b/libs/openFrameworks/video/ofGstVideoGrabber.cpp index 16034419b0e..0a387278348 100644 --- a/libs/openFrameworks/video/ofGstVideoGrabber.cpp +++ b/libs/openFrameworks/video/ofGstVideoGrabber.cpp @@ -5,6 +5,9 @@ * Author: arturo */ +#include "ofConstants.h" +#if defined( TARGET_LINUX ) && defined (OF_USING_GTK) + #include "ofGstVideoGrabber.h" #include "ofPixels.h" @@ -858,3 +861,5 @@ float ofGstVideoGrabber::getWidth() const { void ofGstVideoGrabber::close(){ videoUtils.close(); } + +#endif // defined( TARGET_LINUX ) && defined (OF_USING_GTK) diff --git a/libs/openFrameworks/video/ofGstVideoPlayer.cpp b/libs/openFrameworks/video/ofGstVideoPlayer.cpp index 0f14dd3d608..11aa71d118b 100644 --- a/libs/openFrameworks/video/ofGstVideoPlayer.cpp +++ b/libs/openFrameworks/video/ofGstVideoPlayer.cpp @@ -5,6 +5,9 @@ * Author: arturo */ +#include "ofConstants.h" +#if defined( TARGET_LINUX ) && defined (OF_USING_GTK) + #include "ofGstVideoPlayer.h" #include #include @@ -458,3 +461,5 @@ bool ofGstVideoPlayer::isThreadedAppSink() const{ bool ofGstVideoPlayer::isFrameByFrame() const{ return videoUtils.isFrameByFrame(); } + +#endif // defined( TARGET_LINUX ) && defined (OF_USING_GTK) From c052a86868f4c98289573b65febefbe91d0238c2 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 5 Mar 2023 22:04:08 +0100 Subject: [PATCH 04/49] CMake support for some addons and examples --- CMakeLists.txt | 107 ++++++++++++------ addons/.gitignore | 1 + addons/CMakeLists.txt | 33 ++++++ addons/ofxAssimpModelLoader/CMakeLists.txt | 5 + addons/ofxGui/CMakeLists.txt | 3 + addons/ofxOpenCv/CMakeLists.txt | 5 + addons/ofxOsc/CMakeLists.txt | 7 ++ cmake/download_deps.cmake | 74 +++++------- cmake/import_deps.cmake | 78 +++++++++++++ cmake/utils.cmake | 6 +- .../3d/3DModelLoaderExample/CMakeLists.txt | 7 ++ .../3d/3DPrimitivesExample/CMakeLists.txt | 5 + examples/3d/CMakeLists.txt | 20 ++++ examples/3d/advanced3dExample/CMakeLists.txt | 3 + examples/3d/assimpExample/CMakeLists.txt | 5 + .../3d/cameraLensOffsetExample/CMakeLists.txt | 7 ++ .../3d/cameraParentingExample/CMakeLists.txt | 3 + .../3d/cameraRibbonExample/CMakeLists.txt | 3 + examples/3d/easyCamExample/CMakeLists.txt | 3 + .../3d/meshFromCameraExample/CMakeLists.txt | 3 + examples/3d/modelNoiseExample/CMakeLists.txt | 5 + examples/3d/normalsExample/CMakeLists.txt | 3 + examples/3d/ofBoxExample/CMakeLists.txt | 3 + examples/3d/ofNodeExample/CMakeLists.txt | 12 ++ examples/3d/orientationExample/CMakeLists.txt | 3 + .../3d/pathsToMeshesExample/CMakeLists.txt | 5 + examples/3d/pointCloudExample/CMakeLists.txt | 5 + examples/3d/pointPickerExample/CMakeLists.txt | 5 + .../quaternionArcballExample/CMakeLists.txt | 3 + .../quaternionLatLongExample/CMakeLists.txt | 5 + examples/CMakeLists.txt | 51 +++++++++ examples/gui/CMakeLists.txt | 5 + examples/gui/guiExample/CMakeLists.txt | 7 ++ .../guiFromParametersExample/CMakeLists.txt | 7 ++ .../CMakeLists.txt | 5 + .../oscParametersSenderExample/CMakeLists.txt | 5 + examples/sound/CMakeLists.txt | 3 + .../sound/audioInputExample/CMakeLists.txt | 3 + .../sound/audioOutputExample/CMakeLists.txt | 3 + libs/openFrameworks/CMakeLists.txt | 24 ---- libs/openFrameworks/ofSources.cmake | 25 ++++ tests/CMakeLists.txt | 1 + 42 files changed, 466 insertions(+), 100 deletions(-) create mode 100644 addons/CMakeLists.txt create mode 100644 addons/ofxAssimpModelLoader/CMakeLists.txt create mode 100644 addons/ofxGui/CMakeLists.txt create mode 100644 addons/ofxOpenCv/CMakeLists.txt create mode 100644 addons/ofxOsc/CMakeLists.txt create mode 100644 cmake/import_deps.cmake create mode 100644 examples/3d/3DModelLoaderExample/CMakeLists.txt create mode 100644 examples/3d/3DPrimitivesExample/CMakeLists.txt create mode 100644 examples/3d/CMakeLists.txt create mode 100644 examples/3d/advanced3dExample/CMakeLists.txt create mode 100644 examples/3d/assimpExample/CMakeLists.txt create mode 100644 examples/3d/cameraLensOffsetExample/CMakeLists.txt create mode 100644 examples/3d/cameraParentingExample/CMakeLists.txt create mode 100644 examples/3d/cameraRibbonExample/CMakeLists.txt create mode 100644 examples/3d/easyCamExample/CMakeLists.txt create mode 100644 examples/3d/meshFromCameraExample/CMakeLists.txt create mode 100644 examples/3d/modelNoiseExample/CMakeLists.txt create mode 100644 examples/3d/normalsExample/CMakeLists.txt create mode 100644 examples/3d/ofBoxExample/CMakeLists.txt create mode 100644 examples/3d/ofNodeExample/CMakeLists.txt create mode 100644 examples/3d/orientationExample/CMakeLists.txt create mode 100644 examples/3d/pathsToMeshesExample/CMakeLists.txt create mode 100644 examples/3d/pointCloudExample/CMakeLists.txt create mode 100644 examples/3d/pointPickerExample/CMakeLists.txt create mode 100644 examples/3d/quaternionArcballExample/CMakeLists.txt create mode 100644 examples/3d/quaternionLatLongExample/CMakeLists.txt create mode 100644 examples/CMakeLists.txt create mode 100644 examples/gui/CMakeLists.txt create mode 100644 examples/gui/guiExample/CMakeLists.txt create mode 100644 examples/gui/guiFromParametersExample/CMakeLists.txt create mode 100644 examples/gui/oscParametersReceiverExample/CMakeLists.txt create mode 100644 examples/gui/oscParametersSenderExample/CMakeLists.txt create mode 100644 examples/sound/CMakeLists.txt create mode 100644 examples/sound/audioInputExample/CMakeLists.txt create mode 100644 examples/sound/audioOutputExample/CMakeLists.txt delete mode 100644 libs/openFrameworks/CMakeLists.txt create mode 100644 libs/openFrameworks/ofSources.cmake create mode 100644 tests/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 844137da9ba..7140a466ba1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,58 +1,101 @@ cmake_minimum_required(VERSION 3.25) project(openframeworks) +include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) + +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + message(FATAL_ERROR "In-source builds are a really bad idea. If you don't know what you're doing, please create a 'build' folder and call 'cmake ..' from within.") +endif() + +if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) + set(OF_IS_MAIN_PROJECT ON) +else() + set(OF_IS_MAIN_PROJECT OFF) +endif() # Here are all the options you can set for customizing your build -#set(OF_WINDOW_PROVIDER "GLFW" CACHE STRING "The preferred window manager to use: GLFW, GLUT, EGL, NONE") option(BUILD_SHARED_LIBS "Build OF as a shared library instead of a static one" OFF) +option(BUILD_EXAMPLES "Add all OpenFrameworks examples to the project" ${OF_IS_MAIN_PROJECT}) +option(BUILD_TESTS "Add all OpenFrameworks examples to the project" ${OF_IS_MAIN_PROJECT}) # This defines the actual library if (BUILD_SHARED_LIBS) - add_library(openframeworks-core SHARED) + add_library(openframeworks SHARED) else() - add_library(openframeworks-core STATIC) + add_library(openframeworks STATIC) endif() -add_library(openframeworks::core ALIAS openframeworks-core) +add_library(of::openframeworks ALIAS openframeworks) -# C++ standard version -target_compile_features(openframeworks-core PUBLIC cxx_std_17) +# This is another CMake script that adds the header locations and source files +include(${CMAKE_CURRENT_LIST_DIR}/libs/openFrameworks/ofSources.cmake) + +# C++ standard version and disabling non-standard compiler specific features +target_compile_features(openframeworks PUBLIC cxx_std_17) +set_target_properties(openframeworks PROPERTIES CXX_EXTENSIONS OFF) # Preprocessor defines -target_compile_definitions(openframeworks-core PUBLIC +target_compile_definitions(openframeworks PUBLIC OF_USING_STD_FS # Use the new C++17 filesystem library instead of boost UNICODE # WinAPI setup _UNICODE + CURL_STATICLIB + POCO_STATIC ) -# if(OF_WINDOW_PROVIDER STREQUAL "GLFW") -# target_compile_definitions(openframeworks-core PUBLIC TARGET_GLFW_WINDOW) -# elseif(OF_WINDOW_PROVIDER STREQUAL "GLUT") - +# Compiler flags specific to MSVC if(MSVC) - target_compile_options(openframeworks-core PUBLIC "/Zc:__cplusplus") # Force MSVC to set macro correctly - target_compile_options(openframeworks-core PUBLIC "/MP") # Enable multi-core compilation + target_compile_options(openframeworks PUBLIC "/Zc:__cplusplus") # Force MSVC to set macro correctly + target_compile_options(openframeworks PUBLIC "/MP") # Enable multi-core compilation + # Ignore linker warning that no .pdb file is available for debugging + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ignore:4099 /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRT") endif() -# This is another CMake script that adds the source files -add_subdirectory(libs/openFrameworks) +# Output everything into a bin folder +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +# Folder layout in Visual Studio & Co +set_target_properties(openframeworks PROPERTIES FOLDER "openframeworks") # This downloads and configures the dependencies for us include(${CMAKE_CURRENT_LIST_DIR}/cmake/download_deps.cmake) # And link to all the dependencies we depend upon -target_link_libraries(openframeworks-core - openframeworks::glew - openframeworks::tess2 - openframeworks::cairo - openframeworks::glm - openframeworks::utf8 - openframeworks::glfw - openframeworks::glut - openframeworks::fmod - openframeworks::FreeImage - openframeworks::rtAudio - openframeworks::videoInput - openframeworks::uriparser - openframeworks::curl - openframeworks::freetype - openframeworks::pugixml -) \ No newline at end of file +target_link_libraries(openframeworks + of::glew + of::tess2 + of::cairo + of::glm + of::utf8 + of::glfw + of::glut + of::fmod + of::FreeImage + of::rtAudio + of::videoInput + of::uriparser + of::openssl + of::curl + of::freetype + of::pugixml + of::json +) + +if(WIN32) # Linking to WinAPI system libraries + target_link_libraries(openframeworks winmm ws2_32 wldap32 crypt32 dsound.lib) +endif() + +# Other dependencies +find_package(OpenGL) +target_include_directories(openframeworks PUBLIC ${OPENGL_INCLUDE_DIRS}) +target_link_libraries(openframeworks ${OPENGL_LIBRARIES}) + +add_subdirectory(addons) + +if (BUILD_EXAMPLES) + add_subdirectory(examples) +endif() + +if (BUILD_TESTS) + add_subdirectory(tests) +endif() diff --git a/addons/.gitignore b/addons/.gitignore index 78cd0281e3f..da510f55cdc 100644 --- a/addons/.gitignore +++ b/addons/.gitignore @@ -33,6 +33,7 @@ ofxAssimpModelLoader/libs ofxSvg/libs ofxPoco/libs ofxKinect/libs +!CMakeLists.txt # don't ignore the .gitignore file !.gitignore diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt new file mode 100644 index 00000000000..b34ead18c31 --- /dev/null +++ b/addons/CMakeLists.txt @@ -0,0 +1,33 @@ + +function(define_addon TARGET_NAME) + add_library(${TARGET_NAME} STATIC) + add_library(of::${TARGET_NAME} ALIAS ${TARGET_NAME}) + + target_sources(${TARGET_NAME} PRIVATE ${ARGN}) + target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) + target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) + + target_compile_features(${TARGET_NAME} PUBLIC cxx_std_17) + set_target_properties(${TARGET_NAME} PROPERTIES CXX_EXTENSIONS OFF) + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/addons") + + target_link_libraries(${TARGET_NAME} of::openframeworks) +endfunction() + +# add_subdirectory(ofxAccelerometer) +# add_subdirectory(ofxAndroid) +add_subdirectory(ofxAssimpModelLoader) +# add_subdirectory(ofxEmscripten) +# add_subdirectory(ofxGPS) +add_subdirectory(ofxGui) +# add_subdirectory(ofxiOS) +# add_subdirectory(ofxKinect) +# add_subdirectory(ofxNetwork) +add_subdirectory(ofxOpenCv) +add_subdirectory(ofxOsc) +# add_subdirectory(ofxPoco) +# add_subdirectory(ofxSvg) +# add_subdirectory(ofxThreadedImageLoader) +# add_subdirectory(ofxUnitTests) +# add_subdirectory(ofxVectorGraphics) +# add_subdirectory(ofxXmlSettings) \ No newline at end of file diff --git a/addons/ofxAssimpModelLoader/CMakeLists.txt b/addons/ofxAssimpModelLoader/CMakeLists.txt new file mode 100644 index 00000000000..2982f5eab20 --- /dev/null +++ b/addons/ofxAssimpModelLoader/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**.cpp) +define_addon(ofxAssimpModelLoader ${SOURCES}) + +target_link_libraries(ofxAssimpModelLoader of::assimp) diff --git a/addons/ofxGui/CMakeLists.txt b/addons/ofxGui/CMakeLists.txt new file mode 100644 index 00000000000..b835c97e02b --- /dev/null +++ b/addons/ofxGui/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**.cpp) +define_addon(ofxGui ${SOURCES}) diff --git a/addons/ofxOpenCv/CMakeLists.txt b/addons/ofxOpenCv/CMakeLists.txt new file mode 100644 index 00000000000..18d66de99d3 --- /dev/null +++ b/addons/ofxOpenCv/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**.cpp) +define_addon(ofxOpenCv ${SOURCES}) + +target_link_libraries(ofxOpenCv of::opencv of::ippicv) diff --git a/addons/ofxOsc/CMakeLists.txt b/addons/ofxOsc/CMakeLists.txt new file mode 100644 index 00000000000..ea117e4c5c9 --- /dev/null +++ b/addons/ofxOsc/CMakeLists.txt @@ -0,0 +1,7 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**.cpp) +define_addon(ofxOsc ${SOURCES}) + +target_include_directories(ofxOsc PUBLIC ${CMAKE_CURRENT_LIST_DIR}/libs/oscpack/src/osc) +target_include_directories(ofxOsc PUBLIC ${CMAKE_CURRENT_LIST_DIR}/libs/oscpack/src/ip) +target_include_directories(ofxOsc PUBLIC ${CMAKE_CURRENT_LIST_DIR}/libs/oscpack/src) diff --git a/cmake/download_deps.cmake b/cmake/download_deps.cmake index 5c62bf00cba..83374902dc7 100644 --- a/cmake/download_deps.cmake +++ b/cmake/download_deps.cmake @@ -1,5 +1,6 @@ include(FetchContent) include(${CMAKE_CURRENT_LIST_DIR}/utils.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/import_deps.cmake) include(${CMAKE_CURRENT_LIST_DIR}/CPM.cmake) set(OF_TARGET_ARCHITECTURE "auto" CACHE STRING "The target platform for openFrameworks. 'auto' to detect automatically") @@ -43,9 +44,7 @@ if(OF_TARGET_ARCHITECTURE STREQUAL "auto") endif() - -# Macro to download and extract the dependency archive -function(get_dependency_and_link) +function(get_packages_and_link) #Set(FETCHCONTENT_QUIET FALSE) message(STATUS "[openframeworks] Using ${OF_TARGET_ARCHITECTURE} toolchain, downloading dependencies") foreach(dependency IN LISTS ARGN) @@ -61,82 +60,63 @@ function(get_dependency_and_link) ) # Now, create the targets and link all files to them - file(GLOB deps "${of-deps-${dependency}_SOURCE_DIR}/**") - foreach(dep_root IN LISTS deps) # <- looping over all dependencies in each binary package - get_filename_component(dep_name ${dep_root} NAME) - set(target_name of-deps-${dep_name}) - - # Declaring the target for each dependency so we can later link to it one by one - add_library(${target_name} STATIC IMPORTED) - add_library(openframeworks::${dep_name} ALIAS ${target_name}) - - # Header file directories - if (${dep_name} STREQUAL "cairo") # Unfortunately cairo and freetype are inconsistent in the apothecary - target_include_directories(${target_name} INTERFACE ${dep_root}/include/cairo) - elseif(${dep_name} STREQUAL "freetype") - target_include_directories(${target_name} INTERFACE ${dep_root}/include/freetype2) - else() - target_include_directories(${target_name} INTERFACE ${dep_root}/include) - endif() - - # Now we link to every static library file found in the given dependency's folder - file(GLOB_RECURSE libraries "${of-deps-${dependency}_SOURCE_DIR}/**/${CMAKE_STATIC_LIBRARY_PREFIX}**${CMAKE_STATIC_LIBRARY_SUFFIX}") - foreach(lib IN LISTS libraries) - set_target_properties(${target_name} PROPERTIES IMPORTED_LOCATION ${lib}) - endforeach() + set(PACKAGE_SOURCE_DIR ${of-deps-${dependency}_SOURCE_DIR}) + file(GLOB deps "${PACKAGE_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 + import_dependency(${DEP_NAME} ${DEP_ROOT} ${PACKAGE_SOURCE_DIR}) endforeach() endforeach() #Set(FETCHCONTENT_QUIET TRUE) endfunction() - # And now download the archives, depending on the platform we're on if (OF_TARGET_ARCHITECTURE STREQUAL "msvc") - get_dependency_and_link("vs2017_64_1.zip" "vs2017_64_2.zip" "vs2017_64_3.zip" "vs2017_64_4.zip") + 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 message(SEND_ERROR "Emscripten dependencies are not yet implemented in CMake! Please edit cmake/download_deps.cmake to add support yourself!") - get_dependency_and_link() + get_packages_and_link() elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm7") - get_dependency_and_link("androidarmv7.tar.bz2") + get_packages_and_link("androidarmv7.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm64") - get_dependency_and_link("androidarm64.tar.bz2") + get_packages_and_link("androidarm64.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidx86") - get_dependency_and_link("androidx86.tar.bz2") + get_packages_and_link("androidx86.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "ios") - get_dependency_and_link("ios1.tar.bz2" "ios2.tar.bz2" "ios3.tar.bz2" "ios4.tar.bz2") + get_packages_and_link("ios1.tar.bz2" "ios2.tar.bz2" "ios3.tar.bz2" "ios4.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "tvos") - get_dependency_and_link("tvos1.tar.bz2" "tvos2.tar.bz2" "tvos3.tar.bz2" "tvos4.tar.bz2") + get_packages_and_link("tvos1.tar.bz2" "tvos2.tar.bz2" "tvos3.tar.bz2" "tvos4.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "macos") - get_dependency_and_link("osx1.tar.bz2" "osx2.tar.bz2" "osx3.tar.bz2" "osx4.tar.bz2") + get_packages_and_link("osx1.tar.bz2" "osx2.tar.bz2" "osx3.tar.bz2" "osx4.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-mingw") - get_dependency_and_link("msys2_mingw64.zip") + get_packages_and_link("msys2_mingw64.zip") elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-ucrt") - get_dependency_and_link("msys2_ucrt64.zip") + get_packages_and_link("msys2_ucrt64.zip") elseif (OF_TARGET_ARCHITECTURE STREQUAL "msys-clang") - get_dependency_and_link("msys2_clang64.zip") + get_packages_and_link("msys2_clang64.zip") elseif (OF_TARGET_ARCHITECTURE STREQUAL "mingw") - get_dependency_and_link("msys2_mingw64.zip") + get_packages_and_link("msys2_mingw64.zip") elseif (OF_TARGET_ARCHITECTURE STREQUAL "linux64") - get_dependency_and_link("linux64gcc6.tar.bz2") + get_packages_and_link("linux64gcc6.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv6l") - get_dependency_and_link("linuxarmv6l.tar.bz2") + get_packages_and_link("linuxarmv6l.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "linuxarmv7l") - get_dependency_and_link("linuxarmv7l.tar.bz2") + 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}.") @@ -153,5 +133,13 @@ CPMAddPackage( DOWNLOAD_ONLY YES ) add_library(of-deps-glut INTERFACE) -add_library(openframeworks::glut ALIAS of-deps-glut) +add_library(of::glut ALIAS of-deps-glut) target_include_directories(of-deps-glut INTERFACE ${of-deps-glut_SOURCE_DIR}/include/GL) + +# After compilation copy the dll files to the binary dir +file(GLOB_RECURSE __SHARED_LIBS "${CMAKE_CURRENT_BINARY_DIR}/_deps/**/${CMAKE_SHARED_LIBRARY_PREFIX}**${CMAKE_SHARED_LIBRARY_SUFFIX}") +foreach(LIB IN LISTS __SHARED_LIBS) + add_custom_command(TARGET openframeworks POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${LIB}" "${CMAKE_BINARY_DIR}/bin/$,Debug,Release>") +endforeach() diff --git a/cmake/import_deps.cmake b/cmake/import_deps.cmake new file mode 100644 index 00000000000..e0fde8f6806 --- /dev/null +++ b/cmake/import_deps.cmake @@ -0,0 +1,78 @@ + +function(add_libraries_to_dependency LIB_DIR_NAME LIB_NAME DEP_NAME) + + set(CONFIG "ALL") + if (LIB_DIR_NAME STREQUAL "Debug") + set(CONFIG "Debug") + elseif(LIB_DIR_NAME STREQUAL "Release") + set(CONFIG "Release") + endif() + + if (DEP_NAME STREQUAL "pugixml") + if (LIB_NAME STREQUAL "${CMAKE_STATIC_LIBRARY_PREFIX}pugixmld${CMAKE_STATIC_LIBRARY_SUFFIX}") + set(CONFIG "Debug") + else() + set(CONFIG "Release") + endif() + endif() + + if (DEP_NAME STREQUAL "videoInput") + if (LIB_NAME STREQUAL "${CMAKE_STATIC_LIBRARY_PREFIX}videoInputD${CMAKE_STATIC_LIBRARY_SUFFIX}") + set(CONFIG "Debug") + else() + set(CONFIG "Release") + endif() + endif() + + if (DEP_NAME STREQUAL "rtAudio") + if (LIB_NAME STREQUAL "${CMAKE_STATIC_LIBRARY_PREFIX}rtAudioD${CMAKE_STATIC_LIBRARY_SUFFIX}") + set(CONFIG "Debug") + else() + set(CONFIG "Release") + endif() + endif() + + if (CONFIG STREQUAL "Debug") + target_link_libraries(${TARGET_NAME} INTERFACE $,${LIB_PATH},>) + elseif(CONFIG STREQUAL "Release") + target_link_libraries(${TARGET_NAME} INTERFACE $,,${LIB_PATH}>) + else() + target_link_libraries(${TARGET_NAME} INTERFACE ${LIB_PATH}) + endif() +endfunction() + +# This function is called for every dependency in every package, e.g. 'boost', 'freetype', 'libcurl', etc. +function(import_dependency DEP_NAME DEP_ROOT PACKAGE_SOURCE_DIR) + + # Find all the library files in one dependency + file(GLOB_RECURSE libraries "${DEP_ROOT}/**/${CMAKE_STATIC_LIBRARY_PREFIX}**${CMAKE_STATIC_LIBRARY_SUFFIX}") + + set(TARGET_NAME of-deps-${DEP_NAME}) + add_library(${TARGET_NAME} INTERFACE) + + if (libraries) + # Some Libraries were found -> Link all of them into a single target + foreach(LIB_PATH IN LISTS libraries) # Loop over all found library files + + get_filename_component(LIB_DIR ${LIB_PATH} DIRECTORY) + get_filename_component(LIB_DIR_NAME ${LIB_DIR} NAME) + get_filename_component(LIB_NAME ${LIB_PATH} NAME) + get_filename_component(LIB_EXTENSION ${LIB_PATH} LAST_EXT) + + add_libraries_to_dependency(${LIB_DIR_NAME} ${LIB_NAME} ${DEP_NAME}) + + endforeach() + + endif() + add_library(of::${DEP_NAME} ALIAS of-deps-${DEP_NAME}) + + # Header file directories + if (${DEP_NAME} STREQUAL "cairo") # Unfortunately cairo and freetype are inconsistent in the apothecary + target_include_directories(of-deps-${DEP_NAME} INTERFACE ${DEP_ROOT}/include/cairo) + elseif(${DEP_NAME} STREQUAL "freetype") + target_include_directories(of-deps-${DEP_NAME} INTERFACE ${DEP_ROOT}/include/freetype2) + else() + target_include_directories(of-deps-${DEP_NAME} INTERFACE ${DEP_ROOT}/include) + endif() + +endfunction() \ No newline at end of file diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 12ad7f2bebf..2c90542bb50 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -19,4 +19,8 @@ function(TEST_IF_DEFINED OUTPUT_VAR DEFINE) file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/try_compile) -endfunction() \ No newline at end of file +endfunction() + +function(copy_file_after_build TARGET_NAME SOURCE_FILE TARGET_FILE) + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SOURCE_FILE}" "${TARGET_FILE}") +endfunction() diff --git a/examples/3d/3DModelLoaderExample/CMakeLists.txt b/examples/3d/3DModelLoaderExample/CMakeLists.txt new file mode 100644 index 00000000000..b5376d8c101 --- /dev/null +++ b/examples/3d/3DModelLoaderExample/CMakeLists.txt @@ -0,0 +1,7 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(3DModelLoaderExample ${SOURCES}) + +target_link_libraries(3DModelLoaderExample of::ofxAssimpModelLoader) + +# copy_example_resource(3DModelLoaderExample bin/data/penguin.jpg) diff --git a/examples/3d/3DPrimitivesExample/CMakeLists.txt b/examples/3d/3DPrimitivesExample/CMakeLists.txt new file mode 100644 index 00000000000..8749d598fbf --- /dev/null +++ b/examples/3d/3DPrimitivesExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(3DPrimitivesExample ${SOURCES}) + +copy_example_resource(3DPrimitivesExample bin/data/of.png) diff --git a/examples/3d/CMakeLists.txt b/examples/3d/CMakeLists.txt new file mode 100644 index 00000000000..deb0f904bfa --- /dev/null +++ b/examples/3d/CMakeLists.txt @@ -0,0 +1,20 @@ + +add_subdirectory(3DModelLoaderExample) +add_subdirectory(3DPrimitivesExample) +add_subdirectory(advanced3dExample) +add_subdirectory(assimpExample) +add_subdirectory(cameraLensOffsetExample) +add_subdirectory(cameraParentingExample) +add_subdirectory(cameraRibbonExample) +add_subdirectory(easyCamExample) +add_subdirectory(meshFromCameraExample) +add_subdirectory(modelNoiseExample) +add_subdirectory(normalsExample) +add_subdirectory(ofBoxExample) +add_subdirectory(ofNodeExample) +add_subdirectory(orientationExample) +add_subdirectory(pathsToMeshesExample) +add_subdirectory(pointCloudExample) +add_subdirectory(pointPickerExample) +add_subdirectory(quaternionArcballExample) +add_subdirectory(quaternionLatLongExample) \ No newline at end of file diff --git a/examples/3d/advanced3dExample/CMakeLists.txt b/examples/3d/advanced3dExample/CMakeLists.txt new file mode 100644 index 00000000000..83f70e24c0c --- /dev/null +++ b/examples/3d/advanced3dExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(advanced3dExample ${SOURCES}) diff --git a/examples/3d/assimpExample/CMakeLists.txt b/examples/3d/assimpExample/CMakeLists.txt new file mode 100644 index 00000000000..b5ee7e99854 --- /dev/null +++ b/examples/3d/assimpExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(assimpExample ${SOURCES}) + +target_link_libraries(assimpExample of::ofxAssimpModelLoader) diff --git a/examples/3d/cameraLensOffsetExample/CMakeLists.txt b/examples/3d/cameraLensOffsetExample/CMakeLists.txt new file mode 100644 index 00000000000..c2f8f1c82d0 --- /dev/null +++ b/examples/3d/cameraLensOffsetExample/CMakeLists.txt @@ -0,0 +1,7 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(cameraLensOffsetExample ${SOURCES}) + +target_link_libraries(cameraLensOffsetExample of::ofxOpenCv) + +copy_example_resource(cameraLensOffsetExample bin/data/haarcascade_frontalface_default.xml) diff --git a/examples/3d/cameraParentingExample/CMakeLists.txt b/examples/3d/cameraParentingExample/CMakeLists.txt new file mode 100644 index 00000000000..ae679c717e1 --- /dev/null +++ b/examples/3d/cameraParentingExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(cameraParentingExample ${SOURCES}) diff --git a/examples/3d/cameraRibbonExample/CMakeLists.txt b/examples/3d/cameraRibbonExample/CMakeLists.txt new file mode 100644 index 00000000000..77ba4d1dabd --- /dev/null +++ b/examples/3d/cameraRibbonExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(cameraRibbonExample ${SOURCES}) diff --git a/examples/3d/easyCamExample/CMakeLists.txt b/examples/3d/easyCamExample/CMakeLists.txt new file mode 100644 index 00000000000..3e48645b70f --- /dev/null +++ b/examples/3d/easyCamExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(easyCamExample ${SOURCES}) diff --git a/examples/3d/meshFromCameraExample/CMakeLists.txt b/examples/3d/meshFromCameraExample/CMakeLists.txt new file mode 100644 index 00000000000..22ab5809f27 --- /dev/null +++ b/examples/3d/meshFromCameraExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(meshFromCameraExample ${SOURCES}) diff --git a/examples/3d/modelNoiseExample/CMakeLists.txt b/examples/3d/modelNoiseExample/CMakeLists.txt new file mode 100644 index 00000000000..2c09b928e60 --- /dev/null +++ b/examples/3d/modelNoiseExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(modelNoiseExample ${SOURCES}) + +target_link_libraries(modelNoiseExample of::ofxAssimpModelLoader) diff --git a/examples/3d/normalsExample/CMakeLists.txt b/examples/3d/normalsExample/CMakeLists.txt new file mode 100644 index 00000000000..d8ebd191bff --- /dev/null +++ b/examples/3d/normalsExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(normalsExample ${SOURCES}) diff --git a/examples/3d/ofBoxExample/CMakeLists.txt b/examples/3d/ofBoxExample/CMakeLists.txt new file mode 100644 index 00000000000..26a936dada9 --- /dev/null +++ b/examples/3d/ofBoxExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(ofBoxExample ${SOURCES}) diff --git a/examples/3d/ofNodeExample/CMakeLists.txt b/examples/3d/ofNodeExample/CMakeLists.txt new file mode 100644 index 00000000000..e013a2b1929 --- /dev/null +++ b/examples/3d/ofNodeExample/CMakeLists.txt @@ -0,0 +1,12 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(ofNodeExample ${SOURCES}) + +target_link_libraries(ofNodeExample of::ofxGui) + +copy_example_resource(ofNodeExample bin/data/engine.wav) +copy_example_resource(ofNodeExample bin/data/horn.mp3) +copy_example_resource(ofNodeExample bin/data/reverse.mp3) +copy_example_resource(ofNodeExample bin/data/oflogo.ply) +copy_example_resource(ofNodeExample bin/data/truck.ply) +copy_example_resource(ofNodeExample bin/data/wheel.ply) diff --git a/examples/3d/orientationExample/CMakeLists.txt b/examples/3d/orientationExample/CMakeLists.txt new file mode 100644 index 00000000000..44bb3003eaf --- /dev/null +++ b/examples/3d/orientationExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(orientationExample ${SOURCES}) diff --git a/examples/3d/pathsToMeshesExample/CMakeLists.txt b/examples/3d/pathsToMeshesExample/CMakeLists.txt new file mode 100644 index 00000000000..c664a269079 --- /dev/null +++ b/examples/3d/pathsToMeshesExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(pathsToMeshesExample ${SOURCES}) + +copy_example_resource(pathsToMeshesExample bin/data/frabk.ttf) diff --git a/examples/3d/pointCloudExample/CMakeLists.txt b/examples/3d/pointCloudExample/CMakeLists.txt new file mode 100644 index 00000000000..e30abdfd6f0 --- /dev/null +++ b/examples/3d/pointCloudExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(pointCloudExample ${SOURCES}) + +copy_example_resource(pointCloudExample bin/data/linzer.png) diff --git a/examples/3d/pointPickerExample/CMakeLists.txt b/examples/3d/pointPickerExample/CMakeLists.txt new file mode 100644 index 00000000000..6f657a51198 --- /dev/null +++ b/examples/3d/pointPickerExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(pointPickerExample ${SOURCES}) + +copy_example_resource(pointPickerExample bin/data/lofi-bunny.ply) diff --git a/examples/3d/quaternionArcballExample/CMakeLists.txt b/examples/3d/quaternionArcballExample/CMakeLists.txt new file mode 100644 index 00000000000..18f8764ec15 --- /dev/null +++ b/examples/3d/quaternionArcballExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(quaternionArcballExample ${SOURCES}) diff --git a/examples/3d/quaternionLatLongExample/CMakeLists.txt b/examples/3d/quaternionLatLongExample/CMakeLists.txt new file mode 100644 index 00000000000..0a538a910c5 --- /dev/null +++ b/examples/3d/quaternionLatLongExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(quaternionLatLongExample ${SOURCES}) + +copy_example_resource(quaternionLatLongExample bin/data/earth.jpg) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 00000000000..da10a6326c7 --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,51 @@ + +macro(define_example TARGET_NAME) # A macro is executed in the caller's scope (current list is the caller) + add_executable(${TARGET_NAME}) + target_sources(${TARGET_NAME} PRIVATE ${ARGN}) + target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) + + target_compile_features(openframeworks PUBLIC cxx_std_17) + set_target_properties(openframeworks PROPERTIES CXX_EXTENSIONS OFF) + + target_link_libraries(${TARGET_NAME} of::openframeworks) + + get_filename_component(DIR_PATH ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) + get_filename_component(DIR_NAME ${DIR_PATH} NAME) + if (NOT OF_IS_MAIN_PROJECT) # If including OF from another project + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/examples/${DIR_NAME}") + else () # If building OF directly in the root + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "examples-${DIR_NAME}") + endif () + + set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$,Debug,Release>") +endmacro() + +function(copy_example_resource TARGET_NAME SOURCE_FILE) + get_filename_component(__FILENAME ${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE} NAME) + copy_file_after_build( + ${TARGET_NAME} + "${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE}" + "${CMAKE_BINARY_DIR}/bin/$,Debug,Release>/data/${__FILENAME}" + ) +endfunction() + +add_subdirectory(3d) +# add_subdirectory(android) +# add_subdirectory(communication) +# add_subdirectory(computer_vision) +# add_subdirectory(events) +# add_subdirectory(gl) +# add_subdirectory(gles) +# add_subdirectory(graphics) +# add_subdirectory(gui) +# add_subdirectory(input_output) +# add_subdirectory(ios) +# add_subdirectory(math) +# add_subdirectory(shader) +# add_subdirectory(sound) +# add_subdirectory(strings) +# add_subdirectory(templates) +# add_subdirectory(threads) +# add_subdirectory(tvOS) +# add_subdirectory(video) +# add_subdirectory(windowing) diff --git a/examples/gui/CMakeLists.txt b/examples/gui/CMakeLists.txt new file mode 100644 index 00000000000..f73d1d1aa3f --- /dev/null +++ b/examples/gui/CMakeLists.txt @@ -0,0 +1,5 @@ + +add_subdirectory(guiExample) +add_subdirectory(guiFromParametersExample) +add_subdirectory(oscParametersReceiverExample) +add_subdirectory(oscParametersSenderExample) diff --git a/examples/gui/guiExample/CMakeLists.txt b/examples/gui/guiExample/CMakeLists.txt new file mode 100644 index 00000000000..c7ad06cf7e1 --- /dev/null +++ b/examples/gui/guiExample/CMakeLists.txt @@ -0,0 +1,7 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(guiExample ${SOURCES}) + +target_link_libraries(guiExample ofxGui) + +copy_resource_after_build(guiExample ${CMAKE_CURRENT_LIST_DIR}/bin/data/ring.wav data) diff --git a/examples/gui/guiFromParametersExample/CMakeLists.txt b/examples/gui/guiFromParametersExample/CMakeLists.txt new file mode 100644 index 00000000000..c82d0a7a6b5 --- /dev/null +++ b/examples/gui/guiFromParametersExample/CMakeLists.txt @@ -0,0 +1,7 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(guiFromParametersExample ${SOURCES}) + +target_link_libraries(guiFromParametersExample ofxGui) + +copy_resource_after_build(guiFromParametersExample ${CMAKE_CURRENT_LIST_DIR}/bin/data/ring.wav data) diff --git a/examples/gui/oscParametersReceiverExample/CMakeLists.txt b/examples/gui/oscParametersReceiverExample/CMakeLists.txt new file mode 100644 index 00000000000..10b4669e1f1 --- /dev/null +++ b/examples/gui/oscParametersReceiverExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(oscParametersReceiverExample ${SOURCES}) + +target_link_libraries(oscParametersReceiverExample ofxGui ofxOsc) diff --git a/examples/gui/oscParametersSenderExample/CMakeLists.txt b/examples/gui/oscParametersSenderExample/CMakeLists.txt new file mode 100644 index 00000000000..77dcd543b15 --- /dev/null +++ b/examples/gui/oscParametersSenderExample/CMakeLists.txt @@ -0,0 +1,5 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(oscParametersSenderExample ${SOURCES}) + +target_link_libraries(oscParametersSenderExample ofxGui ofxOsc) diff --git a/examples/sound/CMakeLists.txt b/examples/sound/CMakeLists.txt new file mode 100644 index 00000000000..9b3342be33b --- /dev/null +++ b/examples/sound/CMakeLists.txt @@ -0,0 +1,3 @@ + +add_subdirectory(audioInputExample) +add_subdirectory(audioOutputExample) diff --git a/examples/sound/audioInputExample/CMakeLists.txt b/examples/sound/audioInputExample/CMakeLists.txt new file mode 100644 index 00000000000..eac066628a9 --- /dev/null +++ b/examples/sound/audioInputExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(audioInputExample ${SOURCES}) diff --git a/examples/sound/audioOutputExample/CMakeLists.txt b/examples/sound/audioOutputExample/CMakeLists.txt new file mode 100644 index 00000000000..21ee0545d2e --- /dev/null +++ b/examples/sound/audioOutputExample/CMakeLists.txt @@ -0,0 +1,3 @@ + +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) +define_example(audioOutputExample ${SOURCES}) diff --git a/libs/openFrameworks/CMakeLists.txt b/libs/openFrameworks/CMakeLists.txt deleted file mode 100644 index 26e5716d9bd..00000000000 --- a/libs/openFrameworks/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ - -# A macro that will add all the files in the given module directory -macro(add_module MODULE_NAME) - target_include_directories(openframeworks-core PUBLIC ${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}) # Include directory - file(GLOB OF_SOURCES "${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}/**") # Find and add all the source files - target_sources(openframeworks-core PRIVATE ${OF_SOURCES}) - - # Find all obj-c files and exclude them from parallel builds - #file(GLOB OBJC_FILES "${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}/**.m") - #set_source_files_properties(${OBJC_FILES} PROPERTIES COMPILE_FLAGS "/MP") - # TODO: Implement parallel builds in MSVC!!! -endmacro() - -add_module(3d) -add_module(app) -add_module(communication) -add_module(events) -add_module(gl) -add_module(graphics) -add_module(math) -add_module(sound) -add_module(types) -add_module(utils) -add_module(video) diff --git a/libs/openFrameworks/ofSources.cmake b/libs/openFrameworks/ofSources.cmake new file mode 100644 index 00000000000..c6440375764 --- /dev/null +++ b/libs/openFrameworks/ofSources.cmake @@ -0,0 +1,25 @@ + +# A macro that will add all the files in the given module directory +macro(add_module MODULE_NAME) + target_include_directories(openframeworks PUBLIC ${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}) # Include directory + file(GLOB OF_SOURCES "${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}/**") # Find and add all the source files + target_sources(openframeworks PRIVATE ${OF_SOURCES}) + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}" PREFIX ${MODULE_NAME} FILES ${OF_SOURCES}) +endmacro() + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) +target_include_directories(openframeworks PUBLIC ${CMAKE_CURRENT_LIST_DIR}) + +add_module(3d) +add_module(app) +add_module(communication) +add_module(events) +add_module(gl) +add_module(graphics) +add_module(math) +add_module(sound) +add_module(types) +add_module(utils) +add_module(video) + +target_sources(openframeworks PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ofSources.cmake) \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 00000000000..59ef517fc31 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1 @@ +message("TODO: Implement tests in CMake") \ No newline at end of file From b016972048de646a558e403f1bc6dc146a952daa Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 6 Mar 2023 00:09:03 +0100 Subject: [PATCH 05/49] Add CMake checks for dependencies on Linux --- CMakeLists.txt | 32 +---------- ...eps.cmake => download_and_link_deps.cmake} | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+), 31 deletions(-) rename cmake/{download_deps.cmake => download_and_link_deps.cmake} (78%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7140a466ba1..2db81aab9da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,37 +58,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set_target_properties(openframeworks PROPERTIES FOLDER "openframeworks") # This downloads and configures the dependencies for us -include(${CMAKE_CURRENT_LIST_DIR}/cmake/download_deps.cmake) - -# And link to all the dependencies we depend upon -target_link_libraries(openframeworks - of::glew - of::tess2 - of::cairo - of::glm - of::utf8 - of::glfw - of::glut - of::fmod - of::FreeImage - of::rtAudio - of::videoInput - of::uriparser - of::openssl - of::curl - of::freetype - of::pugixml - of::json -) - -if(WIN32) # Linking to WinAPI system libraries - target_link_libraries(openframeworks winmm ws2_32 wldap32 crypt32 dsound.lib) -endif() - -# Other dependencies -find_package(OpenGL) -target_include_directories(openframeworks PUBLIC ${OPENGL_INCLUDE_DIRS}) -target_link_libraries(openframeworks ${OPENGL_LIBRARIES}) +include(${CMAKE_CURRENT_LIST_DIR}/cmake/download_and_link_deps.cmake) add_subdirectory(addons) diff --git a/cmake/download_deps.cmake b/cmake/download_and_link_deps.cmake similarity index 78% rename from cmake/download_deps.cmake rename to cmake/download_and_link_deps.cmake index 83374902dc7..0eb55ed8b6b 100644 --- a/cmake/download_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -143,3 +143,57 @@ foreach(LIB IN LISTS __SHARED_LIBS) COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LIB}" "${CMAKE_BINARY_DIR}/bin/$,Debug,Release>") endforeach() + + + +# And link to all the dependencies we depend upon +target_link_libraries(openframeworks + of::tess2 + of::cairo + of::glm + of::utf8 + of::glfw + of::glut + of::fmod + of::FreeImage + of::rtAudio + of::videoInput + 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 winmm ws2_32 wldap32 crypt32 dsound.lib) +endif() + +if (OF_TARGET_ARCHITECTURE STREQUAL "msvc" OR OF_TARGET_ARCHITECTURE STREQUAL "macos") + target_link_libraries(openframeworks of::glew) +endif() + +find_package(OpenGL) +if (NOT OpenGL_FOUND) # This should never be not found on windows + message(FATAL_ERROR "Dependency OpenGL not found. On Linux, please install it using your system's equivalent of 'sudo apt install libgl1-mesa-dev'") +endif() +target_include_directories(openframeworks PUBLIC ${OPENGL_INCLUDE_DIRS}) +target_link_libraries(openframeworks ${OPENGL_LIBRARIES}) + +if (LINUX) + find_package(assimp) + if (NOT assimp_FOUND) + message(FATAL_ERROR "Dependency Assimp not found. Please install it using your system's equivalent of 'sudo apt install libassimp-dev'") + endif() + target_include_directories(openframeworks PUBLIC ${assimp_INCLUDE_DIRS}) + target_link_libraries(openframeworks ${assimp_LIBRARIES}) + + find_package(OpenCV) + if (NOT OpenCV_FOUND) + message(FATAL_ERROR "Dependency OpenCV not found. Please install it using your system's equivalent of 'sudo apt install libopencv-dev'") + endif() + target_include_directories(openframeworks PUBLIC ${OpenCV_INCLUDE_DIRS}) + target_link_libraries(openframeworks ${OpenCV_LIBS}) +endif() From 53ee56d8987052b26511999b7cf080816f7663f9 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 15 Mar 2023 18:05:00 +0100 Subject: [PATCH 06/49] Improving CMake support with conscise examples and addons --- CMAKE.md | 23 +++++ CMakeLists.txt | 31 +++---- README.md | 4 + addons/CMakeLists.txt | 14 ++- addons/ofxAssimpModelLoader/CMakeLists.txt | 7 +- addons/ofxGui/CMakeLists.txt | 4 +- addons/ofxOpenCv/CMakeLists.txt | 7 +- addons/ofxOsc/CMakeLists.txt | 7 +- .../oscpack/src/ip/posix/NetworkingUtils.cpp | 5 ++ .../libs/oscpack/src/ip/posix/UdpSocket.cpp | 5 ++ .../oscpack/src/ip/win32/NetworkingUtils.cpp | 5 ++ .../libs/oscpack/src/ip/win32/UdpSocket.cpp | 4 + cmake/FindCairo.cmake | 81 +++++++++++++++++ cmake/FindGLFW3.cmake | 86 +++++++++++++++++++ cmake/download_and_link_deps.cmake | 46 ++++++---- cmake/import_deps.cmake | 1 + cmake/utils.cmake | 13 +++ .../3d/3DModelLoaderExample/CMakeLists.txt | 13 +-- .../3d/3DPrimitivesExample/CMakeLists.txt | 7 +- examples/3d/advanced3dExample/CMakeLists.txt | 4 +- examples/3d/assimpExample/CMakeLists.txt | 7 +- .../3d/cameraLensOffsetExample/CMakeLists.txt | 7 +- .../3d/cameraParentingExample/CMakeLists.txt | 4 +- .../3d/cameraRibbonExample/CMakeLists.txt | 4 +- examples/3d/easyCamExample/CMakeLists.txt | 4 +- .../3d/meshFromCameraExample/CMakeLists.txt | 4 +- examples/3d/modelNoiseExample/CMakeLists.txt | 7 +- examples/3d/normalsExample/CMakeLists.txt | 4 +- examples/3d/ofBoxExample/CMakeLists.txt | 4 +- examples/3d/ofNodeExample/CMakeLists.txt | 7 +- examples/3d/orientationExample/CMakeLists.txt | 4 +- .../3d/pathsToMeshesExample/CMakeLists.txt | 6 +- examples/3d/pointCloudExample/CMakeLists.txt | 6 +- examples/3d/pointPickerExample/CMakeLists.txt | 6 +- .../quaternionArcballExample/CMakeLists.txt | 4 +- .../quaternionLatLongExample/CMakeLists.txt | 6 +- examples/CMakeLists.txt | 36 ++++---- libs/openFrameworks/CMakeLists.txt | 14 +++ libs/openFrameworks/ofSources.cmake | 25 ------ 39 files changed, 355 insertions(+), 171 deletions(-) create mode 100644 CMAKE.md create mode 100644 cmake/FindCairo.cmake create mode 100644 cmake/FindGLFW3.cmake create mode 100644 libs/openFrameworks/CMakeLists.txt delete mode 100644 libs/openFrameworks/ofSources.cmake diff --git a/CMAKE.md b/CMAKE.md new file mode 100644 index 00000000000..2723f2b29ef --- /dev/null +++ b/CMAKE.md @@ -0,0 +1,23 @@ + +# CMake Support + +## Introduction + +CMake is a Meta- build system. You no longer have to deal with strange compiler flags or huge unreadable Makefiles, instead you describe the project layout logically. Then, when executing, it sets everything up so that the compilation will work without errors. + +The best part of this is that is is 100% cross platform: The same CMake script can generate project files for more than 40 different build systems on any operating system, including Visual Studio, GCC Makefiles, Ninja Makefiles, Code::Blocks, and many more. + +## Building with CMake + +To build the library itself for testing the examples: + +```bash +git clone https://github.com/openframeworks/openFrameworks +cd openframeworks +mkdir build +cd build +cmake .. +cmake --build . +``` + +This is it! OpenFrameworks and all examples have been built! diff --git a/CMakeLists.txt b/CMakeLists.txt index 2db81aab9da..641c2b9eea4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,8 @@ -cmake_minimum_required(VERSION 3.25) +cmake_minimum_required(VERSION 3.22) project(openframeworks) -include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) -if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) - message(FATAL_ERROR "In-source builds are a really bad idea. If you don't know what you're doing, please create a 'build' folder and call 'cmake ..' from within.") -endif() +include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(OF_IS_MAIN_PROJECT ON) @@ -13,24 +11,21 @@ else() endif() # Here are all the options you can set for customizing your build -option(BUILD_SHARED_LIBS "Build OF as a shared library instead of a static one" OFF) +# BUILD_SHARED_LIBS can be set to build a dll option(BUILD_EXAMPLES "Add all OpenFrameworks examples to the project" ${OF_IS_MAIN_PROJECT}) option(BUILD_TESTS "Add all OpenFrameworks examples to the project" ${OF_IS_MAIN_PROJECT}) # This defines the actual library -if (BUILD_SHARED_LIBS) - add_library(openframeworks SHARED) -else() - add_library(openframeworks STATIC) -endif() +add_library(openframeworks) add_library(of::openframeworks ALIAS openframeworks) # This is another CMake script that adds the header locations and source files -include(${CMAKE_CURRENT_LIST_DIR}/libs/openFrameworks/ofSources.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/libs/openFrameworks/CMakeLists.txt) # C++ standard version and disabling non-standard compiler specific features target_compile_features(openframeworks PUBLIC cxx_std_17) set_target_properties(openframeworks PROPERTIES CXX_EXTENSIONS OFF) +set_target_properties(openframeworks PROPERTIES FOLDER "openframeworks") # Preprocessor defines target_compile_definitions(openframeworks PUBLIC @@ -49,13 +44,11 @@ if(MSVC) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ignore:4099 /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRT") endif() -# Output everything into a bin folder -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - -# Folder layout in Visual Studio & Co -set_target_properties(openframeworks PROPERTIES FOLDER "openframeworks") +# Where compiled binaries should be placed +set_target_properties(openframeworks PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib/$,debug,release>" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib/$,debug,release>" +) # This downloads and configures the dependencies for us include(${CMAKE_CURRENT_LIST_DIR}/cmake/download_and_link_deps.cmake) diff --git a/README.md b/README.md index 2438f10a817..46c39f20bb9 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,10 @@ if you have bugs or feature requests, consider opening an issue. If you are a d We also have a developer's mailing list, which is useful for discussing issues around the development and future of OF. +## Working with CMake + +Using CMake will give you the best possible experience when working with openFrameworks. There is an entire page dedicated to [CMake support](CMAKE.md). + ## Developers To grab a copy of openFrameworks for your platform, check the [download page](http://openframeworks.cc/download) on the main site. diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index b34ead18c31..dcf01601c88 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -1,17 +1,25 @@ function(define_addon TARGET_NAME) + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) + add_library(${TARGET_NAME} STATIC) add_library(of::${TARGET_NAME} ALIAS ${TARGET_NAME}) - target_sources(${TARGET_NAME} PRIVATE ${ARGN}) + target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) + target_link_libraries(${TARGET_NAME} of::openframeworks) - target_compile_features(${TARGET_NAME} PUBLIC cxx_std_17) + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCES}) + + target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17) set_target_properties(${TARGET_NAME} PROPERTIES CXX_EXTENSIONS OFF) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/addons") - target_link_libraries(${TARGET_NAME} of::openframeworks) + set_target_properties(${TARGET_NAME} PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib/$,debug,release>" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib/$,debug,release>" + ) endfunction() # add_subdirectory(ofxAccelerometer) diff --git a/addons/ofxAssimpModelLoader/CMakeLists.txt b/addons/ofxAssimpModelLoader/CMakeLists.txt index 2982f5eab20..7ab90031118 100644 --- a/addons/ofxAssimpModelLoader/CMakeLists.txt +++ b/addons/ofxAssimpModelLoader/CMakeLists.txt @@ -1,5 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**.cpp) -define_addon(ofxAssimpModelLoader ${SOURCES}) - -target_link_libraries(ofxAssimpModelLoader of::assimp) +define_addon(ofxAssimpModelLoader) +target_link_libraries(ofxAssimpModelLoader of::assimp) \ No newline at end of file diff --git a/addons/ofxGui/CMakeLists.txt b/addons/ofxGui/CMakeLists.txt index b835c97e02b..84cea294201 100644 --- a/addons/ofxGui/CMakeLists.txt +++ b/addons/ofxGui/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**.cpp) -define_addon(ofxGui ${SOURCES}) +define_addon(ofxGui) \ No newline at end of file diff --git a/addons/ofxOpenCv/CMakeLists.txt b/addons/ofxOpenCv/CMakeLists.txt index 18d66de99d3..c41f19ff57b 100644 --- a/addons/ofxOpenCv/CMakeLists.txt +++ b/addons/ofxOpenCv/CMakeLists.txt @@ -1,5 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**.cpp) -define_addon(ofxOpenCv ${SOURCES}) - -target_link_libraries(ofxOpenCv of::opencv of::ippicv) +define_addon(ofxOpenCv) +target_link_libraries(ofxOpenCv of::opencv of::ippicv) \ No newline at end of file diff --git a/addons/ofxOsc/CMakeLists.txt b/addons/ofxOsc/CMakeLists.txt index ea117e4c5c9..f7d300749ed 100644 --- a/addons/ofxOsc/CMakeLists.txt +++ b/addons/ofxOsc/CMakeLists.txt @@ -1,7 +1,4 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**.cpp) -define_addon(ofxOsc ${SOURCES}) - +define_addon(ofxOsc) target_include_directories(ofxOsc PUBLIC ${CMAKE_CURRENT_LIST_DIR}/libs/oscpack/src/osc) target_include_directories(ofxOsc PUBLIC ${CMAKE_CURRENT_LIST_DIR}/libs/oscpack/src/ip) -target_include_directories(ofxOsc PUBLIC ${CMAKE_CURRENT_LIST_DIR}/libs/oscpack/src) +target_include_directories(ofxOsc PUBLIC ${CMAKE_CURRENT_LIST_DIR}/libs/oscpack/src) \ No newline at end of file diff --git a/addons/ofxOsc/libs/oscpack/src/ip/posix/NetworkingUtils.cpp b/addons/ofxOsc/libs/oscpack/src/ip/posix/NetworkingUtils.cpp index c669a775755..1bfc0e72d21 100644 --- a/addons/ofxOsc/libs/oscpack/src/ip/posix/NetworkingUtils.cpp +++ b/addons/ofxOsc/libs/oscpack/src/ip/posix/NetworkingUtils.cpp @@ -34,6 +34,9 @@ requested that these non-binding requests be included whenever the above license is reproduced. */ + +#ifndef _WIN32 + #include "ip/NetworkingUtils.h" #include @@ -64,3 +67,5 @@ unsigned long GetHostByName( const char *name ) return result; } } + +#endif // _WIN32 diff --git a/addons/ofxOsc/libs/oscpack/src/ip/posix/UdpSocket.cpp b/addons/ofxOsc/libs/oscpack/src/ip/posix/UdpSocket.cpp index 7e27bd1c0b1..1943d576882 100644 --- a/addons/ofxOsc/libs/oscpack/src/ip/posix/UdpSocket.cpp +++ b/addons/ofxOsc/libs/oscpack/src/ip/posix/UdpSocket.cpp @@ -34,6 +34,9 @@ requested that these non-binding requests be included whenever the above license is reproduced. */ + +#ifndef _WIN32 + #include "ip/UdpSocket.h" #include @@ -624,3 +627,5 @@ void SocketReceiveMultiplexer::AsynchronousBreak() } } + +#endif // _WIN32 diff --git a/addons/ofxOsc/libs/oscpack/src/ip/win32/NetworkingUtils.cpp b/addons/ofxOsc/libs/oscpack/src/ip/win32/NetworkingUtils.cpp index 22621294b87..46486092d98 100644 --- a/addons/ofxOsc/libs/oscpack/src/ip/win32/NetworkingUtils.cpp +++ b/addons/ofxOsc/libs/oscpack/src/ip/win32/NetworkingUtils.cpp @@ -34,6 +34,9 @@ requested that these non-binding requests be included whenever the above license is reproduced. */ + +#ifdef _WIN32 + #include "ip/NetworkingUtils.h" #include // this must come first to prevent errors with MSVC7 @@ -95,3 +98,5 @@ unsigned long GetHostByName( const char *name ) return result; } } + +#endif // _WIN32 diff --git a/addons/ofxOsc/libs/oscpack/src/ip/win32/UdpSocket.cpp b/addons/ofxOsc/libs/oscpack/src/ip/win32/UdpSocket.cpp index a16f74a78c4..56643c2b37c 100644 --- a/addons/ofxOsc/libs/oscpack/src/ip/win32/UdpSocket.cpp +++ b/addons/ofxOsc/libs/oscpack/src/ip/win32/UdpSocket.cpp @@ -35,6 +35,8 @@ above license is reproduced. */ +#ifdef _WIN32 + #include // this must come first to prevent errors with MSVC7 #include #include // for timeGetTime() @@ -589,3 +591,5 @@ void SocketReceiveMultiplexer::AsynchronousBreak() } } + +#endif // _WIN32 diff --git a/cmake/FindCairo.cmake b/cmake/FindCairo.cmake new file mode 100644 index 00000000000..934f3adb06e --- /dev/null +++ b/cmake/FindCairo.cmake @@ -0,0 +1,81 @@ +# - Try to find Cairo +# Once done, this will define +# +# CAIRO_FOUND - system has Cairo +# CAIRO_INCLUDE_DIRS - the Cairo include directories +# CAIRO_LIBRARIES - link these to use Cairo +# +# Copyright (C) 2012 Raphael Kubo da Costa +# +# 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS 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 ITS +# 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. + +FIND_PACKAGE(PkgConfig) +PKG_CHECK_MODULES(PC_CAIRO cairo) # FIXME: After we require CMake 2.8.2 we can pass QUIET to this call. + +FIND_PATH(CAIRO_INCLUDE_DIRS + NAMES cairo.h + HINTS ${PC_CAIRO_INCLUDEDIR} + ${PC_CAIRO_INCLUDE_DIRS} + PATH_SUFFIXES cairo +) + +FIND_LIBRARY(CAIRO_LIBRARIES + NAMES cairo + HINTS ${PC_CAIRO_LIBDIR} + ${PC_CAIRO_LIBRARY_DIRS} +) + +IF (CAIRO_INCLUDE_DIRS) + IF (EXISTS "${CAIRO_INCLUDE_DIRS}/cairo-version.h") + FILE(READ "${CAIRO_INCLUDE_DIRS}/cairo-version.h" CAIRO_VERSION_CONTENT) + + STRING(REGEX MATCH "#define +CAIRO_VERSION_MAJOR +([0-9]+)" _dummy "${CAIRO_VERSION_CONTENT}") + SET(CAIRO_VERSION_MAJOR "${CMAKE_MATCH_1}") + + STRING(REGEX MATCH "#define +CAIRO_VERSION_MINOR +([0-9]+)" _dummy "${CAIRO_VERSION_CONTENT}") + SET(CAIRO_VERSION_MINOR "${CMAKE_MATCH_1}") + + STRING(REGEX MATCH "#define +CAIRO_VERSION_MICRO +([0-9]+)" _dummy "${CAIRO_VERSION_CONTENT}") + SET(CAIRO_VERSION_MICRO "${CMAKE_MATCH_1}") + + SET(CAIRO_VERSION "${CAIRO_VERSION_MAJOR}.${CAIRO_VERSION_MINOR}.${CAIRO_VERSION_MICRO}") + ENDIF () +ENDIF () + +# FIXME: Should not be needed anymore once we start depending on CMake 2.8.3 +SET(VERSION_OK TRUE) +IF (Cairo_FIND_VERSION) + IF (Cairo_FIND_VERSION_EXACT) + IF ("${Cairo_FIND_VERSION}" VERSION_EQUAL "${CAIRO_VERSION}") + # FIXME: Use IF (NOT ...) with CMake 2.8.2+ to get rid of the ELSE block + ELSE () + SET(VERSION_OK FALSE) + ENDIF () + ELSE () + IF ("${Cairo_FIND_VERSION}" VERSION_GREATER "${CAIRO_VERSION}") + SET(VERSION_OK FALSE) + ENDIF () + ENDIF () +ENDIF () + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Cairo DEFAULT_MSG CAIRO_INCLUDE_DIRS CAIRO_LIBRARIES VERSION_OK) \ No newline at end of file diff --git a/cmake/FindGLFW3.cmake b/cmake/FindGLFW3.cmake new file mode 100644 index 00000000000..62aededd6d7 --- /dev/null +++ b/cmake/FindGLFW3.cmake @@ -0,0 +1,86 @@ +# +# Find GLFW +# +# Try to find GLFW library. +# This module defines the following variables: +# - GLFW_INCLUDE_DIRS +# - GLFW_LIBRARIES +# - GLFW_FOUND +# +# The following variables can be set as arguments for the module. +# - GLFW_ROOT_DIR : Root library directory of GLFW +# - GLFW_USE_STATIC_LIBS : Specifies to use static version of GLFW library (Windows only) +# +# References: +# - https://github.com/progschj/OpenGL-Examples/blob/master/cmake_modules/FindGLFW.cmake +# - https://bitbucket.org/Ident8/cegui-mk2-opengl3-renderer/src/befd47200265/cmake/FindGLFW.cmake +# + +# Additional modules +include(FindPackageHandleStandardArgs) + +if (WIN32) + # Find include files + find_path( + GLFW_INCLUDE_DIR + NAMES GLFW/glfw3.h + PATHS + $ENV{PROGRAMFILES}/include + ${GLFW_ROOT_DIR}/include + DOC "The directory where GLFW/glfw.h resides") + + # Use glfw3.lib for static library + if (GLFW_USE_STATIC_LIBS) + set(GLFW_LIBRARY_NAME glfw3) + else() + set(GLFW_LIBRARY_NAME glfw3dll) + endif() + + # Find library files + find_library( + GLFW_LIBRARY + NAMES ${GLFW_LIBRARY_NAME} + PATHS + $ENV{PROGRAMFILES}/lib + ${GLFW_ROOT_DIR}/lib) + + unset(GLFW_LIBRARY_NAME) +else() + # Find include files + find_path( + GLFW_INCLUDE_DIR + NAMES GLFW/glfw.h + PATHS + /usr/include + /usr/local/include + /sw/include + /opt/local/include + DOC "The directory where GL/glfw.h resides") + + # Find library files + # Try to use static libraries + find_library( + GLFW_LIBRARY + NAMES glfw3 + PATHS + /usr/lib64 + /usr/lib + /usr/local/lib64 + /usr/local/lib + /sw/lib + /opt/local/lib + ${GLFW_ROOT_DIR}/lib + DOC "The GLFW library") +endif() + +# Handle REQUIRD argument, define *_FOUND variable +find_package_handle_standard_args(GLFW DEFAULT_MSG GLFW_INCLUDE_DIR GLFW_LIBRARY) + +# Define GLFW_LIBRARIES and GLFW_INCLUDE_DIRS +if (GLFW_FOUND) + set(GLFW_LIBRARIES ${OPENGL_LIBRARIES} ${GLFW_LIBRARY}) + set(GLFW_INCLUDE_DIRS ${GLFW_INCLUDE_DIR}) +endif() + +# Hide some variables +mark_as_advanced(GLFW_INCLUDE_DIR GLFW_LIBRARY) \ No newline at end of file diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index 0eb55ed8b6b..d4eca146202 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -3,6 +3,8 @@ 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}) + 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) @@ -13,7 +15,7 @@ if(OF_TARGET_ARCHITECTURE STREQUAL "auto") message(FATAL_ERROR "OpenFrameworks does no longer support 32-bit build systems. Please upgrade your compiler to 64-bit.") endif() - message(STATUS "Auto-detecting platform...") + message(STATUS "[openframeworks] Auto-detecting platform...") if (MSVC) set(OF_TARGET_ARCHITECTURE "msvc" CACHE STRING "" FORCE) @@ -54,9 +56,9 @@ function(get_packages_and_link) # Download and extract the compressed archive CPMAddPackage( NAME of-deps-${dependency} - URL ${_URL} DOWNLOAD_EXTRACT_TIMESTAMP TRUE DOWNLOAD_ONLY YES + URL ${_URL} ) # Now, create the targets and link all files to them @@ -136,16 +138,6 @@ 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/GL) -# After compilation copy the dll files to the binary dir -file(GLOB_RECURSE __SHARED_LIBS "${CMAKE_CURRENT_BINARY_DIR}/_deps/**/${CMAKE_SHARED_LIBRARY_PREFIX}**${CMAKE_SHARED_LIBRARY_SUFFIX}") -foreach(LIB IN LISTS __SHARED_LIBS) - add_custom_command(TARGET openframeworks POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${LIB}" "${CMAKE_BINARY_DIR}/bin/$,Debug,Release>") -endforeach() - - - # And link to all the dependencies we depend upon target_link_libraries(openframeworks of::tess2 @@ -187,13 +179,35 @@ if (LINUX) if (NOT assimp_FOUND) message(FATAL_ERROR "Dependency Assimp not found. Please install it using your system's equivalent of 'sudo apt install libassimp-dev'") endif() - target_include_directories(openframeworks PUBLIC ${assimp_INCLUDE_DIRS}) - target_link_libraries(openframeworks ${assimp_LIBRARIES}) + add_library(of-deps-assimp INTERFACE) + add_library(of::assimp ALIAS of-deps-assimp) + target_include_directories(of-deps-assimp INTERFACE ${assimp_INCLUDE_DIRS}) + target_link_libraries(of-deps-assimp INTERFACE ${assimp_LIBRARIES}) find_package(OpenCV) if (NOT OpenCV_FOUND) message(FATAL_ERROR "Dependency OpenCV not found. Please install it using your system's equivalent of 'sudo apt install libopencv-dev'") endif() - target_include_directories(openframeworks PUBLIC ${OpenCV_INCLUDE_DIRS}) - target_link_libraries(openframeworks ${OpenCV_LIBS}) + add_library(of-deps-opencv INTERFACE) + add_library(of::opencv ALIAS of-deps-opencv) + target_include_directories(of-deps-opencv INTERFACE ${OpenCV_INCLUDE_DIRS}) + target_link_libraries(of-deps-opencv INTERFACE ${OpenCV_LIBS}) + + find_package(Cairo) + if (NOT Cairo_FOUND) + message(FATAL_ERROR "Dependency Cairo not found. Please install it using your system's equivalent of 'sudo apt install libcairo-dev'") + endif() + add_library(of-deps-cairo INTERFACE) + add_library(of::cairo ALIAS of-deps-cairo) + target_include_directories(of-deps-cairo INTERFACE ${Cairo_INCLUDE_DIRS}) + target_link_libraries(of-deps-cairo INTERFACE ${Cairo_LIBRARIES}) + + find_package(GLFW3) + if (NOT GLFW_FOUND) + message(FATAL_ERROR "Dependency GLFW not found. Please install it using your system's equivalent of 'sudo apt install libglfw-dev'") + endif() + add_library(of-deps-glfw INTERFACE) + add_library(of::glfw ALIAS of-deps-glfw) + target_include_directories(of-deps-glfw INTERFACE ${GLFW_INCLUDE_DIRS}) + target_link_libraries(of-deps-glfw INTERFACE ${GLFW_LIBRARIES}) endif() diff --git a/cmake/import_deps.cmake b/cmake/import_deps.cmake index e0fde8f6806..33c6f913a20 100644 --- a/cmake/import_deps.cmake +++ b/cmake/import_deps.cmake @@ -42,6 +42,7 @@ function(add_libraries_to_dependency LIB_DIR_NAME LIB_NAME DEP_NAME) endfunction() # This function is called for every dependency in every package, e.g. 'boost', 'freetype', 'libcurl', etc. +# It creates the CMake target for each dependency and adds the library files to the targets function(import_dependency DEP_NAME DEP_ROOT PACKAGE_SOURCE_DIR) # Find all the library files in one dependency diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 2c90542bb50..acf6ef59bd1 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -1,4 +1,8 @@ +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + message(FATAL_ERROR "In-source builds are a really bad idea. If you don't know what you're doing, please create a 'build' folder and call 'cmake ..' from within.") +endif() + # This function test-compiles a tiny program to see if a definition is defined or not (compiler internal) function(TEST_IF_DEFINED OUTPUT_VAR DEFINE) @@ -24,3 +28,12 @@ endfunction() function(copy_file_after_build TARGET_NAME SOURCE_FILE TARGET_FILE) add_custom_command(TARGET ${TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${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) + file(GLOB_RECURSE libs "${CMAKE_BINARY_DIR}/_deps/**/${CMAKE_SHARED_LIBRARY_PREFIX}**${CMAKE_SHARED_LIBRARY_SUFFIX}") + foreach(lib_path IN LISTS 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/examples/3d/3DModelLoaderExample/CMakeLists.txt b/examples/3d/3DModelLoaderExample/CMakeLists.txt index b5376d8c101..5555641b27a 100644 --- a/examples/3d/3DModelLoaderExample/CMakeLists.txt +++ b/examples/3d/3DModelLoaderExample/CMakeLists.txt @@ -1,7 +1,10 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(3DModelLoaderExample ${SOURCES}) - +define_example(3DModelLoaderExample) target_link_libraries(3DModelLoaderExample of::ofxAssimpModelLoader) -# copy_example_resource(3DModelLoaderExample bin/data/penguin.jpg) +copy_example_resource(3DModelLoaderExample bin/data/penguin.3ds) +copy_example_resource(3DModelLoaderExample bin/data/penguin.dae) +copy_example_resource(3DModelLoaderExample bin/data/penguin.jpg) +copy_example_resource(3DModelLoaderExample bin/data/penguin.obj) +copy_example_resource(3DModelLoaderExample bin/data/penguin.obj.mtl) +copy_example_resource(3DModelLoaderExample bin/data/penguin.ply) +copy_example_resource(3DModelLoaderExample bin/data/penguin.stl) \ No newline at end of file diff --git a/examples/3d/3DPrimitivesExample/CMakeLists.txt b/examples/3d/3DPrimitivesExample/CMakeLists.txt index 8749d598fbf..7769ad6c53d 100644 --- a/examples/3d/3DPrimitivesExample/CMakeLists.txt +++ b/examples/3d/3DPrimitivesExample/CMakeLists.txt @@ -1,5 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(3DPrimitivesExample ${SOURCES}) - -copy_example_resource(3DPrimitivesExample bin/data/of.png) +define_example(3DPrimitivesExample) +copy_example_resource(3DPrimitivesExample bin/data/of.png) \ No newline at end of file diff --git a/examples/3d/advanced3dExample/CMakeLists.txt b/examples/3d/advanced3dExample/CMakeLists.txt index 83f70e24c0c..764808510c8 100644 --- a/examples/3d/advanced3dExample/CMakeLists.txt +++ b/examples/3d/advanced3dExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(advanced3dExample ${SOURCES}) +define_example(advanced3dExample) \ No newline at end of file diff --git a/examples/3d/assimpExample/CMakeLists.txt b/examples/3d/assimpExample/CMakeLists.txt index b5ee7e99854..84d5b545f75 100644 --- a/examples/3d/assimpExample/CMakeLists.txt +++ b/examples/3d/assimpExample/CMakeLists.txt @@ -1,5 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(assimpExample ${SOURCES}) - -target_link_libraries(assimpExample of::ofxAssimpModelLoader) +define_example(assimpExample) +target_link_libraries(assimpExample of::ofxAssimpModelLoader) \ No newline at end of file diff --git a/examples/3d/cameraLensOffsetExample/CMakeLists.txt b/examples/3d/cameraLensOffsetExample/CMakeLists.txt index c2f8f1c82d0..7b799f98451 100644 --- a/examples/3d/cameraLensOffsetExample/CMakeLists.txt +++ b/examples/3d/cameraLensOffsetExample/CMakeLists.txt @@ -1,7 +1,4 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(cameraLensOffsetExample ${SOURCES}) - +define_example(cameraLensOffsetExample) target_link_libraries(cameraLensOffsetExample of::ofxOpenCv) -copy_example_resource(cameraLensOffsetExample bin/data/haarcascade_frontalface_default.xml) +copy_example_resource(cameraLensOffsetExample bin/data/haarcascade_frontalface_default.xml) \ No newline at end of file diff --git a/examples/3d/cameraParentingExample/CMakeLists.txt b/examples/3d/cameraParentingExample/CMakeLists.txt index ae679c717e1..713ebab1d6c 100644 --- a/examples/3d/cameraParentingExample/CMakeLists.txt +++ b/examples/3d/cameraParentingExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(cameraParentingExample ${SOURCES}) +define_example(cameraParentingExample) \ No newline at end of file diff --git a/examples/3d/cameraRibbonExample/CMakeLists.txt b/examples/3d/cameraRibbonExample/CMakeLists.txt index 77ba4d1dabd..918e9f466d5 100644 --- a/examples/3d/cameraRibbonExample/CMakeLists.txt +++ b/examples/3d/cameraRibbonExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(cameraRibbonExample ${SOURCES}) +define_example(cameraRibbonExample) \ No newline at end of file diff --git a/examples/3d/easyCamExample/CMakeLists.txt b/examples/3d/easyCamExample/CMakeLists.txt index 3e48645b70f..adc444c9a9b 100644 --- a/examples/3d/easyCamExample/CMakeLists.txt +++ b/examples/3d/easyCamExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(easyCamExample ${SOURCES}) +define_example(easyCamExample) \ No newline at end of file diff --git a/examples/3d/meshFromCameraExample/CMakeLists.txt b/examples/3d/meshFromCameraExample/CMakeLists.txt index 22ab5809f27..6311a659fb2 100644 --- a/examples/3d/meshFromCameraExample/CMakeLists.txt +++ b/examples/3d/meshFromCameraExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(meshFromCameraExample ${SOURCES}) +define_example(meshFromCameraExample) \ No newline at end of file diff --git a/examples/3d/modelNoiseExample/CMakeLists.txt b/examples/3d/modelNoiseExample/CMakeLists.txt index 2c09b928e60..3da671d97e4 100644 --- a/examples/3d/modelNoiseExample/CMakeLists.txt +++ b/examples/3d/modelNoiseExample/CMakeLists.txt @@ -1,5 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(modelNoiseExample ${SOURCES}) - -target_link_libraries(modelNoiseExample of::ofxAssimpModelLoader) +define_example(modelNoiseExample) +target_link_libraries(modelNoiseExample of::ofxAssimpModelLoader) \ No newline at end of file diff --git a/examples/3d/normalsExample/CMakeLists.txt b/examples/3d/normalsExample/CMakeLists.txt index d8ebd191bff..cd7af3c92dc 100644 --- a/examples/3d/normalsExample/CMakeLists.txt +++ b/examples/3d/normalsExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(normalsExample ${SOURCES}) +define_example(normalsExample) \ No newline at end of file diff --git a/examples/3d/ofBoxExample/CMakeLists.txt b/examples/3d/ofBoxExample/CMakeLists.txt index 26a936dada9..38e9c0a7541 100644 --- a/examples/3d/ofBoxExample/CMakeLists.txt +++ b/examples/3d/ofBoxExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(ofBoxExample ${SOURCES}) +define_example(ofBoxExample) \ No newline at end of file diff --git a/examples/3d/ofNodeExample/CMakeLists.txt b/examples/3d/ofNodeExample/CMakeLists.txt index e013a2b1929..9a09d64b1cb 100644 --- a/examples/3d/ofNodeExample/CMakeLists.txt +++ b/examples/3d/ofNodeExample/CMakeLists.txt @@ -1,7 +1,4 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(ofNodeExample ${SOURCES}) - +define_example(ofNodeExample) target_link_libraries(ofNodeExample of::ofxGui) copy_example_resource(ofNodeExample bin/data/engine.wav) @@ -9,4 +6,4 @@ copy_example_resource(ofNodeExample bin/data/horn.mp3) copy_example_resource(ofNodeExample bin/data/reverse.mp3) copy_example_resource(ofNodeExample bin/data/oflogo.ply) copy_example_resource(ofNodeExample bin/data/truck.ply) -copy_example_resource(ofNodeExample bin/data/wheel.ply) +copy_example_resource(ofNodeExample bin/data/wheel.ply) \ No newline at end of file diff --git a/examples/3d/orientationExample/CMakeLists.txt b/examples/3d/orientationExample/CMakeLists.txt index 44bb3003eaf..d6aaa10c552 100644 --- a/examples/3d/orientationExample/CMakeLists.txt +++ b/examples/3d/orientationExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(orientationExample ${SOURCES}) +define_example(orientationExample) \ No newline at end of file diff --git a/examples/3d/pathsToMeshesExample/CMakeLists.txt b/examples/3d/pathsToMeshesExample/CMakeLists.txt index c664a269079..694947fea2c 100644 --- a/examples/3d/pathsToMeshesExample/CMakeLists.txt +++ b/examples/3d/pathsToMeshesExample/CMakeLists.txt @@ -1,5 +1,3 @@ +define_example(pathsToMeshesExample) -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(pathsToMeshesExample ${SOURCES}) - -copy_example_resource(pathsToMeshesExample bin/data/frabk.ttf) +copy_example_resource(pathsToMeshesExample bin/data/frabk.ttf) \ No newline at end of file diff --git a/examples/3d/pointCloudExample/CMakeLists.txt b/examples/3d/pointCloudExample/CMakeLists.txt index e30abdfd6f0..7821831e5c9 100644 --- a/examples/3d/pointCloudExample/CMakeLists.txt +++ b/examples/3d/pointCloudExample/CMakeLists.txt @@ -1,5 +1,3 @@ +define_example(pointCloudExample) -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(pointCloudExample ${SOURCES}) - -copy_example_resource(pointCloudExample bin/data/linzer.png) +copy_example_resource(pointCloudExample bin/data/linzer.png) \ No newline at end of file diff --git a/examples/3d/pointPickerExample/CMakeLists.txt b/examples/3d/pointPickerExample/CMakeLists.txt index 6f657a51198..d2206d76f93 100644 --- a/examples/3d/pointPickerExample/CMakeLists.txt +++ b/examples/3d/pointPickerExample/CMakeLists.txt @@ -1,5 +1,3 @@ +define_example(pointPickerExample) -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(pointPickerExample ${SOURCES}) - -copy_example_resource(pointPickerExample bin/data/lofi-bunny.ply) +copy_example_resource(pointPickerExample bin/data/lofi-bunny.ply) \ No newline at end of file diff --git a/examples/3d/quaternionArcballExample/CMakeLists.txt b/examples/3d/quaternionArcballExample/CMakeLists.txt index 18f8764ec15..d35ca262d2a 100644 --- a/examples/3d/quaternionArcballExample/CMakeLists.txt +++ b/examples/3d/quaternionArcballExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(quaternionArcballExample ${SOURCES}) +define_example(quaternionArcballExample) \ No newline at end of file diff --git a/examples/3d/quaternionLatLongExample/CMakeLists.txt b/examples/3d/quaternionLatLongExample/CMakeLists.txt index 0a538a910c5..82872479233 100644 --- a/examples/3d/quaternionLatLongExample/CMakeLists.txt +++ b/examples/3d/quaternionLatLongExample/CMakeLists.txt @@ -1,5 +1,3 @@ +define_example(quaternionLatLongExample) -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(quaternionLatLongExample ${SOURCES}) - -copy_example_resource(quaternionLatLongExample bin/data/earth.jpg) +copy_example_resource(quaternionLatLongExample bin/data/earth.jpg) \ No newline at end of file diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index da10a6326c7..c7d38393172 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,34 +1,36 @@ +# Macro for defining an example with all of its properties macro(define_example TARGET_NAME) # A macro is executed in the caller's scope (current list is the caller) + set(BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>") + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) + add_executable(${TARGET_NAME}) - target_sources(${TARGET_NAME} PRIVATE ${ARGN}) + target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) - - target_compile_features(openframeworks PUBLIC cxx_std_17) - set_target_properties(openframeworks PROPERTIES CXX_EXTENSIONS OFF) - target_link_libraries(${TARGET_NAME} of::openframeworks) - get_filename_component(DIR_PATH ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) - get_filename_component(DIR_NAME ${DIR_PATH} NAME) - if (NOT OF_IS_MAIN_PROJECT) # If including OF from another project - set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/examples/${DIR_NAME}") - else () # If building OF directly in the root - set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "examples-${DIR_NAME}") - endif () + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCES}) + + target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17) + 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}") - set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$,Debug,Release>") + get_filename_component(parent_path ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) + get_filename_component(example_name ${parent_path} NAME) + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/examples/${example_name}") endmacro() +# Function to let the build system copy resource files to the target location after compiling function(copy_example_resource TARGET_NAME SOURCE_FILE) get_filename_component(__FILENAME ${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE} NAME) - copy_file_after_build( - ${TARGET_NAME} - "${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE}" - "${CMAKE_BINARY_DIR}/bin/$,Debug,Release>/data/${__FILENAME}" + copy_file_after_build(${TARGET_NAME} + "${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>/data/${__FILENAME}" ) endfunction() +# Folders with examples to build add_subdirectory(3d) # add_subdirectory(android) # add_subdirectory(communication) diff --git a/libs/openFrameworks/CMakeLists.txt b/libs/openFrameworks/CMakeLists.txt new file mode 100644 index 00000000000..f8e38e3e883 --- /dev/null +++ b/libs/openFrameworks/CMakeLists.txt @@ -0,0 +1,14 @@ +# We want all files in the folder to be our sources (everything should be shown in the IDE) +file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) +target_sources(openframeworks PRIVATE ${SOURCES}) +target_include_directories(openframeworks PUBLIC ${CMAKE_CURRENT_LIST_DIR}) +source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "src" FILES ${SOURCES}) + +# And any subfolder (except starting with a dot) becomes an include directory +file(GLOB subfolders ${CMAKE_CURRENT_LIST_DIR}/**) +foreach(subfolder ${subfolders}) + get_filename_component(sub_name ${subfolder} NAME) + if (IS_DIRECTORY ${subfolder} AND NOT ${sub_name} MATCHES "^\\.") + target_include_directories(openframeworks PUBLIC ${subfolder}) + endif() +endforeach() \ No newline at end of file diff --git a/libs/openFrameworks/ofSources.cmake b/libs/openFrameworks/ofSources.cmake deleted file mode 100644 index c6440375764..00000000000 --- a/libs/openFrameworks/ofSources.cmake +++ /dev/null @@ -1,25 +0,0 @@ - -# A macro that will add all the files in the given module directory -macro(add_module MODULE_NAME) - target_include_directories(openframeworks PUBLIC ${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}) # Include directory - file(GLOB OF_SOURCES "${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}/**") # Find and add all the source files - target_sources(openframeworks PRIVATE ${OF_SOURCES}) - source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/${MODULE_NAME}" PREFIX ${MODULE_NAME} FILES ${OF_SOURCES}) -endmacro() - -set_property(GLOBAL PROPERTY USE_FOLDERS ON) -target_include_directories(openframeworks PUBLIC ${CMAKE_CURRENT_LIST_DIR}) - -add_module(3d) -add_module(app) -add_module(communication) -add_module(events) -add_module(gl) -add_module(graphics) -add_module(math) -add_module(sound) -add_module(types) -add_module(utils) -add_module(video) - -target_sources(openframeworks PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ofSources.cmake) \ No newline at end of file From 1ebf023c01c5082756d28b93af5cf6a5b80a3306 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Thu, 16 Mar 2023 08:50:59 +0100 Subject: [PATCH 07/49] Improve CMake comment --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 641c2b9eea4..c994ca936d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,7 @@ target_compile_definitions(openframeworks PUBLIC # Compiler flags specific to MSVC if(MSVC) - target_compile_options(openframeworks PUBLIC "/Zc:__cplusplus") # Force MSVC to set macro correctly + target_compile_options(openframeworks PUBLIC "/Zc:__cplusplus") # Force MSVC to set __cplusplus macro correctly target_compile_options(openframeworks PUBLIC "/MP") # Enable multi-core compilation # Ignore linker warning that no .pdb file is available for debugging set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ignore:4099 /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRT") From df337d11362fbeee044c461a183002b1efec6289 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Thu, 16 Mar 2023 16:34:48 +0100 Subject: [PATCH 08/49] Implement CMake scripts for Linux and fix a few preprocessor guards --- CMakeLists.txt | 2 +- addons/ofxOpenCv/CMakeLists.txt | 6 +- cmake/download_and_link_deps.cmake | 99 ++++------ cmake/find_linux_deps.cmake | 186 ++++++++++++++++++ cmake/{ => modules}/FindCairo.cmake | 0 cmake/modules/FindFreeImage.cmake | 71 +++++++ cmake/{ => modules}/FindGLFW3.cmake | 44 ++--- cmake/modules/FindGLIB.cmake | 122 ++++++++++++ cmake/modules/FindGStreamer.cmake | 127 ++++++++++++ cmake/modules/FindGStreamerPluginsBase.cmake | 94 +++++++++ cmake/modules/FindKissFFT.cmake | 46 +++++ cmake/modules/FindRtAudio.cmake | 47 +++++ cmake/modules/FindUDev.cmake | 85 ++++++++ cmake/modules/Findsndfile.cmake | 36 ++++ cmake/modules/Finduriparser.cmake | 35 ++++ cmake/modules/MacroFindGStreamerLibrary.cmake | 57 ++++++ .../3d/3DModelLoaderExample/CMakeLists.txt | 10 +- .../3d/3DPrimitivesExample/CMakeLists.txt | 3 +- .../3d/cameraLensOffsetExample/CMakeLists.txt | 4 +- examples/3d/ofNodeExample/CMakeLists.txt | 9 +- .../3d/pathsToMeshesExample/CMakeLists.txt | 4 +- examples/3d/pointCloudExample/CMakeLists.txt | 4 +- examples/3d/pointPickerExample/CMakeLists.txt | 4 +- .../quaternionLatLongExample/CMakeLists.txt | 4 +- examples/CMakeLists.txt | 24 ++- libs/openFrameworks/CMakeLists.txt | 11 ++ .../video/ofDirectShowPlayer.cpp | 6 + libs/openFrameworks/video/ofGstUtils.cpp | 4 +- .../video/ofGstVideoGrabber.cpp | 4 +- .../openFrameworks/video/ofGstVideoPlayer.cpp | 4 +- 30 files changed, 1021 insertions(+), 131 deletions(-) create mode 100644 cmake/find_linux_deps.cmake rename cmake/{ => modules}/FindCairo.cmake (100%) create mode 100644 cmake/modules/FindFreeImage.cmake rename cmake/{ => modules}/FindGLFW3.cmake (61%) create mode 100644 cmake/modules/FindGLIB.cmake create mode 100644 cmake/modules/FindGStreamer.cmake create mode 100644 cmake/modules/FindGStreamerPluginsBase.cmake create mode 100644 cmake/modules/FindKissFFT.cmake create mode 100644 cmake/modules/FindRtAudio.cmake create mode 100644 cmake/modules/FindUDev.cmake create mode 100644 cmake/modules/Findsndfile.cmake create mode 100644 cmake/modules/Finduriparser.cmake create mode 100644 cmake/modules/MacroFindGStreamerLibrary.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c994ca936d0..32e92ee8265 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.22) +cmake_minimum_required(VERSION 3.16) project(openframeworks) include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) diff --git a/addons/ofxOpenCv/CMakeLists.txt b/addons/ofxOpenCv/CMakeLists.txt index c41f19ff57b..a8b84c98e50 100644 --- a/addons/ofxOpenCv/CMakeLists.txt +++ b/addons/ofxOpenCv/CMakeLists.txt @@ -1,2 +1,6 @@ define_addon(ofxOpenCv) -target_link_libraries(ofxOpenCv of::opencv of::ippicv) \ No newline at end of file +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 diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index d4eca146202..4cb969a8c40 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -3,7 +3,7 @@ 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}) +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) @@ -37,7 +37,7 @@ if(OF_TARGET_ARCHITECTURE STREQUAL "auto") # msys-clang and msys-ucrt must be specified manually elseif (MINGW) set(OF_TARGET_ARCHITECTURE "mingw" CACHE STRING "" FORCE) - elseif (LINUX) + elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") set(OF_TARGET_ARCHITECTURE "linux64" CACHE STRING "" FORCE) # 'linuxarmv6l' and 'linuxarmv7l' must be specified manually else () @@ -126,30 +126,46 @@ endif() +# Find system packages +find_package(OpenGL) +if (NOT OpenGL_FOUND) # This should never be not found on windows + message(SEND_ERROR "Dependency OpenGL not found. On Linux, please install it using your system's equivalent of 'sudo apt install libgl1-mesa-dev'") +endif() +target_include_directories(openframeworks PUBLIC ${OPENGL_INCLUDE_DIRS}) +target_link_libraries(openframeworks ${OPENGL_LIBRARIES}) + +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # All Linux-only packages (that are part of apothecary on all platforms except Linux) + include(${CMAKE_CURRENT_LIST_DIR}/find_linux_deps.cmake) + find_linux_deps() +endif() + + + # TODO: Now, download glut since it's somehow not part of the apothecary. Glut support seems to be deprecated -CPMAddPackage( - NAME of-deps-glut - GIT_REPOSITORY "https://github.com/markkilgard/glut" - GIT_TAG "8cd96cb440f1f2fac3a154227937be39d06efa53" - DOWNLOAD_EXTRACT_TIMESTAMP TRUE - DOWNLOAD_ONLY YES -) -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/GL) +if (WIN32) + CPMAddPackage( + NAME of-deps-glut + GIT_REPOSITORY "https://github.com/markkilgard/glut" + GIT_TAG "8cd96cb440f1f2fac3a154227937be39d06efa53" + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + DOWNLOAD_ONLY YES + ) + 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::cairo + of::cairo of::glm of::utf8 of::glfw - of::glut of::fmod of::FreeImage of::rtAudio - of::videoInput of::uriparser of::openssl of::curl @@ -160,54 +176,17 @@ target_link_libraries(openframeworks # 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.lib) endif() -if (OF_TARGET_ARCHITECTURE STREQUAL "msvc" OR OF_TARGET_ARCHITECTURE STREQUAL "macos") - target_link_libraries(openframeworks of::glew) +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) endif() -find_package(OpenGL) -if (NOT OpenGL_FOUND) # This should never be not found on windows - message(FATAL_ERROR "Dependency OpenGL not found. On Linux, please install it using your system's equivalent of 'sudo apt install libgl1-mesa-dev'") -endif() -target_include_directories(openframeworks PUBLIC ${OPENGL_INCLUDE_DIRS}) -target_link_libraries(openframeworks ${OPENGL_LIBRARIES}) - -if (LINUX) - find_package(assimp) - if (NOT assimp_FOUND) - message(FATAL_ERROR "Dependency Assimp not found. Please install it using your system's equivalent of 'sudo apt install libassimp-dev'") - endif() - add_library(of-deps-assimp INTERFACE) - add_library(of::assimp ALIAS of-deps-assimp) - target_include_directories(of-deps-assimp INTERFACE ${assimp_INCLUDE_DIRS}) - target_link_libraries(of-deps-assimp INTERFACE ${assimp_LIBRARIES}) - - find_package(OpenCV) - if (NOT OpenCV_FOUND) - message(FATAL_ERROR "Dependency OpenCV not found. Please install it using your system's equivalent of 'sudo apt install libopencv-dev'") - endif() - add_library(of-deps-opencv INTERFACE) - add_library(of::opencv ALIAS of-deps-opencv) - target_include_directories(of-deps-opencv INTERFACE ${OpenCV_INCLUDE_DIRS}) - target_link_libraries(of-deps-opencv INTERFACE ${OpenCV_LIBS}) - - find_package(Cairo) - if (NOT Cairo_FOUND) - message(FATAL_ERROR "Dependency Cairo not found. Please install it using your system's equivalent of 'sudo apt install libcairo-dev'") - endif() - add_library(of-deps-cairo INTERFACE) - add_library(of::cairo ALIAS of-deps-cairo) - target_include_directories(of-deps-cairo INTERFACE ${Cairo_INCLUDE_DIRS}) - target_link_libraries(of-deps-cairo INTERFACE ${Cairo_LIBRARIES}) - - find_package(GLFW3) - if (NOT GLFW_FOUND) - message(FATAL_ERROR "Dependency GLFW not found. Please install it using your system's equivalent of 'sudo apt install libglfw-dev'") - endif() - add_library(of-deps-glfw INTERFACE) - add_library(of::glfw ALIAS of-deps-glfw) - target_include_directories(of-deps-glfw INTERFACE ${GLFW_INCLUDE_DIRS}) - target_link_libraries(of-deps-glfw INTERFACE ${GLFW_LIBRARIES}) +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::glew) endif() diff --git a/cmake/find_linux_deps.cmake b/cmake/find_linux_deps.cmake new file mode 100644 index 00000000000..8e73181aee1 --- /dev/null +++ b/cmake/find_linux_deps.cmake @@ -0,0 +1,186 @@ +function(find_linux_deps) + + find_package(assimp) + if (NOT assimp_FOUND) + message(SEND_ERROR "Dependency Assimp not found. Please install it using your system's equivalent of 'sudo apt install libassimp-dev'") + endif() + add_library(of-deps-assimp INTERFACE) + add_library(of::assimp ALIAS of-deps-assimp) + target_include_directories(of-deps-assimp INTERFACE ${ASSIMP_INCLUDE_DIRS}) + target_link_libraries(of-deps-assimp INTERFACE ${ASSIMP_LIBRARIES}) + + find_package(OpenCV) + if (NOT OpenCV_FOUND) + message(SEND_ERROR "Dependency OpenCV not found. Please install it using your system's equivalent of 'sudo apt install libopencv-dev'") + endif() + add_library(of-deps-opencv INTERFACE) + add_library(of::opencv ALIAS of-deps-opencv) + target_include_directories(of-deps-opencv INTERFACE ${OpenCV_INCLUDE_DIRS}) + target_link_libraries(of-deps-opencv INTERFACE ${OpenCV_LIBS}) + + find_package(Cairo) + if (NOT Cairo_FOUND) + message(SEND_ERROR "Dependency Cairo not found. Please install it using your system's equivalent of 'sudo apt install libcairo-dev'") + endif() + add_library(of-deps-cairo INTERFACE) + add_library(of::cairo ALIAS of-deps-cairo) + target_include_directories(of-deps-cairo INTERFACE ${CAIRO_INCLUDE_DIRS}) + target_link_libraries(of-deps-cairo INTERFACE ${CAIRO_LIBRARIES}) + + find_package(GLFW3) + if (NOT GLFW3_FOUND) + message(SEND_ERROR "Dependency GLFW not found. Please install it using your system's equivalent of 'sudo apt install libglfw3-dev'") + endif() + add_library(of-deps-glfw INTERFACE) + add_library(of::glfw ALIAS of-deps-glfw) + target_include_directories(of-deps-glfw INTERFACE ${GLFW3_INCLUDE_DIRS}) + target_link_libraries(of-deps-glfw INTERFACE ${GLFW3_LIBRARIES}) + + find_package(OpenSSL) + if (NOT OPENSSL_FOUND) + message(SEND_ERROR "Dependency OpenSSL not found. Please install it using your system's equivalent of 'sudo apt install libssl-dev'") + endif() + add_library(of-deps-openssl INTERFACE) + add_library(of::openssl ALIAS of-deps-openssl) + target_link_libraries(of-deps-openssl INTERFACE OpenSSL::SSL OpenSSL::Crypto) + + find_package(CURL) + if (NOT CURL_FOUND) + message(SEND_ERROR "Dependency CURL not found. Please install it using your system's equivalent of 'sudo apt install libcurl-dev'") + endif() + add_library(of-deps-curl INTERFACE) + add_library(of::curl ALIAS of-deps-curl) + target_link_libraries(of-deps-curl INTERFACE CURL::libcurl) + + find_package(Freetype) + if (NOT FREETYPE_FOUND) + message(SEND_ERROR "Dependency FreeType not found. Please install it using your system's equivalent of 'sudo apt install libfreetype-dev'") + endif() + add_library(of-deps-freetype INTERFACE) + add_library(of::freetype ALIAS of-deps-freetype) + target_link_libraries(of-deps-freetype INTERFACE Freetype::Freetype) + + find_package(pugixml) + if (NOT TARGET pugixml::pugixml) + message(SEND_ERROR "Dependency pugixml not found. Please install it using your system's equivalent of 'sudo apt install libpugixml-dev'") + endif() + add_library(of-deps-pugixml INTERFACE) + add_library(of::pugixml ALIAS of-deps-pugixml) + target_link_libraries(of-deps-pugixml INTERFACE pugixml::pugixml) + + find_package(uriparser) + if (NOT URIPARSER_FOUND) + message(SEND_ERROR "Dependency uriparser not found. Please install it using your system's equivalent of 'sudo apt install liburiparser-dev'") + endif() + add_library(of-deps-uriparser INTERFACE) + add_library(of::uriparser ALIAS of-deps-uriparser) + target_include_directories(of-deps-uriparser INTERFACE ${URIPARSER_INCLUDE_DIR}) + target_link_libraries(of-deps-uriparser INTERFACE ${URIPARSER_LIBRARY}) + + find_package(RtAudio) + if (NOT RTAUDIO_FOUND) + message(SEND_ERROR "Dependency RtAudio not found. Please install it using your system's equivalent of 'sudo apt install librtaudio-dev'") + endif() + add_library(of-deps-rtAudio INTERFACE) + add_library(of::rtAudio ALIAS of-deps-rtAudio) + target_include_directories(of-deps-rtAudio INTERFACE ${RTAUDIO_INCLUDE_DIR}) + target_link_libraries(of-deps-rtAudio INTERFACE ${RTAUDIO_LIBRARIES}) + + find_package(FreeImage) + if (NOT FREEIMAGE_FOUND) + message(SEND_ERROR "Dependency FreeImage not found. Please install it using your system's equivalent of 'sudo apt install libfreeimage-dev'") + endif() + add_library(of-deps-freeimage INTERFACE) + add_library(of::FreeImage ALIAS of-deps-freeimage) + target_include_directories(of-deps-freeimage INTERFACE ${FREEIMAGE_INCLUDE_DIR}) + target_link_libraries(of-deps-freeimage INTERFACE ${FREEIMAGE_LIBRARIES}) + + find_package(GLEW) + if (NOT GLEW_FOUND) + message(SEND_ERROR "Dependency GLEW not found. Please install it using your system's equivalent of 'sudo apt install libglew-dev'") + endif() + add_library(of-deps-glew INTERFACE) + add_library(of::glew ALIAS of-deps-glew) + target_link_libraries(of-deps-glew INTERFACE GLEW::GLEW) + + find_package(GLUT) + if (NOT GLUT_FOUND) + message(SEND_ERROR "Dependency GLUT not found. Please install it using your system's equivalent of 'sudo apt install freeglut3-dev'") + endif() + add_library(of-deps-glut INTERFACE) + add_library(of::glut ALIAS of-deps-glut) + target_link_libraries(of-deps-glut INTERFACE GLUT::GLUT) + + find_package(KissFFT) + if (NOT KISSFFT_FOUND) + message(SEND_ERROR "Dependency KissFFT not found. Please install it using your system's equivalent of 'sudo apt install libkissfft-dev'") + endif() + add_library(of-deps-kissfft INTERFACE) + add_library(of::KissFFT ALIAS of-deps-kissfft) + target_include_directories(of-deps-kissfft INTERFACE ${KISSFFT_INCLUDE_DIRS}) + target_link_libraries(of-deps-kissfft INTERFACE ${KISSFFT_LIBRARIES}) + + find_package(OpenAL) + if (NOT OPENAL_FOUND) + message(SEND_ERROR "Dependency OpenAL not found. Please install it using your system's equivalent of 'sudo apt install libopenal-dev'") + endif() + add_library(of-deps-openal INTERFACE) + add_library(of::OpenAL ALIAS of-deps-openal) + target_include_directories(of-deps-openal INTERFACE ${OPENAL_INCLUDE_DIR}) + target_link_libraries(of-deps-openal INTERFACE ${OPENAL_LIBRARY}) + + find_package(sndfile) + if (NOT SNDFILE_FOUND) + message(SEND_ERROR "Dependency sndfile not found. Please install it using your system's equivalent of 'sudo apt install libsndfile-dev'") + endif() + add_library(of-deps-sndfile INTERFACE) + add_library(of::sndfile ALIAS of-deps-sndfile) + target_include_directories(of-deps-sndfile INTERFACE ${SNDFILE_INCLUDE_DIR}) + target_link_libraries(of-deps-sndfile INTERFACE ${SNDFILE_LIBRARIES}) + + find_package(GLIB COMPONENTS gobject) + if (NOT GLIB_FOUND) + message(SEND_ERROR "Dependency GLIB not found. Please install it using your system's equivalent of 'sudo apt install libglib2.0-dev'") + endif() + add_library(of-deps-glib INTERFACE) + add_library(of::glib ALIAS of-deps-glib) + target_include_directories(of-deps-glib INTERFACE ${GLIB_INCLUDE_DIR} ${GLIBCONFIG_INCLUDE_DIR}) + target_link_libraries(of-deps-glib INTERFACE ${GLIB_LIBRARIES} ${GLIB_GOBJECT_LIBRARIES}) + + find_package(GStreamer) + if (NOT GSTREAMER_FOUND) + message(SEND_ERROR "Dependency GStreamer not found. Please install it using your system's equivalent of 'sudo apt install libgstreamer1.0-dev'") + endif() + add_library(of-deps-gstreamer INTERFACE) + add_library(of::gstreamer ALIAS of-deps-gstreamer) + target_include_directories(of-deps-gstreamer INTERFACE ${GSTREAMER_INCLUDE_DIR}) + target_link_libraries(of-deps-gstreamer INTERFACE ${GSTREAMER_LIBRARY} ${GSTREAMERBASE_LIBRARY}) + + find_package(GStreamerPluginsBase COMPONENTS video app) + if (NOT GSTREAMER_VIDEO_LIBRARY_FOUND) + message(SEND_ERROR "Dependency GStreamerPluginsBase not found (Video component). \nHint: 'sudo apt install libgstreamer-plugins-base1.0-dev' might do the trick") + endif() + if (NOT GSTREAMER_APP_LIBRARY_FOUND) + message(SEND_ERROR "Dependency GStreamerPluginsBase not found (App component). \nHint: 'sudo apt install libgstreamer-plugins-base1.0-dev' might do the trick") + endif() + target_include_directories(of-deps-gstreamer INTERFACE ${GSTREAMER_VIDEO_INCLUDE_DIR} ${GSTREAMER_APP_INCLUDE_DIR}) + target_link_libraries(of-deps-gstreamer INTERFACE ${GSTREAMER_VIDEO_LIBRARY} ${GSTREAMER_APP_LIBRARY}) + + find_package(Fontconfig) + if (NOT GLUT_FOUND) + message(SEND_ERROR "Dependency Fontconfig not found. Please install it using your system's equivalent of 'sudo apt install libfontconfig-dev'") + endif() + add_library(of-deps-fontconfig INTERFACE) + add_library(of::fontconfig ALIAS of-deps-fontconfig) + target_link_libraries(of-deps-fontconfig INTERFACE Fontconfig::Fontconfig) + + find_package(UDev) + if (NOT UDEV_FOUND) + message(SEND_ERROR "Dependency UDev not found. Please install it using your system's equivalent of 'sudo apt install libudev-dev'") + endif() + add_library(of-deps-udev INTERFACE) + add_library(of::udev ALIAS of-deps-udev) + target_include_directories(of-deps-udev INTERFACE ${UDEV_INCLUDE_DIRS}) + target_link_libraries(of-deps-udev INTERFACE ${UDEV_LIBRARIES}) + +endfunction() \ No newline at end of file diff --git a/cmake/FindCairo.cmake b/cmake/modules/FindCairo.cmake similarity index 100% rename from cmake/FindCairo.cmake rename to cmake/modules/FindCairo.cmake diff --git a/cmake/modules/FindFreeImage.cmake b/cmake/modules/FindFreeImage.cmake new file mode 100644 index 00000000000..8415416d364 --- /dev/null +++ b/cmake/modules/FindFreeImage.cmake @@ -0,0 +1,71 @@ +# +# Find FreeImage +# +# Try to find FreeImage. +# This module defines the following variables: +# - FREEIMAGE_INCLUDE_DIRS +# - FREEIMAGE_LIBRARIES +# - FREEIMAGE_FOUND +# +# The following variables can be set as arguments for the module. +# - FREEIMAGE_ROOT_DIR : Root library directory of FreeImage +# + +# Additional modules +include(FindPackageHandleStandardArgs) + +if (WIN32) + # Find include files + find_path( + FREEIMAGE_INCLUDE_DIR + NAMES FreeImage.h + PATHS + $ENV{PROGRAMFILES}/include + ${FREEIMAGE_ROOT_DIR}/include + DOC "The directory where FreeImage.h resides") + + # Find library files + find_library( + FREEIMAGE_LIBRARY + NAMES FreeImage + PATHS + $ENV{PROGRAMFILES}/lib + ${FREEIMAGE_ROOT_DIR}/lib) +else() + # Find include files + find_path( + FREEIMAGE_INCLUDE_DIR + NAMES FreeImage.h + PATHS + /usr/include + /usr/local/include + /sw/include + /opt/local/include + DOC "The directory where FreeImage.h resides") + + # Find library files + find_library( + FREEIMAGE_LIBRARY + NAMES freeimage + PATHS + /usr/lib64 + /usr/lib + /usr/local/lib64 + /usr/local/lib + /sw/lib + /opt/local/lib + ${FREEIMAGE_ROOT_DIR}/lib + DOC "The FreeImage library") +endif() + +# Handle REQUIRD argument, define *_FOUND variable +find_package_handle_standard_args(FreeImage DEFAULT_MSG FREEIMAGE_INCLUDE_DIR FREEIMAGE_LIBRARY) + +# Define GLFW_LIBRARIES and GLFW_INCLUDE_DIRS +if (FREEIMAGE_FOUND) + set(FREEIMAGE_LIBRARIES ${FREEIMAGE_LIBRARY}) + set(FREEIMAGE_INCLUDE_DIRS ${FREEIMAGE_INCLUDE_DIR}) +endif() + +# Hide some variables +mark_as_advanced(FREEIMAGE_INCLUDE_DIR FREEIMAGE_LIBRARY) \ No newline at end of file diff --git a/cmake/FindGLFW3.cmake b/cmake/modules/FindGLFW3.cmake similarity index 61% rename from cmake/FindGLFW3.cmake rename to cmake/modules/FindGLFW3.cmake index 62aededd6d7..487ef94b366 100644 --- a/cmake/FindGLFW3.cmake +++ b/cmake/modules/FindGLFW3.cmake @@ -22,46 +22,46 @@ include(FindPackageHandleStandardArgs) if (WIN32) # Find include files find_path( - GLFW_INCLUDE_DIR + GLFW3_INCLUDE_DIR NAMES GLFW/glfw3.h PATHS $ENV{PROGRAMFILES}/include - ${GLFW_ROOT_DIR}/include - DOC "The directory where GLFW/glfw.h resides") + ${GLFW3_ROOT_DIR}/include + DOC "The directory where GLFW/glfw3.h resides") # Use glfw3.lib for static library - if (GLFW_USE_STATIC_LIBS) - set(GLFW_LIBRARY_NAME glfw3) + if (GLFW3_USE_STATIC_LIBS) + set(GLFW3_LIBRARY_NAME glfw3) else() - set(GLFW_LIBRARY_NAME glfw3dll) + set(GLFW3_LIBRARY_NAME glfw3dll) endif() # Find library files find_library( - GLFW_LIBRARY - NAMES ${GLFW_LIBRARY_NAME} + GLFW3_LIBRARY + NAMES ${GLFW3_LIBRARY_NAME} PATHS $ENV{PROGRAMFILES}/lib - ${GLFW_ROOT_DIR}/lib) + ${GLFW3_ROOT_DIR}/lib) - unset(GLFW_LIBRARY_NAME) + unset(GLFW3_LIBRARY_NAME) else() # Find include files find_path( - GLFW_INCLUDE_DIR - NAMES GLFW/glfw.h + GLFW3_INCLUDE_DIR + NAMES GLFW/glfw3.h PATHS /usr/include /usr/local/include /sw/include /opt/local/include - DOC "The directory where GL/glfw.h resides") + DOC "The directory where GL/glfw3.h resides") # Find library files # Try to use static libraries find_library( - GLFW_LIBRARY - NAMES glfw3 + GLFW3_LIBRARY + NAMES glfw PATHS /usr/lib64 /usr/lib @@ -73,14 +73,14 @@ else() DOC "The GLFW library") endif() -# Handle REQUIRD argument, define *_FOUND variable -find_package_handle_standard_args(GLFW DEFAULT_MSG GLFW_INCLUDE_DIR GLFW_LIBRARY) +# Handle REQUIRED argument, define *_FOUND variable +find_package_handle_standard_args(GLFW3 DEFAULT_MSG GLFW3_INCLUDE_DIR GLFW3_LIBRARY) -# Define GLFW_LIBRARIES and GLFW_INCLUDE_DIRS -if (GLFW_FOUND) - set(GLFW_LIBRARIES ${OPENGL_LIBRARIES} ${GLFW_LIBRARY}) - set(GLFW_INCLUDE_DIRS ${GLFW_INCLUDE_DIR}) +# Define GLFW3_LIBRARIES and GLFW3_INCLUDE_DIRS +if (GLFW3_FOUND) + set(GLFW3_LIBRARIES ${OPENGL_LIBRARIES} ${GLFW3_LIBRARY}) + set(GLFW3_INCLUDE_DIRS ${GLFW3_INCLUDE_DIR}) endif() # Hide some variables -mark_as_advanced(GLFW_INCLUDE_DIR GLFW_LIBRARY) \ No newline at end of file +mark_as_advanced(GLFW3_INCLUDE_DIR GLFW3_LIBRARY) \ No newline at end of file diff --git a/cmake/modules/FindGLIB.cmake b/cmake/modules/FindGLIB.cmake new file mode 100644 index 00000000000..dba84496176 --- /dev/null +++ b/cmake/modules/FindGLIB.cmake @@ -0,0 +1,122 @@ +# - Try to find Glib and its components (gio, gobject etc) +# Once done, this will define +# +# GLIB_FOUND - system has Glib +# GLIB_INCLUDE_DIRS - the Glib include directories +# GLIB_LIBRARIES - link these to use Glib +# +# Optionally, the COMPONENTS keyword can be passed to find_package() +# and Glib components can be looked for. Currently, the following +# components can be used, and they define the following variables if +# found: +# +# gio: GLIB_GIO_LIBRARIES +# gobject: GLIB_GOBJECT_LIBRARIES +# gmodule: GLIB_GMODULE_LIBRARIES +# gthread: GLIB_GTHREAD_LIBRARIES +# +# Note that the respective _INCLUDE_DIR variables are not set, since +# all headers are in the same directory as GLIB_INCLUDE_DIRS. +# +# Copyright (C) 2012 Raphael Kubo da Costa +# +# 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS 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 ITS +# 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. + +find_package(PkgConfig QUIET) +pkg_check_modules(PC_GLIB QUIET glib-2.0) + +find_library(GLIB_LIBRARIES + NAMES glib-2.0 + HINTS ${PC_GLIB_LIBDIR} + ${PC_GLIB_LIBRARY_DIRS} +) + +# Files in glib's main include path may include glibconfig.h, which, +# for some odd reason, is normally in $LIBDIR/glib-2.0/include. +get_filename_component(_GLIB_LIBRARY_DIR ${GLIB_LIBRARIES} PATH) +find_path(GLIBCONFIG_INCLUDE_DIR + NAMES glibconfig.h + HINTS ${PC_LIBDIR} ${PC_LIBRARY_DIRS} ${_GLIB_LIBRARY_DIR} + ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS} + PATH_SUFFIXES glib-2.0/include +) + +find_path(GLIB_INCLUDE_DIR + NAMES glib.h + HINTS ${PC_GLIB_INCLUDEDIR} + ${PC_GLIB_INCLUDE_DIRS} + PATH_SUFFIXES glib-2.0 +) + +set(GLIB_INCLUDE_DIRS ${GLIB_INCLUDE_DIR} ${GLIBCONFIG_INCLUDE_DIR}) + +# Version detection +if (EXISTS "${GLIBCONFIG_INCLUDE_DIR}/glibconfig.h") + file(READ "${GLIBCONFIG_INCLUDE_DIR}/glibconfig.h" GLIBCONFIG_H_CONTENTS) + string(REGEX MATCH "#define GLIB_MAJOR_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}") + set(GLIB_VERSION_MAJOR "${CMAKE_MATCH_1}") + string(REGEX MATCH "#define GLIB_MINOR_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}") + set(GLIB_VERSION_MINOR "${CMAKE_MATCH_1}") + string(REGEX MATCH "#define GLIB_MICRO_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}") + set(GLIB_VERSION_MICRO "${CMAKE_MATCH_1}") + set(GLIB_VERSION "${GLIB_VERSION_MAJOR}.${GLIB_VERSION_MINOR}.${GLIB_VERSION_MICRO}") +endif () + +# Additional Glib components. We only look for libraries, as not all of them +# have corresponding headers and all headers are installed alongside the main +# glib ones. +foreach (_component ${GLIB_FIND_COMPONENTS}) + if (${_component} STREQUAL "gio") + find_library(GLIB_GIO_LIBRARIES NAMES gio-2.0 HINTS ${_GLIB_LIBRARY_DIR}) + set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GIO_LIBRARIES) + elseif (${_component} STREQUAL "gobject") + find_library(GLIB_GOBJECT_LIBRARIES NAMES gobject-2.0 HINTS ${_GLIB_LIBRARY_DIR}) + set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GOBJECT_LIBRARIES) + elseif (${_component} STREQUAL "gmodule") + find_library(GLIB_GMODULE_LIBRARIES NAMES gmodule-2.0 HINTS ${_GLIB_LIBRARY_DIR}) + set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GMODULE_LIBRARIES) + elseif (${_component} STREQUAL "gthread") + find_library(GLIB_GTHREAD_LIBRARIES NAMES gthread-2.0 HINTS ${_GLIB_LIBRARY_DIR}) + set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GTHREAD_LIBRARIES) + elseif (${_component} STREQUAL "gio-unix") + # gio-unix is compiled as part of the gio library, but the include paths + # are separate from the shared glib ones. Since this is currently only used + # by WebKitGTK we don't go to extraordinary measures beyond pkg-config. + pkg_check_modules(GIO_UNIX QUIET gio-unix-2.0) + endif () +endforeach () + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLIB REQUIRED_VARS GLIB_INCLUDE_DIRS GLIB_LIBRARIES ${ADDITIONAL_REQUIRED_VARS} + VERSION_VAR GLIB_VERSION) + +mark_as_advanced( + GLIBCONFIG_INCLUDE_DIR + GLIB_GIO_LIBRARIES + GLIB_GIO_UNIX_LIBRARIES + GLIB_GMODULE_LIBRARIES + GLIB_GOBJECT_LIBRARIES + GLIB_GTHREAD_LIBRARIES + GLIB_INCLUDE_DIR + GLIB_INCLUDE_DIRS + GLIB_LIBRARIES +) \ No newline at end of file diff --git a/cmake/modules/FindGStreamer.cmake b/cmake/modules/FindGStreamer.cmake new file mode 100644 index 00000000000..98d708ff3b6 --- /dev/null +++ b/cmake/modules/FindGStreamer.cmake @@ -0,0 +1,127 @@ +# - Try to find GStreamer +# Once done this will define +# +# GSTREAMER_FOUND - system has GStreamer +# GSTREAMER_INCLUDE_DIR - the GStreamer main include directory +# GSTREAMER_INCLUDE_DIRS - the GStreamer include directories +# GSTREAMER_LIBRARY - the main GStreamer library +# GSTREAMER_PLUGIN_DIR - the GStreamer plugin directory +# +# And for all the plugin libraries specified in the COMPONENTS +# of find_package, this module will define: +# +# GSTREAMER__LIBRARY_FOUND - system has +# GSTREAMER__LIBRARY - the library +# GSTREAMER__INCLUDE_DIR - the include directory +# +# Copyright (c) 2010, Collabora Ltd. +# @author George Kiagiadakis +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +if (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARY) + set(GStreamer_FIND_QUIETLY TRUE) +else() + set(GStreamer_FIND_QUIETLY FALSE) +endif() + +set(GSTREAMER_ABI_VERSION "1.0") + + +# Find the main library +find_package(PkgConfig) + +if (PKG_CONFIG_FOUND) + pkg_check_modules(PKG_GSTREAMER QUIET gstreamer-${GSTREAMER_ABI_VERSION}) + if(PKG_GSTREAMER_FOUND) + exec_program(${PKG_CONFIG_EXECUTABLE} + ARGS --variable pluginsdir gstreamer-${GSTREAMER_ABI_VERSION} + OUTPUT_VARIABLE PKG_GSTREAMER_PLUGIN_DIR) + endif() + set(GSTREAMER_DEFINITIONS ${PKG_GSTREAMER_CFLAGS}) +endif() + +find_library(GSTREAMER_LIBRARY + NAMES gstreamer-${GSTREAMER_ABI_VERSION} + HINTS ${PKG_GSTREAMER_LIBRARY_DIRS} ${PKG_GSTREAMER_LIBDIR}) + +find_library(GSTREAMERBASE_LIBRARY + NAMES gstbase-${GSTREAMER_ABI_VERSION} + HINTS ${PKG_GSTREAMER_LIBRARY_DIRS} ${PKG_GSTREAMER_LIBDIR}) + +find_path(GSTREAMER_INCLUDE_DIR + gst/gst.h + HINTS ${PKG_GSTREAMER_INCLUDE_DIRS} ${PKG_GSTREAMER_INCLUDEDIR} + PATH_SUFFIXES gstreamer-${GSTREAMER_ABI_VERSION}) + +find_path(GSTREAMER_gstconfig_INCLUDE_DIR + gst/gstconfig.h + HINTS ${PKG_GSTREAMER_INCLUDE_DIRS} ${PKG_GSTREAMER_INCLUDEDIR} + PATH_SUFFIXES gstreamer-${GSTREAMER_ABI_VERSION}) + +set(GSTREAMER_INCLUDE_DIRS ${GSTREAMER_INCLUDE_DIR} ${GSTREAMER_gstconfig_INCLUDE_DIR}) +list(REMOVE_DUPLICATES GSTREAMER_INCLUDE_DIRS) + +if (PKG_GSTREAMER_PLUGIN_DIR) + set(_GSTREAMER_PLUGIN_DIR ${PKG_GSTREAMER_PLUGIN_DIR}) +else() + get_filename_component(_GSTREAMER_LIB_DIR ${GSTREAMER_LIBRARY} PATH) + set(_GSTREAMER_PLUGIN_DIR ${_GSTREAMER_LIB_DIR}/gstreamer-${GSTREAMER_ABI_VERSION}) +endif() + +set(GSTREAMER_PLUGIN_DIR ${_GSTREAMER_PLUGIN_DIR} + CACHE PATH "The path to the gstreamer plugins installation directory") + +mark_as_advanced(GSTREAMER_LIBRARY + GSTREAMER_INCLUDE_DIR + GSTREAMER_gstconfig_INCLUDE_DIR + GSTREAMER_PLUGIN_DIR) + +# Version check +if (GStreamer_FIND_VERSION) + if (PKG_GSTREAMER_FOUND) + if("${PKG_GSTREAMER_VERSION}" VERSION_LESS "${GStreamer_FIND_VERSION}") + if(NOT GStreamer_FIND_QUIETLY) + message(STATUS "Found GStreamer version ${PKG_GSTREAMER_VERSION}, but at least version ${GStreamer_FIND_VERSION} is required") + endif() + set(GSTREAMER_VERSION_COMPATIBLE FALSE) + else() + set(GSTREAMER_VERSION_COMPATIBLE TRUE) + endif() + elseif(GSTREAMER_INCLUDE_DIR) + include(CheckCXXSourceCompiles) + + set(CMAKE_REQUIRED_INCLUDES ${GSTREAMER_INCLUDE_DIR}) + string(REPLACE "." "," _comma_version ${GStreamer_FIND_VERSION}) + # Hack to invalidate the cached value + set(GSTREAMER_VERSION_COMPATIBLE GSTREAMER_VERSION_COMPATIBLE) + + check_cxx_source_compiles(" +#define G_BEGIN_DECLS +#define G_END_DECLS +#include +#if GST_CHECK_VERSION(${_comma_version}) +int main() { return 0; } +#else +# error \"GStreamer version incompatible\" +#endif +" GSTREAMER_VERSION_COMPATIBLE) + + if (NOT GSTREAMER_VERSION_COMPATIBLE AND NOT GStreamer_FIND_QUIETLY) + message(STATUS "GStreamer ${GStreamer_FIND_VERSION} is required, but the version found is older") + endif() + else() + # We didn't find gstreamer at all + set(GSTREAMER_VERSION_COMPATIBLE FALSE) + endif() +else() + # No version constrain was specified, thus we consider the version compatible + set(GSTREAMER_VERSION_COMPATIBLE TRUE) +endif() + + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GStreamer DEFAULT_MSG + GSTREAMER_LIBRARY GSTREAMER_INCLUDE_DIRS + GSTREAMER_VERSION_COMPATIBLE ${_GSTREAMER_EXTRA_VARIABLES}) \ No newline at end of file diff --git a/cmake/modules/FindGStreamerPluginsBase.cmake b/cmake/modules/FindGStreamerPluginsBase.cmake new file mode 100644 index 00000000000..b4602e22982 --- /dev/null +++ b/cmake/modules/FindGStreamerPluginsBase.cmake @@ -0,0 +1,94 @@ +# - Try to find gst-plugins-base +# Once done this will define +# +# GSTREAMER_PLUGINS_BASE_FOUND - system has gst-plugins-base +# +# And for all the plugin libraries specified in the COMPONENTS +# of find_package, this module will define: +# +# GSTREAMER__LIBRARY_FOUND - system has +# GSTREAMER__LIBRARY - the library +# GSTREAMER__INCLUDE_DIR - the include directory +# +# Copyright (c) 2010, Collabora Ltd. +# @author George Kiagiadakis +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +set(GSTREAMER_ABI_VERSION "1.0") + + +# Find the pkg-config file for doing the version check +find_package(PkgConfig) + +if (PKG_CONFIG_FOUND) + pkg_check_modules(PKG_GSTREAMER_PLUGINS_BASE QUIET gstreamer-plugins-base-${GSTREAMER_ABI_VERSION}) +endif() + + +# Find the plugin libraries +include(MacroFindGStreamerLibrary) + +if (NOT DEFINED GStreamerPluginsBase_FIND_QUIETLY) + set(GStreamerPluginsBase_FIND_QUIETLY 0) +endif() + +macro(_find_gst_plugins_base_component _name _header) + find_gstreamer_library(${_name} ${_header} ${GSTREAMER_ABI_VERSION} ${GStreamerPluginsBase_FIND_QUIETLY}) + set(_GSTREAMER_PLUGINS_BASE_EXTRA_VARIABLES ${_GSTREAMER_PLUGINS_BASE_EXTRA_VARIABLES} + GSTREAMER_${_name}_LIBRARY GSTREAMER_${_name}_INCLUDE_DIR) +endmacro() + +foreach(_component ${GStreamerPluginsBase_FIND_COMPONENTS}) + if (${_component} STREQUAL "app") + _find_gst_plugins_base_component(APP gstappsrc.h) + elseif (${_component} STREQUAL "audio") + _find_gst_plugins_base_component(AUDIO audio.h) + elseif (${_component} STREQUAL "fft") + _find_gst_plugins_base_component(FFT gstfft.h) + elseif (${_component} STREQUAL "riff") + _find_gst_plugins_base_component(RIFF riff-ids.h) + elseif (${_component} STREQUAL "rtp") + _find_gst_plugins_base_component(RTP gstrtpbuffer.h) + elseif (${_component} STREQUAL "rtsp") + _find_gst_plugins_base_component(RTSP gstrtspdefs.h) + elseif (${_component} STREQUAL "sdp") + _find_gst_plugins_base_component(SDP gstsdp.h) + elseif (${_component} STREQUAL "tag") + _find_gst_plugins_base_component(TAG tag.h) + elseif (${_component} STREQUAL "pbutils") + _find_gst_plugins_base_component(PBUTILS pbutils.h) + elseif (${_component} STREQUAL "video") + _find_gst_plugins_base_component(VIDEO video.h) + else() + message (AUTHOR_WARNING "FindGStreamer.cmake: Invalid component \"${_component}\" was specified") + endif() +endforeach() + + +# Version check +if (GStreamerPluginsBase_FIND_VERSION) + if (PKG_GSTREAMER_PLUGINS_BASE_FOUND) + if("${PKG_GSTREAMER_PLUGINS_BASE_VERSION}" VERSION_LESS "${GStreamerPluginsBase_FIND_VERSION}") + if (NOT GStreamerPluginsBase_FIND_QUIETLY) + message(STATUS "Found gst-plugins-base version ${PKG_GSTREAMER_PLUGINS_BASE_VERSION}, but at least version ${GStreamerPluginsBase_FIND_VERSION} is required") + endif() + set(GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE FALSE) + else() + set(GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE TRUE) + endif() + else() + # We can't make any version checks without pkg-config, just assume version is compatible and hope... + set(GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE TRUE) + endif() +else() + # No version constrain was specified, thus we consider the version compatible + set(GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE TRUE) +endif() + + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GStreamerPluginsBase DEFAULT_MSG + GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE + ${_GSTREAMER_PLUGINS_BASE_EXTRA_VARIABLES}) \ No newline at end of file diff --git a/cmake/modules/FindKissFFT.cmake b/cmake/modules/FindKissFFT.cmake new file mode 100644 index 00000000000..b4b10a8f318 --- /dev/null +++ b/cmake/modules/FindKissFFT.cmake @@ -0,0 +1,46 @@ +#.rst: +# FindKissFFT +# ------------ +# Finds the KissFFT as a Fast Fourier Transformation (FFT) library +# +# This will define the following variables: +# +# KISSFFT_FOUND - System has KissFFT +# KISSFFT_INCLUDE_DIRS - the KissFFT include directory +# KISSFFT_LIBRARIES - the KissFFT libraries +# + +if(ENABLE_INTERNAL_KISSFFT) + # KissFFT is located in xbmc/contrib/kissfft + set(KISSFFT_FOUND TRUE) + set(KISSFFT_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/xbmc/contrib") + message(STATUS "Found KissFFT: ${KISSFFT_INCLUDE_DIRS}") +else() + find_package(PkgConfig) + if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_KISSFFT kissfft QUIET) + endif() + + find_path(KISSFFT_INCLUDE_DIR kissfft/kiss_fft.h kissfft/kiss_fftr.h + PATHS ${PC_KISSFFT_INCLUDEDIR}) + find_library(KISSFFT_LIBRARY NAMES kissfft-float kissfft-int32 kissfft-int16 kissfft-simd + PATHS ${PC_KISSFFT_LIBDIR}) + + # Check if all REQUIRED_VARS are satisfied and set KISSFFT_FOUND + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(KissFFT REQUIRED_VARS KISSFFT_INCLUDE_DIR KISSFFT_LIBRARY) + + if(KISSFFT_FOUND) + set(KISSFFT_INCLUDE_DIRS ${KISSFFT_INCLUDE_DIR}/kissfft) + set(KISSFFT_LIBRARIES ${KISSFFT_LIBRARY}) + + if(NOT TARGET kissfft) + add_library(kissfft UNKNOWN IMPORTED) + set_target_properties(kissfft PROPERTIES + IMPORTED_LOCATION "${KISSFFT_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${KISSFFT_INCLUDE_DIR}") + endif() + endif() + + mark_as_advanced(KISSFFT_INCLUDE_DIR KISSFFT_LIBRARY) +endif() \ No newline at end of file diff --git a/cmake/modules/FindRtAudio.cmake b/cmake/modules/FindRtAudio.cmake new file mode 100644 index 00000000000..50dde38b17a --- /dev/null +++ b/cmake/modules/FindRtAudio.cmake @@ -0,0 +1,47 @@ +# https://github.com/idiap/juicer/blob/master/cmake/FindRtAudio.cmake +# +# Copyright 2015 by Idiap Research Institute +# +# Licensed under 3-clause BSD. +# +# Author(s): +# Phil Garner, November 2015 +# +# ...but basically copied from FindSndFile in libube, in turn from the examples +# on the web. +# + +# +# Try to find RtAudio +# Once done this will define +# RTAUDIO_FOUND - System has RtAudio +# RTAUDIO_INCLUDE_DIR - The RtAudio include directories +# RTAUDIO_LIBRARIES - The libraries needed to use RtAudio +# RTAUDIO_DEFINITIONS - Compiler switches required for using RtAudio +# RTAUDIO_VERSION_STRING - the version of RtAudio found +# + +find_package(PkgConfig) +pkg_check_modules(PC_RTAUDIO rtaudio) + +set(RTAUDIO_DEFINITIONS ${PC_RTAUDIO_CFLAGS_OTHER}) +set(RTAUDIO_VERSION_STRING ${PC_RTAUDIO_VERSION}) + +find_path( + RTAUDIO_INCLUDE_DIR RtAudio.h + HINTS ${PC_RTAUDIO_INCLUDEDIR} ${PC_RTAUDIO_INCLUDE_DIRS} +) + +find_library( + RTAUDIO_LIBRARIES NAMES rtaudio + HINTS ${PC_RTAUDIO_LIBDIR} ${PC_RTAUDIO_LIBRARY_DIRS} +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + RtAudio + REQUIRED_VARS RTAUDIO_LIBRARIES RTAUDIO_INCLUDE_DIR + VERSION_VAR RTAUDIO_VERSION_STRING +) + +#mark_as_advanced(RTAUDIO_INCLUDE_DIR RTAUDIO_LIBRARIES) \ No newline at end of file diff --git a/cmake/modules/FindUDev.cmake b/cmake/modules/FindUDev.cmake new file mode 100644 index 00000000000..0ee4a76dfc7 --- /dev/null +++ b/cmake/modules/FindUDev.cmake @@ -0,0 +1,85 @@ +# - try to find the udev library +# +# Cache Variables: (probably not for direct use in your scripts) +# UDEV_INCLUDE_DIR +# UDEV_SOURCE_DIR +# UDEV_LIBRARY +# +# Non-cache variables you might use in your CMakeLists.txt: +# UDEV_FOUND +# UDEV_INCLUDE_DIRS +# UDEV_LIBRARIES +# +# Requires these CMake modules: +# FindPackageHandleStandardArgs (known included with CMake >=2.6.2) +# +# Original Authors: +# 2014, Kevin M. Godby +# 2021, Ryan Pavlik +# +# Copyright 2014, Kevin M. Godby +# Copyright 2021, Collabora, Ltd. +# +# SPDX-License-Identifier: BSL-1.0 +# +# 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) + +set(UDEV_ROOT_DIR + "${UDEV_ROOT_DIR}" + CACHE + PATH + "Directory to search for udev") + +if(NOT ANDROID) + find_package(PkgConfig QUIET) + if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_LIBUDEV QUIET libudev) + endif() +endif() + +find_library(UDEV_LIBRARY + NAMES + udev + PATHS + ${PC_LIBUDEV_LIBRARY_DIRS} + ${PC_LIBUDEV_LIBDIR} + HINTS + "${UDEV_ROOT_DIR}" + PATH_SUFFIXES + lib + ) + +get_filename_component(_libdir "${UDEV_LIBRARY}" PATH) + +find_path(UDEV_INCLUDE_DIR + NAMES + libudev.h + PATHS + ${PC_LIBUDEV_INCLUDE_DIRS} + ${PC_LIBUDEV_INCLUDEDIR} + HINTS + "${_libdir}" + "${_libdir}/.." + "${UDEV_ROOT_DIR}" + PATH_SUFFIXES + include + ) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(UDev + DEFAULT_MSG + UDEV_LIBRARY + UDEV_INCLUDE_DIR + ) + +if(UDEV_FOUND) + list(APPEND UDEV_LIBRARIES ${UDEV_LIBRARY}) + list(APPEND UDEV_INCLUDE_DIRS ${UDEV_INCLUDE_DIR}) + mark_as_advanced(UDEV_ROOT_DIR) +endif() + +mark_as_advanced(UDEV_INCLUDE_DIR + UDEV_LIBRARY) + diff --git a/cmake/modules/Findsndfile.cmake b/cmake/modules/Findsndfile.cmake new file mode 100644 index 00000000000..76edbe1c221 --- /dev/null +++ b/cmake/modules/Findsndfile.cmake @@ -0,0 +1,36 @@ +# +# Try to find libsndfile +# Once done this will define +# +# SNDFILE_FOUND - libsndfile was found +# SNDFILE_INCLUDE_DIR - the libsndfile include directory +# SNDFILE_LIBRARIES - libsndfile libraries to link to +# +# SPDX-FileCopyrightText: 2008 Sebastian Trueg +# SPDX-License-Identifier: BSD-3-Clause + +if ( SNDFILE_INCLUDE_DIR AND SNDFILE_LIBRARIES ) + # in cache already + SET(Sndfile_FIND_QUIETLY TRUE) +endif ( SNDFILE_INCLUDE_DIR AND SNDFILE_LIBRARIES ) + +IF (NOT WIN32) + pkg_check_modules(_pc_SNDFILE sndfile) +ENDIF (NOT WIN32) + + +FIND_PATH(SNDFILE_INCLUDE_DIR + NAMES sndfile.h + HINTS ${_pc_SNDFILE_INCLUDE_DIRS} +) + +FIND_LIBRARY(SNDFILE_LIBRARIES + NAMES sndfile + HINTS ${_pc_SNDFILE_LIBRARY_DIRS} +) + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(sndfile DEFAULT_MSG SNDFILE_INCLUDE_DIR SNDFILE_LIBRARIES ) + +# show the SNDFILE_INCLUDE_DIR and SNDFILE_LIBRARIES variables only in the advanced view +MARK_AS_ADVANCED(SNDFILE_INCLUDE_DIR SNDFILE_LIBRARIES ) \ No newline at end of file diff --git a/cmake/modules/Finduriparser.cmake b/cmake/modules/Finduriparser.cmake new file mode 100644 index 00000000000..90addfa7be7 --- /dev/null +++ b/cmake/modules/Finduriparser.cmake @@ -0,0 +1,35 @@ +# Find the UriParser library +# Defines: + +# URIPARSER_INCLUDE_DIR - uriparser include directory +# URIPARSER_LIBRARY - uriparser library file +# URIPARSER_FOUND - TRUE if uriparser is found + +if (URIPARSER_INCLUDE_DIR) + #check cache + set(URIPARSER_FIND_QUIETLY TRUE) +endif () + +if (NOT URIPARSER_INCLUDE_DIR) + find_path(URIPARSER_INCLUDE_DIR NAMES Uri.h PATH_SUFFIXES uriparser) + set(URIPARSER_INCLUDE_DIR ${URIPARSER_INCLUDE_DIR}/uriparser CACHE PATH "uriparser includes") +endif () + +find_library(URIPARSER_LIBRARY NAMES uriparser) + +if (URIPARSER_INCLUDE_DIR AND URIPARSER_LIBRARY) + set(URIPARSER_FOUND TRUE) + set(UriParser_FOUND TRUE) +endif () + +if (URIPARSER_FOUND) + if (NOT URIPARSER_FIND_QUIETLY) + message(STATUS "Found UriParser library: ${URIPARSER_LIBRARY}") + endif () +else () + if (NOT URIPARSER_FIND_QUIETLY) + message(FATAL_ERROR "Could NOT find UriParser library") + else () + message(STATUS "Could NOT find UriParser library") + endif () +endif () \ No newline at end of file diff --git a/cmake/modules/MacroFindGStreamerLibrary.cmake b/cmake/modules/MacroFindGStreamerLibrary.cmake new file mode 100644 index 00000000000..4f7ba737265 --- /dev/null +++ b/cmake/modules/MacroFindGStreamerLibrary.cmake @@ -0,0 +1,57 @@ +# - macro find_gstreamer_library +# +# Copyright (c) 2010, Collabora Ltd. +# @author George Kiagiadakis +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +macro(find_gstreamer_library _name _header _abi_version _quiet) + string(TOLOWER ${_name} _lower_name) + string(TOUPPER ${_name} _upper_name) + + if (GSTREAMER_${_upper_name}_LIBRARY AND GSTREAMER_${_upper_name}_INCLUDE_DIR) + set(_GSTREAMER_${_upper_name}_QUIET TRUE) + else() + set(_GSTREAMER_${_upper_name}_QUIET FALSE) + endif() + + if (PKG_CONFIG_FOUND) + pkg_check_modules(PKG_GSTREAMER_${_upper_name} QUIET gstreamer-${_lower_name}-${_abi_version}) + endif() + + find_library(GSTREAMER_${_upper_name}_LIBRARY + NAMES gst${_lower_name}-${_abi_version} + HINTS ${PKG_GSTREAMER_${_upper_name}_LIBRARY_DIRS} + ${PKG_GSTREAMER_${_upper_name}_LIBDIR} + ) + + find_path(GSTREAMER_${_upper_name}_INCLUDE_DIR + gst/${_lower_name}/${_header} + HINTS ${PKG_GSTREAMER_${_upper_name}_INCLUDE_DIRS} + ${PKG_GSTREAMER_${_upper_name}_INCLUDEDIR} + PATH_SUFFIXES gstreamer-${_abi_version} + ) + + if (GSTREAMER_${_upper_name}_LIBRARY AND GSTREAMER_${_upper_name}_INCLUDE_DIR) + set(GSTREAMER_${_upper_name}_LIBRARY_FOUND TRUE) + else() + set(GSTREAMER_${_upper_name}_LIBRARY_FOUND FALSE) + endif() + + if (NOT _GSTREAMER_${_upper_name}_QUIET AND NOT _quiet) + if (GSTREAMER_${_upper_name}_LIBRARY) + message(STATUS "Found GSTREAMER_${_upper_name}_LIBRARY: ${GSTREAMER_${_upper_name}_LIBRARY}") + else() + message(STATUS "Could NOT find GSTREAMER_${_upper_name}_LIBRARY") + endif() + + if (GSTREAMER_${_upper_name}_INCLUDE_DIR) + message(STATUS "Found GSTREAMER_${_upper_name}_INCLUDE_DIR: ${GSTREAMER_${_upper_name}_INCLUDE_DIR}") + else() + message(STATUS "Could NOT find GSTREAMER_${_upper_name}_INCLUDE_DIR") + endif() + endif() + + mark_as_advanced(GSTREAMER_${_upper_name}_LIBRARY GSTREAMER_${_upper_name}_INCLUDE_DIR) +endmacro() \ No newline at end of file diff --git a/examples/3d/3DModelLoaderExample/CMakeLists.txt b/examples/3d/3DModelLoaderExample/CMakeLists.txt index 5555641b27a..4a5a9ac160b 100644 --- a/examples/3d/3DModelLoaderExample/CMakeLists.txt +++ b/examples/3d/3DModelLoaderExample/CMakeLists.txt @@ -1,10 +1,2 @@ define_example(3DModelLoaderExample) -target_link_libraries(3DModelLoaderExample of::ofxAssimpModelLoader) - -copy_example_resource(3DModelLoaderExample bin/data/penguin.3ds) -copy_example_resource(3DModelLoaderExample bin/data/penguin.dae) -copy_example_resource(3DModelLoaderExample bin/data/penguin.jpg) -copy_example_resource(3DModelLoaderExample bin/data/penguin.obj) -copy_example_resource(3DModelLoaderExample bin/data/penguin.obj.mtl) -copy_example_resource(3DModelLoaderExample bin/data/penguin.ply) -copy_example_resource(3DModelLoaderExample bin/data/penguin.stl) \ No newline at end of file +target_link_libraries(3DModelLoaderExample of::ofxAssimpModelLoader) \ No newline at end of file diff --git a/examples/3d/3DPrimitivesExample/CMakeLists.txt b/examples/3d/3DPrimitivesExample/CMakeLists.txt index 7769ad6c53d..fed613fc9f4 100644 --- a/examples/3d/3DPrimitivesExample/CMakeLists.txt +++ b/examples/3d/3DPrimitivesExample/CMakeLists.txt @@ -1,2 +1 @@ -define_example(3DPrimitivesExample) -copy_example_resource(3DPrimitivesExample bin/data/of.png) \ No newline at end of file +define_example(3DPrimitivesExample) \ No newline at end of file diff --git a/examples/3d/cameraLensOffsetExample/CMakeLists.txt b/examples/3d/cameraLensOffsetExample/CMakeLists.txt index 7b799f98451..858aa02bda7 100644 --- a/examples/3d/cameraLensOffsetExample/CMakeLists.txt +++ b/examples/3d/cameraLensOffsetExample/CMakeLists.txt @@ -1,4 +1,2 @@ define_example(cameraLensOffsetExample) -target_link_libraries(cameraLensOffsetExample of::ofxOpenCv) - -copy_example_resource(cameraLensOffsetExample bin/data/haarcascade_frontalface_default.xml) \ No newline at end of file +target_link_libraries(cameraLensOffsetExample of::ofxOpenCv) \ No newline at end of file diff --git a/examples/3d/ofNodeExample/CMakeLists.txt b/examples/3d/ofNodeExample/CMakeLists.txt index 9a09d64b1cb..a9a16d7ba50 100644 --- a/examples/3d/ofNodeExample/CMakeLists.txt +++ b/examples/3d/ofNodeExample/CMakeLists.txt @@ -1,9 +1,2 @@ define_example(ofNodeExample) -target_link_libraries(ofNodeExample of::ofxGui) - -copy_example_resource(ofNodeExample bin/data/engine.wav) -copy_example_resource(ofNodeExample bin/data/horn.mp3) -copy_example_resource(ofNodeExample bin/data/reverse.mp3) -copy_example_resource(ofNodeExample bin/data/oflogo.ply) -copy_example_resource(ofNodeExample bin/data/truck.ply) -copy_example_resource(ofNodeExample bin/data/wheel.ply) \ No newline at end of file +target_link_libraries(ofNodeExample of::ofxGui) \ No newline at end of file diff --git a/examples/3d/pathsToMeshesExample/CMakeLists.txt b/examples/3d/pathsToMeshesExample/CMakeLists.txt index 694947fea2c..20280ec0f78 100644 --- a/examples/3d/pathsToMeshesExample/CMakeLists.txt +++ b/examples/3d/pathsToMeshesExample/CMakeLists.txt @@ -1,3 +1 @@ -define_example(pathsToMeshesExample) - -copy_example_resource(pathsToMeshesExample bin/data/frabk.ttf) \ No newline at end of file +define_example(pathsToMeshesExample) \ No newline at end of file diff --git a/examples/3d/pointCloudExample/CMakeLists.txt b/examples/3d/pointCloudExample/CMakeLists.txt index 7821831e5c9..dbb003a78be 100644 --- a/examples/3d/pointCloudExample/CMakeLists.txt +++ b/examples/3d/pointCloudExample/CMakeLists.txt @@ -1,3 +1 @@ -define_example(pointCloudExample) - -copy_example_resource(pointCloudExample bin/data/linzer.png) \ No newline at end of file +define_example(pointCloudExample) \ No newline at end of file diff --git a/examples/3d/pointPickerExample/CMakeLists.txt b/examples/3d/pointPickerExample/CMakeLists.txt index d2206d76f93..069e834fa62 100644 --- a/examples/3d/pointPickerExample/CMakeLists.txt +++ b/examples/3d/pointPickerExample/CMakeLists.txt @@ -1,3 +1 @@ -define_example(pointPickerExample) - -copy_example_resource(pointPickerExample bin/data/lofi-bunny.ply) \ No newline at end of file +define_example(pointPickerExample) \ No newline at end of file diff --git a/examples/3d/quaternionLatLongExample/CMakeLists.txt b/examples/3d/quaternionLatLongExample/CMakeLists.txt index 82872479233..a50642a4b8c 100644 --- a/examples/3d/quaternionLatLongExample/CMakeLists.txt +++ b/examples/3d/quaternionLatLongExample/CMakeLists.txt @@ -1,3 +1 @@ -define_example(quaternionLatLongExample) - -copy_example_resource(quaternionLatLongExample bin/data/earth.jpg) \ No newline at end of file +define_example(quaternionLatLongExample) \ No newline at end of file diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index c7d38393172..ffd1bcf0031 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -2,7 +2,12 @@ # Macro for defining an example with all of its properties macro(define_example TARGET_NAME) # A macro is executed in the caller's scope (current list is the caller) set(BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>") - file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) + + if (MSVC) # In MSVC we add all files so the resource files are shown in the IDE + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) + else() # But GCC doesn't like compiling resource files + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) + endif() add_executable(${TARGET_NAME}) target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) @@ -20,15 +25,20 @@ macro(define_example TARGET_NAME) # A macro is executed in the caller's sc get_filename_component(parent_path ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) get_filename_component(example_name ${parent_path} NAME) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/examples/${example_name}") + + # And copy the resource files to destination after building + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") endmacro() # Function to let the build system copy resource files to the target location after compiling -function(copy_example_resource TARGET_NAME SOURCE_FILE) - get_filename_component(__FILENAME ${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE} NAME) - copy_file_after_build(${TARGET_NAME} - "${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>/data/${__FILENAME}" - ) -endfunction() +# function(copy_example_resource TARGET_NAME SOURCE_FILE) +# get_filename_component(__FILENAME ${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE} NAME) +# copy_file_after_build(${TARGET_NAME} +# "${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>/data/${__FILENAME}" +# ) +# endfunction() # Folders with examples to build add_subdirectory(3d) diff --git a/libs/openFrameworks/CMakeLists.txt b/libs/openFrameworks/CMakeLists.txt index f8e38e3e883..0386db65178 100644 --- a/libs/openFrameworks/CMakeLists.txt +++ b/libs/openFrameworks/CMakeLists.txt @@ -1,5 +1,16 @@ # We want all files in the folder to be our sources (everything should be shown in the IDE) file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) + +# Except .m[m] files: We remove OBJ-C files from the list because gcc on Linux does not like them +file(GLOB_RECURSE OBJC_FILES ${CMAKE_CURRENT_LIST_DIR}/**.m) +foreach(objc ${OBJC_FILES}) + list(REMOVE_ITEM SOURCES ${objc}) +endforeach() +file(GLOB_RECURSE OBJC_FILES ${CMAKE_CURRENT_LIST_DIR}/**.mm) +foreach(objc ${OBJC_FILES}) + list(REMOVE_ITEM SOURCES ${objc}) +endforeach() + target_sources(openframeworks PRIVATE ${SOURCES}) target_include_directories(openframeworks PUBLIC ${CMAKE_CURRENT_LIST_DIR}) source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "src" FILES ${SOURCES}) diff --git a/libs/openFrameworks/video/ofDirectShowPlayer.cpp b/libs/openFrameworks/video/ofDirectShowPlayer.cpp index e42fb51f0cc..683e402b840 100644 --- a/libs/openFrameworks/video/ofDirectShowPlayer.cpp +++ b/libs/openFrameworks/video/ofDirectShowPlayer.cpp @@ -1,3 +1,7 @@ + +#include "ofConstants.h" +#ifdef OF_VIDEO_PLAYER_DIRECTSHOW + #include "ofDirectShowPlayer.h" #include "ofPixels.h" #include "ofMath.h" @@ -1326,3 +1330,5 @@ void ofDirectShowPlayer::previousFrame(){ player->preFrame(); } } + +#endif // OF_VIDEO_PLAYER_DIRECTSHOW diff --git a/libs/openFrameworks/video/ofGstUtils.cpp b/libs/openFrameworks/video/ofGstUtils.cpp index 712d1daab1c..05f3cca4d7d 100644 --- a/libs/openFrameworks/video/ofGstUtils.cpp +++ b/libs/openFrameworks/video/ofGstUtils.cpp @@ -1,6 +1,6 @@ #include "ofConstants.h" -#if defined( TARGET_LINUX ) && defined (OF_USING_GTK) +#if defined(TARGET_LINUX) #include "ofGstUtils.h" #ifndef TARGET_ANDROID @@ -1460,4 +1460,4 @@ void ofGstVideoUtils::eos_cb(){ #endif -#endif // defined( TARGET_LINUX ) && defined (OF_USING_GTK) +#endif // defined(TARGET_LINUX) diff --git a/libs/openFrameworks/video/ofGstVideoGrabber.cpp b/libs/openFrameworks/video/ofGstVideoGrabber.cpp index 0a387278348..c991d7039e0 100644 --- a/libs/openFrameworks/video/ofGstVideoGrabber.cpp +++ b/libs/openFrameworks/video/ofGstVideoGrabber.cpp @@ -6,7 +6,7 @@ */ #include "ofConstants.h" -#if defined( TARGET_LINUX ) && defined (OF_USING_GTK) +#if defined(TARGET_LINUX) #include "ofGstVideoGrabber.h" #include "ofPixels.h" @@ -862,4 +862,4 @@ void ofGstVideoGrabber::close(){ videoUtils.close(); } -#endif // defined( TARGET_LINUX ) && defined (OF_USING_GTK) +#endif // defined(TARGET_LINUX) diff --git a/libs/openFrameworks/video/ofGstVideoPlayer.cpp b/libs/openFrameworks/video/ofGstVideoPlayer.cpp index 11aa71d118b..822fca254bf 100644 --- a/libs/openFrameworks/video/ofGstVideoPlayer.cpp +++ b/libs/openFrameworks/video/ofGstVideoPlayer.cpp @@ -6,7 +6,7 @@ */ #include "ofConstants.h" -#if defined( TARGET_LINUX ) && defined (OF_USING_GTK) +#if defined(TARGET_LINUX) #include "ofGstVideoPlayer.h" #include @@ -462,4 +462,4 @@ bool ofGstVideoPlayer::isFrameByFrame() const{ return videoUtils.isFrameByFrame(); } -#endif // defined( TARGET_LINUX ) && defined (OF_USING_GTK) +#endif // defined(TARGET_LINUX) From 94f0def2ad2bbc8b9e90270ecb38c45c15d79a03 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 5 Apr 2023 07:33:20 +0200 Subject: [PATCH 09/49] CMake: Add Android support --- addons/CMakeLists.txt | 12 +++++++++-- addons/ofxAndroid/CMakeLists.txt | 1 + examples/3d/CMakeLists.txt | 1 - examples/CMakeLists.txt | 14 ++++++------- examples/android/CMakeLists.txt | 21 +++++++++++++++++++ .../CMakeLists.txt | 2 ++ .../androidAdvanced3DExample/CMakeLists.txt | 1 + .../androidAssimpExample/CMakeLists.txt | 1 + .../androidAudioExample/CMakeLists.txt | 1 + .../androidCameraExample/CMakeLists.txt | 1 + .../androidEmptyExample/CMakeLists.txt | 1 + .../android/androidFontExample/CMakeLists.txt | 1 + .../android/androidGuiExample/CMakeLists.txt | 1 + .../androidImageExample/CMakeLists.txt | 1 + .../CMakeLists.txt | 1 + .../CMakeLists.txt | 1 + .../androidOpenCVExample/CMakeLists.txt | 1 + .../androidOpenCVFaceExample/CMakeLists.txt | 1 + .../androidPolygonExample/CMakeLists.txt | 1 + .../androidShaderExample/CMakeLists.txt | 1 + .../androidSoundPlayerExample/CMakeLists.txt | 1 + .../androidSwipeExample/CMakeLists.txt | 1 + .../androidTouchExample/CMakeLists.txt | 1 + .../android/androidVBOExample/CMakeLists.txt | 1 + .../androidVibratorExample/CMakeLists.txt | 1 + .../androidVideoExample/CMakeLists.txt | 1 + 26 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 addons/ofxAndroid/CMakeLists.txt create mode 100644 examples/android/CMakeLists.txt create mode 100644 examples/android/androidAccelerometerExample/CMakeLists.txt create mode 100644 examples/android/androidAdvanced3DExample/CMakeLists.txt create mode 100644 examples/android/androidAssimpExample/CMakeLists.txt create mode 100644 examples/android/androidAudioExample/CMakeLists.txt create mode 100644 examples/android/androidCameraExample/CMakeLists.txt create mode 100644 examples/android/androidEmptyExample/CMakeLists.txt create mode 100644 examples/android/androidFontExample/CMakeLists.txt create mode 100644 examples/android/androidGuiExample/CMakeLists.txt create mode 100644 examples/android/androidImageExample/CMakeLists.txt create mode 100644 examples/android/androidJavaOnlyActivityExample/CMakeLists.txt create mode 100644 examples/android/androidMultiOFActivitiesExample/CMakeLists.txt create mode 100644 examples/android/androidOpenCVExample/CMakeLists.txt create mode 100644 examples/android/androidOpenCVFaceExample/CMakeLists.txt create mode 100644 examples/android/androidPolygonExample/CMakeLists.txt create mode 100644 examples/android/androidShaderExample/CMakeLists.txt create mode 100644 examples/android/androidSoundPlayerExample/CMakeLists.txt create mode 100644 examples/android/androidSwipeExample/CMakeLists.txt create mode 100644 examples/android/androidTouchExample/CMakeLists.txt create mode 100644 examples/android/androidVBOExample/CMakeLists.txt create mode 100644 examples/android/androidVibratorExample/CMakeLists.txt create mode 100644 examples/android/androidVideoExample/CMakeLists.txt diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index dcf01601c88..d4f31647fab 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -23,9 +23,17 @@ function(define_addon TARGET_NAME) endfunction() # add_subdirectory(ofxAccelerometer) -# add_subdirectory(ofxAndroid) + +if (OF_TARGET_ARCHITECTURE MATCHES "android") + add_subdirectory(ofxAndroid) +endif() + add_subdirectory(ofxAssimpModelLoader) -# add_subdirectory(ofxEmscripten) + +if (OF_TARGET_ARCHITECTURE MATCHES "emscripten") + add_subdirectory(ofxEmscripten) +endif() + # add_subdirectory(ofxGPS) add_subdirectory(ofxGui) # add_subdirectory(ofxiOS) diff --git a/addons/ofxAndroid/CMakeLists.txt b/addons/ofxAndroid/CMakeLists.txt new file mode 100644 index 00000000000..5d5c4fb9fc7 --- /dev/null +++ b/addons/ofxAndroid/CMakeLists.txt @@ -0,0 +1 @@ +define_addon(ofxAndroid) \ No newline at end of file diff --git a/examples/3d/CMakeLists.txt b/examples/3d/CMakeLists.txt index deb0f904bfa..f3e0d24a162 100644 --- a/examples/3d/CMakeLists.txt +++ b/examples/3d/CMakeLists.txt @@ -1,4 +1,3 @@ - add_subdirectory(3DModelLoaderExample) add_subdirectory(3DPrimitivesExample) add_subdirectory(advanced3dExample) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ffd1bcf0031..17013f3293d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -32,17 +32,15 @@ macro(define_example TARGET_NAME) # A macro is executed in the caller's sc copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") endmacro() -# Function to let the build system copy resource files to the target location after compiling -# function(copy_example_resource TARGET_NAME SOURCE_FILE) -# get_filename_component(__FILENAME ${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE} NAME) -# copy_file_after_build(${TARGET_NAME} -# "${CMAKE_CURRENT_LIST_DIR}/${SOURCE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>/data/${__FILENAME}" -# ) -# endfunction() + # Folders with examples to build add_subdirectory(3d) -# add_subdirectory(android) + +if (OF_TARGET_ARCHITECTURE MATCHES "android") + add_subdirectory(android) +endif() + # add_subdirectory(communication) # add_subdirectory(computer_vision) # add_subdirectory(events) diff --git a/examples/android/CMakeLists.txt b/examples/android/CMakeLists.txt new file mode 100644 index 00000000000..cead07e5fcd --- /dev/null +++ b/examples/android/CMakeLists.txt @@ -0,0 +1,21 @@ +add_subdirectory(androidAccelerometerExample) +add_subdirectory(androidAdvanced3DExample) +add_subdirectory(androidAssimpExample) +add_subdirectory(androidAudioExample) +add_subdirectory(androidCameraExample) +add_subdirectory(androidEmptyExample) +add_subdirectory(androidFontExample) +add_subdirectory(androidGuiExample) +add_subdirectory(androidImageExample) +add_subdirectory(androidJavaOnlyActivityExample) +add_subdirectory(androidMultiOFActivitiesExample) +add_subdirectory(androidOpenCVExample) +add_subdirectory(androidOpenCVFaceExample) +add_subdirectory(androidPolygonExample) +add_subdirectory(androidShaderExample) +add_subdirectory(androidSoundPlayerExample) +add_subdirectory(androidSwipeExample) +add_subdirectory(androidTouchExample) +add_subdirectory(androidVBOExample) +add_subdirectory(androidVibratorExample) +add_subdirectory(androidVideoExample) \ No newline at end of file diff --git a/examples/android/androidAccelerometerExample/CMakeLists.txt b/examples/android/androidAccelerometerExample/CMakeLists.txt new file mode 100644 index 00000000000..b08bcbc45d2 --- /dev/null +++ b/examples/android/androidAccelerometerExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(androidAccelerometerExample) +target_link_libraries(androidAccelerometerExample of::ofxAndroid) \ No newline at end of file diff --git a/examples/android/androidAdvanced3DExample/CMakeLists.txt b/examples/android/androidAdvanced3DExample/CMakeLists.txt new file mode 100644 index 00000000000..e10c72227b3 --- /dev/null +++ b/examples/android/androidAdvanced3DExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidAdvanced3DExample) \ No newline at end of file diff --git a/examples/android/androidAssimpExample/CMakeLists.txt b/examples/android/androidAssimpExample/CMakeLists.txt new file mode 100644 index 00000000000..a95150faf16 --- /dev/null +++ b/examples/android/androidAssimpExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidAssimpExample) \ No newline at end of file diff --git a/examples/android/androidAudioExample/CMakeLists.txt b/examples/android/androidAudioExample/CMakeLists.txt new file mode 100644 index 00000000000..7a756d4ee4e --- /dev/null +++ b/examples/android/androidAudioExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidAudioExample) \ No newline at end of file diff --git a/examples/android/androidCameraExample/CMakeLists.txt b/examples/android/androidCameraExample/CMakeLists.txt new file mode 100644 index 00000000000..aee27cfa969 --- /dev/null +++ b/examples/android/androidCameraExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidCameraExample) \ No newline at end of file diff --git a/examples/android/androidEmptyExample/CMakeLists.txt b/examples/android/androidEmptyExample/CMakeLists.txt new file mode 100644 index 00000000000..39c607c9e81 --- /dev/null +++ b/examples/android/androidEmptyExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidEmptyExample) \ No newline at end of file diff --git a/examples/android/androidFontExample/CMakeLists.txt b/examples/android/androidFontExample/CMakeLists.txt new file mode 100644 index 00000000000..c1507e77df3 --- /dev/null +++ b/examples/android/androidFontExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidFontExample) \ No newline at end of file diff --git a/examples/android/androidGuiExample/CMakeLists.txt b/examples/android/androidGuiExample/CMakeLists.txt new file mode 100644 index 00000000000..737c8ba2f40 --- /dev/null +++ b/examples/android/androidGuiExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidGuiExample) \ No newline at end of file diff --git a/examples/android/androidImageExample/CMakeLists.txt b/examples/android/androidImageExample/CMakeLists.txt new file mode 100644 index 00000000000..2dc40857410 --- /dev/null +++ b/examples/android/androidImageExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidImageExample) \ No newline at end of file diff --git a/examples/android/androidJavaOnlyActivityExample/CMakeLists.txt b/examples/android/androidJavaOnlyActivityExample/CMakeLists.txt new file mode 100644 index 00000000000..8e52ad420d6 --- /dev/null +++ b/examples/android/androidJavaOnlyActivityExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidJavaOnlyActivityExample) \ No newline at end of file diff --git a/examples/android/androidMultiOFActivitiesExample/CMakeLists.txt b/examples/android/androidMultiOFActivitiesExample/CMakeLists.txt new file mode 100644 index 00000000000..10fe68880b2 --- /dev/null +++ b/examples/android/androidMultiOFActivitiesExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidMultiOFActivitiesExample) \ No newline at end of file diff --git a/examples/android/androidOpenCVExample/CMakeLists.txt b/examples/android/androidOpenCVExample/CMakeLists.txt new file mode 100644 index 00000000000..267acb609e3 --- /dev/null +++ b/examples/android/androidOpenCVExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidOpenCVExample) \ No newline at end of file diff --git a/examples/android/androidOpenCVFaceExample/CMakeLists.txt b/examples/android/androidOpenCVFaceExample/CMakeLists.txt new file mode 100644 index 00000000000..46db5b3ad7e --- /dev/null +++ b/examples/android/androidOpenCVFaceExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidOpenCVFaceExample) \ No newline at end of file diff --git a/examples/android/androidPolygonExample/CMakeLists.txt b/examples/android/androidPolygonExample/CMakeLists.txt new file mode 100644 index 00000000000..9e701485fcd --- /dev/null +++ b/examples/android/androidPolygonExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidPolygonExample) \ No newline at end of file diff --git a/examples/android/androidShaderExample/CMakeLists.txt b/examples/android/androidShaderExample/CMakeLists.txt new file mode 100644 index 00000000000..5bb61b44875 --- /dev/null +++ b/examples/android/androidShaderExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidShaderExample) \ No newline at end of file diff --git a/examples/android/androidSoundPlayerExample/CMakeLists.txt b/examples/android/androidSoundPlayerExample/CMakeLists.txt new file mode 100644 index 00000000000..f326e06c645 --- /dev/null +++ b/examples/android/androidSoundPlayerExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidSoundPlayerExample) \ No newline at end of file diff --git a/examples/android/androidSwipeExample/CMakeLists.txt b/examples/android/androidSwipeExample/CMakeLists.txt new file mode 100644 index 00000000000..15e89b38a22 --- /dev/null +++ b/examples/android/androidSwipeExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidSwipeExample) \ No newline at end of file diff --git a/examples/android/androidTouchExample/CMakeLists.txt b/examples/android/androidTouchExample/CMakeLists.txt new file mode 100644 index 00000000000..05a9d703856 --- /dev/null +++ b/examples/android/androidTouchExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidTouchExample) \ No newline at end of file diff --git a/examples/android/androidVBOExample/CMakeLists.txt b/examples/android/androidVBOExample/CMakeLists.txt new file mode 100644 index 00000000000..2f0009557fe --- /dev/null +++ b/examples/android/androidVBOExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidVBOExample) \ No newline at end of file diff --git a/examples/android/androidVibratorExample/CMakeLists.txt b/examples/android/androidVibratorExample/CMakeLists.txt new file mode 100644 index 00000000000..e860eaffda8 --- /dev/null +++ b/examples/android/androidVibratorExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidVibratorExample) \ No newline at end of file diff --git a/examples/android/androidVideoExample/CMakeLists.txt b/examples/android/androidVideoExample/CMakeLists.txt new file mode 100644 index 00000000000..14c6c2fe1d1 --- /dev/null +++ b/examples/android/androidVideoExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(androidVideoExample) \ No newline at end of file From 8cba92072b80cf6f4cd05265758a906ef8048bc8 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 5 Apr 2023 11:50:30 +0200 Subject: [PATCH 10/49] CMake: Add Accelerometer and do not find OpenGL on Android --- addons/CMakeLists.txt | 2 +- addons/ofxAccelerometer/CMakeLists.txt | 1 + cmake/download_and_link_deps.cmake | 12 +++++++----- .../androidAccelerometerExample/CMakeLists.txt | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 addons/ofxAccelerometer/CMakeLists.txt diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index d4f31647fab..5981ad3ba28 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -22,7 +22,7 @@ function(define_addon TARGET_NAME) ) endfunction() -# add_subdirectory(ofxAccelerometer) +add_subdirectory(ofxAccelerometer) if (OF_TARGET_ARCHITECTURE MATCHES "android") add_subdirectory(ofxAndroid) diff --git a/addons/ofxAccelerometer/CMakeLists.txt b/addons/ofxAccelerometer/CMakeLists.txt new file mode 100644 index 00000000000..6e23c748a65 --- /dev/null +++ b/addons/ofxAccelerometer/CMakeLists.txt @@ -0,0 +1 @@ +define_addon(ofxAccelerometer) \ No newline at end of file diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index 4cb969a8c40..77e5fbc9c21 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -127,12 +127,14 @@ endif() # Find system packages -find_package(OpenGL) -if (NOT OpenGL_FOUND) # This should never be not found on windows - message(SEND_ERROR "Dependency OpenGL not found. On Linux, please install it using your system's equivalent of 'sudo apt install libgl1-mesa-dev'") +if (NOT OF_TARGET_ARCHITECTURE MATCHES "android") + find_package(OpenGL) + if (NOT OpenGL_FOUND) # This should never be not found on windows + message(SEND_ERROR "Dependency OpenGL not found. On Linux, please install it using your system's equivalent of 'sudo apt install libgl1-mesa-dev'") + endif() + target_include_directories(openframeworks PUBLIC ${OPENGL_INCLUDE_DIRS}) + target_link_libraries(openframeworks ${OPENGL_LIBRARIES}) endif() -target_include_directories(openframeworks PUBLIC ${OPENGL_INCLUDE_DIRS}) -target_link_libraries(openframeworks ${OPENGL_LIBRARIES}) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # All Linux-only packages (that are part of apothecary on all platforms except Linux) include(${CMAKE_CURRENT_LIST_DIR}/find_linux_deps.cmake) diff --git a/examples/android/androidAccelerometerExample/CMakeLists.txt b/examples/android/androidAccelerometerExample/CMakeLists.txt index b08bcbc45d2..1dc047e0890 100644 --- a/examples/android/androidAccelerometerExample/CMakeLists.txt +++ b/examples/android/androidAccelerometerExample/CMakeLists.txt @@ -1,2 +1,2 @@ define_example(androidAccelerometerExample) -target_link_libraries(androidAccelerometerExample of::ofxAndroid) \ No newline at end of file +target_link_libraries(androidAccelerometerExample of::ofxAndroid of::ofxAccelerometer) \ No newline at end of file From 06a61694170cf0c470dd5830654aa08ed07e717a Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 5 Apr 2023 20:50:12 +0200 Subject: [PATCH 11/49] ofxAccelerometer: Replace bzero with memset --- addons/ofxAccelerometer/src/ofxAccelerometer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ofxAccelerometer/src/ofxAccelerometer.h b/addons/ofxAccelerometer/src/ofxAccelerometer.h index 81e60f18a99..89e6ba0270d 100644 --- a/addons/ofxAccelerometer/src/ofxAccelerometer.h +++ b/addons/ofxAccelerometer/src/ofxAccelerometer.h @@ -158,7 +158,7 @@ class ofxAccelerometerHandler { if(length < 0.1) return; //Clear matrix to be used to rotate from the current referential to one based on the gravity vector - bzero(matrix, sizeof(matrix)); + memset(matrix, 0, sizeof(matrix)); matrix[3][3] = 1.0; //Setup first matrix column as gravity vector From b9ec3be4371999231862544af0835160628942c3 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 5 Apr 2023 21:04:42 +0200 Subject: [PATCH 12/49] Add CMake support for Android --- CMAKE.md | 29 +++++++++++++++++++ CMakeLists.txt | 7 +++-- cmake/download_and_link_deps.cmake | 45 +++++++++++++++++++----------- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/CMAKE.md b/CMAKE.md index 2723f2b29ef..455e95355af 100644 --- a/CMAKE.md +++ b/CMAKE.md @@ -21,3 +21,32 @@ cmake --build . ``` This is it! OpenFrameworks and all examples have been built! + +``` + set(CMAKE_SYSTEM_NAME "Android") + set(CMAKE_SYSTEM_VERSION 1) + + cmake .. -DCMAKE_C_COMPILER=x86_64-linux-android33-clang -DCMAKE_CXX_COMPILER=x86_64-linux-android33-clang++ + + cmake .. \ + -DCMAKE_C_COMPILER=armv7a-linux-androideabi33-clang \ + -DCMAKE_CXX_COMPILER=armv7a-linux-androideabi33-clang++ \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_SYSTEM_VERSION=25 + + cmake .. \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_SYSTEM_VERSION=25 \ + -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=/home/${USER}/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64 + + + + https://developer.android.com/ndk/guides/cmake#command-line + + cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/$USER/android-ndk-r25c/build/cmake/android.toolchain.cmake -DANDROID_ABI=x86_64 + + AT LEAST CMake 3.19 !!! + + deb http://deb.debian.org/debian bullseye-backports main + sudo apt install cmake -t bullseye-backports +``` diff --git a/CMakeLists.txt b/CMakeLists.txt index 32e92ee8265..33db097d4b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.16) project(openframeworks) + include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -22,6 +23,9 @@ add_library(of::openframeworks ALIAS openframeworks) # This is another CMake script that adds the header locations and source files 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) + # C++ standard version and disabling non-standard compiler specific features target_compile_features(openframeworks PUBLIC cxx_std_17) set_target_properties(openframeworks PROPERTIES CXX_EXTENSIONS OFF) @@ -50,9 +54,6 @@ set_target_properties(openframeworks PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib/$,debug,release>" ) -# This downloads and configures the dependencies for us -include(${CMAKE_CURRENT_LIST_DIR}/cmake/download_and_link_deps.cmake) - add_subdirectory(addons) if (BUILD_EXAMPLES) diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index 77e5fbc9c21..c2ea330a85b 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -8,11 +8,11 @@ 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, androidarm7, androidarm64, androidx86, ios, tvos, macos, msys-mingw, msys-clang, msys-ucrt, mingw, linux64, linuxarmv6l, linuxarmv7l, emscripten") +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 does no longer support 32-bit build systems. Please upgrade your compiler to 64-bit.") + 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...") @@ -22,10 +22,21 @@ if(OF_TARGET_ARCHITECTURE STREQUAL "auto") elseif (EMSCRIPTEN) set(OF_TARGET_ARCHITECTURE "emscripten" CACHE STRING "" FORCE) elseif (ANDROID) - set(OF_TARGET_ARCHITECTURE "androidarm7" CACHE STRING "" FORCE) - # androidx86 and androidarm64 must be specified manually + 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 (IOS) + 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) @@ -41,17 +52,21 @@ if(OF_TARGET_ARCHITECTURE STREQUAL "auto") 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='. Possible values are: ${_AVAILABLE_ARCHITECTURES}.") + 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) - #Set(FETCHCONTENT_QUIET FALSE) - message(STATUS "[openframeworks] Using ${OF_TARGET_ARCHITECTURE} toolchain, downloading dependencies") + 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) set(_URL "http://ci.openframeworks.cc/libs/openFrameworksLibs_master_${dependency}") - #message(STATUS "[openframeworks] Fetching ${_URL}") + if (OF_VERBOSE) + message(STATUS "[openframeworks] Fetching ${_URL}") + endif() # Download and extract the compressed archive CPMAddPackage( @@ -70,7 +85,9 @@ function(get_packages_and_link) endforeach() endforeach() - #Set(FETCHCONTENT_QUIET TRUE) + if (OF_VERBOSE) + Set(FETCHCONTENT_QUIET TRUE) + endif() endfunction() # And now download the archives, depending on the platform we're on @@ -81,7 +98,7 @@ elseif (OF_TARGET_ARCHITECTURE STREQUAL "emscripten") # TODO message(SEND_ERROR "Emscripten dependencies are not yet implemented in CMake! Please edit cmake/download_deps.cmake to add support yourself!") get_packages_and_link() -elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm7") +elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarmeabi") get_packages_and_link("androidarmv7.tar.bz2") elseif (OF_TARGET_ARCHITECTURE STREQUAL "androidarm64") @@ -161,13 +178,9 @@ endif() # And link to all the dependencies we depend upon target_link_libraries(openframeworks of::tess2 - of::cairo of::glm of::utf8 - of::glfw - of::fmod of::FreeImage - of::rtAudio of::uriparser of::openssl of::curl @@ -190,5 +203,5 @@ 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::glew) + target_link_libraries(openframeworks of::rtAudio of::fmod of::glfw of::cairo of::glew) endif() From 2b4ad2c54bb167f95da9ab62803a63d6a44eb88c Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 5 Apr 2023 21:32:28 +0200 Subject: [PATCH 13/49] CMake: Add communication examples and network addon --- addons/CMakeLists.txt | 2 +- addons/ofxNetwork/CMakeLists.txt | 1 + cmake/download_and_link_deps.cmake | 2 +- examples/CMakeLists.txt | 2 +- examples/communication/CMakeLists.txt | 10 ++++++++++ examples/communication/firmataExample/CMakeLists.txt | 1 + .../networkTcpClientExample/CMakeLists.txt | 2 ++ .../networkTcpServerExample/CMakeLists.txt | 2 ++ .../networkUdpReceiverExample/CMakeLists.txt | 2 ++ .../networkUdpSenderExample/CMakeLists.txt | 2 ++ .../communication/oscChatSystemExample/CMakeLists.txt | 2 ++ .../communication/oscReceiveExample/CMakeLists.txt | 2 ++ examples/communication/oscSenderExample/CMakeLists.txt | 2 ++ examples/communication/serialExample/CMakeLists.txt | 1 + 14 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 addons/ofxNetwork/CMakeLists.txt create mode 100644 examples/communication/CMakeLists.txt create mode 100644 examples/communication/firmataExample/CMakeLists.txt create mode 100644 examples/communication/networkTcpClientExample/CMakeLists.txt create mode 100644 examples/communication/networkTcpServerExample/CMakeLists.txt create mode 100644 examples/communication/networkUdpReceiverExample/CMakeLists.txt create mode 100644 examples/communication/networkUdpSenderExample/CMakeLists.txt create mode 100644 examples/communication/oscChatSystemExample/CMakeLists.txt create mode 100644 examples/communication/oscReceiveExample/CMakeLists.txt create mode 100644 examples/communication/oscSenderExample/CMakeLists.txt create mode 100644 examples/communication/serialExample/CMakeLists.txt diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index 5981ad3ba28..d754e17eb15 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -38,7 +38,7 @@ endif() add_subdirectory(ofxGui) # add_subdirectory(ofxiOS) # add_subdirectory(ofxKinect) -# add_subdirectory(ofxNetwork) +add_subdirectory(ofxNetwork) add_subdirectory(ofxOpenCv) add_subdirectory(ofxOsc) # add_subdirectory(ofxPoco) diff --git a/addons/ofxNetwork/CMakeLists.txt b/addons/ofxNetwork/CMakeLists.txt new file mode 100644 index 00000000000..4725f2579eb --- /dev/null +++ b/addons/ofxNetwork/CMakeLists.txt @@ -0,0 +1 @@ +define_addon(ofxNetwork) \ No newline at end of file diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index c2ea330a85b..db9c008444b 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -192,7 +192,7 @@ target_link_libraries(openframeworks # 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.lib) + target_link_libraries(openframeworks winmm ws2_32 wldap32 crypt32 dsound setupapi) endif() if (OF_TARGET_ARCHITECTURE MATCHES "linux") diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 17013f3293d..b344459315b 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -41,7 +41,7 @@ if (OF_TARGET_ARCHITECTURE MATCHES "android") add_subdirectory(android) endif() -# add_subdirectory(communication) +add_subdirectory(communication) # add_subdirectory(computer_vision) # add_subdirectory(events) # add_subdirectory(gl) diff --git a/examples/communication/CMakeLists.txt b/examples/communication/CMakeLists.txt new file mode 100644 index 00000000000..5527ad1f26f --- /dev/null +++ b/examples/communication/CMakeLists.txt @@ -0,0 +1,10 @@ + +add_subdirectory(firmataExample) +add_subdirectory(networkTcpClientExample) +add_subdirectory(networkTcpServerExample) +add_subdirectory(networkUdpReceiverExample) +add_subdirectory(networkUdpSenderExample) +add_subdirectory(oscChatSystemExample) +add_subdirectory(oscReceiveExample) +add_subdirectory(oscSenderExample) +add_subdirectory(serialExample) diff --git a/examples/communication/firmataExample/CMakeLists.txt b/examples/communication/firmataExample/CMakeLists.txt new file mode 100644 index 00000000000..8bf702b0ec0 --- /dev/null +++ b/examples/communication/firmataExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(firmataExample) \ No newline at end of file diff --git a/examples/communication/networkTcpClientExample/CMakeLists.txt b/examples/communication/networkTcpClientExample/CMakeLists.txt new file mode 100644 index 00000000000..8ccb704b053 --- /dev/null +++ b/examples/communication/networkTcpClientExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(networkTcpClientExample) +target_link_libraries(networkTcpClientExample of::ofxNetwork) \ No newline at end of file diff --git a/examples/communication/networkTcpServerExample/CMakeLists.txt b/examples/communication/networkTcpServerExample/CMakeLists.txt new file mode 100644 index 00000000000..abce2628ffe --- /dev/null +++ b/examples/communication/networkTcpServerExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(networkTcpServerExample) +target_link_libraries(networkTcpServerExample of::ofxNetwork) \ No newline at end of file diff --git a/examples/communication/networkUdpReceiverExample/CMakeLists.txt b/examples/communication/networkUdpReceiverExample/CMakeLists.txt new file mode 100644 index 00000000000..c3aa29f5ca1 --- /dev/null +++ b/examples/communication/networkUdpReceiverExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(networkUdpReceiverExample) +target_link_libraries(networkUdpReceiverExample of::ofxNetwork) \ No newline at end of file diff --git a/examples/communication/networkUdpSenderExample/CMakeLists.txt b/examples/communication/networkUdpSenderExample/CMakeLists.txt new file mode 100644 index 00000000000..75925354b38 --- /dev/null +++ b/examples/communication/networkUdpSenderExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(networkUdpSenderExample) +target_link_libraries(networkUdpSenderExample of::ofxNetwork) \ No newline at end of file diff --git a/examples/communication/oscChatSystemExample/CMakeLists.txt b/examples/communication/oscChatSystemExample/CMakeLists.txt new file mode 100644 index 00000000000..1089d506249 --- /dev/null +++ b/examples/communication/oscChatSystemExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(oscChatSystemExample) +target_link_libraries(oscChatSystemExample of::ofxOsc) \ No newline at end of file diff --git a/examples/communication/oscReceiveExample/CMakeLists.txt b/examples/communication/oscReceiveExample/CMakeLists.txt new file mode 100644 index 00000000000..c3fd7b00e31 --- /dev/null +++ b/examples/communication/oscReceiveExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(oscReceiveExample) +target_link_libraries(oscReceiveExample of::ofxOsc) \ No newline at end of file diff --git a/examples/communication/oscSenderExample/CMakeLists.txt b/examples/communication/oscSenderExample/CMakeLists.txt new file mode 100644 index 00000000000..daf9ab4f4c6 --- /dev/null +++ b/examples/communication/oscSenderExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(oscSenderExample) +target_link_libraries(oscSenderExample of::ofxOsc) \ No newline at end of file diff --git a/examples/communication/serialExample/CMakeLists.txt b/examples/communication/serialExample/CMakeLists.txt new file mode 100644 index 00000000000..f84a1f56e8f --- /dev/null +++ b/examples/communication/serialExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(serialExample) \ No newline at end of file From 947873119589696611a99216db4b39ac8b6cfbee Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 5 Apr 2023 22:11:53 +0200 Subject: [PATCH 14/49] Add CMake support for computer_vision examples --- addons/CMakeLists.txt | 2 +- addons/ofxKinect/CMakeLists.txt | 11 +++++++++++ examples/CMakeLists.txt | 2 +- examples/computer_vision/CMakeLists.txt | 7 +++++++ examples/computer_vision/kinectExample/CMakeLists.txt | 2 ++ examples/computer_vision/opencvExample/CMakeLists.txt | 2 ++ .../opencvHaarFinderExample/CMakeLists.txt | 2 ++ .../opencvImageClassification/CMakeLists.txt | 2 ++ .../opencvOpticalFlowExample/CMakeLists.txt | 2 ++ .../opencvPeopleDetection/CMakeLists.txt | 2 ++ 10 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 addons/ofxKinect/CMakeLists.txt create mode 100644 examples/computer_vision/CMakeLists.txt create mode 100644 examples/computer_vision/kinectExample/CMakeLists.txt create mode 100644 examples/computer_vision/opencvExample/CMakeLists.txt create mode 100644 examples/computer_vision/opencvHaarFinderExample/CMakeLists.txt create mode 100644 examples/computer_vision/opencvImageClassification/CMakeLists.txt create mode 100644 examples/computer_vision/opencvOpticalFlowExample/CMakeLists.txt create mode 100644 examples/computer_vision/opencvPeopleDetection/CMakeLists.txt diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index d754e17eb15..160c8287bc8 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -37,7 +37,7 @@ endif() # add_subdirectory(ofxGPS) add_subdirectory(ofxGui) # add_subdirectory(ofxiOS) -# add_subdirectory(ofxKinect) +add_subdirectory(ofxKinect) add_subdirectory(ofxNetwork) add_subdirectory(ofxOpenCv) add_subdirectory(ofxOsc) diff --git a/addons/ofxKinect/CMakeLists.txt b/addons/ofxKinect/CMakeLists.txt new file mode 100644 index 00000000000..cc3098e6b23 --- /dev/null +++ b/addons/ofxKinect/CMakeLists.txt @@ -0,0 +1,11 @@ +define_addon(ofxKinect) + +target_include_directories(ofxKinect PUBLIC libs/libfreenect/include) +target_include_directories(ofxKinect PUBLIC libs/libfreenect/src) +target_include_directories(ofxKinect PUBLIC src/extra) + +if (WIN32) + target_include_directories(ofxKinect PUBLIC libs/libfreenect/platform/windows) +endif () + +target_link_libraries(ofxKinect of::libusb) \ No newline at end of file diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b344459315b..17c686dc80a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -42,7 +42,7 @@ if (OF_TARGET_ARCHITECTURE MATCHES "android") endif() add_subdirectory(communication) -# add_subdirectory(computer_vision) +add_subdirectory(computer_vision) # add_subdirectory(events) # add_subdirectory(gl) # add_subdirectory(gles) diff --git a/examples/computer_vision/CMakeLists.txt b/examples/computer_vision/CMakeLists.txt new file mode 100644 index 00000000000..fc1e5d8b3e5 --- /dev/null +++ b/examples/computer_vision/CMakeLists.txt @@ -0,0 +1,7 @@ + +add_subdirectory(kinectExample) +add_subdirectory(opencvExample) +add_subdirectory(opencvHaarFinderExample) +add_subdirectory(opencvImageClassification) +add_subdirectory(opencvOpticalFlowExample) +add_subdirectory(opencvPeopleDetection) diff --git a/examples/computer_vision/kinectExample/CMakeLists.txt b/examples/computer_vision/kinectExample/CMakeLists.txt new file mode 100644 index 00000000000..96739fd5949 --- /dev/null +++ b/examples/computer_vision/kinectExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(kinectExample) +target_link_libraries(kinectExample of::ofxOpenCv of::ofxKinect) \ No newline at end of file diff --git a/examples/computer_vision/opencvExample/CMakeLists.txt b/examples/computer_vision/opencvExample/CMakeLists.txt new file mode 100644 index 00000000000..e760d62767d --- /dev/null +++ b/examples/computer_vision/opencvExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(opencvExample) +target_link_libraries(opencvExample of::ofxOpenCv) \ No newline at end of file diff --git a/examples/computer_vision/opencvHaarFinderExample/CMakeLists.txt b/examples/computer_vision/opencvHaarFinderExample/CMakeLists.txt new file mode 100644 index 00000000000..167c7bc09d9 --- /dev/null +++ b/examples/computer_vision/opencvHaarFinderExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(opencvHaarFinderExample) +target_link_libraries(opencvHaarFinderExample of::ofxOpenCv) \ No newline at end of file diff --git a/examples/computer_vision/opencvImageClassification/CMakeLists.txt b/examples/computer_vision/opencvImageClassification/CMakeLists.txt new file mode 100644 index 00000000000..aab5954ee0e --- /dev/null +++ b/examples/computer_vision/opencvImageClassification/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(opencvImageClassification) +target_link_libraries(opencvImageClassification of::ofxOpenCv) \ No newline at end of file diff --git a/examples/computer_vision/opencvOpticalFlowExample/CMakeLists.txt b/examples/computer_vision/opencvOpticalFlowExample/CMakeLists.txt new file mode 100644 index 00000000000..7ea86d0bc79 --- /dev/null +++ b/examples/computer_vision/opencvOpticalFlowExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(opencvOpticalFlowExample) +target_link_libraries(opencvOpticalFlowExample of::ofxOpenCv) \ No newline at end of file diff --git a/examples/computer_vision/opencvPeopleDetection/CMakeLists.txt b/examples/computer_vision/opencvPeopleDetection/CMakeLists.txt new file mode 100644 index 00000000000..d53562408d9 --- /dev/null +++ b/examples/computer_vision/opencvPeopleDetection/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(opencvPeopleDetection) +target_link_libraries(opencvPeopleDetection of::ofxOpenCv) \ No newline at end of file From 2f0a8f8af23820909d5d1701a2bff92545fd2190 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 12:46:18 +0200 Subject: [PATCH 15/49] CMake: Implement Event examples --- examples/CMakeLists.txt | 2 +- examples/events/CMakeLists.txt | 7 +++++++ examples/events/advancedEventsExample/CMakeLists.txt | 1 + examples/events/allEventsExample/CMakeLists.txt | 1 + examples/events/customEventExample/CMakeLists.txt | 1 + examples/events/rpiTouchExample/CMakeLists.txt | 1 + examples/events/simpleEventsExample/CMakeLists.txt | 1 + examples/events/simpleTimerEventExample/CMakeLists.txt | 1 + 8 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 examples/events/CMakeLists.txt create mode 100644 examples/events/advancedEventsExample/CMakeLists.txt create mode 100644 examples/events/allEventsExample/CMakeLists.txt create mode 100644 examples/events/customEventExample/CMakeLists.txt create mode 100644 examples/events/rpiTouchExample/CMakeLists.txt create mode 100644 examples/events/simpleEventsExample/CMakeLists.txt create mode 100644 examples/events/simpleTimerEventExample/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 17c686dc80a..fe45445d004 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -43,7 +43,7 @@ endif() add_subdirectory(communication) add_subdirectory(computer_vision) -# add_subdirectory(events) +add_subdirectory(events) # add_subdirectory(gl) # add_subdirectory(gles) # add_subdirectory(graphics) diff --git a/examples/events/CMakeLists.txt b/examples/events/CMakeLists.txt new file mode 100644 index 00000000000..82ddece5c06 --- /dev/null +++ b/examples/events/CMakeLists.txt @@ -0,0 +1,7 @@ + +add_subdirectory(advancedEventsExample) +add_subdirectory(allEventsExample) +add_subdirectory(customEventExample) +add_subdirectory(rpiTouchExample) +add_subdirectory(simpleEventsExample) +add_subdirectory(simpleTimerEventExample) diff --git a/examples/events/advancedEventsExample/CMakeLists.txt b/examples/events/advancedEventsExample/CMakeLists.txt new file mode 100644 index 00000000000..b0f26230217 --- /dev/null +++ b/examples/events/advancedEventsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(advancedEventsExample) \ No newline at end of file diff --git a/examples/events/allEventsExample/CMakeLists.txt b/examples/events/allEventsExample/CMakeLists.txt new file mode 100644 index 00000000000..605c363f25b --- /dev/null +++ b/examples/events/allEventsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(allEventsExample) \ No newline at end of file diff --git a/examples/events/customEventExample/CMakeLists.txt b/examples/events/customEventExample/CMakeLists.txt new file mode 100644 index 00000000000..897c3ce567b --- /dev/null +++ b/examples/events/customEventExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(customEventExample) \ No newline at end of file diff --git a/examples/events/rpiTouchExample/CMakeLists.txt b/examples/events/rpiTouchExample/CMakeLists.txt new file mode 100644 index 00000000000..366e23c15fb --- /dev/null +++ b/examples/events/rpiTouchExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(rpiTouchExample) \ No newline at end of file diff --git a/examples/events/simpleEventsExample/CMakeLists.txt b/examples/events/simpleEventsExample/CMakeLists.txt new file mode 100644 index 00000000000..4dc01b2c10d --- /dev/null +++ b/examples/events/simpleEventsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(simpleEventsExample) \ No newline at end of file diff --git a/examples/events/simpleTimerEventExample/CMakeLists.txt b/examples/events/simpleTimerEventExample/CMakeLists.txt new file mode 100644 index 00000000000..ec4cf2775b6 --- /dev/null +++ b/examples/events/simpleTimerEventExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(simpleTimerEventExample) \ No newline at end of file From 70fba6a86b6a84d3e024ad120347e05291213801 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 13:56:04 +0200 Subject: [PATCH 16/49] CMake: Add gl examples --- examples/CMakeLists.txt | 2 +- examples/gl/CMakeLists.txt | 31 +++++++++++++++++++ examples/gl/areaLightExample/CMakeLists.txt | 1 + examples/gl/billboardExample/CMakeLists.txt | 1 + .../billboardRotationExample/CMakeLists.txt | 1 + .../CMakeLists.txt | 2 ++ .../CMakeLists.txt | 2 ++ .../gl/fboHighResOutputExample/CMakeLists.txt | 1 + examples/gl/fboTrailsExample/CMakeLists.txt | 1 + .../gl/geometryShaderExample/CMakeLists.txt | 1 + examples/gl/glInfoExample/CMakeLists.txt | 1 + .../gpuParticleSystemExample/CMakeLists.txt | 1 + examples/gl/materialPBR/CMakeLists.txt | 1 + .../gl/materialPBRAdvanced/CMakeLists.txt | 1 + examples/gl/multiLightExample/CMakeLists.txt | 1 + .../gl/multiTexture3dExample/CMakeLists.txt | 1 + .../multiTextureShaderExample/CMakeLists.txt | 1 + examples/gl/pixelBufferExample/CMakeLists.txt | 1 + examples/gl/pointLightsExample/CMakeLists.txt | 1 + .../gl/pointsAsTexturesExample/CMakeLists.txt | 1 + examples/gl/shaderExample/CMakeLists.txt | 1 + examples/gl/shadowsExample/CMakeLists.txt | 1 + .../slowFastRenderingExample/CMakeLists.txt | 1 + .../CMakeLists.txt | 1 + examples/gl/textureExample/CMakeLists.txt | 1 + .../textureScreengrabExample/CMakeLists.txt | 1 + .../threadedPixelBufferExample/CMakeLists.txt | 1 + .../CMakeLists.txt | 2 ++ .../transformFeedbackExample/CMakeLists.txt | 1 + examples/gl/vboExample/CMakeLists.txt | 1 + .../CMakeLists.txt | 1 + examples/gl/viewportExample/CMakeLists.txt | 1 + 32 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 examples/gl/CMakeLists.txt create mode 100644 examples/gl/areaLightExample/CMakeLists.txt create mode 100644 examples/gl/billboardExample/CMakeLists.txt create mode 100644 examples/gl/billboardRotationExample/CMakeLists.txt create mode 100644 examples/gl/computeShaderParticlesExample/CMakeLists.txt create mode 100644 examples/gl/computeShaderTextureExample/CMakeLists.txt create mode 100644 examples/gl/fboHighResOutputExample/CMakeLists.txt create mode 100644 examples/gl/fboTrailsExample/CMakeLists.txt create mode 100644 examples/gl/geometryShaderExample/CMakeLists.txt create mode 100644 examples/gl/glInfoExample/CMakeLists.txt create mode 100644 examples/gl/gpuParticleSystemExample/CMakeLists.txt create mode 100644 examples/gl/materialPBR/CMakeLists.txt create mode 100644 examples/gl/materialPBRAdvanced/CMakeLists.txt create mode 100644 examples/gl/multiLightExample/CMakeLists.txt create mode 100644 examples/gl/multiTexture3dExample/CMakeLists.txt create mode 100644 examples/gl/multiTextureShaderExample/CMakeLists.txt create mode 100644 examples/gl/pixelBufferExample/CMakeLists.txt create mode 100644 examples/gl/pointLightsExample/CMakeLists.txt create mode 100644 examples/gl/pointsAsTexturesExample/CMakeLists.txt create mode 100644 examples/gl/shaderExample/CMakeLists.txt create mode 100644 examples/gl/shadowsExample/CMakeLists.txt create mode 100644 examples/gl/slowFastRenderingExample/CMakeLists.txt create mode 100644 examples/gl/textureBufferInstancedExample/CMakeLists.txt create mode 100644 examples/gl/textureExample/CMakeLists.txt create mode 100644 examples/gl/textureScreengrabExample/CMakeLists.txt create mode 100644 examples/gl/threadedPixelBufferExample/CMakeLists.txt create mode 100644 examples/gl/transformFeedbackAnimatedExample/CMakeLists.txt create mode 100644 examples/gl/transformFeedbackExample/CMakeLists.txt create mode 100644 examples/gl/vboExample/CMakeLists.txt create mode 100644 examples/gl/vboMeshDrawInstancedExample/CMakeLists.txt create mode 100644 examples/gl/viewportExample/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index fe45445d004..3bb5481a69e 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -44,7 +44,7 @@ endif() add_subdirectory(communication) add_subdirectory(computer_vision) add_subdirectory(events) -# add_subdirectory(gl) +add_subdirectory(gl) # add_subdirectory(gles) # add_subdirectory(graphics) # add_subdirectory(gui) diff --git a/examples/gl/CMakeLists.txt b/examples/gl/CMakeLists.txt new file mode 100644 index 00000000000..050374bda07 --- /dev/null +++ b/examples/gl/CMakeLists.txt @@ -0,0 +1,31 @@ + +add_subdirectory(areaLightExample) +add_subdirectory(billboardExample) +add_subdirectory(billboardRotationExample) +add_subdirectory(computeShaderParticlesExample) +add_subdirectory(computeShaderTextureExample) +add_subdirectory(fboHighResOutputExample) +add_subdirectory(fboTrailsExample) +add_subdirectory(geometryShaderExample) +add_subdirectory(glInfoExample) +add_subdirectory(gpuParticleSystemExample) +add_subdirectory(materialPBR) +add_subdirectory(materialPBRAdvanced) +add_subdirectory(multiLightExample) +add_subdirectory(multiTexture3dExample) +add_subdirectory(multiTextureShaderExample) +add_subdirectory(pixelBufferExample) +add_subdirectory(pointLightsExample) +add_subdirectory(pointsAsTexturesExample) +add_subdirectory(shaderExample) +add_subdirectory(shadowsExample) +add_subdirectory(slowFastRenderingExample) +add_subdirectory(textureBufferInstancedExample) +add_subdirectory(textureExample) +add_subdirectory(textureScreengrabExample) +add_subdirectory(threadedPixelBufferExample) +add_subdirectory(transformFeedbackAnimatedExample) +add_subdirectory(transformFeedbackExample) +add_subdirectory(vboExample) +add_subdirectory(vboMeshDrawInstancedExample) +add_subdirectory(viewportExample) diff --git a/examples/gl/areaLightExample/CMakeLists.txt b/examples/gl/areaLightExample/CMakeLists.txt new file mode 100644 index 00000000000..70e7774b471 --- /dev/null +++ b/examples/gl/areaLightExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(areaLightExample) \ No newline at end of file diff --git a/examples/gl/billboardExample/CMakeLists.txt b/examples/gl/billboardExample/CMakeLists.txt new file mode 100644 index 00000000000..a1a35f37321 --- /dev/null +++ b/examples/gl/billboardExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(billboardExample) \ No newline at end of file diff --git a/examples/gl/billboardRotationExample/CMakeLists.txt b/examples/gl/billboardRotationExample/CMakeLists.txt new file mode 100644 index 00000000000..4f181e17fcf --- /dev/null +++ b/examples/gl/billboardRotationExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(billboardRotationExample) \ No newline at end of file diff --git a/examples/gl/computeShaderParticlesExample/CMakeLists.txt b/examples/gl/computeShaderParticlesExample/CMakeLists.txt new file mode 100644 index 00000000000..25d56f37462 --- /dev/null +++ b/examples/gl/computeShaderParticlesExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(computeShaderParticlesExample) +target_link_libraries(computeShaderParticlesExample of::ofxGui) \ No newline at end of file diff --git a/examples/gl/computeShaderTextureExample/CMakeLists.txt b/examples/gl/computeShaderTextureExample/CMakeLists.txt new file mode 100644 index 00000000000..bbaf6175986 --- /dev/null +++ b/examples/gl/computeShaderTextureExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(computeShaderTextureExample) +target_link_libraries(computeShaderTextureExample of::ofxOpenCv) \ No newline at end of file diff --git a/examples/gl/fboHighResOutputExample/CMakeLists.txt b/examples/gl/fboHighResOutputExample/CMakeLists.txt new file mode 100644 index 00000000000..e12c8c38add --- /dev/null +++ b/examples/gl/fboHighResOutputExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(fboHighResOutputExample) \ No newline at end of file diff --git a/examples/gl/fboTrailsExample/CMakeLists.txt b/examples/gl/fboTrailsExample/CMakeLists.txt new file mode 100644 index 00000000000..07fff880300 --- /dev/null +++ b/examples/gl/fboTrailsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(fboTrailsExample) \ No newline at end of file diff --git a/examples/gl/geometryShaderExample/CMakeLists.txt b/examples/gl/geometryShaderExample/CMakeLists.txt new file mode 100644 index 00000000000..0bca486a087 --- /dev/null +++ b/examples/gl/geometryShaderExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(geometryShaderExample) \ No newline at end of file diff --git a/examples/gl/glInfoExample/CMakeLists.txt b/examples/gl/glInfoExample/CMakeLists.txt new file mode 100644 index 00000000000..286219c088d --- /dev/null +++ b/examples/gl/glInfoExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(glInfoExample) \ No newline at end of file diff --git a/examples/gl/gpuParticleSystemExample/CMakeLists.txt b/examples/gl/gpuParticleSystemExample/CMakeLists.txt new file mode 100644 index 00000000000..fa0ebd0f3f6 --- /dev/null +++ b/examples/gl/gpuParticleSystemExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(gpuParticleSystemExample) \ No newline at end of file diff --git a/examples/gl/materialPBR/CMakeLists.txt b/examples/gl/materialPBR/CMakeLists.txt new file mode 100644 index 00000000000..9cb1ad64a3d --- /dev/null +++ b/examples/gl/materialPBR/CMakeLists.txt @@ -0,0 +1 @@ +define_example(materialPBR) \ No newline at end of file diff --git a/examples/gl/materialPBRAdvanced/CMakeLists.txt b/examples/gl/materialPBRAdvanced/CMakeLists.txt new file mode 100644 index 00000000000..d600458ec16 --- /dev/null +++ b/examples/gl/materialPBRAdvanced/CMakeLists.txt @@ -0,0 +1 @@ +define_example(materialPBRAdvanced) \ No newline at end of file diff --git a/examples/gl/multiLightExample/CMakeLists.txt b/examples/gl/multiLightExample/CMakeLists.txt new file mode 100644 index 00000000000..b69710115ef --- /dev/null +++ b/examples/gl/multiLightExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(multiLightExample) \ No newline at end of file diff --git a/examples/gl/multiTexture3dExample/CMakeLists.txt b/examples/gl/multiTexture3dExample/CMakeLists.txt new file mode 100644 index 00000000000..b829bb4f053 --- /dev/null +++ b/examples/gl/multiTexture3dExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(multiTexture3dExample) \ No newline at end of file diff --git a/examples/gl/multiTextureShaderExample/CMakeLists.txt b/examples/gl/multiTextureShaderExample/CMakeLists.txt new file mode 100644 index 00000000000..ab05ed14b82 --- /dev/null +++ b/examples/gl/multiTextureShaderExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(multiTextureShaderExample) \ No newline at end of file diff --git a/examples/gl/pixelBufferExample/CMakeLists.txt b/examples/gl/pixelBufferExample/CMakeLists.txt new file mode 100644 index 00000000000..37cd92715ed --- /dev/null +++ b/examples/gl/pixelBufferExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(pixelBufferExample) \ No newline at end of file diff --git a/examples/gl/pointLightsExample/CMakeLists.txt b/examples/gl/pointLightsExample/CMakeLists.txt new file mode 100644 index 00000000000..965b35b768c --- /dev/null +++ b/examples/gl/pointLightsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(pointLightsExample) \ No newline at end of file diff --git a/examples/gl/pointsAsTexturesExample/CMakeLists.txt b/examples/gl/pointsAsTexturesExample/CMakeLists.txt new file mode 100644 index 00000000000..4a5fd7059c8 --- /dev/null +++ b/examples/gl/pointsAsTexturesExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(pointsAsTexturesExample) \ No newline at end of file diff --git a/examples/gl/shaderExample/CMakeLists.txt b/examples/gl/shaderExample/CMakeLists.txt new file mode 100644 index 00000000000..178d5241b70 --- /dev/null +++ b/examples/gl/shaderExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(shaderExample) \ No newline at end of file diff --git a/examples/gl/shadowsExample/CMakeLists.txt b/examples/gl/shadowsExample/CMakeLists.txt new file mode 100644 index 00000000000..c3240f00cb6 --- /dev/null +++ b/examples/gl/shadowsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(shadowsExample) \ No newline at end of file diff --git a/examples/gl/slowFastRenderingExample/CMakeLists.txt b/examples/gl/slowFastRenderingExample/CMakeLists.txt new file mode 100644 index 00000000000..90e79118e66 --- /dev/null +++ b/examples/gl/slowFastRenderingExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(slowFastRenderingExample) \ No newline at end of file diff --git a/examples/gl/textureBufferInstancedExample/CMakeLists.txt b/examples/gl/textureBufferInstancedExample/CMakeLists.txt new file mode 100644 index 00000000000..4008502026a --- /dev/null +++ b/examples/gl/textureBufferInstancedExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(textureBufferInstancedExample) \ No newline at end of file diff --git a/examples/gl/textureExample/CMakeLists.txt b/examples/gl/textureExample/CMakeLists.txt new file mode 100644 index 00000000000..72121e35696 --- /dev/null +++ b/examples/gl/textureExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(textureExample) \ No newline at end of file diff --git a/examples/gl/textureScreengrabExample/CMakeLists.txt b/examples/gl/textureScreengrabExample/CMakeLists.txt new file mode 100644 index 00000000000..0ef18c30103 --- /dev/null +++ b/examples/gl/textureScreengrabExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(textureScreengrabExample) \ No newline at end of file diff --git a/examples/gl/threadedPixelBufferExample/CMakeLists.txt b/examples/gl/threadedPixelBufferExample/CMakeLists.txt new file mode 100644 index 00000000000..3031a282b54 --- /dev/null +++ b/examples/gl/threadedPixelBufferExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(threadedPixelBufferExample) \ No newline at end of file diff --git a/examples/gl/transformFeedbackAnimatedExample/CMakeLists.txt b/examples/gl/transformFeedbackAnimatedExample/CMakeLists.txt new file mode 100644 index 00000000000..6dba09eb155 --- /dev/null +++ b/examples/gl/transformFeedbackAnimatedExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(transformFeedbackAnimatedExample) +target_link_libraries(transformFeedbackAnimatedExample of::ofxGui) \ No newline at end of file diff --git a/examples/gl/transformFeedbackExample/CMakeLists.txt b/examples/gl/transformFeedbackExample/CMakeLists.txt new file mode 100644 index 00000000000..2e9009df2c4 --- /dev/null +++ b/examples/gl/transformFeedbackExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(transformFeedbackExample) \ No newline at end of file diff --git a/examples/gl/vboExample/CMakeLists.txt b/examples/gl/vboExample/CMakeLists.txt new file mode 100644 index 00000000000..193d154bf17 --- /dev/null +++ b/examples/gl/vboExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(vboExample) \ No newline at end of file diff --git a/examples/gl/vboMeshDrawInstancedExample/CMakeLists.txt b/examples/gl/vboMeshDrawInstancedExample/CMakeLists.txt new file mode 100644 index 00000000000..c9bc130d714 --- /dev/null +++ b/examples/gl/vboMeshDrawInstancedExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(vboMeshDrawInstancedExample) \ No newline at end of file diff --git a/examples/gl/viewportExample/CMakeLists.txt b/examples/gl/viewportExample/CMakeLists.txt new file mode 100644 index 00000000000..da158381c6d --- /dev/null +++ b/examples/gl/viewportExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(viewportExample) \ No newline at end of file From 99d179ad4662d32bd7b77ccada2b8f6c26dad548 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 14:51:41 +0200 Subject: [PATCH 17/49] CMake: Implement graphics examples --- addons/CMakeLists.txt | 3 +- addons/ofxVectorGraphics/CMakeLists.txt | 3 ++ cmake/download_and_link_deps.cmake | 49 ++++++++++++------- cmake/utils.cmake | 6 ++- examples/CMakeLists.txt | 9 +++- examples/gles/CMakeLists.txt | 2 + .../CMakeLists.txt | 1 + examples/graphics/CMakeLists.txt | 15 ++++++ .../graphics/blendingExample/CMakeLists.txt | 1 + examples/graphics/colorExample/CMakeLists.txt | 1 + .../colorsExtendedExample/CMakeLists.txt | 1 + .../floatingPointImageExample/CMakeLists.txt | 1 + .../graphics/fontShapesExample/CMakeLists.txt | 1 + examples/graphics/fontsExample/CMakeLists.txt | 1 + .../graphics/graphicsExample/CMakeLists.txt | 1 + .../imageSubsectionExample/CMakeLists.txt | 1 + .../graphics/lutFilterExample/CMakeLists.txt | 1 + .../graphics/polygonExample/CMakeLists.txt | 1 + .../polylineBlobsExample/CMakeLists.txt | 2 + .../CMakeLists.txt | 1 + .../simpleColorKeyExample/CMakeLists.txt | 1 + .../vectorGraphicsExample/CMakeLists.txt | 2 + tests/CMakeLists.txt | 1 + 23 files changed, 82 insertions(+), 23 deletions(-) create mode 100644 addons/ofxVectorGraphics/CMakeLists.txt create mode 100644 examples/gles/CMakeLists.txt create mode 100644 examples/gles/customEGLWindowSettingsExample/CMakeLists.txt create mode 100644 examples/graphics/CMakeLists.txt create mode 100644 examples/graphics/blendingExample/CMakeLists.txt create mode 100644 examples/graphics/colorExample/CMakeLists.txt create mode 100644 examples/graphics/colorsExtendedExample/CMakeLists.txt create mode 100644 examples/graphics/floatingPointImageExample/CMakeLists.txt create mode 100644 examples/graphics/fontShapesExample/CMakeLists.txt create mode 100644 examples/graphics/fontsExample/CMakeLists.txt create mode 100644 examples/graphics/graphicsExample/CMakeLists.txt create mode 100644 examples/graphics/imageSubsectionExample/CMakeLists.txt create mode 100644 examples/graphics/lutFilterExample/CMakeLists.txt create mode 100644 examples/graphics/polygonExample/CMakeLists.txt create mode 100644 examples/graphics/polylineBlobsExample/CMakeLists.txt create mode 100644 examples/graphics/rectangleAlignmentAndScalingExample/CMakeLists.txt create mode 100644 examples/graphics/simpleColorKeyExample/CMakeLists.txt create mode 100644 examples/graphics/vectorGraphicsExample/CMakeLists.txt diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index 160c8287bc8..2c5e802dfff 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -1,3 +1,4 @@ +message(STATUS "[openframeworks] Configuring addons") function(define_addon TARGET_NAME) file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) @@ -45,5 +46,5 @@ add_subdirectory(ofxOsc) # add_subdirectory(ofxSvg) # add_subdirectory(ofxThreadedImageLoader) # add_subdirectory(ofxUnitTests) -# add_subdirectory(ofxVectorGraphics) +add_subdirectory(ofxVectorGraphics) # add_subdirectory(ofxXmlSettings) \ No newline at end of file diff --git a/addons/ofxVectorGraphics/CMakeLists.txt b/addons/ofxVectorGraphics/CMakeLists.txt new file mode 100644 index 00000000000..67cf0b372a2 --- /dev/null +++ b/addons/ofxVectorGraphics/CMakeLists.txt @@ -0,0 +1,3 @@ +define_addon(ofxVectorGraphics) +target_sources(ofxVectorGraphics PRIVATE libs/CreEPS.cpp) +target_include_directories(ofxVectorGraphics PUBLIC libs) \ No newline at end of file diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index db9c008444b..3fbd8521ed2 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -63,18 +63,22 @@ function(get_packages_and_link) endif() message(STATUS "[openframeworks] Using ${OF_TARGET_ARCHITECTURE} toolchain, downloading dependencies (-DOF_VERBOSE=ON for progress)") foreach(dependency IN LISTS ARGN) - set(_URL "http://ci.openframeworks.cc/libs/openFrameworksLibs_master_${dependency}") - if (OF_VERBOSE) - message(STATUS "[openframeworks] Fetching ${_URL}") - endif() # Download and extract the compressed archive - CPMAddPackage( - NAME of-deps-${dependency} - DOWNLOAD_EXTRACT_TIMESTAMP TRUE - DOWNLOAD_ONLY YES - URL ${_URL} - ) + 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 the build folder and re-run cmake.") + endif() # Now, create the targets and link all files to them set(PACKAGE_SOURCE_DIR ${of-deps-${dependency}_SOURCE_DIR}) @@ -142,7 +146,6 @@ else () endif() - # Find system packages if (NOT OF_TARGET_ARCHITECTURE MATCHES "android") find_package(OpenGL) @@ -162,13 +165,20 @@ endif() # TODO: Now, download glut since it's somehow not part of the apothecary. Glut support seems to be deprecated if (WIN32) - CPMAddPackage( - NAME of-deps-glut - GIT_REPOSITORY "https://github.com/markkilgard/glut" - GIT_TAG "8cd96cb440f1f2fac3a154227937be39d06efa53" - DOWNLOAD_EXTRACT_TIMESTAMP TRUE - DOWNLOAD_ONLY YES - ) + 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 the build folder 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) @@ -205,3 +215,6 @@ if (OF_TARGET_ARCHITECTURE STREQUAL "msvc" OR # GLEW is only a requirement 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}") diff --git a/cmake/utils.cmake b/cmake/utils.cmake index acf6ef59bd1..023f1054b97 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -31,8 +31,10 @@ endfunction() # After compilation copy the dll files to the binary dir function(of_copy_runtime_to_bin_dir_after_build TARGET BIN_DIR) - file(GLOB_RECURSE libs "${CMAKE_BINARY_DIR}/_deps/**/${CMAKE_SHARED_LIBRARY_PREFIX}**${CMAKE_SHARED_LIBRARY_SUFFIX}") - foreach(lib_path IN LISTS libs) + 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() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 3bb5481a69e..11f1b54d53d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,3 +1,4 @@ +message(STATUS "[openframeworks] Configuring examples") # Macro for defining an example with all of its properties macro(define_example TARGET_NAME) # A macro is executed in the caller's scope (current list is the caller) @@ -45,8 +46,12 @@ add_subdirectory(communication) add_subdirectory(computer_vision) add_subdirectory(events) add_subdirectory(gl) -# add_subdirectory(gles) -# add_subdirectory(graphics) + +if (NOT OF_TARGET_ARCHITECTURE MATCHES "msvc" AND NOT OF_TARGET_ARCHITECTURE MATCHES "macos" AND NOT OF_TARGET_ARCHITECTURE MATCHES "linux") + add_subdirectory(gles) +endif() + +add_subdirectory(graphics) # add_subdirectory(gui) # add_subdirectory(input_output) # add_subdirectory(ios) diff --git a/examples/gles/CMakeLists.txt b/examples/gles/CMakeLists.txt new file mode 100644 index 00000000000..9a64bf643b5 --- /dev/null +++ b/examples/gles/CMakeLists.txt @@ -0,0 +1,2 @@ + +add_subdirectory(customEGLWindowSettingsExample) diff --git a/examples/gles/customEGLWindowSettingsExample/CMakeLists.txt b/examples/gles/customEGLWindowSettingsExample/CMakeLists.txt new file mode 100644 index 00000000000..3ebdbd479d0 --- /dev/null +++ b/examples/gles/customEGLWindowSettingsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(customEGLWindowSettingsExample) \ No newline at end of file diff --git a/examples/graphics/CMakeLists.txt b/examples/graphics/CMakeLists.txt new file mode 100644 index 00000000000..65aad9bd4f7 --- /dev/null +++ b/examples/graphics/CMakeLists.txt @@ -0,0 +1,15 @@ + +add_subdirectory(blendingExample) +add_subdirectory(colorExample) +add_subdirectory(colorsExtendedExample) +add_subdirectory(floatingPointImageExample) +add_subdirectory(fontsExample) +add_subdirectory(fontShapesExample) +add_subdirectory(graphicsExample) +add_subdirectory(imageSubsectionExample) +add_subdirectory(lutFilterExample) +add_subdirectory(polygonExample) +add_subdirectory(polylineBlobsExample) +add_subdirectory(rectangleAlignmentAndScalingExample) +add_subdirectory(simpleColorKeyExample) +add_subdirectory(vectorGraphicsExample) diff --git a/examples/graphics/blendingExample/CMakeLists.txt b/examples/graphics/blendingExample/CMakeLists.txt new file mode 100644 index 00000000000..2a40703b8f7 --- /dev/null +++ b/examples/graphics/blendingExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(blendingExample) \ No newline at end of file diff --git a/examples/graphics/colorExample/CMakeLists.txt b/examples/graphics/colorExample/CMakeLists.txt new file mode 100644 index 00000000000..4a0337749a3 --- /dev/null +++ b/examples/graphics/colorExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(colorExample) \ No newline at end of file diff --git a/examples/graphics/colorsExtendedExample/CMakeLists.txt b/examples/graphics/colorsExtendedExample/CMakeLists.txt new file mode 100644 index 00000000000..aaf36d1e37d --- /dev/null +++ b/examples/graphics/colorsExtendedExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(colorsExtendedExample) \ No newline at end of file diff --git a/examples/graphics/floatingPointImageExample/CMakeLists.txt b/examples/graphics/floatingPointImageExample/CMakeLists.txt new file mode 100644 index 00000000000..2a5884eed23 --- /dev/null +++ b/examples/graphics/floatingPointImageExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(floatingPointImageExample) \ No newline at end of file diff --git a/examples/graphics/fontShapesExample/CMakeLists.txt b/examples/graphics/fontShapesExample/CMakeLists.txt new file mode 100644 index 00000000000..07362ed61eb --- /dev/null +++ b/examples/graphics/fontShapesExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(fontShapesExample) \ No newline at end of file diff --git a/examples/graphics/fontsExample/CMakeLists.txt b/examples/graphics/fontsExample/CMakeLists.txt new file mode 100644 index 00000000000..e5c953966ad --- /dev/null +++ b/examples/graphics/fontsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(fontsExample) \ No newline at end of file diff --git a/examples/graphics/graphicsExample/CMakeLists.txt b/examples/graphics/graphicsExample/CMakeLists.txt new file mode 100644 index 00000000000..b05e5672782 --- /dev/null +++ b/examples/graphics/graphicsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(graphicsExample) \ No newline at end of file diff --git a/examples/graphics/imageSubsectionExample/CMakeLists.txt b/examples/graphics/imageSubsectionExample/CMakeLists.txt new file mode 100644 index 00000000000..73f8865e4b4 --- /dev/null +++ b/examples/graphics/imageSubsectionExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(imageSubsectionExample) \ No newline at end of file diff --git a/examples/graphics/lutFilterExample/CMakeLists.txt b/examples/graphics/lutFilterExample/CMakeLists.txt new file mode 100644 index 00000000000..a610eeb37bd --- /dev/null +++ b/examples/graphics/lutFilterExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(lutFilterExample) \ No newline at end of file diff --git a/examples/graphics/polygonExample/CMakeLists.txt b/examples/graphics/polygonExample/CMakeLists.txt new file mode 100644 index 00000000000..ff5526c8f25 --- /dev/null +++ b/examples/graphics/polygonExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(polygonExample) \ No newline at end of file diff --git a/examples/graphics/polylineBlobsExample/CMakeLists.txt b/examples/graphics/polylineBlobsExample/CMakeLists.txt new file mode 100644 index 00000000000..0dd3c64c897 --- /dev/null +++ b/examples/graphics/polylineBlobsExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(polylineBlobsExample) +target_link_libraries(polylineBlobsExample of::ofxOpenCv) \ No newline at end of file diff --git a/examples/graphics/rectangleAlignmentAndScalingExample/CMakeLists.txt b/examples/graphics/rectangleAlignmentAndScalingExample/CMakeLists.txt new file mode 100644 index 00000000000..74c596bbc07 --- /dev/null +++ b/examples/graphics/rectangleAlignmentAndScalingExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(rectangleAlignmentAndScalingExample) \ No newline at end of file diff --git a/examples/graphics/simpleColorKeyExample/CMakeLists.txt b/examples/graphics/simpleColorKeyExample/CMakeLists.txt new file mode 100644 index 00000000000..06d71e851c4 --- /dev/null +++ b/examples/graphics/simpleColorKeyExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(simpleColorKeyExample) \ No newline at end of file diff --git a/examples/graphics/vectorGraphicsExample/CMakeLists.txt b/examples/graphics/vectorGraphicsExample/CMakeLists.txt new file mode 100644 index 00000000000..9890be3119b --- /dev/null +++ b/examples/graphics/vectorGraphicsExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(vectorGraphicsExample) +target_link_libraries(vectorGraphicsExample of::ofxVectorGraphics) \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 59ef517fc31..3fb883965c2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1 +1,2 @@ +message(STATUS "[openframeworks] Configuring tests") message("TODO: Implement tests in CMake") \ No newline at end of file From 65750664a823e76806df61d4ea06d016927e5b71 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 15:01:25 +0200 Subject: [PATCH 18/49] CMake: Implement gui examples --- examples/CMakeLists.txt | 2 +- examples/gui/CMakeLists.txt | 2 ++ examples/gui/guiExample/CMakeLists.txt | 9 ++------- examples/gui/guiFromParametersExample/CMakeLists.txt | 9 ++------- examples/gui/oscParametersReceiverExample/CMakeLists.txt | 7 ++----- examples/gui/oscParametersSenderExample/CMakeLists.txt | 7 ++----- examples/gui/parameterEdgeCasesExample/CMakeLists.txt | 1 + examples/gui/parameterGroupExample/CMakeLists.txt | 2 ++ 8 files changed, 14 insertions(+), 25 deletions(-) create mode 100644 examples/gui/parameterEdgeCasesExample/CMakeLists.txt create mode 100644 examples/gui/parameterGroupExample/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 11f1b54d53d..3ad0b8c1a4d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -52,7 +52,7 @@ if (NOT OF_TARGET_ARCHITECTURE MATCHES "msvc" AND NOT OF_TARGET_ARCHITECTURE MAT endif() add_subdirectory(graphics) -# add_subdirectory(gui) +add_subdirectory(gui) # add_subdirectory(input_output) # add_subdirectory(ios) # add_subdirectory(math) diff --git a/examples/gui/CMakeLists.txt b/examples/gui/CMakeLists.txt index f73d1d1aa3f..9fbde92a7c1 100644 --- a/examples/gui/CMakeLists.txt +++ b/examples/gui/CMakeLists.txt @@ -3,3 +3,5 @@ add_subdirectory(guiExample) add_subdirectory(guiFromParametersExample) add_subdirectory(oscParametersReceiverExample) add_subdirectory(oscParametersSenderExample) +add_subdirectory(parameterEdgeCasesExample) +add_subdirectory(parameterGroupExample) diff --git a/examples/gui/guiExample/CMakeLists.txt b/examples/gui/guiExample/CMakeLists.txt index c7ad06cf7e1..a7f6c81b26b 100644 --- a/examples/gui/guiExample/CMakeLists.txt +++ b/examples/gui/guiExample/CMakeLists.txt @@ -1,7 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(guiExample ${SOURCES}) - -target_link_libraries(guiExample ofxGui) - -copy_resource_after_build(guiExample ${CMAKE_CURRENT_LIST_DIR}/bin/data/ring.wav data) +define_example(guiExample) +target_link_libraries(guiExample of::ofxGui) \ No newline at end of file diff --git a/examples/gui/guiFromParametersExample/CMakeLists.txt b/examples/gui/guiFromParametersExample/CMakeLists.txt index c82d0a7a6b5..2aefd371c66 100644 --- a/examples/gui/guiFromParametersExample/CMakeLists.txt +++ b/examples/gui/guiFromParametersExample/CMakeLists.txt @@ -1,7 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(guiFromParametersExample ${SOURCES}) - -target_link_libraries(guiFromParametersExample ofxGui) - -copy_resource_after_build(guiFromParametersExample ${CMAKE_CURRENT_LIST_DIR}/bin/data/ring.wav data) +define_example(guiFromParametersExample) +target_link_libraries(guiFromParametersExample of::ofxGui) \ No newline at end of file diff --git a/examples/gui/oscParametersReceiverExample/CMakeLists.txt b/examples/gui/oscParametersReceiverExample/CMakeLists.txt index 10b4669e1f1..e524555ba61 100644 --- a/examples/gui/oscParametersReceiverExample/CMakeLists.txt +++ b/examples/gui/oscParametersReceiverExample/CMakeLists.txt @@ -1,5 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(oscParametersReceiverExample ${SOURCES}) - -target_link_libraries(oscParametersReceiverExample ofxGui ofxOsc) +define_example(oscParametersReceiverExample) +target_link_libraries(oscParametersReceiverExample of::ofxGui of::ofxOsc) \ No newline at end of file diff --git a/examples/gui/oscParametersSenderExample/CMakeLists.txt b/examples/gui/oscParametersSenderExample/CMakeLists.txt index 77dcd543b15..83be51fd440 100644 --- a/examples/gui/oscParametersSenderExample/CMakeLists.txt +++ b/examples/gui/oscParametersSenderExample/CMakeLists.txt @@ -1,5 +1,2 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(oscParametersSenderExample ${SOURCES}) - -target_link_libraries(oscParametersSenderExample ofxGui ofxOsc) +define_example(oscParametersSenderExample) +target_link_libraries(oscParametersSenderExample of::ofxGui of::ofxOsc) \ No newline at end of file diff --git a/examples/gui/parameterEdgeCasesExample/CMakeLists.txt b/examples/gui/parameterEdgeCasesExample/CMakeLists.txt new file mode 100644 index 00000000000..513b709cf3d --- /dev/null +++ b/examples/gui/parameterEdgeCasesExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(parameterEdgeCasesExample) \ No newline at end of file diff --git a/examples/gui/parameterGroupExample/CMakeLists.txt b/examples/gui/parameterGroupExample/CMakeLists.txt new file mode 100644 index 00000000000..69d6570e011 --- /dev/null +++ b/examples/gui/parameterGroupExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(parameterGroupExample) +target_link_libraries(parameterGroupExample of::ofxGui) \ No newline at end of file From d1e7363ca961b15c472a1d04c25118d2f88a53b5 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 16:35:52 +0200 Subject: [PATCH 19/49] CMake: Implement input_output examples --- CMakeLists.txt | 1 + addons/CMakeLists.txt | 6 +++--- addons/ofxSvg/CMakeLists.txt | 2 ++ addons/ofxXmlSettings/CMakeLists.txt | 4 ++++ examples/CMakeLists.txt | 2 +- examples/input_output/CMakeLists.txt | 19 +++++++++++++++++++ .../clipboardExample/CMakeLists.txt | 1 + .../clipboardExample/bin/data/.gitkeep | 0 .../dirListExample/CMakeLists.txt | 1 + .../dragDropExample/CMakeLists.txt | 1 + .../CMakeLists.txt | 1 + .../fileOpenSaveDialogExample/CMakeLists.txt | 1 + .../imageCompressionExample/CMakeLists.txt | 1 + .../imageLoaderExample/CMakeLists.txt | 1 + .../imageLoaderWebExample/CMakeLists.txt | 1 + .../imageSaverExample/CMakeLists.txt | 1 + .../imageSequenceExample/CMakeLists.txt | 1 + .../input_output/jsonExample/CMakeLists.txt | 1 + .../loadTextFileExample/CMakeLists.txt | 1 + .../input_output/pdfExample/CMakeLists.txt | 2 ++ .../pugiXmlExample/CMakeLists.txt | 1 + .../input_output/svgExample/CMakeLists.txt | 2 ++ .../systemSpeakExample/CMakeLists.txt | 1 + .../input_output/xmlExample/CMakeLists.txt | 1 + .../xmlSettingsExample/CMakeLists.txt | 2 ++ libs/openFrameworks/utils/ofFileUtils.h | 2 +- 26 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 addons/ofxSvg/CMakeLists.txt create mode 100644 addons/ofxXmlSettings/CMakeLists.txt create mode 100644 examples/input_output/CMakeLists.txt create mode 100644 examples/input_output/clipboardExample/CMakeLists.txt create mode 100644 examples/input_output/clipboardExample/bin/data/.gitkeep create mode 100644 examples/input_output/dirListExample/CMakeLists.txt create mode 100644 examples/input_output/dragDropExample/CMakeLists.txt create mode 100644 examples/input_output/fileBufferLoadingCSVExample/CMakeLists.txt create mode 100644 examples/input_output/fileOpenSaveDialogExample/CMakeLists.txt create mode 100644 examples/input_output/imageCompressionExample/CMakeLists.txt create mode 100644 examples/input_output/imageLoaderExample/CMakeLists.txt create mode 100644 examples/input_output/imageLoaderWebExample/CMakeLists.txt create mode 100644 examples/input_output/imageSaverExample/CMakeLists.txt create mode 100644 examples/input_output/imageSequenceExample/CMakeLists.txt create mode 100644 examples/input_output/jsonExample/CMakeLists.txt create mode 100644 examples/input_output/loadTextFileExample/CMakeLists.txt create mode 100644 examples/input_output/pdfExample/CMakeLists.txt create mode 100644 examples/input_output/pugiXmlExample/CMakeLists.txt create mode 100644 examples/input_output/svgExample/CMakeLists.txt create mode 100644 examples/input_output/systemSpeakExample/CMakeLists.txt create mode 100644 examples/input_output/xmlExample/CMakeLists.txt create mode 100644 examples/input_output/xmlSettingsExample/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 33db097d4b9..bc79b8339e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,7 @@ target_compile_definitions(openframeworks PUBLIC _UNICODE CURL_STATICLIB POCO_STATIC + CAIRO_WIN32_STATIC_BUILD ) # Compiler flags specific to MSVC diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index 2c5e802dfff..c82b6ed9ce5 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -42,9 +42,9 @@ add_subdirectory(ofxKinect) add_subdirectory(ofxNetwork) add_subdirectory(ofxOpenCv) add_subdirectory(ofxOsc) -# add_subdirectory(ofxPoco) -# add_subdirectory(ofxSvg) +# add_subdirectory(ofxPoco) +add_subdirectory(ofxSvg) # add_subdirectory(ofxThreadedImageLoader) # add_subdirectory(ofxUnitTests) add_subdirectory(ofxVectorGraphics) -# add_subdirectory(ofxXmlSettings) \ No newline at end of file +add_subdirectory(ofxXmlSettings) \ No newline at end of file diff --git a/addons/ofxSvg/CMakeLists.txt b/addons/ofxSvg/CMakeLists.txt new file mode 100644 index 00000000000..df64a1c1649 --- /dev/null +++ b/addons/ofxSvg/CMakeLists.txt @@ -0,0 +1,2 @@ +define_addon(ofxSvg) +target_link_libraries(ofxSvg of::svgtiny of::libxml2) \ No newline at end of file diff --git a/addons/ofxXmlSettings/CMakeLists.txt b/addons/ofxXmlSettings/CMakeLists.txt new file mode 100644 index 00000000000..b0792417e2b --- /dev/null +++ b/addons/ofxXmlSettings/CMakeLists.txt @@ -0,0 +1,4 @@ +define_addon(ofxXmlSettings) +target_sources(ofxXmlSettings PRIVATE libs/tinyxml.cpp libs/tinyxmlerror.cpp libs/tinyxmlparser.cpp) +target_include_directories(ofxXmlSettings PUBLIC libs) +target_link_libraries(ofxXmlSettings of::svgtiny) \ No newline at end of file diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 3ad0b8c1a4d..d37bc6ac05e 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -53,7 +53,7 @@ endif() add_subdirectory(graphics) add_subdirectory(gui) -# add_subdirectory(input_output) +add_subdirectory(input_output) # add_subdirectory(ios) # add_subdirectory(math) # add_subdirectory(shader) diff --git a/examples/input_output/CMakeLists.txt b/examples/input_output/CMakeLists.txt new file mode 100644 index 00000000000..b4ee75cc45d --- /dev/null +++ b/examples/input_output/CMakeLists.txt @@ -0,0 +1,19 @@ + +add_subdirectory(clipboardExample) +add_subdirectory(dirListExample) +add_subdirectory(dragDropExample) +add_subdirectory(fileBufferLoadingCSVExample) +add_subdirectory(fileOpenSaveDialogExample) +add_subdirectory(imageCompressionExample) +add_subdirectory(imageLoaderExample) +add_subdirectory(imageLoaderWebExample) +add_subdirectory(imageSaverExample) +add_subdirectory(imageSequenceExample) +add_subdirectory(jsonExample) +add_subdirectory(loadTextFileExample) +add_subdirectory(pdfExample) +add_subdirectory(pugiXmlExample) +add_subdirectory(svgExample) +add_subdirectory(systemSpeakExample) +add_subdirectory(xmlExample) +add_subdirectory(xmlSettingsExample) diff --git a/examples/input_output/clipboardExample/CMakeLists.txt b/examples/input_output/clipboardExample/CMakeLists.txt new file mode 100644 index 00000000000..1648fabcdc2 --- /dev/null +++ b/examples/input_output/clipboardExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(clipboardExample) \ No newline at end of file diff --git a/examples/input_output/clipboardExample/bin/data/.gitkeep b/examples/input_output/clipboardExample/bin/data/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/examples/input_output/dirListExample/CMakeLists.txt b/examples/input_output/dirListExample/CMakeLists.txt new file mode 100644 index 00000000000..70ed06fba2e --- /dev/null +++ b/examples/input_output/dirListExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(dirListExample) \ No newline at end of file diff --git a/examples/input_output/dragDropExample/CMakeLists.txt b/examples/input_output/dragDropExample/CMakeLists.txt new file mode 100644 index 00000000000..e68a279cd61 --- /dev/null +++ b/examples/input_output/dragDropExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(dragDropExample) \ No newline at end of file diff --git a/examples/input_output/fileBufferLoadingCSVExample/CMakeLists.txt b/examples/input_output/fileBufferLoadingCSVExample/CMakeLists.txt new file mode 100644 index 00000000000..813e8c89338 --- /dev/null +++ b/examples/input_output/fileBufferLoadingCSVExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(fileBufferLoadingCSVExample) \ No newline at end of file diff --git a/examples/input_output/fileOpenSaveDialogExample/CMakeLists.txt b/examples/input_output/fileOpenSaveDialogExample/CMakeLists.txt new file mode 100644 index 00000000000..a5025f4b2a4 --- /dev/null +++ b/examples/input_output/fileOpenSaveDialogExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(fileOpenSaveDialogExample) \ No newline at end of file diff --git a/examples/input_output/imageCompressionExample/CMakeLists.txt b/examples/input_output/imageCompressionExample/CMakeLists.txt new file mode 100644 index 00000000000..ebf3a5d11ef --- /dev/null +++ b/examples/input_output/imageCompressionExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(imageCompressionExample) \ No newline at end of file diff --git a/examples/input_output/imageLoaderExample/CMakeLists.txt b/examples/input_output/imageLoaderExample/CMakeLists.txt new file mode 100644 index 00000000000..a6922463a55 --- /dev/null +++ b/examples/input_output/imageLoaderExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(imageLoaderExample) \ No newline at end of file diff --git a/examples/input_output/imageLoaderWebExample/CMakeLists.txt b/examples/input_output/imageLoaderWebExample/CMakeLists.txt new file mode 100644 index 00000000000..49f723a8979 --- /dev/null +++ b/examples/input_output/imageLoaderWebExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(imageLoaderWebExample) \ No newline at end of file diff --git a/examples/input_output/imageSaverExample/CMakeLists.txt b/examples/input_output/imageSaverExample/CMakeLists.txt new file mode 100644 index 00000000000..7fa49eef1cd --- /dev/null +++ b/examples/input_output/imageSaverExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(imageSaverExample) \ No newline at end of file diff --git a/examples/input_output/imageSequenceExample/CMakeLists.txt b/examples/input_output/imageSequenceExample/CMakeLists.txt new file mode 100644 index 00000000000..b4ab4ba2809 --- /dev/null +++ b/examples/input_output/imageSequenceExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(imageSequenceExample) \ No newline at end of file diff --git a/examples/input_output/jsonExample/CMakeLists.txt b/examples/input_output/jsonExample/CMakeLists.txt new file mode 100644 index 00000000000..bf878dff384 --- /dev/null +++ b/examples/input_output/jsonExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(jsonExample) \ No newline at end of file diff --git a/examples/input_output/loadTextFileExample/CMakeLists.txt b/examples/input_output/loadTextFileExample/CMakeLists.txt new file mode 100644 index 00000000000..69519d64624 --- /dev/null +++ b/examples/input_output/loadTextFileExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(loadTextFileExample) \ No newline at end of file diff --git a/examples/input_output/pdfExample/CMakeLists.txt b/examples/input_output/pdfExample/CMakeLists.txt new file mode 100644 index 00000000000..71c0b4a610a --- /dev/null +++ b/examples/input_output/pdfExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(pdfExample) +target_link_libraries(pdfExample of::cairo) \ No newline at end of file diff --git a/examples/input_output/pugiXmlExample/CMakeLists.txt b/examples/input_output/pugiXmlExample/CMakeLists.txt new file mode 100644 index 00000000000..6e908442a06 --- /dev/null +++ b/examples/input_output/pugiXmlExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(pugiXmlExample) \ No newline at end of file diff --git a/examples/input_output/svgExample/CMakeLists.txt b/examples/input_output/svgExample/CMakeLists.txt new file mode 100644 index 00000000000..033c196b866 --- /dev/null +++ b/examples/input_output/svgExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(svgExample) +target_link_libraries(svgExample of::ofxSvg) \ No newline at end of file diff --git a/examples/input_output/systemSpeakExample/CMakeLists.txt b/examples/input_output/systemSpeakExample/CMakeLists.txt new file mode 100644 index 00000000000..2c0a3584025 --- /dev/null +++ b/examples/input_output/systemSpeakExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(systemSpeakExample) \ No newline at end of file diff --git a/examples/input_output/xmlExample/CMakeLists.txt b/examples/input_output/xmlExample/CMakeLists.txt new file mode 100644 index 00000000000..8dab4890953 --- /dev/null +++ b/examples/input_output/xmlExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(xmlExample) \ No newline at end of file diff --git a/examples/input_output/xmlSettingsExample/CMakeLists.txt b/examples/input_output/xmlSettingsExample/CMakeLists.txt new file mode 100644 index 00000000000..f979a2240f9 --- /dev/null +++ b/examples/input_output/xmlSettingsExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(xmlSettingsExample) +target_link_libraries(xmlSettingsExample of::ofxXmlSettings) \ No newline at end of file diff --git a/libs/openFrameworks/utils/ofFileUtils.h b/libs/openFrameworks/utils/ofFileUtils.h index 34840f12891..bed0c30d38e 100644 --- a/libs/openFrameworks/utils/ofFileUtils.h +++ b/libs/openFrameworks/utils/ofFileUtils.h @@ -281,7 +281,7 @@ ofBuffer ofBufferFromFile(const of::filesystem::path & path, bool binary=true); /// \param buffer data source to write from /// \param binary set to false if you are writing a text file & want lines /// split at endline characters automatically -bool ofBufferToFile(of::filesystem::path & path, const ofBuffer& buffer, bool binary=true); +bool ofBufferToFile(const of::filesystem::path & path, const ofBuffer& buffer, bool binary=true); //-------------------------------------------------- /// \class ofFilePath From b499a9fc7cb10b0952e5722f9faed75f3e6387c1 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 17:18:22 +0200 Subject: [PATCH 20/49] CMake: Implement rudimentary iOS examples, still need to be finalized and tested by an iOS developer --- addons/CMakeLists.txt | 2 +- examples/CMakeLists.txt | 10 ++++- examples/ios/CMakeLists.txt | 44 +++++++++++++++++++ .../ios/CoreHapticsExample/CMakeLists.txt | 1 + .../ios/CoreLocationExample/CMakeLists.txt | 1 + examples/ios/GLKit/CMakeLists.txt | 1 + .../ios/GLKitNativeARCExample/CMakeLists.txt | 1 + .../ios/ImagePickerExample/CMakeLists.txt | 1 + examples/ios/KeyboardExample/CMakeLists.txt | 1 + examples/ios/MapKitExample/CMakeLists.txt | 1 + examples/ios/PrimitivesExample/CMakeLists.txt | 1 + .../ios/advancedEventsExample/CMakeLists.txt | 1 + .../advancedGraphicsExample/CMakeLists.txt | 1 + examples/ios/assimpExample/CMakeLists.txt | 1 + examples/ios/audioInputExample/CMakeLists.txt | 1 + .../ios/audioOutputExample/CMakeLists.txt | 1 + examples/ios/dirListExample/CMakeLists.txt | 1 + examples/ios/emptyExample/CMakeLists.txt | 1 + examples/ios/eventsExample/CMakeLists.txt | 1 + examples/ios/fontShapesExample/CMakeLists.txt | 1 + examples/ios/fontsExample/CMakeLists.txt | 1 + examples/ios/graphicsExample/CMakeLists.txt | 1 + examples/ios/iPhoneGuiExample/CMakeLists.txt | 1 + .../ios/imageLoaderExample/CMakeLists.txt | 1 + .../iosCoreMotionCameraExample/CMakeLists.txt | 1 + .../ios/iosCoreMotionExample/CMakeLists.txt | 1 + .../iosCoreMotionLegacyExample/CMakeLists.txt | 1 + .../ios/iosCustomSizeExample/CMakeLists.txt | 1 + .../ios/iosES2ShaderExample/CMakeLists.txt | 1 + .../iosExternalDisplayExample/CMakeLists.txt | 1 + .../ios/iosNativeARCExample/CMakeLists.txt | 1 + examples/ios/iosNativeExample/CMakeLists.txt | 1 + .../ios/iosOrientationExample/CMakeLists.txt | 1 + .../ios/iosStoryboardExample/CMakeLists.txt | 1 + .../ios/moviePlayerExample/CMakeLists.txt | 1 + examples/ios/ofxGuiExample/CMakeLists.txt | 1 + examples/ios/opencvExample/CMakeLists.txt | 1 + examples/ios/opencvFaceExample/CMakeLists.txt | 1 + .../ios/oscReceiverExample/CMakeLists.txt | 1 + examples/ios/oscSenderExample/CMakeLists.txt | 1 + examples/ios/polygonExample/CMakeLists.txt | 1 + .../ios/soundPlayerExample/CMakeLists.txt | 1 + examples/ios/textureExample/CMakeLists.txt | 1 + examples/ios/vboExample/CMakeLists.txt | 1 + .../ios/videoGrabberExample/CMakeLists.txt | 1 + .../ios/xmlSettingsExample/CMakeLists.txt | 1 + 46 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 examples/ios/CMakeLists.txt create mode 100644 examples/ios/CoreHapticsExample/CMakeLists.txt create mode 100644 examples/ios/CoreLocationExample/CMakeLists.txt create mode 100644 examples/ios/GLKit/CMakeLists.txt create mode 100644 examples/ios/GLKitNativeARCExample/CMakeLists.txt create mode 100644 examples/ios/ImagePickerExample/CMakeLists.txt create mode 100644 examples/ios/KeyboardExample/CMakeLists.txt create mode 100644 examples/ios/MapKitExample/CMakeLists.txt create mode 100644 examples/ios/PrimitivesExample/CMakeLists.txt create mode 100644 examples/ios/advancedEventsExample/CMakeLists.txt create mode 100644 examples/ios/advancedGraphicsExample/CMakeLists.txt create mode 100644 examples/ios/assimpExample/CMakeLists.txt create mode 100644 examples/ios/audioInputExample/CMakeLists.txt create mode 100644 examples/ios/audioOutputExample/CMakeLists.txt create mode 100644 examples/ios/dirListExample/CMakeLists.txt create mode 100644 examples/ios/emptyExample/CMakeLists.txt create mode 100644 examples/ios/eventsExample/CMakeLists.txt create mode 100644 examples/ios/fontShapesExample/CMakeLists.txt create mode 100644 examples/ios/fontsExample/CMakeLists.txt create mode 100644 examples/ios/graphicsExample/CMakeLists.txt create mode 100644 examples/ios/iPhoneGuiExample/CMakeLists.txt create mode 100644 examples/ios/imageLoaderExample/CMakeLists.txt create mode 100644 examples/ios/iosCoreMotionCameraExample/CMakeLists.txt create mode 100644 examples/ios/iosCoreMotionExample/CMakeLists.txt create mode 100644 examples/ios/iosCoreMotionLegacyExample/CMakeLists.txt create mode 100644 examples/ios/iosCustomSizeExample/CMakeLists.txt create mode 100644 examples/ios/iosES2ShaderExample/CMakeLists.txt create mode 100644 examples/ios/iosExternalDisplayExample/CMakeLists.txt create mode 100644 examples/ios/iosNativeARCExample/CMakeLists.txt create mode 100644 examples/ios/iosNativeExample/CMakeLists.txt create mode 100644 examples/ios/iosOrientationExample/CMakeLists.txt create mode 100644 examples/ios/iosStoryboardExample/CMakeLists.txt create mode 100644 examples/ios/moviePlayerExample/CMakeLists.txt create mode 100644 examples/ios/ofxGuiExample/CMakeLists.txt create mode 100644 examples/ios/opencvExample/CMakeLists.txt create mode 100644 examples/ios/opencvFaceExample/CMakeLists.txt create mode 100644 examples/ios/oscReceiverExample/CMakeLists.txt create mode 100644 examples/ios/oscSenderExample/CMakeLists.txt create mode 100644 examples/ios/polygonExample/CMakeLists.txt create mode 100644 examples/ios/soundPlayerExample/CMakeLists.txt create mode 100644 examples/ios/textureExample/CMakeLists.txt create mode 100644 examples/ios/vboExample/CMakeLists.txt create mode 100644 examples/ios/videoGrabberExample/CMakeLists.txt create mode 100644 examples/ios/xmlSettingsExample/CMakeLists.txt diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index c82b6ed9ce5..1882b40b5c2 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -37,7 +37,7 @@ endif() # add_subdirectory(ofxGPS) add_subdirectory(ofxGui) -# add_subdirectory(ofxiOS) +# add_subdirectory(ofxiOS) # Not implemented yet, please contribute! add_subdirectory(ofxKinect) add_subdirectory(ofxNetwork) add_subdirectory(ofxOpenCv) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d37bc6ac05e..1f390e73d16 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -39,7 +39,8 @@ endmacro() add_subdirectory(3d) if (OF_TARGET_ARCHITECTURE MATCHES "android") - add_subdirectory(android) + # add_subdirectory(android) + message(WARNING "[openframeworks] Android Examples are not yet implemented. Please implement them yourself, test and submit a PR!") endif() add_subdirectory(communication) @@ -54,7 +55,12 @@ endif() add_subdirectory(graphics) add_subdirectory(gui) add_subdirectory(input_output) -# add_subdirectory(ios) + +if (OF_TARGET_ARCHITECTURE MATCHES "ios") + #add_subdirectory(ios) + message(WARNING "[openframeworks] iOS Examples are not yet implemented. Please implement them yourself, test and submit a PR!") +endif() + # add_subdirectory(math) # add_subdirectory(shader) # add_subdirectory(sound) diff --git a/examples/ios/CMakeLists.txt b/examples/ios/CMakeLists.txt new file mode 100644 index 00000000000..433e8c45274 --- /dev/null +++ b/examples/ios/CMakeLists.txt @@ -0,0 +1,44 @@ + +add_subdirectory(advancedEventsExample) +add_subdirectory(advancedGraphicsExample) +add_subdirectory(assimpExample) +add_subdirectory(audioInputExample) +add_subdirectory(audioOutputExample) +add_subdirectory(CoreHapticsExample) +add_subdirectory(CoreLocationExample) +add_subdirectory(dirListExample) +add_subdirectory(emptyExample) +add_subdirectory(eventsExample) +add_subdirectory(fontsExample) +add_subdirectory(fontShapesExample) +add_subdirectory(GLKit) +add_subdirectory(GLKitNativeARCExample) +add_subdirectory(graphicsExample) +add_subdirectory(imageLoaderExample) +add_subdirectory(ImagePickerExample) +add_subdirectory(iosCoreMotionCameraExample) +add_subdirectory(iosCoreMotionExample) +add_subdirectory(iosCoreMotionLegacyExample) +add_subdirectory(iosCustomSizeExample) +add_subdirectory(iosES2ShaderExample) +add_subdirectory(iosExternalDisplayExample) +add_subdirectory(iosNativeARCExample) +add_subdirectory(iosNativeExample) +add_subdirectory(iosOrientationExample) +add_subdirectory(iosStoryboardExample) +add_subdirectory(iPhoneGuiExample) +add_subdirectory(KeyboardExample) +add_subdirectory(MapKitExample) +add_subdirectory(moviePlayerExample) +add_subdirectory(ofxGuiExample) +add_subdirectory(opencvExample) +add_subdirectory(opencvFaceExample) +add_subdirectory(oscReceiverExample) +add_subdirectory(oscSenderExample) +add_subdirectory(polygonExample) +add_subdirectory(PrimitivesExample) +add_subdirectory(soundPlayerExample) +add_subdirectory(textureExample) +add_subdirectory(vboExample) +add_subdirectory(videoGrabberExample) +add_subdirectory(xmlSettingsExample) diff --git a/examples/ios/CoreHapticsExample/CMakeLists.txt b/examples/ios/CoreHapticsExample/CMakeLists.txt new file mode 100644 index 00000000000..37c83cea47f --- /dev/null +++ b/examples/ios/CoreHapticsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosCoreHapticsExample) \ No newline at end of file diff --git a/examples/ios/CoreLocationExample/CMakeLists.txt b/examples/ios/CoreLocationExample/CMakeLists.txt new file mode 100644 index 00000000000..e2cf2627086 --- /dev/null +++ b/examples/ios/CoreLocationExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosCoreLocationExample) \ No newline at end of file diff --git a/examples/ios/GLKit/CMakeLists.txt b/examples/ios/GLKit/CMakeLists.txt new file mode 100644 index 00000000000..7e96e2e18f3 --- /dev/null +++ b/examples/ios/GLKit/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosGLKit) \ No newline at end of file diff --git a/examples/ios/GLKitNativeARCExample/CMakeLists.txt b/examples/ios/GLKitNativeARCExample/CMakeLists.txt new file mode 100644 index 00000000000..2d22a2c94fc --- /dev/null +++ b/examples/ios/GLKitNativeARCExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosGLKitNativeARCExample) \ No newline at end of file diff --git a/examples/ios/ImagePickerExample/CMakeLists.txt b/examples/ios/ImagePickerExample/CMakeLists.txt new file mode 100644 index 00000000000..50f2c465085 --- /dev/null +++ b/examples/ios/ImagePickerExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosImagePickerExample) \ No newline at end of file diff --git a/examples/ios/KeyboardExample/CMakeLists.txt b/examples/ios/KeyboardExample/CMakeLists.txt new file mode 100644 index 00000000000..bce41724894 --- /dev/null +++ b/examples/ios/KeyboardExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosKeyboardExample) \ No newline at end of file diff --git a/examples/ios/MapKitExample/CMakeLists.txt b/examples/ios/MapKitExample/CMakeLists.txt new file mode 100644 index 00000000000..80a3314bbc4 --- /dev/null +++ b/examples/ios/MapKitExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosMapKitExample) \ No newline at end of file diff --git a/examples/ios/PrimitivesExample/CMakeLists.txt b/examples/ios/PrimitivesExample/CMakeLists.txt new file mode 100644 index 00000000000..938edcb3d6e --- /dev/null +++ b/examples/ios/PrimitivesExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosPrimitivesExample) \ No newline at end of file diff --git a/examples/ios/advancedEventsExample/CMakeLists.txt b/examples/ios/advancedEventsExample/CMakeLists.txt new file mode 100644 index 00000000000..add422f266a --- /dev/null +++ b/examples/ios/advancedEventsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosAdvancedEventsExample) \ No newline at end of file diff --git a/examples/ios/advancedGraphicsExample/CMakeLists.txt b/examples/ios/advancedGraphicsExample/CMakeLists.txt new file mode 100644 index 00000000000..7c45109de6d --- /dev/null +++ b/examples/ios/advancedGraphicsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosAdvancedGraphicsExample) \ No newline at end of file diff --git a/examples/ios/assimpExample/CMakeLists.txt b/examples/ios/assimpExample/CMakeLists.txt new file mode 100644 index 00000000000..7701b5bdcb7 --- /dev/null +++ b/examples/ios/assimpExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosAssimpExample) \ No newline at end of file diff --git a/examples/ios/audioInputExample/CMakeLists.txt b/examples/ios/audioInputExample/CMakeLists.txt new file mode 100644 index 00000000000..4fb23453426 --- /dev/null +++ b/examples/ios/audioInputExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosAudioInputExample) \ No newline at end of file diff --git a/examples/ios/audioOutputExample/CMakeLists.txt b/examples/ios/audioOutputExample/CMakeLists.txt new file mode 100644 index 00000000000..a5ce9567d07 --- /dev/null +++ b/examples/ios/audioOutputExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosAudioOutputExample) \ No newline at end of file diff --git a/examples/ios/dirListExample/CMakeLists.txt b/examples/ios/dirListExample/CMakeLists.txt new file mode 100644 index 00000000000..a986f29673c --- /dev/null +++ b/examples/ios/dirListExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosDirListExample) \ No newline at end of file diff --git a/examples/ios/emptyExample/CMakeLists.txt b/examples/ios/emptyExample/CMakeLists.txt new file mode 100644 index 00000000000..c612f4f929f --- /dev/null +++ b/examples/ios/emptyExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosEmptyExample) \ No newline at end of file diff --git a/examples/ios/eventsExample/CMakeLists.txt b/examples/ios/eventsExample/CMakeLists.txt new file mode 100644 index 00000000000..7a331cf136b --- /dev/null +++ b/examples/ios/eventsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosEventsExample) \ No newline at end of file diff --git a/examples/ios/fontShapesExample/CMakeLists.txt b/examples/ios/fontShapesExample/CMakeLists.txt new file mode 100644 index 00000000000..aa7fa90d3a8 --- /dev/null +++ b/examples/ios/fontShapesExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosFontShapesExample) \ No newline at end of file diff --git a/examples/ios/fontsExample/CMakeLists.txt b/examples/ios/fontsExample/CMakeLists.txt new file mode 100644 index 00000000000..6d5045ce6fd --- /dev/null +++ b/examples/ios/fontsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosFontsExample) \ No newline at end of file diff --git a/examples/ios/graphicsExample/CMakeLists.txt b/examples/ios/graphicsExample/CMakeLists.txt new file mode 100644 index 00000000000..ca28f2394e6 --- /dev/null +++ b/examples/ios/graphicsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosGraphicsExample) \ No newline at end of file diff --git a/examples/ios/iPhoneGuiExample/CMakeLists.txt b/examples/ios/iPhoneGuiExample/CMakeLists.txt new file mode 100644 index 00000000000..980579e1d9b --- /dev/null +++ b/examples/ios/iPhoneGuiExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosIPhoneGuiExample) \ No newline at end of file diff --git a/examples/ios/imageLoaderExample/CMakeLists.txt b/examples/ios/imageLoaderExample/CMakeLists.txt new file mode 100644 index 00000000000..32d8d20a4f4 --- /dev/null +++ b/examples/ios/imageLoaderExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosImageLoaderExample) \ No newline at end of file diff --git a/examples/ios/iosCoreMotionCameraExample/CMakeLists.txt b/examples/ios/iosCoreMotionCameraExample/CMakeLists.txt new file mode 100644 index 00000000000..33140ac29ce --- /dev/null +++ b/examples/ios/iosCoreMotionCameraExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosCoreMotionCameraExample) \ No newline at end of file diff --git a/examples/ios/iosCoreMotionExample/CMakeLists.txt b/examples/ios/iosCoreMotionExample/CMakeLists.txt new file mode 100644 index 00000000000..820b73323f3 --- /dev/null +++ b/examples/ios/iosCoreMotionExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosCoreMotionExample) \ No newline at end of file diff --git a/examples/ios/iosCoreMotionLegacyExample/CMakeLists.txt b/examples/ios/iosCoreMotionLegacyExample/CMakeLists.txt new file mode 100644 index 00000000000..1d5baaccb95 --- /dev/null +++ b/examples/ios/iosCoreMotionLegacyExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosCoreMotionLegacyExample) \ No newline at end of file diff --git a/examples/ios/iosCustomSizeExample/CMakeLists.txt b/examples/ios/iosCustomSizeExample/CMakeLists.txt new file mode 100644 index 00000000000..d871c05c0e3 --- /dev/null +++ b/examples/ios/iosCustomSizeExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosCustomSizeExample) \ No newline at end of file diff --git a/examples/ios/iosES2ShaderExample/CMakeLists.txt b/examples/ios/iosES2ShaderExample/CMakeLists.txt new file mode 100644 index 00000000000..e5064752ad3 --- /dev/null +++ b/examples/ios/iosES2ShaderExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosES2ShaderExample) \ No newline at end of file diff --git a/examples/ios/iosExternalDisplayExample/CMakeLists.txt b/examples/ios/iosExternalDisplayExample/CMakeLists.txt new file mode 100644 index 00000000000..1fded3a38d4 --- /dev/null +++ b/examples/ios/iosExternalDisplayExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosExternalDisplayExample) \ No newline at end of file diff --git a/examples/ios/iosNativeARCExample/CMakeLists.txt b/examples/ios/iosNativeARCExample/CMakeLists.txt new file mode 100644 index 00000000000..948167c7c61 --- /dev/null +++ b/examples/ios/iosNativeARCExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosNativeARCExample) \ No newline at end of file diff --git a/examples/ios/iosNativeExample/CMakeLists.txt b/examples/ios/iosNativeExample/CMakeLists.txt new file mode 100644 index 00000000000..49f1db47561 --- /dev/null +++ b/examples/ios/iosNativeExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosNativeExample) \ No newline at end of file diff --git a/examples/ios/iosOrientationExample/CMakeLists.txt b/examples/ios/iosOrientationExample/CMakeLists.txt new file mode 100644 index 00000000000..2658d8267e6 --- /dev/null +++ b/examples/ios/iosOrientationExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosOrientationExample) \ No newline at end of file diff --git a/examples/ios/iosStoryboardExample/CMakeLists.txt b/examples/ios/iosStoryboardExample/CMakeLists.txt new file mode 100644 index 00000000000..e4b495b5eca --- /dev/null +++ b/examples/ios/iosStoryboardExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosStoryboardExample) \ No newline at end of file diff --git a/examples/ios/moviePlayerExample/CMakeLists.txt b/examples/ios/moviePlayerExample/CMakeLists.txt new file mode 100644 index 00000000000..22b9de443ca --- /dev/null +++ b/examples/ios/moviePlayerExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosMoviePlayerExample) \ No newline at end of file diff --git a/examples/ios/ofxGuiExample/CMakeLists.txt b/examples/ios/ofxGuiExample/CMakeLists.txt new file mode 100644 index 00000000000..bdb061eb0c1 --- /dev/null +++ b/examples/ios/ofxGuiExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosOfxGuiExample) \ No newline at end of file diff --git a/examples/ios/opencvExample/CMakeLists.txt b/examples/ios/opencvExample/CMakeLists.txt new file mode 100644 index 00000000000..6b430b7019c --- /dev/null +++ b/examples/ios/opencvExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosOpenCvExample) \ No newline at end of file diff --git a/examples/ios/opencvFaceExample/CMakeLists.txt b/examples/ios/opencvFaceExample/CMakeLists.txt new file mode 100644 index 00000000000..636e3a7efd5 --- /dev/null +++ b/examples/ios/opencvFaceExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosOpenCvFaceExample) \ No newline at end of file diff --git a/examples/ios/oscReceiverExample/CMakeLists.txt b/examples/ios/oscReceiverExample/CMakeLists.txt new file mode 100644 index 00000000000..dece360a41a --- /dev/null +++ b/examples/ios/oscReceiverExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosOscReceiverExample) \ No newline at end of file diff --git a/examples/ios/oscSenderExample/CMakeLists.txt b/examples/ios/oscSenderExample/CMakeLists.txt new file mode 100644 index 00000000000..f11b729af5c --- /dev/null +++ b/examples/ios/oscSenderExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosOscSenderExample) \ No newline at end of file diff --git a/examples/ios/polygonExample/CMakeLists.txt b/examples/ios/polygonExample/CMakeLists.txt new file mode 100644 index 00000000000..aa9eb925bd4 --- /dev/null +++ b/examples/ios/polygonExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosPolygonExample) \ No newline at end of file diff --git a/examples/ios/soundPlayerExample/CMakeLists.txt b/examples/ios/soundPlayerExample/CMakeLists.txt new file mode 100644 index 00000000000..f856a18d559 --- /dev/null +++ b/examples/ios/soundPlayerExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosSoundPlayerExample) \ No newline at end of file diff --git a/examples/ios/textureExample/CMakeLists.txt b/examples/ios/textureExample/CMakeLists.txt new file mode 100644 index 00000000000..7fc95385020 --- /dev/null +++ b/examples/ios/textureExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosTextureExample) \ No newline at end of file diff --git a/examples/ios/vboExample/CMakeLists.txt b/examples/ios/vboExample/CMakeLists.txt new file mode 100644 index 00000000000..20a67d5e9f8 --- /dev/null +++ b/examples/ios/vboExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosVboExample) \ No newline at end of file diff --git a/examples/ios/videoGrabberExample/CMakeLists.txt b/examples/ios/videoGrabberExample/CMakeLists.txt new file mode 100644 index 00000000000..d1002ff69f5 --- /dev/null +++ b/examples/ios/videoGrabberExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosVideoGrabberExample) \ No newline at end of file diff --git a/examples/ios/xmlSettingsExample/CMakeLists.txt b/examples/ios/xmlSettingsExample/CMakeLists.txt new file mode 100644 index 00000000000..89e70bae4e5 --- /dev/null +++ b/examples/ios/xmlSettingsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(iosXmlSettingsExample) \ No newline at end of file From 1cdbb436a2aa3ff08e1d4e536e423c0990beddc2 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 17:46:25 +0200 Subject: [PATCH 21/49] CMake: Implement math examples --- examples/CMakeLists.txt | 2 +- examples/math/CMakeLists.txt | 9 +++++++++ examples/math/noise1dExample/CMakeLists.txt | 1 + examples/math/noise1dOctaveExample/CMakeLists.txt | 1 + examples/math/noiseField2dExample/CMakeLists.txt | 1 + examples/math/particlesExample/CMakeLists.txt | 1 + examples/math/periodicSignalsExample/CMakeLists.txt | 1 + examples/math/trigonometricMotionExample/CMakeLists.txt | 1 + examples/math/trigonometryExample/CMakeLists.txt | 1 + examples/math/vectorMathExample/CMakeLists.txt | 1 + 10 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 examples/math/CMakeLists.txt create mode 100644 examples/math/noise1dExample/CMakeLists.txt create mode 100644 examples/math/noise1dOctaveExample/CMakeLists.txt create mode 100644 examples/math/noiseField2dExample/CMakeLists.txt create mode 100644 examples/math/particlesExample/CMakeLists.txt create mode 100644 examples/math/periodicSignalsExample/CMakeLists.txt create mode 100644 examples/math/trigonometricMotionExample/CMakeLists.txt create mode 100644 examples/math/trigonometryExample/CMakeLists.txt create mode 100644 examples/math/vectorMathExample/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 1f390e73d16..5434fa29094 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -61,7 +61,7 @@ if (OF_TARGET_ARCHITECTURE MATCHES "ios") message(WARNING "[openframeworks] iOS Examples are not yet implemented. Please implement them yourself, test and submit a PR!") endif() -# add_subdirectory(math) +add_subdirectory(math) # add_subdirectory(shader) # add_subdirectory(sound) # add_subdirectory(strings) diff --git a/examples/math/CMakeLists.txt b/examples/math/CMakeLists.txt new file mode 100644 index 00000000000..d10e14997ae --- /dev/null +++ b/examples/math/CMakeLists.txt @@ -0,0 +1,9 @@ + +add_subdirectory(noise1dExample) +add_subdirectory(noise1dOctaveExample) +add_subdirectory(noiseField2dExample) +add_subdirectory(particlesExample) +add_subdirectory(periodicSignalsExample) +add_subdirectory(trigonometricMotionExample) +add_subdirectory(trigonometryExample) +add_subdirectory(vectorMathExample) diff --git a/examples/math/noise1dExample/CMakeLists.txt b/examples/math/noise1dExample/CMakeLists.txt new file mode 100644 index 00000000000..4825dc52995 --- /dev/null +++ b/examples/math/noise1dExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(noise1dExample) \ No newline at end of file diff --git a/examples/math/noise1dOctaveExample/CMakeLists.txt b/examples/math/noise1dOctaveExample/CMakeLists.txt new file mode 100644 index 00000000000..4ce019bc23c --- /dev/null +++ b/examples/math/noise1dOctaveExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(noise1dOctaveExample) \ No newline at end of file diff --git a/examples/math/noiseField2dExample/CMakeLists.txt b/examples/math/noiseField2dExample/CMakeLists.txt new file mode 100644 index 00000000000..5ae8b298d1a --- /dev/null +++ b/examples/math/noiseField2dExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(noiseField2dExample) \ No newline at end of file diff --git a/examples/math/particlesExample/CMakeLists.txt b/examples/math/particlesExample/CMakeLists.txt new file mode 100644 index 00000000000..edee2fe9001 --- /dev/null +++ b/examples/math/particlesExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(particlesExample) \ No newline at end of file diff --git a/examples/math/periodicSignalsExample/CMakeLists.txt b/examples/math/periodicSignalsExample/CMakeLists.txt new file mode 100644 index 00000000000..96920d01503 --- /dev/null +++ b/examples/math/periodicSignalsExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(periodicSignalsExample) \ No newline at end of file diff --git a/examples/math/trigonometricMotionExample/CMakeLists.txt b/examples/math/trigonometricMotionExample/CMakeLists.txt new file mode 100644 index 00000000000..cb4f46a7207 --- /dev/null +++ b/examples/math/trigonometricMotionExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(trigonometricMotionExample) \ No newline at end of file diff --git a/examples/math/trigonometryExample/CMakeLists.txt b/examples/math/trigonometryExample/CMakeLists.txt new file mode 100644 index 00000000000..93ffbe985e7 --- /dev/null +++ b/examples/math/trigonometryExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(trigonometryExample) \ No newline at end of file diff --git a/examples/math/vectorMathExample/CMakeLists.txt b/examples/math/vectorMathExample/CMakeLists.txt new file mode 100644 index 00000000000..2292684501d --- /dev/null +++ b/examples/math/vectorMathExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(vectorMathExample) \ No newline at end of file From 8bc3b12a63daec63edbe0550af210ad3cb20e0f8 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 18:35:32 +0200 Subject: [PATCH 22/49] CMake: Implement shader examples --- examples/CMakeLists.txt | 2 +- examples/shader/01_simpleColorQuad/CMakeLists.txt | 1 + .../shader/02_simpleVertexDisplacement/CMakeLists.txt | 1 + .../shader/03_simpleShaderInteraction/CMakeLists.txt | 1 + examples/shader/04_simpleTexturing/CMakeLists.txt | 1 + examples/shader/05_alphaMasking/CMakeLists.txt | 1 + examples/shader/06_multiTexture/CMakeLists.txt | 1 + examples/shader/07_fboAlphaMask/CMakeLists.txt | 1 + examples/shader/08_displacementMap/CMakeLists.txt | 1 + examples/shader/09_gaussianBlurFilter/CMakeLists.txt | 1 + examples/shader/CMakeLists.txt | 10 ++++++++++ 11 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 examples/shader/01_simpleColorQuad/CMakeLists.txt create mode 100644 examples/shader/02_simpleVertexDisplacement/CMakeLists.txt create mode 100644 examples/shader/03_simpleShaderInteraction/CMakeLists.txt create mode 100644 examples/shader/04_simpleTexturing/CMakeLists.txt create mode 100644 examples/shader/05_alphaMasking/CMakeLists.txt create mode 100644 examples/shader/06_multiTexture/CMakeLists.txt create mode 100644 examples/shader/07_fboAlphaMask/CMakeLists.txt create mode 100644 examples/shader/08_displacementMap/CMakeLists.txt create mode 100644 examples/shader/09_gaussianBlurFilter/CMakeLists.txt create mode 100644 examples/shader/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5434fa29094..066beb615cc 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -62,7 +62,7 @@ if (OF_TARGET_ARCHITECTURE MATCHES "ios") endif() add_subdirectory(math) -# add_subdirectory(shader) +add_subdirectory(shader) # add_subdirectory(sound) # add_subdirectory(strings) # add_subdirectory(templates) diff --git a/examples/shader/01_simpleColorQuad/CMakeLists.txt b/examples/shader/01_simpleColorQuad/CMakeLists.txt new file mode 100644 index 00000000000..c4785537eb7 --- /dev/null +++ b/examples/shader/01_simpleColorQuad/CMakeLists.txt @@ -0,0 +1 @@ +define_example(01_simpleColorQuad) \ No newline at end of file diff --git a/examples/shader/02_simpleVertexDisplacement/CMakeLists.txt b/examples/shader/02_simpleVertexDisplacement/CMakeLists.txt new file mode 100644 index 00000000000..84dbc72807f --- /dev/null +++ b/examples/shader/02_simpleVertexDisplacement/CMakeLists.txt @@ -0,0 +1 @@ +define_example(02_simpleVertexDisplacement) \ No newline at end of file diff --git a/examples/shader/03_simpleShaderInteraction/CMakeLists.txt b/examples/shader/03_simpleShaderInteraction/CMakeLists.txt new file mode 100644 index 00000000000..8698d88cc94 --- /dev/null +++ b/examples/shader/03_simpleShaderInteraction/CMakeLists.txt @@ -0,0 +1 @@ +define_example(03_simpleShaderInteraction) \ No newline at end of file diff --git a/examples/shader/04_simpleTexturing/CMakeLists.txt b/examples/shader/04_simpleTexturing/CMakeLists.txt new file mode 100644 index 00000000000..27e7b6b28b4 --- /dev/null +++ b/examples/shader/04_simpleTexturing/CMakeLists.txt @@ -0,0 +1 @@ +define_example(04_simpleTexturing) \ No newline at end of file diff --git a/examples/shader/05_alphaMasking/CMakeLists.txt b/examples/shader/05_alphaMasking/CMakeLists.txt new file mode 100644 index 00000000000..67a1ff27b0d --- /dev/null +++ b/examples/shader/05_alphaMasking/CMakeLists.txt @@ -0,0 +1 @@ +define_example(05_alphaMasking) \ No newline at end of file diff --git a/examples/shader/06_multiTexture/CMakeLists.txt b/examples/shader/06_multiTexture/CMakeLists.txt new file mode 100644 index 00000000000..de465584ee0 --- /dev/null +++ b/examples/shader/06_multiTexture/CMakeLists.txt @@ -0,0 +1 @@ +define_example(06_multiTexture) \ No newline at end of file diff --git a/examples/shader/07_fboAlphaMask/CMakeLists.txt b/examples/shader/07_fboAlphaMask/CMakeLists.txt new file mode 100644 index 00000000000..0aed4044a8e --- /dev/null +++ b/examples/shader/07_fboAlphaMask/CMakeLists.txt @@ -0,0 +1 @@ +define_example(07_fboAlphaMask) \ No newline at end of file diff --git a/examples/shader/08_displacementMap/CMakeLists.txt b/examples/shader/08_displacementMap/CMakeLists.txt new file mode 100644 index 00000000000..a3dcbbedb6d --- /dev/null +++ b/examples/shader/08_displacementMap/CMakeLists.txt @@ -0,0 +1 @@ +define_example(08_displacementMap) \ No newline at end of file diff --git a/examples/shader/09_gaussianBlurFilter/CMakeLists.txt b/examples/shader/09_gaussianBlurFilter/CMakeLists.txt new file mode 100644 index 00000000000..31c4ee2d2fd --- /dev/null +++ b/examples/shader/09_gaussianBlurFilter/CMakeLists.txt @@ -0,0 +1 @@ +define_example(09_gaussianBlurFilter) \ No newline at end of file diff --git a/examples/shader/CMakeLists.txt b/examples/shader/CMakeLists.txt new file mode 100644 index 00000000000..8befc669b4c --- /dev/null +++ b/examples/shader/CMakeLists.txt @@ -0,0 +1,10 @@ + +add_subdirectory(01_simpleColorQuad) +add_subdirectory(02_simpleVertexDisplacement) +add_subdirectory(03_simpleShaderInteraction) +add_subdirectory(04_simpleTexturing) +add_subdirectory(05_alphaMasking) +add_subdirectory(06_multiTexture) +add_subdirectory(07_fboAlphaMask) +add_subdirectory(08_displacementMap) +add_subdirectory(09_gaussianBlurFilter) From 48630bee1756adcdc0e21f775398d44b7e4d9d76 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 18:40:56 +0200 Subject: [PATCH 23/49] CMake: Implement sound examples --- examples/CMakeLists.txt | 2 +- examples/sound/CMakeLists.txt | 3 +++ examples/sound/audioInputExample/CMakeLists.txt | 4 +--- examples/sound/audioOutputExample/CMakeLists.txt | 4 +--- examples/sound/soundBufferExample/CMakeLists.txt | 1 + examples/sound/soundPlayerExample/CMakeLists.txt | 1 + examples/sound/soundPlayerFFTExample/CMakeLists.txt | 1 + 7 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 examples/sound/soundBufferExample/CMakeLists.txt create mode 100644 examples/sound/soundPlayerExample/CMakeLists.txt create mode 100644 examples/sound/soundPlayerFFTExample/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 066beb615cc..2030bc299a5 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -63,7 +63,7 @@ endif() add_subdirectory(math) add_subdirectory(shader) -# add_subdirectory(sound) +add_subdirectory(sound) # add_subdirectory(strings) # add_subdirectory(templates) # add_subdirectory(threads) diff --git a/examples/sound/CMakeLists.txt b/examples/sound/CMakeLists.txt index 9b3342be33b..a3c50485f27 100644 --- a/examples/sound/CMakeLists.txt +++ b/examples/sound/CMakeLists.txt @@ -1,3 +1,6 @@ add_subdirectory(audioInputExample) add_subdirectory(audioOutputExample) +add_subdirectory(soundBufferExample) +add_subdirectory(soundPlayerExample) +add_subdirectory(soundPlayerFFTExample) diff --git a/examples/sound/audioInputExample/CMakeLists.txt b/examples/sound/audioInputExample/CMakeLists.txt index eac066628a9..fd5ef2470f5 100644 --- a/examples/sound/audioInputExample/CMakeLists.txt +++ b/examples/sound/audioInputExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(audioInputExample ${SOURCES}) +define_example(audioInputExample) \ No newline at end of file diff --git a/examples/sound/audioOutputExample/CMakeLists.txt b/examples/sound/audioOutputExample/CMakeLists.txt index 21ee0545d2e..c27305a2c5a 100644 --- a/examples/sound/audioOutputExample/CMakeLists.txt +++ b/examples/sound/audioOutputExample/CMakeLists.txt @@ -1,3 +1 @@ - -file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) -define_example(audioOutputExample ${SOURCES}) +define_example(audioOutputExample) \ No newline at end of file diff --git a/examples/sound/soundBufferExample/CMakeLists.txt b/examples/sound/soundBufferExample/CMakeLists.txt new file mode 100644 index 00000000000..60e60159039 --- /dev/null +++ b/examples/sound/soundBufferExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(soundBufferExample) \ No newline at end of file diff --git a/examples/sound/soundPlayerExample/CMakeLists.txt b/examples/sound/soundPlayerExample/CMakeLists.txt new file mode 100644 index 00000000000..b93f5178c49 --- /dev/null +++ b/examples/sound/soundPlayerExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(soundPlayerExample) \ No newline at end of file diff --git a/examples/sound/soundPlayerFFTExample/CMakeLists.txt b/examples/sound/soundPlayerFFTExample/CMakeLists.txt new file mode 100644 index 00000000000..a8f6fbd43cf --- /dev/null +++ b/examples/sound/soundPlayerFFTExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(soundPlayerFFTExample) \ No newline at end of file From d1ad80246fdb2cf4130350311e7e2e980f839958 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 18:44:46 +0200 Subject: [PATCH 24/49] CMake: Implement string examples --- examples/CMakeLists.txt | 2 +- examples/strings/CMakeLists.txt | 5 +++++ examples/strings/conversionExample/CMakeLists.txt | 1 + examples/strings/ofLogExample/CMakeLists.txt | 1 + examples/strings/regularExpressionExample/CMakeLists.txt | 1 + examples/strings/sortingExample/CMakeLists.txt | 1 + 6 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 examples/strings/CMakeLists.txt create mode 100644 examples/strings/conversionExample/CMakeLists.txt create mode 100644 examples/strings/ofLogExample/CMakeLists.txt create mode 100644 examples/strings/regularExpressionExample/CMakeLists.txt create mode 100644 examples/strings/sortingExample/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 2030bc299a5..9ec439a94f6 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -64,7 +64,7 @@ endif() add_subdirectory(math) add_subdirectory(shader) add_subdirectory(sound) -# add_subdirectory(strings) +add_subdirectory(strings) # add_subdirectory(templates) # add_subdirectory(threads) # add_subdirectory(tvOS) diff --git a/examples/strings/CMakeLists.txt b/examples/strings/CMakeLists.txt new file mode 100644 index 00000000000..c4d54863222 --- /dev/null +++ b/examples/strings/CMakeLists.txt @@ -0,0 +1,5 @@ + +add_subdirectory(conversionExample) +add_subdirectory(ofLogExample) +add_subdirectory(regularExpressionExample) +add_subdirectory(sortingExample) diff --git a/examples/strings/conversionExample/CMakeLists.txt b/examples/strings/conversionExample/CMakeLists.txt new file mode 100644 index 00000000000..88184d1c486 --- /dev/null +++ b/examples/strings/conversionExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(conversionExample) \ No newline at end of file diff --git a/examples/strings/ofLogExample/CMakeLists.txt b/examples/strings/ofLogExample/CMakeLists.txt new file mode 100644 index 00000000000..afe55848328 --- /dev/null +++ b/examples/strings/ofLogExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(ofLogExample) \ No newline at end of file diff --git a/examples/strings/regularExpressionExample/CMakeLists.txt b/examples/strings/regularExpressionExample/CMakeLists.txt new file mode 100644 index 00000000000..b9358e033af --- /dev/null +++ b/examples/strings/regularExpressionExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(regularExpressionExample) \ No newline at end of file diff --git a/examples/strings/sortingExample/CMakeLists.txt b/examples/strings/sortingExample/CMakeLists.txt new file mode 100644 index 00000000000..d486969cd2c --- /dev/null +++ b/examples/strings/sortingExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(sortingExample) \ No newline at end of file From 867e937db3920add7c74a5d40561e8a12e645f85 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sun, 16 Apr 2023 19:29:04 +0200 Subject: [PATCH 25/49] CMake: Implement remaining examples --- addons/CMakeLists.txt | 28 ++++++++++--------- addons/ofxGPS/CMakeLists.txt | 25 +++++++++++++++++ addons/ofxPoco/CMakeLists.txt | 2 ++ addons/ofxThreadedImageLoader/CMakeLists.txt | 1 + addons/ofxUnitTests/CMakeLists.txt | 1 + examples/CMakeLists.txt | 27 +++++++++++------- examples/templates/CMakeLists.txt | 3 ++ .../templates/allAddonsExample/CMakeLists.txt | 2 ++ .../templates/emptyExample/CMakeLists.txt | 1 + examples/threads/CMakeLists.txt | 4 +++ .../threadChannelExample/CMakeLists.txt | 1 + examples/threads/threadExample/CMakeLists.txt | 1 + .../threadedImageLoaderExample/CMakeLists.txt | 2 ++ examples/tvOS/CMakeLists.txt | 3 ++ examples/tvOS/emptyExample/CMakeLists.txt | 1 + examples/tvOS/ofBoxExample/CMakeLists.txt | 1 + examples/video/CMakeLists.txt | 5 ++++ .../video/asciiVideoExample/CMakeLists.txt | 1 + .../slitscanRadialClockExample/CMakeLists.txt | 1 + .../video/videoGrabberExample/CMakeLists.txt | 1 + .../video/videoPlayerExample/CMakeLists.txt | 1 + examples/windowing/CMakeLists.txt | 5 ++++ .../multiWindowExample/CMakeLists.txt | 2 ++ .../multiWindowOneAppExample/CMakeLists.txt | 2 ++ .../windowing/noWindowExample/CMakeLists.txt | 1 + .../windowing/windowExample/CMakeLists.txt | 1 + 26 files changed, 100 insertions(+), 23 deletions(-) create mode 100644 addons/ofxGPS/CMakeLists.txt create mode 100644 addons/ofxPoco/CMakeLists.txt create mode 100644 addons/ofxThreadedImageLoader/CMakeLists.txt create mode 100644 addons/ofxUnitTests/CMakeLists.txt create mode 100644 examples/templates/CMakeLists.txt create mode 100644 examples/templates/allAddonsExample/CMakeLists.txt create mode 100644 examples/templates/emptyExample/CMakeLists.txt create mode 100644 examples/threads/CMakeLists.txt create mode 100644 examples/threads/threadChannelExample/CMakeLists.txt create mode 100644 examples/threads/threadExample/CMakeLists.txt create mode 100644 examples/threads/threadedImageLoaderExample/CMakeLists.txt create mode 100644 examples/tvOS/CMakeLists.txt create mode 100644 examples/tvOS/emptyExample/CMakeLists.txt create mode 100644 examples/tvOS/ofBoxExample/CMakeLists.txt create mode 100644 examples/video/CMakeLists.txt create mode 100644 examples/video/asciiVideoExample/CMakeLists.txt create mode 100644 examples/video/slitscanRadialClockExample/CMakeLists.txt create mode 100644 examples/video/videoGrabberExample/CMakeLists.txt create mode 100644 examples/video/videoPlayerExample/CMakeLists.txt create mode 100644 examples/windowing/CMakeLists.txt create mode 100644 examples/windowing/multiWindowExample/CMakeLists.txt create mode 100644 examples/windowing/multiWindowOneAppExample/CMakeLists.txt create mode 100644 examples/windowing/noWindowExample/CMakeLists.txt create mode 100644 examples/windowing/windowExample/CMakeLists.txt diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index 1882b40b5c2..a5c5c86acfa 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -1,18 +1,10 @@ message(STATUS "[openframeworks] Configuring addons") -function(define_addon TARGET_NAME) - file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) - +function(define_raw_addon_without_paths TARGET_NAME) add_library(${TARGET_NAME} STATIC) add_library(of::${TARGET_NAME} ALIAS ${TARGET_NAME}) - - target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) - target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) - target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) target_link_libraries(${TARGET_NAME} of::openframeworks) - source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCES}) - target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17) set_target_properties(${TARGET_NAME} PROPERTIES CXX_EXTENSIONS OFF) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/addons") @@ -23,6 +15,16 @@ function(define_addon TARGET_NAME) ) endfunction() +function(define_addon TARGET_NAME) + define_raw_addon_without_paths(${TARGET_NAME}) + + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) + target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) + target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) + target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCES}) +endfunction() + add_subdirectory(ofxAccelerometer) if (OF_TARGET_ARCHITECTURE MATCHES "android") @@ -35,16 +37,16 @@ if (OF_TARGET_ARCHITECTURE MATCHES "emscripten") add_subdirectory(ofxEmscripten) endif() -# add_subdirectory(ofxGPS) +add_subdirectory(ofxGPS) add_subdirectory(ofxGui) # add_subdirectory(ofxiOS) # Not implemented yet, please contribute! add_subdirectory(ofxKinect) add_subdirectory(ofxNetwork) add_subdirectory(ofxOpenCv) add_subdirectory(ofxOsc) -# add_subdirectory(ofxPoco) +add_subdirectory(ofxPoco) add_subdirectory(ofxSvg) -# add_subdirectory(ofxThreadedImageLoader) -# add_subdirectory(ofxUnitTests) +add_subdirectory(ofxThreadedImageLoader) +add_subdirectory(ofxUnitTests) add_subdirectory(ofxVectorGraphics) add_subdirectory(ofxXmlSettings) \ No newline at end of file diff --git a/addons/ofxGPS/CMakeLists.txt b/addons/ofxGPS/CMakeLists.txt new file mode 100644 index 00000000000..dbfc581aba2 --- /dev/null +++ b/addons/ofxGPS/CMakeLists.txt @@ -0,0 +1,25 @@ + +if (OF_TARGET_ARCHITECTURE MATCHES "android" OR OF_TARGET_ARCHITECTURE MATCHES "ios") + + define_raw_addon_without_paths(ofxGPS) + + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/common/**) + target_sources(ofxGPS PRIVATE ${SOURCES}) + target_include_directories(ofxGPS PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src/common) + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCES}) + + if (OF_TARGET_ARCHITECTURE MATCHES "android") + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/android/**) + target_sources(ofxGPS PRIVATE ${SOURCES}) + target_include_directories(ofxGPS PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src/android) + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCES}) + endif() + + if (OF_TARGET_ARCHITECTURE MATCHES "ios") + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/ios/**) + target_sources(ofxGPS PRIVATE ${SOURCES}) + target_include_directories(ofxGPS PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src/ios) + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCES}) + endif() + +endif() \ No newline at end of file diff --git a/addons/ofxPoco/CMakeLists.txt b/addons/ofxPoco/CMakeLists.txt new file mode 100644 index 00000000000..71f2f42cff9 --- /dev/null +++ b/addons/ofxPoco/CMakeLists.txt @@ -0,0 +1,2 @@ +define_addon(ofxPoco) +target_link_libraries(ofxPoco of::poco) \ No newline at end of file diff --git a/addons/ofxThreadedImageLoader/CMakeLists.txt b/addons/ofxThreadedImageLoader/CMakeLists.txt new file mode 100644 index 00000000000..40bcbb44327 --- /dev/null +++ b/addons/ofxThreadedImageLoader/CMakeLists.txt @@ -0,0 +1 @@ +define_addon(ofxThreadedImageLoader) \ No newline at end of file diff --git a/addons/ofxUnitTests/CMakeLists.txt b/addons/ofxUnitTests/CMakeLists.txt new file mode 100644 index 00000000000..ad9f0631c44 --- /dev/null +++ b/addons/ofxUnitTests/CMakeLists.txt @@ -0,0 +1 @@ +define_addon(ofxUnitTests) \ No newline at end of file diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 9ec439a94f6..5eb6ad911b4 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -28,9 +28,11 @@ macro(define_example TARGET_NAME) # A macro is executed in the caller's sc set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/examples/${example_name}") # And copy the resource files to destination after building - add_custom_command(TARGET ${TARGET_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E - copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") + if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/bin/data") + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") + endif() endmacro() @@ -40,7 +42,7 @@ add_subdirectory(3d) if (OF_TARGET_ARCHITECTURE MATCHES "android") # add_subdirectory(android) - message(WARNING "[openframeworks] Android Examples are not yet implemented. Please implement them yourself, test and submit a PR!") + message(WARNING "[openframeworks] Android Examples are not yet implemented. Feel free to implement them yourself, test and submit a PR!") endif() add_subdirectory(communication) @@ -58,15 +60,20 @@ add_subdirectory(input_output) if (OF_TARGET_ARCHITECTURE MATCHES "ios") #add_subdirectory(ios) - message(WARNING "[openframeworks] iOS Examples are not yet implemented. Please implement them yourself, test and submit a PR!") + message(WARNING "[openframeworks] iOS Examples are not yet implemented. Feel free to implement them yourself, test and submit a PR!") endif() add_subdirectory(math) add_subdirectory(shader) add_subdirectory(sound) add_subdirectory(strings) -# add_subdirectory(templates) -# add_subdirectory(threads) -# add_subdirectory(tvOS) -# add_subdirectory(video) -# add_subdirectory(windowing) +add_subdirectory(templates) +add_subdirectory(threads) + +if (OF_TARGET_ARCHITECTURE MATCHES "tvos") + #add_subdirectory(tvOS) + message(WARNING "[openframeworks] tvOS Examples are not yet implemented. Feel free to implement them yourself, test and submit a PR!") +endif() + +add_subdirectory(video) +add_subdirectory(windowing) diff --git a/examples/templates/CMakeLists.txt b/examples/templates/CMakeLists.txt new file mode 100644 index 00000000000..72ab508f93e --- /dev/null +++ b/examples/templates/CMakeLists.txt @@ -0,0 +1,3 @@ + +add_subdirectory(allAddonsExample) +add_subdirectory(emptyExample) diff --git a/examples/templates/allAddonsExample/CMakeLists.txt b/examples/templates/allAddonsExample/CMakeLists.txt new file mode 100644 index 00000000000..7132a3335b6 --- /dev/null +++ b/examples/templates/allAddonsExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(allAddonsExample) +target_link_libraries(allAddonsExample of::ofxOpenCv of::ofxNetwork of::ofxOsc of::ofxXmlSettings of::ofxAssimpModelLoader of::ofxThreadedImageLoader of::ofxKinect of::ofxGui of::ofxSvg of::ofxPoco) \ No newline at end of file diff --git a/examples/templates/emptyExample/CMakeLists.txt b/examples/templates/emptyExample/CMakeLists.txt new file mode 100644 index 00000000000..c8cf3fbd1db --- /dev/null +++ b/examples/templates/emptyExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(emptyExample) \ No newline at end of file diff --git a/examples/threads/CMakeLists.txt b/examples/threads/CMakeLists.txt new file mode 100644 index 00000000000..9dcda9e33a4 --- /dev/null +++ b/examples/threads/CMakeLists.txt @@ -0,0 +1,4 @@ + +add_subdirectory(threadChannelExample) +add_subdirectory(threadedImageLoaderExample) +add_subdirectory(threadExample) diff --git a/examples/threads/threadChannelExample/CMakeLists.txt b/examples/threads/threadChannelExample/CMakeLists.txt new file mode 100644 index 00000000000..1b4803951a2 --- /dev/null +++ b/examples/threads/threadChannelExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(threadChannelExample) \ No newline at end of file diff --git a/examples/threads/threadExample/CMakeLists.txt b/examples/threads/threadExample/CMakeLists.txt new file mode 100644 index 00000000000..25901651d2e --- /dev/null +++ b/examples/threads/threadExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(threadExample) \ No newline at end of file diff --git a/examples/threads/threadedImageLoaderExample/CMakeLists.txt b/examples/threads/threadedImageLoaderExample/CMakeLists.txt new file mode 100644 index 00000000000..dd54be7d270 --- /dev/null +++ b/examples/threads/threadedImageLoaderExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(threadedImageLoaderExample) +target_link_libraries(threadedImageLoaderExample of::ofxThreadedImageLoader) \ No newline at end of file diff --git a/examples/tvOS/CMakeLists.txt b/examples/tvOS/CMakeLists.txt new file mode 100644 index 00000000000..3cb86a0602e --- /dev/null +++ b/examples/tvOS/CMakeLists.txt @@ -0,0 +1,3 @@ + +add_subdirectory(emptyExample) +add_subdirectory(ofBoxExample) diff --git a/examples/tvOS/emptyExample/CMakeLists.txt b/examples/tvOS/emptyExample/CMakeLists.txt new file mode 100644 index 00000000000..c8cf3fbd1db --- /dev/null +++ b/examples/tvOS/emptyExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(emptyExample) \ No newline at end of file diff --git a/examples/tvOS/ofBoxExample/CMakeLists.txt b/examples/tvOS/ofBoxExample/CMakeLists.txt new file mode 100644 index 00000000000..38e9c0a7541 --- /dev/null +++ b/examples/tvOS/ofBoxExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(ofBoxExample) \ No newline at end of file diff --git a/examples/video/CMakeLists.txt b/examples/video/CMakeLists.txt new file mode 100644 index 00000000000..9d897fb6769 --- /dev/null +++ b/examples/video/CMakeLists.txt @@ -0,0 +1,5 @@ + +add_subdirectory(asciiVideoExample) +add_subdirectory(slitscanRadialClockExample) +add_subdirectory(videoGrabberExample) +add_subdirectory(videoPlayerExample) diff --git a/examples/video/asciiVideoExample/CMakeLists.txt b/examples/video/asciiVideoExample/CMakeLists.txt new file mode 100644 index 00000000000..704fd6df7bb --- /dev/null +++ b/examples/video/asciiVideoExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(asciiVideoExample) \ No newline at end of file diff --git a/examples/video/slitscanRadialClockExample/CMakeLists.txt b/examples/video/slitscanRadialClockExample/CMakeLists.txt new file mode 100644 index 00000000000..649e00cb66c --- /dev/null +++ b/examples/video/slitscanRadialClockExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(slitscanRadialClockExample) \ No newline at end of file diff --git a/examples/video/videoGrabberExample/CMakeLists.txt b/examples/video/videoGrabberExample/CMakeLists.txt new file mode 100644 index 00000000000..46e9944a245 --- /dev/null +++ b/examples/video/videoGrabberExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(videoGrabberExample) \ No newline at end of file diff --git a/examples/video/videoPlayerExample/CMakeLists.txt b/examples/video/videoPlayerExample/CMakeLists.txt new file mode 100644 index 00000000000..399fa132c06 --- /dev/null +++ b/examples/video/videoPlayerExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(videoPlayerExample) \ No newline at end of file diff --git a/examples/windowing/CMakeLists.txt b/examples/windowing/CMakeLists.txt new file mode 100644 index 00000000000..7ac6e015bfb --- /dev/null +++ b/examples/windowing/CMakeLists.txt @@ -0,0 +1,5 @@ + +add_subdirectory(multiWindowExample) +add_subdirectory(multiWindowOneAppExample) +add_subdirectory(noWindowExample) +add_subdirectory(windowExample) diff --git a/examples/windowing/multiWindowExample/CMakeLists.txt b/examples/windowing/multiWindowExample/CMakeLists.txt new file mode 100644 index 00000000000..1b8e3f6145e --- /dev/null +++ b/examples/windowing/multiWindowExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(multiWindowExample) +target_link_libraries(multiWindowExample of::ofxGui) \ No newline at end of file diff --git a/examples/windowing/multiWindowOneAppExample/CMakeLists.txt b/examples/windowing/multiWindowOneAppExample/CMakeLists.txt new file mode 100644 index 00000000000..4113abcce5c --- /dev/null +++ b/examples/windowing/multiWindowOneAppExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(multiWindowOneAppExample) +target_link_libraries(multiWindowOneAppExample of::ofxGui) \ No newline at end of file diff --git a/examples/windowing/noWindowExample/CMakeLists.txt b/examples/windowing/noWindowExample/CMakeLists.txt new file mode 100644 index 00000000000..568cdd7f43f --- /dev/null +++ b/examples/windowing/noWindowExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(noWindowExample) \ No newline at end of file diff --git a/examples/windowing/windowExample/CMakeLists.txt b/examples/windowing/windowExample/CMakeLists.txt new file mode 100644 index 00000000000..7d38bf962a3 --- /dev/null +++ b/examples/windowing/windowExample/CMakeLists.txt @@ -0,0 +1 @@ +define_example(windowExample) \ No newline at end of file From a00e0ac30bb551d7625de684a355a5eb58bc66f8 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 19 Apr 2023 19:44:33 +0200 Subject: [PATCH 26/49] CMake: Implement unit test support --- addons/CMakeLists.txt | 13 ++++- addons/ofxGPS/CMakeLists.txt | 2 +- addons/ofxUnitTests/CMakeLists.txt | 2 +- tests/CMakeLists.txt | 51 ++++++++++++++++++- tests/addons/CMakeLists.txt | 3 ++ tests/addons/networkTcp/CMakeLists.txt | 2 + tests/addons/networkUdp/CMakeLists.txt | 2 + tests/events/CMakeLists.txt | 1 + tests/events/events/CMakeLists.txt | 1 + tests/graphics/CMakeLists.txt | 1 + tests/graphics/pixels/CMakeLists.txt | 1 + tests/io/CMakeLists.txt | 1 + tests/io/loadImage/CMakeLists.txt | 1 + tests/math/CMakeLists.txt | 2 + .../math/ofNodeRegressionTests/CMakeLists.txt | 1 + tests/math/quaternionTests/CMakeLists.txt | 1 + tests/types/CMakeLists.txt | 1 + tests/types/parameters/CMakeLists.txt | 1 + tests/utils/CMakeLists.txt | 5 ++ tests/utils/buffer/CMakeLists.txt | 1 + tests/utils/fileUtils/CMakeLists.txt | 1 + tests/utils/logging/CMakeLists.txt | 1 + tests/utils/strings/CMakeLists.txt | 1 + tests/utils/xml/CMakeLists.txt | 1 + 24 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 tests/addons/CMakeLists.txt create mode 100644 tests/addons/networkTcp/CMakeLists.txt create mode 100644 tests/addons/networkUdp/CMakeLists.txt create mode 100644 tests/events/CMakeLists.txt create mode 100644 tests/events/events/CMakeLists.txt create mode 100644 tests/graphics/CMakeLists.txt create mode 100644 tests/graphics/pixels/CMakeLists.txt create mode 100644 tests/io/CMakeLists.txt create mode 100644 tests/io/loadImage/CMakeLists.txt create mode 100644 tests/math/CMakeLists.txt create mode 100644 tests/math/ofNodeRegressionTests/CMakeLists.txt create mode 100644 tests/math/quaternionTests/CMakeLists.txt create mode 100644 tests/types/CMakeLists.txt create mode 100644 tests/types/parameters/CMakeLists.txt create mode 100644 tests/utils/CMakeLists.txt create mode 100644 tests/utils/buffer/CMakeLists.txt create mode 100644 tests/utils/fileUtils/CMakeLists.txt create mode 100644 tests/utils/logging/CMakeLists.txt create mode 100644 tests/utils/strings/CMakeLists.txt create mode 100644 tests/utils/xml/CMakeLists.txt diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index a5c5c86acfa..f30b20d6fcd 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -1,6 +1,15 @@ message(STATUS "[openframeworks] Configuring addons") -function(define_raw_addon_without_paths TARGET_NAME) +function(define_interface_addon TARGET_NAME) + add_library(${TARGET_NAME} INTERFACE) + add_library(of::${TARGET_NAME} ALIAS ${TARGET_NAME}) + target_link_libraries(${TARGET_NAME} INTERFACE of::openframeworks) + + target_include_directories(${TARGET_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include) + target_include_directories(${TARGET_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR}/src) +endfunction() + +function(define_addon_without_paths TARGET_NAME) add_library(${TARGET_NAME} STATIC) add_library(of::${TARGET_NAME} ALIAS ${TARGET_NAME}) target_link_libraries(${TARGET_NAME} of::openframeworks) @@ -16,7 +25,7 @@ function(define_raw_addon_without_paths TARGET_NAME) endfunction() function(define_addon TARGET_NAME) - define_raw_addon_without_paths(${TARGET_NAME}) + define_addon_without_paths(${TARGET_NAME}) file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/**) target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) diff --git a/addons/ofxGPS/CMakeLists.txt b/addons/ofxGPS/CMakeLists.txt index dbfc581aba2..b47fc5942dd 100644 --- a/addons/ofxGPS/CMakeLists.txt +++ b/addons/ofxGPS/CMakeLists.txt @@ -1,7 +1,7 @@ if (OF_TARGET_ARCHITECTURE MATCHES "android" OR OF_TARGET_ARCHITECTURE MATCHES "ios") - define_raw_addon_without_paths(ofxGPS) + define_addon_without_paths(ofxGPS) file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/common/**) target_sources(ofxGPS PRIVATE ${SOURCES}) diff --git a/addons/ofxUnitTests/CMakeLists.txt b/addons/ofxUnitTests/CMakeLists.txt index ad9f0631c44..cfa455074f4 100644 --- a/addons/ofxUnitTests/CMakeLists.txt +++ b/addons/ofxUnitTests/CMakeLists.txt @@ -1 +1 @@ -define_addon(ofxUnitTests) \ No newline at end of file +define_interface_addon(ofxUnitTests) \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3fb883965c2..95c0be80846 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,2 +1,51 @@ message(STATUS "[openframeworks] Configuring tests") -message("TODO: Implement tests in CMake") \ No newline at end of file + +# Macro for defining a test with all of its properties +function(define_test TARGET_NAME) # A CMake function like this is executed in the caller's scope + set(BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>") + + file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) + + add_executable(${TARGET_NAME}) + target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) + target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) + target_link_libraries(${TARGET_NAME} of::openframeworks of::ofxUnitTests) + + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCES}) + + target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17) + 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}") + + get_filename_component(parent_path ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) + get_filename_component(test_name ${parent_path} NAME) + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "openframeworks/tests/${test_name}") + + # And copy the resource files to destination after building + if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/bin/data") + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") + endif() + + # Add this test to the custom target that runs all tests + add_custom_target(run_${TARGET_NAME} DEPENDS ${TARGET_NAME}) + add_custom_command(TARGET run_${TARGET_NAME} POST_BUILD COMMAND ${BIN_DIR}/${TARGET_NAME} WORKING_DIRECTORY ${BIN_DIR} COMMENT "Running test '${TARGET_NAME}'") + add_dependencies(run_all_tests run_${TARGET_NAME}) + set_target_properties(run_${TARGET_NAME} PROPERTIES FOLDER "openframeworks/tests/${test_name}") + +endfunction() + +add_custom_target(run_all_tests) +set_target_properties(run_all_tests PROPERTIES FOLDER "openframeworks/tests") + +# Folders with tests to build +add_subdirectory(addons) +add_subdirectory(events) +add_subdirectory(graphics) +add_subdirectory(io) +add_subdirectory(math) +add_subdirectory(types) +add_subdirectory(utils) diff --git a/tests/addons/CMakeLists.txt b/tests/addons/CMakeLists.txt new file mode 100644 index 00000000000..0a126316d4e --- /dev/null +++ b/tests/addons/CMakeLists.txt @@ -0,0 +1,3 @@ + +add_subdirectory(networkTcp) +add_subdirectory(networkUdp) diff --git a/tests/addons/networkTcp/CMakeLists.txt b/tests/addons/networkTcp/CMakeLists.txt new file mode 100644 index 00000000000..2d67f44e80f --- /dev/null +++ b/tests/addons/networkTcp/CMakeLists.txt @@ -0,0 +1,2 @@ +define_test(test_networkTcp) +target_link_libraries(test_networkTcp of::ofxNetwork) \ No newline at end of file diff --git a/tests/addons/networkUdp/CMakeLists.txt b/tests/addons/networkUdp/CMakeLists.txt new file mode 100644 index 00000000000..bda081d94b4 --- /dev/null +++ b/tests/addons/networkUdp/CMakeLists.txt @@ -0,0 +1,2 @@ +define_test(test_networkUdp) +target_link_libraries(test_networkUdp of::ofxNetwork) \ No newline at end of file diff --git a/tests/events/CMakeLists.txt b/tests/events/CMakeLists.txt new file mode 100644 index 00000000000..1e044e412dc --- /dev/null +++ b/tests/events/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(events) \ No newline at end of file diff --git a/tests/events/events/CMakeLists.txt b/tests/events/events/CMakeLists.txt new file mode 100644 index 00000000000..ad58b19fc56 --- /dev/null +++ b/tests/events/events/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_events) \ No newline at end of file diff --git a/tests/graphics/CMakeLists.txt b/tests/graphics/CMakeLists.txt new file mode 100644 index 00000000000..f65bd762e66 --- /dev/null +++ b/tests/graphics/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(pixels) \ No newline at end of file diff --git a/tests/graphics/pixels/CMakeLists.txt b/tests/graphics/pixels/CMakeLists.txt new file mode 100644 index 00000000000..f0648bfd7df --- /dev/null +++ b/tests/graphics/pixels/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_pixels) \ No newline at end of file diff --git a/tests/io/CMakeLists.txt b/tests/io/CMakeLists.txt new file mode 100644 index 00000000000..0e6f44edbd5 --- /dev/null +++ b/tests/io/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(loadImage) \ No newline at end of file diff --git a/tests/io/loadImage/CMakeLists.txt b/tests/io/loadImage/CMakeLists.txt new file mode 100644 index 00000000000..6f64de8c9b8 --- /dev/null +++ b/tests/io/loadImage/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_loadImage) \ No newline at end of file diff --git a/tests/math/CMakeLists.txt b/tests/math/CMakeLists.txt new file mode 100644 index 00000000000..05cc8a4630f --- /dev/null +++ b/tests/math/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(ofNodeRegressionTests) +add_subdirectory(quaternionTests) \ No newline at end of file diff --git a/tests/math/ofNodeRegressionTests/CMakeLists.txt b/tests/math/ofNodeRegressionTests/CMakeLists.txt new file mode 100644 index 00000000000..b7c25b73f9f --- /dev/null +++ b/tests/math/ofNodeRegressionTests/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_ofNodeRegressionTests) \ No newline at end of file diff --git a/tests/math/quaternionTests/CMakeLists.txt b/tests/math/quaternionTests/CMakeLists.txt new file mode 100644 index 00000000000..43e8e876997 --- /dev/null +++ b/tests/math/quaternionTests/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_quaternionTests) \ No newline at end of file diff --git a/tests/types/CMakeLists.txt b/tests/types/CMakeLists.txt new file mode 100644 index 00000000000..aaefc4c6eb8 --- /dev/null +++ b/tests/types/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(parameters) \ No newline at end of file diff --git a/tests/types/parameters/CMakeLists.txt b/tests/types/parameters/CMakeLists.txt new file mode 100644 index 00000000000..f81326cbb6d --- /dev/null +++ b/tests/types/parameters/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_parameters) \ No newline at end of file diff --git a/tests/utils/CMakeLists.txt b/tests/utils/CMakeLists.txt new file mode 100644 index 00000000000..bf3a1584e29 --- /dev/null +++ b/tests/utils/CMakeLists.txt @@ -0,0 +1,5 @@ +add_subdirectory(buffer) +add_subdirectory(fileUtils) +add_subdirectory(logging) +add_subdirectory(strings) +add_subdirectory(xml) \ No newline at end of file diff --git a/tests/utils/buffer/CMakeLists.txt b/tests/utils/buffer/CMakeLists.txt new file mode 100644 index 00000000000..b3cb5eabb78 --- /dev/null +++ b/tests/utils/buffer/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_buffer) \ No newline at end of file diff --git a/tests/utils/fileUtils/CMakeLists.txt b/tests/utils/fileUtils/CMakeLists.txt new file mode 100644 index 00000000000..380d50bf143 --- /dev/null +++ b/tests/utils/fileUtils/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_fileUtils) \ No newline at end of file diff --git a/tests/utils/logging/CMakeLists.txt b/tests/utils/logging/CMakeLists.txt new file mode 100644 index 00000000000..d37c2a28dc0 --- /dev/null +++ b/tests/utils/logging/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_logging) \ No newline at end of file diff --git a/tests/utils/strings/CMakeLists.txt b/tests/utils/strings/CMakeLists.txt new file mode 100644 index 00000000000..028d4e879c6 --- /dev/null +++ b/tests/utils/strings/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_strings) \ No newline at end of file diff --git a/tests/utils/xml/CMakeLists.txt b/tests/utils/xml/CMakeLists.txt new file mode 100644 index 00000000000..7f4ed6fa5b9 --- /dev/null +++ b/tests/utils/xml/CMakeLists.txt @@ -0,0 +1 @@ +define_test(test_xml) \ No newline at end of file From 57694d098a3afd3250bf4a330cfaf71b4f15c7e4 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 19 Apr 2023 21:13:20 +0200 Subject: [PATCH 27/49] CMake: Fix dependencies on linux platforms --- cmake/find_linux_deps.cmake | 11 +++ cmake/modules/Findlibusb-1.0.cmake | 98 +++++++++++++++++++ .../video/ofMediaFoundationPlayer.cpp | 4 + 3 files changed, 113 insertions(+) create mode 100644 cmake/modules/Findlibusb-1.0.cmake diff --git a/cmake/find_linux_deps.cmake b/cmake/find_linux_deps.cmake index 8e73181aee1..96a1ebe5a7f 100644 --- a/cmake/find_linux_deps.cmake +++ b/cmake/find_linux_deps.cmake @@ -68,6 +68,7 @@ function(find_linux_deps) add_library(of::pugixml ALIAS of-deps-pugixml) target_link_libraries(of-deps-pugixml INTERFACE pugixml::pugixml) + set(URIPARSER_FIND_QUIETLY ON) find_package(uriparser) if (NOT URIPARSER_FOUND) message(SEND_ERROR "Dependency uriparser not found. Please install it using your system's equivalent of 'sudo apt install liburiparser-dev'") @@ -183,4 +184,14 @@ function(find_linux_deps) target_include_directories(of-deps-udev INTERFACE ${UDEV_INCLUDE_DIRS}) target_link_libraries(of-deps-udev INTERFACE ${UDEV_LIBRARIES}) + find_package(libusb-1.0) + if (NOT LIBUSB_1_FOUND) + message(SEND_ERROR "Dependency libusb-1.0 not found. Please install it using your system's equivalent of 'sudo apt install libusb-1.0-0-dev'") + endif() + add_library(of-deps-libusb INTERFACE) + add_library(of::libusb ALIAS of-deps-libusb) + target_include_directories(of-deps-libusb INTERFACE ${LIBUSB_1_INCLUDE_DIRS}) + target_link_libraries(of-deps-libusb INTERFACE ${LIBUSB_1_LIBRARIES}) + target_compile_definitions(of-deps-libusb INTERFACE ${LIBUSB_1_DEFINITIONS}) + endfunction() \ No newline at end of file diff --git a/cmake/modules/Findlibusb-1.0.cmake b/cmake/modules/Findlibusb-1.0.cmake new file mode 100644 index 00000000000..bc63763ec65 --- /dev/null +++ b/cmake/modules/Findlibusb-1.0.cmake @@ -0,0 +1,98 @@ +# - Try to find libusb-1.0 +# Once done this will define +# +# LIBUSB_1_FOUND - system has libusb +# LIBUSB_1_INCLUDE_DIRS - the libusb include directory +# LIBUSB_1_LIBRARIES - Link these to use libusb +# LIBUSB_1_DEFINITIONS - Compiler switches required for using libusb +# +# Adapted from cmake-modules Google Code project +# +# Copyright (c) 2006 Andreas Schneider +# +# (Changes for libusb) Copyright (c) 2008 Kyle Machulis +# +# Redistribution and use is allowed according to the terms of the New BSD license. +# +# CMake-Modules Project New BSD License +# +# 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. +# +# * Neither the name of the CMake-Modules Project 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 OWNER 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. +# + + +if (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) + # in cache already + set(LIBUSB_FOUND TRUE) +else (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) + find_path(LIBUSB_1_INCLUDE_DIR + NAMES + libusb.h + PATHS + /usr/include + /usr/local/include + /opt/local/include + /sw/include + PATH_SUFFIXES + libusb-1.0 + ) + + find_library(LIBUSB_1_LIBRARY + NAMES + usb-1.0 usb + PATHS + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ) + + set(LIBUSB_1_INCLUDE_DIRS + ${LIBUSB_1_INCLUDE_DIR} + ) + set(LIBUSB_1_LIBRARIES + ${LIBUSB_1_LIBRARY} +) + + if (LIBUSB_1_INCLUDE_DIRS AND LIBUSB_1_LIBRARIES) + set(LIBUSB_1_FOUND TRUE) + endif (LIBUSB_1_INCLUDE_DIRS AND LIBUSB_1_LIBRARIES) + + if (LIBUSB_1_FOUND) + if (NOT libusb_1_FIND_QUIETLY) + message(STATUS "Found libusb-1.0:") + message(STATUS " - Includes: ${LIBUSB_1_INCLUDE_DIRS}") + message(STATUS " - Libraries: ${LIBUSB_1_LIBRARIES}") + endif (NOT libusb_1_FIND_QUIETLY) + else (LIBUSB_1_FOUND) + if (libusb_1_FIND_REQUIRED) + message(FATAL_ERROR "Could not find libusb") + endif (libusb_1_FIND_REQUIRED) + endif (LIBUSB_1_FOUND) + + # show the LIBUSB_1_INCLUDE_DIRS and LIBUSB_1_LIBRARIES variables only in the advanced view + mark_as_advanced(LIBUSB_1_INCLUDE_DIRS LIBUSB_1_LIBRARIES) + +endif (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) \ No newline at end of file diff --git a/libs/openFrameworks/video/ofMediaFoundationPlayer.cpp b/libs/openFrameworks/video/ofMediaFoundationPlayer.cpp index b94f1267c2a..8d628c792fc 100644 --- a/libs/openFrameworks/video/ofMediaFoundationPlayer.cpp +++ b/libs/openFrameworks/video/ofMediaFoundationPlayer.cpp @@ -1,4 +1,7 @@ +#include "ofVideoPlayer.h" +#ifdef OF_VIDEO_PLAYER_MEDIA_FOUNDATION + #include "ofPixels.h" #include "ofMediaFoundationPlayer.h" #include "ofLog.h" @@ -1488,3 +1491,4 @@ void ofMediaFoundationPlayer::updateDuration() { } } +#endif // ifdef OF_VIDEO_PLAYER_MEDIA_FOUNDATION From 7f9408adc8b14bd7f76eb1a19dcfcf12ea4c4acf Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Thu, 20 Apr 2023 01:06:33 +0200 Subject: [PATCH 28/49] CMake: Remove examples and tests from ALL --- examples/CMakeLists.txt | 2 +- tests/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5eb6ad911b4..cdc2a05c989 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -10,7 +10,7 @@ macro(define_example TARGET_NAME) # A macro is executed in the caller's sc file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) endif() - add_executable(${TARGET_NAME}) + add_executable(${TARGET_NAME} EXCLUDE_FROM_ALL) target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) target_link_libraries(${TARGET_NAME} of::openframeworks) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 95c0be80846..46e247680ef 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,7 +6,7 @@ function(define_test TARGET_NAME) # A CMake function li file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) - add_executable(${TARGET_NAME}) + add_executable(${TARGET_NAME} EXCLUDE_FROM_ALL) target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) target_link_libraries(${TARGET_NAME} of::openframeworks of::ofxUnitTests) From 7118c7136d77a7ba76aba6b58e68623f5872d62d Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Thu, 20 Apr 2023 01:17:12 +0200 Subject: [PATCH 29/49] CMake: Add all_examples target --- examples/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cdc2a05c989..5b110b63b5f 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,5 +1,8 @@ message(STATUS "[openframeworks] Configuring examples") +add_custom_target(all_examples) +set_target_properties(all_examples PROPERTIES FOLDER "openframeworks/examples") + # Macro for defining an example with all of its properties macro(define_example TARGET_NAME) # A macro is executed in the caller's scope (current list is the caller) set(BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>") @@ -33,6 +36,8 @@ macro(define_example TARGET_NAME) # A macro is executed in the caller's sc COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") endif() + + add_dependencies(all_examples ${TARGET_NAME}) endmacro() From 535d18a2c77a981f8618474fe4d4561e912c5df2 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Thu, 20 Apr 2023 01:40:51 +0200 Subject: [PATCH 30/49] CMake: Remove addons from ALL --- addons/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt index f30b20d6fcd..e7c050dd87c 100644 --- a/addons/CMakeLists.txt +++ b/addons/CMakeLists.txt @@ -10,7 +10,7 @@ function(define_interface_addon TARGET_NAME) endfunction() function(define_addon_without_paths TARGET_NAME) - add_library(${TARGET_NAME} STATIC) + add_library(${TARGET_NAME} STATIC EXCLUDE_FROM_ALL) add_library(of::${TARGET_NAME} ALIAS ${TARGET_NAME}) target_link_libraries(${TARGET_NAME} of::openframeworks) From f765ee3a16834d7a3620b851085421748f018037 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 10:08:48 +0200 Subject: [PATCH 31/49] CMake: Implement all_examples and tests on Linux --- cmake/download_and_link_deps.cmake | 5 +++++ cmake/find_linux_deps.cmake | 11 ++++++++++- cmake/import_deps.cmake | 6 +++--- examples/CMakeLists.txt | 7 +++---- tests/CMakeLists.txt | 5 +++++ 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index 3fbd8521ed2..870b398e6a0 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -85,6 +85,11 @@ function(get_packages_and_link) file(GLOB deps "${PACKAGE_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} ${PACKAGE_SOURCE_DIR}) endforeach() diff --git a/cmake/find_linux_deps.cmake b/cmake/find_linux_deps.cmake index 96a1ebe5a7f..58de65dcf62 100644 --- a/cmake/find_linux_deps.cmake +++ b/cmake/find_linux_deps.cmake @@ -194,4 +194,13 @@ function(find_linux_deps) target_link_libraries(of-deps-libusb INTERFACE ${LIBUSB_1_LIBRARIES}) target_compile_definitions(of-deps-libusb INTERFACE ${LIBUSB_1_DEFINITIONS}) -endfunction() \ No newline at end of file + find_package(Poco COMPONENTS Data Foundation Net NetSSL Util XML) + if (NOT Poco_FOUND) + message(SEND_ERROR "Dependency Poco or any of its modules not found. Please install them using your system's equivalent of 'sudo apt install libpoco-dev'") + endif() + add_library(of-deps-poco INTERFACE) + add_library(of::poco ALIAS of-deps-poco) + target_include_directories(of-deps-poco INTERFACE ${Poco_INCLUDE_DIRS}) + target_link_libraries(of-deps-poco INTERFACE ${Poco_LIBRARIES}) + +endfunction() diff --git a/cmake/import_deps.cmake b/cmake/import_deps.cmake index 33c6f913a20..c4be0cc2b27 100644 --- a/cmake/import_deps.cmake +++ b/cmake/import_deps.cmake @@ -1,5 +1,5 @@ -function(add_libraries_to_dependency LIB_DIR_NAME LIB_NAME DEP_NAME) +function(add_libraries_to_dependency LIB_DIR_NAME LIB_NAME DEP_NAME LIB_PATH) set(CONFIG "ALL") if (LIB_DIR_NAME STREQUAL "Debug") @@ -60,7 +60,7 @@ function(import_dependency DEP_NAME DEP_ROOT PACKAGE_SOURCE_DIR) get_filename_component(LIB_NAME ${LIB_PATH} NAME) get_filename_component(LIB_EXTENSION ${LIB_PATH} LAST_EXT) - add_libraries_to_dependency(${LIB_DIR_NAME} ${LIB_NAME} ${DEP_NAME}) + add_libraries_to_dependency(${LIB_DIR_NAME} ${LIB_NAME} ${DEP_NAME} ${LIB_PATH}) endforeach() @@ -76,4 +76,4 @@ function(import_dependency DEP_NAME DEP_ROOT PACKAGE_SOURCE_DIR) target_include_directories(of-deps-${DEP_NAME} INTERFACE ${DEP_ROOT}/include) endif() -endfunction() \ No newline at end of file +endfunction() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5b110b63b5f..bad59c64f61 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,7 @@ message(STATUS "[openframeworks] Configuring examples") -add_custom_target(all_examples) -set_target_properties(all_examples PROPERTIES FOLDER "openframeworks/examples") +add_custom_target(build_all_examples) +set_target_properties(build_all_examples PROPERTIES FOLDER "openframeworks/examples") # Macro for defining an example with all of its properties macro(define_example TARGET_NAME) # A macro is executed in the caller's scope (current list is the caller) @@ -37,11 +37,10 @@ macro(define_example TARGET_NAME) # A macro is executed in the caller's sc copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") endif() - add_dependencies(all_examples ${TARGET_NAME}) + add_dependencies(build_all_examples ${TARGET_NAME}) endmacro() - # Folders with examples to build add_subdirectory(3d) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 46e247680ef..54459332e4a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -30,6 +30,8 @@ function(define_test TARGET_NAME) # A CMake function li copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") endif() + add_dependencies(build_all_tests ${TARGET_NAME}) + # Add this test to the custom target that runs all tests add_custom_target(run_${TARGET_NAME} DEPENDS ${TARGET_NAME}) add_custom_command(TARGET run_${TARGET_NAME} POST_BUILD COMMAND ${BIN_DIR}/${TARGET_NAME} WORKING_DIRECTORY ${BIN_DIR} COMMENT "Running test '${TARGET_NAME}'") @@ -38,6 +40,9 @@ function(define_test TARGET_NAME) # A CMake function li endfunction() +add_custom_target(build_all_tests) +set_target_properties(build_all_tests PROPERTIES FOLDER "openframeworks/tests") + add_custom_target(run_all_tests) set_target_properties(run_all_tests PROPERTIES FOLDER "openframeworks/tests") From fcb8d124741dbacbff20192791a6d9c2044ea524 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 13:28:15 +0200 Subject: [PATCH 32/49] gitignore: Ignore CLion cmake folders --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5dcc99756d9..bdf85ed271e 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ apps/* [Bb]uild/ [Oo]bj/ +cmake-build-*/ *.o examples/**/[Dd]ebug*/ examples/**/[Rr]elease*/ From 8ba6d40c4f63799b9fd8120364621e2af167bc25 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 13:38:50 +0200 Subject: [PATCH 33/49] CMake: Switch to using CTest for unit tests --- CMAKE.md | 51 ++++++++++++++++++++++++++---- CMakeLists.txt | 11 ++++--- cmake/download_and_link_deps.cmake | 4 +-- tests/CMakeLists.txt | 16 ++-------- 4 files changed, 55 insertions(+), 27 deletions(-) diff --git a/CMAKE.md b/CMAKE.md index 455e95355af..874f44c81fe 100644 --- a/CMAKE.md +++ b/CMAKE.md @@ -1,12 +1,6 @@ # CMake Support -## Introduction - -CMake is a Meta- build system. You no longer have to deal with strange compiler flags or huge unreadable Makefiles, instead you describe the project layout logically. Then, when executing, it sets everything up so that the compilation will work without errors. - -The best part of this is that is is 100% cross platform: The same CMake script can generate project files for more than 40 different build systems on any operating system, including Visual Studio, GCC Makefiles, Ninja Makefiles, Code::Blocks, and many more. - ## Building with CMake To build the library itself for testing the examples: @@ -50,3 +44,48 @@ This is it! OpenFrameworks and all examples have been built! deb http://deb.debian.org/debian bullseye-backports main sudo apt install cmake -t bullseye-backports ``` + +## Visual Studio + +The following instructions are for building openFrameworks itself, in the root directory of the repository. Make sure to download a nightly build as soon as CMake support is available, as the main repository takes tremendously longer to download. + +### Building in IDE + +Open the generated `openFrameworks.sln` in your build folder with Visual Studio. Then, just build it like any other VS project. Right-click a project and click on `Set as Startup Project` to be able to run it with F5. + +### Building in the terminal + +You can also build Visual Studio projects without actually opening Visual Studio, by the use of MSBuild. CMake does all of that for you. + +Note that configurations in Visual Studio work a bit different compared to makefiles, as VS is a multi-configuration build tool, makefiles are not. + +#### Build all examples +```bash +# in root directory of openFrameworks +mkdir build && cd build +cmake .. +cmake --build . --target=build_all_examples --config=Release # Or 'Debug' +``` + +#### Build specific example + +Replace `ofNodeExample` with the project name of the example. + +```bash +# in root directory of openFrameworks +mkdir build && cd build +cmake .. +cmake --build . --target=ofNodeExample --config=Release # Or 'Debug' +``` + +#### Run tests + +```bash +# in root directory of openFrameworks +mkdir build && cd build +cmake .. +cmake --build . --config=Release # Or 'Debug' +ctest -C Release # Or 'Debug' +``` + +In the VS IDE, building RUN_TESTS (in CMakePredefinedTargets folder) does the same thing. diff --git a/CMakeLists.txt b/CMakeLists.txt index bc79b8339e6..6693fbccea7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,6 @@ cmake_minimum_required(VERSION 3.16) project(openframeworks) - include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -43,10 +42,11 @@ target_compile_definitions(openframeworks PUBLIC # Compiler flags specific to MSVC 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 - # Ignore linker warning that no .pdb file is available for debugging - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ignore:4099 /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRT") + 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) endif() # Where compiled binaries should be placed @@ -62,5 +62,6 @@ if (BUILD_EXAMPLES) endif() if (BUILD_TESTS) + enable_testing() add_subdirectory(tests) endif() diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index 870b398e6a0..062e1316e03 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -77,7 +77,7 @@ function(get_packages_and_link) 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 the build folder and re-run cmake.") + message(STATUS "[openframeworks] Skipping check of ${dependency} to save build time. To force a re-download, delete CMakeCache.txt and re-run cmake.") endif() # Now, create the targets and link all files to them @@ -181,7 +181,7 @@ if (WIN32) 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 the build folder and re-run cmake.") + 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) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 54459332e4a..ac8057d82af 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,7 +6,7 @@ function(define_test TARGET_NAME) # A CMake function li file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/**) - add_executable(${TARGET_NAME} EXCLUDE_FROM_ALL) + add_executable(${TARGET_NAME}) target_sources(${TARGET_NAME} PRIVATE ${SOURCES}) target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/src) target_link_libraries(${TARGET_NAME} of::openframeworks of::ofxUnitTests) @@ -30,22 +30,10 @@ function(define_test TARGET_NAME) # A CMake function li copy_directory "${CMAKE_CURRENT_LIST_DIR}/bin/data" "${BIN_DIR}/data") endif() - add_dependencies(build_all_tests ${TARGET_NAME}) - - # Add this test to the custom target that runs all tests - add_custom_target(run_${TARGET_NAME} DEPENDS ${TARGET_NAME}) - add_custom_command(TARGET run_${TARGET_NAME} POST_BUILD COMMAND ${BIN_DIR}/${TARGET_NAME} WORKING_DIRECTORY ${BIN_DIR} COMMENT "Running test '${TARGET_NAME}'") - add_dependencies(run_all_tests run_${TARGET_NAME}) - set_target_properties(run_${TARGET_NAME} PROPERTIES FOLDER "openframeworks/tests/${test_name}") + add_test(NAME of_${TARGET_NAME} COMMAND ${BIN_DIR}/${TARGET_NAME} WORKING_DIRECTORY ${BIN_DIR}) endfunction() -add_custom_target(build_all_tests) -set_target_properties(build_all_tests PROPERTIES FOLDER "openframeworks/tests") - -add_custom_target(run_all_tests) -set_target_properties(run_all_tests PROPERTIES FOLDER "openframeworks/tests") - # Folders with tests to build add_subdirectory(addons) add_subdirectory(events) From 68e2e38861bd592c833be6c7e451072f437fdc49 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 14:00:06 +0200 Subject: [PATCH 34/49] Fix import in ofAVFoundationVideoPlayer to build like before --- libs/openFrameworks/video/ofAVFoundationVideoPlayer.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m b/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m index c504124a648..7a10543886a 100644 --- a/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m +++ b/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m @@ -4,7 +4,7 @@ // Merged with code by Sam Kronick, James George and Elie Zananiri. // -#include "ofConstants.h" +#import "ofConstants.h" #ifdef OF_VIDEO_PLAYER_AVFOUNDATION From 806356dce55002307a59d0737cc734146657c283 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 14:15:22 +0200 Subject: [PATCH 35/49] Rename ofAVFoundationVideoPlayer to .mm for consistency and to allow including C++ headers --- ...undationVideoPlayer.m => ofAVFoundationVideoPlayer.mm} | 2 +- .../osx/openFrameworksLib.xcodeproj/project.pbxproj | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename libs/openFrameworks/video/{ofAVFoundationVideoPlayer.m => ofAVFoundationVideoPlayer.mm} (99%) diff --git a/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m b/libs/openFrameworks/video/ofAVFoundationVideoPlayer.mm similarity index 99% rename from libs/openFrameworks/video/ofAVFoundationVideoPlayer.m rename to libs/openFrameworks/video/ofAVFoundationVideoPlayer.mm index 7a10543886a..e909b56ea87 100644 --- a/libs/openFrameworks/video/ofAVFoundationVideoPlayer.m +++ b/libs/openFrameworks/video/ofAVFoundationVideoPlayer.mm @@ -1,5 +1,5 @@ // -// ofAVFoundationVideoPlayer.m +// ofAVFoundationVideoPlayer.mm // Created by Lukasz Karluk on 06/07/14. // Merged with code by Sam Kronick, James George and Elie Zananiri. // diff --git a/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj/project.pbxproj b/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj/project.pbxproj index ba932a0a892..dc20c0747f7 100644 --- a/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj/project.pbxproj +++ b/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj/project.pbxproj @@ -35,7 +35,7 @@ 6678E96F19FEAFA900C00581 /* ofSoundBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6678E96D19FEAFA900C00581 /* ofSoundBuffer.cpp */; }; 6678E97019FEAFA900C00581 /* ofSoundBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6678E96E19FEAFA900C00581 /* ofSoundBuffer.h */; }; 6678E97F19FEB5A600C00581 /* ofSoundUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 6678E97C19FEB5A600C00581 /* ofSoundUtils.h */; }; - 676672A31A749D1900400051 /* ofAVFoundationVideoPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6766729D1A749D1900400051 /* ofAVFoundationVideoPlayer.m */; }; + 676672A31A749D1900400051 /* ofAVFoundationVideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6766729D1A749D1900400051 /* ofAVFoundationVideoPlayer.mm */; }; 676672A41A749D1900400051 /* ofAVFoundationPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6766729E1A749D1900400051 /* ofAVFoundationPlayer.h */; }; 676672A51A749D1900400051 /* ofAVFoundationVideoPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6766729F1A749D1900400051 /* ofAVFoundationVideoPlayer.h */; }; 676672A81A749D1900400051 /* ofAVFoundationPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 676672A21A749D1900400051 /* ofAVFoundationPlayer.mm */; }; @@ -192,7 +192,7 @@ 6678E96D19FEAFA900C00581 /* ofSoundBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ofSoundBuffer.cpp; sourceTree = ""; }; 6678E96E19FEAFA900C00581 /* ofSoundBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofSoundBuffer.h; sourceTree = ""; }; 6678E97C19FEB5A600C00581 /* ofSoundUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofSoundUtils.h; sourceTree = ""; }; - 6766729D1A749D1900400051 /* ofAVFoundationVideoPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ofAVFoundationVideoPlayer.m; sourceTree = ""; }; + 6766729D1A749D1900400051 /* ofAVFoundationVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ofAVFoundationVideoPlayer.mm; sourceTree = ""; }; 6766729E1A749D1900400051 /* ofAVFoundationPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofAVFoundationPlayer.h; sourceTree = ""; }; 6766729F1A749D1900400051 /* ofAVFoundationVideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofAVFoundationVideoPlayer.h; sourceTree = ""; }; 676672A21A749D1900400051 /* ofAVFoundationPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ofAVFoundationPlayer.mm; sourceTree = ""; }; @@ -454,7 +454,7 @@ E48662991D8C61B000D1735C /* ofAVFoundationGrabber.mm */, E48662981D8C61B000D1735C /* ofAVFoundationGrabber.h */, 6766729F1A749D1900400051 /* ofAVFoundationVideoPlayer.h */, - 6766729D1A749D1900400051 /* ofAVFoundationVideoPlayer.m */, + 6766729D1A749D1900400051 /* ofAVFoundationVideoPlayer.mm */, 6766729E1A749D1900400051 /* ofAVFoundationPlayer.h */, 676672A21A749D1900400051 /* ofAVFoundationPlayer.mm */, ); @@ -797,7 +797,7 @@ E4F3BAC912F4C72F002D19BB /* ofVec2f.cpp in Sources */, E4F3BACC12F4C72F002D19BB /* ofVec4f.cpp in Sources */, E4F3BAD912F4C73C002D19BB /* ofBaseTypes.cpp in Sources */, - 676672A31A749D1900400051 /* ofAVFoundationVideoPlayer.m in Sources */, + 676672A31A749D1900400051 /* ofAVFoundationVideoPlayer.mm in Sources */, E4F3BADB12F4C73C002D19BB /* ofColor.cpp in Sources */, E4F3BADF12F4C73C002D19BB /* ofRectangle.cpp in Sources */, E4F3BAF212F4C745002D19BB /* ofFileUtils.cpp in Sources */, From c5c4fd522584f55b494192f1be356c207d2d0a22 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 14:37:10 +0200 Subject: [PATCH 36/49] Fix xcode to build ofAVFoundationVideoPlayer as objc++ instead of objc --- .../project/osx/openFrameworksLib.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj/project.pbxproj b/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj/project.pbxproj index dc20c0747f7..5f32f821362 100644 --- a/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj/project.pbxproj +++ b/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj/project.pbxproj @@ -192,7 +192,7 @@ 6678E96D19FEAFA900C00581 /* ofSoundBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ofSoundBuffer.cpp; sourceTree = ""; }; 6678E96E19FEAFA900C00581 /* ofSoundBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofSoundBuffer.h; sourceTree = ""; }; 6678E97C19FEB5A600C00581 /* ofSoundUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofSoundUtils.h; sourceTree = ""; }; - 6766729D1A749D1900400051 /* ofAVFoundationVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ofAVFoundationVideoPlayer.mm; sourceTree = ""; }; + 6766729D1A749D1900400051 /* ofAVFoundationVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objcpp; path = ofAVFoundationVideoPlayer.mm; sourceTree = ""; }; 6766729E1A749D1900400051 /* ofAVFoundationPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofAVFoundationPlayer.h; sourceTree = ""; }; 6766729F1A749D1900400051 /* ofAVFoundationVideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofAVFoundationVideoPlayer.h; sourceTree = ""; }; 676672A21A749D1900400051 /* ofAVFoundationPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ofAVFoundationPlayer.mm; sourceTree = ""; }; From 3b96d25bbaae3295b36c908221781a66aaaa443f Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 15:20:52 +0200 Subject: [PATCH 37/49] CMake: Better errors and more documentation --- CMAKE.md | 87 ++++++++++++++++++++++++++++-- cmake/download_and_link_deps.cmake | 16 +++--- 2 files changed, 93 insertions(+), 10 deletions(-) diff --git a/CMAKE.md b/CMAKE.md index 874f44c81fe..5404f00d205 100644 --- a/CMAKE.md +++ b/CMAKE.md @@ -45,10 +45,15 @@ This is it! OpenFrameworks and all examples have been built! sudo apt install cmake -t bullseye-backports ``` -## Visual Studio +## Visual Studio (and multi-config build systems) The following instructions are for building openFrameworks itself, in the root directory of the repository. Make sure to download a nightly build as soon as CMake support is available, as the main repository takes tremendously longer to download. +Visual Studio automatically uses all of the cores available. + +In the following examples, we always use cmake like `cmake ..` in the build folder. However, you can also use following signature: +`cmake -S source_dir -B build_dir`. This way the current working directory is irrelevant and the two directories can be anywhere (especially useful for CI toolchains). + ### Building in IDE Open the generated `openFrameworks.sln` in your build folder with Visual Studio. Then, just build it like any other VS project. Right-click a project and click on `Set as Startup Project` to be able to run it with F5. @@ -62,7 +67,8 @@ Note that configurations in Visual Studio work a bit different compared to makef #### Build all examples ```bash # in root directory of openFrameworks -mkdir build && cd build +mkdir build +cd build cmake .. cmake --build . --target=build_all_examples --config=Release # Or 'Debug' ``` @@ -73,7 +79,8 @@ Replace `ofNodeExample` with the project name of the example. ```bash # in root directory of openFrameworks -mkdir build && cd build +mkdir build +cd build cmake .. cmake --build . --target=ofNodeExample --config=Release # Or 'Debug' ``` @@ -82,10 +89,82 @@ cmake --build . --target=ofNodeExample --config=Release # Or 'Debug' ```bash # in root directory of openFrameworks -mkdir build && cd build +mkdir build +cd build cmake .. cmake --build . --config=Release # Or 'Debug' ctest -C Release # Or 'Debug' ``` In the VS IDE, building RUN_TESTS (in CMakePredefinedTargets folder) does the same thing. + +## Makefiles (and single-configuration build systems) + +#### Building all examples + +```bash +# in root directory of openFrameworks +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release # Or 'Debug' +cmake --build . --target=build_all_examples -j +``` + +#### Building specific example + +```bash +# in root directory of openFrameworks +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release # Or 'Debug' +cmake --build . --target=ofNodeExample -j +``` + +#### Run tests + +```bash +# in root directory of openFrameworks +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release # Or 'Debug' +cmake --build . -j +ctest -C Release # Or 'Debug' +``` + +## Jetbrains CLion + +When starting with CLion, you do not generate anything with CMake. It's the opposite: You open your root CMakeLists.txt in CLion, +which then calls CMake for you. Time to relax. + +CLion is especially useful when it comes to unit tests due to its excellent support for CMake CTest. + +### CLion on Windows + +Currently, MinGW/MSYS2 is entirely unsupported. If you want to use CLion on Windows, you must use the Microsoft MSVC toolchain +(Visual Studio), which is also faster and more reliable than MinGW or MSYS as it's native. +If [Visual Studio](https://visualstudio.microsoft.com/de/downloads/) is installed, it is automatically recognized in the CLion toolchain settings. +Thus, you can build using CLion's excellent IDE, while the Visual Studio compiler is used under the hood. +This results in the most robust development experience on Windows. + +MinGW support (especially for CI) and more is yet to be finalized by you! :) + +## Visual Studio Code + +When working with Visual Studio Code, the default C++ extensions are recommended, as well as the CMake extension from Microsoft. +See the CLion section above, as the same applies to VS Code. The CMake extension simply invokes CMake, which then uses MSVC under the hood. +The CMake extension's panel in the left bar allows you to build and run targets. + +This means you can also build and run directly in VS Code, very similar to CLion. + +# Yet to be done + + - [ ] Test everything on all Apple platforms + - [ ] Add full support for Android & iOS + - [ ] Add support for Emscripten + - [ ] Add support for MinGW/MSYS2 + - [ ] Add CMake install targets, which would allow to: + - 1: Install the library globally, so that new OF projects can simply link to it instead of building from source. + - 2: Install projects derived from it into an installation directory, which in turn allows to: + - 3: Use CMake's CPack to bundle all installed files and create native installers for each platform. (e.g. .exe, .msi, .deb, .rpm, .dmg, etc.) + +Feel free to contribute to make this list shorter, Happy Coding! diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index 062e1316e03..3ba5acb98f7 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -103,8 +103,8 @@ endfunction() 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 - message(SEND_ERROR "Emscripten dependencies are not yet implemented in CMake! Please edit cmake/download_deps.cmake to add support yourself!") +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") @@ -126,16 +126,20 @@ 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") - get_packages_and_link("msys2_mingw64.zip") + 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") - get_packages_and_link("msys2_ucrt64.zip") + 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") - get_packages_and_link("msys2_clang64.zip") + 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") - get_packages_and_link("msys2_mingw64.zip") + 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") From 97339576943b2756a5d6b8d124cafc40efbd3074 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 16:29:48 +0200 Subject: [PATCH 38/49] CMake: Fix minor bug --- cmake/download_and_link_deps.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index 3ba5acb98f7..e3c027a3173 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -226,4 +226,5 @@ if (OF_TARGET_ARCHITECTURE STREQUAL "msvc" OR # GLEW is only a requirement 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}") +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 "") From 3ff399a8f6d68a25bd90eb528dbd2d697021af84 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 17:43:35 +0200 Subject: [PATCH 39/49] CMake: More documentation including images --- CMAKE.md | 169 +++++++++++++++++++++++++------- assets/cmake-example-layout.png | Bin 0 -> 11701 bytes assets/cmake-example-output.png | Bin 0 -> 13900 bytes 3 files changed, 136 insertions(+), 33 deletions(-) create mode 100644 assets/cmake-example-layout.png create mode 100644 assets/cmake-example-output.png diff --git a/CMAKE.md b/CMAKE.md index 5404f00d205..05f98c96533 100644 --- a/CMAKE.md +++ b/CMAKE.md @@ -1,55 +1,118 @@ # CMake Support -## Building with CMake - -To build the library itself for testing the examples: - -```bash -git clone https://github.com/openframeworks/openFrameworks -cd openframeworks -mkdir build -cd build -cmake .. -cmake --build . +## Using CMake in your project + +Setup steps for a completely new OF project: + + - Create the following file structure: + ![cmake-example-layout](assets/cmake-example-layout.png) + As you can see it is very concise. + - [CPM.cmake](https://github.com/cpm-cmake/CPM.cmake): Just [download the latest release](https://github.com/cpm-cmake/CPM.cmake/releases/latest) and place it in the cmake folder. + This is a 100% CMake-based package manager which allows us to easily add dependencies + - include/ and src/ files are taken from the [emptyExample](examples/templates/emptyExample/README.md) + - resources are optional + - .gitignore bare minimum: + ```gitignore + [Bb]uild/ + cmake-build-*/ + ``` + - CMakeLists.txt: + ```cmake + cmake_minimum_required(VERSION 3.16) + project(ofExample) + + # Include CPM.cmake, a 100% CMake-based dependency manager (https://github.com/cpm-cmake/CPM.cmake) + include(cmake/CPM.cmake) + + # CPMAddPackage("gh:openframeworks/openframeworks#v0.11.2") # Either the very short version (works for github/gitlab branches, tags and commit hashes) + CPMAddPackage("gh:HerrNamenlos123/openframeworks#master") # This line is to be removed from this example once the CMake support is merged into master + #CPMAddPackage("https://github.com/openframeworks/openFrameworks/archive/refs/tags/nightly.zip") # Or any URL or archive + + # CPM automatically downloads and extract our dependencies, and calls add_subdirectory() for us. + # This is the fastest and easiest way to pull in modern C++ libraries with good, modern CMake support (especially true for C++17 header-only libraries). + + set(SOURCE_FILES + src/main.cpp # Here, list all source files + src/ofApp.cpp + ) + + # In Visual Studio we must also add headers and resource files as sources, so they're listed in the IDE + if (MSVC) + file(GLOB_RECURSE HEADER_FILES include/**) + file(GLOB_RECURSE RESOURCE_FILES resources/**) + list(APPEND SOURCE_FILES ${HEADER_FILES} ${RESOURCE_FILES}) + endif() + + # The actual executable to build + add_executable(ofExample ${SOURCE_FILES}) + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCE_FILES}) + + # C++ version of the project (independent from the version OF is built with) + target_compile_features(ofExample PUBLIC cxx_std_17) + set_target_properties(ofExample PROPERTIES CXX_EXTENSIONS OFF) # Disable non-standard compiler-specific extensions + + # Include directories + target_include_directories(ofExample PUBLIC include) + + # All Targets we depend upon, which pulls in all headers, definitions, libraries, ... + target_link_libraries(ofExample of::openframeworks of::ofxGui) + + # Setting up paths correctly + set(BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/bin/$,debug,release>") + set_target_properties(ofExample PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${BIN_DIR}") # Where to place the compiled binary + set_target_properties(ofExample PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${BIN_DIR}") # Where to run from when debugging with F5 in VS + of_copy_runtime_to_bin_dir_after_build(ofExample "${BIN_DIR}") # Copy all shared libraries to the target location after building + set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ofExample) # Set the VS startup project to run when pressing F5 + + # And potentially also copy any resource files to the target location + if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/resources") + add_custom_command(TARGET ofExample POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_LIST_DIR}/resources" "${BIN_DIR}/resources") + endif() + ``` + +#### Additionally, you can use a precompiled header to speed up the compilation: +```cmake +target_precompile_headers(ofExample PRIVATE "include/pch.hpp") ``` +And in `include/pch.hpp`: +```cpp +#ifndef PCH_HPP +#define PCH_HPP -This is it! OpenFrameworks and all examples have been built! +#include "ofMain.h" +// And any other common header files that do not change +#endif //PCH_HPP ``` - set(CMAKE_SYSTEM_NAME "Android") - set(CMAKE_SYSTEM_VERSION 1) - - cmake .. -DCMAKE_C_COMPILER=x86_64-linux-android33-clang -DCMAKE_CXX_COMPILER=x86_64-linux-android33-clang++ +Here you can add other headers like openFrameworks headers, standard library headers and third-party libraries that do not change frequently. - cmake .. \ - -DCMAKE_C_COMPILER=armv7a-linux-androideabi33-clang \ - -DCMAKE_CXX_COMPILER=armv7a-linux-androideabi33-clang++ \ - -DCMAKE_SYSTEM_NAME=Android \ - -DCMAKE_SYSTEM_VERSION=25 - - cmake .. \ - -DCMAKE_SYSTEM_NAME=Android \ - -DCMAKE_SYSTEM_VERSION=25 \ - -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=/home/${USER}/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64 +This has the effect that these libraries are 'precompiled', which is taking a long time once, but speeding up any subsequent build significantly. +#### And to build it: (Any compiler/toolchain) +```bash + mkdir build + cd build + cmake .. + cmake --build . + ``` - https://developer.android.com/ndk/guides/cmake#command-line + - For Visual Studio IDE, skip the last command and open the generated `ofExample.sln` + - For Visual Studio in the terminal, replace the last command with just `cmake --build .` + - For CLion and vscode, just open the root `CMakeLists.txt` in CLion or vscode with CMake extension, no terminal commands needed. - cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/$USER/android-ndk-r25c/build/cmake/android.toolchain.cmake -DANDROID_ABI=x86_64 +#### This results in: - AT LEAST CMake 3.19 !!! +An output directory including all resources and shared libraries it depends on, ready to be released. (see known issues) - deb http://deb.debian.org/debian bullseye-backports main - sudo apt install cmake -t bullseye-backports -``` +![cmake-example-output](assets/cmake-example-output.png) ## Visual Studio (and multi-config build systems) The following instructions are for building openFrameworks itself, in the root directory of the repository. Make sure to download a nightly build as soon as CMake support is available, as the main repository takes tremendously longer to download. -Visual Studio automatically uses all of the cores available. +Visual Studio automatically uses all available cores. In the following examples, we always use cmake like `cmake ..` in the build folder. However, you can also use following signature: `cmake -S source_dir -B build_dir`. This way the current working directory is irrelevant and the two directories can be anywhere (especially useful for CI toolchains). @@ -156,6 +219,11 @@ The CMake extension's panel in the left bar allows you to build and run targets. This means you can also build and run directly in VS Code, very similar to CLion. +# Known issues + + - Currently, all shared libraries are always copied to the target location, even if they are not linked + - And only shared libraries of the apothecary are copied, not from system dependencies + # Yet to be done - [ ] Test everything on all Apple platforms @@ -167,4 +235,39 @@ This means you can also build and run directly in VS Code, very similar to CLion - 2: Install projects derived from it into an installation directory, which in turn allows to: - 3: Use CMake's CPack to bundle all installed files and create native installers for each platform. (e.g. .exe, .msi, .deb, .rpm, .dmg, etc.) +CMake has excellent support for cross-compilation for all of these platforms, one just needs a working dev environment +to test everything. + Feel free to contribute to make this list shorter, Happy Coding! + +### Some hints for a future Android cross-compilation implementer: + +> ```bash +> set(CMAKE_SYSTEM_NAME "Android") +> set(CMAKE_SYSTEM_VERSION 1) +> +> cmake .. -DCMAKE_C_COMPILER=x86_64-linux-android33-clang -DCMAKE_CXX_COMPILER=x86_64-linux-android33-clang++ +> +> cmake .. \ +> -DCMAKE_C_COMPILER=armv7a-linux-androideabi33-clang \ +> -DCMAKE_CXX_COMPILER=armv7a-linux-androideabi33-clang++ \ +> -DCMAKE_SYSTEM_NAME=Android \ +> -DCMAKE_SYSTEM_VERSION=25 +> +> cmake .. \ +> -DCMAKE_SYSTEM_NAME=Android \ +> -DCMAKE_SYSTEM_VERSION=25 \ +> -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=/home/${USER}/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64 +> +> +> +> https://developer.android.com/ndk/guides/cmake#command-line +> +> cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/$USER/android-ndk-r25c/build/cmake/android.toolchain.cmake -DANDROID_ABI=x86_64 +> +> AT LEAST CMake 3.19 !!! +> +> To update cmake: +> deb http://deb.debian.org/debian bullseye-backports main # put this into /etc/apt/sources.list +> sudo apt update && sudo apt install cmake -t bullseye-backports +> ``` diff --git a/assets/cmake-example-layout.png b/assets/cmake-example-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..94b3af17ee549847f9a04b4ea348b101e42e9023 GIT binary patch literal 11701 zcmb_?c|6qN+V_-7kyMBhD*K*wEHTQKWso&{i>!?i!We@RvS(k$5<;?N9m}8;*@lpH z7|9shAT!3kJipF4?|aVkKIeJQdEU?ahmX(A%ynPaeQn?Cd*2a82HH#vR~SGb5R=Yb z4Py}KxGo5E%;ofP;4kF(H$A|wV_wGEcR=NRR~LcB38&l8+aOS79OM4Olfe3n$6ZS= z5a^=!pPyp{M;<>ANL*J(;NuGaB?Ho7TZ*LkblHCHyURh2T_{4bn@nTz^;WP%=9u{n&gjXHfy1xz1H;nhWUvd z1mv%AV+l#)S!PZ4G2L2e)9P6gyz@KlL1+{CL#G`*k@UDjJS*{k6;GIaxr z!%X1}kmb+bHaN7x`AhV;HA^9u9rm!zw~MG+^1YP#!XMs?US7;Zh}n^oY0CVh_`qTU zxc!p*?B^vH8B6E@p|x^*{qa!#MU^?&Lui@Xau-f{n(awpr5`n-ac6zPU|QLN;*t$j2-R1go|=s6hAK zs-gt*H&>Bv$l@oLE{@AEPuOjax@4!Jg{h=$Yh%ggfFkUU%&chw24mrsBm0crYxsTh z(TMNX*DD*N6MIol=qfOYiAC^oI9z4lsN#{?Ctx$n=0(4+CoV5H)L4fddPAw+(4 znc!<}J#AB~mjHh7TWP-R*%Im?&!@TGBc>-u6~Fsz)@}xUX%*DT{ZuherwM0$g-ue= zU;=I9M-Gvw?LBHBr-wWDgg68+?e8!Q^G;qej|qU-!I7yRF0Bp&QdSzAUx} zhm{}D%ld*P%!d>B+fMUGS19I`6c5fQUW^;&TPLf#QI{%TdlQ?`@BxunY0q}4{4suT zea7q?mtX@al(&P^uGmAiht1LL_l=BOk#@OFNTu!-+msBSQuJ+?jy$WfW}R5at^1xP z#j+Vw!b2Q1pD|O*GGx#}CV17>!-PwWfFR(9uECpUrWnqe7i{4o)pBi89>>-emBR6|JzvpMtvV$CsjO4QXj@|9!>3~4ALNjw+VLg~X=7K@ea^Y> z9i%;w2RBSHpYH0)9xX+gt`mvF;nvN~Ptx{BzxV3~zSlq%3toOq@Wb4&{baDZ#ntw@ zBm-RVY?06rXT2O}iXVa3D%U|pQI(`DwclC~l_uqs6}q*mIUefFlU;{WUma^Y1(1@Z8^;*nE&+(Zw3|yP5$?PG4znz?y8U+lErw#Ds0M-SAMbO>DxYZ*UPb1@W8n;IyScFR|`@dgQR{+?y}SAt}L+ADIJY| z#|X5F{3g2>(NB8;rV0xoI9;0O%6z+|GG`8CdIn4+uHyXp=3*I#)@$~wF}S0>S)Hqd zf)E9C4)%Lb9O>n}7Gd)dp~`+);?OK4>(I(~3;X;CUTd-L9y()gmj?dhqgCv65iXx` zk$e2yzH2kQnD>H+w^OBxbB98s_T1CEKUW^RXAdeoUnIpI35^E!q1&3+h_J6f@l{)^ z3V}!_>>rL-S`4*{c)FpG$b+~=BDPZ}f`!`E_G{V9x7D`HQt8<`DIc2EzM;K+&k(k{ zVJMQb`}4&_tJ9J2%L*P0cvb87vjhXcK40he=GHfd#A83-fG=pywhjM$%*umZaqlK? zus-rVxKEAP={X9Zl8TtQ1N^BZ?Gkpo)t$FcrM(ilwbroxUD(Vw#;pb-N8fLPh7k01 zkr2FLwoUdX*1ED4P*58&sCz1IR9oJItEg|XHV!W zR~eu5ukjgyoP+mC5n0$Wo#V)lltqpeTewn$#n(=CxrAkS|J4ud;qtTnGDgBp3v4hy_VHH<# zF^Z_$dmDokpFz*m0{ZiElse|KeDLnJrI47Fm?riq2Vs_?8ma0sF}TiBZ~a*TyjPc# zY!S(NackGknUiI}yfHGskgE+#Z2FG=k zMV?Rm#M3_0dpojjo2xx<>35wUuFT|Hvv&unzX!5w7yQL<{-rpIhoiSkXQ)na3UcRi zhd_Kk`o35%+TB5mR5o>vxldnM{jC36$Q4QZojb5S!zjkldhhx1kQi)ylXQ)?H3@4Dfzs_5bV}l%K$zLYP!xa>O5^#@m-!j8k)Cs?(@&7NK{D+7FUicn(*lAO9F(yOX*@s3IT3H8hGwPz{KYi2XtC3R&%gEO-N>9+H@r;8^A`7{aG ze09_`xm{wjUMY@nnr%9GV*c`-d*ag1#KQG z6^i%!XoZ~V>w2LxECbY@@F%!r9dy5`-OYbqW2TtPtkoFYGva~!f;32Vwum|A_TSEYYie4+=BL> zbDAe83bxomR^5x+Wc3U0!lvAfr;}DrY}Aoqw3RuZhhJ>OqTD|)B1*nJFfhodQz`y^ zq1%R_k@r>jYt?{}INa`2%>$f^9NRON;44G}gTSMT)s%82cy=IRpUFO`by8v?<~_33 zTCaVs1 zT|V&ZQAn{XVolMgD~sh{ZfVq|wH6J=p*yqDmlZzC++p z|73S9t|QW0+23S(IZNNKPHReYO(JsS=`X&v#5r+WFJoS*bha9)QQg+jt?squ4VLrF zD+i}{2ga3Yd3{*ggnYpxLL2&GAc43nEhYW(*t^%)@7FnkXk+Vwg2P(knDwg_Oe7Bx ze2pz3AzRUv3Pwi!!ako~aVEXk@A@SWQ8YjD)Cc-#=C{j7-=%vf1lo4bpmv4y$nc1R zGA+4}*@!edljtZUnGo>R>KRQ19CWZuQ>DAv0$L3>#@8(YsRsyxe*EYH3=5XYy zL6nuphNEg%y4%gYoT>Lm`TQWG@@*pVXqP8-YGqEJt@}8M#;Z-lZFFIe8(14>Vt$|W z&2uHZoM$0IE57+k=vpTd_xxP0hSsS2~ox-YfQa@*xx4?9kLq_T_Id zlU(EqEQn&m3g#uvO{E0bf|U(^gw8-2R~jb zh_;UNZ!iUeKq%w+0el-R9F1o^2fFDe*Sh7%fZ17j&Oi_1cn36~J2N11bi;(@xE#Kb zTJhC9-FNC9+4g@W{Y10JW>sMICPN^B-;E1VY2}q`Cx~8?IOQC{q~4#3kMK>u-E?`3 z&0mIPoOY(YmZe>ju~|@fo^DKv5@ySBmyi@XOwWnu^p$Mvl9s>tP=0@TY$5?c9dfHd zZ@w#*anlQP8O6?(6GVA@yCfEEk1T9DEcy)DPu(;n!h$%R33c2y&l8_`N{*P`!9Gig z9nE{eX>-c%f>$F6YPT@eb68KSbBD6L<&fQjMTJ}onYFUs8UYY%mh`%-` zHq|?qecG;;hm!rCgS+l=)ENzk_NJ_*fh#XNY*7}z)V@L1tqNR*JeYRF2Fx+mu0X^k zY-R_uoUH%oo=P%YJwLfM-bDAgqa3r4G61vg7y$TscD(@sYgzNn1|@ z1C7tOWTbx*%em|$cJ3N{W>=-WUgKP6rjUfqR-LeC_)mtUr)h_m*-hShqoIVd_i5m2 z(uO%_wYT1A;^L(hh>(^I4zXMei@b^p1J~)k;=*Q!wWQ1rKQKr!7vB zkug2DXY}!P*{F$1n63o;Q3p`-`hp+KLWx@@8#$oaj{<4nU$fitJkyJtIutq&e?X7~}v;_qiH4_PVZ z^^W9|f6e(4*;mKN%pW}Z!8{gE(Z*8n8R!`Zobp}|3(kd83=Ni2J8egzo8KPBrGP&5 znf9V_WT6yu+=TSpJGe#s?J&+so6apZ=RP2#Q9iY)?##5-bWlI8^2ga$i%0Lv7JE zW4+vk*{9<%7i7L;VJh`Y0(yQHuXA7#SOn8h)RWYLoDAz5@J|F86iL~)bn`Ih(z(X; zk?qg6N9OS;%d4dwy-y`ay>4j}w0i&AP!|s`=pMAW3WIOy6TW(g1>QUL0FJ0wIXAW1 zo8?)(`(6mXo4js3guFbZ4NMMaf9CU>;S0yx0-O%eNP+b zi#^${X-mEMz6sJo>OFT*=$E9#M76U%2v6yt*a3864?0ygUJ1wAgD>ekxv@p~5NQYx zi>fTTQngEwZ`#aq#p5)k1R7l>3h2t!3FMwU?{hrj$2Q;D2G(fIiQIZMxW|BqX8T%* zRcXkI1`9gpCgkM5lIg;~8Afc3DEO4_ou{Ssla;azr0d%hPdc3eMYl{HJW?}6BqF2r zcXGKAQECT(z~GBbJGHC(m+!!1EySM53l+E}iM{DTV?NmQwqaJqDDsawIfHYrAlFji z5s+?L&fz9v7}8y^cOjtW-FCp^ayzZx=Uyj#?b3Ht{4sSg+~09f`at0%Kk_I4Fx6C~yxBHX{uTHZ5^=N?5q50H;Ctof)mCQfDoMyD2S!XqFx z$Vj5N*58-^gvI+?LK&eDoH@64IwI1)xHEu)k9`n^hYJ|mrv+{O+HYdFyCtV)WX)>wc?R9b=)Z1BCe@ok11nZ>g-t}lw3>>?*XWH_o9zfCO0B-Slfhmbd z29iVl8G+#pl-n`~!|tR!Mfc&!L}GeSzz+X`lP)t(EK@2J0KV6o0@z58LQzF!-qY)7Li-;Jn~r_8n7-i1L$6BOtMf{nUck#5>B^Dc`5v~geK1=+2-NWl(u7^ zJZMxR(XemK{?u=33T|yjT?Q-sBJ5d{DH5jRHi zk6#MhG@f3vdQTNFFBwf#CxB|70gW&!W~HpCJ=D#nk^0mPIlDTS$H~+bzqG}gWi#ngS1g5o97#t zy6o>Cu!?KR|GW_DRs%1ya6uc_#FNIL{Zp*iL7LV31vbYX-(K`sM>P`B8^+_&KQhHP z8~&n17~Z{2>}q$6`v#MSM{=l?6<%HV{B|@kgR6Vj?)FM%tmrzmu(NU*#-~}qGS?RE z@>cEtm^$waXico^N1)E2R~VN1tm^~gL?x78JuH@lA6z=O!L`_<3t&5uNhi;^u{HiuWm}gMCAtROB6`rZTKK(0{h3TLmqL#ShXaECguHA% z8myR>l=Y-oQuG*ztcaX%2EePx|D-e1B;nsui!9u88aCI7uh28;e)C^zE9|Wr1{JvX z4-`P4-3mAY-Ln2=r($EY0iSbKb-_`I-WrEr9if8Fr}RM}*P$b9aYX@V$zzw9bJ@52 zAM-Z5Y$HVXIf=>-4<{9XDiR!Tsz>;dDv_Bzm6-xFu^*;f+AlaFQdl-8F153#ee_)n zga#9+g`+ke$qE3H&o3zlBv$i?fmQwd`*JL=!w=a`v$64ki``u@Q59Ni5>v9Du+Q1- z&efwMdzOz>ZN}-5WAPBw;mkBoN)YO>dTTP_lf(uD?gXDtaCB^3Ya*6WCG6J5@jaTA z>98^}j8*#_H6Hw+UY~Hdz4WWA>sQ5iW%JIln!KpDk6!QQV20+=L!;R}ZQ^#;T*^Vy zP@g{Q)b)p3Iw6%WU zS@Se&LZ%xoP+w-;wOj9E4-dnbIFUHNQ z5`H@Cmj}7J7wbtTlUubmGuhS<$B~8^7?Ysgsi@oi`xO?gyT4yI4RNaxwDh3}Wsjdf zmtz<$;_SBDU!m5`6ycsn*@@(F+y1L&>|T-(ICuPsRE8n>3uSo@jd|WUYn|i+8$^T% zD+#JDrO+Y#f!MH(NfCi<88sTcjzhC~n zxu?W@IUQ3sEw2gje(y?1pl4WOBXz52EHbC{pi$24NN-A*O1T%oK&6W3rm*d&d@#M> zxPGsBA}rc*(Ciz`C~RzmTv#+c^|5y|xyr38Il=XHeQrLzhSGW5$Gb;e2g)BfQ-+WH zDylUk)%p8HEO=G!&xMdKec#Y8TOP=MGPm0L!(ZAE$ayNfi)@NWPpuvgyaph(z-tW^QzBE3bQFmWjTIhvcw<(^fxc%+FM6w< zWVZt)tVj`U2j!aRb+dC1b%y9^ISDPosJb^=qVU7C9!701H*==r@UvY5*G6~+5+BaT z=qW$a?Y5GGXJlH|2VVz==m#QbHNz%MBznk|kE5>;%6o>8Bm5}DUfCU}DHKY%L}#0?}D!*wS`>fCCP>)aTR#8H`{sZ;?Uxf!|$v?mg@6QaIgO(-l^ zwZ|5<8b~xMX1Di~%c3kSCNrf;Y%yTzACT-lr_CeV;e?(QqJSpzX+?&i zVtAT&V-JRExu}j9H~YHOQFPfw_XhtcJ%0SXkI<6`ZxVOP412rk+^W~Z7^tNFjnQj7 zLU_hSmE<5vig_L!u`CKd9eJJetg^~+T|sEM7`5p{7nES+k#97a)D07SX{pK?pGO#cm|WPKtu zsK6_bRunokWngeA)4b9&@dvlP){WCz;b{LZw0=})a-d2^R)lbT54zrBTMZz@e3oc$ zFvkJd_lA!rL2Pe#7t^mq#H}tgi$%y24aq&kG2Vu(IdO#(y%$Bj3R>Akb*9m8o=Nv? z`)-ZcWP_3CpcL0B9$Vt$L%E0jcn=VCl!n@yL!oG@biQs1uONA{9au%gp z=MZ#8kbCu7dn5j#buOD~;>yx8o~;&(P-N*u-Jwo+9GY0a zHJtD+9&8Gn%h|}k00xy>TzZDJol8G@>&Hv%GtZ0sz}6RrZFHG?l!!5LDQ`IdIeA3* z$@)6s2CQ(Qhd~|RCiwq}yZSG)b#Shdf{c&<+(KxHcE7lxzCnHZr*hy>zer1s?2^gs zkjx{IJ^$IIRG`#x?BOE zd=X3);pIA7$d>UvU>-v!l!*(ykIB5A9f8Uom%Qm0_j30Q7&Io12o`l7S!6#ZwG2E2M$5|br|nY{lvqvz}W6%5a8SrJExKW3>@~Dynn!dL4Jz{-zwUBE+>2Nja$xl_$gTi(Ep~sEqZT|AGXMh zDKgAS-w%(oYdLs__+URTNYm7&K9sSz$~JmM6AQ%4^|bqlU*|?w13bsFV{WwsY|vy# zO?32*CYmId4hy^^V?xCQlfn4rbx~{C(vL(MaP_oscGO*57 zwXdiJH;{na4QedO4zaBh0`doSHv6;1u571LM!q`>qJe;n9 z?V2f!2TkrQPKAM9t-FGPW(I9^T(-gpKE9sZyo>sg*>hG4xHDGoiSrIls&uQwcj&>d znYwNr=YYdfmy$ujzHom+*xRd?-LKE42oQEJb~DpDtxx>%nc|qzVfg&~J~pe#_h>=C z088`ql%D3`OmKK%L%^ENC7AeeSAFTyS<6)pt9IZYI|C4&uLaI!St+hB2SHF!6lw(f z+dwiXz64;~+UGgFXwn*fy{PKJw60Per8~cj`t=*>6PTB#MYo-GC|`TuwSM>|_ZaA* z!GGt3A_iZbCPf$MWZ3$dZ*@^(F=VL}X#9+}Y^L`l@5F0)7*TddU#awR6W|;&GB5Px z(^r!k6`q2E1-50EZGqF?130V;0NhxM$8Z29|84nyefjnGKKu8No&5xi%wU7wt3D=b z2Y`l+Tp71e4-coJsB3n9>tElY>3;wP{r&JZu{U0wMbL5D7%>!zRw1lCR`9woP{sHn z1-Kp^05WPxMs=sV$!pCnV6L|}SABL?rlQ$c8@S<&1eBF~29u$OF+v8s3S&oo&(3>e zK}?%0lv8id%_bHR3?>R&11E0Xl0p%`Z&$J}iC;y80I9n%?MD?Km(RkCcXi1eZBz7i zGjhWnFZHFhHG2@>*tSFhSrR#vjb>xN29?zMD}Mx(`vP)g?v(l9(+2A=T9L~BqTZ=| zf1{96v*a|V02>d{3JAM8@h*J(PWuqc5{b8hmH}po-e?>7Z%L$1LVxu`MurT6tGV7x z*h}Cy^CJBA@T_1>w>$cL@91pWgugt7YgjUR|I|Y`lDk&_w8d7d4s3n%MyC6AOXZe}<9* zIT?8!sIE&s^-^nxLKcRw#GDfY$=xCeN2YgEa(*^T{9#^h3mhmfp{v4AQ!j~?21cgb z7e5saq+#%SS7H>7I}X3ktTgfTepzAZJtF~?;&Fv8tgxAdu^(&N8!8oHLTsZ9NZkc$ zCO7Mdv-WP)#b^;AS=QDAF;9#Bti*s7v$I6R7crEohak`NLXYl83qW;bFoH*-x>}6( zgnvx*Zx0jyS$O^vP^rcgD`{9Usp_>d+jR!~MP|J(!p*+5#M}4>W%KaT#&k8{wF>AUl>|kJPu=IzWAyz^9N^?!gnsF_o-U7= zwV!3>4aOc@fTV+I1&l>b;G!q^9~QOPlR*rM4H@s7Cw=^c@AVK0_IRMHDscYPf$MNy z;J6lAufdm=$@D!j%-PvgC-Y9UOImLjLju|qT#N4sWs<49>`Z86kUW}#w$IUmcqC9p zz%AoKtL(pEAuxV_)pliLhqO^UU*!=sYW}Tn+BY$aT3DfA6|g$+5$S_E%f3x?DE!J%)lgw>@`p>nhEuy13o-bMTlww+S#XJ)a>I38@`sOhxO4+S;ye5 z71TF>Znj}28|vX7NaBdMZ|xqIPpT&!1~*{G!_BeUg7AVriN35y(7lsDVQwQQRG0B_ z*b(&g1_|4~reHBNrmFX>-iGuK6?h8ru^8(6OPld@tI>Rwp7KPj*`MlTZ%=W=o3yNL zZjwdrmRTmBkQD4HyG{2JyV#U=h;UNq`QP(*ZvI^RaHnKNcAfu+&jA#30A($-7MJw1 zuPs(2M!Cm2t;-;ne+{#Ni=q|n);B34cUSL!o31Y5PsMjZBm2}mOHxlD&2M&EOGCP% zRX!xL>5NRu!EpsOW)0tE8fcW?dGPW-0OKi>rT_o{ literal 0 HcmV?d00001 diff --git a/assets/cmake-example-output.png b/assets/cmake-example-output.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0c32a783783f89374b3fb612eece3e91d97e38 GIT binary patch literal 13900 zcmaibcU%))w{Ae1pePE7G=b1d0wTS)P^5Q(fP!?Xp?5?OB=i=f8&FULqzDEnDx!30 zA{~T;UZhLE6TkPIbARW2_uN0&WF~vh>{+wQv!1o`)Id+;GBp!52n4#UrKx5F0+ILv ze}AY*fipjR9+d+BNPLVmR6vz|EX%+FnUk`vG6+X*u{HeXvl z{K?xn&Q<#47$w%4qHLgcU(C?&*`s){n$1_q|>=01XgK~Gz-6yp_WK4v3tJW(s zrho6BZCS9{C{BH^JaXDs8d8FT0>7C}NVeEEgrO92AUwKhk7WE z)3a+!_pIw%6hTv5_uz)~y-)nR`&(_)2eywUJtU}r+wyj%YoGfwAd(wGX?+ze)CPiO z-sb9}c2U28n+*j>Il3&{0QfC0dDr#od-bVk32i7-m?W^73{jl((a&xX z%ctboj$>ZE4!h6iA?{gK;d_u5j)u-Sug4Ch!J>#5T%GT?pUR!pK{p>8Ux!4@1}OYn4t{$ zT2D?fg+Ij5P~(#xb}mf7^USBvz~g)-RHt4Ipl?ZW?t~hCOUhR~yN*!$Y8maEvNSZE zK@A&CBZ!6VI0GHjHu^bM!11?T5cBZee(t(^mxPra?a4q=LdR(|pxG~xND#>8e;-Eg z!qYqPCzGo`^Fbil{trzBigK$@41Vp1zHjukRL)PH7BYJn5_*d@`1lDOQCFpydkQke zZZ1e(PuDKt+U}9TujtVj{*h{JW=g6mMVE?DV}6F8km5l7tiFQh-zMswYI_DYICgSC z8uSf!z1otJGu%`T^Os)&`&y!XyzIKSt6pYDZ$Rl$p8hGpPEGB?t6$bZZH?=I0WOJ( zX7OpjFL1K~l7Gt>eDR529-3gcFU+UaXo_M?>^}rWau!KaWvKiKb{E1-|4~SQveHdK zaZTp~!mTGOL&?+^5#QBU(cHnx4H$T6UDg zb=eeAyVkp5UpPqQ+SItn$bTy22l0~~zLp}U*%-T#Qg9LU`zaf4%@vHuM5Yak#fsu?tf4N^Ux+l9 z>v%y@%eTv?s)N>~9-*?^Q%g(Lb__&k*ORjq& zvSgkQo-dW#Gr5JPf56~9fUUJ`iJ%y#rZ+smk8i~+5R!D!RO^^*-&RIk9L+jixMVgt zXeQ9AU!Gna?tcN~C6c59_ZLewdRt&b3CMCD#0ddKLI6oOB24S3^1W+^zZH-5Z)__s z;z>X98#BOE>@51tA#69(^LB-*VvlCfw4qDk&8>DALjdf!^hA0!-io zdokh$u&MhYlg@M$cv8@4mRlVa;MhTK2#8=%`e!RPhQXC4 z`(3-k=~2*e_>SzmpY`u6tcGjl<>mR?N8KrdIkY9%vZk{9rePrx|;x(TdQY@Lr8_ViGNLNzGvyyPOoB`GtJjY>?)pr^ZPz zQ+v6aq(6ws+J`Z0=?@~8P=4q!wult`uJ_KB7m|FEd1#ZQJuW&ZA0F(z=tcQYtv z5OZOc%-IqiKM<>U_-?z~sY|Hv+@%vLTzBS&70gMV&^-aY-`tE@9ti)$(R_8>O?9&O~tyaqg1h5SvN_;bm0 znMoCRe4c}~jI=n_R96s#f4TP`yBMP*H?ACfN=wAtmu<|2q8*lGigOcS^(b!!AXi4H52Sm|r+hs}~go|u8$g~<})5YjN zl(|{SwmEaD+0+L^5WSgPSWu8eaOtHg+Yq1!Ss4Pe3Jp}B{5ahWmSed`d4=A#j?abv z9gTHX_aj`0?L7V2fGj8!m?oCZ|E@=4`R>AAV&nZ@ zHhe_*sMy9B00Y!B%Csu!H7ZU$*cTImlu-g+R-j>N?@z&3v4#z&`%L60lA?zuCFtE< zC))z2mY1rx0Q1V9)9k?#z4}!K9HMzkE&==FB=}1*tp-LR9t6R{U>@BY*}jSoi+g3Zb5G?A)qF=K zrdoS1JLpGfkE5+5b8i2pm^$G&3JeYb8vQuWdqOc2d+qfPj1l4-+z)kOn* zT(^JK{0fM-ZJK}`6<_-yu0rvF)Gn`v68HW9@aOiSaX)1c9+de{ayG19~U`v_gXf3^6ctl^+kLwqTWns-h5JJq;wmI>du@U5-W zcD-!!wa4+3&?g)GdvXsBofC&Ba3D}Uw`7ARZ~PmKBu1g8{~FO}Yb$#gHojq2Xp&xb zp#$A#j`u=?pNL54L5tEEw!w&9mtc&MIGpEz%C(E0sOY-85o$|k&|E?)V-c%It zZj9ljx{IECf1%RtC5*{?@!-=tEs*k{k-6lS-e%9y*+dV>pUv^Q2D~ZV!^7^8ykgk% z9?nGfvs4u^iiL={ryqKKnJ8wxSkjSw>Mq~joUxsjD*lOWJ$l?4UaD7>LX+uWbSTHn zrOQqSYe~;Gw>sQ<_tLmQ9#(19@{F%-e^*ba2(75lMS$9v-^<*i$^Q=jnM^-3)?#oH zy^G-y7GUdqe-TBpOL(3(3H^EqK&+8R4RDMG7v>=1JmBotV(ZQTvrmSx0Oa*8o9d>5 z_09d6i01A`Y$(0!nQjs>PojB74S68ktXqwJMPHRB%z5Uyw0t@ndt@QjCo8qBl;aSVkj0rcyV)2@Q2?wM&S58+db20%r%1RxHRPq__ zhKW7{1tor9CfvYpFY|VB>cDr?*A6j?A)cn$u;a9cwfp zVRt$@Vyp=*DH&)n$P^`t1U@#2t>x&=lk+Q_2ljET6n}bhGIRD?4gRtxn*OfCxPU{< zH=5}LyZUtW?Gr8XZw|_>wYgj*RmjUnEJ3*UJ}t-|wlvG9H?IKKlExt(zcSLkcBLX$ z+m9ozhpc zXcL*Qeh0Z13WbK3Ic@Ch4tl7-zdfVGsFGZ}?y18laC^?oGWRI&a zX%Fe87dXV}qXZVl=`?r1H7GHd;t=q=K7f^DWg0Yr=mWB(1i;qs&wxRLq*#F|e_`Lh zANF}MrJH9M#q*tWv)!G|nXw@dXzG3h>hO2^`Dw)2%sK4nkS)Sde}~kw&o?j5Lud`1 zx->{C@j}ef{%U`CEIjn&{C;3M&ABV8?{sf<{VXPk(XxOo#bS2l-lJmops8Snv#uA2RVLMM$fyof_| z0Lq0Cxy0sl-O~M8&&|CYoof{Re3W_Mr-kF2;OfuCztmqU+i&QZ!`~p6L!EB7AiEJl zLp&N40nx12p7tA|{d7~2OQGIQTPDEPqVt^TGNLE~lty+;wUtVii<9n%+ZxTELSx-$W5QuWgChBm4uPeq zo*!|B}nL(;NG{-h&sj*578s$JNpC8lYv)_~O8w%H4!d+V!i? zOA+U*tr5=25U6{aA~-(U9moyKhYg?S!UPKmAdjmm}bXkC?3l; zJ*^u-#uH?Hd-@Sl=|TnqZU2pbF`ZjG$s-G_gHDr9QYn!&4*JGb{A4n}Ni82$kwOzO zl=H0pqmAHqp?DP>UysI`nBL%RJZb$40m~A};lkOlOO@Z+w)T9rn9(bpLuPdku_&JzT+yy}68+UxCnKEv09J>Gz|%&TJP z_wJ6dPQQ4u6ab=Ca`2$@R{(pJ||j@*5AOZ*-H11mmt!mv+`-zJSHBW5;u zMhlVk$v#sm@OKxdUsn9e)AI(NporTZg|@LCwCipQZ5dw2e%_luk%?#z2moy8HS6Mv zF+5F2|2&i((obE3LoCjR5Hfz-O0x17=9SB0pA~oLIhRU73PP7j;;E zl>U~f4dsC*vizdgj&;g)j*lkAMHT}X#a_xd9UJ*0N~JXM{idnpXA+2SyS_!9pk&Oa zDOFS0%1kC&%+N8}rVD22{yeu^HHAjXhPoFk#oYU&I*5s(;)&Gm^AA4~lV`Eu3fw46 zWuuevsT&mXOg{?{>-uwn2F-F_YPQ7&^9-xHK&<}nz9-P=YJOUI*lW7QoJ{mvEi?Ie zBiwHn+S7u3=tWINl%*OPAUCDdUGZRmws|{=y^s2}dR_Q9y?eyFa-81H>$&7S(}G{0 z7hz6a^eZQwUy!;E#i_u)nD<4nFG(394W(uTD7hOW%F0Sa%e&5wQb z7|2CnSL`n?qsHhsAs}QHQ*XqkHYvE0Go1^}9V|YhA#r;-$A2eCBpyw-S z&S|H^@y0pR1mrcAn?U>f%*dh0nBJK@2!|kT&N${$NyvG@I)ptDNdX|8QUG5EZ0--T zOMFcqKH-GOwbhm&udo1gl%Z=7Vb=sFFcGykp8vnmLV}H!a5sT359GuMtk?U6;!AlE_K|BUbd z(^CPisT&6E)9?hBzmsptPC7vj)xOqiC%T@o+4PQg5dic&^opUEz!}*@x9J>hY8O{kL9qIwLy8!g<7OL{x z{WVzcH$j|j4fvSm?p(x;m@7l&zwo_w3{T4ELL*s;e51f2@EtmrAQS&tBmuiO?`D$X zS|>|PShy4$$`o57Xw5(U;5J>hh>!}QLK_eH17WEsgdPuGetC|Hd7<&a%w`U~&kOm2 zBYn$8J%sQ*-WcomV8q9JrUPnZ{nQ5*d64?60d?FBBri3S(DWL<>3D_0$?_p5g*4Fk zEm)Vt8@HSMkb#2Nw16p702zIciq8ASLYw5+w(^NX&M=#XJx@e~U>^hEdP`&)$^wEI zgnG@BvA++!w;b{9Lh%>$&`C1HukUMEiolG1JX6wj)m;uw@~Pm2$b8$r28003@#+QW zo%}mLL-HQJKrThwGj_;b1LDbiEC>i(abU*2VI}Sq&xcEHsa&IF#6nGDg0tAqA9}t3 z13IsU-t{ye)AL31S=O39TOi&>U<|-8l<@_dRg|X%b5V`wLvK32r2*JYNwPB;9OS1! zy~GODeUB6xK>-yE;`KC?>oj{THs`jnGpjQ~#a`Zo^83Kf8`Uj9O7RNXF9#)wt4qtA zvdoFZ$4KpSEplRX2K-zc_^C8=&xmNz^aVf`tXLV#=o>njQCX7H(51`3nU6Hb=`=N1 z5-EPb%2;c$`V6jG3<0F@Bi6_VB@9E*X$nlS(5OC98OnSd9IeY2$V)xZaM zm4S1SL)asWffV5W;~EcNBBW8b!rr<&*SSYka4HCGUz2FClb}P`^6-Er|BGR)6-gm1m+%a`RFHC+jcrrq|)mh;g`HDHH$t+9A1o1bJjA}|TayW9_dzF$%i zKR?rU?TTS&T_t@kXSKMJhxd50D=?@`p#k?zI??8U^qY;hEYm_abqfi0~O_}haKm8D6?JU#5-D|P?Zu$1_g?IHo zk>h`|#=c}~j|Vl3MoKR(DH>CYRpoBdSujLqbs&D~4+@EXqZe0)y9iqijLQV(n!NJY zI1x}6G*haU8g)F1H&fb*Q6ZZf`!asjI&&v4X7O$ezeEc!DE1f8%^Gie7>+>f^v&RT zyDF<0D#slYFWYsfHn|!^nV+ROYK+wm^bX0sPj=^%{dNYoY3!5#~V?s&m+pC zwV85vRhFe!>Q~I>UaU@D&*K9k>uKlO!r-L`ja(SkdE^l3NL!*kL+wkXb1Umw|CC$U z%krlEdaEvO-1Dg(X4BjsSIu?Xd(JyR=gsczlyj^xM4NlaQ#Pmm&>u zBsdmDBUKQ~1q2Rpse|z65%S|L04>}|>E614i+rH2juv6Z%mbv&H&s&)I%1hZ|!S57-c6F&bqHHmmA6IfJbApAA_WH8HxjzM4L z6IWcY*3Vo7k#}>qkQc^x#@GZW z460iXrjC+kCc9$tKORLt9^&F{a27Fk{l(}~4&tXm2}PN9=;oUgx8Xm()Uq;foLBhc{p zpbs!ouJ9BFU1uB@Db$FUT9R&#w(q)t=;Gs{=XxHgh-8OtnIG$Y#4PJd4ff(;!`054 zM~Eb~FP*@wnvjp32D}ZL#hCjAr5OKO3nKJ!7y}geRWwe*RQ0gKApmEBX*{utv%hi* zByc%IG|fjj@W(Nwm(?X2K))#ry{QpsXmdQRgOg4>s&kS$k0%C)7#Bj}8f*bbXOAcc zG?LyCA)A~L;k0wE))hlLaSjWv9dwu_>i}Sbd`l@|+KTzkW-LGqh`r3Zw9RI3^U(}S zDxi1jufM`s?=q~!qH0zrT{!)q{w;+2OL<&wt_F329aT1g>lILMnbC~@S1rXowR;OH zUdNo202)nMnZ$-YLy+Ls07#z{2N2%V*|b#)Ka26kO-GA^8Urfu55V)x+vQF|h1q-` zA&D589Vkfu+Xk0^*YrX>7fEZ#028HJQ|NPZPL}9C!$(P(gPMRkD=IwoCTr5yS_Z$* zO)!^e+ywyS4S82KvKblQTamuhB&;*A33AictBade3BcuD4imrUyjfS)g6v|}G{E}~BqX|@~F7Duy5W=^z z_f!4n$H&0KNq@?XY&lPoGXfUw<{Z3>3P9!JHZPTt;`R z8`pf2;u*l@BDS%Af>O7 z>W1EB#`vk|4gR&11T}ma5U71|p_y1kj`Lq6WhGEcHOc|~c8vuY4$M?XWoCx?1KTi} zO#NJP8ZiqE`~B=v?9Z+?i=!7q?2y^acxO8Ci`2z?tX7}bX9mf`?I2hF(g?3Rm}xT1 zI1~A|XGVTCU}q#PqJH_XVP{RZ3(SW+*sF# zTYbZ=xM=%({W2?t-h?dm`jSUmYjXOd&k5KEvpKqEnb>9P`i_0*j~Qp8eWlhRoF!Mw zM@_)?hu_LRq{ovs-mw}%b}5UKdies-7bN^&gRd%3Cn_eo>Oepj{u!Rz0$w=sKaPRC zk^sKd_wB&8j<(4U7Y*bA*8q2UvH8}XT{fh?>>*IEiA*v|vl?cmSmkSC3#qUtrjbTj zR=$o&3^L zMHbi1U`?3s1f80G)4^l?mXo8U6Qlk#6wO^9olx6rEWChkfehb12nu$QoZx}P>~~`# zb{^}VLO*=v_IsGqN@y5>Z%he~A>n;(T-IvhQF1r9Fc?{;Rw;jj z+w?=2-0pVYACe`q& zrjV&w?v@=#)IjUb&V0hk){%S7b>MwP$EJ2K?fV;`r9wFRRGhTB{~ml9~pHK2Yi9|AjjSGS)7jDDBTynm-dy0a{B3 zO|V*CSVN1pN{!8A%P+D zAr8!nXb}KWS*zp0g#Om>IPCGxuC9so^ZpMqO5RA4pz zf3AtCBRo={2|qoEJEB(~%t`I0wHWX&w$PsR>~w*0Tf(3E`_R6mG0BH|GIfx%L<6C8 zO^OhTolO5SD2Xl<$GF#E-zf(w3y6>Ejy=_r{Guaa%4j^X-gKw_brkaBGSJCUqIee) zlf3^YO#=Kt5nTpIQ*sAABs}=Z#fSe6Cj5NX+Q!Gt@5cvB!{PK6AZ1#0ptk85_~GvI zyy2gwY+4%31ON71B>i43R?xL4lV;Q7Vb|T$pML3$iXA$ODX=fStY6N=@_@!UCpOfpbOviV zULz_To?iM#?i*Xvl*Y)1o!s(|GR2g0w;to7=0l=|#n$Tm2ygv=^w29W zi#w^mt2p#r&CIeXj~9WDml!mp(3E@CFDE6$;Z4)-T^n_O*cGGK%}y&VO!6^x9_T}R zJlVe1dXlzQ#(~JHW*jKnsh}F?#$a0wA6%wskF1{snsRs=jh3@A%ye-}mSN0gE4l)2 zZ{hHAs*SN8P`oAth4bQ!OCQV7P|#8^1yjt%{btAL_SzMRrk@K5&X3xa!yqy{Qy;Dj za;W>D1{zQ!!D%u-Q5jAz8-C<&aV{&~His`5962S82roPd5bo3iIE=Wjgc^4(okMJkQawg{ADl+VD4S@PcqbtHo>sF0D&Z<1}H+${TwY;7nXla z$iAPoD3owXui}Q#Z^7_rZ#X!%4Z_?Z(R0jN}*iU5l{iq$$Mu>J*1$U_? z*ecu`_cu!3S=H7r_-j0fzcrI7a-aVwnfOdm8rSW50BjLJgQC#E^W-r6_Vb=YwROu7 zi%8-cQK%(QzA%11W^jJfn8B@1o|wQqhc-A9YZ^-7d-|n`8ET>)R{#SK0GN82A*++y zen+gU&Y1^Edwqc^f3tCVAbh&At9~QaD11Y=O6m)oROvpC(kFJ4dsl*3GJrZ0&>E0s zMXv)74V!Ck>u`vb`srQ-*L8U;1^Spe>(uKoFJ)dznUAd(24s|U&6B1v_mF$2V{q4B zXx+dC*r?Q>QKwPtYTl|n1J<_rSpI!`lS+|oyxJl7JxF!?r z9OZsxxo`BO9xGk1a@_qJeksp?5)^4Y8jBQ|N22kct=XGCQi_{h?VLpj&)jXz=!%*7 z5~m}%(J%puocb*Td(Cz~Ll|NiR1G)ajl=27l%*!I4>l!<;-uQ3KB9m$jQ?2mPw_ET zxZ*!A2=l)};&ZecOV!{T9DuAHw>UA0s*oK5mI6{g-U%VsVh6;k@f3&;ZeTSQTDGFi}HaDqB>!smJz2ov4mHeVKUZ)d$q*R}tE%C`Q~QWBXO3 ztHIHBUZ@-fb;%rztPWb~7@$fyaBrftP*F#W-*1*#4Zn~tRt9vq{z?bAFB+)prlEV7 z2J)9IhfvR7*pGOCoNpZtKq2#EYfmK4HjOW2YY2NtJK!dp-+IRvUx$%IpHbCB z7Cu3YNSk8#b!fM684rokgO*_cdZ|hqN9-rxFrb5_%?9!RBnA%-pvUvlqPeToy!XFO zz?C`_za0$<$<@G(x zC&^l64M1ux3WAoquZDUFQj`_y!0kv+-r(Hw7_8%k?l({Pb+E(cDx=7qx z$B!`-_KVq+SBIbzdU=XBb3CIY=8WOgthbGB3(8bfvltKGz?Ee3H~ymVoZmSA%DPpa z-T00)zWtNLkhz!>55#q*U8BAB={t@_fko-%Jp9-j89X7<0O6?-6r#?$D01k|4n#8_J>y3IBw{rQyJEx5o)#$&tOSdn|qcO`uA6_?O#$zSs zKydZ=@B%q1@MiiS4v9>7|7qCwxTTjbUN5c-M+Z%CO`?qm?qtdRWfq-)r zQ?d0J7+ca?FT9-QGPue-MSgo?=LLye0rH^-Q? zIh{UF)6a&;4U(m3iv!t|Fp!l=o?--r8jBCQv_pxV`9w#})Q1I#!M)8}`(#(dfy!h* zD^Nkw>B0sI9)+U5>p2rCP+G%OAjcv5z6%~aHDP75nd)O(UfXYCxD1kFXCRiw%I_cQ z#QwPWJsB-2{Yky|zfo5I?GS)vaX#cApbfVWpbV5I{u)*v1E^mCFefpl#V)Jw1pJ?l zuc-jw_%spap&I_&pYnxu)iN2dmH9RR4CS`t7Q7FPJiuX}yV1@OG#@Y4dV3g(;GC^J zQk8j0OupibB-iVhjR*V2U2^gf`G+3zujMXBra$-a7&zG%=!I<$BLV;@li)*;-?f;K zoTtsAW*`5=tp~)94$fSw64?RopV?$-V1Mj{h;QoTryB7&swA#&s${+*lt8St?*O_m z|CW#nRfj$yT+*i~wi=2)xQOMjKJO3`+uAp{7NXu-@{ri#nueXk!s~F8Jie(c9C)lB z=X6N@Jd=dsHLeFNAiZ4RTLlEkdv`d{JXKI%(o2wV9C%FUWSPO3)qL_9fCv+5h~Er7H6hpf@mJQrxFq3tF%L ioyL^=z4GIn5+U$p>x>H}4*UWPq=nE^t5mrk^?v|sy92TS literal 0 HcmV?d00001 From d4a654b086738d724d9dc72948c5539fa88840a3 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 17:45:30 +0200 Subject: [PATCH 40/49] CMake: Fix documentation --- CMAKE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMAKE.md b/CMAKE.md index 05f98c96533..f92f16ebc83 100644 --- a/CMAKE.md +++ b/CMAKE.md @@ -5,7 +5,7 @@ Setup steps for a completely new OF project: - - Create the following file structure: + - Create the following file structure: ![cmake-example-layout](assets/cmake-example-layout.png) As you can see it is very concise. - [CPM.cmake](https://github.com/cpm-cmake/CPM.cmake): Just [download the latest release](https://github.com/cpm-cmake/CPM.cmake/releases/latest) and place it in the cmake folder. From cbcd0af467cb30b4cf734ce26c0395716209aad8 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Mon, 24 Apr 2023 18:00:39 +0200 Subject: [PATCH 41/49] CMake: Minor documentation tweaks --- CMAKE.md | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/CMAKE.md b/CMAKE.md index f92f16ebc83..b6751dd967b 100644 --- a/CMAKE.md +++ b/CMAKE.md @@ -46,7 +46,7 @@ Setup steps for a completely new OF project: # The actual executable to build add_executable(ofExample ${SOURCE_FILES}) - source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCE_FILES}) + source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "" FILES ${SOURCE_FILES}) # Group into Folders in VS # C++ version of the project (independent from the version OF is built with) target_compile_features(ofExample PUBLIC cxx_std_17) @@ -81,7 +81,7 @@ And in `include/pch.hpp`: #define PCH_HPP #include "ofMain.h" -// And any other common header files that do not change +// And any other common header files that do not change frequently #endif //PCH_HPP ``` @@ -110,18 +110,19 @@ An output directory including all resources and shared libraries it depends on, ## Visual Studio (and multi-config build systems) -The following instructions are for building openFrameworks itself, in the root directory of the repository. Make sure to download a nightly build as soon as CMake support is available, as the main repository takes tremendously longer to download. +`-j` has no effect in Visual Studio, it automatically uses all available cores. -Visual Studio automatically uses all available cores. - -In the following examples, we always use cmake like `cmake ..` in the build folder. However, you can also use following signature: +In the following examples, we always use the command `cmake ..` in the build folder. However, you can also use following signature: `cmake -S source_dir -B build_dir`. This way the current working directory is irrelevant and the two directories can be anywhere (especially useful for CI toolchains). -### Building in IDE +### Building inside the VS IDE Open the generated `openFrameworks.sln` in your build folder with Visual Studio. Then, just build it like any other VS project. Right-click a project and click on `Set as Startup Project` to be able to run it with F5. -### Building in the terminal +Remember not to change anything in the project setting, as it is overwritten by CMake. Every change must be done +in CMake to keep it cross-platform. + +### Building VS project from the terminal You can also build Visual Studio projects without actually opening Visual Studio, by the use of MSBuild. CMake does all of that for you. @@ -129,7 +130,7 @@ Note that configurations in Visual Studio work a bit different compared to makef #### Build all examples ```bash -# in root directory of openFrameworks +# either in root directory of openFrameworks, or setting -DBUILD_EXAMPLES=ON mkdir build cd build cmake .. @@ -141,17 +142,17 @@ cmake --build . --target=build_all_examples --config=Release # Or 'Debug' Replace `ofNodeExample` with the project name of the example. ```bash -# in root directory of openFrameworks +# either in root directory of openFrameworks, or setting -DBUILD_EXAMPLES=ON mkdir build cd build cmake .. cmake --build . --target=ofNodeExample --config=Release # Or 'Debug' ``` -#### Run tests +#### Run all tests ```bash -# in root directory of openFrameworks +# either in root directory of openFrameworks, or setting -DBUILD_TESTS=ON mkdir build cd build cmake .. @@ -166,7 +167,7 @@ In the VS IDE, building RUN_TESTS (in CMakePredefinedTargets folder) does the sa #### Building all examples ```bash -# in root directory of openFrameworks +# either in root directory of openFrameworks, or setting -DBUILD_EXAMPLES=ON mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Release # Or 'Debug' @@ -176,17 +177,17 @@ cmake --build . --target=build_all_examples -j #### Building specific example ```bash -# in root directory of openFrameworks +# either in root directory of openFrameworks, or setting -DBUILD_EXAMPLES=ON mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Release # Or 'Debug' cmake --build . --target=ofNodeExample -j ``` -#### Run tests +#### Run all tests ```bash -# in root directory of openFrameworks +# either in root directory of openFrameworks, or setting -DBUILD_TESTS=ON mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Release # Or 'Debug' @@ -209,20 +210,19 @@ If [Visual Studio](https://visualstudio.microsoft.com/de/downloads/) is installe Thus, you can build using CLion's excellent IDE, while the Visual Studio compiler is used under the hood. This results in the most robust development experience on Windows. -MinGW support (especially for CI) and more is yet to be finalized by you! :) +MinGW support is waiting to be implemented! ## Visual Studio Code When working with Visual Studio Code, the default C++ extensions are recommended, as well as the CMake extension from Microsoft. -See the CLion section above, as the same applies to VS Code. The CMake extension simply invokes CMake, which then uses MSVC under the hood. -The CMake extension's panel in the left bar allows you to build and run targets. +See the CLion section above, as the same applies to VS Code. The CMake extension simply invokes CMake, which then uses MSVC under the hood, just like CLion. -This means you can also build and run directly in VS Code, very similar to CLion. +The CMake extension's panel in the left bar allows you to build and execute targets directly in VS Code. # Known issues - - Currently, all shared libraries are always copied to the target location, even if they are not linked - - And only shared libraries of the apothecary are copied, not from system dependencies + - Currently, all shared libraries are always copied to the target location, even if they are not linked (including both debug and release versions) + - And only shared libraries from apothecary dependencies are copied, libraries from other dependencies are not # Yet to be done @@ -265,7 +265,7 @@ Feel free to contribute to make this list shorter, Happy Coding! > > cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/$USER/android-ndk-r25c/build/cmake/android.toolchain.cmake -DANDROID_ABI=x86_64 > -> AT LEAST CMake 3.19 !!! +> AT LEAST CMake 3.19 !!! (better latest which is 3.26 at the time of writing) > > To update cmake: > deb http://deb.debian.org/debian bullseye-backports main # put this into /etc/apt/sources.list From 4e66b875a078f0058af54438003641daf2db3421 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Tue, 25 Apr 2023 20:19:14 +0200 Subject: [PATCH 42/49] CMake: Implement assimp example changes --- examples/3d/3DModelLoaderExample/CMakeLists.txt | 2 -- examples/3d/CMakeLists.txt | 3 +-- examples/3d/assimp3DModelLoaderExample/CMakeLists.txt | 2 ++ examples/3d/assimpExample/CMakeLists.txt | 2 -- 4 files changed, 3 insertions(+), 6 deletions(-) delete mode 100644 examples/3d/3DModelLoaderExample/CMakeLists.txt create mode 100644 examples/3d/assimp3DModelLoaderExample/CMakeLists.txt delete mode 100644 examples/3d/assimpExample/CMakeLists.txt diff --git a/examples/3d/3DModelLoaderExample/CMakeLists.txt b/examples/3d/3DModelLoaderExample/CMakeLists.txt deleted file mode 100644 index 4a5a9ac160b..00000000000 --- a/examples/3d/3DModelLoaderExample/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -define_example(3DModelLoaderExample) -target_link_libraries(3DModelLoaderExample of::ofxAssimpModelLoader) \ No newline at end of file diff --git a/examples/3d/CMakeLists.txt b/examples/3d/CMakeLists.txt index f3e0d24a162..ecf48791b0d 100644 --- a/examples/3d/CMakeLists.txt +++ b/examples/3d/CMakeLists.txt @@ -1,7 +1,6 @@ -add_subdirectory(3DModelLoaderExample) add_subdirectory(3DPrimitivesExample) add_subdirectory(advanced3dExample) -add_subdirectory(assimpExample) +add_subdirectory(assimp3DModelLoaderExample) add_subdirectory(cameraLensOffsetExample) add_subdirectory(cameraParentingExample) add_subdirectory(cameraRibbonExample) diff --git a/examples/3d/assimp3DModelLoaderExample/CMakeLists.txt b/examples/3d/assimp3DModelLoaderExample/CMakeLists.txt new file mode 100644 index 00000000000..1bd82a69516 --- /dev/null +++ b/examples/3d/assimp3DModelLoaderExample/CMakeLists.txt @@ -0,0 +1,2 @@ +define_example(assimp3DModelLoaderExample) +target_link_libraries(assimp3DModelLoaderExample of::assimp) \ No newline at end of file diff --git a/examples/3d/assimpExample/CMakeLists.txt b/examples/3d/assimpExample/CMakeLists.txt deleted file mode 100644 index 84d5b545f75..00000000000 --- a/examples/3d/assimpExample/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -define_example(assimpExample) -target_link_libraries(assimpExample of::ofxAssimpModelLoader) \ No newline at end of file From 859798db9293431891346590dbc932bd03944097 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Tue, 25 Apr 2023 20:24:32 +0200 Subject: [PATCH 43/49] CMake: Add more documentation --- CMAKE.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CMAKE.md b/CMAKE.md index b6751dd967b..43b7cc367f7 100644 --- a/CMAKE.md +++ b/CMAKE.md @@ -108,6 +108,16 @@ An output directory including all resources and shared libraries it depends on, ![cmake-example-output](assets/cmake-example-output.png) +## Choosing the target platform + +When not doing anything special, CMake will try to detect the target platform and then choose the correct binary package. However, in case it cannot determine it or if you want to choose a different target platform, this is how you can set it: + +```bash +cmake .. -DOF_TARGET_ARCHITECTURE= +``` + +Simply run the command with an arbitrary value and it will print an error message with all possible values. + ## Visual Studio (and multi-config build systems) `-j` has no effect in Visual Studio, it automatically uses all available cores. From c8aa476a2284a42d3f41a6cc6d7c11675e0eb37d Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Tue, 25 Apr 2023 20:30:10 +0200 Subject: [PATCH 44/49] Minor adjust gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bdf85ed271e..0de188da7b0 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,7 @@ apps/* # general ######################### -[Bb]uild/ +[Bb]uild*/ [Oo]bj/ cmake-build-*/ *.o From 26368dd2de111cd236d7fb5478dc2928b1edd4ac Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Tue, 25 Apr 2023 20:49:26 +0200 Subject: [PATCH 45/49] CMake: Work around another inconsistency on macos --- cmake/download_and_link_deps.cmake | 39 ++++++++++++++++-------------- cmake/import_deps.cmake | 2 +- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/cmake/download_and_link_deps.cmake b/cmake/download_and_link_deps.cmake index e3c027a3173..4576a435eb8 100644 --- a/cmake/download_and_link_deps.cmake +++ b/cmake/download_and_link_deps.cmake @@ -80,18 +80,21 @@ function(get_packages_and_link) message(STATUS "[openframeworks] Skipping check of ${dependency} to save build time. To force a re-download, delete CMakeCache.txt and re-run cmake.") endif() - # Now, create the targets and link all files to them - set(PACKAGE_SOURCE_DIR ${of-deps-${dependency}_SOURCE_DIR}) - file(GLOB deps "${PACKAGE_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 () + 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} ${PACKAGE_SOURCE_DIR}) - endforeach() + 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) @@ -158,18 +161,17 @@ endif() # Find system packages if (NOT OF_TARGET_ARCHITECTURE MATCHES "android") find_package(OpenGL) - if (NOT OpenGL_FOUND) # This should never be not found on windows - message(SEND_ERROR "Dependency OpenGL not found. On Linux, please install it using your system's equivalent of 'sudo apt install libgl1-mesa-dev'") + if (NOT OpenGL_FOUND) + if (WIN32) + message(SEND_ERROR "Dependency OpenGL not found. Please try to update your graphics drivers!") + else() + message(SEND_ERROR "Dependency OpenGL not found. Please install it using your system's equivalent of 'sudo apt install libgl1-mesa-dev'") + endif() endif() target_include_directories(openframeworks PUBLIC ${OPENGL_INCLUDE_DIRS}) target_link_libraries(openframeworks ${OPENGL_LIBRARIES}) endif() -if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # All Linux-only packages (that are part of apothecary on all platforms except Linux) - include(${CMAKE_CURRENT_LIST_DIR}/find_linux_deps.cmake) - find_linux_deps() -endif() - # TODO: Now, download glut since it's somehow not part of the apothecary. Glut support seems to be deprecated @@ -217,6 +219,7 @@ 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 diff --git a/cmake/import_deps.cmake b/cmake/import_deps.cmake index c4be0cc2b27..e455d597625 100644 --- a/cmake/import_deps.cmake +++ b/cmake/import_deps.cmake @@ -43,7 +43,7 @@ endfunction() # This function is called for every dependency in every package, e.g. 'boost', 'freetype', 'libcurl', etc. # It creates the CMake target for each dependency and adds the library files to the targets -function(import_dependency DEP_NAME DEP_ROOT PACKAGE_SOURCE_DIR) +function(import_dependency DEP_NAME DEP_ROOT) # Find all the library files in one dependency file(GLOB_RECURSE libraries "${DEP_ROOT}/**/${CMAKE_STATIC_LIBRARY_PREFIX}**${CMAKE_STATIC_LIBRARY_SUFFIX}") From 96c7733cd221ab494cc4596d55e9b5ab11d2fac4 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Tue, 25 Apr 2023 20:53:34 +0200 Subject: [PATCH 46/49] CMake: Fix linking for assimp3DModelLoaderExample --- examples/3d/assimp3DModelLoaderExample/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/3d/assimp3DModelLoaderExample/CMakeLists.txt b/examples/3d/assimp3DModelLoaderExample/CMakeLists.txt index 1bd82a69516..cecd66f7602 100644 --- a/examples/3d/assimp3DModelLoaderExample/CMakeLists.txt +++ b/examples/3d/assimp3DModelLoaderExample/CMakeLists.txt @@ -1,2 +1,2 @@ define_example(assimp3DModelLoaderExample) -target_link_libraries(assimp3DModelLoaderExample of::assimp) \ No newline at end of file +target_link_libraries(assimp3DModelLoaderExample of::ofxAssimpModelLoader) \ No newline at end of file From b84ad46f818b9c0fdc862ccddf52a87ed3a5f4ed Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Sat, 3 Jun 2023 06:59:15 +0200 Subject: [PATCH 47/49] CMake: Improve Readme documentation --- CMAKE.md | 5 ++--- README.md | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMAKE.md b/CMAKE.md index 43b7cc367f7..0b305a862af 100644 --- a/CMAKE.md +++ b/CMAKE.md @@ -99,7 +99,6 @@ This has the effect that these libraries are 'precompiled', which is taking a lo ``` - For Visual Studio IDE, skip the last command and open the generated `ofExample.sln` - - For Visual Studio in the terminal, replace the last command with just `cmake --build .` - For CLion and vscode, just open the root `CMakeLists.txt` in CLion or vscode with CMake extension, no terminal commands needed. #### This results in: @@ -208,14 +207,14 @@ ctest -C Release # Or 'Debug' ## Jetbrains CLion When starting with CLion, you do not generate anything with CMake. It's the opposite: You open your root CMakeLists.txt in CLion, -which then calls CMake for you. Time to relax. +which then calls CMake for you. CLion is especially useful when it comes to unit tests due to its excellent support for CMake CTest. ### CLion on Windows Currently, MinGW/MSYS2 is entirely unsupported. If you want to use CLion on Windows, you must use the Microsoft MSVC toolchain -(Visual Studio), which is also faster and more reliable than MinGW or MSYS as it's native. +(Visual Studio), which is also faster and more reliable than MinGW or MSYS. If [Visual Studio](https://visualstudio.microsoft.com/de/downloads/) is installed, it is automatically recognized in the CLion toolchain settings. Thus, you can build using CLion's excellent IDE, while the Visual Studio compiler is used under the hood. This results in the most robust development experience on Windows. diff --git a/README.md b/README.md index f108ddf3933..198681dc728 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,8 @@ We also have a developer's mailing list, which is useful for discussing issues a ## Working with CMake -Using CMake will give you the best possible experience when working with openFrameworks. There is an entire page dedicated to [CMake support](CMAKE.md). +CMake support is a new feature, which allows to build openFrameworks out of the box. It also allows CLion to be used as an IDE. +There is an entire page dedicated to [CMake support](CMAKE.md). ## Developers From 4532d60e25ab9cd9e4871f7baeb13b7ec44b5be6 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Wed, 20 Dec 2023 01:05:29 +0100 Subject: [PATCH 48/49] Remove CPM.cmake and add first steps towards Conan support --- CMakeLists.txt | 31 +- addons/CMakeLists.txt | 4 +- addons/ofxAssimpModelLoader/CMakeLists.txt | 4 +- addons/ofxKinect/CMakeLists.txt | 3 +- addons/ofxOpenCv/CMakeLists.txt | 10 +- addons/ofxPoco/CMakeLists.txt | 4 +- addons/ofxSvg/CMakeLists.txt | 5 +- cmake/CPM.cmake | 1131 ----------------- cmake/download_and_link_deps.cmake | 372 +++--- cmake/utils.cmake | 18 +- conan/libdom/CMakeLists.txt | 219 ++++ conan/libdom/conanfile.py | 31 + conan/libparserutils/CMakeLists.txt | 35 + conan/libparserutils/conanfile.py | 28 + conan/svgtiny/CMakeLists.txt | 0 conan/svgtiny/conanfile.py | 27 + conanfile.py | 54 + examples/CMakeLists.txt | 2 +- examples/input_output/CMakeLists.txt | 4 +- .../input_output/pdfExample/CMakeLists.txt | 2 +- examples/templates/CMakeLists.txt | 2 +- tests/CMakeLists.txt | 2 +- 22 files changed, 642 insertions(+), 1346 deletions(-) delete mode 100644 cmake/CPM.cmake create mode 100644 conan/libdom/CMakeLists.txt create mode 100644 conan/libdom/conanfile.py create mode 100644 conan/libparserutils/CMakeLists.txt create mode 100644 conan/libparserutils/conanfile.py create mode 100644 conan/svgtiny/CMakeLists.txt create mode 100644 conan/svgtiny/conanfile.py create mode 100644 conanfile.py 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) From 82f7da66b2e9708331de2608244e240e97c52dd1 Mon Sep 17 00:00:00 2001 From: HerrNamenlos123 Date: Fri, 22 Dec 2023 10:24:57 +0100 Subject: [PATCH 49/49] CMake: Add more Conan packages --- CMakeLists.txt | 40 +++++++++++++------------ conan/libtess2/CMakeLists.txt | 34 +++++++++++++++++++++ conan/libtess2/conanfile.py | 33 ++++++++++++++++++++ conanfile.py | 22 +++++++------- libs/openFrameworks/CMakeLists.txt | 4 ++- libs/openFrameworks/utils/ofConstants.h | 4 ++- 6 files changed, 104 insertions(+), 33 deletions(-) create mode 100644 conan/libtess2/CMakeLists.txt create mode 100644 conan/libtess2/conanfile.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 776e31e293a..5c4e0001eb5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,23 +22,7 @@ add_library(of::openframeworks ALIAS openframeworks) # This is another CMake script that adds the header locations and source files 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) - - -# 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) @@ -47,6 +31,27 @@ find_package(curl CONFIG REQUIRED) find_package(freetype CONFIG REQUIRED) find_package(pugixml CONFIG REQUIRED) find_package(nlohmann_json CONFIG REQUIRED) +find_package(glew CONFIG REQUIRED) +find_package(glfw3 CONFIG REQUIRED) +find_package(cairo CONFIG REQUIRED) +find_package(libtess2 CONFIG REQUIRED) + +target_link_libraries(openframeworks PUBLIC + glm::glm + utf8cpp + freeimage::freeimage + uriparser::uriparser + CURL::libcurl + Freetype::Freetype + pugixml::pugixml + nlohmann_json::nlohmann_json + GLEW::GLEW + glfw + cairo::cairo + libtess2::libtess2 +) +message(STATUS "glm_INCLUDE_DIRS_RELEASE: ${glm_INCLUDE_DIRS_RELEASE}") +target_include_directories(openframeworks PUBLIC ${glm_INCLUDE_DIRS_RELEASE}) # C++ standard version and disabling non-standard compiler specific features target_compile_features(openframeworks PUBLIC cxx_std_17) @@ -58,9 +63,6 @@ target_compile_definitions(openframeworks PUBLIC OF_USING_STD_FS # Use the new C++17 filesystem library instead of boost UNICODE # WinAPI setup _UNICODE - CURL_STATICLIB - POCO_STATIC - CAIRO_WIN32_STATIC_BUILD ) # Compiler flags specific to MSVC diff --git a/conan/libtess2/CMakeLists.txt b/conan/libtess2/CMakeLists.txt new file mode 100644 index 00000000000..3bbcf6f9eed --- /dev/null +++ b/conan/libtess2/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 3.16) +project(libtess2) + +set(LIBTESS2_SOURCES + source/Source/bucketalloc.c + source/Source/bucketalloc.h + source/Source/dict.c + source/Source/dict.h + source/Source/geom.c + source/Source/geom.h + source/Source/mesh.c + source/Source/mesh.h + source/Source/priorityq.c + source/Source/priorityq.h + source/Source/sweep.c + source/Source/sweep.h + source/Source/tess.c + source/Source/tess.h +) +add_library(libtess2 STATIC ${LIBTESS2_SOURCES}) +add_library(libtess2::libtess2 ALIAS libtess2) +target_include_directories(libtess2 PUBLIC source/Source source/Include) +target_compile_features(libtess2 PUBLIC c_std_99) + +set_target_properties(libtess2 PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib + ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/lib + ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}/lib + ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/lib + LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/lib + LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/lib + LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}/lib + LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/lib +) diff --git a/conan/libtess2/conanfile.py b/conan/libtess2/conanfile.py new file mode 100644 index 00000000000..2e72962e844 --- /dev/null +++ b/conan/libtess2/conanfile.py @@ -0,0 +1,33 @@ +from conan import ConanFile +from conan.tools.scm import Git +from conan.tools.files import copy +from conan.tools.cmake import CMake +from os.path import join + +class LibTess2Conan(ConanFile): + name = "libtess2" + version = "1.0.2" + 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="https://github.com/memononen/libtess2.git", target="source") + git.folder = "source" + git.checkout("v1.0.2") + + def build(self): + cmake = CMake(self) + cmake.configure(build_script_folder=self.export_sources_folder) + cmake.build() + + def package(self): + copy(self, "*.h", join(self.source_folder, "source", "Include"), join(self.package_folder, "include")) + copy(self, "*.lib", join(self.source_folder, "lib"), join(self.package_folder, "lib")) + copy(self, "*.pdb", join(self.source_folder, "lib"), join(self.package_folder, "lib")) + copy(self, "*.a", join(self.source_folder, "lib"), join(self.package_folder, "lib")) diff --git a/conanfile.py b/conanfile.py index 1c707f14a86..6a3f714a76a 100644 --- a/conanfile.py +++ b/conanfile.py @@ -11,7 +11,7 @@ class OFConan(ConanFile): generators = "CMakeDeps", "CMakeToolchain" settings = "os", "compiler", "build_type", "arch" - def include_package(self, name, version): + def include_package(self, name): 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) @@ -40,15 +40,13 @@ def requirements(self): 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("glew/2.2.0") + self.requires("glfw/3.3.8") + self.requires("cairo/1.18.0") + + # self.include_package("svgtiny") + # self.include_package("libdom") + # self.include_package("libparserutils") + self.include_package("libtess2") + self.requires("libtess2/1.0.2@user/stable") #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/libs/openFrameworks/CMakeLists.txt b/libs/openFrameworks/CMakeLists.txt index 0386db65178..10678daf72d 100644 --- a/libs/openFrameworks/CMakeLists.txt +++ b/libs/openFrameworks/CMakeLists.txt @@ -11,6 +11,8 @@ foreach(objc ${OBJC_FILES}) list(REMOVE_ITEM SOURCES ${objc}) endforeach() +list(REMOVE_ITEM SOURCES ${CMAKE_CURRENT_LIST_DIR}/app/ofAppGlutWindow.cpp) + target_sources(openframeworks PRIVATE ${SOURCES}) target_include_directories(openframeworks PUBLIC ${CMAKE_CURRENT_LIST_DIR}) source_group(TREE "${CMAKE_CURRENT_LIST_DIR}/" PREFIX "src" FILES ${SOURCES}) @@ -22,4 +24,4 @@ foreach(subfolder ${subfolders}) if (IS_DIRECTORY ${subfolder} AND NOT ${sub_name} MATCHES "^\\.") target_include_directories(openframeworks PUBLIC ${subfolder}) endif() -endforeach() \ No newline at end of file +endforeach() diff --git a/libs/openFrameworks/utils/ofConstants.h b/libs/openFrameworks/utils/ofConstants.h index ca67ab686e7..8717123b024 100644 --- a/libs/openFrameworks/utils/ofConstants.h +++ b/libs/openFrameworks/utils/ofConstants.h @@ -136,7 +136,9 @@ enum ofTargetPlatform{ // then the the platform specific includes: #ifdef TARGET_WIN32 - #define GLEW_STATIC + #ifndef GLEW_STATIC + #define GLEW_STATIC + #endif #define GLEW_NO_GLU #include "GL/glew.h" #include "GL/wglew.h"