diff --git a/.gitignore b/.gitignore index 704289a220..d17030cb09 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,9 @@ local-lib /src/TAGS /.vscode/ build-linux/* +deps/build* deps/build-linux/* **/.DS_Store **/.idea/ +.pkg_cache +CMakeUserPresets.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cc8cb577e..dcfe0ca67b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1) option(SLIC3R_PERL_XS "Compile XS Perl module and enable Perl unit and integration tests" 0) option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0) option(SLIC3R_UBSAN "Enable UBSan on Clang and GCC" 0) -option(SLIC3R_ENABLE_FORMAT_STEP "Enable compilation of STEP file support" 1) +option(SLIC3R_ENABLE_FORMAT_STEP "Enable compilation of STEP file support" ON) # If SLIC3R_FHS is 1 -> SLIC3R_DESKTOP_INTEGRATION is always 0, othrewise variable. CMAKE_DEPENDENT_OPTION(SLIC3R_DESKTOP_INTEGRATION "Allow perfoming desktop integration during runtime" 1 "NOT SLIC3R_FHS" 0) @@ -60,6 +60,15 @@ if (SLIC3R_STATIC) set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) endif () +# Dependency build management +option(${PROJECT_NAME}_BUILD_DEPS "Build dependencies before the project" OFF) +option(${PROJECT_NAME}_DEPS_OUTPUT_QUIET "Don't print build output for dependencies" OFF) +set(${PROJECT_NAME}_DEPS_PRESET "default" CACHE STRING "Preset of the dependencies when ${PROJECT_NAME}_BUILD_DEPS is ON") +set(${PROJECT_NAME}_DEPS_BUILD_DIR "" CACHE PATH "Binary dir of the dependencies build when ${PROJECT_NAME}_BUILD_DEPS is ON") +if (${PROJECT_NAME}_BUILD_DEPS) + include(deps/autobuild.cmake) +endif () + if (APPLE) set(CMAKE_FIND_FRAMEWORK LAST) set(CMAKE_FIND_APPBUNDLE LAST) @@ -592,12 +601,12 @@ function(prusaslicer_copy_dlls target) # This has to be a separate target due to the windows command line lenght limits add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/GMP/gmp/lib/win${_bits}/libgmp-10.dll ${_out_dir} + COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/+GMP/gmp/lib/win${_bits}/libgmp-10.dll ${_out_dir} COMMENT "Copy gmp runtime to build tree" VERBATIM) add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/MPFR/mpfr/lib/win${_bits}/libmpfr-4.dll ${_out_dir} + COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/+MPFR/mpfr/lib/win${_bits}/libmpfr-4.dll ${_out_dir} COMMENT "Copy mpfr runtime to build tree" VERBATIM) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000000..a420a85a60 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,44 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "default", + "displayName": "Default Config", + "description": "Building with statically linked dependencies", + "binaryDir": "${sourceDir}/build-default", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "SLIC3R_STATIC": true, + "SLIC3R_GTK": "3", + "SLIC3R_ENC_CHECK": false, + "SLIC3R_PCH": true, + "CMAKE_INSTALL_PREFIX": "${sourceDir}/build-default/dist", + "PrusaSlicer_DEPS_PRESET": "default" + } + }, + { + "name": "no-occt", + "inherits": "default", + "binaryDir": "${sourceDir}/build-no-occt", + "cacheVariables": { + "SLIC3R_ENABLE_FORMAT_STEP": false, + "PrusaSlicer_DEPS_PRESET": "no-occt", + "PrusaSlicer_DEPS_OUTPUT_QUIET": false + } + }, + { + "name": "shareddeps", + "displayName": "Shared dependencies", + "description": "Building with dynamically linked dependencies from the system", + "binaryDir": "${sourceDir}/shareddeps", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "SLIC3R_STATIC": false, + "SLIC3R_GTK": "3", + "SLIC3R_ENC_CHECK": false, + "SLIC3R_PCH": true, + "PrusaSlicer_BUILD_DEPS": false + } + } + ] +} \ No newline at end of file diff --git a/cmake/modules/AddCMakeProject.cmake b/cmake/modules/AddCMakeProject.cmake new file mode 100644 index 0000000000..c2cbad67bb --- /dev/null +++ b/cmake/modules/AddCMakeProject.cmake @@ -0,0 +1,79 @@ +include(ExternalProject) +include(ProcessorCount) + +set(${PROJECT_NAME}_DEP_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/destdir/usr/local" CACHE PATH "Destination directory") +set(${PROJECT_NAME}_DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/downloads CACHE PATH "Path for downloaded source packages.") +option(${PROJECT_NAME}_DEP_BUILD_VERBOSE "Use verbose output for each dependency build" OFF) + +get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) + message(STATUS "Forcing CMAKE_BUILD_TYPE to Release as it was not specified.") +endif () + +# The value of CMAKE_BUILD_TYPE will be used for building each dependency even if the +# generator is multi-config. Use this var to specify build type regardless of the generator. +function(add_cmake_project projectname) + cmake_parse_arguments(P_ARGS "" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN}) + + set(_pcount ${DEP_${projectname}_MAX_THREADS}) + + if (NOT _pcount) + set(_pcount ${DEP_MAX_THREADS}) + endif () + + if (NOT _pcount) + ProcessorCount(_pcount) + endif () + + if (_pcount EQUAL 0) + set(_pcount 1) + endif () + + set(_build_j "-j${_pcount}") + if (CMAKE_GENERATOR MATCHES "Visual Studio") + set(_build_j "-m:${_pcount}") + endif () + + string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type_upper) + set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}) + if (_is_multi) + set(_configs_line "") + endif () + + set(_verbose_switch "") + if (${PROJECT_NAME}_DEP_BUILD_VERBOSE) + if (CMAKE_GENERATOR MATCHES "Ninja") + set(_verbose_switch "--verbose") + elseif (CMAKE_GENERATOR MATCHES "Visual Studio") + set(_verbose_switch "-v:d") + endif () + endif () + + ExternalProject_Add( + dep_${projectname} + EXCLUDE_FROM_ALL ON # Not built by default, dep_${projectname} needs to be added to ALL target + INSTALL_DIR ${${PROJECT_NAME}_DEP_INSTALL_PREFIX} + DOWNLOAD_DIR ${${PROJECT_NAME}_DEP_DOWNLOAD_DIR}/${projectname} + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/builds/${projectname} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:STRING=${${PROJECT_NAME}_DEP_INSTALL_PREFIX} + -DCMAKE_MODULE_PATH:STRING=${CMAKE_MODULE_PATH} + -DCMAKE_PREFIX_PATH:STRING=${${PROJECT_NAME}_DEP_INSTALL_PREFIX} + -DCMAKE_DEBUG_POSTFIX:STRING=${CMAKE_DEBUG_POSTFIX} + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS_${_build_type_upper}:STRING=${CMAKE_CXX_FLAGS_${_build_type_upper}} + -DCMAKE_C_FLAGS_${_build_type_upper}:STRING=${CMAKE_C_FLAGS_${_build_type_upper}} + -DCMAKE_TOOLCHAIN_FILE:STRING=${CMAKE_TOOLCHAIN_FILE} + -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS} + "${_configs_line}" + ${DEP_CMAKE_OPTS} + ${P_ARGS_CMAKE_ARGS} + ${P_ARGS_UNPARSED_ARGUMENTS} + BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE} -- ${_build_j} ${_verbose_switch} + INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE} + ) + +endfunction(add_cmake_project) diff --git a/cmake/modules/Catch2/Catch.cmake b/cmake/modules/Catch2/Catch.cmake deleted file mode 100644 index 0ffe978dc5..0000000000 --- a/cmake/modules/Catch2/Catch.cmake +++ /dev/null @@ -1,175 +0,0 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -#[=======================================================================[.rst: -Catch ------ - -This module defines a function to help use the Catch test framework. - -The :command:`catch_discover_tests` discovers tests by asking the compiled test -executable to enumerate its tests. This does not require CMake to be re-run -when tests change. However, it may not work in a cross-compiling environment, -and setting test properties is less convenient. - -This command is intended to replace use of :command:`add_test` to register -tests, and will create a separate CTest test for each Catch test case. Note -that this is in some cases less efficient, as common set-up and tear-down logic -cannot be shared by multiple test cases executing in the same instance. -However, it provides more fine-grained pass/fail information to CTest, which is -usually considered as more beneficial. By default, the CTest test name is the -same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``. - -.. command:: catch_discover_tests - - Automatically add tests with CTest by querying the compiled test executable - for available tests:: - - catch_discover_tests(target - [TEST_SPEC arg1...] - [EXTRA_ARGS arg1...] - [WORKING_DIRECTORY dir] - [TEST_PREFIX prefix] - [TEST_SUFFIX suffix] - [PROPERTIES name1 value1...] - [TEST_LIST var] - ) - - ``catch_discover_tests`` sets up a post-build command on the test executable - that generates the list of tests by parsing the output from running the test - with the ``--list-test-names-only`` argument. This ensures that the full - list of tests is obtained. Since test discovery occurs at build time, it is - not necessary to re-run CMake when the list of tests changes. - However, it requires that :prop_tgt:`CROSSCOMPILING_EMULATOR` is properly set - in order to function in a cross-compiling environment. - - Additionally, setting properties on tests is somewhat less convenient, since - the tests are not available at CMake time. Additional test properties may be - assigned to the set of tests as a whole using the ``PROPERTIES`` option. If - more fine-grained test control is needed, custom content may be provided - through an external CTest script using the :prop_dir:`TEST_INCLUDE_FILES` - directory property. The set of discovered tests is made accessible to such a - script via the ``_TESTS`` variable. - - The options are: - - ``target`` - Specifies the Catch executable, which must be a known CMake executable - target. CMake will substitute the location of the built executable when - running the test. - - ``TEST_SPEC arg1...`` - Specifies test cases, wildcarded test cases, tags and tag expressions to - pass to the Catch executable with the ``--list-test-names-only`` argument. - - ``EXTRA_ARGS arg1...`` - Any extra arguments to pass on the command line to each test case. - - ``WORKING_DIRECTORY dir`` - Specifies the directory in which to run the discovered test cases. If this - option is not provided, the current binary directory is used. - - ``TEST_PREFIX prefix`` - Specifies a ``prefix`` to be prepended to the name of each discovered test - case. This can be useful when the same test executable is being used in - multiple calls to ``catch_discover_tests()`` but with different - ``TEST_SPEC`` or ``EXTRA_ARGS``. - - ``TEST_SUFFIX suffix`` - Similar to ``TEST_PREFIX`` except the ``suffix`` is appended to the name of - every discovered test case. Both ``TEST_PREFIX`` and ``TEST_SUFFIX`` may - be specified. - - ``PROPERTIES name1 value1...`` - Specifies additional properties to be set on all tests discovered by this - invocation of ``catch_discover_tests``. - - ``TEST_LIST var`` - Make the list of tests available in the variable ``var``, rather than the - default ``_TESTS``. This can be useful when the same test - executable is being used in multiple calls to ``catch_discover_tests()``. - Note that this variable is only available in CTest. - -#]=======================================================================] - -#------------------------------------------------------------------------------ -function(catch_discover_tests TARGET) - cmake_parse_arguments( - "" - "" - "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST" - "TEST_SPEC;EXTRA_ARGS;PROPERTIES" - ${ARGN} - ) - - if(NOT _WORKING_DIRECTORY) - set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") - endif() - if(NOT _TEST_LIST) - set(_TEST_LIST ${TARGET}_TESTS) - endif() - - ## Generate a unique name based on the extra arguments - string(SHA1 args_hash "${_TEST_SPEC} ${_EXTRA_ARGS}") - string(SUBSTRING ${args_hash} 0 7 args_hash) - - # Define rule to generate test list for aforementioned test executable - set(ctest_include_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include-${args_hash}.cmake") - set(ctest_tests_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests-${args_hash}.cmake") - get_property(crosscompiling_emulator - TARGET ${TARGET} - PROPERTY CROSSCOMPILING_EMULATOR - ) - add_custom_command( - TARGET ${TARGET} POST_BUILD - BYPRODUCTS "${ctest_tests_file}" - COMMAND "${CMAKE_COMMAND}" - -D "TEST_TARGET=${TARGET}" - -D "TEST_EXECUTABLE=$" - -D "TEST_EXECUTOR=${crosscompiling_emulator}" - -D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}" - -D "TEST_SPEC=${_TEST_SPEC}" - -D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}" - -D "TEST_PROPERTIES=${_PROPERTIES}" - -D "TEST_PREFIX='${_TEST_PREFIX}'" - -D "TEST_SUFFIX='${_TEST_SUFFIX}'" - -D "TEST_LIST=${_TEST_LIST}" - -D "CTEST_FILE=${ctest_tests_file}" - -P "${_CATCH_DISCOVER_TESTS_SCRIPT}" - VERBATIM - ) - - file(WRITE "${ctest_include_file}" - "if(EXISTS \"${ctest_tests_file}\")\n" - " include(\"${ctest_tests_file}\")\n" - "else()\n" - " add_test(${TARGET}_NOT_BUILT-${args_hash} ${TARGET}_NOT_BUILT-${args_hash})\n" - "endif()\n" - ) - - if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0") - # Add discovered tests to directory TEST_INCLUDE_FILES - set_property(DIRECTORY - APPEND PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}" - ) - else() - # Add discovered tests as directory TEST_INCLUDE_FILE if possible - get_property(test_include_file_set DIRECTORY PROPERTY TEST_INCLUDE_FILE SET) - if (NOT ${test_include_file_set}) - set_property(DIRECTORY - PROPERTY TEST_INCLUDE_FILE "${ctest_include_file}" - ) - else() - message(FATAL_ERROR - "Cannot set more than one TEST_INCLUDE_FILE" - ) - endif() - endif() - -endfunction() - -############################################################################### - -set(_CATCH_DISCOVER_TESTS_SCRIPT - ${CMAKE_CURRENT_LIST_DIR}/CatchAddTests.cmake -) diff --git a/cmake/modules/Catch2/CatchAddTests.cmake b/cmake/modules/Catch2/CatchAddTests.cmake deleted file mode 100644 index ca5ebc17e5..0000000000 --- a/cmake/modules/Catch2/CatchAddTests.cmake +++ /dev/null @@ -1,106 +0,0 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -set(prefix "${TEST_PREFIX}") -set(suffix "${TEST_SUFFIX}") -set(spec ${TEST_SPEC}) -set(extra_args ${TEST_EXTRA_ARGS}) -set(properties ${TEST_PROPERTIES}) -set(script) -set(suite) -set(tests) - -function(add_command NAME) - set(_args "") - foreach(_arg ${ARGN}) - if(_arg MATCHES "[^-./:a-zA-Z0-9_]") - set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument - else() - set(_args "${_args} ${_arg}") - endif() - endforeach() - set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE) -endfunction() - -macro(_add_catch_test_labels LINE) - # convert to list of tags - string(REPLACE "][" "]\\;[" tags ${line}) - - add_command( - set_tests_properties "${prefix}${test}${suffix}" - PROPERTIES - LABELS "${tags}" - ) -endmacro() - -macro(_add_catch_test LINE) - set(test ${line}) - # use escape commas to handle properly test cases with commans inside the name - string(REPLACE "," "\\," test_name ${test}) - # ...and add to script - add_command( - add_test "${prefix}${test}${suffix}" - ${TEST_EXECUTOR} - "${TEST_EXECUTABLE}" - "${test_name}" - ${extra_args} - ) - - add_command( - set_tests_properties "${prefix}${test}${suffix}" - PROPERTIES - WORKING_DIRECTORY "${TEST_WORKING_DIR}" - ${properties} - ) - list(APPEND tests "${prefix}${test}${suffix}") -endmacro() - -# Run test executable to get list of available tests -if(NOT EXISTS "${TEST_EXECUTABLE}") - message(FATAL_ERROR - "Specified test executable '${TEST_EXECUTABLE}' does not exist" - ) -endif() -execute_process( - COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-tests - OUTPUT_VARIABLE output - RESULT_VARIABLE result -) -# Catch --list-test-names-only reports the number of tests, so 0 is... surprising -if(${result} EQUAL 0) - message(WARNING - "Test executable '${TEST_EXECUTABLE}' contains no tests!\n" - ) -elseif(${result} LESS 0) - message(FATAL_ERROR - "Error running test executable '${TEST_EXECUTABLE}':\n" - " Result: ${result}\n" - " Output: ${output}\n" - ) -endif() - -string(REPLACE "\n" ";" output "${output}") -set(test) -set(tags_regex "(\\[([^\\[]*)\\])+$") - -# Parse output -foreach(line ${output}) - # lines without leading whitespaces are catch output not tests - if(${line} MATCHES "^[ \t]+") - # strip leading spaces and tabs - string(REGEX REPLACE "^[ \t]+" "" line ${line}) - - if(${line} MATCHES "${tags_regex}") - _add_catch_test_labels(${line}) - else() - _add_catch_test(${line}) - endif() - endif() -endforeach() - -# Create a list of all discovered tests, which users may use to e.g. set -# properties on the tests -add_command(set ${TEST_LIST} ${tests}) - -# Write CTest script -file(WRITE "${CTEST_FILE}" "${script}") diff --git a/cmake/modules/Catch2/ParseAndAddCatchTests.cmake b/cmake/modules/Catch2/ParseAndAddCatchTests.cmake deleted file mode 100644 index 925d932819..0000000000 --- a/cmake/modules/Catch2/ParseAndAddCatchTests.cmake +++ /dev/null @@ -1,225 +0,0 @@ -#==================================================================================================# -# supported macros # -# - TEST_CASE, # -# - SCENARIO, # -# - TEST_CASE_METHOD, # -# - CATCH_TEST_CASE, # -# - CATCH_SCENARIO, # -# - CATCH_TEST_CASE_METHOD. # -# # -# Usage # -# 1. make sure this module is in the path or add this otherwise: # -# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/") # -# 2. make sure that you've enabled testing option for the project by the call: # -# enable_testing() # -# 3. add the lines to the script for testing target (sample CMakeLists.txt): # -# project(testing_target) # -# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/") # -# enable_testing() # -# # -# find_path(CATCH_INCLUDE_DIR "catch.hpp") # -# include_directories(${INCLUDE_DIRECTORIES} ${CATCH_INCLUDE_DIR}) # -# # -# file(GLOB SOURCE_FILES "*.cpp") # -# add_executable(${PROJECT_NAME} ${SOURCE_FILES}) # -# # -# include(ParseAndAddCatchTests) # -# ParseAndAddCatchTests(${PROJECT_NAME}) # -# # -# The following variables affect the behavior of the script: # -# # -# PARSE_CATCH_TESTS_VERBOSE (Default OFF) # -# -- enables debug messages # -# PARSE_CATCH_TESTS_NO_HIDDEN_TESTS (Default OFF) # -# -- excludes tests marked with [!hide], [.] or [.foo] tags # -# PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME (Default ON) # -# -- adds fixture class name to the test name # -# PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME (Default ON) # -# -- adds cmake target name to the test name # -# PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS (Default OFF) # -# -- causes CMake to rerun when file with tests changes so that new tests will be discovered # -# # -# One can also set (locally) the optional variable OptionalCatchTestLauncher to precise the way # -# a test should be run. For instance to use test MPI, one can write # -# set(OptionalCatchTestLauncher ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${NUMPROC}) # -# just before calling this ParseAndAddCatchTests function # -# # -# The AdditionalCatchParameters optional variable can be used to pass extra argument to the test # -# command. For example, to include successful tests in the output, one can write # -# set(AdditionalCatchParameters --success) # -# # -# After the script, the ParseAndAddCatchTests_TESTS property for the target, and for each source # -# file in the target is set, and contains the list of the tests extracted from that target, or # -# from that file. This is useful, for example to add further labels or properties to the tests. # -# # -#==================================================================================================# - -if (CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.8) - message(FATAL_ERROR "ParseAndAddCatchTests requires CMake 2.8.8 or newer") -endif() - -option(PARSE_CATCH_TESTS_VERBOSE "Print Catch to CTest parser debug messages" OFF) -option(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS "Exclude tests with [!hide], [.] or [.foo] tags" OFF) -option(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME "Add fixture class name to the test name" ON) -option(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME "Add target name to the test name" ON) -option(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS "Add test file to CMAKE_CONFIGURE_DEPENDS property" OFF) - -function(ParseAndAddCatchTests_PrintDebugMessage) - if(PARSE_CATCH_TESTS_VERBOSE) - message(STATUS "ParseAndAddCatchTests: ${ARGV}") - endif() -endfunction() - -# This removes the contents between -# - block comments (i.e. /* ... */) -# - full line comments (i.e. // ... ) -# contents have been read into '${CppCode}'. -# !keep partial line comments -function(ParseAndAddCatchTests_RemoveComments CppCode) - string(ASCII 2 CMakeBeginBlockComment) - string(ASCII 3 CMakeEndBlockComment) - string(REGEX REPLACE "/\\*" "${CMakeBeginBlockComment}" ${CppCode} "${${CppCode}}") - string(REGEX REPLACE "\\*/" "${CMakeEndBlockComment}" ${CppCode} "${${CppCode}}") - string(REGEX REPLACE "${CMakeBeginBlockComment}[^${CMakeEndBlockComment}]*${CMakeEndBlockComment}" "" ${CppCode} "${${CppCode}}") - string(REGEX REPLACE "\n[ \t]*//+[^\n]+" "\n" ${CppCode} "${${CppCode}}") - - set(${CppCode} "${${CppCode}}" PARENT_SCOPE) -endfunction() - -# Worker function -function(ParseAndAddCatchTests_ParseFile SourceFile TestTarget) - # If SourceFile is an object library, do not scan it (as it is not a file). Exit without giving a warning about a missing file. - if(SourceFile MATCHES "\\\$") - ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.") - return() - endif() - # According to CMake docs EXISTS behavior is well-defined only for full paths. - get_filename_component(SourceFile ${SourceFile} ABSOLUTE) - if(NOT EXISTS ${SourceFile}) - message(WARNING "Cannot find source file: ${SourceFile}") - return() - endif() - ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}") - file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME) - - # Remove block and fullline comments - ParseAndAddCatchTests_RemoveComments(Contents) - - # Find definition of test names - string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^\)]+\\)+[ \t\n]*{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}") - - if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests) - ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property") - set_property( - DIRECTORY - APPEND - PROPERTY CMAKE_CONFIGURE_DEPENDS ${SourceFile} - ) - endif() - - foreach(TestName ${Tests}) - # Strip newlines - string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}") - - # Get test type and fixture if applicable - string(REGEX MATCH "(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}") - string(REGEX MATCH "(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}") - string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}") - - # Get string parts of test definition - string(REGEX MATCHALL "\"+([^\\^\"]|\\\\\")+\"+" TestStrings "${TestName}") - - # Strip wrapping quotation marks - string(REGEX REPLACE "^\"(.*)\"$" "\\1" TestStrings "${TestStrings}") - string(REPLACE "\";\"" ";" TestStrings "${TestStrings}") - - # Validate that a test name and tags have been provided - list(LENGTH TestStrings TestStringsLength) - if(TestStringsLength GREATER 2 OR TestStringsLength LESS 1) - message(FATAL_ERROR "You must provide a valid test name and tags for all tests in ${SourceFile}") - endif() - - # Assign name and tags - list(GET TestStrings 0 Name) - if("${TestType}" STREQUAL "SCENARIO") - set(Name "Scenario: ${Name}") - endif() - if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND TestFixture) - set(CTestName "${TestFixture}:${Name}") - else() - set(CTestName "${Name}") - endif() - if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME) - set(CTestName "${TestTarget}:${CTestName}") - endif() - # add target to labels to enable running all tests added from this target - set(Labels ${TestTarget}) - if(TestStringsLength EQUAL 2) - list(GET TestStrings 1 Tags) - string(TOLOWER "${Tags}" Tags) - # remove target from labels if the test is hidden - if("${Tags}" MATCHES ".*\\[!?(hide|\\.)\\].*") - list(REMOVE_ITEM Labels ${TestTarget}) - endif() - string(REPLACE "]" ";" Tags "${Tags}") - string(REPLACE "[" "" Tags "${Tags}") - else() - # unset tags variable from previous loop - unset(Tags) - endif() - - list(APPEND Labels ${Tags}) - - set(HiddenTagFound OFF) - foreach(label ${Labels}) - string(REGEX MATCH "^!hide|^\\." result ${label}) - if(result) - set(HiddenTagFound ON) - break() - endif(result) - endforeach(label) - if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_LESS "3.9") - ParseAndAddCatchTests_PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label") - else() - ParseAndAddCatchTests_PrintDebugMessage("Adding test \"${CTestName}\"") - if(Labels) - ParseAndAddCatchTests_PrintDebugMessage("Setting labels to ${Labels}") - endif() - - # Escape commas in the test spec - string(REPLACE "," "\\," Name ${Name}) - - # Add the test and set its properties - add_test(NAME "\"${CTestName}\"" COMMAND ${OptionalCatchTestLauncher} $ ${Name} ${AdditionalCatchParameters}) - # Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead - if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8") - ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property") - set_tests_properties("\"${CTestName}\"" PROPERTIES DISABLED ON) - else() - set_tests_properties("\"${CTestName}\"" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran" - LABELS "${Labels}") - endif() - set_property( - TARGET ${TestTarget} - APPEND - PROPERTY ParseAndAddCatchTests_TESTS "\"${CTestName}\"") - set_property( - SOURCE ${SourceFile} - APPEND - PROPERTY ParseAndAddCatchTests_TESTS "\"${CTestName}\"") - endif() - - - endforeach() -endfunction() - -# entry point -function(ParseAndAddCatchTests TestTarget) - ParseAndAddCatchTests_PrintDebugMessage("Started parsing ${TestTarget}") - get_target_property(SourceFiles ${TestTarget} SOURCES) - ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}") - foreach(SourceFile ${SourceFiles}) - ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget}) - endforeach() - ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}") -endfunction() diff --git a/cmake/modules/UsewxWidgets.cmake b/cmake/modules/UsewxWidgets.cmake new file mode 100644 index 0000000000..4f85484eb7 --- /dev/null +++ b/cmake/modules/UsewxWidgets.cmake @@ -0,0 +1,75 @@ +# PrusaSlicer: this is a direct copy of the UsewxWidgets.cmake module +# within the original CMake 3.27 distribution + +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +UsewxWidgets +------------ + +Convenience include for using wxWidgets library. + +Determines if wxWidgets was FOUND and sets the appropriate libs, +incdirs, flags, etc. INCLUDE_DIRECTORIES and LINK_DIRECTORIES are +called. + +USAGE + +:: + + # Note that for MinGW users the order of libs is important! + find_package(wxWidgets REQUIRED net gl core base) + include(${wxWidgets_USE_FILE}) + # and for each of your dependent executable/library targets: + target_link_libraries( ${wxWidgets_LIBRARIES}) + + + +DEPRECATED + +:: + + LINK_LIBRARIES is not called in favor of adding dependencies per target. + + + +AUTHOR + +:: + + Jan Woetzel +#]=======================================================================] + +if (wxWidgets_FOUND) + if (wxWidgets_INCLUDE_DIRS) + if(wxWidgets_INCLUDE_DIRS_NO_SYSTEM) + include_directories(${wxWidgets_INCLUDE_DIRS}) + else() + include_directories(SYSTEM ${wxWidgets_INCLUDE_DIRS}) + endif() + endif() + + if (wxWidgets_LIBRARY_DIRS) + link_directories(${wxWidgets_LIBRARY_DIRS}) + endif() + + if (wxWidgets_DEFINITIONS) + set_property(DIRECTORY APPEND + PROPERTY COMPILE_DEFINITIONS ${wxWidgets_DEFINITIONS}) + endif() + + if (wxWidgets_DEFINITIONS_DEBUG) + set_property(DIRECTORY APPEND + PROPERTY COMPILE_DEFINITIONS_DEBUG ${wxWidgets_DEFINITIONS_DEBUG}) + endif() + + if (wxWidgets_CXX_FLAGS) + # Flags are expected to be a string here, not a list. + string(REPLACE ";" " " wxWidgets_CXX_FLAGS_str "${wxWidgets_CXX_FLAGS}") + string(APPEND CMAKE_CXX_FLAGS " ${wxWidgets_CXX_FLAGS_str}") + unset(wxWidgets_CXX_FLAGS_str) + endif() +else () + message("wxWidgets requested but not found.") +endif() diff --git a/deps/+Blosc/Blosc.cmake b/deps/+Blosc/Blosc.cmake new file mode 100644 index 0000000000..5b1e429e72 --- /dev/null +++ b/deps/+Blosc/Blosc.cmake @@ -0,0 +1,21 @@ +if(BUILD_SHARED_LIBS) + set(_build_shared ON) + set(_build_static OFF) +else() + set(_build_shared OFF) + set(_build_static ON) +endif() + +add_cmake_project(Blosc + URL https://github.com/Blosc/c-blosc/archive/8724c06e3da90f10986a253814af18ca081d8de0.zip + URL_HASH SHA256=53986fd04210b3d94124b7967c857f9766353e576a69595a9393999e0712c035 + CMAKE_ARGS + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DBUILD_SHARED=${_build_shared} + -DBUILD_STATIC=${_build_static} + -DBUILD_TESTS=OFF + -DBUILD_BENCHMARKS=OFF + -DPREFER_EXTERNAL_ZLIB=ON +) + +set(DEP_Blosc_DEPENDS ZLIB) diff --git a/deps/+Boost/Boost.cmake b/deps/+Boost/Boost.cmake new file mode 100644 index 0000000000..7e569928ca --- /dev/null +++ b/deps/+Boost/Boost.cmake @@ -0,0 +1,22 @@ + +set(_context_abi_line "") +set(_context_arch_line "") +if (APPLE AND CMAKE_OSX_ARCHITECTURES) + if (CMAKE_OSX_ARCHITECTURES MATCHES "x86") + set(_context_abi_line "-DBOOST_CONTEXT_ABI:STRING=sysv") + elseif (CMAKE_OSX_ARCHITECTURES MATCHES "arm") + set (_context_abi_line "-DBOOST_CONTEXT_ABI:STRING=aapcs") + endif () + set(_context_arch_line "-DBOOST_CONTEXT_ARCHITECTURE:STRING=${CMAKE_OSX_ARCHITECTURES}") +endif () + +add_cmake_project(Boost + URL "https://github.com/boostorg/boost/releases/download/boost-1.83.0/boost-1.83.0.zip" + URL_HASH SHA256=9effa3d7f9d92b8e33e2b41d82f4358f97ff7c588d5918720339f2b254d914c6 + LIST_SEPARATOR | + CMAKE_ARGS + -DBOOST_EXCLUDE_LIBRARIES:STRING=contract|fiber|numpy|stacktrace|wave|test + -DBUILD_TESTING:BOOL=OFF + "${_context_abi_line}" + "${_context_arch_line}" +) diff --git a/deps/CGAL/CGAL.cmake b/deps/+CGAL/CGAL.cmake similarity index 57% rename from deps/CGAL/CGAL.cmake rename to deps/+CGAL/CGAL.cmake index 37f33b74c0..bb6e8fd87e 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/+CGAL/CGAL.cmake @@ -1,15 +1,12 @@ -#/|/ Copyright (c) Prusa Research 2019 - 2022 Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01, Vojtěch Bubník @bubnikv, David Kocík @kocikdav -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -prusaslicer_add_cmake_project( +add_cmake_project( CGAL # GIT_REPOSITORY https://github.com/CGAL/cgal.git # GIT_TAG bec70a6d52d8aacb0b3d82a7b4edc3caa899184b # releases/CGAL-5.0 # For whatever reason, this keeps downloading forever (repeats downloads if finished) URL https://github.com/CGAL/cgal/archive/refs/tags/v5.4.zip URL_HASH SHA256=d7605e0a5a5ca17da7547592f6f6e4a59430a0bc861948974254d0de43eab4c0 - DEPENDS dep_Boost dep_GMP dep_MPFR ) include(GNUInstallDirs) + +set(DEP_CGAL_DEPENDS Boost GMP MPFR) diff --git a/deps/CGAL/cgal/CGALConfigVersion.cmake b/deps/+CGAL/cgal/CGALConfigVersion.cmake similarity index 85% rename from deps/CGAL/cgal/CGALConfigVersion.cmake rename to deps/+CGAL/cgal/CGALConfigVersion.cmake index 9bef13fcba..8a15bb8acf 100644 --- a/deps/CGAL/cgal/CGALConfigVersion.cmake +++ b/deps/+CGAL/cgal/CGALConfigVersion.cmake @@ -1,7 +1,3 @@ -#/|/ Copyright (c) Prusa Research 2020 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ # This is a basic version file for the Config-mode of find_package(). # It is used by write_basic_package_version_file() as input file for configure_file() # to create a version-file which can be installed along a config.cmake file. diff --git a/deps/CURL/CURL.cmake b/deps/+CURL/CURL.cmake similarity index 88% rename from deps/CURL/CURL.cmake rename to deps/+CURL/CURL.cmake index 8e4871cff0..5fac33d770 100644 --- a/deps/CURL/CURL.cmake +++ b/deps/+CURL/CURL.cmake @@ -1,7 +1,3 @@ -#/|/ Copyright (c) Prusa Research 2021 - 2022 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ set(_curl_platform_flags -DENABLE_IPV6:BOOL=ON -DENABLE_VERSIONED_SYMBOLS:BOOL=ON @@ -60,12 +56,11 @@ if (UNIX AND NOT APPLE) set (_patch_command echo set_target_properties(CURL::libcurl PROPERTIES INTERFACE_COMPILE_DEFINITIONS OPENSSL_CERT_OVERRIDE) >> CMake/curl-config.cmake.in) endif () -prusaslicer_add_cmake_project(CURL +add_cmake_project(CURL # GIT_REPOSITORY https://github.com/curl/curl.git # GIT_TAG curl-7_75_0 URL https://github.com/curl/curl/archive/refs/tags/curl-7_75_0.zip URL_HASH SHA256=a63ae025bb0a14f119e73250f2c923f4bf89aa93b8d4fafa4a9f5353a96a765a - DEPENDS ${ZLIB_PKG} # PATCH_COMMAND ${GIT_EXECUTABLE} checkout -f -- . && git clean -df && # ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/curl-mods.patch PATCH_COMMAND "${_patch_command}" @@ -75,10 +70,8 @@ prusaslicer_add_cmake_project(CURL ${_curl_platform_flags} ) +set(DEP_CURL_DEPENDS ZLIB) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - add_dependencies(dep_CURL dep_OpenSSL) + list(APPEND DEP_CURL_DEPENDS OpenSSL) endif () -if (MSVC) - add_debug_dep(dep_CURL) -endif () diff --git a/deps/+Catch2/Catch2.cmake b/deps/+Catch2/Catch2.cmake new file mode 100644 index 0000000000..b355f16add --- /dev/null +++ b/deps/+Catch2/Catch2.cmake @@ -0,0 +1,6 @@ +add_cmake_project(Catch2 + URL "https://github.com/catchorg/Catch2/archive/refs/tags/v2.13.10.zip" + URL_HASH SHA256=121e7488912c2ce887bfe4699ebfb983d0f2e0d68bcd60434cdfd6bb0cf78b43 + CMAKE_ARGS + -DCATCH_BUILD_TESTING:BOOL=OFF +) \ No newline at end of file diff --git a/deps/Cereal/Cereal.cmake b/deps/+Cereal/Cereal.cmake similarity index 55% rename from deps/Cereal/Cereal.cmake rename to deps/+Cereal/Cereal.cmake index 5631cc5235..1ec9af06bb 100644 --- a/deps/Cereal/Cereal.cmake +++ b/deps/+Cereal/Cereal.cmake @@ -1,8 +1,4 @@ -#/|/ Copyright (c) Prusa Research 2021 - 2022 Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01 -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -prusaslicer_add_cmake_project(Cereal +add_cmake_project(Cereal URL "https://github.com/USCiLab/cereal/archive/refs/tags/v1.3.0.zip" URL_HASH SHA256=71642cb54658e98c8f07a0f0d08bf9766f1c3771496936f6014169d3726d9657 CMAKE_ARGS diff --git a/deps/+EXPAT/EXPAT.cmake b/deps/+EXPAT/EXPAT.cmake new file mode 100644 index 0000000000..5d35d2def9 --- /dev/null +++ b/deps/+EXPAT/EXPAT.cmake @@ -0,0 +1,11 @@ +add_cmake_project(EXPAT + URL https://github.com/libexpat/libexpat/archive/refs/tags/R_2_4_3.zip + URL_HASH SHA256=8851e199d763dc785277d6d414ed3e70ff683915158b51b8d8781df0e3af950a + SOURCE_SUBDIR expat + CMAKE_ARGS + -DEXPAT_BUILD_TOOLS:BOOL=OFF + -DEXPAT_BUILD_EXAMPLES:BOOL=OFF + -DEXPAT_BUILD_TESTS:BOOL=OFF + -DEXPAT_BUILD_DOCS=OFF + -DEXPAT_BUILD_PKGCONFIG=OFF +) \ No newline at end of file diff --git a/deps/+GLEW/GLEW.cmake b/deps/+GLEW/GLEW.cmake new file mode 100644 index 0000000000..c2db9117b6 --- /dev/null +++ b/deps/+GLEW/GLEW.cmake @@ -0,0 +1,8 @@ +add_cmake_project( + GLEW + URL https://sourceforge.net/projects/glew/files/glew/2.2.0/glew-2.2.0.zip + URL_HASH SHA256=a9046a913774395a095edcc0b0ac2d81c3aacca61787b39839b941e9be14e0d4 + SOURCE_SUBDIR build/cmake + CMAKE_ARGS + -DBUILD_UTILS=OFF +) \ No newline at end of file diff --git a/deps/GMP/GMP.cmake b/deps/+GMP/GMP.cmake similarity index 68% rename from deps/GMP/GMP.cmake rename to deps/+GMP/GMP.cmake index 599ecc80b5..724db2eeab 100644 --- a/deps/GMP/GMP.cmake +++ b/deps/+GMP/GMP.cmake @@ -1,10 +1,6 @@ -#/|/ Copyright (c) Prusa Research 2019 - 2021 Tomáš Mészáros @tamasmeszaros, David Kocík @kocikdav -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ set(_srcdir ${CMAKE_CURRENT_LIST_DIR}/gmp) -set(_dstdir ${DESTDIR}/usr/local) +set(_dstdir ${${PROJECT_NAME}_DEP_INSTALL_PREFIX}) if (MSVC) set(_output ${_dstdir}/include/gmp.h @@ -21,13 +17,24 @@ if (MSVC) add_custom_target(dep_GMP SOURCES ${_output}) else () - set(_gmp_ccflags "-O2 -DNDEBUG -fPIC -DPIC -Wall -Wmissing-prototypes -Wpointer-arith -pedantic -fomit-frame-pointer -fno-common") + string(TOUPPER "${CMAKE_BUILD_TYPE}" _buildtype_upper) + set(_gmp_ccflags "${CMAKE_CXX_FLAGS_${_buildtype_upper}} -fPIC -DPIC -Wall -Wmissing-prototypes -Wpointer-arith -pedantic -fomit-frame-pointer -fno-common") set(_gmp_build_tgt "${CMAKE_SYSTEM_PROCESSOR}") + set(_cross_compile_arg "") if (APPLE) - if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") + if (CMAKE_OSX_ARCHITECTURES) + set(_gmp_build_tgt ${CMAKE_OSX_ARCHITECTURES}) + set(_gmp_ccflags "${_gmp_ccflags} -arch ${CMAKE_OSX_ARCHITECTURES}") + endif () + if (${_gmp_build_tgt} MATCHES "arm") set(_gmp_build_tgt aarch64) endif() + + if (CMAKE_OSX_ARCHITECTURES) + set(_cross_compile_arg --host=${_gmp_build_tgt}-apple-darwin21) + endif () + set(_gmp_ccflags "${_gmp_ccflags} -mmacosx-version-min=${DEP_OSX_TARGET}") set(_gmp_build_tgt "--build=${_gmp_build_tgt}-apple-darwin") elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") @@ -40,19 +47,19 @@ else () set(_gmp_build_tgt "") # let it guess endif() - set(_cross_compile_arg "") if (CMAKE_CROSSCOMPILING) # TOOLCHAIN_PREFIX should be defined in the toolchain file set(_cross_compile_arg --host=${TOOLCHAIN_PREFIX}) endif () ExternalProject_Add(dep_GMP + EXCLUDE_FROM_ALL ON URL https://gmplib.org/download/gmp/gmp-6.2.1.tar.bz2 URL_HASH SHA256=eae9326beb4158c386e39a356818031bd28f3124cf915f8c5b1dc4c7a36b4d7c - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/GMP + DOWNLOAD_DIR ${${PROJECT_NAME}_DEP_DOWNLOAD_DIR}/GMP BUILD_IN_SOURCE ON - CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" ./configure ${_cross_compile_arg} --enable-shared=no --enable-cxx=yes --enable-static=yes "--prefix=${DESTDIR}/usr/local" ${_gmp_build_tgt} + CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" ./configure ${_cross_compile_arg} --enable-shared=no --enable-cxx=yes --enable-static=yes "--prefix=${${PROJECT_NAME}_DEP_INSTALL_PREFIX}" ${_gmp_build_tgt} BUILD_COMMAND make -j INSTALL_COMMAND make install ) -endif () \ No newline at end of file +endif () diff --git a/deps/GMP/gmp/gmp.COPYING b/deps/+GMP/gmp/gmp.COPYING similarity index 100% rename from deps/GMP/gmp/gmp.COPYING rename to deps/+GMP/gmp/gmp.COPYING diff --git a/deps/GMP/gmp/gmp.README b/deps/+GMP/gmp/gmp.README similarity index 100% rename from deps/GMP/gmp/gmp.README rename to deps/+GMP/gmp/gmp.README diff --git a/deps/GMP/gmp/include/gmp.h b/deps/+GMP/gmp/include/gmp.h similarity index 100% rename from deps/GMP/gmp/include/gmp.h rename to deps/+GMP/gmp/include/gmp.h diff --git a/deps/GMP/gmp/lib/win32/libgmp-10.dll b/deps/+GMP/gmp/lib/win32/libgmp-10.dll similarity index 100% rename from deps/GMP/gmp/lib/win32/libgmp-10.dll rename to deps/+GMP/gmp/lib/win32/libgmp-10.dll diff --git a/deps/GMP/gmp/lib/win32/libgmp-10.lib b/deps/+GMP/gmp/lib/win32/libgmp-10.lib similarity index 100% rename from deps/GMP/gmp/lib/win32/libgmp-10.lib rename to deps/+GMP/gmp/lib/win32/libgmp-10.lib diff --git a/deps/GMP/gmp/lib/win64/libgmp-10.dll b/deps/+GMP/gmp/lib/win64/libgmp-10.dll similarity index 100% rename from deps/GMP/gmp/lib/win64/libgmp-10.dll rename to deps/+GMP/gmp/lib/win64/libgmp-10.dll diff --git a/deps/GMP/gmp/lib/win64/libgmp-10.lib b/deps/+GMP/gmp/lib/win64/libgmp-10.lib similarity index 100% rename from deps/GMP/gmp/lib/win64/libgmp-10.lib rename to deps/+GMP/gmp/lib/win64/libgmp-10.lib diff --git a/deps/+JPEG/JPEG.cmake b/deps/+JPEG/JPEG.cmake new file mode 100644 index 0000000000..2b31f346f9 --- /dev/null +++ b/deps/+JPEG/JPEG.cmake @@ -0,0 +1,9 @@ +add_cmake_project(JPEG + URL https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/3.0.1.zip + URL_HASH SHA256=d6d99e693366bc03897677650e8b2dfa76b5d6c54e2c9e70c03f0af821b0a52f + CMAKE_ARGS + -DENABLE_SHARED=OFF + -DENABLE_STATIC=ON +) + +set(DEP_JPEG_DEPENDS ZLIB) diff --git a/deps/+LibBGCode/LibBGCode.cmake b/deps/+LibBGCode/LibBGCode.cmake new file mode 100644 index 0000000000..3403646e09 --- /dev/null +++ b/deps/+LibBGCode/LibBGCode.cmake @@ -0,0 +1,34 @@ +set(LibBGCode_SOURCE_DIR "" CACHE PATH "Optionally specify local LibBGCode source directory") + +set(_source_dir_line + URL https://github.com/prusa3d/libbgcode/archive/04556c4f64d4b7a5942d8d193d1eb87fc7e1005f.zip + URL_HASH SHA256=f0745b2dae95f0a49ae75bfbe4d775c751499fc4245864675e2dab06c13b2c8f +) + +if (LibBGCode_SOURCE_DIR) + set(_source_dir_line "SOURCE_DIR;${LibBGCode_SOURCE_DIR};BUILD_ALWAYS;ON") +endif () + +# add_cmake_project(LibBGCode_deps +# ${_source_dir_line} +# SOURCE_SUBDIR deps +# BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/ +# CMAKE_ARGS +# -DLibBGCode_Deps_DEP_DOWNLOAD_DIR:PATH=${${PROJECT_NAME}_DEP_DOWNLOAD_DIR} +# -DDEP_CMAKE_OPTS:STRING=-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON +# -DLibBGCode_Deps_SELECT_ALL:BOOL=OFF +# -DLibBGCode_Deps_SELECT_heatshrink:BOOL=ON +# -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} +# -DLibBGCode_Deps_DEP_INSTALL_PREFIX=${${PROJECT_NAME}_DEP_INSTALL_PREFIX} +# ) + +add_cmake_project(LibBGCode + ${_source_dir_line} + CMAKE_ARGS + -DLibBGCode_BUILD_TESTS:BOOL=OFF + -DLibBGCode_BUILD_CMD_TOOL:BOOL=OFF +) + +# set(DEP_LibBGCode_deps_DEPENDS ZLIB Boost) +# set(DEP_LibBGCode_DEPENDS LibBGCode_deps) +set(DEP_LibBGCode_DEPENDS ZLIB Boost heatshrink) diff --git a/deps/+MPFR/MPFR.cmake b/deps/+MPFR/MPFR.cmake new file mode 100644 index 0000000000..e04ce286a1 --- /dev/null +++ b/deps/+MPFR/MPFR.cmake @@ -0,0 +1,44 @@ +set(_srcdir ${CMAKE_CURRENT_LIST_DIR}/mpfr) +set(_dstdir ${${PROJECT_NAME}_DEP_INSTALL_PREFIX}) + +if (MSVC) + set(_output ${_dstdir}/include/mpfr.h + ${_dstdir}/include/mpf2mpfr.h + ${_dstdir}/lib/libmpfr-4.lib + ${_dstdir}/bin/libmpfr-4.dll) + + add_custom_command( + OUTPUT ${_output} + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/include/mpfr.h ${_dstdir}/include/ + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/include/mpf2mpfr.h ${_dstdir}/include/ + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win${DEPS_BITS}/libmpfr-4.lib ${_dstdir}/lib/ + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win${DEPS_BITS}/libmpfr-4.dll ${_dstdir}/bin/ + ) + + add_custom_target(dep_MPFR SOURCES ${_output}) + +else () + + # set(_cross_compile_arg "") + # if (CMAKE_CROSSCOMPILING) + # # TOOLCHAIN_PREFIX should be defined in the toolchain file + # set(_cross_compile_arg --host=${TOOLCHAIN_PREFIX}) + # endif () + + message(STATUS "${PROJECT_NAME}_DEP_INSTALL_PREFIX=${${PROJECT_NAME}_DEP_INSTALL_PREFIX}") + + ExternalProject_Add(dep_MPFR + EXCLUDE_FROM_ALL ON + #URL http://ftp.vim.org/ftp/gnu/mpfr/mpfr-3.1.6.tar.bz2 https://www.mpfr.org/mpfr-3.1.6/mpfr-3.1.6.tar.bz2 # mirrors are allowed + #URL_HASH SHA256=cf4f4b2d80abb79e820e78c8077b6725bbbb4e8f41896783c899087be0e94068 + URL https://www.mpfr.org/mpfr-current/mpfr-4.2.1.tar.bz2 + URL_HASH SHA256=b9df93635b20e4089c29623b19420c4ac848a1b29df1cfd59f26cab0d2666aa0 + DOWNLOAD_DIR ${${PROJECT_NAME}_DEP_DOWNLOAD_DIR}/MPFR + BUILD_IN_SOURCE ON + CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" ./configure ${_cross_compile_arg} --prefix=${${PROJECT_NAME}_DEP_INSTALL_PREFIX} --enable-shared=no --enable-static=yes --with-gmp=${${PROJECT_NAME}_DEP_INSTALL_PREFIX} ${_gmp_build_tgt} + BUILD_COMMAND make -j + INSTALL_COMMAND make install + ) +endif () + +set(DEP_MPFR_DEPENDS GMP) diff --git a/deps/MPFR/mpfr/include/mpf2mpfr.h b/deps/+MPFR/mpfr/include/mpf2mpfr.h similarity index 97% rename from deps/MPFR/mpfr/include/mpf2mpfr.h rename to deps/+MPFR/mpfr/include/mpf2mpfr.h index 6688e860c7..0d1a4ee1ed 100644 --- a/deps/MPFR/mpfr/include/mpf2mpfr.h +++ b/deps/+MPFR/mpfr/include/mpf2mpfr.h @@ -1,7 +1,3 @@ -///|/ Copyright (c) Prusa Research 2019 Tomáš Mészáros @tamasmeszaros -///|/ -///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -///|/ /* mpf2mpfr.h -- Compatibility include file with mpf. Copyright 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. diff --git a/deps/MPFR/mpfr/include/mpfr.h b/deps/+MPFR/mpfr/include/mpfr.h similarity index 99% rename from deps/MPFR/mpfr/include/mpfr.h rename to deps/+MPFR/mpfr/include/mpfr.h index 02056b58ff..d330e33f7d 100644 --- a/deps/MPFR/mpfr/include/mpfr.h +++ b/deps/+MPFR/mpfr/include/mpfr.h @@ -1,7 +1,3 @@ -///|/ Copyright (c) Prusa Research 2019 Tomáš Mészáros @tamasmeszaros -///|/ -///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -///|/ /* mpfr.h -- Include file for mpfr. Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. diff --git a/deps/MPFR/mpfr/lib/win32/libmpfr-4.dll b/deps/+MPFR/mpfr/lib/win32/libmpfr-4.dll similarity index 100% rename from deps/MPFR/mpfr/lib/win32/libmpfr-4.dll rename to deps/+MPFR/mpfr/lib/win32/libmpfr-4.dll diff --git a/deps/MPFR/mpfr/lib/win32/libmpfr-4.lib b/deps/+MPFR/mpfr/lib/win32/libmpfr-4.lib similarity index 100% rename from deps/MPFR/mpfr/lib/win32/libmpfr-4.lib rename to deps/+MPFR/mpfr/lib/win32/libmpfr-4.lib diff --git a/deps/MPFR/mpfr/lib/win64/libmpfr-4.dll b/deps/+MPFR/mpfr/lib/win64/libmpfr-4.dll similarity index 100% rename from deps/MPFR/mpfr/lib/win64/libmpfr-4.dll rename to deps/+MPFR/mpfr/lib/win64/libmpfr-4.dll diff --git a/deps/MPFR/mpfr/lib/win64/libmpfr-4.lib b/deps/+MPFR/mpfr/lib/win64/libmpfr-4.lib similarity index 100% rename from deps/MPFR/mpfr/lib/win64/libmpfr-4.lib rename to deps/+MPFR/mpfr/lib/win64/libmpfr-4.lib diff --git a/deps/MPFR/mpfr/mpfr.COPYING b/deps/+MPFR/mpfr/mpfr.COPYING similarity index 100% rename from deps/MPFR/mpfr/mpfr.COPYING rename to deps/+MPFR/mpfr/mpfr.COPYING diff --git a/deps/MPFR/mpfr/mpfr.COPYING.LESSER b/deps/+MPFR/mpfr/mpfr.COPYING.LESSER similarity index 100% rename from deps/MPFR/mpfr/mpfr.COPYING.LESSER rename to deps/+MPFR/mpfr/mpfr.COPYING.LESSER diff --git a/deps/MPFR/mpfr/mpfr.README b/deps/+MPFR/mpfr/mpfr.README similarity index 100% rename from deps/MPFR/mpfr/mpfr.README rename to deps/+MPFR/mpfr/mpfr.README diff --git a/deps/NLopt/NLopt.cmake b/deps/+NLopt/NLopt.cmake similarity index 57% rename from deps/NLopt/NLopt.cmake rename to deps/+NLopt/NLopt.cmake index c5b5fefcee..aed1c19da8 100644 --- a/deps/NLopt/NLopt.cmake +++ b/deps/+NLopt/NLopt.cmake @@ -1,8 +1,4 @@ -#/|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -prusaslicer_add_cmake_project(NLopt +add_cmake_project(NLopt URL "https://github.com/stevengj/nlopt/archive/v2.5.0.tar.gz" URL_HASH SHA256=c6dd7a5701fff8ad5ebb45a3dc8e757e61d52658de3918e38bab233e7fd3b4ae CMAKE_ARGS @@ -13,7 +9,3 @@ prusaslicer_add_cmake_project(NLopt -DNLOPT_SWIG:BOOL=OFF -DNLOPT_TESTS:BOOL=OFF ) - -if (MSVC) - add_debug_dep(dep_NLopt) -endif () diff --git a/deps/NanoSVG/NanoSVG.cmake b/deps/+NanoSVG/NanoSVG.cmake similarity index 70% rename from deps/NanoSVG/NanoSVG.cmake rename to deps/+NanoSVG/NanoSVG.cmake index 7350b76095..08683e79f0 100644 --- a/deps/NanoSVG/NanoSVG.cmake +++ b/deps/+NanoSVG/NanoSVG.cmake @@ -1,13 +1,9 @@ -#/|/ Copyright (c) Prusa Research 2022 - 2023 Enrico Turri @enricoturri1966, Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ # In PrusaSlicer 2.6.0 we switched from https://github.com/memononen/nanosvg to its fork https://github.com/fltk/nanosvg # because this last implements the new function nsvgRasterizeXY() which we now use in GLTexture::load_from_svg() # for rasterizing svg files from their original size to a squared power of two texture on Windows systems using # AMD Radeon graphics cards -prusaslicer_add_cmake_project(NanoSVG +add_cmake_project(NanoSVG URL https://github.com/fltk/nanosvg/archive/abcd277ea45e9098bed752cf9c6875b533c0892f.zip URL_HASH SHA256=e859938fbaee4b351bd8a8b3d3c7a75b40c36885ce00b73faa1ce0b98aa0ad34 ) \ No newline at end of file diff --git a/deps/OCCT/OCCT.cmake b/deps/+OCCT/OCCT.cmake similarity index 77% rename from deps/OCCT/OCCT.cmake rename to deps/+OCCT/OCCT.cmake index 0f4184fe93..5b7743e581 100644 --- a/deps/OCCT/OCCT.cmake +++ b/deps/+OCCT/OCCT.cmake @@ -1,8 +1,4 @@ -#/|/ Copyright (c) Prusa Research 2022 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -prusaslicer_add_cmake_project(OCCT +add_cmake_project(OCCT #LMBBS: changed version to 7.6.2 URL https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_6_2.zip URL_HASH SHA256=c696b923593e8c18d059709717dbf155b3e72fdd283c8522047a790ec3a432c5 @@ -25,7 +21,3 @@ prusaslicer_add_cmake_project(OCCT -DBUILD_MODULE_ModelingData=OFF -DBUILD_MODULE_Visualization=OFF ) - -if (MSVC) - add_debug_dep(dep_OCCT) -endif () diff --git a/deps/OCCT/occt_toolkit.cmake b/deps/+OCCT/occt_toolkit.cmake similarity index 99% rename from deps/OCCT/occt_toolkit.cmake rename to deps/+OCCT/occt_toolkit.cmake index b8320a9ad0..1b77eb1b29 100644 --- a/deps/OCCT/occt_toolkit.cmake +++ b/deps/+OCCT/occt_toolkit.cmake @@ -1,7 +1,3 @@ -#/|/ Copyright (c) Prusa Research 2022 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ # script for each OCCT toolkit # filling some variables by default values(src) or using custom(tools, samples) diff --git a/deps/OpenCSG/CMakeLists.txt.in b/deps/+OpenCSG/CMakeLists.txt.in similarity index 100% rename from deps/OpenCSG/CMakeLists.txt.in rename to deps/+OpenCSG/CMakeLists.txt.in diff --git a/deps/+OpenCSG/OpenCSG.cmake b/deps/+OpenCSG/OpenCSG.cmake new file mode 100644 index 0000000000..9a99354e36 --- /dev/null +++ b/deps/+OpenCSG/OpenCSG.cmake @@ -0,0 +1,8 @@ + +add_cmake_project(OpenCSG + URL https://github.com/floriankirsch/OpenCSG/archive/refs/tags/opencsg-1-4-2-release.zip + URL_HASH SHA256=51afe0db79af8386e2027d56d685177135581e0ee82ade9d7f2caff8deab5ec5 + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in ./CMakeLists.txt +) + +set(DEP_OpenCSG_DEPENDS GLEW ZLIB) diff --git a/deps/OpenEXR/OpenEXR.cmake b/deps/+OpenEXR/OpenEXR.cmake similarity index 60% rename from deps/OpenEXR/OpenEXR.cmake rename to deps/+OpenEXR/OpenEXR.cmake index c6f6c57ff5..e13f4a327f 100644 --- a/deps/OpenEXR/OpenEXR.cmake +++ b/deps/+OpenEXR/OpenEXR.cmake @@ -1,13 +1,7 @@ -#/|/ Copyright (c) Prusa Research 2021 - 2023 Lukáš Matěna @lukasmatena, Tomáš Mészáros @tamasmeszaros -#/|/ Copyright (c) 2023 Robert Schiele @schiele -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -prusaslicer_add_cmake_project(OpenEXR +add_cmake_project(OpenEXR # GIT_REPOSITORY https://github.com/openexr/openexr.git URL https://github.com/AcademySoftwareFoundation/openexr/archive/refs/tags/v2.5.5.zip URL_HASH SHA256=0307a3d7e1fa1e77e9d84d7e9a8694583fbbbfd50bdc6884e2c96b8ef6b902de - DEPENDS ${ZLIB_PKG} GIT_TAG v2.5.5 PATCH_COMMAND COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/OpenEXR.patch CMAKE_ARGS @@ -18,6 +12,4 @@ prusaslicer_add_cmake_project(OpenEXR -DOPENEXR_BUILD_UTILS:BOOL=OFF ) -if (MSVC) - add_debug_dep(dep_OpenEXR) -endif () +set(DEP_OpenEXR_DEPENDS ZLIB) diff --git a/deps/OpenEXR/OpenEXR.patch b/deps/+OpenEXR/OpenEXR.patch similarity index 100% rename from deps/OpenEXR/OpenEXR.patch rename to deps/+OpenEXR/OpenEXR.patch diff --git a/deps/OpenSSL/OpenSSL.cmake b/deps/+OpenSSL/OpenSSL.cmake similarity index 81% rename from deps/OpenSSL/OpenSSL.cmake rename to deps/+OpenSSL/OpenSSL.cmake index 5b9caea52b..bcfbab9db1 100644 --- a/deps/OpenSSL/OpenSSL.cmake +++ b/deps/+OpenSSL/OpenSSL.cmake @@ -1,7 +1,3 @@ -#/|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ include(ProcessorCount) ProcessorCount(NPROC) @@ -25,10 +21,10 @@ ExternalProject_Add(dep_OpenSSL EXCLUDE_FROM_ALL ON URL "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0l.tar.gz" URL_HASH SHA256=e2acf0cf58d9bff2b42f2dc0aee79340c8ffe2c5e45d3ca4533dd5d4f5775b1d - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/OpenSSL + DOWNLOAD_DIR ${${PROJECT_NAME}_DEP_DOWNLOAD_DIR}/OpenSSL BUILD_IN_SOURCE ON CONFIGURE_COMMAND ${_conf_cmd} ${_cross_arch} - "--prefix=${DESTDIR}/usr/local" + "--prefix=${${PROJECT_NAME}_DEP_INSTALL_PREFIX}" ${_cross_comp_prefix_line} no-shared no-ssl3-method diff --git a/deps/OpenVDB/OpenVDB.cmake b/deps/+OpenVDB/OpenVDB.cmake similarity index 56% rename from deps/OpenVDB/OpenVDB.cmake rename to deps/+OpenVDB/OpenVDB.cmake index f658c2a62a..cfafa0376e 100644 --- a/deps/OpenVDB/OpenVDB.cmake +++ b/deps/+OpenVDB/OpenVDB.cmake @@ -1,7 +1,3 @@ -#/|/ Copyright (c) Prusa Research 2021 - 2022 Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01 -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ if(BUILD_SHARED_LIBS) set(_build_shared ON) set(_build_static OFF) @@ -11,17 +7,16 @@ else() endif() set (_openvdb_vdbprint ON) -if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") +if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" OR NOT ${CMAKE_BUILD_TYPE} STREQUAL Release) # Build fails on raspberry pi due to missing link directive to latomic # Let's hope it will be fixed soon. set (_openvdb_vdbprint OFF) endif () -prusaslicer_add_cmake_project(OpenVDB +add_cmake_project(OpenVDB # 8.2 patched URL https://github.com/tamasmeszaros/openvdb/archive/a68fd58d0e2b85f01adeb8b13d7555183ab10aa5.zip URL_HASH SHA256=f353e7b99bd0cbfc27ac9082de51acf32a8bc0b3e21ff9661ecca6f205ec1d81 - DEPENDS dep_TBB dep_Blosc dep_OpenEXR dep_Boost CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DOPENVDB_BUILD_PYTHON_MODULE=OFF @@ -34,15 +29,4 @@ prusaslicer_add_cmake_project(OpenVDB -DDISABLE_DEPENDENCY_VERSION_CHECKS=ON # Centos6 has old zlib ) -if (MSVC) - if (${DEP_DEBUG}) - ExternalProject_Get_Property(dep_OpenVDB BINARY_DIR) - ExternalProject_Add_Step(dep_OpenVDB build_debug - DEPENDEES build - DEPENDERS install - COMMAND ${CMAKE_COMMAND} ../dep_OpenVDB -DOPENVDB_BUILD_VDB_PRINT=OFF - COMMAND msbuild /m /P:Configuration=Debug INSTALL.vcxproj - WORKING_DIRECTORY "${BINARY_DIR}" - ) - endif () -endif () \ No newline at end of file +set(DEP_OpenVDB_DEPENDS TBB Blosc OpenEXR Boost) diff --git a/deps/+PNG/CMakeLists.txt.patched b/deps/+PNG/CMakeLists.txt.patched new file mode 100644 index 0000000000..c70f624d09 --- /dev/null +++ b/deps/+PNG/CMakeLists.txt.patched @@ -0,0 +1,989 @@ +# CMakeLists.txt + +# Copyright (C) 2007,2009-2018 Glenn Randers-Pehrson +# Written by Christian Ehrlicher, 2007 +# Revised by Roger Lowman, 2009-2010 +# Revised by Clifford Yapp, 2011-2012 +# Revised by Roger Leigh, 2016 +# Revised by Andreas Franek, 2016 + +# This code is released under the libpng license. +# For conditions of distribution and use, see the disclaimer +# and license in png.h + +cmake_minimum_required(VERSION 3.0.2) +cmake_policy(VERSION 3.0.2) + +# Set MacOSX @rpath usage globally. +if (POLICY CMP0020) + cmake_policy(SET CMP0020 NEW) +endif(POLICY CMP0020) +if (POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) +endif(POLICY CMP0042) +# Use new variable expansion policy. +if (POLICY CMP0053) + cmake_policy(SET CMP0053 NEW) +endif(POLICY CMP0053) +if (POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif(POLICY CMP0054) + +set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo") + +project(libpng C ASM) +enable_testing() + +set(PNGLIB_MAJOR 1) +set(PNGLIB_MINOR 6) +set(PNGLIB_RELEASE 35) +set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR}) +set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE}) + +include(GNUInstallDirs) + +# needed packages + +#Allow users to specify location of Zlib, +# Useful if zlib is being built alongside this as a sub-project +option(PNG_BUILD_ZLIB "Custom zlib Location, else find_package is used" OFF) + +IF(NOT PNG_BUILD_ZLIB) + find_package(ZLIB REQUIRED) + include_directories(${ZLIB_INCLUDE_DIR}) +ENDIF(NOT PNG_BUILD_ZLIB) + +if(NOT WIN32) + find_library(M_LIBRARY + NAMES m + PATHS /usr/lib /usr/local/lib + ) + if(NOT M_LIBRARY) + message(STATUS "math lib 'libm' not found; floating point support disabled") + endif() +else() + # not needed on windows + set(M_LIBRARY "") +endif() + +# COMMAND LINE OPTIONS +option(PNG_SHARED "Build shared lib" ON) +option(PNG_STATIC "Build static lib" ON) +option(PNG_TESTS "Build libpng tests" ON) + +# Many more configuration options could be added here +option(PNG_FRAMEWORK "Build OS X framework" OFF) +option(PNG_DEBUG "Build with debug output" OFF) +option(PNGARG "Disable ANSI-C prototypes" OFF) + +option(PNG_HARDWARE_OPTIMIZATIONS "Enable Hardware Optimizations" ON) + + +set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names") +set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings") + +# CMake currently sets CMAKE_SYSTEM_PROCESSOR to one of x86_64 or arm64 on macOS, +# based upon the OS architecture, not the target architecture. As such, we need +# to check CMAKE_OSX_ARCHITECTURES to identify which hardware-specific flags to +# enable. Note that this will fail if you attempt to build a universal binary in +# a single CMake invocation. +if (APPLE AND CMAKE_OSX_ARCHITECTURES) + set(TARGET_ARCH ${CMAKE_OSX_ARCHITECTURES}) +else() + set(TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}) +endif() + +if(PNG_HARDWARE_OPTIMIZATIONS) + +# Set definitions and sources for ARM. +if(TARGET_ARCH MATCHES "^arm" OR + TARGET_ARCH MATCHES "^aarch64") + if(TARGET_ARCH MATCHES "^arm64" OR + TARGET_ARCH MATCHES "^aarch64") + set(PNG_ARM_NEON_POSSIBLE_VALUES on off) + set(PNG_ARM_NEON "on" + CACHE STRING "Enable ARM NEON optimizations: on|off; on is default") + else() + set(PNG_ARM_NEON_POSSIBLE_VALUES check on off) + set(PNG_ARM_NEON "check" + CACHE STRING "Enable ARM NEON optimizations: check|on|off; check is default") + endif() + set_property(CACHE PNG_ARM_NEON + PROPERTY STRINGS ${PNG_ARM_NEON_POSSIBLE_VALUES}) + list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index) + if(index EQUAL -1) + message(FATAL_ERROR + " PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]") + elseif(NOT ${PNG_ARM_NEON} STREQUAL "no") + set(libpng_arm_sources + arm/arm_init.c + arm/filter_neon.S + arm/filter_neon_intrinsics.c) + + if(${PNG_ARM_NEON} STREQUAL "on") + add_definitions(-DPNG_ARM_NEON_OPT=2) + elseif(${PNG_ARM_NEON} STREQUAL "check") + add_definitions(-DPNG_ARM_NEON_CHECK_SUPPORTED) + endif() + else() + add_definitions(-DPNG_ARM_NEON_OPT=0) + endif() +endif() + +# Set definitions and sources for PowerPC. +if(TARGET_ARCH MATCHES "^powerpc*" OR + TARGET_ARCH MATCHES "^ppc64*") + set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off) + set(PNG_POWERPC_VSX "on" CACHE STRING "Enable POWERPC VSX optimizations: + off: disable the optimizations.") + set_property(CACHE PNG_POWERPC_VSX PROPERTY STRINGS + ${PNG_POWERPC_VSX_POSSIBLE_VALUES}) + list(FIND PNG_POWERPC_VSX_POSSIBLE_VALUES ${PNG_POWERPC_VSX} index) + if(index EQUAL -1) + message(FATAL_ERROR + " PNG_POWERPC_VSX must be one of [${PNG_POWERPC_VSX_POSSIBLE_VALUES}]") + elseif(NOT ${PNG_POWERPC_VSX} STREQUAL "no") + set(libpng_powerpc_sources + powerpc/powerpc_init.c + powerpc/filter_vsx_intrinsics.c) + if(${PNG_POWERPC_VSX} STREQUAL "on") + add_definitions(-DPNG_POWERPC_VSX_OPT=2) + endif() + else() + add_definitions(-DPNG_POWERPC_VSX_OPT=0) + endif() +endif() + +# Set definitions and sources for Intel. +if(TARGET_ARCH MATCHES "^i?86" OR + TARGET_ARCH MATCHES "^x86_64*") + set(PNG_INTEL_SSE_POSSIBLE_VALUES on off) + set(PNG_INTEL_SSE "on" CACHE STRING "Enable INTEL_SSE optimizations: + off: disable the optimizations") + set_property(CACHE PNG_INTEL_SSE PROPERTY STRINGS + ${PNG_INTEL_SSE_POSSIBLE_VALUES}) + list(FIND PNG_INTEL_SSE_POSSIBLE_VALUES ${PNG_INTEL_SSE} index) + if(index EQUAL -1) + message(FATAL_ERROR + " PNG_INTEL_SSE must be one of [${PNG_INTEL_SSE_POSSIBLE_VALUES}]") + elseif(NOT ${PNG_INTEL_SSE} STREQUAL "no") + set(libpng_intel_sources + intel/intel_init.c + intel/filter_sse2_intrinsics.c) + if(${PNG_INTEL_SSE} STREQUAL "on") + add_definitions(-DPNG_INTEL_SSE_OPT=1) + endif() + else() + add_definitions(-DPNG_INTEL_SSE_OPT=0) + endif() +endif() + +# Set definitions and sources for MIPS. +if(TARGET_ARCH MATCHES "mipsel*" OR + TARGET_ARCH MATCHES "mips64el*") + set(PNG_MIPS_MSA_POSSIBLE_VALUES on off) + set(PNG_MIPS_MSA "on" CACHE STRING "Enable MIPS_MSA optimizations: + off: disable the optimizations") + set_property(CACHE PNG_MIPS_MSA PROPERTY STRINGS + ${PNG_MIPS_MSA_POSSIBLE_VALUES}) + list(FIND PNG_MIPS_MSA_POSSIBLE_VALUES ${PNG_MIPS_MSA} index) + if(index EQUAL -1) + message(FATAL_ERROR + " PNG_MIPS_MSA must be one of [${PNG_MIPS_MSA_POSSIBLE_VALUES}]") + elseif(NOT ${PNG_MIPS_MSA} STREQUAL "no") + set(libpng_mips_sources + mips/mips_init.c + mips/filter_msa_intrinsics.c) + if(${PNG_MIPS_MSA} STREQUAL "on") + add_definitions(-DPNG_MIPS_MSA_OPT=2) + endif() + else() + add_definitions(-DPNG_MIPS_MSA_OPT=0) + endif() +endif() + +else(PNG_HARDWARE_OPTIMIZATIONS) + +# Set definitions and sources for ARM. +if(TARGET_ARCH MATCHES "^arm" OR + TARGET_ARCH MATCHES "^aarch64") + add_definitions(-DPNG_ARM_NEON_OPT=0) +endif() + +# Set definitions and sources for PowerPC. +if(TARGET_ARCH MATCHES "^powerpc*" OR + TARGET_ARCH MATCHES "^ppc64*") + add_definitions(-DPNG_POWERPC_VSX_OPT=0) +endif() + +# Set definitions and sources for Intel. +if(TARGET_ARCH MATCHES "^i?86" OR + TARGET_ARCH MATCHES "^x86_64*") + add_definitions(-DPNG_INTEL_SSE_OPT=0) +endif() + +# Set definitions and sources for MIPS. +if(TARGET_ARCH MATCHES "mipsel*" OR + TARGET_ARCH MATCHES "mips64el*") + add_definitions(-DPNG_MIPS_MSA_OPT=0) +endif() + +endif(PNG_HARDWARE_OPTIMIZATIONS) + +# SET LIBNAME +set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR}) + +# to distinguish between debug and release lib +set(CMAKE_DEBUG_POSTFIX "d") + +include(CheckCSourceCompiles) +option(ld-version-script "Enable linker version script" ON) +if(ld-version-script AND NOT APPLE) + # Check if LD supports linker scripts. + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 { + global: sym; + local: *; +}; + +VERS_2 { + global: sym2; + main; +} VERS_1; +") + set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/conftest.map'") + check_c_source_compiles("void sym(void) {} +void sym2(void) {} +int main(void) {return 0;} +" HAVE_LD_VERSION_SCRIPT) + if(NOT HAVE_LD_VERSION_SCRIPT) + set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE} "-Wl,-M -Wl,${CMAKE_CURRENT_BINARY_DIR}/conftest.map") + check_c_source_compiles("void sym(void) {} +void sym2(void) {} +int main(void) {return 0;} +" HAVE_SOLARIS_LD_VERSION_SCRIPT) + endif() + set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) + file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map") +endif() + +# Find symbol prefix. Likely obsolete and unnecessary with recent +# toolchains (it's not done in many other projects). +function(symbol_prefix) + set(SYMBOL_PREFIX) + + execute_process(COMMAND "${CMAKE_C_COMPILER}" "-E" "-" + INPUT_FILE /dev/null + OUTPUT_VARIABLE OUT + RESULT_VARIABLE STATUS) + + if(CPP_FAIL) + message(WARNING "Failed to run the C preprocessor") + endif() + + string(REPLACE "\n" ";" OUT "${OUT}") + foreach(line ${OUT}) + string(REGEX MATCH "^PREFIX=" found_match "${line}") + if(found_match) + STRING(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}") + string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}") + if(found_match) + STRING(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}") + endif() + set(SYMBOL_PREFIX "${prefix}") + endif() + endforeach() + + message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}") + set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE) +endfunction() + +if(UNIX) + symbol_prefix() +endif() + +find_program(AWK NAMES gawk awk) + +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +if(NOT AWK OR ANDROID) + # No awk available to generate sources; use pre-built pnglibconf.h + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt + ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h) + add_custom_target(genfiles) # Dummy +else() + include(CMakeParseArguments) + # Generate .chk from .out with awk + # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]]) + function(generate_chk) + set(options) + set(oneValueArgs INPUT OUTPUT) + set(multiValueArgs DEPENDS) + cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if (NOT _GC_INPUT) + message(FATAL_ERROR "Invalid arguments. generate_out requires input.") + endif() + if (NOT _GC_OUTPUT) + message(FATAL_ERROR "Invalid arguments. generate_out requires output.") + endif() + + add_custom_command(OUTPUT "${_GC_OUTPUT}" + COMMAND "${CMAKE_COMMAND}" + "-DINPUT=${_GC_INPUT}" + "-DOUTPUT=${_GC_OUTPUT}" + -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake" + DEPENDS "${_GC_INPUT}" ${_GC_DEPENDS} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + endfunction() + + # Generate .out from .c with awk + # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]]) + function(generate_out) + set(options) + set(oneValueArgs INPUT OUTPUT) + set(multiValueArgs DEPENDS) + cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if (NOT _GO_INPUT) + message(FATAL_ERROR "Invalid arguments. generate_out requires input.") + endif() + if (NOT _GO_OUTPUT) + message(FATAL_ERROR "Invalid arguments. generate_out requires output.") + endif() + + add_custom_command(OUTPUT "${_GO_OUTPUT}" + COMMAND "${CMAKE_COMMAND}" + "-DINPUT=${_GO_INPUT}" + "-DOUTPUT=${_GO_OUTPUT}" + -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake" + DEPENDS "${_GO_INPUT}" ${_GO_DEPENDS} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + endfunction() + + # Generate specific source file with awk + # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]]) + function(generate_source) + set(options) + set(oneValueArgs OUTPUT) + set(multiValueArgs DEPENDS) + cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if (NOT _GSO_OUTPUT) + message(FATAL_ERROR "Invalid arguments. generate_source requires output.") + endif() + + add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_GSO_OUTPUT}" + COMMAND "${CMAKE_COMMAND}" + "-DOUTPUT=${_GSO_OUTPUT}" + -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake" + DEPENDS ${_GSO_DEPENDS} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + endfunction() + + # Copy file + function(generate_copy source destination) + add_custom_command(OUTPUT "${destination}" + COMMAND "${CMAKE_COMMAND}" -E remove "${destination}" + COMMAND "${CMAKE_COMMAND}" -E copy "${source}" + "${destination}" + DEPENDS "${source}") + endfunction() + + # Generate scripts/pnglibconf.h + generate_source(OUTPUT "scripts/pnglibconf.c" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa" + "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk" + "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h") + + # Generate pnglibconf.c + generate_source(OUTPUT "pnglibconf.c" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa" + "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk" + "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h") + + if(PNG_PREFIX) + set(PNGLIBCONF_H_EXTRA_DEPENDS + "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out" + "${CMAKE_CURRENT_SOURCE_DIR}/scripts/macro.lst") + set(PNGPREFIX_H_EXTRA_DEPENDS + "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out") + endif() + + generate_out(INPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c" + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out") + + # Generate pnglibconf.h + generate_source(OUTPUT "pnglibconf.h" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out" + ${PNGLIBCONF_H_EXTRA_DEPENDS}) + + generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/intprefix.c" + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h") + + generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prefix.c" + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h" + "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h" + "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out") + + # Generate pngprefix.h + generate_source(OUTPUT "pngprefix.h" + DEPENDS ${PNGPREFIX_H_EXTRA_DEPENDS}) + + generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/sym.c" + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h") + + generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.c" + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h" + "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h" + "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt") + + generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/vers.c" + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h" + "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h" + "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h") + + generate_chk(INPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out" + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk" + "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def") + + add_custom_target(symbol-check DEPENDS + "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk") + + generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" + "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") + generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out" + "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") + + add_custom_target(genvers DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") + add_custom_target(gensym DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") + + add_custom_target("genprebuilt" + COMMAND "${CMAKE_COMMAND}" + "-DOUTPUT=scripts/pnglibconf.h.prebuilt" + -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + + # A single target handles generation of all generated files. If + # they are depended upon separately by multiple targets, this + # confuses parallel make (it would require a separate top-level + # target for each file to track the dependencies properly). + add_custom_target(genfiles DEPENDS + "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym" + "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers" + "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c" + "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h" + "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out" + "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h" + "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out" + "${CMAKE_CURRENT_BINARY_DIR}/scripts/pnglibconf.c" + "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out" + "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" + "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk" + "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out" + "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out") +endif(NOT AWK OR ANDROID) + +# OUR SOURCES +set(libpng_public_hdrs + png.h + pngconf.h + "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h" +) +set(libpng_private_hdrs + pngpriv.h + pngdebug.h + pnginfo.h + pngstruct.h +) +if(AWK AND NOT ANDROID) + list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h") +endif() +set(libpng_sources + ${libpng_public_hdrs} + ${libpng_private_hdrs} + png.c + pngerror.c + pngget.c + pngmem.c + pngpread.c + pngread.c + pngrio.c + pngrtran.c + pngrutil.c + pngset.c + pngtrans.c + pngwio.c + pngwrite.c + pngwtran.c + pngwutil.c + ${libpng_arm_sources} + ${libpng_intel_sources} + ${libpng_mips_sources} + ${libpng_powerpc_sources} +) +set(pngtest_sources + pngtest.c +) +set(pngvalid_sources + contrib/libtests/pngvalid.c +) +set(pngstest_sources + contrib/libtests/pngstest.c +) +set(pngunknown_sources + contrib/libtests/pngunknown.c +) +set(pngimage_sources + contrib/libtests/pngimage.c +) +set(pngfix_sources + contrib/tools/pngfix.c +) +set(png_fix_itxt_sources + contrib/tools/png-fix-itxt.c +) + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_DEPRECATE) +endif(MSVC) + +if(PNG_DEBUG) + add_definitions(-DPNG_DEBUG) +endif() + +# NOW BUILD OUR TARGET +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR}) + +unset(PNG_LIB_TARGETS) + +if(PNG_SHARED) + add_library(png SHARED ${libpng_sources}) + set(PNG_LIB_TARGETS png) + set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME}) + add_dependencies(png genfiles) + if(MSVC) + # msvc does not append 'lib' - do it here to have consistent name + set_target_properties(png PROPERTIES PREFIX "lib") + set_target_properties(png PROPERTIES IMPORT_PREFIX "lib") + endif() + target_link_libraries(png ${ZLIB_LIBRARY} ${M_LIBRARY}) + + if(UNIX AND AWK) + if(HAVE_LD_VERSION_SCRIPT) + set_target_properties(png PROPERTIES LINK_FLAGS + "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'") + elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT) + set_target_properties(png PROPERTIES LINK_FLAGS + "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'") + endif() + endif() +endif() + +if(PNG_STATIC) + # does not work without changing name + set(PNG_LIB_NAME_STATIC png_static) + add_library(png_static STATIC ${libpng_sources}) + add_dependencies(png_static genfiles) + # MSVC doesn't use a different file extension for shared vs. static + # libs. We are able to change OUTPUT_NAME to remove the _static + # for all other platforms. + if(NOT MSVC) + set_target_properties(png_static PROPERTIES + OUTPUT_NAME "${PNG_LIB_NAME}" + CLEAN_DIRECT_OUTPUT 1) + else() + set_target_properties(png_static PROPERTIES + OUTPUT_NAME "${PNG_LIB_NAME}_static" + CLEAN_DIRECT_OUTPUT 1) + endif() + list(APPEND PNG_LIB_TARGETS png_static) + if(MSVC) + # msvc does not append 'lib' - do it here to have consistent name + set_target_properties(png_static PROPERTIES PREFIX "lib") + endif() + target_link_libraries(png_static ${ZLIB_LIBRARY} ${M_LIBRARY}) +endif() + +if(PNG_FRAMEWORK) + set(PNG_LIB_NAME_FRAMEWORK png_framework) + add_library(png_framework SHARED ${libpng_sources}) + add_dependencies(png_framework genfiles) + list(APPEND PNG_LIB_TARGETS png_framework) + set_target_properties(png_framework PROPERTIES + FRAMEWORK TRUE + FRAMEWORK_VERSION ${PNGLIB_VERSION} + MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR} + MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION} + MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng + XCODE_ATTRIBUTE_INSTALL_PATH "@rpath" + PUBLIC_HEADER "${libpng_public_hdrs}" + OUTPUT_NAME png) + target_link_libraries(png_framework ${ZLIB_LIBRARY} ${M_LIBRARY}) +endif() + +if(NOT PNG_LIB_TARGETS) + message(SEND_ERROR + "No library variant selected to build. " + "Please enable at least one of the following options: " + " PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK") +endif() + +if(PNG_SHARED AND WIN32) + set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL) +endif() + +function(png_add_test) + set(options) + set(oneValueArgs NAME COMMAND) + set(multiValueArgs OPTIONS FILES) + cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT _PAT_NAME) + message(FATAL_ERROR "Invalid arguments. png_add_test requires name.") + endif() + if (NOT _PAT_COMMAND) + message(FATAL_ERROR "Invalid arguments. png_add_test requires command.") + endif() + + set(TEST_OPTIONS "${_PAT_OPTIONS}") + set(TEST_FILES "${_PAT_FILES}") + + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY) + if(CMAKE_MAJOR_VERSION GREATER 2) # have generator expressions + add_test(NAME "${_PAT_NAME}" + COMMAND "${CMAKE_COMMAND}" + "-DLIBPNG=$" + "-DTEST_COMMAND=$" + -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake") + else() # old 2.x add_test; limited and won't work well on Windows + # Note LIBPNG is a dummy value as there are no generator expressions + add_test("${_PAT_NAME}" "${CMAKE_COMMAND}" + "-DLIBPNG=${CMAKE_CURRENT_BINARY_DIR}/libpng.so" + "-DTEST_COMMAND=./${_PAT_COMMAND}" + -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake") + endif() +endfunction() + +if(PNG_TESTS AND PNG_SHARED) + # Find test PNG files by globbing, but sort lists to ensure + # consistency between different filesystems. + file(GLOB PNGSUITE_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/*.png") + list(SORT PNGSUITE_PNGS) + file(GLOB TEST_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/testpngs/*.png") + list(SORT TEST_PNGS) + + set(PNGTEST_PNG "${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png") + + add_executable(pngtest ${pngtest_sources}) + target_link_libraries(pngtest png) + + png_add_test(NAME pngtest COMMAND pngtest FILES "${PNGTEST_PNG}") + + add_executable(pngvalid ${pngvalid_sources}) + target_link_libraries(pngvalid png) + + png_add_test(NAME pngvalid-gamma-16-to-8 + COMMAND pngvalid OPTIONS --gamma-16-to-8) + png_add_test(NAME pngvalid-gamma-alpha-mode + COMMAND pngvalid OPTIONS --gamma-alpha-mode) + png_add_test(NAME pngvalid-gamma-background + COMMAND pngvalid OPTIONS --gamma-background) + png_add_test(NAME pngvalid-gamma-expand16-alpha-mode + COMMAND pngvalid OPTIONS --gamma-alpha-mode --expand16) + png_add_test(NAME pngvalid-gamma-expand16-background + COMMAND pngvalid OPTIONS --gamma-background --expand16) + png_add_test(NAME pngvalid-gamma-expand16-transform + COMMAND pngvalid OPTIONS --gamma-transform --expand16) + png_add_test(NAME pngvalid-gamma-sbit + COMMAND pngvalid OPTIONS --gamma-sbit) + png_add_test(NAME pngvalid-gamma-threshold + COMMAND pngvalid OPTIONS --gamma-threshold) + png_add_test(NAME pngvalid-gamma-transform + COMMAND pngvalid OPTIONS --gamma-transform) + png_add_test(NAME pngvalid-progressive-interlace-standard + COMMAND pngvalid OPTIONS --standard --progressive-read --interlace) + png_add_test(NAME pngvalid-progressive-size + COMMAND pngvalid OPTIONS --size --progressive-read) + png_add_test(NAME pngvalid-progressive-standard + COMMAND pngvalid OPTIONS --standard --progressive-read) + png_add_test(NAME pngvalid-standard + COMMAND pngvalid OPTIONS --standard) + png_add_test(NAME pngvalid-transform + COMMAND pngvalid OPTIONS --transform) + + add_executable(pngstest ${pngstest_sources}) + target_link_libraries(pngstest png) + + foreach(gamma_type 1.8 linear none sRGB) + foreach(alpha_type none alpha) + set(PNGSTEST_FILES) + foreach(test_png ${TEST_PNGS}) + string(REGEX MATCH ".*-linear[-.].*" TEST_PNG_LINEAR "${test_png}") + string(REGEX MATCH ".*-sRGB[-.].*" TEST_PNG_SRGB "${test_png}") + string(REGEX MATCH ".*-1.8[-.].*" TEST_PNG_G18 "${test_png}") + string(REGEX MATCH ".*-alpha-.*" TEST_PNG_ALPHA "${test_png}") + + set(TEST_PNG_VALID TRUE) + + if(TEST_PNG_ALPHA) + if (NOT "${alpha_type}" STREQUAL "alpha") + set(TEST_PNG_VALID FALSE) + endif() + else() + if ("${alpha_type}" STREQUAL "alpha") + set(TEST_PNG_VALID FALSE) + endif() + endif() + + if(TEST_PNG_LINEAR) + if(NOT "${gamma_type}" STREQUAL "linear") + set(TEST_PNG_VALID FALSE) + endif() + elseif(TEST_PNG_SRGB) + if(NOT "${gamma_type}" STREQUAL "sRGB") + set(TEST_PNG_VALID FALSE) + endif() + elseif(TEST_PNG_G18) + if(NOT "${gamma_type}" STREQUAL "1.8") + set(TEST_PNG_VALID FALSE) + endif() + else() + if(NOT "${gamma_type}" STREQUAL "none") + set(TEST_PNG_VALID FALSE) + endif() + endif() + + if(TEST_PNG_VALID) + list(APPEND PNGSTEST_FILES "${test_png}") + endif() + endforeach() + # Should already be sorted, but sort anyway to be certain. + list(SORT PNGSTEST_FILES) + png_add_test(NAME pngstest-${gamma_type}-${alpha_type} + COMMAND pngstest + OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log + FILES ${PNGSTEST_FILES}) + endforeach() + endforeach() + + add_executable(pngunknown ${pngunknown_sources}) + target_link_libraries(pngunknown png) + + png_add_test(NAME pngunknown-discard COMMAND pngunknown OPTIONS --strict default=discard FILES "${PNGTEST_PNG}") + png_add_test(NAME pngunknown-IDAT COMMAND pngunknown OPTIONS --strict default=discard IDAT=save FILES "${PNGTEST_PNG}") + png_add_test(NAME pngunknown-if-safe COMMAND pngunknown OPTIONS --strict default=if-safe FILES "${PNGTEST_PNG}") + png_add_test(NAME pngunknown-sAPI COMMAND pngunknown OPTIONS --strict bKGD=save cHRM=save gAMA=save all=discard iCCP=save sBIT=save sRGB=save FILES "${PNGTEST_PNG}") + png_add_test(NAME pngunknown-save COMMAND pngunknown OPTIONS --strict default=save FILES "${PNGTEST_PNG}") + png_add_test(NAME pngunknown-sTER COMMAND pngunknown OPTIONS --strict sTER=if-safe FILES "${PNGTEST_PNG}") + png_add_test(NAME pngunknown-vpAg COMMAND pngunknown OPTIONS --strict vpAg=if-safe FILES "${PNGTEST_PNG}") + + add_executable(pngimage ${pngimage_sources}) + target_link_libraries(pngimage png) + + png_add_test(NAME pngimage-quick COMMAND pngimage OPTIONS --list-combos --log FILES ${PNGSUITE_PNGS}) + png_add_test(NAME pngimage-full COMMAND pngimage OPTIONS --exhaustive --list-combos --log FILES ${PNGSUITE_PNGS}) +endif() + +if(PNG_SHARED) + add_executable(pngfix ${pngfix_sources}) + target_link_libraries(pngfix png) + set(PNG_BIN_TARGETS pngfix) + + add_executable(png-fix-itxt ${png_fix_itxt_sources}) + target_link_libraries(png-fix-itxt ${ZLIB_LIBRARY} ${M_LIBRARY}) + list(APPEND PNG_BIN_TARGETS png-fix-itxt) +endif() + +# Set a variable with CMake code which: +# Creates a symlink from src to dest (if possible) or alternatively +# copies if different. +include(CMakeParseArguments) + +function(CREATE_SYMLINK DEST_FILE) + + cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN}) + + if(NOT S_TARGET AND NOT S_FILE) + message(FATAL_ERROR "Specify either a TARGET or a FILE for CREATE_SYMLINK to link to.") + endif(NOT S_TARGET AND NOT S_FILE) + + if(S_TARGET AND S_FILE) + message(FATAL_ERROR "CREATE_SYMLINK called with both source file ${S_FILE} and build target ${S_TARGET} arguments - can only handle 1 type per call.") + endif(S_TARGET AND S_FILE) + + if(S_FILE) + # If we don't need to symlink something that's coming from a build target, + # we can go ahead and symlink/copy at configure time. + + if(CMAKE_HOST_WIN32 AND NOT CYGWIN AND NOT MSYS) + execute_process( + COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + ) + else(CMAKE_HOST_WIN32 AND NOT CYGWIN AND NOT MSYS) + execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + ) + endif(CMAKE_HOST_WIN32 AND NOT CYGWIN AND NOT MSYS) + endif(S_FILE) + + if(S_TARGET) + # We need to use generator expressions, which can be a bit tricky, so for + # simplicity make the symlink a POST_BUILD step and use the TARGET + # signature of add_custom_command. + + if(CMAKE_HOST_WIN32 AND NOT CYGWIN AND NOT MSYS) + add_custom_command(TARGET ${S_TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy_if_different $ $/${DEST_FILE} + ) + else(CMAKE_HOST_WIN32 AND NOT CYGWIN AND NOT MSYS) + add_custom_command(TARGET ${S_TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E create_symlink $ $/${DEST_FILE} + ) + endif(CMAKE_HOST_WIN32 AND NOT CYGWIN AND NOT MSYS) + + endif(S_TARGET) + +endfunction() + +# Create source generation scripts. +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY) + + +# libpng is a library so default to 'lib' +if(NOT DEFINED CMAKE_INSTALL_LIBDIR) + set(CMAKE_INSTALL_LIBDIR lib) +endif(NOT DEFINED CMAKE_INSTALL_LIBDIR) + +# CREATE PKGCONFIG FILES +# we use the same files like ./configure, so we have to set its vars +# Only do this on Windows for Cygwin - the files don't make much sense outside +# a UNIX look alike +if(NOT WIN32 OR CYGWIN OR MINGW) + set(prefix ${CMAKE_INSTALL_PREFIX}) + set(exec_prefix ${CMAKE_INSTALL_PREFIX}) + set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) + set(includedir ${CMAKE_INSTALL_PREFIX}/include) + set(LIBS "-lz -lm") + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY) + CREATE_SYMLINK(libpng.pc FILE ${PNGLIB_NAME}.pc) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in + ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY) + CREATE_SYMLINK(libpng-config FILE ${PNGLIB_NAME}-config) +endif(NOT WIN32 OR CYGWIN OR MINGW) + +# SET UP LINKS +if(PNG_SHARED) + set_target_properties(png PROPERTIES +# VERSION 16.${PNGLIB_RELEASE}.1.6.35 + VERSION 16.${PNGLIB_RELEASE}.0 + SOVERSION 16 + CLEAN_DIRECT_OUTPUT 1) +endif() + +# If CMake > 2.4.x, we set a variable used below to export +# targets to an export file. +# TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2 +if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4) + set(PNG_EXPORT_RULE EXPORT libpng) +elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof + set(PNG_EXPORT_RULE EXPORT libpng) +endif() + +# INSTALL +if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) + install(TARGETS ${PNG_LIB_TARGETS} + ${PNG_EXPORT_RULE} + RUNTIME DESTINATION bin + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}) + + if(PNG_SHARED) + # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin + if(CYGWIN OR MINGW) + CREATE_SYMLINK(libpng${CMAKE_IMPORT_LIBRARY_SUFFIX} TARGET png) + install(FILES $/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + endif(CYGWIN OR MINGW) + + if(NOT WIN32) + CREATE_SYMLINK(libpng${CMAKE_SHARED_LIBRARY_SUFFIX} TARGET png) + install(FILES $/libpng${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + endif(NOT WIN32) + endif(PNG_SHARED) + + if(PNG_STATIC) + if(NOT WIN32 OR CYGWIN OR MINGW) + CREATE_SYMLINK( libpng${CMAKE_STATIC_LIBRARY_SUFFIX} TARGET png_static) + install(FILES $/libpng${CMAKE_STATIC_LIBRARY_SUFFIX} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + endif(NOT WIN32 OR CYGWIN OR MINGW) + endif() +endif() + +if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL ) + install(FILES ${libpng_public_hdrs} DESTINATION include) + install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME}) +endif() +if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL ) + if(NOT WIN32 OR CYGWIN OR MINGW) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config + DESTINATION bin) + endif(NOT WIN32 OR CYGWIN OR MINGW) +endif() + +if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL ) + install(TARGETS ${PNG_BIN_TARGETS} + RUNTIME DESTINATION bin) +endif() + +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + # Install man pages + if(NOT PNG_MAN_DIR) + set(PNG_MAN_DIR "share/man") + endif() + install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3) + install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5) + # Install pkg-config files + if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config + DESTINATION bin) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config + DESTINATION bin) + endif(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW) +endif() + +# On versions of CMake that support it, create an export file CMake +# users can include() to import our targets +if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL ) + install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake) +endif() + +# what's with libpng-manual.txt and all the extra files? + +# UNINSTALL +# do we need this? + +# DIST +# do we need this? + +# to create msvc import lib for mingw compiled shared lib +# pexports libpng.dll > libpng.def +# lib /def:libpng.def /machine:x86 diff --git a/deps/+PNG/PNG.cmake b/deps/+PNG/PNG.cmake new file mode 100644 index 0000000000..f2ef60035f --- /dev/null +++ b/deps/+PNG/PNG.cmake @@ -0,0 +1,27 @@ +if (APPLE) + # Only disable NEON extension for Apple ARM builds, leave it enabled for Raspberry PI. + set(_disable_neon_extension "-DPNG_ARM_NEON:STRING=off") +else () + set(_disable_neon_extension "") +endif () + +set(_patch_cmd PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.patched CMakeLists.txt) + +if (APPLE) + set(_patch_cmd ${_patch_cmd} && ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/PNG.patch) +endif () + +add_cmake_project(PNG + URL https://github.com/glennrp/libpng/archive/refs/tags/v1.6.35.zip + URL_HASH SHA256=3d22d46c566b1761a0e15ea397589b3a5f36ac09b7c785382e6470156c04247f + PATCH_COMMAND "${_patch_cmd}" + CMAKE_ARGS + -DPNG_SHARED=OFF + -DPNG_STATIC=ON + -DPNG_PREFIX=prusaslicer_ + -DPNG_TESTS=OFF + -DPNG_EXECUTABLES=OFF + ${_disable_neon_extension} +) + +set(DEP_PNG_DEPENDS ZLIB) diff --git a/deps/PNG/PNG.patch b/deps/+PNG/PNG.patch similarity index 100% rename from deps/PNG/PNG.patch rename to deps/+PNG/PNG.patch diff --git a/deps/+Qhull/Qhull.cmake b/deps/+Qhull/Qhull.cmake new file mode 100644 index 0000000000..011f58e2d5 --- /dev/null +++ b/deps/+Qhull/Qhull.cmake @@ -0,0 +1,19 @@ +include(GNUInstallDirs) + +set(_qhull_static_libs "-DBUILD_STATIC_LIBS:BOOL=ON") +set(_qhull_shared_libs "-DBUILD_SHARED_LIBS:BOOL=OFF") +if (BUILD_SHARED_LIBS) + set(_qhull_static_libs "-DBUILD_STATIC_LIBS:BOOL=OFF") + set(_qhull_shared_libs "-DBUILD_SHARED_LIBS:BOOL=ON") +endif () + +add_cmake_project(Qhull + URL "https://github.com/qhull/qhull/archive/refs/tags/v8.1-alpha3.zip" + URL_HASH SHA256=7bd9b5ffae01e69c2ead52f9a9b688af6c65f9a1da05da0a170fa20d81404c06 + CMAKE_ARGS + -DINCLUDE_INSTALL_DIR=${CMAKE_INSTALL_INCLUDEDIR} + -DBUILD_APPLICATIONS:BOOL=OFF + ${_qhull_shared_libs} + ${_qhull_static_libs} + -DQHULL_ENABLE_TESTING:BOOL=OFF +) diff --git a/deps/TBB/TBB.cmake b/deps/+TBB/TBB.cmake similarity index 51% rename from deps/TBB/TBB.cmake rename to deps/+TBB/TBB.cmake index 93904fb771..95ac76b69c 100644 --- a/deps/TBB/TBB.cmake +++ b/deps/+TBB/TBB.cmake @@ -1,20 +1,12 @@ -#/|/ Copyright (c) Prusa Research 2021 - 2022 Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01 -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -prusaslicer_add_cmake_project( +add_cmake_project( TBB URL "https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2021.5.0.zip" URL_HASH SHA256=83ea786c964a384dd72534f9854b419716f412f9d43c0be88d41874763e7bb47 CMAKE_ARGS - -DTBB_BUILD_SHARED=OFF + -DTBB_BUILD_SHARED=${BUILD_SHARED_LIBS} -DTBB_TEST=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_DEBUG_POSTFIX=_debug ) -if (MSVC) - add_debug_dep(dep_TBB) -endif () - diff --git a/deps/+TIFF/TIFF.cmake b/deps/+TIFF/TIFF.cmake new file mode 100644 index 0000000000..9281dd5a6c --- /dev/null +++ b/deps/+TIFF/TIFF.cmake @@ -0,0 +1,15 @@ +add_cmake_project(TIFF + URL https://gitlab.com/libtiff/libtiff/-/archive/v4.6.0/libtiff-v4.6.0.zip + URL_HASH SHA256=5d652432123223338a6ee642a6499d98ebc5a702f8a065571e1001d4c08c37e6 + CMAKE_ARGS + -Dtiff-tools:BOOL=OFF + -Dtiff-tests:BOOL=OFF + -Dlzma:BOOL=OFF + -Dwebp:BOOL=OFF + -Djbig:BOOL=OFF + -Dzstd:BOOL=OFF + -Dpixarlog:BOOL=OFF + -Dlibdeflate:BOOL=OFF +) + +set(DEP_TIFF_DEPENDS ZLIB PNG JPEG OpenGL) diff --git a/deps/ZLIB/0001-Respect-BUILD_SHARED_LIBS.patch b/deps/+ZLIB/0001-Respect-BUILD_SHARED_LIBS.patch similarity index 100% rename from deps/ZLIB/0001-Respect-BUILD_SHARED_LIBS.patch rename to deps/+ZLIB/0001-Respect-BUILD_SHARED_LIBS.patch diff --git a/deps/ZLIB/ZLIB.cmake b/deps/+ZLIB/ZLIB.cmake similarity index 58% rename from deps/ZLIB/ZLIB.cmake rename to deps/+ZLIB/ZLIB.cmake index 2afc7f56eb..60ba8c7e71 100644 --- a/deps/ZLIB/ZLIB.cmake +++ b/deps/+ZLIB/ZLIB.cmake @@ -1,10 +1,4 @@ -#/|/ Copyright (c) Prusa Research 2019 - 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -prusaslicer_add_cmake_project(ZLIB - # GIT_REPOSITORY https://github.com/madler/zlib.git - # GIT_TAG v1.2.11 +add_cmake_project(ZLIB URL https://github.com/madler/zlib/archive/refs/tags/v1.2.11.zip URL_HASH SHA256=f5cc4ab910db99b2bdbba39ebbdc225ffc2aa04b4057bc2817f1b94b6978cfc3 PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-Respect-BUILD_SHARED_LIBS.patch diff --git a/deps/+heatshrink/CMakeLists.txt b/deps/+heatshrink/CMakeLists.txt new file mode 100644 index 0000000000..86aa1ddc98 --- /dev/null +++ b/deps/+heatshrink/CMakeLists.txt @@ -0,0 +1,82 @@ +cmake_minimum_required(VERSION 3.10) + +project(heatshrink C) + +add_library(${PROJECT_NAME} heatshrink_decoder.c heatshrink_encoder.c) +add_library(${PROJECT_NAME}_dynalloc heatshrink_decoder.c heatshrink_encoder.c) + +find_library(MATH_LIBRARY m) # Business as usual +if(MATH_LIBRARY) + target_link_libraries(${PROJECT_NAME} PUBLIC ${MATH_LIBRARY}) +endif() + +target_include_directories(${PROJECT_NAME} PUBLIC $) +target_include_directories(${PROJECT_NAME}_dynalloc PUBLIC $) + +target_compile_definitions(${PROJECT_NAME} PUBLIC HEATSHRINK_DYNAMIC_ALLOC=0) +target_compile_definitions(${PROJECT_NAME}_dynalloc PUBLIC HEATSHRINK_DYNAMIC_ALLOC=1) + +if (UNIX) + add_executable(${PROJECT_NAME}_cmd heatshrink.c) + target_link_libraries(${PROJECT_NAME}_cmd ${PROJECT_NAME}_dynalloc) + set_target_properties(${PROJECT_NAME}_cmd PROPERTIES OUTPUT_NAME ${PROJECT_NAME}) +endif () + +# Installation and export: + +include(CMakePackageConfigHelpers) + +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + VERSION 0.4.1 + COMPATIBILITY AnyNewerVersion +) + +set(_exported_targets ${PROJECT_NAME} ${PROJECT_NAME}_dynalloc) +if (UNIX) + list(APPEND _exported_targets ${PROJECT_NAME}_cmd) +endif () + +install(TARGETS ${_exported_targets} + EXPORT ${PROJECT_NAME}Targets +) + +export(EXPORT ${PROJECT_NAME}Targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake" + NAMESPACE ${PROJECT_NAME}:: +) + +include(GNUInstallDirs) +set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) + +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION ${ConfigPackageLocation} +) + +install( + FILES + heatshrink_common.h + heatshrink_config.h + heatshrink_encoder.h + heatshrink_decoder.h + DESTINATION + include/${PROJECT_NAME} + ) + +install(EXPORT ${PROJECT_NAME}Targets + FILE + ${PROJECT_NAME}Targets.cmake + NAMESPACE + ${PROJECT_NAME}:: + DESTINATION + ${ConfigPackageLocation} +) + +install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION + ${ConfigPackageLocation} +) \ No newline at end of file diff --git a/deps/+heatshrink/Config.cmake.in b/deps/+heatshrink/Config.cmake.in new file mode 100644 index 0000000000..7ace8c5c1d --- /dev/null +++ b/deps/+heatshrink/Config.cmake.in @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +if (EXISTS ${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake) + include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +endif () \ No newline at end of file diff --git a/deps/+heatshrink/heatshrink.cmake b/deps/+heatshrink/heatshrink.cmake new file mode 100644 index 0000000000..08917a609c --- /dev/null +++ b/deps/+heatshrink/heatshrink.cmake @@ -0,0 +1,6 @@ +add_cmake_project(heatshrink + URL https://github.com/atomicobject/heatshrink/archive/refs/tags/v0.4.1.zip + URL_HASH SHA256=2e2db2366bdf36cb450f0b3229467cbc6ea81a8c690723e4227b0b46f92584fe + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt ./CMakeLists.txt && + ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/Config.cmake.in ./Config.cmake.in +) \ No newline at end of file diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/+wxWidgets/wxWidgets.cmake similarity index 69% rename from deps/wxWidgets/wxWidgets.cmake rename to deps/+wxWidgets/wxWidgets.cmake index a555503f18..ac15a48d0e 100644 --- a/deps/wxWidgets/wxWidgets.cmake +++ b/deps/+wxWidgets/wxWidgets.cmake @@ -1,10 +1,7 @@ -#/|/ Copyright (c) Prusa Research 2020 - 2023 Oleksandra Iushchenko @YuSanka, Lukáš Matěna @lukasmatena, Tomáš Mészáros @tamasmeszaros, Lukáš Hejl @hejllukas, Vojtěch Bubník @bubnikv -#/|/ Copyright (c) 2020 Bertrand Giot @bgiot -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ set(_wx_toolkit "") if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + option(DEP_WX_GTK3 "Build wxWidgets for GTK3 instead of GTK2" OFF) + set(_gtk_ver 2) if (DEP_WX_GTK3) set(_gtk_ver 3) @@ -17,15 +14,13 @@ if (UNIX AND NOT APPLE) # wxWidgets will not use char as the underlying type for set (_unicode_utf8 ON) endif() -prusaslicer_add_cmake_project(wxWidgets +add_cmake_project(wxWidgets URL https://github.com/prusa3d/wxWidgets/archive/78aa2dc0ea7ce99dc19adc1140f74c3e2e3f3a26.zip URL_HASH SHA256=94b7d972373503e380e5a8b0ca63b1ccb956da4006402298dd89a0c5c7041b1e - DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} dep_TIFF dep_JPEG dep_NanoSVG CMAKE_ARGS + "-DCMAKE_DEBUG_POSTFIX:STRING=" -DwxBUILD_PRECOMP=ON ${_wx_toolkit} - "-DCMAKE_DEBUG_POSTFIX:STRING=" - -DwxBUILD_DEBUG_LEVEL=0 -DwxUSE_MEDIACTRL=OFF -DwxUSE_DETECT_SM=OFF -DwxUSE_UNICODE=ON @@ -46,6 +41,4 @@ prusaslicer_add_cmake_project(wxWidgets -DwxUSE_WEBREQUEST=OFF ) -if (MSVC) - add_debug_dep(dep_wxWidgets) -endif () \ No newline at end of file +set(DEP_wxWidgets_DEPENDS ZLIB PNG EXPAT TIFF JPEG NanoSVG) diff --git a/deps/Blosc/Blosc.cmake b/deps/Blosc/Blosc.cmake deleted file mode 100644 index aaba72118d..0000000000 --- a/deps/Blosc/Blosc.cmake +++ /dev/null @@ -1,32 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -if(BUILD_SHARED_LIBS) - set(_build_shared ON) - set(_build_static OFF) -else() - set(_build_shared OFF) - set(_build_static ON) -endif() - -prusaslicer_add_cmake_project(Blosc - #URL https://github.com/Blosc/c-blosc/archive/refs/tags/v1.17.0.zip - #URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9 - URL https://github.com/tamasmeszaros/c-blosc/archive/refs/heads/v1.17.0_tm.zip - URL_HASH SHA256=dcb48bf43a672fa3de6a4b1de2c4c238709dad5893d1e097b8374ad84b1fc3b3 - DEPENDS ${ZLIB_PKG} - # Patching upstream does not work this way with git version 2.28 installed on mac worker - # PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/blosc-mods.patch - CMAKE_ARGS - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DBUILD_SHARED=${_build_shared} - -DBUILD_STATIC=${_build_static} - -DBUILD_TESTS=OFF - -DBUILD_BENCHMARKS=OFF - -DPREFER_EXTERNAL_ZLIB=ON -) - -if (MSVC) - add_debug_dep(dep_Blosc) -endif () \ No newline at end of file diff --git a/deps/Blosc/blosc-mods.patch b/deps/Blosc/blosc-mods.patch deleted file mode 100644 index 9b1b9cb27d..0000000000 --- a/deps/Blosc/blosc-mods.patch +++ /dev/null @@ -1,469 +0,0 @@ -From 7cf6c014a36f1712efbdbe9bc52d2d4922b54673 Mon Sep 17 00:00:00 2001 -From: tamasmeszaros -Date: Wed, 30 Oct 2019 12:54:52 +0100 -Subject: [PATCH] Blosc 1.17 fixes and cmake config script - -Signed-off-by: tamasmeszaros ---- - CMakeLists.txt | 105 +++++++++++++++++----------------- - blosc/CMakeLists.txt | 118 +++++++++------------------------------ - cmake/FindLZ4.cmake | 6 +- - cmake/FindSnappy.cmake | 8 ++- - cmake/FindZstd.cmake | 8 ++- - cmake_config.cmake.in | 24 ++++++++ - internal-complibs/CMakeLists.txt | 35 ++++++++++++ - 7 files changed, 157 insertions(+), 147 deletions(-) - create mode 100644 cmake_config.cmake.in - create mode 100644 internal-complibs/CMakeLists.txt - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 59d9fab..e9134c2 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -71,7 +71,7 @@ - # DEV: static includes blosc.a and blosc.h - - --cmake_minimum_required(VERSION 2.8.12) -+cmake_minimum_required(VERSION 3.1) # Threads::Threads target available from 3.1 - if (NOT CMAKE_VERSION VERSION_LESS 3.3) - cmake_policy(SET CMP0063 NEW) - endif() -@@ -124,55 +124,30 @@ option(PREFER_EXTERNAL_ZSTD - - set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") - -- --if(NOT DEACTIVATE_LZ4) -- if(PREFER_EXTERNAL_LZ4) -- find_package(LZ4) -- else() -- message(STATUS "Using LZ4 internal sources.") -- endif(PREFER_EXTERNAL_LZ4) -- # HAVE_LZ4 will be set to true because even if the library is -- # not found, we will use the included sources for it -- set(HAVE_LZ4 TRUE) --endif(NOT DEACTIVATE_LZ4) -- --if(NOT DEACTIVATE_SNAPPY) -- if(PREFER_EXTERNAL_SNAPPY) -- find_package(Snappy) -- else() -- message(STATUS "Using Snappy internal sources.") -- endif(PREFER_EXTERNAL_SNAPPY) -- # HAVE_SNAPPY will be set to true because even if the library is not found, -- # we will use the included sources for it -- set(HAVE_SNAPPY TRUE) --endif(NOT DEACTIVATE_SNAPPY) -- --if(NOT DEACTIVATE_ZLIB) -- # import the ZLIB_ROOT environment variable to help finding the zlib library -- if(PREFER_EXTERNAL_ZLIB) -- set(ZLIB_ROOT $ENV{ZLIB_ROOT}) -- find_package(ZLIB) -- if (NOT ZLIB_FOUND ) -- message(STATUS "No zlib found. Using internal sources.") -- endif (NOT ZLIB_FOUND ) -- else() -- message(STATUS "Using zlib internal sources.") -- endif(PREFER_EXTERNAL_ZLIB) -- # HAVE_ZLIB will be set to true because even if the library is not found, -- # we will use the included sources for it -- set(HAVE_ZLIB TRUE) --endif(NOT DEACTIVATE_ZLIB) -- --if (NOT DEACTIVATE_ZSTD) -- if (PREFER_EXTERNAL_ZSTD) -- find_package(Zstd) -- else () -- message(STATUS "Using ZSTD internal sources.") -- endif (PREFER_EXTERNAL_ZSTD) -- # HAVE_ZSTD will be set to true because even if the library is -- # not found, we will use the included sources for it -- set(HAVE_ZSTD TRUE) --endif (NOT DEACTIVATE_ZSTD) -+set(LIBS "") -+macro(use_package _pkg _tgt) -+ string(TOUPPER ${_pkg} _PKG) -+ if(NOT DEACTIVATE_${_PKG}) -+ if(PREFER_EXTERNAL_${_PKG}) -+ find_package(${_pkg}) -+ if (NOT ${_pkg}_FOUND ) -+ message(STATUS "No ${_pkg} found. Using internal sources.") -+ endif() -+ else() -+ message(STATUS "Using ${_pkg} internal sources.") -+ endif(PREFER_EXTERNAL_${_PKG}) -+ # HAVE_${_pkg} will be set to true because even if the library is -+ # not found, we will use the included sources for it -+ set(HAVE_${_PKG} TRUE) -+ list(APPEND LIBS ${_pkg}::${_tgt}) -+ endif(NOT DEACTIVATE_${_PKG}) -+endmacro() -+ -+set(ZLIB_ROOT $ENV{ZLIB_ROOT}) -+use_package(ZLIB ZLIB) -+use_package(LZ4 LZ4) -+use_package(Snappy snappy) -+use_package(Zstd Zstd) - - # create the config.h file - configure_file ("blosc/config.h.in" "blosc/config.h" ) -@@ -316,6 +291,7 @@ endif() - - - # subdirectories -+add_subdirectory(internal-complibs) - add_subdirectory(blosc) - - if(BUILD_TESTS) -@@ -328,7 +304,6 @@ if(BUILD_BENCHMARKS) - add_subdirectory(bench) - endif(BUILD_BENCHMARKS) - -- - # uninstall target - if (BLOSC_INSTALL) - configure_file( -@@ -338,10 +313,38 @@ if (BLOSC_INSTALL) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/blosc.pc" - DESTINATION lib/pkgconfig COMPONENT DEV) - -+ configure_file( -+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake_config.cmake.in" -+ "${CMAKE_CURRENT_BINARY_DIR}/cmakeexports/BloscConfig.cmake" -+ @ONLY) -+ - configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - IMMEDIATE @ONLY) -+ -+ include(CMakePackageConfigHelpers) -+ write_basic_package_version_file( -+ "${CMAKE_CURRENT_BINARY_DIR}/cmakeexports/BloscConfigVersion.cmake" -+ VERSION ${BLOSC_VERSION_MAJOR}.${BLOSC_VERSION_MINOR}.${BLOSC_VERSION_PATCH} -+ COMPATIBILITY AnyNewerVersion -+ ) -+ -+ export(EXPORT BloscTargets -+ FILE "${CMAKE_CURRENT_BINARY_DIR}/cmakeexports/BloscTargets.cmake" -+ NAMESPACE Blosc::) -+ -+ install(EXPORT BloscTargets -+ FILE BloscTargets.cmake -+ NAMESPACE Blosc:: -+ DESTINATION lib/cmake/Blosc -+ EXPORT_LINK_INTERFACE_LIBRARIES) -+ -+ install(FILES -+ "${CMAKE_CURRENT_BINARY_DIR}/cmakeexports/BloscConfig.cmake" -+ "${CMAKE_CURRENT_BINARY_DIR}/cmakeexports/BloscConfigVersion.cmake" -+ DESTINATION lib/cmake/Blosc COMPONENT DEV) -+ - add_custom_target(uninstall - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) - endif() -diff --git a/blosc/CMakeLists.txt b/blosc/CMakeLists.txt -index 1d1bebe..f554abe 100644 ---- a/blosc/CMakeLists.txt -+++ b/blosc/CMakeLists.txt -@@ -1,52 +1,11 @@ - # a simple way to detect that we are using CMAKE - add_definitions(-DUSING_CMAKE) - --set(INTERNAL_LIBS ${PROJECT_SOURCE_DIR}/internal-complibs) -- - # Hide symbols by default unless they're specifically exported. - # This makes it easier to keep the set of exported symbols the - # same across all compilers/platforms. - set(CMAKE_C_VISIBILITY_PRESET hidden) - --# includes --set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) --if(NOT DEACTIVATE_LZ4) -- if (LZ4_FOUND) -- set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${LZ4_INCLUDE_DIR}) -- else(LZ4_FOUND) -- set(LZ4_LOCAL_DIR ${INTERNAL_LIBS}/lz4-1.9.1) -- set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${LZ4_LOCAL_DIR}) -- endif(LZ4_FOUND) --endif(NOT DEACTIVATE_LZ4) -- --if(NOT DEACTIVATE_SNAPPY) -- if (SNAPPY_FOUND) -- set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${SNAPPY_INCLUDE_DIR}) -- else(SNAPPY_FOUND) -- set(SNAPPY_LOCAL_DIR ${INTERNAL_LIBS}/snappy-1.1.1) -- set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${SNAPPY_LOCAL_DIR}) -- endif(SNAPPY_FOUND) --endif(NOT DEACTIVATE_SNAPPY) -- --if(NOT DEACTIVATE_ZLIB) -- if (ZLIB_FOUND) -- set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}) -- else(ZLIB_FOUND) -- set(ZLIB_LOCAL_DIR ${INTERNAL_LIBS}/zlib-1.2.8) -- set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${ZLIB_LOCAL_DIR}) -- endif(ZLIB_FOUND) --endif(NOT DEACTIVATE_ZLIB) -- --if (NOT DEACTIVATE_ZSTD) -- if (ZSTD_FOUND) -- set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIR}) -- else (ZSTD_FOUND) -- set(ZSTD_LOCAL_DIR ${INTERNAL_LIBS}/zstd-1.4.1) -- set(BLOSC_INCLUDE_DIRS ${BLOSC_INCLUDE_DIRS} ${ZSTD_LOCAL_DIR} ${ZSTD_LOCAL_DIR}/common) -- endif (ZSTD_FOUND) --endif (NOT DEACTIVATE_ZSTD) -- --include_directories(${BLOSC_INCLUDE_DIRS}) - - # library sources - set(SOURCES blosc.c blosclz.c fastcopy.c shuffle-generic.c bitshuffle-generic.c -@@ -73,53 +32,13 @@ if(WIN32) - message(STATUS "using the internal pthread library for win32 systems.") - set(SOURCES ${SOURCES} win32/pthread.c) - else(NOT Threads_FOUND) -- set(LIBS ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) -+ list(APPEND LIBS Threads::Threads) - endif(NOT Threads_FOUND) - else(WIN32) - find_package(Threads REQUIRED) -- set(LIBS ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) -+ list(APPEND LIBS Threads::Threads) - endif(WIN32) - --if(NOT DEACTIVATE_LZ4) -- if(LZ4_FOUND) -- set(LIBS ${LIBS} ${LZ4_LIBRARY}) -- else(LZ4_FOUND) -- file(GLOB LZ4_FILES ${LZ4_LOCAL_DIR}/*.c) -- set(SOURCES ${SOURCES} ${LZ4_FILES}) -- endif(LZ4_FOUND) --endif(NOT DEACTIVATE_LZ4) -- --if(NOT DEACTIVATE_SNAPPY) -- if(SNAPPY_FOUND) -- set(LIBS ${LIBS} ${SNAPPY_LIBRARY}) -- else(SNAPPY_FOUND) -- file(GLOB SNAPPY_FILES ${SNAPPY_LOCAL_DIR}/*.cc) -- set(SOURCES ${SOURCES} ${SNAPPY_FILES}) -- endif(SNAPPY_FOUND) --endif(NOT DEACTIVATE_SNAPPY) -- --if(NOT DEACTIVATE_ZLIB) -- if(ZLIB_FOUND) -- set(LIBS ${LIBS} ${ZLIB_LIBRARY}) -- else(ZLIB_FOUND) -- file(GLOB ZLIB_FILES ${ZLIB_LOCAL_DIR}/*.c) -- set(SOURCES ${SOURCES} ${ZLIB_FILES}) -- endif(ZLIB_FOUND) --endif(NOT DEACTIVATE_ZLIB) -- --if (NOT DEACTIVATE_ZSTD) -- if (ZSTD_FOUND) -- set(LIBS ${LIBS} ${ZSTD_LIBRARY}) -- else (ZSTD_FOUND) -- file(GLOB ZSTD_FILES -- ${ZSTD_LOCAL_DIR}/common/*.c -- ${ZSTD_LOCAL_DIR}/compress/*.c -- ${ZSTD_LOCAL_DIR}/decompress/*.c) -- set(SOURCES ${SOURCES} ${ZSTD_FILES}) -- endif (ZSTD_FOUND) --endif (NOT DEACTIVATE_ZSTD) -- -- - # targets - if (BUILD_SHARED) - add_library(blosc_shared SHARED ${SOURCES}) -@@ -191,14 +110,17 @@ if (BUILD_TESTS) - endif() - endif() - -+add_library(blosc INTERFACE) -+ - if (BUILD_SHARED) -- target_link_libraries(blosc_shared ${LIBS}) -- target_include_directories(blosc_shared PUBLIC ${BLOSC_INCLUDE_DIRS}) -+ target_link_libraries(blosc_shared PRIVATE ${LIBS}) -+ target_include_directories(blosc_shared PUBLIC $) -+ target_link_libraries(blosc INTERFACE blosc_shared) - endif() - - if (BUILD_TESTS) -- target_link_libraries(blosc_shared_testing ${LIBS}) -- target_include_directories(blosc_shared_testing PUBLIC ${BLOSC_INCLUDE_DIRS}) -+ target_link_libraries(blosc_shared_testing PRIVATE ${LIBS}) -+ target_include_directories(blosc_shared_testing PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - endif() - - if(BUILD_STATIC) -@@ -207,17 +129,31 @@ if(BUILD_STATIC) - if (MSVC) - set_target_properties(blosc_static PROPERTIES PREFIX lib) - endif() -- target_link_libraries(blosc_static ${LIBS}) -- target_include_directories(blosc_static PUBLIC ${BLOSC_INCLUDE_DIRS}) -+ # With the static library, cmake has to deal with transitive dependencies -+ target_link_libraries(blosc_static PRIVATE ${LIBS}) -+ target_include_directories(blosc_static PUBLIC $) -+ if (NOT BUILD_SHARED) -+ target_link_libraries(blosc INTERFACE blosc_static) -+ endif() - endif(BUILD_STATIC) - -+ - # install - if(BLOSC_INSTALL) - install(FILES blosc.h blosc-export.h DESTINATION include COMPONENT DEV) -+ set(_inst_libs "blosc") - if(BUILD_SHARED) -- install(TARGETS blosc_shared DESTINATION ${lib_dir} COMPONENT LIB) -+ list(APPEND _inst_libs blosc_shared) - endif(BUILD_SHARED) - if(BUILD_STATIC) -- install(TARGETS blosc_static DESTINATION ${lib_dir} COMPONENT DEV) -+ list(APPEND _inst_libs blosc_static) - endif(BUILD_STATIC) -+ -+ install(TARGETS ${_inst_libs} -+ EXPORT BloscTargets -+ LIBRARY DESTINATION ${lib_dir} -+ ARCHIVE DESTINATION ${lib_dir} -+ RUNTIME DESTINATION bin -+ COMPONENT DEV -+ INCLUDES DESTINATION include) - endif(BLOSC_INSTALL) -diff --git a/cmake/FindLZ4.cmake b/cmake/FindLZ4.cmake -index e581a80..05de6ef 100644 ---- a/cmake/FindLZ4.cmake -+++ b/cmake/FindLZ4.cmake -@@ -5,6 +5,10 @@ find_library(LZ4_LIBRARY NAMES lz4) - if (LZ4_INCLUDE_DIR AND LZ4_LIBRARY) - set(LZ4_FOUND TRUE) - message(STATUS "Found LZ4 library: ${LZ4_LIBRARY}") -+ add_library(LZ4::LZ4 UNKNOWN IMPORTED) -+ set_target_properties(LZ4::LZ4 PROPERTIES -+ IMPORTED_LOCATION ${LZ4_LIBRARY} -+ INTERFACE_INCLUDE_DIRECTORIES ${LZ4_INCLUDE_DIR}) - else () - message(STATUS "No LZ4 library found. Using internal sources.") --endif () -+endif () -\ No newline at end of file -diff --git a/cmake/FindSnappy.cmake b/cmake/FindSnappy.cmake -index 688d4d5..21dbee1 100644 ---- a/cmake/FindSnappy.cmake -+++ b/cmake/FindSnappy.cmake -@@ -3,8 +3,12 @@ find_path(SNAPPY_INCLUDE_DIR snappy-c.h) - find_library(SNAPPY_LIBRARY NAMES snappy) - - if (SNAPPY_INCLUDE_DIR AND SNAPPY_LIBRARY) -- set(SNAPPY_FOUND TRUE) -+ set(Snappy_FOUND TRUE) -+ add_library(Snappy::snappy UNKNOWN IMPORTED) -+ set_target_properties(Snappy::snappy PROPERTIES -+ IMPORTED_LOCATION ${SNAPPY_LIBRARY} -+ INTERFACE_INCLUDE_DIRECTORIES ${SNAPPY_INCLUDE_DIR}) - message(STATUS "Found SNAPPY library: ${SNAPPY_LIBRARY}") - else () - message(STATUS "No snappy found. Using internal sources.") --endif () -+endif () -\ No newline at end of file -diff --git a/cmake/FindZstd.cmake b/cmake/FindZstd.cmake -index 7db4bb9..cabc2f8 100644 ---- a/cmake/FindZstd.cmake -+++ b/cmake/FindZstd.cmake -@@ -3,8 +3,12 @@ find_path(ZSTD_INCLUDE_DIR zstd.h) - find_library(ZSTD_LIBRARY NAMES zstd) - - if (ZSTD_INCLUDE_DIR AND ZSTD_LIBRARY) -- set(ZSTD_FOUND TRUE) -+ set(Zstd_FOUND TRUE) -+ add_library(Zstd::Zstd UNKNOWN IMPORTED) -+ set_target_properties(Zstd::Zstd PROPERTIES -+ IMPORTED_LOCATION ${ZSTD_LIBRARY} -+ INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIR}) - message(STATUS "Found Zstd library: ${ZSTD_LIBRARY}") - else () - message(STATUS "No Zstd library found. Using internal sources.") --endif () -+endif () -\ No newline at end of file -diff --git a/cmake_config.cmake.in b/cmake_config.cmake.in -new file mode 100644 -index 0000000..0f6af24 ---- /dev/null -+++ b/cmake_config.cmake.in -@@ -0,0 +1,24 @@ -+include(CMakeFindDependencyMacro) -+ -+include("${CMAKE_CURRENT_LIST_DIR}/BloscTargets.cmake") -+ -+function(_blosc_remap_configs from_Cfg to_Cfg) -+ string(TOUPPER ${from_Cfg} from_CFG) -+ string(TOLOWER ${from_Cfg} from_cfg) -+ -+ if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/BloscTargets-${from_cfg}.cmake) -+ foreach(tgt IN ITEMS blosc_static blosc_shared blosc) -+ if(TARGET Blosc::${tgt}) -+ set_target_properties(Blosc::${tgt} PROPERTIES -+ MAP_IMPORTED_CONFIG_${from_CFG} ${to_Cfg}) -+ endif() -+ endforeach() -+ endif() -+endfunction() -+ -+# MSVC will try to link RelWithDebInfo or MinSizeRel target with debug config -+# if no matching installation is present which would result in link errors. -+if(MSVC) -+ _blosc_remap_configs(RelWithDebInfo Release) -+ _blosc_remap_configs(MinSizeRel Release) -+endif() -diff --git a/internal-complibs/CMakeLists.txt b/internal-complibs/CMakeLists.txt -new file mode 100644 -index 0000000..4586efa ---- /dev/null -+++ b/internal-complibs/CMakeLists.txt -@@ -0,0 +1,35 @@ -+macro(add_lib_target pkg tgt incdir files) -+ string(TOUPPER ${pkg} TGT) -+ if(NOT DEACTIVATE_${TGT} AND NOT ${pkg}_FOUND) -+ add_library(${tgt}_objs OBJECT ${files}) -+ add_library(${tgt} INTERFACE) -+ target_include_directories(${tgt}_objs PRIVATE $) -+ target_include_directories(${tgt} INTERFACE $) -+ #set_target_properties(${tgt} PROPERTIES INTERFACE_SOURCES "$") -+ set_target_properties(${tgt}_objs PROPERTIES POSITION_INDEPENDENT_CODE ON) -+ target_sources(${tgt} INTERFACE "$>") -+ add_library(${pkg}::${tgt} ALIAS ${tgt}) -+ -+ # This creates dummy (empty) interface targets in the exported config. -+ install(TARGETS ${tgt} EXPORT BloscTargets INCLUDES DESTINATION include) -+ endif() -+ unset(TGT) -+endmacro() -+ -+set(ZLIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/zlib-1.2.8) -+file(GLOB ZLIB_FILES ${ZLIB_DIR}/*.c) -+add_lib_target(ZLIB ZLIB ${ZLIB_DIR} "${ZLIB_FILES}") -+ -+set(SNAPPY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/snappy-1.1.1) -+file(GLOB SNAPPY_FILES ${SNAPPY_DIR}/*.cc) -+add_lib_target(Snappy snappy ${SNAPPY_DIR} "${SNAPPY_FILES}") -+ -+set(LZ4_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lz4-1.9.1) -+file(GLOB LZ4_FILES ${LZ4_DIR}/*.c) -+add_lib_target(LZ4 LZ4 ${LZ4_DIR} "${LZ4_FILES}") -+ -+set(ZSTD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/zstd-1.4.1) -+file(GLOB ZSTD_FILES ${ZSTD_DIR}/common/*.c ${ZSTD_DIR}/compress/*.c ${ZSTD_DIR}/decompress/*.c) -+add_lib_target(Zstd Zstd ${ZSTD_DIR} "${ZSTD_FILES}") -+target_include_directories(Zstd INTERFACE $) -+target_include_directories(Zstd_objs PRIVATE $) -\ No newline at end of file --- -2.16.2.windows.1 - diff --git a/deps/Boost/Boost.cmake b/deps/Boost/Boost.cmake deleted file mode 100644 index 7d1500591f..0000000000 --- a/deps/Boost/Boost.cmake +++ /dev/null @@ -1,172 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2021 - 2022 Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01, Lukáš Hejl @hejllukas, Enrico Turri @enricoturri1966 -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -include(ExternalProject) - -if (WIN32) - set(_bootstrap_cmd bootstrap.bat) - set(_build_cmd b2.exe) -else() - set(_bootstrap_cmd ./bootstrap.sh) - set(_build_cmd ./b2) -endif() - -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(_boost_toolset gcc) - configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam) - set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam) -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - # https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html - if (MSVC_VERSION EQUAL 1800) - # 1800 = VS 12.0 (v120 toolset) - set(_boost_toolset "msvc-12.0") - elseif (MSVC_VERSION EQUAL 1900) - # 1900 = VS 14.0 (v140 toolset) - set(_boost_toolset "msvc-14.0") - elseif (MSVC_VERSION LESS 1920) - # 1910-1919 = VS 15.0 (v141 toolset) - set(_boost_toolset "msvc-14.1") - elseif (MSVC_VERSION LESS 1930) - # 1920-1929 = VS 16.0 (v142 toolset) - set(_boost_toolset "msvc-14.2") - elseif (MSVC_VERSION LESS 1940) - # 1930-1939 = VS 17.0 (v143 toolset) - set(_boost_toolset "msvc-14.3") - else () - message(FATAL_ERROR "Unsupported MSVC version") - endif () -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - if (WIN32) - set(_boost_toolset "clang-win") - elseif (APPLE) - set(_boost_toolset "clang") - else() - set(_boost_toolset clang) - configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam) - set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam) - endif() -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - set(_boost_toolset "intel") -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - set(_boost_toolset "clang") -endif() - -message(STATUS "Deduced boost toolset: ${_boost_toolset} based on ${CMAKE_CXX_COMPILER_ID} compiler") - -set(_libs "") -foreach(_comp ${DEP_Boost_COMPONENTS}) - list(APPEND _libs "--with-${_comp}") -endforeach() - -if (BUILD_SHARED_LIBS) - set(_link shared) -else() - set(_link static) -endif() - -set(_bits "") -if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") - set(_bits 64) -elseif ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") - set(_bits 32) -endif () - -include(ProcessorCount) -ProcessorCount(NPROC) -file(TO_NATIVE_PATH ${DESTDIR}/usr/local/ _prefix) - -set(_boost_flags "") -if (UNIX) - set(_boost_flags "cflags=-fPIC;cxxflags=-fPIC") -endif () - -if(APPLE) - set(_boost_flags - "cflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET};" - "cxxflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET};" - "mflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET};" - "mmflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}") -endif() - -set(_boost_variants "") -if(CMAKE_BUILD_TYPE) - list(APPEND CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE}) - list(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES) -endif() -list(FIND CMAKE_CONFIGURATION_TYPES "Release" _cfg_rel) -list(FIND CMAKE_CONFIGURATION_TYPES "RelWithDebInfo" _cfg_relwdeb) -list(FIND CMAKE_CONFIGURATION_TYPES "MinSizeRel" _cfg_minsizerel) -list(FIND CMAKE_CONFIGURATION_TYPES "Debug" _cfg_deb) - -if (_cfg_rel GREATER -1 OR _cfg_relwdeb GREATER -1 OR _cfg_minsizerel GREATER -1) - list(APPEND _boost_variants release) -endif() - -if ( (NOT MSVC AND _cfg_deb GREATER -1) OR (MSVC AND ${DEP_DEBUG}) ) - list(APPEND _boost_variants debug) -endif() - -if (NOT _boost_variants) - set(_boost_variants release) -endif() - -set(_boost_layout system) -if (MSVC) - set(_boost_layout versioned) -endif () - -set(_build_cmd ${_build_cmd} - ${_boost_flags} - -j${NPROC} - ${_libs} - --layout=${_boost_layout} - --debug-configuration - toolset=${_boost_toolset} - address-model=${_bits} - link=${_link} - threading=multi - boost.locale.icu=off - --disable-icu - ${_boost_variants} - stage) - -set(_install_cmd ${_build_cmd} --prefix=${_prefix} install) - -if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - # When Clang is used with enabled UndefinedBehaviorSanitizer, it produces "undefined reference to '__muloti4'" when __int128 is used. - # Because of that, UndefinedBehaviorSanitizer is disabled for those functions that use __int128. - list(APPEND _patch_command COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/Boost.patch) -endif () - -ExternalProject_Add( - dep_Boost - URL "https://boostorg.jfrog.io/artifactory/main/release/1.78.0/source/boost_1_78_0.zip" - URL_HASH SHA256=f22143b5528e081123c3c5ed437e92f648fe69748e95fa6e2bd41484e2986cc3 - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Boost - CONFIGURE_COMMAND "${_bootstrap_cmd}" - PATCH_COMMAND ${_patch_command} - BUILD_COMMAND "${_build_cmd}" - BUILD_IN_SOURCE ON - INSTALL_COMMAND "${_install_cmd}" -) - -if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") - # Patch the boost::polygon library with a custom one. - ExternalProject_Add(dep_boost_polygon - EXCLUDE_FROM_ALL ON - # GIT_REPOSITORY "https://github.com/prusa3d/polygon" - # GIT_TAG prusaslicer_gmp - URL https://github.com/prusa3d/polygon/archive/refs/heads/prusaslicer_gmp.zip - URL_HASH SHA256=abeb9710f0a7069fb9b22181ae5c56f6066002f125db210e7ffb27032aed6824 - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/boost_polygon - DEPENDS dep_Boost - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory - "${CMAKE_CURRENT_BINARY_DIR}/dep_boost_polygon-prefix/src/dep_boost_polygon/include/boost/polygon" - "${DESTDIR}/usr/local/include/boost/polygon" - ) - # Only override boost::Polygon Voronoi implementation with Vojtech's GMP hacks on 64bit platforms. - list(APPEND _dep_list "dep_boost_polygon") -endif () diff --git a/deps/Boost/Boost.patch b/deps/Boost/Boost.patch deleted file mode 100644 index 8c54430b96..0000000000 --- a/deps/Boost/Boost.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff -u ../boost_1_75_0-orig/boost/rational.hpp ./boost/rational.hpp ---- ../boost_1_75_0-orig/boost/rational.hpp 2020-12-03 06:02:19.000000000 +0100 -+++ ./boost/rational.hpp 2022-01-27 16:02:27.993848905 +0100 -@@ -302,6 +302,9 @@ - return *this; - } - template -+ #if defined(__clang__) -+ __attribute__((no_sanitize("undefined"))) -+ #endif - BOOST_CXX14_CONSTEXPR typename boost::enable_if_c::value, rational&>::type operator*= (const T& i) - { - // Avoid overflow and preserve normalization -@@ -311,6 +314,9 @@ - return *this; - } - template -+ #if defined(__clang__) -+ __attribute__((no_sanitize("undefined"))) -+ #endif - BOOST_CXX14_CONSTEXPR typename boost::enable_if_c::value, rational&>::type operator/= (const T& i) - { - // Avoid repeated construction diff --git a/deps/Boost/user-config.jam b/deps/Boost/user-config.jam deleted file mode 100644 index 6d86ef8df3..0000000000 --- a/deps/Boost/user-config.jam +++ /dev/null @@ -1 +0,0 @@ -using @_boost_toolset@ : : @CMAKE_CXX_COMPILER@ ; \ No newline at end of file diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 1eaf05f5cd..7fd0bba7f4 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -23,114 +23,76 @@ # WARNING: On UNIX platforms wxWidgets hardcode the destdir path into its `wx-conffig` utility, # therefore, unfortunatelly, the installation cannot be copied/moved elsewhere without re-installing wxWidgets. # +cmake_minimum_required(VERSION 3.12) +project(PrusaSlicer_deps) -cmake_minimum_required(VERSION 3.10) -project(PrusaSlicer-deps) +# Redefine BUILD_SHARED_LIBS with default being OFF +option(BUILD_SHARED_LIBS "Build shared libraries instead of static (experimental)" OFF) -include(ExternalProject) -include(ProcessorCount) +set(${PROJECT_NAME}_PACKAGE_EXCLUDES "" CACHE STRING "Exclude packages matching this regex pattern") -ProcessorCount(NPROC) -if (NPROC EQUAL 0) - set(NPROC 1) +# Support legacy parameter DESTDIR +if (DESTDIR) + set(${PROJECT_NAME}_DEP_INSTALL_PREFIX ${DESTDIR}/usr/local CACHE PATH "Destination directory" FORCE) endif () -set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory") -set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Path for downloaded source packages.") +# Support legacy parameter DEP_DOWNLOAD_DIR +if (DEP_DOWNLOAD_DIR) + set(${PROJECT_NAME}_DEP_DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR} CACHE PATH "Path for downloaded source packages." FORCE) +endif () -option(DEP_DEBUG "Build debug variants (only applicable on Windows)" ON) +# Slightly controversial +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../cmake/modules) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - option(DEP_WX_GTK3 "Build wxWidgets against GTK3" OFF) -endif() - -# On developer machines, it can be enabled to speed up compilation and suppress warnings coming from IGL. -# FIXME: -# Enabling this option is not safe. IGL will compile itself with its own version of Eigen while -# Slic3r compiles with a different version which will cause runtime errors. -# option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors and increase binary size." OFF) - -message(STATUS "PrusaSlicer deps DESTDIR: ${DESTDIR}") -message(STATUS "PrusaSlicer dowload dir for source packages: ${DEP_DOWNLOAD_DIR}") -message(STATUS "PrusaSlicer deps debug build: ${DEP_DEBUG}") - -find_package(Git REQUIRED) - -# The default command line for patching. Only works for newer -set(PATCH_CMD ${GIT_EXECUTABLE} apply --verbose --ignore-space-change --whitespace=fix) - -get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) - -if (NOT _is_multi AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) - message(STATUS "Forcing CMAKE_BUILD_TYPE to Release as it was not specified.") +if (MSVC) + option(DEP_DEBUG "Build in debug version of packages automatically" ON) endif () if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.24) cmake_policy(SET CMP0135 NEW) endif () -function(prusaslicer_add_cmake_project projectname) - cmake_parse_arguments(P_ARGS "" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN}) +include(${PROJECT_SOURCE_DIR}/../cmake/modules/AddCMakeProject.cmake) - set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}) - if (_is_multi OR MSVC) - set(_configs_line "") - endif () - - set(_gen "") - set(_build_j "-j${NPROC}") - if (MSVC) - set(_gen CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}") - set(_build_j "/m") - if (${projectname} STREQUAL "OCCT") - set(_build_j "/m:1") - endif () - endif () - - ExternalProject_Add( - dep_${projectname} - EXCLUDE_FROM_ALL ON - INSTALL_DIR ${DESTDIR}/usr/local - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname} - ${_gen} - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}/usr/local - -DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules - -DCMAKE_PREFIX_PATH:STRING=${DESTDIR}/usr/local - -DCMAKE_DEBUG_POSTFIX:STRING=d - -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} - -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} - -DCMAKE_TOOLCHAIN_FILE:STRING=${CMAKE_TOOLCHAIN_FILE} - -DBUILD_SHARED_LIBS:BOOL=OFF - "${_configs_line}" - ${DEP_CMAKE_OPTS} - ${P_ARGS_CMAKE_ARGS} - ${P_ARGS_UNPARSED_ARGUMENTS} - BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release -- ${_build_j} - INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release - ) - -endfunction(prusaslicer_add_cmake_project) +macro(list_projects result curdir) + file(GLOB children RELATIVE ${curdir} ${curdir}/*) + set(dirlist "") + foreach(child ${children}) + if(IS_DIRECTORY ${curdir}/${child}) + string(REGEX MATCH "^\\+([a-zA-Z0-9]+)" is_package_dir ${child}) + if(is_package_dir AND EXISTS ${curdir}/${child}/${CMAKE_MATCH_1}.cmake) + list(APPEND dirlist ${CMAKE_MATCH_1}) + endif() + endif() + endforeach() + set(${result} ${dirlist}) +endmacro() +function(dep_message mode msg) + if (NOT DEP_MESSAGES_WRITTEN) + message(${mode} "${msg}") + endif() +endfunction () +# Always ON options: if (MSVC) - if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") - message(STATUS "\nDetected 64-bit compiler => building 64-bit deps bundle\n") - set(DEPS_BITS 64) - include("deps-windows.cmake") - elseif ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") - message(STATUS "\nDetected 32-bit compiler => building 32-bit deps bundle\n") - set(DEPS_BITS 32) - include("deps-windows.cmake") - else () - message(FATAL_ERROR "Unable to detect architecture") - endif () -elseif (APPLE) - message("OS X SDK Path: ${CMAKE_OSX_SYSROOT}") + if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") + dep_message(STATUS "Detected 64-bit compiler => building 64-bit deps bundle") + set(DEPS_BITS 64) + elseif ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") + dep_message(STATUS "Detected 32-bit compiler => building 32-bit deps bundle") + set(DEPS_BITS 32) + else () + dep_message(FATAL_ERROR "Unable to detect architecture!") + endif () +else () + set(DEP_CMAKE_OPTS "-DCMAKE_POSITION_INDEPENDENT_CODE=ON") +endif () + +if (APPLE) if (CMAKE_OSX_DEPLOYMENT_TARGET) set(DEP_OSX_TARGET "${CMAKE_OSX_DEPLOYMENT_TARGET}") - message("OS X Deployment Target: ${DEP_OSX_TARGET}") + dep_message(STATUS "OS X Deployment Target: ${DEP_OSX_TARGET}") else () # Attempt to infer the SDK version from the CMAKE_OSX_SYSROOT, # this is done because wxWidgets need the min version explicitly set @@ -141,94 +103,192 @@ elseif (APPLE) message(FATAL_ERROR "Could not determine OS X SDK version. Please use -DCMAKE_OSX_DEPLOYMENT_TARGET=") endif () - message("OS X Deployment Target (inferred from SDK): ${DEP_OSX_TARGET}") + dep_message(STATUS "OS X Deployment Target (inferred from SDK): ${DEP_OSX_TARGET}") endif () - include("deps-macos.cmake") -elseif (MINGW) - message(STATUS "Building for MinGW...") - include("deps-mingw.cmake") -else() - include("deps-linux.cmake") -endif() - -set(ZLIB_PKG "") -if (NOT ZLIB_FOUND) - include(ZLIB/ZLIB.cmake) - set(ZLIB_PKG dep_ZLIB) -endif () -set(PNG_PKG "") -if (NOT PNG_FOUND) - include(PNG/PNG.cmake) - set(PNG_PKG dep_PNG) -endif () -set(EXPAT_PKG "") -if (NOT EXPAT_FOUND) - include(EXPAT/EXPAT.cmake) - set(EXPAT_PKG dep_EXPAT) -endif () - -set(DEP_Boost_COMPONENTS system iostreams filesystem thread log locale regex date_time) -include(Boost/Boost.cmake) - -# The order of includes respects the dependencies between libraries -include(Cereal/Cereal.cmake) -include(Qhull/Qhull.cmake) -include(GLEW/GLEW.cmake) -include(OpenCSG/OpenCSG.cmake) - -include(TBB/TBB.cmake) - -include(Blosc/Blosc.cmake) -include(OpenEXR/OpenEXR.cmake) -include(OpenVDB/OpenVDB.cmake) - -include(GMP/GMP.cmake) -include(MPFR/MPFR.cmake) -include(CGAL/CGAL.cmake) - -include(NLopt/NLopt.cmake) - -include(OpenSSL/OpenSSL.cmake) - -set(CURL_PKG "") -if (NOT CURL_FOUND) - include(CURL/CURL.cmake) - set(CURL_PKG dep_CURL) -endif () - -include(JPEG/JPEG.cmake) -include(TIFF/TIFF.cmake) -include(NanoSVG/NanoSVG.cmake) -include(wxWidgets/wxWidgets.cmake) -include(OCCT/OCCT.cmake) - -include(LibBGCode/LibBGCode.cmake) - -set(_dep_list - dep_Boost - dep_TBB - ${CURL_PKG} - dep_wxWidgets - dep_Cereal - dep_NLopt - dep_OpenVDB - dep_OpenCSG - dep_CGAL - dep_Qhull - dep_OCCT - ${PNG_PKG} - ${ZLIB_PKG} - ${EXPAT_PKG} - dep_LibBGCode + # This ensures dependencies don't use SDK features which are not available in the version specified by Deployment target + # That can happen when one uses a recent SDK but specifies an older Deployment target + set(DEP_WERRORS_SDK "-Werror=partial-availability -Werror=unguarded-availability -Werror=unguarded-availability-new") + + set(DEP_CMAKE_OPTS + "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" + "-DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT}" + "-DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}" + "-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}" + "-DCMAKE_CXX_FLAGS=${DEP_WERRORS_SDK}" + "-DCMAKE_C_FLAGS=${DEP_WERRORS_SDK}" + "-DCMAKE_FIND_FRAMEWORK=LAST" + "-DCMAKE_FIND_APPBUNDLE=LAST" ) +endif () -# if (NOT MSVC) - # Not working, static build has different Eigen - #list(APPEND _dep_list "dep_libigl") -# endif() +list_projects(FOUND_PACKAGES ${CMAKE_CURRENT_LIST_DIR}) -add_custom_target(deps ALL DEPENDS ${_dep_list}) +dep_message(STATUS "Found external package definitions: ${FOUND_PACKAGES}") -# Note: I'm not using any of the LOG_xxx options in ExternalProject_Add() commands -# because they seem to generate bogus build files (possibly a bug in ExternalProject). +# Current list of all required dependencies for PS (top level) +set(REQUIRED_PACKAGES + Boost + Catch2 + Cereal + CURL + EXPAT + NLopt + GLEW + TBB + Qhull + wxWidgets + OpenVDB + CGAL + OCCT + ZLIB + LibBGCode +) + +set(${PROJECT_NAME}_PLATFORM_PACKAGES "" CACHE STRING "Select packages which are provided by the platform" ) +set(SYSTEM_PROVIDED_PACKAGES OpenGL) + +if (UNIX) + # On UNIX systems (including Apple) ZLIB should be available + list(APPEND SYSTEM_PROVIDED_PACKAGES ZLIB) +endif () + +list(APPEND SYSTEM_PROVIDED_PACKAGES ${${PROJECT_NAME}_PLATFORM_PACKAGES}) +list(REMOVE_DUPLICATES SYSTEM_PROVIDED_PACKAGES) + +include(CMakeDependentOption) +option(${PROJECT_NAME}_SELECT_ALL "Choose all external projects to be built." ON) + +find_package(Git REQUIRED) + +# The default command line for patching. Only works for newer +set(PATCH_CMD ${GIT_EXECUTABLE} apply --verbose --ignore-space-change --whitespace=fix) + +# all required package targets that have existing definitions will be gathered here +set(DEPS_TO_BUILD "") +set(_build_list "") +set(_build_list_toplevel "") +set(_checked_list "") + +# function to check if a package ought to be provided by the platform can really be found +function (check_system_package pkg checked_list) + if (NOT ${pkg} IN_LIST ${checked_list}) + find_package(${pkg}) + if (NOT ${pkg}_FOUND) + dep_message(WARNING "No ${pkg} found in system altough marked as system provided. This might cause trouble building the dependencies on this platform") + endif () + list(APPEND ${checked_list} ${pkg}) + set (${checked_list} ${${checked_list}} PARENT_SCOPE) + endif () +endfunction() + +# Go through all the found package definition folders and filter them according to the provided cache options +set(SUPPORTED_PACKAGES "") +foreach (pkg ${FOUND_PACKAGES}) + cmake_dependent_option(${PROJECT_NAME}_SELECT_${pkg} "Select package ${pkg} to be built." OFF "NOT ${PROJECT_NAME}_SELECT_ALL" OFF) + if (NOT ${PROJECT_NAME}_PACKAGE_EXCLUDES MATCHES ${pkg} AND (${PROJECT_NAME}_SELECT_ALL OR ${PROJECT_NAME}_SELECT_${pkg})) + include(+${pkg}/${pkg}.cmake) + + list(APPEND SUPPORTED_PACKAGES ${pkg}) + + if (${pkg} IN_LIST SYSTEM_PROVIDED_PACKAGES) + check_system_package(${pkg} _checked_list) + elseif (${pkg} IN_LIST REQUIRED_PACKAGES) + list(APPEND DEPS_TO_BUILD ${pkg}) + endif () + endif () +endforeach() + +# Establish dependency graph +foreach (pkg ${SUPPORTED_PACKAGES}) + if (${pkg} IN_LIST DEPS_TO_BUILD) + list(APPEND _build_list dep_${pkg}) + list(APPEND _build_list_toplevel dep_${pkg}) + endif () + foreach(deppkg ${DEP_${pkg}_DEPENDS}) + if (${deppkg} IN_LIST SYSTEM_PROVIDED_PACKAGES) + check_system_package(${deppkg} _checked_list) + elseif(TARGET dep_${deppkg}) + dep_message(STATUS "Mapping dep_${deppkg} => dep_${pkg}") + add_dependencies(dep_${pkg} dep_${deppkg}) + if (${pkg} IN_LIST REQUIRED_PACKAGES) + list(APPEND _build_list dep_${deppkg}) + endif () + endif () + endforeach() +endforeach() + +list(REMOVE_DUPLICATES _build_list) +dep_message(STATUS "Building dep targets (${CMAKE_BUILD_TYPE}): ${_build_list}") +add_custom_target(deps ALL DEPENDS ${_build_list_toplevel}) + +# Support legacy option DEP_DEBUG on MSVC to build debug libraries in the same cmake run as for CMAKE_BUILD_TYPE: +if (DEP_DEBUG AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + # MSVC has this nice feature to not be able to link release mode libs to Debug mode + # projects + + # Exclude the libraries which have no problem to link to Debug builds in + # Release mode (mostly C libraries) + set(DEP_DEBUG_EXCLUDES GMP MPFR OpenSSL NanoSVG TIFF JPEG ZLIB heatshrink) + if (UNIX) + # Making a separate debug build on Unix of wx is a nightmare + list(APPEND DEP_DEBUG_EXCLUDES wxWidgets) + endif () + + # Create the list of targets needed in debug mode + set(_build_list_dbg "") + set(_build_list_filt ${_build_list}) + list(JOIN DEP_DEBUG_EXCLUDES "|" _excl_regexp) + list(FILTER _build_list_filt EXCLUDE REGEX "${_excl_regexp}") + + foreach (t ${_build_list_filt}) + list(APPEND _build_list_dbg ${t}_debug) + endforeach() + + # Create a subdirectory for the Debug build within the current binary dir: + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/_d) + execute_process( + COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR} -G${CMAKE_GENERATOR} + -DCMAKE_BUILD_TYPE=Debug + -DDEP_WX_GTK3=${DEP_WX_GTK3} + -D${PROJECT_NAME}_DEP_DOWNLOAD_DIR=${${PROJECT_NAME}_DEP_DOWNLOAD_DIR} + -D${PROJECT_NAME}_DEP_INSTALL_PREFIX=${${PROJECT_NAME}_DEP_INSTALL_PREFIX} + -D${PROJECT_NAME}_PACKAGE_EXCLUDES="${_excl_regexp}" + -D${PROJECT_NAME}_SELECT_ALL=${${PROJECT_NAME}_SELECT_ALL} + -D${PROJECT_NAME}_DEP_BUILD_VERBOSE=${${PROJECT_NAME}_DEP_BUILD_VERBOSE} + -DCMAKE_DEBUG_POSTFIX=d + #TODO: forward per-package selector variables + -DDEP_MESSAGES_WRITTEN=ON + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/_d + OUTPUT_QUIET + ) + + dep_message(STATUS "Building dep targets (Debug): ${_build_list_dbg}") + + # Each lib will have a dep__debug target to build only the debug counterpart + # Not part of ALL (problem with parallelization) + foreach(pkgtgt ${_build_list_filt}) + add_custom_target(${pkgtgt}_debug + COMMAND ${CMAKE_COMMAND} --build . --target ${pkgtgt} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/_d + USES_TERMINAL + ) + endforeach() + + # Can be used to build all the debug libs + string(JOIN " " _build_list_filt_targets "${_build_list_filt}") + add_custom_target(deps_debug ALL + COMMAND ${CMAKE_COMMAND} --build . --target ${_build_list_filt_targets} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/_d + USES_TERMINAL + ) + + # The Release must be built before, as there are libs in this debug session which need + # the release versions of the excluded libs + add_dependencies(deps_debug deps) + +endif () + +set(DEP_MESSAGES_WRITTEN ON CACHE BOOL "") + +install(CODE "message(STATUS \"Built packages succesfully.\")") diff --git a/deps/CMakePresets.json b/deps/CMakePresets.json new file mode 100644 index 0000000000..b6dc536163 --- /dev/null +++ b/deps/CMakePresets.json @@ -0,0 +1,57 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "default", + "displayName": "Default Config", + "description": "Default build for any desktop OS", + "binaryDir": "${sourceDir}/build-default", + "condition": { + "type": "const", + "value": true + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "DEP_WX_GTK3": true, + "DEP_DOWNLOAD_DIR": { + "type": "PATH", + "value": "${sourceDir}/.pkg_cache" + } + } + }, + { + "name": "no-occt", + "inherits": "default", + "binaryDir": "${sourceDir}/build-no-occt", + "cacheVariables": { + "PrusaSlicer_deps_PACKAGE_EXCLUDES": "OCCT" + } + }, + { + "name": "mac_universal_x86", + "inherits": "default", + "binaryDir": "${sourceDir}/build-x86_64", + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Darwin" + }, + "cacheVariables": { + "CMAKE_OSX_ARCHITECTURES": "x86_64" + } + }, + { + "name": "mac_universal_arm", + "inherits": "default", + "binaryDir": "${sourceDir}/build-arm64", + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Darwin" + }, + "cacheVariables": { + "CMAKE_OSX_ARCHITECTURES": "arm64" + } + } + ] +} diff --git a/deps/EXPAT/EXPAT.cmake b/deps/EXPAT/EXPAT.cmake deleted file mode 100644 index 188ed9edad..0000000000 --- a/deps/EXPAT/EXPAT.cmake +++ /dev/null @@ -1,25 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2020 - 2022 Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01 -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -#prusaslicer_add_cmake_project(EXPAT -# # GIT_REPOSITORY https://github.com/nigels-com/glew.git -# # GIT_TAG 3a8eff7 # 2.1.0 -# SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/expat -#) - -prusaslicer_add_cmake_project(EXPAT - URL https://github.com/libexpat/libexpat/archive/refs/tags/R_2_4_3.zip - URL_HASH SHA256=8851e199d763dc785277d6d414ed3e70ff683915158b51b8d8781df0e3af950a - SOURCE_SUBDIR expat - CMAKE_ARGS - -DEXPAT_BUILD_TOOLS:BOOL=OFF - -DEXPAT_BUILD_EXAMPLES:BOOL=OFF - -DEXPAT_BUILD_TESTS:BOOL=OFF - -DEXPAT_BUILD_DOCS=OFF - -DEXPAT_BUILD_PKGCONFIG=OFF -) - -if (MSVC) - add_debug_dep(dep_EXPAT) -endif () diff --git a/deps/GLEW/GLEW.cmake b/deps/GLEW/GLEW.cmake deleted file mode 100644 index c6c5a51fe0..0000000000 --- a/deps/GLEW/GLEW.cmake +++ /dev/null @@ -1,20 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2019 - 2022 Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01 -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -# We have to check for OpenGL to compile GLEW -set(OpenGL_GL_PREFERENCE "LEGACY") # to prevent a nasty warning by cmake -find_package(OpenGL QUIET REQUIRED) - -prusaslicer_add_cmake_project( - GLEW - URL https://sourceforge.net/projects/glew/files/glew/2.2.0/glew-2.2.0.zip - URL_HASH SHA256=a9046a913774395a095edcc0b0ac2d81c3aacca61787b39839b941e9be14e0d4 - SOURCE_SUBDIR build/cmake - CMAKE_ARGS - -DBUILD_UTILS=OFF -) - -if (MSVC) - add_debug_dep(dep_GLEW) -endif () diff --git a/deps/JPEG/JPEG.cmake b/deps/JPEG/JPEG.cmake deleted file mode 100644 index 32debdf783..0000000000 --- a/deps/JPEG/JPEG.cmake +++ /dev/null @@ -1,12 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -prusaslicer_add_cmake_project(JPEG - URL https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/2.0.6.zip - URL_HASH SHA256=017bdc33ff3a72e11301c0feb4657cb27719d7f97fa67a78ed506c594218bbf1 - DEPENDS ${ZLIB_PKG} - CMAKE_ARGS - -DENABLE_SHARED=OFF - -DENABLE_STATIC=ON -) diff --git a/deps/LibBGCode/LibBGCode.cmake b/deps/LibBGCode/LibBGCode.cmake deleted file mode 100644 index 92003869a6..0000000000 --- a/deps/LibBGCode/LibBGCode.cmake +++ /dev/null @@ -1,34 +0,0 @@ -set(LibBGCode_SOURCE_DIR "" CACHE PATH "Optionally specify local LibBGCode source directory") - -set(_source_dir_line - URL https://github.com/prusa3d/libbgcode/archive/50bedae2ae0c7fc83dd350a8be99ddc8f1749005.zip - URL_HASH SHA256=3958c93a325d6d7ed1c97aabb37cc09a08f8e981e3a7917312d568071e462162 -) - -if (LibBGCode_SOURCE_DIR) - set(_source_dir_line "SOURCE_DIR;${LibBGCode_SOURCE_DIR};BUILD_ALWAYS;ON") -endif () - -prusaslicer_add_cmake_project(LibBGCode_deps - ${_source_dir_line} - SOURCE_SUBDIR deps - DEPENDS dep_Boost ${ZLIB_PKG} - CMAKE_ARGS - -DDEP_DOWNLOAD_DIR:PATH=${DEP_DOWNLOAD_DIR} - -DDEP_CMAKE_OPTS:STRING=-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON - -DLibBGCode_Deps_SELECT_ALL:BOOL=OFF - -DLibBGCode_Deps_SELECT_heatshrink:BOOL=ON - -DDESTDIR=${DESTDIR} -) - -prusaslicer_add_cmake_project(LibBGCode - ${_source_dir_line} - DEPENDS dep_LibBGCode_deps - CMAKE_ARGS - -DLibBGCode_BUILD_TESTS:BOOL=OFF - -DLibBGCode_BUILD_CMD_TOOL:BOOL=OFF -) - -if (MSVC) - add_debug_dep(dep_LibBGCode) -endif () \ No newline at end of file diff --git a/deps/MPFR/MPFR.cmake b/deps/MPFR/MPFR.cmake deleted file mode 100644 index 530ff894c7..0000000000 --- a/deps/MPFR/MPFR.cmake +++ /dev/null @@ -1,42 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2019 - 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -set(_srcdir ${CMAKE_CURRENT_LIST_DIR}/mpfr) -set(_dstdir ${DESTDIR}/usr/local) - -if (MSVC) - set(_output ${_dstdir}/include/mpfr.h - ${_dstdir}/include/mpf2mpfr.h - ${_dstdir}/lib/libmpfr-4.lib - ${_dstdir}/bin/libmpfr-4.dll) - - add_custom_command( - OUTPUT ${_output} - COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/include/mpfr.h ${_dstdir}/include/ - COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/include/mpf2mpfr.h ${_dstdir}/include/ - COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win${DEPS_BITS}/libmpfr-4.lib ${_dstdir}/lib/ - COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win${DEPS_BITS}/libmpfr-4.dll ${_dstdir}/bin/ - ) - - add_custom_target(dep_MPFR SOURCES ${_output}) - -else () - - set(_cross_compile_arg "") - if (CMAKE_CROSSCOMPILING) - # TOOLCHAIN_PREFIX should be defined in the toolchain file - set(_cross_compile_arg --host=${TOOLCHAIN_PREFIX}) - endif () - - ExternalProject_Add(dep_MPFR - URL http://ftp.vim.org/ftp/gnu/mpfr/mpfr-3.1.6.tar.bz2 https://www.mpfr.org/mpfr-3.1.6/mpfr-3.1.6.tar.bz2 # mirrors are allowed - URL_HASH SHA256=cf4f4b2d80abb79e820e78c8077b6725bbbb4e8f41896783c899087be0e94068 - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/MPFR - BUILD_IN_SOURCE ON - CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" ./configure ${_cross_compile_arg} --prefix=${DESTDIR}/usr/local --enable-shared=no --enable-static=yes --with-gmp=${DESTDIR}/usr/local ${_gmp_build_tgt} - BUILD_COMMAND make -j - INSTALL_COMMAND make install - DEPENDS dep_GMP - ) -endif () diff --git a/deps/OpenCSG/OpenCSG.cmake b/deps/OpenCSG/OpenCSG.cmake deleted file mode 100644 index 83dc7b3c80..0000000000 --- a/deps/OpenCSG/OpenCSG.cmake +++ /dev/null @@ -1,21 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2019 - 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ - -prusaslicer_add_cmake_project(OpenCSG - # GIT_REPOSITORY https://github.com/floriankirsch/OpenCSG.git - # GIT_TAG 83e274457b46c9ad11a4ee599203250b1618f3b9 #v1.4.2 - URL https://github.com/floriankirsch/OpenCSG/archive/refs/tags/opencsg-1-4-2-release.zip - URL_HASH SHA256=51afe0db79af8386e2027d56d685177135581e0ee82ade9d7f2caff8deab5ec5 - PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in ./CMakeLists.txt - DEPENDS dep_GLEW -) - -if (TARGET ${ZLIB_PKG}) - add_dependencies(dep_OpenCSG ${ZLIB_PKG}) -endif() - -if (MSVC) - add_debug_dep(dep_OpenCSG) -endif () \ No newline at end of file diff --git a/deps/PNG/PNG.cmake b/deps/PNG/PNG.cmake deleted file mode 100644 index 488fb18afa..0000000000 --- a/deps/PNG/PNG.cmake +++ /dev/null @@ -1,35 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2020 - 2021 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -if (APPLE) - # Only disable NEON extension for Apple ARM builds, leave it enabled for Raspberry PI. - set(_disable_neon_extension "-DPNG_ARM_NEON=off") -else () - set(_disable_neon_extension "") -endif () - -set(_patch_step "") -if (APPLE) - set(_patch_step PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/PNG.patch) -endif () - -prusaslicer_add_cmake_project(PNG - # GIT_REPOSITORY https://github.com/glennrp/libpng.git - # GIT_TAG v1.6.35 - URL https://github.com/glennrp/libpng/archive/refs/tags/v1.6.35.zip - URL_HASH SHA256=3d22d46c566b1761a0e15ea397589b3a5f36ac09b7c785382e6470156c04247f - DEPENDS ${ZLIB_PKG} - "${_patch_step}" - CMAKE_ARGS - -DPNG_SHARED=OFF - -DPNG_STATIC=ON - -DPNG_PREFIX=prusaslicer_ - -DPNG_TESTS=OFF - -DDISABLE_DEPENDENCY_TRACKING=OFF - ${_disable_neon_extension} -) - -if (MSVC) - add_debug_dep(dep_PNG) -endif () diff --git a/deps/Qhull/Qhull.cmake b/deps/Qhull/Qhull.cmake deleted file mode 100644 index fec2a067e3..0000000000 --- a/deps/Qhull/Qhull.cmake +++ /dev/null @@ -1,15 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -include(GNUInstallDirs) -prusaslicer_add_cmake_project(Qhull - URL "https://github.com/qhull/qhull/archive/v8.0.1.zip" - URL_HASH SHA256=5287f5edd6a0372588f5d6640799086a4033d89d19711023ef8229dd9301d69b - CMAKE_ARGS - -DINCLUDE_INSTALL_DIR=${CMAKE_INSTALL_INCLUDEDIR} -) - -if (MSVC) - add_debug_dep(dep_Qhull) -endif () \ No newline at end of file diff --git a/deps/TIFF/TIFF.cmake b/deps/TIFF/TIFF.cmake deleted file mode 100644 index 9b7d61b309..0000000000 --- a/deps/TIFF/TIFF.cmake +++ /dev/null @@ -1,17 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -find_package(OpenGL QUIET REQUIRED) - -prusaslicer_add_cmake_project(TIFF - URL https://gitlab.com/libtiff/libtiff/-/archive/v4.1.0/libtiff-v4.1.0.zip - URL_HASH SHA256=c56edfacef0a60c0de3e6489194fcb2f24c03dbb550a8a7de5938642d045bd32 - DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG - CMAKE_ARGS - -Dlzma:BOOL=OFF - -Dwebp:BOOL=OFF - -Djbig:BOOL=OFF - -Dzstd:BOOL=OFF - -Dpixarlog:BOOL=OFF -) diff --git a/deps/autobuild.cmake b/deps/autobuild.cmake new file mode 100644 index 0000000000..316a5b844a --- /dev/null +++ b/deps/autobuild.cmake @@ -0,0 +1,63 @@ +if (NOT ${PROJECT_NAME}_DEPS_PRESET) + set (${PROJECT_NAME}_DEPS_PRESET "default") +endif () + +set (_output_quiet "") +if (${PROJECT_NAME}_DEPS_OUTPUT_QUIET) + set (_output_quiet OUTPUT_QUIET) +endif () + +message(STATUS "Building the dependencies with preset ${${PROJECT_NAME}_DEPS_PRESET}") + +set(_gen_arg "") +if (CMAKE_GENERATOR) + set (_gen_arg "-G${CMAKE_GENERATOR}") +endif () + +set(_build_args "") + +if (CMAKE_C_COMPILER) + list(APPEND _build_args "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}") +endif () + +if (CMAKE_CXX_COMPILER) + list(APPEND _build_args "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}") +endif () + +if (CMAKE_TOOLCHAIN_FILE) + list(APPEND _build_args "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}") +endif () + +set(_build_dir "${CMAKE_CURRENT_LIST_DIR}/build-${${PROJECT_NAME}_DEPS_PRESET}") +if (${PROJECT_NAME}_DEPS_BUILD_DIR) + set(_build_dir "${${PROJECT_NAME}_DEPS_BUILD_DIR}") +endif () + +message(STATUS "build dir = ${_build_dir}") + +execute_process( + COMMAND ${CMAKE_COMMAND} --preset ${${PROJECT_NAME}_DEPS_PRESET} "${_gen_arg}" -B ${_build_dir} ${_build_args} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + ${_output_quiet} + ERROR_VARIABLE _deps_configure_output + RESULT_VARIABLE _deps_configure_result +) + +if (NOT _deps_configure_result EQUAL 0) + message(FATAL_ERROR "Dependency configure failed with output:\n${_deps_configure_output}") +else () + execute_process( + COMMAND ${CMAKE_COMMAND} --build . + WORKING_DIRECTORY ${_build_dir} + ${_output_quiet} + ERROR_VARIABLE _deps_build_output + RESULT_VARIABLE _deps_build_result + ) + if (NOT _deps_build_result EQUAL 0) + message(FATAL_ERROR "Dependency build failed with output:\n${_deps_build_output}") + endif () +endif () + +list(APPEND CMAKE_PREFIX_PATH ${_build_dir}/destdir/usr/local) +set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}" CACHE STRING "") + diff --git a/deps/deps-linux.cmake b/deps/deps-linux.cmake deleted file mode 100644 index b9b15dc6d2..0000000000 --- a/deps/deps-linux.cmake +++ /dev/null @@ -1,14 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2018 - 2021 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv, Vojtěch Král @vojtechkral, David Kocík @kocikdav -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ - -set(DEP_CMAKE_OPTS "-DCMAKE_POSITION_INDEPENDENT_CODE=ON") - -include("deps-unix-common.cmake") - -# Some Linuxes may have very old libpng, so it's best to bundle it instead of relying on the system version. -# find_package(PNG QUIET) -# if (NOT PNG_FOUND) -# message(WARNING "No PNG dev package found in system, building static library. You should install the system package.") -# endif () \ No newline at end of file diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake deleted file mode 100644 index d260cc8d16..0000000000 --- a/deps/deps-macos.cmake +++ /dev/null @@ -1,101 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2018 - 2022 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv, Oleksandra Iushchenko @YuSanka, Vojtěch Král @vojtechkral -#/|/ Copyright (c) 2020 Bertrand Giot @bgiot -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ - -# This ensures dependencies don't use SDK features which are not available in the version specified by Deployment target -# That can happen when one uses a recent SDK but specifies an older Deployment target -set(DEP_WERRORS_SDK "-Werror=partial-availability -Werror=unguarded-availability -Werror=unguarded-availability-new") - -set(DEP_CMAKE_OPTS - "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" - "-DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT}" - "-DCMAKE_OSX_DEPLOYMENT_TARGET=${DEP_OSX_TARGET}" - "-DCMAKE_CXX_FLAGS=${DEP_WERRORS_SDK}" - "-DCMAKE_C_FLAGS=${DEP_WERRORS_SDK}" - "-DCMAKE_FIND_FRAMEWORK=LAST" - "-DCMAKE_FIND_APPBUNDLE=LAST" -) - -include("deps-unix-common.cmake") - -find_package(CURL QUIET) -if (NOT CURL_FOUND) - message(WARNING "No CURL dev package found in system, building static library. Mac SDK should include CURL from at least version 10.12. Check your SDK installation.") -endif () - - -# ExternalProject_Add(dep_boost -# EXCLUDE_FROM_ALL 1 -# URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" -# URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a -# BUILD_IN_SOURCE 1 -# CONFIGURE_COMMAND ./bootstrap.sh -# --with-toolset=clang -# --with-libraries=system,iostreams,filesystem,thread,log,locale,regex,date_time -# "--prefix=${DESTDIR}/usr/local" -# BUILD_COMMAND ./b2 -# -j ${NPROC} -# --reconfigure -# toolset=clang -# link=static -# variant=release -# threading=multi -# boost.locale.icu=off -# --disable-icu -# "cflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" -# "cxxflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" -# "mflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" -# "mmflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" -# install -# INSTALL_COMMAND "" # b2 does that already -# ) - -# ExternalProject_Add(dep_libcurl -# EXCLUDE_FROM_ALL 1 -# URL "https://curl.haxx.se/download/curl-7.58.0.tar.gz" -# URL_HASH SHA256=cc245bf9a1a42a45df491501d97d5593392a03f7b4f07b952793518d97666115 -# BUILD_IN_SOURCE 1 -# CONFIGURE_COMMAND ./configure -# --enable-static -# --disable-shared -# "--with-ssl=${DESTDIR}/usr/local" -# --with-pic -# --enable-ipv6 -# --enable-versioned-symbols -# --enable-threaded-resolver -# --with-darwinssl -# --without-ssl # disables OpenSSL -# --disable-ldap -# --disable-ldaps -# --disable-manual -# --disable-rtsp -# --disable-dict -# --disable-telnet -# --disable-pop3 -# --disable-imap -# --disable-smb -# --disable-smtp -# --disable-gopher -# --without-gssapi -# --without-libpsl -# --without-libidn2 -# --without-gnutls -# --without-polarssl -# --without-mbedtls -# --without-cyassl -# --without-nss -# --without-axtls -# --without-brotli -# --without-libmetalink -# --without-libssh -# --without-libssh2 -# --without-librtmp -# --without-nghttp2 -# --without-zsh-functions-dir -# BUILD_COMMAND make "-j${NPROC}" -# INSTALL_COMMAND make install "DESTDIR=${DESTDIR}" -# ) - -# add_dependencies(dep_openvdb dep_boost) \ No newline at end of file diff --git a/deps/deps-mingw.cmake b/deps/deps-mingw.cmake deleted file mode 100644 index 438c172e1d..0000000000 --- a/deps/deps-mingw.cmake +++ /dev/null @@ -1,12 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2019 - 2021 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -set(DEP_CMAKE_OPTS "-DCMAKE_POSITION_INDEPENDENT_CODE=ON") -set(DEP_BOOST_TOOLSET "gcc") -set(DEP_BITS 64) - -find_package(Git REQUIRED) - -# TODO make sure to build tbb with -flifetime-dse=1 -include("deps-unix-common.cmake") diff --git a/deps/deps-unix-common.cmake b/deps/deps-unix-common.cmake deleted file mode 100644 index e411b74714..0000000000 --- a/deps/deps-unix-common.cmake +++ /dev/null @@ -1,23 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2018 - 2021 Tomáš Mészáros @tamasmeszaros, Vojtěch Král @vojtechkral, Vojtěch Bubník @bubnikv -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ - -# The unix common part expects DEP_CMAKE_OPTS to be set - -if (MINGW) - set(TBB_MINGW_WORKAROUND "-flifetime-dse=1") -else () - set(TBB_MINGW_WORKAROUND "") -endif () - -find_package(ZLIB QUIET) -if (NOT ZLIB_FOUND) - message(WARNING "No ZLIB dev package found in system, building static library. You should install the system package.") -endif () - -# TODO Evaluate expat modifications in the bundled version and test with system versions in various distros and OSX SDKs -# find_package(EXPAT QUIET) -# if (NOT EXPAT_FOUND) -# message(WARNING "No EXPAT dev package found in system, building static library. Consider installing the system package.") -# endif () diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake deleted file mode 100644 index 6a0d58d0b4..0000000000 --- a/deps/deps-windows.cmake +++ /dev/null @@ -1,72 +0,0 @@ -#/|/ Copyright (c) Prusa Research 2018 - 2021 Enrico Turri @enricoturri1966, Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv, Vojtěch Král @vojtechkral -#/|/ -#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher -#/|/ -# https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html -if (MSVC_VERSION EQUAL 1800) -# 1800 = VS 12.0 (v120 toolset) - set(DEP_VS_VER "12") - set(DEP_BOOST_TOOLSET "msvc-12.0") -elseif (MSVC_VERSION EQUAL 1900) -# 1900 = VS 14.0 (v140 toolset) - set(DEP_VS_VER "14") - set(DEP_BOOST_TOOLSET "msvc-14.0") -elseif (MSVC_VERSION LESS 1920) -# 1910-1919 = VS 15.0 (v141 toolset) - set(DEP_VS_VER "15") - set(DEP_BOOST_TOOLSET "msvc-14.1") -elseif (MSVC_VERSION LESS 1930) -# 1920-1929 = VS 16.0 (v142 toolset) - set(DEP_VS_VER "16") - set(DEP_BOOST_TOOLSET "msvc-14.2") -elseif (MSVC_VERSION LESS 1940) -# 1930-1939 = VS 17.0 (v143 toolset) - set(DEP_VS_VER "17") - set(DEP_BOOST_TOOLSET "msvc-14.3") -else () - message(FATAL_ERROR "Unsupported MSVC version") -endif () - -if (CMAKE_CXX_COMPILER_ID STREQUAL Clang) - set(DEP_BOOST_TOOLSET "clang-win") -endif () - -if (${DEPS_BITS} EQUAL 32) - set(DEP_MSVC_GEN "Visual Studio ${DEP_VS_VER}") - set(DEP_PLATFORM "Win32") -else () - if (DEP_VS_VER LESS 16) - set(DEP_MSVC_GEN "Visual Studio ${DEP_VS_VER} Win64") - else () - set(DEP_MSVC_GEN "Visual Studio ${DEP_VS_VER}") - endif () - set(DEP_PLATFORM "x64") -endif () - -if (${DEP_DEBUG}) - set(DEP_BOOST_DEBUG "debug") -else () - set(DEP_BOOST_DEBUG "") -endif () - -macro(add_debug_dep _dep) -if (${DEP_DEBUG}) - ExternalProject_Get_Property(${_dep} BINARY_DIR) - ExternalProject_Add_Step(${_dep} build_debug - DEPENDEES build - DEPENDERS install - COMMAND msbuild /m /P:Configuration=Debug INSTALL.vcxproj - WORKING_DIRECTORY "${BINARY_DIR}" - ) -endif () -endmacro() - -if (${DEPS_BITS} EQUAL 32) - set(DEP_WXWIDGETS_TARGET "") - set(DEP_WXWIDGETS_LIBDIR "vc_lib") -else () - set(DEP_WXWIDGETS_TARGET "TARGET_CPU=X64") - set(DEP_WXWIDGETS_LIBDIR "vc_x64_lib") -endif () - -find_package(Git REQUIRED) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dc23da212a..2ea3c31117 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -60,8 +60,8 @@ if (SLIC3R_GUI) message(STATUS "wx-config path: ${wxWidgets_CONFIG_EXECUTABLE}") endif() - find_package(JPEG QUIET) - find_package(TIFF QUIET) + find_package(JPEG MODULE QUIET) + find_package(TIFF MODULE QUIET) # Tiff exported config is broken for static build find_package(NanoSVG REQUIRED) string(REGEX MATCH "wxpng" WX_PNG_BUILTIN ${wxWidgets_LIBRARIES}) diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 3f0b500c42..52a04721bd 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -756,7 +756,7 @@ ConfigSubstitutions ConfigBase::load(const std::string& filename, ForwardCompati if (file == nullptr) throw Slic3r::RuntimeError(format("Error opening file %1%", filename)); - std::vector cs_buffer(65536); + std::vector cs_buffer(65536); using namespace bgcode::core; file_type = (is_valid_binary_gcode(*file, true, cs_buffer.data(), cs_buffer.size()) == EResult::Success) ? EFileType::BinaryGCode : EFileType::AsciiGCode; fclose(file); @@ -1094,7 +1094,7 @@ ConfigSubstitutions ConfigBase::load_from_binary_gcode_file(const std::string& f using namespace bgcode::core; using namespace bgcode::binarize; - std::vector cs_buffer(65536); + std::vector cs_buffer(65536); EResult res = is_valid_binary_gcode(*file.f, true, cs_buffer.data(), cs_buffer.size()); if (res != EResult::Success) throw Slic3r::RuntimeError(format("File %1% does not contain a valid binary gcode\nError: %2%", filename, diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 5fbaa8f036..91ec184b80 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1054,7 +1054,7 @@ void GCodeProcessor::process_file(const std::string& filename, std::function cs_buffer(65536); + std::vector cs_buffer(65536); const bool is_binary = is_valid_binary_gcode(*file, true, cs_buffer.data(), cs_buffer.size()) == EResult::Success; fclose(file); @@ -1168,7 +1168,7 @@ void GCodeProcessor::process_binary_file(const std::string& filename, std::funct // read file metadata block, if present BlockHeader block_header; - std::vector cs_buffer(65536); + std::vector cs_buffer(65536); res = read_next_block_header(*file.f, file_header, block_header, cs_buffer.data(), cs_buffer.size()); if (res != EResult::Success) throw Slic3r::RuntimeError(format("Error reading file %1%: %2%", filename, std::string(translate_result(res)))); diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 2f425248a1..684558fff4 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -894,7 +894,7 @@ ConfigSubstitutions PresetBundle::load_config_file(const std::string &path, Forw FILE* file = boost::nowide::fopen(path.c_str(), "rb"); if (file == nullptr) throw Slic3r::RuntimeError(format("Error opening file %1%", path)); - std::vector cs_buffer(65536); + std::vector cs_buffer(65536); const bool is_binary = bgcode::core::is_valid_binary_gcode(*file, true, cs_buffer.data(), cs_buffer.size()) == bgcode::core::EResult::Success; fclose(file); diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 5eee8dd7e4..be7c492a3e 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -372,11 +372,11 @@ elseif (APPLE) target_link_libraries(libslic3r_gui ${DISKARBITRATION_LIBRARY} ${COREWLAN_LIBRARY}) endif() -if (SLIC3R_STATIC) +#if (SLIC3R_STATIC) # FIXME: This was previously exported by wx-config but the wxWidgets # cmake build forgets this and the build fails in debug mode (or on raspberry release) - target_compile_definitions(libslic3r_gui PUBLIC -DwxDEBUG_LEVEL=0) -endif() +# target_compile_definitions(libslic3r_gui PUBLIC -DwxDEBUG_LEVEL=0) +#endif() if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) add_precompiled_header(libslic3r_gui pchheader.hpp FORCEINCLUDE) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index af2a4e033d..f00a2eb7ee 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,23 +1,17 @@ # TODO Add individual tests as executables in separate directories # add_subirectory() +find_package(Catch2 2.9 REQUIRED) + +include(Catch) + set(TEST_DATA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/data) file(TO_NATIVE_PATH "${TEST_DATA_DIR}" TEST_DATA_DIR) -add_library(Catch2 INTERFACE) -list (APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/Catch2) -target_include_directories(Catch2 INTERFACE ${CMAKE_CURRENT_LIST_DIR}) -add_library(Catch2::Catch2 ALIAS Catch2) -if (APPLE) - # OSX builds targeting OSX 10.9 do not support new std::uncought_exception() - # see https://github.com/catchorg/Catch2/issues/1218 - target_compile_definitions(Catch2 INTERFACE -DCATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) -endif() -include(Catch) - set(CATCH_EXTRA_ARGS "" CACHE STRING "Extra arguments for catch2 test suites.") add_library(test_common INTERFACE) +target_include_directories(test_common INTERFACE ${CMAKE_CURRENT_LIST_DIR}) target_compile_definitions(test_common INTERFACE TEST_DATA_DIR=R"\(${TEST_DATA_DIR}\)" CATCH_CONFIG_FAST_COMPILE) target_link_libraries(test_common INTERFACE Catch2::Catch2) diff --git a/tests/catch2/LICENSE.txt b/tests/catch2/LICENSE.txt deleted file mode 100644 index 36b7cd93cd..0000000000 --- a/tests/catch2/LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/tests/catch2/VERSION.txt b/tests/catch2/VERSION.txt deleted file mode 100644 index 587a8125d2..0000000000 --- a/tests/catch2/VERSION.txt +++ /dev/null @@ -1,2 +0,0 @@ -2.9.2 g2c869e1 - diff --git a/tests/catch2/catch.hpp b/tests/catch2/catch.hpp deleted file mode 100644 index 1bfc71c5d9..0000000000 --- a/tests/catch2/catch.hpp +++ /dev/null @@ -1,17937 +0,0 @@ -/* - * Catch v2.13.6 - * Generated: 2021-04-16 18:23:38.044268 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2021 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -// start catch.hpp - - -#define CATCH_VERSION_MAJOR 2 -#define CATCH_VERSION_MINOR 13 -#define CATCH_VERSION_PATCH 6 - -#ifdef __clang__ -# pragma clang system_header -#elif defined __GNUC__ -# pragma GCC system_header -#endif - -// start catch_suppress_warnings.h - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(push) -# pragma warning(disable: 161 1682) -# else // __ICC -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wpadded" -# pragma clang diagnostic ignored "-Wswitch-enum" -# pragma clang diagnostic ignored "-Wcovered-switch-default" -# endif -#elif defined __GNUC__ - // Because REQUIREs trigger GCC's -Wparentheses, and because still - // supported version of g++ have only buggy support for _Pragmas, - // Wparentheses have to be suppressed globally. -# pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details - -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wunused-variable" -# pragma GCC diagnostic ignored "-Wpadded" -#endif -// end catch_suppress_warnings.h -#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) -# define CATCH_IMPL -# define CATCH_CONFIG_ALL_PARTS -#endif - -// In the impl file, we want to have access to all parts of the headers -// Can also be used to sanely support PCHs -#if defined(CATCH_CONFIG_ALL_PARTS) -# define CATCH_CONFIG_EXTERNAL_INTERFACES -# if defined(CATCH_CONFIG_DISABLE_MATCHERS) -# undef CATCH_CONFIG_DISABLE_MATCHERS -# endif -# if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) -# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER -# endif -#endif - -#if !defined(CATCH_CONFIG_IMPL_ONLY) -// start catch_platform.h - -// See e.g.: -// https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html -#ifdef __APPLE__ -# include -# if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || \ - (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1) -# define CATCH_PLATFORM_MAC -# elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) -# define CATCH_PLATFORM_IPHONE -# endif - -#elif defined(linux) || defined(__linux) || defined(__linux__) -# define CATCH_PLATFORM_LINUX - -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__) -# define CATCH_PLATFORM_WINDOWS -#endif - -// end catch_platform.h - -#ifdef CATCH_IMPL -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// start catch_user_interfaces.h - -namespace Catch { - unsigned int rngSeed(); -} - -// end catch_user_interfaces.h -// start catch_tag_alias_autoregistrar.h - -// start catch_common.h - -// start catch_compiler_capabilities.h - -// Detect a number of compiler features - by compiler -// The following features are defined: -// -// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? -// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? -// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? -// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled? -// **************** -// Note to maintainers: if new toggles are added please document them -// in configuration.md, too -// **************** - -// In general each macro has a _NO_ form -// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -#ifdef __cplusplus - -# if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) -# define CATCH_CPP14_OR_GREATER -# endif - -# if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) -# define CATCH_CPP17_OR_GREATER -# endif - -#endif - -// Only GCC compiler should be used in this block, so other compilers trying to -// mask themselves as GCC should be ignored. -#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) && !defined(__LCC__) -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) - -# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) - -#endif - -#if defined(__clang__) - -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" ) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" ) - -// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug -// which results in calls to destructors being emitted for each temporary, -// without a matching initialization. In practice, this can result in something -// like `std::string::~string` being called on an uninitialized value. -// -// For example, this code will likely segfault under IBM XL: -// ``` -// REQUIRE(std::string("12") + "34" == "1234") -// ``` -// -// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. -# if !defined(__ibmxl__) && !defined(__CUDACC__) -# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ -# endif - -# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ - _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") - -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) - -# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) - -# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) - -# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wunused-template\"" ) - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// Assume that non-Windows platforms support posix signals by default -#if !defined(CATCH_PLATFORM_WINDOWS) - #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS -#endif - -//////////////////////////////////////////////////////////////////////////////// -// We know some environments not to support full POSIX signals -#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) - #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS -#endif - -#ifdef __OS400__ -# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS -# define CATCH_CONFIG_COLOUR_NONE -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Android somehow still does not support std::to_string -#if defined(__ANDROID__) -# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING -# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Not all Windows environments support SEH properly -#if defined(__MINGW32__) -# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH -#endif - -//////////////////////////////////////////////////////////////////////////////// -// PS4 -#if defined(__ORBIS__) -# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Cygwin -#ifdef __CYGWIN__ - -// Required for some versions of Cygwin to declare gettimeofday -// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin -# define _BSD_SOURCE -// some versions of cygwin (most) do not support std::to_string. Use the libstd check. -// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813 -# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ - && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) - -# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING - -# endif -#endif // __CYGWIN__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#if defined(_MSC_VER) - -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) - -// Universal Windows platform does not support SEH -// Or console colours (or console at all...) -# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) -# define CATCH_CONFIG_COLOUR_NONE -# else -# define CATCH_INTERNAL_CONFIG_WINDOWS_SEH -# endif - -// MSVC traditional preprocessor needs some workaround for __VA_ARGS__ -// _MSVC_TRADITIONAL == 0 means new conformant preprocessor -// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor -# if !defined(__clang__) // Handle Clang masquerading for msvc -# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) -# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -# endif // MSVC_TRADITIONAL -# endif // __clang__ - -#endif // _MSC_VER - -#if defined(_REENTRANT) || defined(_MSC_VER) -// Enable async processing, as -pthread is specified or no additional linking is required -# define CATCH_INTERNAL_CONFIG_USE_ASYNC -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// -// Check if we are compiled with -fno-exceptions or equivalent -#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) -# define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED -#endif - -//////////////////////////////////////////////////////////////////////////////// -// DJGPP -#ifdef __DJGPP__ -# define CATCH_INTERNAL_CONFIG_NO_WCHAR -#endif // __DJGPP__ - -//////////////////////////////////////////////////////////////////////////////// -// Embarcadero C++Build -#if defined(__BORLANDC__) - #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN -#endif - -//////////////////////////////////////////////////////////////////////////////// - -// Use of __COUNTER__ is suppressed during code analysis in -// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly -// handled by it. -// Otherwise all supported compilers support COUNTER macro, -// but user still might want to turn it off -#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) - #define CATCH_INTERNAL_CONFIG_COUNTER -#endif - -//////////////////////////////////////////////////////////////////////////////// - -// RTX is a special version of Windows that is real time. -// This means that it is detected as Windows, but does not provide -// the same set of capabilities as real Windows does. -#if defined(UNDER_RTSS) || defined(RTX64_BUILD) - #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH - #define CATCH_INTERNAL_CONFIG_NO_ASYNC - #define CATCH_CONFIG_COLOUR_NONE -#endif - -#if !defined(_GLIBCXX_USE_C99_MATH_TR1) -#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER -#endif - -// Various stdlib support checks that require __has_include -#if defined(__has_include) - // Check if string_view is available and usable - #if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW - #endif - - // Check if optional is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) - - // Check if byte is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # include - # if __cpp_lib_byte > 0 - # define CATCH_INTERNAL_CONFIG_CPP17_BYTE - # endif - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) - - // Check if variant is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # if defined(__clang__) && (__clang_major__ < 8) - // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 - // fix should be in clang 8, workaround in libstdc++ 8.2 - # include - # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) - # define CATCH_CONFIG_NO_CPP17_VARIANT - # else - # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT - # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) - # else - # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT - # endif // defined(__clang__) && (__clang_major__ < 8) - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) -#endif // defined(__has_include) - -#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) -# define CATCH_CONFIG_COUNTER -#endif -#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH) -# define CATCH_CONFIG_WINDOWS_SEH -#endif -// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. -#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) -# define CATCH_CONFIG_POSIX_SIGNALS -#endif -// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions. -#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR) -# define CATCH_CONFIG_WCHAR -#endif - -#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING) -# define CATCH_CONFIG_CPP11_TO_STRING -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL) -# define CATCH_CONFIG_CPP17_OPTIONAL -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) -# define CATCH_CONFIG_CPP17_STRING_VIEW -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT) -# define CATCH_CONFIG_CPP17_VARIANT -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE) -# define CATCH_CONFIG_CPP17_BYTE -#endif - -#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) -# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE -#endif - -#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) -# define CATCH_CONFIG_NEW_CAPTURE -#endif - -#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) -# define CATCH_CONFIG_DISABLE_EXCEPTIONS -#endif - -#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN) -# define CATCH_CONFIG_POLYFILL_ISNAN -#endif - -#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC) -# define CATCH_CONFIG_USE_ASYNC -#endif - -#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE) -# define CATCH_CONFIG_ANDROID_LOGWRITE -#endif - -#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) -# define CATCH_CONFIG_GLOBAL_NEXTAFTER -#endif - -// Even if we do not think the compiler has that warning, we still have -// to provide a macro that can be used by the code. -#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION) -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION -#endif -#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS -#endif - -// The goal of this macro is to avoid evaluation of the arguments, but -// still have the compiler warn on problems inside... -#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN) -# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) -#endif - -#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10) -# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS -#elif defined(__clang__) && (__clang_major__ < 5) -# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS -#endif - -#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS -#endif - -#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) -#define CATCH_TRY if ((true)) -#define CATCH_CATCH_ALL if ((false)) -#define CATCH_CATCH_ANON(type) if ((false)) -#else -#define CATCH_TRY try -#define CATCH_CATCH_ALL catch (...) -#define CATCH_CATCH_ANON(type) catch (type) -#endif - -#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) -#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#endif - -// end catch_compiler_capabilities.h -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#ifdef CATCH_CONFIG_COUNTER -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) -#else -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) -#endif - -#include -#include -#include - -// We need a dummy global operator<< so we can bring it into Catch namespace later -struct Catch_global_namespace_dummy {}; -std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy); - -namespace Catch { - - struct CaseSensitive { enum Choice { - Yes, - No - }; }; - - class NonCopyable { - NonCopyable( NonCopyable const& ) = delete; - NonCopyable( NonCopyable && ) = delete; - NonCopyable& operator = ( NonCopyable const& ) = delete; - NonCopyable& operator = ( NonCopyable && ) = delete; - - protected: - NonCopyable(); - virtual ~NonCopyable(); - }; - - struct SourceLineInfo { - - SourceLineInfo() = delete; - SourceLineInfo( char const* _file, std::size_t _line ) noexcept - : file( _file ), - line( _line ) - {} - - SourceLineInfo( SourceLineInfo const& other ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo( SourceLineInfo&& ) noexcept = default; - SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default; - - bool empty() const noexcept { return file[0] == '\0'; } - bool operator == ( SourceLineInfo const& other ) const noexcept; - bool operator < ( SourceLineInfo const& other ) const noexcept; - - char const* file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // Bring in operator<< from global namespace into Catch namespace - // This is necessary because the overload of operator<< above makes - // lookup stop at namespace Catch - using ::operator<<; - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() const; - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO \ - ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) - -// end catch_common.h -namespace Catch { - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ - CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ - CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ - namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ - CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION - -// end catch_tag_alias_autoregistrar.h -// start catch_test_registry.h - -// start catch_interfaces_testcase.h - -#include - -namespace Catch { - - class TestSpec; - - struct ITestInvoker { - virtual void invoke () const = 0; - virtual ~ITestInvoker(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; - }; - - bool isThrowSafe( TestCase const& testCase, IConfig const& config ); - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); - std::vector const& getAllTestCasesSorted( IConfig const& config ); - -} - -// end catch_interfaces_testcase.h -// start catch_stringref.h - -#include -#include -#include -#include - -namespace Catch { - - /// A non-owning string class (similar to the forthcoming std::string_view) - /// Note that, because a StringRef may be a substring of another string, - /// it may not be null terminated. - class StringRef { - public: - using size_type = std::size_t; - using const_iterator = const char*; - - private: - static constexpr char const* const s_empty = ""; - - char const* m_start = s_empty; - size_type m_size = 0; - - public: // construction - constexpr StringRef() noexcept = default; - - StringRef( char const* rawChars ) noexcept; - - constexpr StringRef( char const* rawChars, size_type size ) noexcept - : m_start( rawChars ), - m_size( size ) - {} - - StringRef( std::string const& stdString ) noexcept - : m_start( stdString.c_str() ), - m_size( stdString.size() ) - {} - - explicit operator std::string() const { - return std::string(m_start, m_size); - } - - public: // operators - auto operator == ( StringRef const& other ) const noexcept -> bool; - auto operator != (StringRef const& other) const noexcept -> bool { - return !(*this == other); - } - - auto operator[] ( size_type index ) const noexcept -> char { - assert(index < m_size); - return m_start[index]; - } - - public: // named queries - constexpr auto empty() const noexcept -> bool { - return m_size == 0; - } - constexpr auto size() const noexcept -> size_type { - return m_size; - } - - // Returns the current start pointer. If the StringRef is not - // null-terminated, throws std::domain_exception - auto c_str() const -> char const*; - - public: // substrings and searches - // Returns a substring of [start, start + length). - // If start + length > size(), then the substring is [start, size()). - // If start > size(), then the substring is empty. - auto substr( size_type start, size_type length ) const noexcept -> StringRef; - - // Returns the current start pointer. May not be null-terminated. - auto data() const noexcept -> char const*; - - constexpr auto isNullTerminated() const noexcept -> bool { - return m_start[m_size] == '\0'; - } - - public: // iterators - constexpr const_iterator begin() const { return m_start; } - constexpr const_iterator end() const { return m_start + m_size; } - }; - - auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; - auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; - - constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { - return StringRef( rawChars, size ); - } -} // namespace Catch - -constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { - return Catch::StringRef( rawChars, size ); -} - -// end catch_stringref.h -// start catch_preprocessor.hpp - - -#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__ -#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__))) -#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__))) -#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__))) -#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__))) -#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__))) - -#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__ -// MSVC needs more evaluations -#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__))) -#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__)) -#else -#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__) -#endif - -#define CATCH_REC_END(...) -#define CATCH_REC_OUT - -#define CATCH_EMPTY() -#define CATCH_DEFER(id) id CATCH_EMPTY() - -#define CATCH_REC_GET_END2() 0, CATCH_REC_END -#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2 -#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1 -#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT -#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0) -#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next) - -#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) -#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ ) -#define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) - -#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) -#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ ) -#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...) f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) - -// Applies the function macro `f` to each of the remaining parameters, inserts commas between the results, -// and passes userdata as the first parameter to each invocation, -// e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c) -#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) - -#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) - -#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) -#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ -#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ -#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF -#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__) -#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__ -#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) -#else -// MSVC is adding extra space and needs another indirection to expand INTERNAL_CATCH_NOINTERNAL_CATCH_DEF -#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__) -#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__ -#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1) -#endif - -#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__ -#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name) - -#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__) - -#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper()) -#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) -#else -#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper())) -#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) -#endif - -#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\ - CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__) - -#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0) -#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1) -#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2) -#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) -#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) -#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) -#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6) -#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) -#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) -#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) -#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) - -#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N - -#define INTERNAL_CATCH_TYPE_GEN\ - template struct TypeList {};\ - template\ - constexpr auto get_wrapper() noexcept -> TypeList { return {}; }\ - template class...> struct TemplateTypeList{};\ - template class...Cs>\ - constexpr auto get_wrapper() noexcept -> TemplateTypeList { return {}; }\ - template\ - struct append;\ - template\ - struct rewrap;\ - template class, typename...>\ - struct create;\ - template class, typename>\ - struct convert;\ - \ - template \ - struct append { using type = T; };\ - template< template class L1, typename...E1, template class L2, typename...E2, typename...Rest>\ - struct append, L2, Rest...> { using type = typename append, Rest...>::type; };\ - template< template class L1, typename...E1, typename...Rest>\ - struct append, TypeList, Rest...> { using type = L1; };\ - \ - template< template class Container, template class List, typename...elems>\ - struct rewrap, List> { using type = TypeList>; };\ - template< template class Container, template class List, class...Elems, typename...Elements>\ - struct rewrap, List, Elements...> { using type = typename append>, typename rewrap, Elements...>::type>::type; };\ - \ - template