diff --git a/.gitignore b/.gitignore index ab4a5fc213..28a0ac85c1 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,6 @@ Production **/.vscode **/.vs + +#vcpkg +vcpkg_installed \ No newline at end of file diff --git a/INSTALL.md b/INSTALL.md index 4c47b0f709..3b59a676ca 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -70,68 +70,33 @@ In the scope of AliceVision, vcpkg has only been tested on Windows. 1. Install vcpkg -See the reference [installation guide](https://github.com/alicevision/vcpkg/blob/alicevision_master/README.md#quick-start-windows) to setup vcpkg. -We recommend to use our vcpkg fork, where dependencies have been validated by the AliceVision development team and where some ports may have some custom changes. ```bash -git clone https://github.com/alicevision/vcpkg --branch alicevision_master +git clone https://github.com/microsoft/vcpkg cd vcpkg .\bootstrap-vcpkg.bat ``` -2. Build the required dependencies -```bash -cd -set VCPKG_ROOT=%cd% - -vcpkg install ^ - boost-algorithm boost-accumulators boost-atomic boost-container boost-date-time boost-exception ^ - boost-geometry boost-graph boost-json boost-log boost-program-options boost-property-tree ^ - boost-ptr-container boost-regex boost-serialization boost-system boost-test boost-thread boost-timer ^ - boost-format ^ - lz4 ^ - liblemon ^ - openexr ^ - alembic ^ - geogram ^ - eigen3 ^ - expat ^ - flann nanoflann ^ - onnxruntime-gpu ^ - opencv[eigen,ffmpeg,webp,contrib,nonfree,cuda] ^ - openimageio[opencolorio,pybind11,libraw,ffmpeg,freetype,opencv,gif,openjpeg,webp] ^ - openmesh ^ - ceres[suitesparse,cxsparse] ^ - cuda ^ - tbb ^ - assimp ^ - pcl ^ - clp ^ - libe57format ^ - vcpkg-tool-swig ^ - --triplet x64-windows - -%VCPKG_ROOT%/installed/x64-windows/tools/python3/python -m ensurepip --upgrade -%VCPKG_ROOT%/installed/x64-windows/tools/python3/python -m pip install numpy -``` +2. Build -3. Build AliceVision -```bash -# With VCPKG_ROOT being the path to the root of vcpkg installation -cd /path/to/aliceVision/ -mkdir build && cd build +* Open "x64 Native Tools command Prompt for VS 2022" shipped with Visual studio 2022 +* Move to the aliceVision root directory +* Build the dependencies and generate the solution for building (This command may take a long time the first time as it is building and installing all the required dependencies from sources.) -# Windows: Visual 2022 + Powershell -cmake .. -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT"\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -G "Visual Studio 17 2022" -A x64 -T host=x64 +```bash +cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=c:\path_to_vcpkg\scripts\buildsystems\vcpkg.cmake -DCMAKE_INSTALL_PREFIX=c:\path_to_install -DVCPKG_TARGET_TRIPLET=x64-windows-release -G "Visual Studio 17 2022" -A x64 -T host=x64 -DALICEVISION_BUILD_SWIG_BINDING=ON -DALICEVISION_USE_OPENCV=OFF -DPython3_EXECUTABLE=c:\path_to_python\python.exe +``` -# Windows: Visual 2022 -cmake .. -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -G "Visual Studio 17 2022" -A x64 -T host=x64 +* Effectively build AliceVision and install it to `c:\path_to_install` -# Windows: Visual 2017 -cmake .. -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -G "Visual Studio 15 2017" -A x64 -T host=x64 +```bash +cmake --build build --config Release -t INSTALL ``` -This generates a "aliceVision.sln" solution inside the build folder that you can open in Visual Studio to launch the build. Do not forget to switch the build type to "Release". +* Generate the bundle with all the dependencies in the same directory +```bash +cmake --build build --config Release -t bundle +``` Building the project with embedded dependencies (recommended on linux) ----------------------------------------------- diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json new file mode 100644 index 0000000000..fee071f240 --- /dev/null +++ b/vcpkg-configuration.json @@ -0,0 +1,22 @@ +{ + "default-registry": { + "kind": "git", + "baseline": "d5182f703b51d7b258f83f94d936ac03488dcdbe", + "repository": "https://github.com/microsoft/vcpkg" + }, + "registries": [ + { + "kind": "artifact", + "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip", + "name": "microsoft" + }, + { + "kind": "filesystem", + "path": "./vcpkg", + "packages": ["vcpkg-tool-swig"] + } + ], + "overlay-ports": [ + "vcpkg/overlay_ports" + ] +} diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000000..06ed73cd70 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,89 @@ +{ + "dependencies": [ + "boost-algorithm", + "boost-accumulators", + "boost-atomic", + "boost-container", + "boost-date-time", + "boost-exception", + "boost-geometry", + "boost-graph", + "boost-json", + "boost-log", + "boost-program-options", + "boost-property-tree", + "boost-ptr-container", + "boost-regex", + "boost-serialization", + "boost-system", + "boost-test", + "boost-thread", + "boost-timer", + "boost-format", + "libe57format", + "assimp", + "openexr", + "alembic", + "geogram", + "eigen3", + "expat", + "flann", + "nanoflann", + "onnxruntime-gpu", + "openmesh", + "tbb", + "cuda", + "liblemon", + "clp", + "coinutils", + "osi", + "vcpkg-tool-swig", + { + "name":"openimageio", + "features": ["opencolorio","libraw","gif","openjpeg"] + }, + { + "name":"ceres", + "features": ["suitesparse"] + }, + { + "name": "opencv", + "features": ["eigen", "ffmpeg", "contrib", "nonfree", "cuda"], + "default-features": false + } + ], + "overrides": [ + { + "name": "openimageio", + "version": "2.5.16.0" + }, + { + "name": "suitesparse", + "version": "5.8.0" + }, + { + "name": "opencv", + "version": "4.10.0#0" + }, + { + "name": "liblemon", + "version": "2019-06-13#10" + }, + { + "name": "clp", + "version": "1.17.6#1" + }, + { + "name": "osi", + "version": "0.108.6#1" + }, + { + "name": "coinutils", + "version": "2.11.4#1" + }, + { + "name": "ceres", + "version": "2.2.0#0" + } + ] +} diff --git a/vcpkg/overlay_ports/liblemon/cpp-20-adaptors.patch b/vcpkg/overlay_ports/liblemon/cpp-20-adaptors.patch new file mode 100644 index 0000000000..22f630b4bd --- /dev/null +++ b/vcpkg/overlay_ports/liblemon/cpp-20-adaptors.patch @@ -0,0 +1,13 @@ +diff --git a/lemon/adaptors.h b/lemon/adaptors.h +index 1a40f8e..ffeb12d 100644 +--- a/lemon/adaptors.h ++++ b/lemon/adaptors.h +@@ -37,7 +37,7 @@ + + namespace lemon { + +-#ifdef _MSC_VER ++#if defined _MSC_VER and __cplusplus < 202002L + #define LEMON_SCOPE_FIX(OUTER, NESTED) OUTER::NESTED + #else + #define LEMON_SCOPE_FIX(OUTER, NESTED) typename OUTER::template NESTED diff --git a/vcpkg/overlay_ports/liblemon/cpp-20-arraymap.patch b/vcpkg/overlay_ports/liblemon/cpp-20-arraymap.patch new file mode 100644 index 0000000000..8c640a7c5b --- /dev/null +++ b/vcpkg/overlay_ports/liblemon/cpp-20-arraymap.patch @@ -0,0 +1,106 @@ +diff --git a/lemon/bits/array_map.h b/lemon/bits/array_map.h +index 355ee00..c3992cf 100644 +--- a/lemon/bits/array_map.h ++++ b/lemon/bits/array_map.h +@@ -88,7 +88,7 @@ namespace lemon { + Item it; + for (nf->first(it); it != INVALID; nf->next(it)) { + int id = nf->id(it);; +- allocator.construct(&(values[id]), Value()); ++ std::allocator_traits::construct(allocator, &(values[id]), Value()); + } + } + +@@ -102,7 +102,7 @@ namespace lemon { + Item it; + for (nf->first(it); it != INVALID; nf->next(it)) { + int id = nf->id(it);; +- allocator.construct(&(values[id]), value); ++ std::allocator_traits::construct(allocator, &(values[id]), value); + } + } + +@@ -121,7 +121,7 @@ namespace lemon { + Item it; + for (nf->first(it); it != INVALID; nf->next(it)) { + int id = nf->id(it);; +- allocator.construct(&(values[id]), copy.values[id]); ++ std::allocator_traits::construct(allocator, &(values[id]), copy.values[id]); + } + } + +@@ -218,15 +218,15 @@ namespace lemon { + for (nf->first(it); it != INVALID; nf->next(it)) { + int jd = nf->id(it);; + if (id != jd) { +- allocator.construct(&(new_values[jd]), values[jd]); +- allocator.destroy(&(values[jd])); ++ std::allocator_traits::construct(allocator, &(new_values[jd]), values[jd]); ++ std::allocator_traits::destroy(allocator, &(values[jd])); + } + } + if (capacity != 0) allocator.deallocate(values, capacity); + values = new_values; + capacity = new_capacity; + } +- allocator.construct(&(values[id]), Value()); ++ std::allocator_traits::construct(allocator, &(values[id]), Value()); + } + + // \brief Adds more new keys to the map. +@@ -260,8 +260,8 @@ namespace lemon { + } + } + if (found) continue; +- allocator.construct(&(new_values[id]), values[id]); +- allocator.destroy(&(values[id])); ++ std::allocator_traits::construct(allocator, &(new_values[id]), values[id]); ++ std::allocator_traits::destroy(allocator, &(values[id])); + } + if (capacity != 0) allocator.deallocate(values, capacity); + values = new_values; +@@ -269,7 +269,7 @@ namespace lemon { + } + for (int i = 0; i < int(keys.size()); ++i) { + int id = nf->id(keys[i]); +- allocator.construct(&(values[id]), Value()); ++ std::allocator_traits::construct(allocator, &(values[id]), Value()); + } + } + +@@ -279,7 +279,7 @@ namespace lemon { + // and it overrides the erase() member function of the observer base. + virtual void erase(const Key& key) { + int id = Parent::notifier()->id(key); +- allocator.destroy(&(values[id])); ++ std::allocator_traits::destroy(allocator, &(values[id])); + } + + // \brief Erase more keys from the map. +@@ -289,7 +289,7 @@ namespace lemon { + virtual void erase(const std::vector& keys) { + for (int i = 0; i < int(keys.size()); ++i) { + int id = Parent::notifier()->id(keys[i]); +- allocator.destroy(&(values[id])); ++ std::allocator_traits::destroy(allocator, &(values[id])); + } + } + +@@ -303,7 +303,7 @@ namespace lemon { + Item it; + for (nf->first(it); it != INVALID; nf->next(it)) { + int id = nf->id(it);; +- allocator.construct(&(values[id]), Value()); ++ std::allocator_traits::construct(allocator, &(values[id]), Value()); + } + } + +@@ -317,7 +317,7 @@ namespace lemon { + Item it; + for (nf->first(it); it != INVALID; nf->next(it)) { + int id = nf->id(it); +- allocator.destroy(&(values[id])); ++ std::allocator_traits::destroy(allocator, &(values[id])); + } + allocator.deallocate(values, capacity); + capacity = 0; diff --git a/vcpkg/overlay_ports/liblemon/fix-cmake.patch b/vcpkg/overlay_ports/liblemon/fix-cmake.patch new file mode 100644 index 0000000000..17717295b7 --- /dev/null +++ b/vcpkg/overlay_ports/liblemon/fix-cmake.patch @@ -0,0 +1,78 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 4406bc2..5717680 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -295,7 +295,7 @@ CONFIGURE_FILE( + ${PROJECT_BINARY_DIR}/cmake/LEMONConfig.cmake + @ONLY + ) +-IF(UNIX) ++IF(UNIX OR TRUE) + INSTALL( + FILES ${PROJECT_BINARY_DIR}/cmake/LEMONConfig.cmake + DESTINATION share/lemon/cmake +@@ -307,6 +307,13 @@ ELSEIF(WIN32) + ) + ENDIF() + ++install( ++ EXPORT lemon-targets ++ FILE lemon-targets.cmake ++ NAMESPACE unofficial::lemon:: ++ DESTINATION share/lemon/cmake ++) ++ + CONFIGURE_FILE( + ${PROJECT_SOURCE_DIR}/cmake/version.cmake.in + ${PROJECT_BINARY_DIR}/cmake/version.cmake +diff --git a/cmake/LEMONConfig.cmake.in b/cmake/LEMONConfig.cmake.in +index b0d2d8b..6bb662a 100644 +--- a/cmake/LEMONConfig.cmake.in ++++ b/cmake/LEMONConfig.cmake.in +@@ -1,4 +1,4 @@ +-SET(LEMON_INCLUDE_DIR "@CMAKE_INSTALL_PREFIX@/include" CACHE PATH "LEMON include directory") ++SET(LEMON_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../include" CACHE PATH "LEMON include directory") + SET(LEMON_INCLUDE_DIRS "${LEMON_INCLUDE_DIR}") + + IF(UNIX) +@@ -7,7 +7,12 @@ ELSEIF(WIN32) + SET(LEMON_LIB_NAME "lemon.lib") + ENDIF(UNIX) + +-SET(LEMON_LIBRARY "@CMAKE_INSTALL_PREFIX@/lib/${LEMON_LIB_NAME}" CACHE FILEPATH "LEMON library") ++SET(LEMON_LIBRARY ++ optimized "${CMAKE_CURRENT_LIST_DIR}/../../lib/${LEMON_LIB_NAME}" ++ debug "${CMAKE_CURRENT_LIST_DIR}/../../debug/lib/${LEMON_LIB_NAME}" ++ CACHE FILEPATH "LEMON library") + SET(LEMON_LIBRARIES "${LEMON_LIBRARY}") + + MARK_AS_ADVANCED(LEMON_LIBRARY LEMON_INCLUDE_DIR) ++ ++INCLUDE(${CMAKE_CURRENT_LIST_DIR}/lemon-targets.cmake) +diff --git a/lemon/CMakeLists.txt b/lemon/CMakeLists.txt +index 4e6567e..ad6f5bf 100644 +--- a/lemon/CMakeLists.txt ++++ b/lemon/CMakeLists.txt +@@ -56,6 +56,10 @@ ENDIF() + + ADD_LIBRARY(lemon ${LEMON_SOURCES}) + ++INCLUDE(GNUInstallDirs) ++ ++TARGET_INCLUDE_DIRECTORIES(lemon PUBLIC $) ++ + TARGET_LINK_LIBRARIES(lemon + ${GLPK_LIBRARIES} ${COIN_LIBRARIES} ${ILOG_LIBRARIES} ${SOPLEX_LIBRARIES} + ) +@@ -71,6 +75,11 @@ INSTALL( + COMPONENT library + ) + ++install(TARGETS lemon EXPORT lemon-targets ++ LIBRARY DESTINATION lib ++ ARCHIVE DESTINATION lib ++) ++ + INSTALL( + DIRECTORY . bits concepts + DESTINATION include/lemon diff --git a/vcpkg/overlay_ports/liblemon/portfile.cmake b/vcpkg/overlay_ports/liblemon/portfile.cmake new file mode 100644 index 0000000000..9b47d0e9f0 --- /dev/null +++ b/vcpkg/overlay_ports/liblemon/portfile.cmake @@ -0,0 +1,45 @@ +vcpkg_check_linkage(ONLY_STATIC_LIBRARY) + +set(VERSION ed2c21cbd6ef) + +vcpkg_download_distfile(ARCHIVE + URLS "http://lemon.cs.elte.hu/hg/lemon/archive/${VERSION}.zip" + FILENAME "lemon-${VERSION}.zip" + SHA512 029640e4f791a18068cb2e2b4e794d09822d9d56fb957eb3e2cceae3a30065c0041a31c465637cfcadf7b2473564070b34adc88513439cdf9046831854e2aa70 +) + +vcpkg_extract_source_archive( + SOURCE_PATH + ARCHIVE "${ARCHIVE}" + SOURCE_BASE "${VERSION}" + PATCHES + fix-cmake.patch + cpp-20-arraymap.patch + cpp-20-adaptors.patch +) + +vcpkg_cmake_configure( + SOURCE_PATH "${SOURCE_PATH}" + OPTIONS + -DLEMON_ENABLE_GLPK=OFF + -DLEMON_ENABLE_ILOG=OFF + -DLEMON_ENABLE_COIN=OFF + -DLEMON_ENABLE_SOPLEX=OFF +) + +vcpkg_cmake_install() + +vcpkg_cmake_config_fixup(CONFIG_PATH share/lemon/cmake PACKAGE_NAME lemon) + +vcpkg_fixup_pkgconfig() + +file(GLOB EXE "${CURRENT_PACKAGES_DIR}/bin/*.exe") +file(COPY ${EXE} DESTINATION "${CURRENT_PACKAGES_DIR}/tools/liblemon/") +vcpkg_copy_tool_dependencies("${CURRENT_PACKAGES_DIR}/tools/liblemon") + +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/debug/bin") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/share/doc") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") diff --git a/vcpkg/overlay_ports/liblemon/vcpkg.json b/vcpkg/overlay_ports/liblemon/vcpkg.json new file mode 100644 index 0000000000..02b40ba099 --- /dev/null +++ b/vcpkg/overlay_ports/liblemon/vcpkg.json @@ -0,0 +1,18 @@ +{ + "name": "liblemon", + "version-date": "2019-06-13", + "port-version": 10, + "description": "Library for Efficient Modeling and Optimization in Networks", + "homepage": "https://lemon.cs.elte.hu/trac/lemon", + "supports": "!uwp", + "dependencies": [ + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + } + ] +} diff --git a/vcpkg/ports/vcpkg-tool-swig/portfile.cmake b/vcpkg/ports/vcpkg-tool-swig/portfile.cmake new file mode 100644 index 0000000000..e0292c7e83 --- /dev/null +++ b/vcpkg/ports/vcpkg-tool-swig/portfile.cmake @@ -0,0 +1,30 @@ +set(VCPKG_BUILD_TYPE "release") +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO swig/swig + REF "v${VERSION}" + SHA512 0a9bdcc4a28f1374f9e564fdb372f684bd277bf7b590491218c3538c230bcacd8de32365717a37cf5d7d02165dec9f3955e1bb1207181885fb5b7fbc7476ff04 + HEAD_REF master +) + +vcpkg_find_acquire_program(BISON) +vcpkg_cmake_configure( + SOURCE_PATH "${SOURCE_PATH}" + OPTIONS + "-DBISON_EXECUTABLE=${BISON}" +) + +vcpkg_cmake_install() +vcpkg_fixup_pkgconfig() + +vcpkg_copy_tools( + TOOL_NAMES swig + DESTINATION "${CURRENT_PACKAGES_DIR}/tools/swig" +) + +file(COPY "${CURRENT_PACKAGES_DIR}/bin/" DESTINATION "${CURRENT_PACKAGES_DIR}/tools/swig") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") diff --git a/vcpkg/ports/vcpkg-tool-swig/vcpkg.json b/vcpkg/ports/vcpkg-tool-swig/vcpkg.json new file mode 100644 index 0000000000..b2e7b226c0 --- /dev/null +++ b/vcpkg/ports/vcpkg-tool-swig/vcpkg.json @@ -0,0 +1,20 @@ +{ + "name": "vcpkg-tool-swig", + "version": "4.3.0", + "port-version": 0, + "description": "A software development tool that connects programs written in C and C++ with a variety of high-level programming languages.", + "homepage": "https://www.swig.org/", + "license": "GPL-3.0-only", + "supports": "!uwp", + "dependencies": [ + "pcre2", + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + } + ] +} diff --git a/vcpkg/versions/baseline.json b/vcpkg/versions/baseline.json new file mode 100644 index 0000000000..837d28c4f3 --- /dev/null +++ b/vcpkg/versions/baseline.json @@ -0,0 +1,8 @@ +{ + "default": { + "vcpkg-tool-swig": { + "baseline": "4.3.0", + "port-version": 0 + } + } +} diff --git a/vcpkg/versions/v-/vcpkg-tool-swig.json b/vcpkg/versions/v-/vcpkg-tool-swig.json new file mode 100644 index 0000000000..264e15c14c --- /dev/null +++ b/vcpkg/versions/v-/vcpkg-tool-swig.json @@ -0,0 +1,9 @@ +{ + "versions": [ + { + "version": "4.3.0", + "port-version": 0, + "path": "$/ports/vcpkg-tool-swig" + } + ] +}