diff --git a/.github/workflows/build-occt-with-vcpkg.yml b/.github/workflows/build-occt-with-vcpkg.yml new file mode 100644 index 0000000000..4a330bbb89 --- /dev/null +++ b/.github/workflows/build-occt-with-vcpkg.yml @@ -0,0 +1,172 @@ +# This workflow builds OCCT using vcpkg on multiple platforms (Windows, macOS, Linux). +# It builds in both Debug and Release modes. +# All dependencies except the compiler are installed using vcpkg. +# The workflow includes steps to clone vcpkg, install dependencies, configure and build. + +name: Build OCCT with vcpkg + +on: + push: + branches: + - 'master' + pull_request: + branches: + - '**' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + +env: + USERNAME: Open-Cascade-SAS + VCPKG_EXE: ${{ github.workspace }}/vcpkg/vcpkg + FEED_URL: https://nuget.pkg.github.com/Open-Cascade-SAS/index.json + VCPKG_BINARY_SOURCES: "clear;nuget,https://nuget.pkg.github.com/Open-Cascade-SAS/index.json,readwrite" + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-24.04, ubuntu-22.04, ubuntu-20.04, windows-2022, windows-2019, macos-15, macos-14, macos-13] + build_type: [Debug, Release] + + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.7 + + - name: Install required packages (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y build-essential ninja-build curl zip unzip tar nasm autoconf mono-complete + sudo apt-get install -y libxi-dev libgl1-mesa-dev libglu1-mesa-dev mesa-common-dev libxrandr-dev libxxf86vm-dev + + - name: Install required packages (macOS) + if: runner.os == 'macOS' + run: | + brew update || true + brew install cmake ninja nasm autoconf mono || true + # temporary workaround for missing tcl-tk + brew install tcl-tk || true + # Force link any conflicting packages + brew link --overwrite python@3.12 || true + brew link --overwrite python@3.13 || true + + - name: Install required packages (Windows) + if: runner.os == 'Windows' + uses: ilammy/msvc-dev-cmd@v1.13.0 + with: + arch: x64 + + - name: Set up vcpkg (Unix) + if: runner.os != 'Windows' + run: | + git clone https://github.com/microsoft/vcpkg.git + ./vcpkg/bootstrap-vcpkg.sh + shell: bash + + - name: Set up vcpkg (Windows) + if: runner.os == 'Windows' + run: | + git clone https://github.com/microsoft/vcpkg.git + .\vcpkg\bootstrap-vcpkg.bat + shell: cmd + + - name: Add NuGet sources + if: runner.os == 'Windows' + run: | + .$(${{ env.VCPKG_EXE }} fetch nuget) ` + sources add ` + -Source "${{ env.FEED_URL }}" ` + -StorePasswordInClearText ` + -Name GitHubPackages ` + -UserName "${{ env.USERNAME }}" ` + -Password "${{ secrets.GITHUB_TOKEN }}" + .$(${{ env.VCPKG_EXE }} fetch nuget) ` + setapikey "${{ secrets.GITHUB_TOKEN }}" ` + -Source "${{ env.FEED_URL }}" + shell: pwsh + + - name: Add NuGet sources + if: runner.os != 'Windows' + run: | + mono `${{ env.VCPKG_EXE }} fetch nuget | tail -n 1` \ + sources add \ + -Source "${{ env.FEED_URL }}" \ + -StorePasswordInClearText \ + -Name GitHubPackages \ + -UserName "${{ env.USERNAME }}" \ + -Password "${{ secrets.GITHUB_TOKEN }}" + mono `${{ env.VCPKG_EXE }} fetch nuget | tail -n 1` \ + setapikey "${{ secrets.GITHUB_TOKEN }}" \ + -Source "${{ env.FEED_URL }}" + shell: bash + + - name: Configure OCCT ${{ matrix.build_type }} (Unix) + if: runner.os != 'Windows' + run: | + mkdir build-${{ matrix.build_type }} + cd build-${{ matrix.build_type }} + cmake -G Ninja \ + -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake \ + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ + -DBUILD_USE_VCPKG=ON \ + -DUSE_MMGR_TYPE=NATIVE \ + -DUSE_FREETYPE=ON \ + -DUSE_TK=OFF \ + -DBUILD_USE_PCH=ON \ + -DBUILD_INCLUDE_SYMLINK=ON \ + -DINSTALL_DIR=${{ github.workspace }}/install-${{ matrix.build_type }} \ + -DUSE_DRACO=ON \ + -DUSE_FFMPEG=ON \ + -DUSE_FREEIMAGE=ON \ + -DUSE_GLES2=OFF \ + -DUSE_VTK=ON \ + -DUSE_TBB=ON \ + -DUSE_RAPIDJSON=ON \ + -DUSE_OPENGL=ON \ + -DBUILD_MODULE_Draw=OFF \ + -DVCPKG_INSTALL_OPTIONS=--clean-buildtrees-after-build \ + ${{ runner.os != 'macOS' && '-DUSE_OPENVR=ON' || '' }} .. + shell: bash + + - name: Configure OCCT ${{ matrix.build_type }} (Windows) + if: runner.os == 'Windows' + run: | + mkdir build-${{ matrix.build_type }} + cd build-${{ matrix.build_type }} + cmake -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake ^ + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} ^ + -DBUILD_USE_VCPKG=ON ^ + -DUSE_MMGR_TYPE=JEMALLOC ^ + -DUSE_FREETYPE=ON ^ + -DUSE_TK=OFF ^ + -DBUILD_USE_PCH=ON ^ + -DBUILD_INCLUDE_SYMLINK=ON ^ + -DINSTALL_DIR=${{ github.workspace }}/install-${{ matrix.build_type }} ^ + -DUSE_DRACO=ON ^ + -DUSE_FFMPEG=OFF ^ + -DUSE_FREEIMAGE=ON ^ + -DUSE_GLES2=ON ^ + -DUSE_OPENVR=ON ^ + -DUSE_VTK=ON ^ + -DUSE_TBB=ON ^ + -DUSE_RAPIDJSON=ON ^ + -DVCPKG_INSTALL_OPTIONS=--clean-buildtrees-after-build ^ + -DUSE_OPENGL=ON .. + shell: cmd + + - name: Build OCCT ${{ matrix.build_type }} (Unix) + if: runner.os != 'Windows' + run: | + cd build-${{ matrix.build_type }} + cmake --build . --target install --config ${{ matrix.build_type }} + shell: bash + + - name: Build OCCT ${{ matrix.build_type }} (Windows) + if: runner.os == 'Windows' + run: | + cd build-${{ matrix.build_type }} + cmake --build . --target install --config ${{ matrix.build_type }} + shell: cmd diff --git a/CMakeLists.txt b/CMakeLists.txt index a0873f66ba..96c228520b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,39 @@ cmake_minimum_required (VERSION 3.10 FATAL_ERROR) +if (NOT DEFINED BUILD_USE_VCPKG) + set (BUILD_USE_VCPKG OFF CACHE BOOL "Use vcpkg for 3rdparty libraries.") + if (CMAKE_TOOLCHAIN_FILE MATCHES "vcpkg.cmake") + set (BUILD_USE_VCPKG ON) + endif() +endif() + +if (BUILD_USE_VCPKG) + # check env variable for VCPKG_ROOT + if (DEFINED ENV{VCPKG_ROOT} AND NOT VCPKG_ROOT) + set (VCPKG_ROOT "$ENV{VCPKG_ROOT}" CACHE PATH "Path to vcpkg root directory.") + endif() + + # search if CMAKE_TOOLCHAIN_FILE is already defined for /scripts/buildsystems/vcpkg.cmake + # if exists, then extract the VCPKG ROOT from it path, + # if it exist, but not for vcpkg, then needs to reset to vcpkg and what was before move to VCPKG_CHAINLOAD_TOOLCHAIN_FILE + if (NOT "${CMAKE_TOOLCHAIN_FILE}" STREQUAL "" AND EXISTS "${CMAKE_TOOLCHAIN_FILE}") + if ("${CMAKE_TOOLCHAIN_FILE}" MATCHES "vcpkg.cmake") + string (REGEX REPLACE "/scripts/buildsystems/vcpkg.cmake" "" VCPKG_ROOT ${CMAKE_TOOLCHAIN_FILE}) + set (VCPKG_ROOT "${VCPKG_ROOT}" CACHE PATH "Path to vcpkg root directory." FORCE) + else() + set (VCPKG_CHAINLOAD_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_FILE}) + set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "" FORCE) + endif() + elseif (EXISTS "${VCPKG_ROOT}") + set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "" FORCE) + else() + set (VCPKG_ROOT "" CACHE PATH "Path to vcpkg root directory.") + message(FATAL_ERROR "VCPKG_ROOT is not defined. Please set it to the path of vcpkg root directory.") + endif() + + set (VCPKG_MANIFEST_DIR "${CMAKE_SOURCE_DIR}/adm/vcpkg") +endif() + set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/adm/cmake") set (CMAKE_SUPPRESS_REGENERATION TRUE) @@ -63,9 +97,6 @@ else() unset (BUILD_SHARED_LIBRARY_NAME_POSTFIX) endif() -# the name of the project -project (OCCT) - if (WIN32) add_definitions(-DUNICODE) add_definitions(-D_UNICODE) @@ -253,141 +284,6 @@ elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo") set (BIN_LETTER "i") endif() -# Get all used variables: OS_WITH_BIT, COMPILER -OCCT_MAKE_OS_WITH_BITNESS() -OCCT_MAKE_COMPILER_SHORT_NAME() - -# do not define INSTALL_DIR_BIN for win. -# Leave library structure for win: /win64/vc10/bin(d) -if (NOT DEFINED INSTALL_DIR_BIN) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_BIN "bin" CACHE PATH "${INSTALL_DIR_BIN_DESCR}") - else() - set (INSTALL_DIR_BIN "${OS_WITH_BIT}/${COMPILER}/bin" CACHE PATH "${INSTALL_DIR_BIN_DESCR}") - endif() -endif() - -# define folder containing all shell/batch scripts -if (NOT DEFINED INSTALL_DIR_SCRIPT) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_SCRIPT "${INSTALL_DIR_BIN}" CACHE PATH "${INSTALL_DIR_SCRIPT_DESCR}") - else() - set (INSTALL_DIR_SCRIPT "." CACHE PATH "${INSTALL_DIR_SCRIPT_DESCR}") - endif() -endif() - -# place the libraries to /lib folder for unix and leave old structure for windows -if (NOT DEFINED INSTALL_DIR_LIB) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_LIB "lib" CACHE PATH "${INSTALL_DIR_LIB_DESCR}") - else() - set (INSTALL_DIR_LIB "${OS_WITH_BIT}/${COMPILER}/lib" CACHE PATH "${INSTALL_DIR_LIB_DESCR}") - endif() -endif() - -# OCCT headers: /inc for windows, -# /include/opencascade-7.0.0 for unix -if (NOT DEFINED INSTALL_DIR_INCLUDE) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_INCLUDE "include/opencascade" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_INCLUDE "include/opencascade-${OCC_VERSION_STRING_EXT}" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_INCLUDE "inc" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}") - endif() -endif() - -# OCCT resources: /src for windows, -# /share/opencascade-7.0.0/resources for unix -if (NOT DEFINED INSTALL_DIR_RESOURCE) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_RESOURCE "share/opencascade/resources" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_RESOURCE "share/opencascade-${OCC_VERSION_STRING_EXT}/resources" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_RESOURCE "src" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}") - endif() -endif() - -# OCCT data -if (NOT DEFINED INSTALL_DIR_DATA) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_DATA "share/opencascade/data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_DATA "share/opencascade-${OCC_VERSION_STRING_EXT}/data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_DATA "data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}") - endif() -endif() - -# OCCT samples -if (NOT DEFINED INSTALL_DIR_SAMPLES) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_SAMPLES "share/opencascade/samples" CACHE PATH "${INSTALL_DIR_SAMPLES_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_SAMPLES "share/opencascade-${OCC_VERSION_STRING_EXT}/samples" CACHE PATH "${INSTALL_DIR_SAMPLES_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_SAMPLES "samples" CACHE PATH "${INSTALL_DIR_SAMPLES_DESCR}") - endif() -endif() - -# OCCT tests -if (NOT DEFINED INSTALL_DIR_TESTS) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_TESTS "share/opencascade/tests" CACHE PATH "${INSTALL_DIR_TESTS_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_TESTS "share/opencascade-${OCC_VERSION_STRING_EXT}/tests" CACHE PATH "${INSTALL_DIR_TESTS_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_TESTS "tests" CACHE PATH "${INSTALL_DIR_TESTS_DESCR}") - endif() -endif() - -# OCCT doc -if (NOT DEFINED INSTALL_DIR_DOC) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - set (INSTALL_DIR_DOC "share/doc/opencascade" CACHE PATH "${INSTALL_DIR_DOC_DESCR}") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_DOC "share/doc/opencascade-${OCC_VERSION_STRING_EXT}" CACHE PATH "${INSTALL_DIR_DOC_DESCR}" FORCE) - endif() - else() - set (INSTALL_DIR_DOC "doc" CACHE PATH "${INSTALL_DIR_DOC_DESCR}") - endif() -endif() - -# define folder containing CMake configuration files -if (NOT DEFINED INSTALL_DIR_CMAKE) - if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - if (INSTALL_DIR_WITH_VERSION) - set (INSTALL_DIR_CMAKE "lib/cmake/opencascade-${OCC_VERSION_STRING_EXT}" CACHE PATH "${INSTALL_DIR_CMAKE_DESCR}") - else() - set (INSTALL_DIR_CMAKE "lib/cmake/opencascade" CACHE PATH "${INSTALL_DIR_CMAKE_DESCR}") - endif() - else() - set (INSTALL_DIR_CMAKE "cmake" CACHE PATH "${INSTALL_DIR_CMAKE_DESCR}") - endif() -endif() - -# include occt macros -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_resources") - -# install LICENSE_LGPL_21.txt and OCCT_LGPL_EXCEPTION.txt files -if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") - OCCT_INSTALL_FILE_OR_DIR ("LICENSE_LGPL_21.txt" "${INSTALL_DIR_DOC}") - OCCT_INSTALL_FILE_OR_DIR ("OCCT_LGPL_EXCEPTION.txt" "${INSTALL_DIR_DOC}") -else() - OCCT_INSTALL_FILE_OR_DIR ("LICENSE_LGPL_21.txt" ".") - OCCT_INSTALL_FILE_OR_DIR ("OCCT_LGPL_EXCEPTION.txt" ".") -endif() - -if(APPLE) - set (INSTALL_NAME_DIR "" CACHE STRING "install_name library suffix on OS X (e.g. @executable_path/../Frameworks)") -endif() - # a directory recognized as a 'patch' for OCCT set (BUILD_PATCH "" CACHE PATH "${BUILD_PATCH_DESCR}") @@ -474,19 +370,6 @@ if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore" AND BUILD_MODULE_Draw) set (BUILD_MODULE_Draw OFF CACHE BOOL "${BUILD_MODULE_Draw_DESCR}" FORCE) endif() -# Overview -if (NOT DEFINED BUILD_DOC_Overview) - set (DO_ONLY_CHECK_FOR_DOXYGEN ON) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/doxygen") - set (DO_ONLY_CHECK_FOR_DOXYGEN OFF) - - if (CAN_DOXYGEN_BE_USED) - message (STATUS "Info. Overview building is turned on") - endif() - - set (BUILD_DOC_Overview ${CAN_DOXYGEN_BE_USED} CACHE BOOL "${BUILD_DOC_Overview_DESCR}") -endif() - # accumulate used toolkits (first level) in BUILD_TOOLKITS variable list (APPEND BUILD_TOOLKITS ${BUILD_ADDITIONAL_TOOLKITS}) @@ -511,9 +394,6 @@ list (REMOVE_DUPLICATES OCCT_FULL_LIST_OF_INCLUDES) set (BUILD_TOOLKITS ${RAW_BUILD_TOOLKITS}) -# include the patched or original list of definitions and flags -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_defs_flags") - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/3rdparty_macro") # search for TKIVtk and TKIVtkDraw in BUILD_TOOLKITS @@ -559,32 +439,31 @@ OCCT_IS_PRODUCT_REQUIRED (CSF_OpenGlesLibs CAN_USE_GLES2) OCCT_IS_PRODUCT_REQUIRED (CSF_TBB CAN_USE_TBB) OCCT_IS_PRODUCT_REQUIRED (CSF_EIGEN CAN_USE_EIGEN) -# define CSF variable -OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_csf") +set (OCCT_3RDPARTY_CMAKE_LIST) # Tcl (mandatory for Draw Harness) if (USE_TCL) message (STATUS "Info: TCL is used by OCCT") - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tcl") + OCCT_ADD_VCPKG_FEATURE ("tcl") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/tcl") else() OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TCL") OCCT_CHECK_AND_UNSET ("INSTALL_TCL") + OCCT_UNSET_VCPKG_FEATURE ("tcl") endif() # Tk (optional for Draw Harness) -if (CAN_USE_TK) - if (USE_TK) - message (STATUS "Info: TK is used by OCCT") - add_definitions (-DHAVE_TK) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tk") - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TK") - OCCT_CHECK_AND_UNSET ("INSTALL_TK") - endif() +if (CAN_USE_TK AND USE_TK) + message (STATUS "Info: TK is used by OCCT") + OCCT_ADD_VCPKG_FEATURE ("tk") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/tk") else() - OCCT_CHECK_AND_UNSET ("USE_TK") + if (NOT CAN_USE_TK) + OCCT_CHECK_AND_UNSET ("USE_TK") + endif() OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TK") OCCT_CHECK_AND_UNSET ("INSTALL_TK") + OCCT_UNSET_VCPKG_FEATURE ("tk") endif() # Xlib @@ -593,7 +472,7 @@ if (CAN_USE_XLIB) message (STATUS "Info: Xlib is used by OCCT") add_definitions (-DHAVE_XLIB) if (APPLE) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/glx") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/xlib") endif() endif() else() @@ -601,31 +480,31 @@ else() endif() # FreeType -if (CAN_USE_FREETYPE) - if (USE_FREETYPE) - message (STATUS "Info: FreeType is used by OCCT") - add_definitions (-DHAVE_FREETYPE) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/freetype") - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_FREETYPE") - OCCT_CHECK_AND_UNSET ("3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2") - OCCT_CHECK_AND_UNSET ("3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build") - OCCT_CHECK_AND_UNSET ("INSTALL_FREETYPE") - endif() +if (CAN_USE_FREETYPE AND USE_FREETYPE) + message (STATUS "Info: FreeType is used by OCCT") + add_definitions (-DHAVE_FREETYPE) + OCCT_ADD_VCPKG_FEATURE ("freetype") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/freetype") else() - OCCT_CHECK_AND_UNSET ("USE_FREETYPE") + if (NOT CAN_USE_FREETYPE) + OCCT_CHECK_AND_UNSET ("USE_FREETYPE") + endif() + OCCT_UNSET_VCPKG_FEATURE ("freetype") OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_FREETYPE") + OCCT_CHECK_AND_UNSET ("3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2") + OCCT_CHECK_AND_UNSET ("3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build") OCCT_CHECK_AND_UNSET ("INSTALL_FREETYPE") endif() # VTK if (USE_VTK) add_definitions (-DHAVE_VTK) + OCCT_ADD_VCPKG_FEATURE ("vtk") set (OCCT_VTK_USED_TARGETS "" CACHE INTERNAL "" FORCE) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/vtk") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/vtk") else() OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_VTK") - + OCCT_UNSET_VCPKG_FEATURE ("vtk") if (NOT CAN_USE_VTK EQUAL -1) message (STATUS "Info: TKIVtk and TKIVtkDraw toolkits excluded due to VTK usage is disabled") @@ -635,17 +514,15 @@ else() endif() # FREEIMAGE -if (CAN_USE_FREEIMAGE) - if (USE_FREEIMAGE) - add_definitions (-DHAVE_FREEIMAGE) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/freeimage") - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_FREEIMAGE") - OCCT_CHECK_AND_UNSET ("INSTALL_FREEIMAGE") - endif() -else() +if (CAN_USE_FREEIMAGE AND USE_FREEIMAGE) + add_definitions (-DHAVE_FREEIMAGE) + OCCT_ADD_VCPKG_FEATURE ("freeimage") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/freeimage") +elseif (NOT CAN_USE_FREEIMAGE) OCCT_CHECK_AND_UNSET ("USE_FREEIMAGE") - + OCCT_UNSET_VCPKG_FEATURE ("freeimage") +endif() +if (NOT CAN_USE_FREEIMAGE OR BUILD_USE_VCPKG) OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_FREEIMAGE") OCCT_CHECK_AND_UNSET ("INSTALL_FREEIMAGE") endif() @@ -653,17 +530,15 @@ endif() # OpenVR # search for CSF_OpenVR variable in EXTERNLIB of each being used toolkit OCCT_IS_PRODUCT_REQUIRED (CSF_OpenVR CAN_USE_OPENVR) -if (CAN_USE_OPENVR) - if (USE_OPENVR) - add_definitions (-DHAVE_OPENVR) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/openvr") - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_OPENVR") - OCCT_CHECK_AND_UNSET ("INSTALL_OPENVR") - endif() -else() +if (CAN_USE_OPENVR AND USE_OPENVR) + add_definitions (-DHAVE_OPENVR) + OCCT_ADD_VCPKG_FEATURE ("openvr") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/openvr") +elseif (NOT CAN_USE_OPENVR) OCCT_CHECK_AND_UNSET ("USE_OPENVR") - + OCCT_UNSET_VCPKG_FEATURE ("openvr") +endif() +if (NOT CAN_USE_OPENVR OR BUILD_USE_VCPKG) OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_OPENVR") OCCT_CHECK_AND_UNSET ("INSTALL_OPENVR") endif() @@ -672,17 +547,15 @@ endif() # search for CSF_FFmpeg variable in EXTERNLIB of each being used toolkit OCCT_IS_PRODUCT_REQUIRED (CSF_FFmpeg CAN_USE_FFMPEG) -if (CAN_USE_FFMPEG) - if (USE_FFMPEG) - add_definitions (-DHAVE_FFMPEG) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/ffmpeg") - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_FFMPEG") - OCCT_CHECK_AND_UNSET ("INSTALL_FFMPEG") - endif() -else() +if (CAN_USE_FFMPEG AND USE_FFMPEG) + add_definitions (-DHAVE_FFMPEG) + OCCT_ADD_VCPKG_FEATURE ("ffmpeg") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/ffmpeg") +elseif (NOT CAN_USE_FFMPEG) OCCT_CHECK_AND_UNSET ("USE_FFMPEG") - + OCCT_UNSET_VCPKG_FEATURE ("ffmpeg") +endif() +if (NOT CAN_USE_FFMPEG OR BUILD_USE_VCPKG) OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_FFMPEG") OCCT_CHECK_AND_UNSET ("INSTALL_FFMPEG") endif() @@ -700,28 +573,23 @@ else() endif() # OpenGL ES 2.0 -if (CAN_USE_GLES2) - if (USE_GLES2) - add_definitions (-DHAVE_GLES2_EXT) - if (NOT IOS) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/egl") - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/gles2") - endif() - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_EGL") - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_GLES2") - OCCT_CHECK_AND_UNSET ("INSTALL_EGL") - OCCT_CHECK_AND_UNSET ("INSTALL_GLES2") - list (REMOVE_ITEM BUILD_TOOLKITS TKOpenGles) - list (REMOVE_ITEM BUILD_TOOLKITS TKOpenGlesTest) +if (CAN_USE_GLES2 AND USE_GLES2) + add_definitions (-DHAVE_GLES2_EXT) + if (NOT IOS) + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/egl") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/gles2") + OCCT_ADD_VCPKG_FEATURE ("angle") endif() else() - OCCT_CHECK_AND_UNSET ("USE_GLES2") - + if (NOT CAN_USE_GLES2) + OCCT_CHECK_AND_UNSET ("USE_GLES2") + endif() OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_EGL") OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_GLES2") OCCT_CHECK_AND_UNSET ("INSTALL_EGL") OCCT_CHECK_AND_UNSET ("INSTALL_GLES2") + list (REMOVE_ITEM BUILD_TOOLKITS TKOpenGles) + list (REMOVE_ITEM BUILD_TOOLKITS TKOpenGlesTest) endif() # D3D @@ -735,19 +603,20 @@ else() list (REMOVE_ITEM BUILD_TOOLKITS TKD3DHostTest) endif() +if (ANDROID) + set (CAN_USE_TBB OFF) +endif() + # TBB -if (NOT DEFINED ANDROID AND CAN_USE_TBB) - if (USE_TBB) - add_definitions (-DHAVE_TBB) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tbb") - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TBB") - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TBBMALLOC") - OCCT_CHECK_AND_UNSET ("INSTALL_TBB") - endif() -else() +if (CAN_USE_TBB AND USE_TBB) + add_definitions (-DHAVE_TBB) + OCCT_ADD_VCPKG_FEATURE ("tbb") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/tbb") +elseif (NOT CAN_USE_TBB) OCCT_CHECK_AND_UNSET ("USE_TBB") - + OCCT_UNSET_VCPKG_FEATURE ("tbb") +endif() +if (NOT CAN_USE_TBB OR BUILD_USE_VCPKG) OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TBB") OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TBBMALLOC") OCCT_CHECK_AND_UNSET ("INSTALL_TBB") @@ -756,17 +625,15 @@ endif() # RapidJSON # search for CSF_RapidJSON variable in EXTERNLIB of each being used toolkit OCCT_IS_PRODUCT_REQUIRED (CSF_RapidJSON CAN_USE_RAPIDJSON) -if (CAN_USE_RAPIDJSON) - if (USE_RAPIDJSON) - add_definitions (-DHAVE_RAPIDJSON) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/rapidjson") - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_RAPIDJSON") - OCCT_CHECK_AND_UNSET ("INSTALL_RAPIDJSON") - endif() -else() +if (CAN_USE_RAPIDJSON AND USE_RAPIDJSON) + add_definitions (-DHAVE_RAPIDJSON) + OCCT_ADD_VCPKG_FEATURE ("rapidjson") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/rapidjson") +elseif (NOT CAN_USE_RAPIDJSON) OCCT_CHECK_AND_UNSET ("USE_RAPIDJSON") - + OCCT_UNSET_VCPKG_FEATURE ("rapidjson") +endif() +if (NOT CAN_USE_RAPIDJSON OR BUILD_USE_VCPKG) OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_RAPIDJSON") OCCT_CHECK_AND_UNSET ("INSTALL_RAPIDJSON") endif() @@ -774,17 +641,15 @@ endif() # Draco library # search for CSF_Draco variable in EXTERNLIB of each being used toolkit OCCT_IS_PRODUCT_REQUIRED (CSF_Draco CAN_USE_DRACO) -if (CAN_USE_DRACO) - if (USE_DRACO) - add_definitions (-DHAVE_DRACO) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/draco") - else() - OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_DRACO") - OCCT_CHECK_AND_UNSET ("INSTALL_DRACO") - endif() -else() +if (CAN_USE_DRACO AND USE_DRACO) + add_definitions (-DHAVE_DRACO) + OCCT_ADD_VCPKG_FEATURE ("draco") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/draco") +elseif (NOT CAN_USE_DRACO) OCCT_CHECK_AND_UNSET ("USE_DRACO") - + OCCT_UNSET_VCPKG_FEATURE ("draco") +endif() +if (NOT CAN_USE_DRACO OR BUILD_USE_VCPKG) OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_DRACO") OCCT_CHECK_AND_UNSET ("INSTALL_DRACO") endif() @@ -793,7 +658,7 @@ endif() if (CAN_USE_EIGEN) if (USE_EIGEN) add_definitions (-DHAVE_EIGEN) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/eigen") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/eigen") else() OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_EIGEN") OCCT_CHECK_AND_UNSET ("INSTALL_EIGEN") @@ -811,16 +676,7 @@ if (BUILD_DOC_Overview) set (INSTALL_DOC_Overview OFF CACHE BOOL "${INSTALL_DOC_Overview_DESCR}") endif() - if (INSTALL_DOC_Overview) - install (DIRECTORY "${CMAKE_BINARY_DIR}/doc/overview" DESTINATION "${INSTALL_DIR_DOC}") - - # create overview.html only for windows - if (WIN32 AND "${INSTALL_DIR_LAYOUT}" STREQUAL "Windows") - OCCT_INSTALL_FILE_OR_DIR ("dox/resources/overview.html" "${INSTALL_DIR_DOC}/..") - endif() - endif() - - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/doxygen") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/doxygen") else() OCCT_CHECK_AND_UNSET ("INSTALL_DOC_Overview") @@ -830,22 +686,24 @@ endif() # bison if (BUILD_YACCLEX) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/bison") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/bison") else() OCCT_CHECK_AND_UNSET ("3RDPARTY_BISON_EXECUTABLE") endif() # flex if (BUILD_YACCLEX) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/flex") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/flex") else() OCCT_CHECK_AND_UNSET ("3RDPARTY_FLEX_EXECUTABLE") endif() # Jemalloc if ("${USE_MMGR_TYPE}" STREQUAL "JEMALLOC") - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/jemalloc") + OCCT_ADD_VCPKG_FEATURE ("jemalloc") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/jemalloc") else() + OCCT_UNSET_VCPKG_FEATURE ("jemalloc") OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_JEMALLOC") OCCT_CHECK_AND_UNSET ("INSTALL_JEMALLOC") endif() @@ -854,7 +712,7 @@ endif() if (BUILD_Inspector OR BUILD_SAMPLES_QT) # check qt 3rdparty path add_definitions (-DHAVE_QT) - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/qt") + list (APPEND OCCT_3RDPARTY_CMAKE_LIST "adm/cmake/qt") message (STATUS "Info: Qt is used by OCCT") else() OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_QT") @@ -862,6 +720,183 @@ else() OCCT_CHECK_AND_UNSET ("INSTALL_QT") endif() +# the name of the project +project (OCCT) + +# Get all used variables: OS_WITH_BIT, COMPILER +OCCT_MAKE_OS_WITH_BITNESS() +OCCT_MAKE_COMPILER_SHORT_NAME() + +# define CSF variable +OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_csf") + +# do not define INSTALL_DIR_BIN for win. +# Leave library structure for win: /win64/vc10/bin(d) +if (NOT DEFINED INSTALL_DIR_BIN) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_BIN "bin" CACHE PATH "${INSTALL_DIR_BIN_DESCR}") + else() + set (INSTALL_DIR_BIN "${OS_WITH_BIT}/${COMPILER}/bin" CACHE PATH "${INSTALL_DIR_BIN_DESCR}") + endif() +endif() + +# define folder containing all shell/batch scripts +if (NOT DEFINED INSTALL_DIR_SCRIPT) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_SCRIPT "${INSTALL_DIR_BIN}" CACHE PATH "${INSTALL_DIR_SCRIPT_DESCR}") + else() + set (INSTALL_DIR_SCRIPT "." CACHE PATH "${INSTALL_DIR_SCRIPT_DESCR}") + endif() +endif() + +# place the libraries to /lib folder for unix and leave old structure for windows +if (NOT DEFINED INSTALL_DIR_LIB) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_LIB "lib" CACHE PATH "${INSTALL_DIR_LIB_DESCR}") + else() + set (INSTALL_DIR_LIB "${OS_WITH_BIT}/${COMPILER}/lib" CACHE PATH "${INSTALL_DIR_LIB_DESCR}") + endif() +endif() + +# OCCT headers: /inc for windows, +# /include/opencascade-7.0.0 for unix +if (NOT DEFINED INSTALL_DIR_INCLUDE) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_INCLUDE "include/opencascade" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}") + if (INSTALL_DIR_WITH_VERSION) + set (INSTALL_DIR_INCLUDE "include/opencascade-${OCC_VERSION_STRING_EXT}" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}" FORCE) + endif() + else() + set (INSTALL_DIR_INCLUDE "inc" CACHE PATH "${INSTALL_DIR_INCLUDE_DESCR}") + endif() +endif() + +# OCCT resources: /src for windows, +# /share/opencascade-7.0.0/resources for unix +if (NOT DEFINED INSTALL_DIR_RESOURCE) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_RESOURCE "share/opencascade/resources" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}") + if (INSTALL_DIR_WITH_VERSION) + set (INSTALL_DIR_RESOURCE "share/opencascade-${OCC_VERSION_STRING_EXT}/resources" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}" FORCE) + endif() + else() + set (INSTALL_DIR_RESOURCE "src" CACHE PATH "${INSTALL_DIR_RESOURCE_DESCR}") + endif() +endif() + +# OCCT data +if (NOT DEFINED INSTALL_DIR_DATA) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_DATA "share/opencascade/data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}") + if (INSTALL_DIR_WITH_VERSION) + set (INSTALL_DIR_DATA "share/opencascade-${OCC_VERSION_STRING_EXT}/data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}" FORCE) + endif() + else() + set (INSTALL_DIR_DATA "data" CACHE PATH "${INSTALL_DIR_DATA_DESCR}") + endif() +endif() + +# OCCT samples +if (NOT DEFINED INSTALL_DIR_SAMPLES) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_SAMPLES "share/opencascade/samples" CACHE PATH "${INSTALL_DIR_SAMPLES_DESCR}") + if (INSTALL_DIR_WITH_VERSION) + set (INSTALL_DIR_SAMPLES "share/opencascade-${OCC_VERSION_STRING_EXT}/samples" CACHE PATH "${INSTALL_DIR_SAMPLES_DESCR}" FORCE) + endif() + else() + set (INSTALL_DIR_SAMPLES "samples" CACHE PATH "${INSTALL_DIR_SAMPLES_DESCR}") + endif() +endif() + +# OCCT tests +if (NOT DEFINED INSTALL_DIR_TESTS) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_TESTS "share/opencascade/tests" CACHE PATH "${INSTALL_DIR_TESTS_DESCR}") + if (INSTALL_DIR_WITH_VERSION) + set (INSTALL_DIR_TESTS "share/opencascade-${OCC_VERSION_STRING_EXT}/tests" CACHE PATH "${INSTALL_DIR_TESTS_DESCR}" FORCE) + endif() + else() + set (INSTALL_DIR_TESTS "tests" CACHE PATH "${INSTALL_DIR_TESTS_DESCR}") + endif() +endif() + +# OCCT doc +if (NOT DEFINED INSTALL_DIR_DOC) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + set (INSTALL_DIR_DOC "share/doc/opencascade" CACHE PATH "${INSTALL_DIR_DOC_DESCR}") + if (INSTALL_DIR_WITH_VERSION) + set (INSTALL_DIR_DOC "share/doc/opencascade-${OCC_VERSION_STRING_EXT}" CACHE PATH "${INSTALL_DIR_DOC_DESCR}" FORCE) + endif() + else() + set (INSTALL_DIR_DOC "doc" CACHE PATH "${INSTALL_DIR_DOC_DESCR}") + endif() +endif() + +# define folder containing CMake configuration files +if (NOT DEFINED INSTALL_DIR_CMAKE) + if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + if (INSTALL_DIR_WITH_VERSION) + set (INSTALL_DIR_CMAKE "lib/cmake/opencascade-${OCC_VERSION_STRING_EXT}" CACHE PATH "${INSTALL_DIR_CMAKE_DESCR}") + else() + set (INSTALL_DIR_CMAKE "lib/cmake/opencascade" CACHE PATH "${INSTALL_DIR_CMAKE_DESCR}") + endif() + else() + set (INSTALL_DIR_CMAKE "cmake" CACHE PATH "${INSTALL_DIR_CMAKE_DESCR}") + endif() +endif() + +# include occt macros +OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_resources") + +# install LICENSE_LGPL_21.txt and OCCT_LGPL_EXCEPTION.txt files +if ("${INSTALL_DIR_LAYOUT}" STREQUAL "Unix") + OCCT_INSTALL_FILE_OR_DIR ("LICENSE_LGPL_21.txt" "${INSTALL_DIR_DOC}") + OCCT_INSTALL_FILE_OR_DIR ("OCCT_LGPL_EXCEPTION.txt" "${INSTALL_DIR_DOC}") +else() + OCCT_INSTALL_FILE_OR_DIR ("LICENSE_LGPL_21.txt" ".") + OCCT_INSTALL_FILE_OR_DIR ("OCCT_LGPL_EXCEPTION.txt" ".") +endif() + +if(APPLE) + set (INSTALL_NAME_DIR "" CACHE STRING "install_name library suffix on OS X (e.g. @executable_path/../Frameworks)") +endif() + +# Overview +if (NOT DEFINED BUILD_DOC_Overview) + set (DO_ONLY_CHECK_FOR_DOXYGEN ON) + OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/doxygen") + set (DO_ONLY_CHECK_FOR_DOXYGEN OFF) + + if (CAN_DOXYGEN_BE_USED) + message (STATUS "Info. Overview building is turned on") + endif() + + set (BUILD_DOC_Overview ${CAN_DOXYGEN_BE_USED} CACHE BOOL "${BUILD_DOC_Overview_DESCR}") +endif() + +# include the patched or original list of definitions and flags +OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_defs_flags") + +foreach (OCCT_3RDPARTY_LIST ${OCCT_3RDPARTY_CMAKE_LIST}) + OCCT_INCLUDE_CMAKE_FILE (${OCCT_3RDPARTY_LIST}) +endforeach() + +if (USE_TK) + add_definitions (-DHAVE_TK) +else() + set (CSF_TclTkLibs "") +endif() + +# Installing the overview documentation +if (INSTALL_DOC_Overview) + install (DIRECTORY "${CMAKE_BINARY_DIR}/doc/overview" DESTINATION "${INSTALL_DIR_DOC}") + + # create overview.html only for windows + if (WIN32 AND "${INSTALL_DIR_LAYOUT}" STREQUAL "Windows") + OCCT_INSTALL_FILE_OR_DIR ("dox/resources/overview.html" "${INSTALL_DIR_DOC}/..") + endif() +endif() + # check all 3rdparty include paths string (REGEX REPLACE ";" " " 3RDPARTY_NOT_INCLUDED "${3RDPARTY_NOT_INCLUDED}") if (3RDPARTY_NOT_INCLUDED) diff --git a/adm/cmake/draco.cmake b/adm/cmake/draco.cmake index 30533b64de..5b2f5e0e78 100644 --- a/adm/cmake/draco.cmake +++ b/adm/cmake/draco.cmake @@ -1,6 +1,51 @@ # Draco - a library for a lossy vertex data compression, used as extension to glTF format. # https://github.com/google/draco +macro (SEARCH_DRACO_LIB) + if (3RDPARTY_DRACO_DIR AND EXISTS "${3RDPARTY_DRACO_DIR}") + if (NOT 3RDPARTY_DRACO_LIBRARY OR NOT EXISTS "${3RDPARTY_DRACO_LIBRARY}") + set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .a) + set (3RDPARTY_DRACO_LIBRARY "3RDPARTY_DRACO_LIBRARY-NOTFOUND" CACHE FILEPATH "The path to Draco library" FORCE) + + find_library (3RDPARTY_DRACO_LIBRARY NAMES ${CSF_Draco} + PATHS "${3RDPARTY_DRACO_DIR}" + PATH_SUFFIXES lib + CMAKE_FIND_ROOT_PATH_BOTH + NO_DEFAULT_PATH) + if (3RDPARTY_DRACO_LIBRARY AND EXISTS "${3RDPARTY_DRACO_LIBRARY}") + get_filename_component (3RDPARTY_DRACO_LIBRARY_DIR "${3RDPARTY_DRACO_LIBRARY}" PATH) + set (3RDPARTY_DRACO_LIBRARY_DIR "${3RDPARTY_DRACO_LIBRARY_DIR}" CACHE FILEPATH "The directory containing Draco library" FORCE) + endif() + endif() + + if (WIN32 AND (NOT 3RDPARTY_DRACO_LIBRARY_DEBUG OR NOT EXISTS "${3RDPARTY_DRACO_LIBRARY_DEBUG}")) + set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .a) + set (3RDPARTY_DRACO_LIBRARY_DEBUG "3RDPARTY_DRACO_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "The path to debug Draco library" FORCE) + + find_library (3RDPARTY_DRACO_LIBRARY_DEBUG NAMES ${CSF_Draco} + PATHS "${3RDPARTY_DRACO_DIR}" + PATH_SUFFIXES libd debug/lib + CMAKE_FIND_ROOT_PATH_BOTH + NO_DEFAULT_PATH) + if (3RDPARTY_DRACO_LIBRARY_DEBUG AND EXISTS "${3RDPARTY_DRACO_LIBRARY_DEBUG}") + get_filename_component (3RDPARTY_DRACO_LIBRARY_DIR_DEBUG "${3RDPARTY_DRACO_LIBRARY_DEBUG}" PATH) + set (3RDPARTY_DRACO_LIBRARY_DIR_DEBUG "${3RDPARTY_DRACO_LIBRARY_DIR_DEBUG}" CACHE FILEPATH "The directory containing debug Draco library" FORCE) + endif() + endif() + endif() +endmacro() + +# vcpkg processing +if (BUILD_USE_VCPKG) + find_package (draco CONFIG REQUIRED) + + set (3RDPARTY_DRACO_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}") + SEARCH_DRACO_LIB() + + list (APPEND 3RDPARTY_INCLUDE_DIRS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/draco") + return() +endif() + OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros") if (NOT DEFINED 3RDPARTY_DRACO_DIR) @@ -65,34 +110,4 @@ else() list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_DRACO_INCLUDE_DIR) endif() -if (3RDPARTY_DRACO_DIR AND EXISTS "${3RDPARTY_DRACO_DIR}") - if (NOT 3RDPARTY_DRACO_LIBRARY OR NOT EXISTS "${3RDPARTY_DRACO_LIBRARY}") - set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .a) - set (3RDPARTY_DRACO_LIBRARY "3RDPARTY_DRACO_LIBRARY-NOTFOUND" CACHE FILEPATH "The path to Draco library" FORCE) - - find_library (3RDPARTY_DRACO_LIBRARY NAMES ${CSF_Draco} - PATHS "${3RDPARTY_DRACO_DIR}" - PATH_SUFFIXES lib - CMAKE_FIND_ROOT_PATH_BOTH - NO_DEFAULT_PATH) - if (3RDPARTY_DRACO_LIBRARY AND EXISTS "${3RDPARTY_DRACO_LIBRARY}") - get_filename_component (3RDPARTY_DRACO_LIBRARY_DIR "${3RDPARTY_DRACO_LIBRARY}" PATH) - set (3RDPARTY_DRACO_LIBRARY_DIR "${3RDPARTY_DRACO_LIBRARY_DIR}" CACHE FILEPATH "The directory containing Draco library" FORCE) - endif() - endif() - - if (WIN32 AND (NOT 3RDPARTY_DRACO_LIBRARY_DEBUG OR NOT EXISTS "${3RDPARTY_DRACO_LIBRARY_DEBUG}")) - set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .a) - set (3RDPARTY_DRACO_LIBRARY_DEBUG "3RDPARTY_DRACO_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "The path to debug Draco library" FORCE) - - find_library (3RDPARTY_DRACO_LIBRARY_DEBUG NAMES ${CSF_Draco} - PATHS "${3RDPARTY_DRACO_DIR}" - PATH_SUFFIXES libd - CMAKE_FIND_ROOT_PATH_BOTH - NO_DEFAULT_PATH) - if (3RDPARTY_DRACO_LIBRARY_DEBUG AND EXISTS "${3RDPARTY_DRACO_LIBRARY_DEBUG}") - get_filename_component (3RDPARTY_DRACO_LIBRARY_DIR_DEBUG "${3RDPARTY_DRACO_LIBRARY_DEBUG}" PATH) - set (3RDPARTY_DRACO_LIBRARY_DIR_DEBUG "${3RDPARTY_DRACO_LIBRARY_DIR_DEBUG}" CACHE FILEPATH "The directory containing debug Draco library" FORCE) - endif() - endif() -endif() +SEARCH_DRACO_LIB() diff --git a/adm/cmake/ffmpeg.cmake b/adm/cmake/ffmpeg.cmake index f619d2d410..efd9a3f861 100644 --- a/adm/cmake/ffmpeg.cmake +++ b/adm/cmake/ffmpeg.cmake @@ -1,4 +1,15 @@ -# FFmpeg +# vcpkg processing +if (BUILD_USE_VCPKG) + find_package(FFMPEG REQUIRED) + set(CSF_FFmpeg ${FFMPEG_LIBRARIES}) + if (WIN32) + set (USED_3RDPARTY_FREEIMAGE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin") + else() + set (USED_3RDPARTY_FREEIMAGE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib") + endif() + list (APPEND 3RDPARTY_INCLUDE_DIRS "${FFMPEG_INCLUDE_DIRS}") + return() +endif() if (NOT DEFINED INSTALL_FFMPEG) set (INSTALL_FFMPEG OFF CACHE BOOL "${INSTALL_FFMPEG_DESCR}") diff --git a/adm/cmake/freeimage.cmake b/adm/cmake/freeimage.cmake index 50f32cb20d..f7bc965397 100644 --- a/adm/cmake/freeimage.cmake +++ b/adm/cmake/freeimage.cmake @@ -1,3 +1,16 @@ #freeimage +# vcpkg processing +if (BUILD_USE_VCPKG) +find_package(freeimage CONFIG REQUIRED) + set(CSF_FreeImagePlus freeimage::FreeImagePlus) + if (WIN32) + set (USED_3RDPARTY_FREEIMAGE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin") + else() + set (USED_3RDPARTY_FREEIMAGE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib") + endif() + list (APPEND 3RDPARTY_INCLUDE_DIRS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/") + return() +endif() + THIRDPARTY_PRODUCT("FREEIMAGE" "FreeImage.h" "CSF_FreeImagePlus" "d") diff --git a/adm/cmake/freetype.cmake b/adm/cmake/freetype.cmake index 9a7fda2a5c..498ee11e9a 100644 --- a/adm/cmake/freetype.cmake +++ b/adm/cmake/freetype.cmake @@ -1,5 +1,18 @@ # freetype +# vcpkg processing +if (BUILD_USE_VCPKG) + find_package (Freetype MODULE REQUIRED) + set (CSF_FREETYPE Freetype::Freetype) + if (WIN32) + set (USED_3RDPARTY_FREETYPE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin") + else() + set (USED_3RDPARTY_FREETYPE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib") + endif() + list (APPEND 3RDPARTY_INCLUDE_DIRS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include") + return() +endif() + if (NOT DEFINED INSTALL_FREETYPE AND BUILD_SHARED_LIBS) set (INSTALL_FREETYPE OFF CACHE BOOL "${INSTALL_FREETYPE_DESCR}") endif() diff --git a/adm/cmake/jemalloc.cmake b/adm/cmake/jemalloc.cmake index 579ed3e150..5ee8bbc67e 100644 --- a/adm/cmake/jemalloc.cmake +++ b/adm/cmake/jemalloc.cmake @@ -1,6 +1,6 @@ # JeMalloc -macro (JEMALLOC_LIB_SEARCH MMGR_LIB PREFIX) +function (JEMALLOC_LIB_SEARCH MMGR_LIB PREFIX) if (NOT 3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB}) set (JEMALLOC_PATH_SUFFIXES "lib" "bin") set (3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB} "3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB}-NOTFOUND") @@ -23,20 +23,21 @@ macro (JEMALLOC_LIB_SEARCH MMGR_LIB PREFIX) endif() endif() if (3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB}) - list (APPEND 3RDPARTY_LIBRARY_DIRS "${3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB}}") + list (APPEND 3RDPARTY_LIBRARY_DIRS "${3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB}}" PARENT_SCOPE) set (3RDPARTY_JEMALLOC_LIBRARY_DIR "${3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB}}" CACHE PATH "The directory containing JEMALLOC libraries" FORCE) elseif("${PREFIX}" STREQUAL "SHARED") return() else() message(STATUS "Cannot find ${MMGR_LIB} library in jemalloc 3rdparty") - list (APPEND 3RDPARTY_NO_LIBS 3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB}) - set (3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB} "") + list (APPEND 3RDPARTY_NO_LIBS 3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB} PARENT_SCOPE) + set (3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB} "" PARENT_SCOPE) endif() - set (JEMALLOC_IS_STATIC_LIB FALSE) - if (((${3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB}} MATCHES "\.lib$")) OR ((${3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB}} MATCHES "\.a$"))) + set (JEMALLOC_IS_STATIC_LIB ("${PREFIX}" STREQUAL "STATIC")) + if (${JEMALLOC_IS_STATIC_LIB}) get_filename_component(STATIC_LIB_NAME ${3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB}} NAME) - list(APPEND CSF_MMGR "${STATIC_LIB_NAME}") - set (JEMALLOC_IS_STATIC_LIB TRUE) + set (OLD_CSF_MMGR ${CSF_MMGR}) + list (APPEND OLD_CSF_MMGR "${STATIC_LIB_NAME}") + set (CSF_MMGR "${OLD_CSF_MMGR}" PARENT_SCOPE) endif() # install instructions if (INSTALL_JEMALLOC AND NOT JEMALLOC_IS_STATIC_LIB) @@ -57,14 +58,14 @@ macro (JEMALLOC_LIB_SEARCH MMGR_LIB PREFIX) CONFIGURATIONS RelWithDebInfo DESTINATION "${JEMALLOC_INSTALL_DESTINATION}i") endif() - set (USED_3RDPARTY_JEMALLOC_DIR "") + set (USED_3RDPARTY_JEMALLOC_DIR "" PARENT_SCOPE) elseif(NOT JEMALLOC_IS_STATIC_LIB) # the library directory for using by the executable - set (USED_3RDPARTY_JEMALLOC_DIR ${3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB}}) + set (USED_3RDPARTY_JEMALLOC_DIR ${3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB}} PARENT_SCOPE) endif() unset(3RDPARTY_JEMALLOC_LIBRARY_DIR_${MMGR_LIB} CACHE) unset(3RDPARTY_JEMALLOC_LIBRARY_${PREFIX}_${MMGR_LIB} CACHE) -endmacro() +endfunction() macro (SEARCH_JEMALLOC) # find static jemalloc lib @@ -85,6 +86,16 @@ endmacro() # Reset CSF variable set (CSF_MMGR "") +# vcpkg processing +if (BUILD_USE_VCPKG) + set (3RDPARTY_JEMALLOC_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}") + OCCT_CHECK_AND_UNSET_GROUP (3RDPARTY_JEMALLOC_LIBRARY_SHARED) + OCCT_CHECK_AND_UNSET_GROUP (3RDPARTY_JEMALLOC_LIBRARY_STATIC) + SEARCH_JEMALLOC() + list (APPEND 3RDPARTY_INCLUDE_DIRS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/jemalloc") + return() +endif() + if (NOT DEFINED INSTALL_JEMALLOC) set (INSTALL_JEMALLOC OFF CACHE BOOL "${INSTALL_INSTALL_JEMALLOC_DESCR}") endif() diff --git a/adm/cmake/occt_defs_flags.cmake b/adm/cmake/occt_defs_flags.cmake index ec31fdd800..de5d59643f 100644 --- a/adm/cmake/occt_defs_flags.cmake +++ b/adm/cmake/occt_defs_flags.cmake @@ -163,7 +163,7 @@ elseif (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPIL if (APPLE) set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}") elseif(NOT WIN32) - set (CMAKE_SHARED_LINKER_FLAGS "-lm ${CMAKE_SHARED_LINKER_FLAGS}") + set (CMAKE_SHARED_LINKER_FLAGS "-lm -Wl,-Bsymbolic ${CMAKE_SHARED_LINKER_FLAGS}") endif() endif() endif() diff --git a/adm/cmake/occt_macros.cmake b/adm/cmake/occt_macros.cmake index d2acaa102b..f3f20a689d 100644 --- a/adm/cmake/occt_macros.cmake +++ b/adm/cmake/occt_macros.cmake @@ -843,3 +843,14 @@ function (PROCESS_CSF_LIBRARIES CURRENT_CSF LIST_NAME TARGET_NAME) target_link_directories(${TARGET_NAME} PUBLIC "$<$:${DEBUG_DIR_ABS}>") endforeach() endfunction() +macro(OCCT_ADD_VCPKG_FEATURE THE_FEATURE) + if (BUILD_USE_VCPKG) + list(APPEND VCPKG_MANIFEST_FEATURES "${THE_FEATURE}" PARENT_SCOPE) + endif() +endmacro() + +macro (OCCT_UNSET_VCPKG_FEATURE THE_FEATURE) + if (BUILD_USE_VCPKG) + list (REMOVE_ITEM VCPKG_MANIFEST_FEATURES "${THE_FEATURE}" PARENT_SCOPE) + endif() +endmacro() diff --git a/adm/cmake/openvr.cmake b/adm/cmake/openvr.cmake index b61fbe11ac..53f476d266 100644 --- a/adm/cmake/openvr.cmake +++ b/adm/cmake/openvr.cmake @@ -2,4 +2,17 @@ # OpenVR is an API and runtime that allows access to VR hardware from multiple vendors without requiring that applications have specific knowledge of the hardware they are targeting. # https://github.com/ValveSoftware/openvr +# vcpkg processing +if (BUILD_USE_VCPKG) + set (USED_3RDPARTY_OPENVR_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin") + set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .so .dylib .a) + find_library (FIND_OPENVR_LIB NAMES "${CSF_OpenVR}" + PATHS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib" + CMAKE_FIND_ROOT_PATH_BOTH + NO_DEFAULT_PATH) + set (CSF_OpenVR "${FIND_OPENVR_LIB}") + list (APPEND 3RDPARTY_INCLUDE_DIRS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/") + return() +endif() + THIRDPARTY_PRODUCT("OPENVR" "openvr.h" "CSF_OpenVR" "") diff --git a/adm/cmake/rapidjson.cmake b/adm/cmake/rapidjson.cmake index de8fae24e8..4a419d4d83 100644 --- a/adm/cmake/rapidjson.cmake +++ b/adm/cmake/rapidjson.cmake @@ -1,5 +1,13 @@ # RapidJSON +# vcpkg processing +if (BUILD_USE_VCPKG) + find_package(RapidJSON CONFIG REQUIRED) + set(CSF_RapidJSON rapidjson) + list (APPEND 3RDPARTY_INCLUDE_DIRS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/rapidjson") + return() +endif() + if (NOT DEFINED INSTALL_RAPIDJSON) set (INSTALL_RAPIDJSON OFF CACHE BOOL "${INSTALL_RAPIDJSON_DESCR}") endif() diff --git a/adm/cmake/tbb.cmake b/adm/cmake/tbb.cmake index 4c8f921969..9e74558c92 100644 --- a/adm/cmake/tbb.cmake +++ b/adm/cmake/tbb.cmake @@ -1,5 +1,18 @@ # tbb +# vcpkg processing +if (BUILD_USE_VCPKG) + find_package(TBB CONFIG REQUIRED) + set(CSF_TBB TBB::tbb TBB::tbbmalloc) + if (WIN32) + set (USED_3RDPARTY_TBB_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin") + else() + set (USED_3RDPARTY_TBB_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib") + endif() + list (APPEND 3RDPARTY_INCLUDE_DIRS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/tbb") + return() +endif() + if (MSVC AND BUILD_SHARED_LIBS) add_definitions (-D__TBB_NO_IMPLICIT_LINKAGE) add_definitions (-D__TBBMALLOC_NO_IMPLICIT_LINKAGE) diff --git a/adm/cmake/tcl.cmake b/adm/cmake/tcl.cmake index fdfc3e42c6..7e722b2109 100644 --- a/adm/cmake/tcl.cmake +++ b/adm/cmake/tcl.cmake @@ -1,6 +1,6 @@ # tcl -if (NOT DEFINED INSTALL_TCL) +if (NOT DEFINED INSTALL_TCL AND NOT BUILD_USE_VCPKG) set (INSTALL_TCL OFF CACHE BOOL "${INSTALL_TCL_DESCR}") endif() @@ -14,6 +14,10 @@ if (NOT DEFINED 3RDPARTY_TCL_INCLUDE_DIR) set (3RDPARTY_TCL_INCLUDE_DIR "" CACHE FILEPATH "The directory containing headers of tcl") endif() +if (BUILD_USE_VCPKG) + set (3RDPARTY_TCL_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" CACHE PATH "The directory containing tcl" FORCE) + set (3RDPARTY_TCL_INCLUDE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include" CACHE FILEPATH "The directory containing headers of tcl" FORCE) +endif() # tcl library file (with absolute path) if (NOT DEFINED 3RDPARTY_TCL_LIBRARY OR NOT 3RDPARTY_TCL_LIBRARY_DIR) diff --git a/adm/cmake/tk.cmake b/adm/cmake/tk.cmake index a30081270c..753531f5fc 100644 --- a/adm/cmake/tk.cmake +++ b/adm/cmake/tk.cmake @@ -18,6 +18,12 @@ if (NOT DEFINED 3RDPARTY_TK_INCLUDE_DIR) set (3RDPARTY_TK_INCLUDE_DIR "" CACHE FILEPATH "The directory containing headers of tk") endif() +# if (BUILD_USE_VCPKG) +# set (3RDPARTY_TK_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" CACHE PATH "The directory containing tk" FORCE) +# set (3RDPARTY_TCLTK_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" CACHE PATH "The directory containing tcltk" FORCE) +# set (3RDPARTY_TK_INCLUDE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include" CACHE FILEPATH "The directory containing headers of tk" FORCE) +# endif() + if (BUILD_SHARED_LIBS) # tk library file (with absolute path) if (NOT DEFINED 3RDPARTY_TK_LIBRARY OR NOT 3RDPARTY_TK_LIBRARY_DIR) @@ -190,7 +196,8 @@ if (BUILD_SHARED_LIBS) if (3RDPARTY_TK_LIBRARY AND EXISTS "${3RDPARTY_TK_LIBRARY}") list (APPEND 3RDPARTY_LIBRARY_DIRS "${3RDPARTY_TK_LIBRARY_DIR}") else() - list (APPEND 3RDPARTY_NO_LIBS 3RDPARTY_TK_LIBRARY_DIR) + set (USE_TK OFF) + message(STATUS "Warning: TK library is not found. TK will be disabled.") endif() if (WIN32) diff --git a/adm/cmake/vtk.cmake b/adm/cmake/vtk.cmake index f7fb6580bc..9bc0900c68 100644 --- a/adm/cmake/vtk.cmake +++ b/adm/cmake/vtk.cmake @@ -1,5 +1,19 @@ # vtk +# vcpkg processing +if (BUILD_USE_VCPKG) + find_package(VTK REQUIRED) + set(CSF_VTK VTK::CommonCore) + set(IS_VTK_9XX 1) + if (WIN32) + set (USED_3RDPARTY_VTK_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin") + else() + set (USED_3RDPARTY_VTK_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib") + endif() + list (APPEND 3RDPARTY_INCLUDE_DIRS "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include") + return() +endif() + if (NOT DEFINED INSTALL_VTK) set (INSTALL_VTK OFF CACHE BOOL "${INSTALL_VTK_DESCR}") endif() diff --git a/adm/vcpkg/ports/ffmpeg/0001-create-lib-libraries.patch b/adm/vcpkg/ports/ffmpeg/0001-create-lib-libraries.patch new file mode 100644 index 0000000000..9c2345b09d --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0001-create-lib-libraries.patch @@ -0,0 +1,25 @@ +diff --git a/configure b/configure +index 89af70d..405680e 100755 +--- a/configure ++++ b/configure +@@ -5480,15 +5480,17 @@ case $target_os in + ;; + win32|win64) + disable symver +- if enabled shared; then ++# if enabled shared; then + # Link to the import library instead of the normal static library + # for shared libs. + LD_LIB='%.lib' + # Cannot build both shared and static libs with MSVC or icl. +- disable static +- fi ++# disable static ++# fi + enabled x86_32 && check_ldflags -LARGEADDRESSAWARE + shlibdir_default="$bindir_default" ++ LIBPREF="" ++ LIBSUF=".lib" + SLIBPREF="" + SLIBSUF=".dll" + SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' diff --git a/adm/vcpkg/ports/ffmpeg/0003-fix-windowsinclude.patch b/adm/vcpkg/ports/ffmpeg/0003-fix-windowsinclude.patch new file mode 100644 index 0000000000..b12ec027f9 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0003-fix-windowsinclude.patch @@ -0,0 +1,13 @@ +diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c +index fe424b6..2df70df 100644 +--- a/fftools/cmdutils.c ++++ b/fftools/cmdutils.c +@@ -60,6 +60,8 @@ + #include + #endif + #ifdef _WIN32 ++#define _WIN32_WINNT 0x0502 ++#define WIN32_LEAN_AND_MEAN + #include + #endif + diff --git a/adm/vcpkg/ports/ffmpeg/0004-fix-debug-build.patch b/adm/vcpkg/ports/ffmpeg/0004-fix-debug-build.patch new file mode 100644 index 0000000000..e49688f057 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0004-fix-debug-build.patch @@ -0,0 +1,40 @@ +diff --git a/configure b/configure +index 405680e..cc5bf29 100755 +--- a/configure ++++ b/configure +@@ -4111,6 +4111,9 @@ for opt do + --libfuzzer=*) + libfuzzer_path="$optval" + ;; ++ --debug) ++ enable debug_configure ++ ;; + *) + optname="${opt%%=*}" + optname="${optname#--}" +@@ -6316,7 +6319,11 @@ fi + + enabled zlib && { check_pkg_config zlib zlib "zlib.h" zlibVersion || + check_lib zlib zlib.h zlibVersion -lz; } +-enabled bzlib && check_lib bzlib bzlib.h BZ2_bzlibVersion -lbz2 ++if enabled debug_configure; then ++ enabled bzlib && check_lib bzlib bzlib.h BZ2_bzlibVersion -lbz2d ++else ++ enabled bzlib && check_lib bzlib bzlib.h BZ2_bzlibVersion -lbz2 ++fi + enabled lzma && check_lib lzma lzma.h lzma_version_number -llzma + + # On some systems dynamic loading requires no extra linker flags +@@ -6434,7 +6441,11 @@ enabled librubberband && require_pkg_config librubberband "rubberband >= 1.8 + enabled libshine && require_pkg_config libshine shine shine/layer3.h shine_encode_buffer + enabled libsmbclient && { check_pkg_config libsmbclient smbclient libsmbclient.h smbc_init || + require libsmbclient libsmbclient.h smbc_init -lsmbclient; } +-enabled libsnappy && require libsnappy snappy-c.h snappy_compress -lsnappy -lstdc++ ++if enabled debug_configure; then ++ enabled libsnappy && require libsnappy snappy-c.h snappy_compress -lsnappy -lstdc++ ++else ++ enabled libsnappy && require libsnappy snappy-c.h snappy_compress -lsnappy -lstdc++ ++fi + enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr + enabled libssh && require_pkg_config libssh libssh libssh/sftp.h sftp_init + enabled libspeex && require_pkg_config libspeex speex speex/speex.h speex_decoder_init diff --git a/adm/vcpkg/ports/ffmpeg/0006-fix-StaticFeatures.patch b/adm/vcpkg/ports/ffmpeg/0006-fix-StaticFeatures.patch new file mode 100644 index 0000000000..005cacdf4b --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0006-fix-StaticFeatures.patch @@ -0,0 +1,49 @@ +diff --git a/configure b/configure +index cc5bf29..ee26559 100755 +--- a/configure ++++ b/configure +@@ -6406,7 +6406,8 @@ if enabled libmfx; then + fi + + enabled libmodplug && require_pkg_config libmodplug libmodplug libmodplug/modplug.h ModPlug_Load +-enabled libmp3lame && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame $libm_extralibs ++enabled libmp3lame && { check_lib libmp3lame lame/lame.h lame_set_VBR_quality -lmp3lame $libm_extralibs || ++ require libmp3lame lame/lame.h lame_set_VBR_quality -llibmp3lame-static -llibmpghip-static $libm_extralibs; } + enabled libmysofa && { check_pkg_config libmysofa libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine || + require libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine -lmysofa $zlib_extralibs; } + enabled libnpp && { check_lib libnpp npp.h nppGetLibVersion -lnppig -lnppicc -lnppc -lnppidei || +@@ -6446,7 +6447,7 @@ if enabled debug_configure; then + else + enabled libsnappy && require libsnappy snappy-c.h snappy_compress -lsnappy -lstdc++ + fi +-enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr ++enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr -lm + enabled libssh && require_pkg_config libssh libssh libssh/sftp.h sftp_init + enabled libspeex && require_pkg_config libspeex speex speex/speex.h speex_decoder_init + enabled libsrt && require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket +@@ -6527,6 +6528,8 @@ enabled openal && { { for al_extralibs in "${OPENAL_LIBS}" "-lopenal" + enabled opencl && { check_pkg_config opencl OpenCL CL/cl.h clEnqueueNDRangeKernel || + check_lib opencl OpenCL/cl.h clEnqueueNDRangeKernel -Wl,-framework,OpenCL || + check_lib opencl CL/cl.h clEnqueueNDRangeKernel -lOpenCL || ++ check_lib opencl CL/cl.h clEnqueueNDRangeKernel -lOpenCL -lAdvapi32 -lOle32 -lCfgmgr32|| ++ check_lib opencl CL/cl.h clEnqueueNDRangeKernel -lOpenCL -pthread -ldl || + die "ERROR: opencl not found"; } && + { test_cpp_condition "OpenCL/cl.h" "defined(CL_VERSION_1_2)" || + test_cpp_condition "CL/cl.h" "defined(CL_VERSION_1_2)" || +@@ -6550,6 +6553,7 @@ enabled openssl && { check_pkg_config openssl openssl openssl/ssl.h OP + check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto || + check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 || + check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 || ++ check_lib openssl openssl/ssl.h OPENSSL_init_ssl -llibssl -llibcrypto -lws2_32 -lgdi32 -lcrypt32 -lAdvapi32 -lUser32|| + die "ERROR: openssl not found"; } + enabled pocketsphinx && require_pkg_config pocketsphinx pocketsphinx pocketsphinx/pocketsphinx.h ps_init + enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/rk_mpi.h mpp_create && +@@ -6811,7 +6815,7 @@ enabled amf && + if enabled libc_iconv; then + check_func_headers iconv.h iconv + elif enabled iconv; then +- check_func_headers iconv.h iconv || check_lib iconv iconv.h iconv -liconv ++ check_func_headers iconv.h iconv || check_lib iconv iconv.h iconv -liconv || check_lib iconv iconv.h iconv -liconv -llibcharset + fi + + enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel" diff --git a/adm/vcpkg/ports/ffmpeg/0007-fix-lib-naming.patch b/adm/vcpkg/ports/ffmpeg/0007-fix-lib-naming.patch new file mode 100644 index 0000000000..f2fd7d738c --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0007-fix-lib-naming.patch @@ -0,0 +1,15 @@ +diff --git a/configure b/configure +index ee26559..f2c83b7 100755 +--- a/configure ++++ b/configure +@@ -4496,6 +4496,10 @@ msvc_common_flags(){ + -march=*) ;; + -lz) echo zlib.lib ;; + -lx264) echo libx264.lib ;; ++ -lx265) echo libx265.lib ;; ++ -lmp3lame) echo libmp3lame.lib ;; ++ -liconv) echo iconv.lib ;; ++ -lm) ;; + -lstdc++) ;; + -l*) echo ${flag#-l}.lib ;; + -LARGEADDRESSAWARE) echo $flag ;; diff --git a/adm/vcpkg/ports/ffmpeg/0009-Fix-fdk-detection.patch b/adm/vcpkg/ports/ffmpeg/0009-Fix-fdk-detection.patch new file mode 100644 index 0000000000..3169c6928d --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0009-Fix-fdk-detection.patch @@ -0,0 +1,13 @@ +diff --git a/configure b/configure +index f2c83b7..5e42b12 100755 +--- a/configure ++++ b/configure +@@ -6379,7 +6379,7 @@ enabled libdavs2 && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2. + enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new + enabled libdrm && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion + enabled libfdk_aac && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen || +- { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac && ++ { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac -lm -lstdc++ && + warn "using libfdk without pkg-config"; } } + flite_extralibs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite" + enabled libflite && require libflite "flite/flite.h" flite_init $flite_extralibs diff --git a/adm/vcpkg/ports/ffmpeg/0010-Fix-x264-detection.patch b/adm/vcpkg/ports/ffmpeg/0010-Fix-x264-detection.patch new file mode 100644 index 0000000000..6b76b7fbb6 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0010-Fix-x264-detection.patch @@ -0,0 +1,13 @@ +diff --git a/configure b/configure +index 5e42b12..d8f059f 100755 +--- a/configure ++++ b/configure +@@ -6497,7 +6497,7 @@ enabled libwebp && { + enabled libwebp_encoder && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion + enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; } + enabled libx264 && { check_pkg_config libx264 x264 "stdint.h x264.h" x264_encoder_encode || +- { require libx264 "stdint.h x264.h" x264_encoder_encode "-lx264 $pthreads_extralibs $libm_extralibs" && ++ { require libx264 "stdint.h x264.h" x264_encoder_encode "-lx264 $pthreads_extralibs $libm_extralibs -ldl" && + warn "using libx264 without pkg-config"; } } && + require_cpp_condition libx264 x264.h "X264_BUILD >= 118" && + check_cpp_condition libx262 x264.h "X264_MPEG2" diff --git a/adm/vcpkg/ports/ffmpeg/0011-Fix-x265-detection.patch b/adm/vcpkg/ports/ffmpeg/0011-Fix-x265-detection.patch new file mode 100644 index 0000000000..697ece8086 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0011-Fix-x265-detection.patch @@ -0,0 +1,16 @@ +diff --git a/configure b/configure +index d8f059f..f3688ad 100755 +--- a/configure ++++ b/configure +@@ -6501,7 +6501,10 @@ enabled libx264 && { check_pkg_config libx264 x264 "stdint.h x264.h" x + warn "using libx264 without pkg-config"; } } && + require_cpp_condition libx264 x264.h "X264_BUILD >= 118" && + check_cpp_condition libx262 x264.h "X264_MPEG2" +-enabled libx265 && require_pkg_config libx265 x265 x265.h x265_api_get && ++enabled libx265 && { check_pkg_config libx265 x265 x265.h x265_api_get || ++ { { check_lib libx265 x265.h x265_api_get "-lx265 $pthreads_extralibs $libm_extralibs -ldl -lstdc++ -lgcc_s -lgcc -lrt -lnuma" || ++ require libx265 x265.h x265_api_get "-lx265 $pthreads_extralibs $libm_extralibs -ldl -lstdc++"; } && ++ warn "using libx265 without pkg-config"; } } && + require_cpp_condition libx265 x265.h "X265_BUILD >= 70" + enabled libxavs && require libxavs "stdint.h xavs.h" xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs" + enabled libxavs2 && require_pkg_config libxavs2 "xavs2 >= 1.3.0" "stdint.h xavs2.h" xavs2_api_get diff --git a/adm/vcpkg/ports/ffmpeg/0012-Fix-ssl-110-detection.patch b/adm/vcpkg/ports/ffmpeg/0012-Fix-ssl-110-detection.patch new file mode 100644 index 0000000000..6f424607fa --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0012-Fix-ssl-110-detection.patch @@ -0,0 +1,12 @@ +diff --git a/configure b/configure +index f3688ad..26e512e 100755 +--- a/configure ++++ b/configure +@@ -6556,6 +6556,7 @@ enabled omx_rpi && { test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoR + enabled omx && require_headers OMX_Core.h + enabled openssl && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl || + check_pkg_config openssl openssl openssl/ssl.h SSL_library_init || ++ check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto $pthreads_extralibs -ldl || + check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto || + check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto || + check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 || diff --git a/adm/vcpkg/ports/ffmpeg/0013-define-WINVER.patch b/adm/vcpkg/ports/ffmpeg/0013-define-WINVER.patch new file mode 100644 index 0000000000..395df56e95 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0013-define-WINVER.patch @@ -0,0 +1,16 @@ +diff --git a/libavcodec/mf_utils.c b/libavcodec/mf_utils.c +index eeabd0c..ea3a03b 100644 +--- a/libavcodec/mf_utils.c ++++ b/libavcodec/mf_utils.c +@@ -22,6 +22,11 @@ + #define _WIN32_WINNT 0x0602 + #endif + ++#if !defined(WINVER) || WINVER < 0x0602 ++#undef WINVER ++#define WINVER 0x0602 ++#endif ++ + #include "mf_utils.h" + #include "libavutil/pixdesc.h" + diff --git a/adm/vcpkg/ports/ffmpeg/0014-avfilter-dependency-fix.patch b/adm/vcpkg/ports/ffmpeg/0014-avfilter-dependency-fix.patch new file mode 100644 index 0000000000..6e1921bb87 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0014-avfilter-dependency-fix.patch @@ -0,0 +1,23 @@ +diff --git a/configure b/configure +index 26e512e..c0377b6 100755 +--- a/configure ++++ b/configure +@@ -3674,6 +3674,18 @@ vpp_qsv_filter_select="qsvvpp" + xfade_opencl_filter_deps="opencl" + yadif_cuda_filter_deps="ffnvcodec" + yadif_cuda_filter_deps_any="cuda_nvcc cuda_llvm" ++ametadata_filter_deps="avformat" ++metadata_filter_deps="avformat" ++headphone_filter_deps="avcodec" ++headphone_filter_select="fft" ++showspatial_filter_deps="avcodec" ++showspatial_filter_select="fft" ++superequalizer_filter_deps="avcodec" ++superequalizer_filter_select="rdft" ++surround_filter_deps="avcodec" ++surround_filter_select="rdft" ++sinc_filter_deps="avcodec" ++sinc_filter_select="rdft" + + # examples + avio_list_dir_deps="avformat avutil" diff --git a/adm/vcpkg/ports/ffmpeg/0015-Fix-xml2-detection.patch b/adm/vcpkg/ports/ffmpeg/0015-Fix-xml2-detection.patch new file mode 100644 index 0000000000..7c50105342 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0015-Fix-xml2-detection.patch @@ -0,0 +1,13 @@ +diff --git a/configure b/configure +index c0377b6..62753ef 100755 +--- a/configure ++++ b/configure +@@ -6526,7 +6526,7 @@ enabled libzmq && require_pkg_config libzmq "libzmq >= 4.2.1" zmq.h z + enabled libzvbi && require_pkg_config libzvbi zvbi-0.2 libzvbi.h vbi_decoder_new && + { test_cpp_condition libzvbi.h "VBI_VERSION_MAJOR > 0 || VBI_VERSION_MINOR > 2 || VBI_VERSION_MINOR == 2 && VBI_VERSION_MICRO >= 28" || + enabled gpl || die "ERROR: libzvbi requires version 0.2.28 or --enable-gpl."; } +-enabled libxml2 && require_pkg_config libxml2 libxml-2.0 libxml2/libxml/xmlversion.h xmlCheckVersion ++enabled libxml2 && require_pkg_config libxml2 libxml-2.0 libxml/xmlversion.h xmlCheckVersion + enabled mbedtls && { check_pkg_config mbedtls mbedtls mbedtls/x509_crt.h mbedtls_x509_crt_init || + check_pkg_config mbedtls mbedtls mbedtls/ssl.h mbedtls_ssl_init || + check_lib mbedtls mbedtls/ssl.h mbedtls_ssl_init -lmbedtls -lmbedx509 -lmbedcrypto || diff --git a/adm/vcpkg/ports/ffmpeg/0017-Patch-for-ticket-9019-CUDA-Compile-Broken-Using-MSVC.patch b/adm/vcpkg/ports/ffmpeg/0017-Patch-for-ticket-9019-CUDA-Compile-Broken-Using-MSVC.patch new file mode 100644 index 0000000000..718b436d48 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0017-Patch-for-ticket-9019-CUDA-Compile-Broken-Using-MSVC.patch @@ -0,0 +1,30 @@ +diff --git a/compat/cuda/ptx2c.sh b/compat/cuda/ptx2c.sh +index 48452379c2..1c486dc30e 100755 +--- a/compat/cuda/ptx2c.sh ++++ b/compat/cuda/ptx2c.sh +@@ -26,9 +26,10 @@ OUT="$1" + IN="$2" + NAME="$(basename "$IN" | sed 's/\..*//')" + +-printf "const char %s_ptx[] = \\" "$NAME" > "$OUT" ++printf "const char %s_ptx[] = {\\" "$NAME" > "$OUT" + echo >> "$OUT" +-sed -e "$(printf 's/\r//g')" -e 's/["\\]/\\&/g' -e "$(printf 's/^/\t"/')" -e 's/$/\\n"/' < "$IN" >> "$OUT" +-echo ";" >> "$OUT" ++xxd -i < "$IN" >> "$OUT" ++echo " ,0x00" >> "$OUT" ++echo "};" >> "$OUT" + + exit 0 +diff --git a/configure b/configure +index 6190d06b0b..48fb73738e 100755 +--- a/configure ++++ b/configure +@@ -1046,6 +1046,7 @@ test_nvcc(){ + tmpo_=$TMPO + [ -x "$(command -v cygpath)" ] && tmpcu_=$(cygpath -m $tmpcu_) && tmpo_=$(cygpath -m $tmpo_) + test_cmd $nvcc $nvccflags "$@" $NVCC_C $(nvcc_o $tmpo_) $tmpcu_ ++ test_cmd xxd + } + + check_nvcc() { diff --git a/adm/vcpkg/ports/ffmpeg/0018-libaom-Dont-use-aom_codec_av1_dx_algo.patch b/adm/vcpkg/ports/ffmpeg/0018-libaom-Dont-use-aom_codec_av1_dx_algo.patch new file mode 100644 index 0000000000..80af5abab7 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0018-libaom-Dont-use-aom_codec_av1_dx_algo.patch @@ -0,0 +1,13 @@ +diff --git a/libavcodec/libaomdec.c b/libavcodec/libaomdec.c +index 1fc0a00..06b2ff0 100644 +--- a/libavcodec/libaomdec.c ++++ b/libavcodec/libaomdec.c +@@ -224,7 +224,7 @@ static av_cold int aom_free(AVCodecContext *avctx) + + static av_cold int av1_init(AVCodecContext *avctx) + { +- return aom_init(avctx, &aom_codec_av1_dx_algo); ++ return aom_init(avctx, aom_codec_av1_dx()); + } + + AVCodec ff_libaom_av1_decoder = { diff --git a/adm/vcpkg/ports/ffmpeg/0019-libx264-Do-not-explicitly-set-X264_API_IMPORTS.patch b/adm/vcpkg/ports/ffmpeg/0019-libx264-Do-not-explicitly-set-X264_API_IMPORTS.patch new file mode 100644 index 0000000000..5fa6693779 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0019-libx264-Do-not-explicitly-set-X264_API_IMPORTS.patch @@ -0,0 +1,33 @@ +diff --git a/configure b/configure +index 62753ef..018764e 100755 +--- a/configure ++++ b/configure +@@ -6508,11 +6508,8 @@ enabled libvpx && { + enabled libwebp && { + enabled libwebp_encoder && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion + enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; } +-enabled libx264 && { check_pkg_config libx264 x264 "stdint.h x264.h" x264_encoder_encode || +- { require libx264 "stdint.h x264.h" x264_encoder_encode "-lx264 $pthreads_extralibs $libm_extralibs -ldl" && +- warn "using libx264 without pkg-config"; } } && +- require_cpp_condition libx264 x264.h "X264_BUILD >= 118" && +- check_cpp_condition libx262 x264.h "X264_MPEG2" ++enabled libx264 && check_pkg_config libx264 x264 "stdint.h x264.h" x264_encoder_encode && ++ require_cpp_condition libx264 x264.h "X264_BUILD >= 158" + enabled libx265 && { check_pkg_config libx265 x265 x265.h x265_api_get || + { { check_lib libx265 x265.h x265_api_get "-lx265 $pthreads_extralibs $libm_extralibs -ldl -lstdc++ -lgcc_s -lgcc -lrt -lnuma" || + require libx265 x265.h x265_api_get "-lx265 $pthreads_extralibs $libm_extralibs -ldl -lstdc++"; } && +diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c +index 4ddc497..0152d30 100644 +--- a/libavcodec/libx264.c ++++ b/libavcodec/libx264.c +@@ -32,10 +32,6 @@ + #include "packet_internal.h" + #include "atsc_a53.h" + +-#if defined(_MSC_VER) +-#define X264_API_IMPORTS 1 +-#endif +- + #include + #include + #include diff --git a/adm/vcpkg/ports/ffmpeg/0020-fix-aarch64-libswscale.patch b/adm/vcpkg/ports/ffmpeg/0020-fix-aarch64-libswscale.patch new file mode 100644 index 0000000000..553b3638ed --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0020-fix-aarch64-libswscale.patch @@ -0,0 +1,28 @@ +diff --git a/libswscale/aarch64/yuv2rgb_neon.S b/libswscale/aarch64/yuv2rgb_neon.S +index f4b220f..af677af 100644 +--- a/libswscale/aarch64/yuv2rgb_neon.S ++++ b/libswscale/aarch64/yuv2rgb_neon.S +@@ -169,19 +169,19 @@ function ff_\ifmt\()_to_\ofmt\()_neon, export=1 + sqdmulh v26.8H, v26.8H, v0.8H // ((Y1*(1<<3) - y_offset) * y_coeff) >> 15 + sqdmulh v27.8H, v27.8H, v0.8H // ((Y2*(1<<3) - y_offset) * y_coeff) >> 15 + +-.ifc \ofmt,argb // 1 2 3 0 ++.ifc \ofmt,argb + compute_rgba v5.8B,v6.8B,v7.8B,v4.8B, v17.8B,v18.8B,v19.8B,v16.8B + .endif + +-.ifc \ofmt,rgba // 0 1 2 3 ++.ifc \ofmt,rgba + compute_rgba v4.8B,v5.8B,v6.8B,v7.8B, v16.8B,v17.8B,v18.8B,v19.8B + .endif + +-.ifc \ofmt,abgr // 3 2 1 0 ++.ifc \ofmt,abgr + compute_rgba v7.8B,v6.8B,v5.8B,v4.8B, v19.8B,v18.8B,v17.8B,v16.8B + .endif + +-.ifc \ofmt,bgra // 2 1 0 3 ++.ifc \ofmt,bgra + compute_rgba v6.8B,v5.8B,v4.8B,v7.8B, v18.8B,v17.8B,v16.8B,v19.8B + .endif + diff --git a/adm/vcpkg/ports/ffmpeg/0022-fix-m1-hardware-decode-nal-bits.patch b/adm/vcpkg/ports/ffmpeg/0022-fix-m1-hardware-decode-nal-bits.patch new file mode 100644 index 0000000000..6b6905e69c --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0022-fix-m1-hardware-decode-nal-bits.patch @@ -0,0 +1,43 @@ +From c534d9f72a89542ed639071b1ae15893aadf1f18 Mon Sep 17 00:00:00 2001 +From: rcombs +Date: Sat, 16 Apr 2022 03:41:29 -0500 +Subject: [PATCH] lavc/h264_ps: always include the stop bit in [s|p]ps->data + +The VideoToolbox hwaccel needs the entire NAL (including the stop bit), +but ff_h2645_packet_split may remove it. Detect this case by looking for +bit counts divisible by 8 and insert a stop-bit-only 0x80 byte. + +Signed-off-by: rcombs +--- + libavcodec/h264_ps.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c +index 051f06692c..e16da68dec 100644 +--- a/libavcodec/h264_ps.c ++++ b/libavcodec/h264_ps.c +@@ -351,6 +351,10 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx, + } + memcpy(sps->data, gb->buffer, sps->data_size); + ++ // Re-add the removed stop bit (may be used by hwaccels). ++ if (!(gb->size_in_bits & 7) && sps->data_size < sizeof(sps->data)) ++ sps->data[sps->data_size++] = 0x80; ++ + profile_idc = get_bits(gb, 8); + constraint_set_flags |= get_bits1(gb) << 0; // constraint_set0_flag + constraint_set_flags |= get_bits1(gb) << 1; // constraint_set1_flag +@@ -775,6 +779,10 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct + } + memcpy(pps->data, gb->buffer, pps->data_size); + ++ // Re-add the removed stop bit (may be used by hwaccels). ++ if (!(bit_length & 7) && pps->data_size < sizeof(pps->data)) ++ pps->data[pps->data_size++] = 0x80; ++ + pps->sps_id = get_ue_golomb_31(gb); + if ((unsigned)pps->sps_id >= MAX_SPS_COUNT || + !ps->sps_list[pps->sps_id]) { +-- +2.20.1 + diff --git a/adm/vcpkg/ports/ffmpeg/0023-fix-qsv-init.patch b/adm/vcpkg/ports/ffmpeg/0023-fix-qsv-init.patch new file mode 100644 index 0000000000..e6d2863404 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/0023-fix-qsv-init.patch @@ -0,0 +1,22 @@ +Subject: [PATCH] fix d3d11 +--- +Index: qsv.c +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c +--- a/libavcodec/qsv.c ++++ b/libavcodec/qsv.c +@@ -383,7 +383,11 @@ + int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs, + const char *load_plugins, int gpu_copy) + { ++#if CONFIG_D3D11VA ++ mfxIMPL impl = MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11; ++#else + mfxIMPL impl = MFX_IMPL_AUTO_ANY; ++#endif + mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } }; + mfxInitParam init_par = { MFX_IMPL_AUTO_ANY }; + diff --git a/adm/vcpkg/ports/ffmpeg/FindFFMPEG.cmake.in b/adm/vcpkg/ports/ffmpeg/FindFFMPEG.cmake.in new file mode 100644 index 0000000000..0c98b65588 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/FindFFMPEG.cmake.in @@ -0,0 +1,165 @@ +# Distributed under the OSI-approved BSD 3-Clause License. +# +#.rst: +# FindFFMPEG +# -------- +# +# Find the FFPMEG libraries +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# The following variables will be defined: +# +# ``FFMPEG_FOUND`` +# True if FFMPEG found on the local system +# +# ``FFMPEG_INCLUDE_DIRS`` +# Location of FFMPEG header files +# +# ``FFMPEG_LIBRARY_DIRS`` +# Location of FFMPEG libraries +# +# ``FFMPEG_LIBRARIES`` +# List of the FFMPEG libraries found +# +# + +include(FindPackageHandleStandardArgs) +include(SelectLibraryConfigurations) +include(CMakeFindDependencyMacro) + +if(NOT FFMPEG_FOUND) + +# Compute the installation path relative to this file. +get_filename_component(SEARCH_PATH "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(SEARCH_PATH "${SEARCH_PATH}" PATH) +get_filename_component(SEARCH_PATH "${SEARCH_PATH}" PATH) +if(SEARCH_PATH STREQUAL "/") + set(SEARCH_PATH "") +endif() + +set(FFMPEG_VERSION "@FFMPEG_VERSION@") + +function(append_dependencies out) + cmake_parse_arguments(PARSE_ARGV 1 "arg" "DEBUG" "NAMES" "") + if(${arg_DEBUG}) + set(config DEBUG) + set(path "${CURRENT_INSTALLED_DIR}/debug/lib/") + else() + set(config RELEASE) + set(path "${CURRENT_INSTALLED_DIR}/lib/") + endif() + foreach(lib_name ${arg_NAMES}) + if("${lib_name}" STREQUAL "-pthread") + list(APPEND ${out} "-pthread") + elseif("${lib_name}" STREQUAL "-pthreads") + list(APPEND ${out} "-pthreads") + elseif("${lib_name}" STREQUAL "gcc") + list(APPEND ${out} "-lgcc") + elseif("${lib_name}" STREQUAL "gcc_s") + list(APPEND ${out} "-lgcc_s") + elseif("${lib_name}" STREQUAL "stdc++") + list(APPEND ${out} "-lstdc++") + else() + # first look in ${path} specifically to ensure we find the right release/debug variant + find_library(FFMPEG_DEPENDENCY_${lib_name}_${config} NAMES "${lib_name}" PATHS "${path}" NO_DEFAULT_PATH) + # if not found there, must be a system dependency, so look elsewhere + find_library(FFMPEG_DEPENDENCY_${lib_name}_${config} NAMES "${lib_name}" REQUIRED) + list(APPEND ${out} "${FFMPEG_DEPENDENCY_${lib_name}_${config}}") + endif() + endforeach() + set("${out}" "${${out}}" PARENT_SCOPE) +endfunction() + +macro(FFMPEG_FIND varname shortname headername) + if(NOT FFMPEG_${varname}_INCLUDE_DIRS) + find_path(FFMPEG_${varname}_INCLUDE_DIRS NAMES lib${shortname}/${headername} ${headername} PATHS ${SEARCH_PATH}/include NO_DEFAULT_PATH) + endif() + if(NOT FFMPEG_${varname}_LIBRARY) + find_library(FFMPEG_${varname}_LIBRARY_RELEASE NAMES ${shortname} PATHS ${SEARCH_PATH}/lib/ NO_DEFAULT_PATH) + find_library(FFMPEG_${varname}_LIBRARY_DEBUG NAMES ${shortname}d ${shortname} PATHS ${SEARCH_PATH}/debug/lib/ NO_DEFAULT_PATH) + get_filename_component(FFMPEG_${varname}_LIBRARY_RELEASE_DIR ${FFMPEG_${varname}_LIBRARY_RELEASE} DIRECTORY) + get_filename_component(FFMPEG_${varname}_LIBRARY_DEBUG_DIR ${FFMPEG_${varname}_LIBRARY_DEBUG} DIRECTORY) + select_library_configurations(FFMPEG_${varname}) + set(FFMPEG_${varname}_LIBRARY ${FFMPEG_${varname}_LIBRARY} CACHE STRING "") + endif() + if (FFMPEG_${varname}_LIBRARY AND FFMPEG_${varname}_INCLUDE_DIRS) + set(FFMPEG_${varname}_FOUND TRUE BOOL) + list(APPEND FFMPEG_INCLUDE_DIRS ${FFMPEG_${varname}_INCLUDE_DIRS}) + list(APPEND FFMPEG_LIBRARIES ${FFMPEG_${varname}_LIBRARY}) + list(APPEND FFMPEG_LIBRARY_DIRS ${FFMPEG_${varname}_LIBRARY_RELEASE_DIR} ${FFMPEG_${varname}_LIBRARY_DEBUG_DIR}) + endif() +endmacro(FFMPEG_FIND) + +if(@ENABLE_AVDEVICE@) + FFMPEG_FIND(libavdevice avdevice avdevice.h) +endif() +if(@ENABLE_AVFILTER@) + FFMPEG_FIND(libavfilter avfilter avfilter.h) +endif() +if(@ENABLE_AVFORMAT@) + FFMPEG_FIND(libavformat avformat avformat.h) +endif() +if(@ENABLE_AVCODEC@) + FFMPEG_FIND(libavcodec avcodec avcodec.h) +endif() +if(@ENABLE_AVRESAMPLE@) + FFMPEG_FIND(libavresample avresample avresample.h) +endif() +if(@ENABLE_POSTPROC@) + FFMPEG_FIND(libpostproc postproc postprocess.h) +endif() +if(@ENABLE_SWRESAMPLE@) + FFMPEG_FIND(libswresample swresample swresample.h) +endif() +if(@ENABLE_SWSCALE@) + FFMPEG_FIND(libswscale swscale swscale.h) +endif() +FFMPEG_FIND(libavutil avutil avutil.h) + +if (FFMPEG_libavutil_FOUND) + list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS) + list(REMOVE_DUPLICATES FFMPEG_LIBRARY_DIRS) + set(FFMPEG_libavutil_VERSION "@LIBAVUTIL_VERSION@" CACHE STRING "") + + if(FFMPEG_libavcodec_FOUND) + set(FFMPEG_libavcodec_VERSION "@LIBAVCODEC_VERSION@" CACHE STRING "") + endif() + if(FFMPEG_libavdevice_FOUND) + set(FFMPEG_libavdevice_VERSION "@LIBAVDEVICE_VERSION@" CACHE STRING "") + endif() + if(FFMPEG_libavfilter_FOUND) + set(FFMPEG_libavfilter_VERSION "@LIBAVFILTER_VERSION@" CACHE STRING "") + endif() + if(FFMPEG_libavformat_FOUND) + set(FFMPEG_libavformat_VERSION "@LIBAVFORMAT_VERSION@" CACHE STRING "") + endif() + if(FFMPEG_libavresample_FOUND) + set(FFMPEG_libavresample_VERSION "@LIBAVRESAMPLE_VERSION@" CACHE STRING "") + endif() + if(FFMPEG_libswresample_FOUND) + set(FFMPEG_libswresample_VERSION "@LIBSWRESAMPLE_VERSION@" CACHE STRING "") + endif() + if(FFMPEG_libswscale_FOUND) + set(FFMPEG_libswscale_VERSION "@LIBSWSCALE_VERSION@" CACHE STRING "") + endif() + + append_dependencies(FFMPEG_DEPS_LIBRARY_RELEASE NAMES "@FFMPEG_DEPENDENCIES_RELEASE@") + append_dependencies(FFMPEG_DEPS_LIBRARY_DEBUG NAMES "@FFMPEG_DEPENDENCIES_DEBUG@" DEBUG) + if(FFMPEG_DEPS_LIBRARY_RELEASE OR FFMPEG_DEPS_LIBRARY_DEBUG) + select_library_configurations(FFMPEG_DEPS) + list(APPEND FFMPEG_LIBRARIES ${FFMPEG_DEPS_LIBRARY}) + endif() + + set(FFMPEG_LIBRARY ${FFMPEG_LIBRARIES}) + + set(FFMPEG_FOUND TRUE CACHE BOOL "") + set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} CACHE STRING "") + set(FFMPEG_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS} CACHE STRING "") + set(FFMPEG_LIBRARY_DIRS ${FFMPEG_LIBRARY_DIRS} CACHE STRING "") +endif() + +find_package_handle_standard_args(FFMPEG REQUIRED_VARS FFMPEG_LIBRARIES FFMPEG_LIBRARY_DIRS FFMPEG_INCLUDE_DIRS) + +endif() diff --git a/adm/vcpkg/ports/ffmpeg/build.sh.in b/adm/vcpkg/ports/ffmpeg/build.sh.in new file mode 100644 index 0000000000..c6f94fa87d --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/build.sh.in @@ -0,0 +1,126 @@ +#!/bin/sh + +set -e + +export PATH="/usr/bin:$PATH" + +command -v cygpath >/dev/null && have_cygpath=1 + +cygpath() { + if [ -n "$have_cygpath" ]; then + command cygpath "$@" + else + eval _p='$'$# + printf '%s\n' "$_p" + fi +} + +move_binary() { + SOURCE=$1 + TARGET=$2 + BINARY=$3 + + # run lipo over the command to check whether it really + # is a binary that we need to merge architectures + lipo $SOURCE/$BINARY -info &> /dev/null || return 0 + + # get the directory name the file is in + DIRNAME=$(dirname $BINARY) + + # ensure the directory to move the binary to exists + mkdir -p $TARGET/$DIRNAME + + # now finally move the binary + mv $SOURCE/$BINARY $TARGET/$BINARY +} + +move_binaries() { + SOURCE=$1 + TARGET=$2 + + [ ! -d $SOURCE ] && return 0 + pushd $SOURCE + + for BINARY in $(find . -type f); do + move_binary $SOURCE $TARGET $BINARY + done + + popd +} + +merge_binaries() { + TARGET=$1 + SOURCE=$2 + + shift + shift + + pushd $SOURCE/$1 + BINARIES=$(find . -type f) + popd + + for BINARY in $BINARIES; do + COMMAND="lipo -create -output $TARGET/$BINARY" + + for ARCH in $@; do + COMMAND="$COMMAND -arch $ARCH $SOURCE/$ARCH/$BINARY" + done + + $($COMMAND) + done +} + +export PKG_CONFIG_PATH="$(cygpath -p "${PKG_CONFIG_PATH}")" + +# Export HTTP(S)_PROXY as http(s)_proxy: +[ -n "$HTTP_PROXY" ] && export http_proxy="$HTTP_PROXY" +[ -n "$HTTPS_PROXY" ] && export https_proxy="$HTTPS_PROXY" + +PATH_TO_BUILD_DIR=$( cygpath "@BUILD_DIR@") +PATH_TO_SRC_DIR=$( cygpath "@SOURCE_PATH@") +PATH_TO_PACKAGE_DIR=$(cygpath "@INST_PREFIX@") + +JOBS=@VCPKG_CONCURRENCY@ + +OSX_ARCHS="@OSX_ARCHS@" +OSX_ARCH_COUNT=0@OSX_ARCH_COUNT@ + +# Default to hardware concurrency if unset. +: ${JOBS:=$(nproc)} + +build_ffmpeg() { + echo "=== CONFIGURING ===" + + sh "$PATH_TO_SRC_DIR/configure" "--prefix=$PATH_TO_PACKAGE_DIR" "--cc=$CC" @CONFIGURE_OPTIONS@ $@ + + echo "=== BUILDING ===" + + make -j${JOBS} V=1 + + echo "=== INSTALLING ===" + + make install +} + +cd "$PATH_TO_BUILD_DIR" + +if [ $OSX_ARCH_COUNT -gt 1 ]; then + for ARCH in $OSX_ARCHS; do + echo "=== CLEANING FOR $ARCH ===" + + make clean && make distclean + + build_ffmpeg --enable-cross-compile --arch=$ARCH --extra-cflags=-arch --extra-cflags=$ARCH --extra-ldflags=-arch --extra-ldflags=$ARCH + + echo "=== COLLECTING BINARIES FOR $ARCH ===" + + move_binaries $PATH_TO_PACKAGE_DIR/lib $PATH_TO_BUILD_DIR/stage/$ARCH/lib + move_binaries $PATH_TO_PACKAGE_DIR/bin $PATH_TO_BUILD_DIR/stage/$ARCH/bin + done + + echo "=== MERGING ARCHITECTURES ===" + + merge_binaries $PATH_TO_PACKAGE_DIR $PATH_TO_BUILD_DIR/stage $OSX_ARCHS +else + build_ffmpeg +fi diff --git a/adm/vcpkg/ports/ffmpeg/portfile.cmake b/adm/vcpkg/ports/ffmpeg/portfile.cmake new file mode 100644 index 0000000000..69856e08ee --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/portfile.cmake @@ -0,0 +1,826 @@ +if(VCPKG_TARGET_IS_WINDOWS) + set(PATCHES 0017-Patch-for-ticket-9019-CUDA-Compile-Broken-Using-MSVC.patch) # https://trac.ffmpeg.org/ticket/9019 +endif() +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO ffmpeg/ffmpeg + REF n4.4.5 + SHA512 09338a10b31f0e551735b9aa57e2c22ceae15bbbca1ee04535587ff55f181e187a77ede4e70d8cd0e1e7c85fb27a7e513c93b91848013e997263d58780b8fa49 + HEAD_REF master + PATCHES + 0001-create-lib-libraries.patch + 0003-fix-windowsinclude.patch + 0004-fix-debug-build.patch + 0006-fix-StaticFeatures.patch + 0007-fix-lib-naming.patch + 0009-Fix-fdk-detection.patch + 0010-Fix-x264-detection.patch + 0011-Fix-x265-detection.patch + #0012-Fix-ssl-110-detection.patch + 0013-define-WINVER.patch + 0014-avfilter-dependency-fix.patch # https://ffmpeg.org/pipermail/ffmpeg-devel/2021-February/275819.html + 0015-Fix-xml2-detection.patch + ${PATCHES} + 0018-libaom-Dont-use-aom_codec_av1_dx_algo.patch + 0019-libx264-Do-not-explicitly-set-X264_API_IMPORTS.patch + 0020-fix-aarch64-libswscale.patch + 0022-fix-m1-hardware-decode-nal-bits.patch # remove in next version + 0023-fix-qsv-init.patch # remove in next version (5.x) +) + +if (SOURCE_PATH MATCHES " ") + message(FATAL_ERROR "Error: ffmpeg will not build with spaces in the path. Please use a directory with no spaces") +endif() + + +if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") + # ffmpeg nasm build gives link error on x86, so fall back to yasm + vcpkg_find_acquire_program(YASM) + get_filename_component(YASM_EXE_PATH "${YASM}" DIRECTORY) + vcpkg_add_to_path("${YASM_EXE_PATH}") +else() + vcpkg_find_acquire_program(NASM) + get_filename_component(NASM_EXE_PATH "${NASM}" DIRECTORY) + vcpkg_add_to_path("${NASM_EXE_PATH}") +endif() + +if(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW) + #We're assuming that if we're building for Windows we're using MSVC + set(INCLUDE_VAR "INCLUDE") + set(LIB_PATH_VAR "LIB") +else() + set(INCLUDE_VAR "CPATH") + set(LIB_PATH_VAR "LIBRARY_PATH") +endif() + +set(OPTIONS "--enable-pic --disable-doc --enable-debug --enable-runtime-cpudetect") + +if(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm") + set(OPTIONS "${OPTIONS} --disable-asm --disable-x86asm") +endif() +if(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64") + set(OPTIONS "${OPTIONS} --enable-asm --disable-x86asm") +endif() +if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86" OR VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + set(OPTIONS "${OPTIONS} --enable-asm --enable-x86asm") +endif() + +if(VCPKG_TARGET_IS_WINDOWS) + vcpkg_acquire_msys(MSYS_ROOT) + set(SHELL "${MSYS_ROOT}/usr/bin/bash.exe") +else() + set(SHELL /bin/sh) +endif() + +if(VCPKG_TARGET_IS_MINGW) + if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") + string(APPEND OPTIONS " --target-os=mingw32") + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + string(APPEND OPTIONS " --target-os=mingw64") + endif() +elseif(VCPKG_TARGET_IS_LINUX) + string(APPEND OPTIONS " --target-os=linux") +elseif(VCPKG_TARGET_IS_WINDOWS) + string(APPEND OPTIONS " --target-os=win32") +elseif(VCPKG_TARGET_IS_OSX) + string(APPEND OPTIONS " --target-os=darwin") +elseif(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "Android") + string(APPEND OPTIONS " --target-os=android") +else() +endif() + +vcpkg_cmake_get_vars(cmake_vars_file) +include("${cmake_vars_file}") + +if(VCPKG_DETECTED_MSVC) + set(OPTIONS "--toolchain=msvc ${OPTIONS}") + # This is required because ffmpeg depends upon optimizations to link correctly + string(APPEND VCPKG_COMBINED_C_FLAGS_DEBUG " -O2") + string(REGEX REPLACE "(^| )-RTC1( |$)" " " VCPKG_COMBINED_C_FLAGS_DEBUG "${VCPKG_COMBINED_C_FLAGS_DEBUG}") + string(REGEX REPLACE "(^| )-Od( |$)" " " VCPKG_COMBINED_C_FLAGS_DEBUG "${VCPKG_COMBINED_C_FLAGS_DEBUG}") + string(REGEX REPLACE "(^| )-Ob0( |$)" " " VCPKG_COMBINED_C_FLAGS_DEBUG "${VCPKG_COMBINED_C_FLAGS_DEBUG}") +endif() + +string(APPEND VCPKG_COMBINED_C_FLAGS_DEBUG " -I \"${CURRENT_INSTALLED_DIR}/include\"") +string(APPEND VCPKG_COMBINED_C_FLAGS_RELEASE " -I \"${CURRENT_INSTALLED_DIR}/include\"") + +set(_csc_PROJECT_PATH ffmpeg) + +file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel) + +set(FFMPEG_PKGCONFIG_MODULES libavutil) + +if("nonfree" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-nonfree") +endif() + +if("gpl" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-gpl") +endif() + +if("version3" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-version3") +endif() + +if("amf" IN_LIST FEATURES) + # Do nothing +else() + set(OPTIONS "${OPTIONS} --disable-amf") +endif() + +if("ffmpeg" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-ffmpeg") +else() + set(OPTIONS "${OPTIONS} --disable-ffmpeg") +endif() + +if("ffplay" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-ffplay") +else() + set(OPTIONS "${OPTIONS} --disable-ffplay") +endif() + +if("ffprobe" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-ffprobe") +else() + set(OPTIONS "${OPTIONS} --disable-ffprobe") +endif() + +if (NOT "alsa" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --disable-alsa") +endif() + +if("avcodec" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-avcodec") + set(ENABLE_AVCODEC ON) + list(APPEND FFMPEG_PKGCONFIG_MODULES libavcodec) +else() + set(OPTIONS "${OPTIONS} --disable-avcodec") + set(ENABLE_AVCODEC OFF) +endif() + +if("avdevice" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-avdevice") + set(ENABLE_AVDEVICE ON) + list(APPEND FFMPEG_PKGCONFIG_MODULES libavdevice) +else() + set(OPTIONS "${OPTIONS} --disable-avdevice") + set(ENABLE_AVDEVICE OFF) +endif() + +if("avformat" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-avformat") + set(ENABLE_AVFORMAT ON) + list(APPEND FFMPEG_PKGCONFIG_MODULES libavformat) +else() + set(OPTIONS "${OPTIONS} --disable-avformat") + set(ENABLE_AVFORMAT OFF) +endif() + +if("avfilter" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-avfilter") + set(ENABLE_AVFILTER ON) + list(APPEND FFMPEG_PKGCONFIG_MODULES libavfilter) +else() + set(OPTIONS "${OPTIONS} --disable-avfilter") + set(ENABLE_AVFILTER OFF) +endif() + +if("postproc" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-postproc") + set(ENABLE_POSTPROC ON) + list(APPEND FFMPEG_PKGCONFIG_MODULES libpostproc) +else() + set(OPTIONS "${OPTIONS} --disable-postproc") + set(ENABLE_POSTPROC OFF) +endif() + +if("swresample" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-swresample") + set(ENABLE_SWRESAMPLE ON) + list(APPEND FFMPEG_PKGCONFIG_MODULES libswresample) +else() + set(OPTIONS "${OPTIONS} --disable-swresample") + set(ENABLE_SWRESAMPLE OFF) +endif() + +if("swscale" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-swscale") + set(ENABLE_SWSCALE ON) + list(APPEND FFMPEG_PKGCONFIG_MODULES libswscale) +else() + set(OPTIONS "${OPTIONS} --disable-swscale") + set(ENABLE_SWSCALE OFF) +endif() + +set(ENABLE_AVRESAMPLE OFF) +if("avresample" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-avresample") + set(ENABLE_AVRESAMPLE ON) + list(APPEND FFMPEG_PKGCONFIG_MODULES libavresample) +endif() + +set(STATIC_LINKAGE OFF) +if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") + set(STATIC_LINKAGE ON) +endif() + +if("aom" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libaom") +else() + set(OPTIONS "${OPTIONS} --disable-libaom") +endif() + +if("ass" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libass") +else() + set(OPTIONS "${OPTIONS} --disable-libass") +endif() + +if("avisynthplus" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-avisynth") +else() + set(OPTIONS "${OPTIONS} --disable-avisynth") +endif() + +if("bzip2" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-bzlib") +else() + set(OPTIONS "${OPTIONS} --disable-bzlib") +endif() + +if("dav1d" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libdav1d") +else() + set(OPTIONS "${OPTIONS} --disable-libdav1d") +endif() + +if("fdk-aac" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libfdk-aac") +else() + set(OPTIONS "${OPTIONS} --disable-libfdk-aac") +endif() + +if("fontconfig" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libfontconfig") +else() + set(OPTIONS "${OPTIONS} --disable-libfontconfig") +endif() + +if("freetype" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libfreetype") +else() + set(OPTIONS "${OPTIONS} --disable-libfreetype") +endif() + +if("fribidi" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libfribidi") +else() + set(OPTIONS "${OPTIONS} --disable-libfribidi") +endif() + +if("iconv" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-iconv") +else() + set(OPTIONS "${OPTIONS} --disable-iconv") +endif() + +if("ilbc" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libilbc") +else() + set(OPTIONS "${OPTIONS} --disable-libilbc") +endif() + +if("lzma" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-lzma") +else() + set(OPTIONS "${OPTIONS} --disable-lzma") +endif() + +if("mp3lame" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libmp3lame") +else() + set(OPTIONS "${OPTIONS} --disable-libmp3lame") +endif() + +if("modplug" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libmodplug") +else() + set(OPTIONS "${OPTIONS} --disable-libmodplug") +endif() + +if("nvcodec" IN_LIST FEATURES) + #Note: the --enable-cuda option does not actually require the cuda sdk or toolset port dependency as ffmpeg uses runtime detection and dynamic loading + set(OPTIONS "${OPTIONS} --enable-cuda --enable-nvenc --enable-nvdec --enable-cuvid --enable-ffnvcodec") +else() + set(OPTIONS "${OPTIONS} --disable-cuda --disable-nvenc --disable-nvdec --disable-cuvid --disable-ffnvcodec") +endif() + +if("opencl" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-opencl") +else() + set(OPTIONS "${OPTIONS} --disable-opencl") +endif() + +if("opengl" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-opengl") +else() + set(OPTIONS "${OPTIONS} --disable-opengl") +endif() + +if("openh264" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libopenh264") +else() + set(OPTIONS "${OPTIONS} --disable-libopenh264") +endif() + +if("openjpeg" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libopenjpeg") +else() + set(OPTIONS "${OPTIONS} --disable-libopenjpeg") +endif() + +if("openmpt" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libopenmpt") +else() + set(OPTIONS "${OPTIONS} --disable-libopenmpt") +endif() + +if("openssl" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-openssl") +else() + set(OPTIONS "${OPTIONS} --disable-openssl") +endif() + +if("opus" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libopus") +else() + set(OPTIONS "${OPTIONS} --disable-libopus") +endif() + +if("sdl2" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-sdl2") +else() + set(OPTIONS "${OPTIONS} --disable-sdl2") +endif() + +if("snappy" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libsnappy") +else() + set(OPTIONS "${OPTIONS} --disable-libsnappy") +endif() + +if("soxr" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libsoxr") +else() + set(OPTIONS "${OPTIONS} --disable-libsoxr") +endif() + +if("speex" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libspeex") +else() + set(OPTIONS "${OPTIONS} --disable-libspeex") +endif() + +if("ssh" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libssh") +else() + set(OPTIONS "${OPTIONS} --disable-libssh") +endif() + +if("tensorflow" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libtensorflow") +else() + set(OPTIONS "${OPTIONS} --disable-libtensorflow") +endif() + +if("tesseract" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libtesseract") +else() + set(OPTIONS "${OPTIONS} --disable-libtesseract") +endif() + +if("theora" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libtheora") +else() + set(OPTIONS "${OPTIONS} --disable-libtheora") +endif() + +if("vorbis" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libvorbis") +else() + set(OPTIONS "${OPTIONS} --disable-libvorbis") +endif() + +if("vpx" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libvpx") +else() + set(OPTIONS "${OPTIONS} --disable-libvpx") +endif() + +if("webp" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libwebp") +else() + set(OPTIONS "${OPTIONS} --disable-libwebp") +endif() + +if("x264" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libx264") +else() + set(OPTIONS "${OPTIONS} --disable-libx264") +endif() + +if("x265" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libx265") +else() + set(OPTIONS "${OPTIONS} --disable-libx265") +endif() + +if("xml2" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libxml2") +else() + set(OPTIONS "${OPTIONS} --disable-libxml2") +endif() + +if("zlib" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-zlib") +else() + set(OPTIONS "${OPTIONS} --disable-zlib") +endif() + +if ("srt" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libsrt") +else() + set(OPTIONS "${OPTIONS} --disable-libsrt") +endif() + +if ("qsv" IN_LIST FEATURES) + set(OPTIONS "${OPTIONS} --enable-libmfx --enable-encoder=h264_qsv --enable-decoder=h264_qsv") +endif() + +if (VCPKG_TARGET_IS_OSX) + set(OPTIONS "${OPTIONS} --disable-vdpau") # disable vdpau in OSX +endif() + +if(VCPKG_TARGET_IS_IOS) + set(OPTIONS "${OPTIONS} --disable-audiotoolbox") # disable AudioToolbox on iOS +endif() + +set(OPTIONS_CROSS " --enable-cross-compile") + +# ffmpeg needs --cross-prefix option to use appropriate tools for cross-compiling. +if(VCPKG_DETECTED_CMAKE_C_COMPILER MATCHES "([^\/]*-)gcc$") + string(APPEND OPTIONS_CROSS " --cross-prefix=${CMAKE_MATCH_1}") +endif() + +if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + string(APPEND OPTIONS_CROSS " --arch=x86_64") +else() + string(APPEND OPTIONS_CROSS " --arch=${VCPKG_TARGET_ARCHITECTURE}") +endif() + +if (VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" OR VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64") + if(VCPKG_TARGET_IS_WINDOWS) + vcpkg_find_acquire_program(GASPREPROCESSOR) + foreach(GAS_PATH ${GASPREPROCESSOR}) + get_filename_component(GAS_ITEM_PATH ${GAS_PATH} DIRECTORY) + set(ENV{PATH} "$ENV{PATH}${VCPKG_HOST_PATH_SEPARATOR}${GAS_ITEM_PATH}") + endforeach(GAS_PATH) + endif() +endif() + +if(VCPKG_TARGET_IS_UWP) + set(ENV{LIBPATH} "$ENV{LIBPATH};$ENV{_WKITS10}references\\windows.foundation.foundationcontract\\2.0.0.0\\;$ENV{_WKITS10}references\\windows.foundation.universalapicontract\\3.0.0.0\\") + string(APPEND OPTIONS " --disable-programs") + string(APPEND OPTIONS " --extra-cflags=-DWINAPI_FAMILY=WINAPI_FAMILY_APP --extra-cflags=-D_WIN32_WINNT=0x0A00") + string(APPEND OPTIONS " --extra-ldflags=-APPCONTAINER --extra-ldflags=WindowsApp.lib") +endif() + +# Note: --disable-optimizations can't be used due to https://ffmpeg.org/pipermail/libav-user/2013-March/003945.html +set(OPTIONS_DEBUG "--debug") +set(OPTIONS_RELEASE "") + +set(OPTIONS "${OPTIONS} ${OPTIONS_CROSS}") + +if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") + set(OPTIONS "${OPTIONS} --disable-static --enable-shared") +endif() + +if(VCPKG_TARGET_IS_MINGW) + set(OPTIONS "${OPTIONS} --extra_cflags=-D_WIN32_WINNT=0x0601") +elseif(VCPKG_TARGET_IS_WINDOWS) + set(OPTIONS "${OPTIONS} --extra-cflags=-DHAVE_UNISTD_H=0") +endif() + +if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") + set(OPTIONS "${OPTIONS} --pkg-config-flags=--static") +endif() + +set(ENV_LIB_PATH "$ENV{${LIB_PATH_VAR}}") + +get_filename_component(CC_path "${VCPKG_DETECTED_CMAKE_C_COMPILER}" DIRECTORY) +get_filename_component(CC_filename "${VCPKG_DETECTED_CMAKE_C_COMPILER}" NAME) +set(ENV{CC} "${CC_filename}") +if(CC_path) + vcpkg_add_to_path(PREPEND "${CC_path}") +endif() + +message(STATUS "Building Options: ${OPTIONS}") + +# Release build +if (NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") + message(STATUS "Building Release Options: ${OPTIONS_RELEASE}") + set(ENV{${LIB_PATH_VAR}} "${CURRENT_INSTALLED_DIR}/lib${VCPKG_HOST_PATH_SEPARATOR}${ENV_LIB_PATH}") + set(ENV{PKG_CONFIG_PATH} "${CURRENT_INSTALLED_DIR}/lib/pkgconfig") + message(STATUS "Building ${_csc_PROJECT_PATH} for Release") + file(MAKE_DIRECTORY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel") + # We use response files here as the only known way to handle spaces in paths + set(crsp "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/cflags.rsp") + file(WRITE "${crsp}" "${VCPKG_COMBINED_C_FLAGS_RELEASE}") + set(ldrsp "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/ldflags.rsp") + file(WRITE "${ldrsp}" "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_RELEASE}") + set(ENV{CFLAGS} "@${crsp}") + # All tools except the msvc arm{,64} assembler accept @... as response file syntax. + # For that assembler, there is no known way to pass in flags. We must hope that not passing flags will work acceptably. + if(NOT VCPKG_DETECTED_MSVC OR NOT VCPKG_TARGET_ARCHITECTURE MATCHES "^arm") + set(ENV{ASFLAGS} "@${crsp}") + endif() + set(ENV{LDFLAGS} "@${ldrsp}") + + set(BUILD_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel") + set(CONFIGURE_OPTIONS "${OPTIONS} ${OPTIONS_RELEASE}") + set(INST_PREFIX "${CURRENT_PACKAGES_DIR}") + + configure_file("${CMAKE_CURRENT_LIST_DIR}/build.sh.in" "${BUILD_DIR}/build.sh" @ONLY) + + vcpkg_execute_required_process( + COMMAND "${SHELL}" ./build.sh + WORKING_DIRECTORY "${BUILD_DIR}" + LOGNAME "build-${TARGET_TRIPLET}-rel" + ) +endif() + +# Debug build +if (NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") + message(STATUS "Building Debug Options: ${OPTIONS_DEBUG}") + set(ENV{${LIB_PATH_VAR}} "${CURRENT_INSTALLED_DIR}/debug/lib${VCPKG_HOST_PATH_SEPARATOR}${ENV_LIB_PATH}") + set(ENV{LDFLAGS} "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_DEBUG}") + set(ENV{PKG_CONFIG_PATH} "${CURRENT_INSTALLED_DIR}/debug/lib/pkgconfig") + message(STATUS "Building ${_csc_PROJECT_PATH} for Debug") + file(MAKE_DIRECTORY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg") + set(crsp "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/cflags.rsp") + file(WRITE "${crsp}" "${VCPKG_COMBINED_C_FLAGS_DEBUG}") + set(ldrsp "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/ldflags.rsp") + file(WRITE "${ldrsp}" "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_DEBUG}") + set(ENV{CFLAGS} "@${crsp}") + if(NOT VCPKG_DETECTED_MSVC OR NOT VCPKG_TARGET_ARCHITECTURE MATCHES "^arm") + set(ENV{ASFLAGS} "@${crsp}") + endif() + set(ENV{LDFLAGS} "@${ldrsp}") + + set(BUILD_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg") + set(CONFIGURE_OPTIONS "${OPTIONS} ${OPTIONS_DEBUG}") + set(INST_PREFIX "${CURRENT_PACKAGES_DIR}/debug") + + configure_file("${CMAKE_CURRENT_LIST_DIR}/build.sh.in" "${BUILD_DIR}/build.sh" @ONLY) + + vcpkg_execute_required_process( + COMMAND "${SHELL}" ./build.sh + WORKING_DIRECTORY "${BUILD_DIR}" + LOGNAME "build-${TARGET_TRIPLET}-dbg" + ) +endif() + +if(VCPKG_TARGET_IS_WINDOWS) + file(GLOB DEF_FILES "${CURRENT_PACKAGES_DIR}/lib/*.def" "${CURRENT_PACKAGES_DIR}/debug/lib/*.def") + + if(NOT VCPKG_TARGET_IS_MINGW) + if(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm") + set(LIB_MACHINE_ARG /machine:ARM) + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64") + set(LIB_MACHINE_ARG /machine:ARM64) + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") + set(LIB_MACHINE_ARG /machine:x86) + elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") + set(LIB_MACHINE_ARG /machine:x64) + else() + message(FATAL_ERROR "Unsupported target architecture") + endif() + + foreach(DEF_FILE ${DEF_FILES}) + get_filename_component(DEF_FILE_DIR "${DEF_FILE}" DIRECTORY) + get_filename_component(DEF_FILE_NAME "${DEF_FILE}" NAME) + string(REGEX REPLACE "-[0-9]*\\.def" "${VCPKG_TARGET_STATIC_LIBRARY_SUFFIX}" OUT_FILE_NAME "${DEF_FILE_NAME}") + file(TO_NATIVE_PATH "${DEF_FILE}" DEF_FILE_NATIVE) + file(TO_NATIVE_PATH "${DEF_FILE_DIR}/${OUT_FILE_NAME}" OUT_FILE_NATIVE) + message(STATUS "Generating ${OUT_FILE_NATIVE}") + vcpkg_execute_required_process( + COMMAND lib.exe "/def:${DEF_FILE_NATIVE}" "/out:${OUT_FILE_NATIVE}" ${LIB_MACHINE_ARG} + WORKING_DIRECTORY "${CURRENT_PACKAGES_DIR}" + LOGNAME "libconvert-${TARGET_TRIPLET}" + ) + endforeach() + endif() + + file(GLOB EXP_FILES "${CURRENT_PACKAGES_DIR}/lib/*.exp" "${CURRENT_PACKAGES_DIR}/debug/lib/*.exp") + file(GLOB LIB_FILES "${CURRENT_PACKAGES_DIR}/bin/*${VCPKG_TARGET_STATIC_LIBRARY_SUFFIX}" "${CURRENT_PACKAGES_DIR}/debug/bin/*${VCPKG_TARGET_STATIC_LIBRARY_SUFFIX}") + if(VCPKG_TARGET_IS_MINGW) + file(GLOB LIB_FILES_2 "${CURRENT_PACKAGES_DIR}/bin/*.lib" "${CURRENT_PACKAGES_DIR}/debug/bin/*.lib") + endif() + set(files_to_remove ${EXP_FILES} ${LIB_FILES} ${LIB_FILES_2} ${DEF_FILES}) + if(files_to_remove) + file(REMOVE ${files_to_remove}) + endif() +endif() + +if("ffmpeg" IN_LIST FEATURES) + vcpkg_copy_tools(TOOL_NAMES ffmpeg AUTO_CLEAN) +endif() +if("ffprobe" IN_LIST FEATURES) + vcpkg_copy_tools(TOOL_NAMES ffprobe AUTO_CLEAN) +endif() +if("ffplay" IN_LIST FEATURES) + vcpkg_copy_tools(TOOL_NAMES ffplay AUTO_CLEAN) +endif() + +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include" "${CURRENT_PACKAGES_DIR}/debug/share") + +if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") + file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/debug/bin") +endif() + +vcpkg_copy_pdbs() + +if (VCPKG_TARGET_IS_WINDOWS) + set(_dirs "/") + if(NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") + list(APPEND _dirs "/debug/") + endif() + foreach(_debug IN LISTS _dirs) + foreach(PKGCONFIG_MODULE IN LISTS FFMPEG_PKGCONFIG_MODULES) + set(PKGCONFIG_FILE "${CURRENT_PACKAGES_DIR}${_debug}lib/pkgconfig/${PKGCONFIG_MODULE}.pc") + # remove redundant cygwin style -libpath entries + execute_process( + COMMAND "${MSYS_ROOT}/usr/bin/cygpath.exe" -u "${CURRENT_INSTALLED_DIR}" + OUTPUT_VARIABLE CYG_INSTALLED_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + vcpkg_replace_string("${PKGCONFIG_FILE}" "-libpath:${CYG_INSTALLED_DIR}${_debug}lib/pkgconfig/../../lib " "") + # transform libdir, includedir, and prefix paths from cygwin style to windows style + file(READ "${PKGCONFIG_FILE}" PKGCONFIG_CONTENT) + foreach(PATH_NAME prefix libdir includedir) + string(REGEX MATCH "${PATH_NAME}=[^\n]*" PATH_VALUE "${PKGCONFIG_CONTENT}") + string(REPLACE "${PATH_NAME}=" "" PATH_VALUE "${PATH_VALUE}") + if(NOT PATH_VALUE) + message(FATAL_ERROR "failed to find pkgconfig variable ${PATH_NAME}") + endif() + execute_process( + COMMAND "${MSYS_ROOT}/usr/bin/cygpath.exe" -w "${PATH_VALUE}" + OUTPUT_VARIABLE FIXED_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + file(TO_CMAKE_PATH "${FIXED_PATH}" FIXED_PATH) + vcpkg_replace_string("${PKGCONFIG_FILE}" "${PATH_NAME}=${PATH_VALUE}" "${PATH_NAME}=${FIXED_PATH}") + endforeach() + # list libraries with -l flag (so pkgconf knows they are libraries and not just linker flags) + foreach(LIBS_ENTRY Libs Libs.private) + string(REGEX MATCH "${LIBS_ENTRY}: [^\n]*" LIBS_VALUE "${PKGCONFIG_CONTENT}") + if(NOT LIBS_VALUE) + message(FATAL_ERROR "failed to find pkgconfig entry ${LIBS_ENTRY}") + endif() + string(REPLACE "${LIBS_ENTRY}: " "" LIBS_VALUE "${LIBS_VALUE}") + if(LIBS_VALUE) + set(LIBS_VALUE_OLD "${LIBS_VALUE}") + string(REGEX REPLACE "([^ ]+)[.]lib" "-l\\1" LIBS_VALUE "${LIBS_VALUE}") + set(LIBS_VALUE_NEW "${LIBS_VALUE}") + vcpkg_replace_string("${PKGCONFIG_FILE}" "${LIBS_ENTRY}: ${LIBS_VALUE_OLD}" "${LIBS_ENTRY}: ${LIBS_VALUE_NEW}") + endif() + endforeach() + endforeach() + endforeach() +endif() + +vcpkg_fixup_pkgconfig() + +# Handle dependencies + +x_vcpkg_pkgconfig_get_modules(PREFIX FFMPEG_PKGCONFIG MODULES ${FFMPEG_PKGCONFIG_MODULES} LIBS) + +function(append_dependencies_from_libs out) + cmake_parse_arguments(PARSE_ARGV 1 "arg" "" "LIBS" "") + string(REGEX REPLACE "[ ]+" ";" contents "${arg_LIBS}") + list(FILTER contents EXCLUDE REGEX "^-framework$") + list(FILTER contents EXCLUDE REGEX "^-L.+") + list(FILTER contents EXCLUDE REGEX "^-libpath:.+") + list(TRANSFORM contents REPLACE "^-Wl,-framework," "-l") + list(FILTER contents EXCLUDE REGEX "^-Wl,.+") + list(TRANSFORM contents REPLACE "^-l" "") + list(FILTER contents EXCLUDE REGEX "^avresample$") + list(FILTER contents EXCLUDE REGEX "^avutil$") + list(FILTER contents EXCLUDE REGEX "^avcodec$") + list(FILTER contents EXCLUDE REGEX "^avdevice$") + list(FILTER contents EXCLUDE REGEX "^avfilter$") + list(FILTER contents EXCLUDE REGEX "^avformat$") + list(FILTER contents EXCLUDE REGEX "^postproc$") + list(FILTER contents EXCLUDE REGEX "^swresample$") + list(FILTER contents EXCLUDE REGEX "^swscale$") + list(FILTER contents EXCLUDE REGEX "^atomic$") + if(VCPKG_TARGET_IS_WINDOWS) + list(TRANSFORM contents TOLOWER) + endif() + if(contents) + list(APPEND "${out}" "${contents}") + set("${out}" "${${out}}" PARENT_SCOPE) + endif() +endfunction() + +append_dependencies_from_libs(FFMPEG_DEPENDENCIES_RELEASE LIBS "${FFMPEG_PKGCONFIG_LIBS_RELEASE}") +append_dependencies_from_libs(FFMPEG_DEPENDENCIES_DEBUG LIBS "${FFMPEG_PKGCONFIG_LIBS_DEBUG}") + +# must remove duplicates from the front to respect link order so reverse first +list(REVERSE FFMPEG_DEPENDENCIES_RELEASE) +list(REVERSE FFMPEG_DEPENDENCIES_DEBUG) +list(REMOVE_DUPLICATES FFMPEG_DEPENDENCIES_RELEASE) +list(REMOVE_DUPLICATES FFMPEG_DEPENDENCIES_DEBUG) +list(REVERSE FFMPEG_DEPENDENCIES_RELEASE) +list(REVERSE FFMPEG_DEPENDENCIES_DEBUG) + +message(STATUS "Dependencies (release): ${FFMPEG_DEPENDENCIES_RELEASE}") +message(STATUS "Dependencies (debug): ${FFMPEG_DEPENDENCIES_DEBUG}") + +# Handle version strings + +function(extract_regex_from_file out) + cmake_parse_arguments(PARSE_ARGV 1 "arg" "" "FILE;REGEX" "") + file(READ "${arg_FILE}" contents) + if (contents MATCHES "${arg_REGEX}") + if(NOT CMAKE_MATCH_COUNT EQUAL 1) + message(FATAL_ERROR "Could not identify match group in regular expression \"${arg_REGEX}\"") + endif() + else() + message(FATAL_ERROR "Could not find line matching \"${arg_REGEX}\" in file \"${arg_FILE}\"") + endif() + set("${out}" "${CMAKE_MATCH_1}" PARENT_SCOPE) +endfunction() + +function(extract_version_from_component out) + cmake_parse_arguments(PARSE_ARGV 1 "arg" "" "COMPONENT" "") + string(TOLOWER "${arg_COMPONENT}" component_lower) + string(TOUPPER "${arg_COMPONENT}" component_upper) + extract_regex_from_file(major_version + FILE "${SOURCE_PATH}/${component_lower}/version.h" + REGEX "#define ${component_upper}_VERSION_MAJOR[ ]+([0-9]+)" + ) + extract_regex_from_file(minor_version + FILE "${SOURCE_PATH}/${component_lower}/version.h" + REGEX "#define ${component_upper}_VERSION_MINOR[ ]+([0-9]+)" + ) + extract_regex_from_file(micro_version + FILE "${SOURCE_PATH}/${component_lower}/version.h" + REGEX "#define ${component_upper}_VERSION_MICRO[ ]+([0-9]+)" + ) + set("${out}" "${major_version}.${minor_version}.${micro_version}" PARENT_SCOPE) +endfunction() + +extract_regex_from_file(FFMPEG_VERSION + FILE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/libavutil/ffversion.h" + REGEX "#define FFMPEG_VERSION[ ]+\"(.+)\"" +) + +extract_version_from_component(LIBAVUTIL_VERSION + COMPONENT libavutil) +extract_version_from_component(LIBAVCODEC_VERSION + COMPONENT libavcodec) +extract_version_from_component(LIBAVDEVICE_VERSION + COMPONENT libavdevice) +extract_version_from_component(LIBAVFILTER_VERSION + COMPONENT libavfilter) +extract_version_from_component( LIBAVFORMAT_VERSION + COMPONENT libavformat) +extract_version_from_component(LIBAVRESAMPLE_VERSION + COMPONENT libavresample) +extract_version_from_component(LIBSWRESAMPLE_VERSION + COMPONENT libswresample) +extract_version_from_component(LIBSWSCALE_VERSION + COMPONENT libswscale) + +# Handle copyright +file(STRINGS "${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-out.log" LICENSE_STRING REGEX "License: .*" LIMIT_COUNT 1) +if(LICENSE_STRING STREQUAL "License: LGPL version 2.1 or later") + set(LICENSE_FILE "COPYING.LGPLv2.1") +elseif(LICENSE_STRING STREQUAL "License: LGPL version 3 or later") + set(LICENSE_FILE "COPYING.LGPLv3") +elseif(LICENSE_STRING STREQUAL "License: GPL version 2 or later") + set(LICENSE_FILE "COPYING.GPLv2") +elseif(LICENSE_STRING STREQUAL "License: GPL version 3 or later") + set(LICENSE_FILE "COPYING.GPLv3") +elseif(LICENSE_STRING STREQUAL "License: nonfree and unredistributable") + set(LICENSE_FILE "COPYING.NONFREE") + file(WRITE "${SOURCE_PATH}/${LICENSE_FILE}" "${LICENSE_STRING}") +else() + message(FATAL_ERROR "Failed to identify license (${LICENSE_STRING})") +endif() + +configure_file("${CMAKE_CURRENT_LIST_DIR}/FindFFMPEG.cmake.in" "${CURRENT_PACKAGES_DIR}/share/${PORT}/FindFFMPEG.cmake" @ONLY) +file(COPY "${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") +file(INSTALL "${SOURCE_PATH}/${LICENSE_FILE}" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) diff --git a/adm/vcpkg/ports/ffmpeg/usage b/adm/vcpkg/ports/ffmpeg/usage new file mode 100644 index 0000000000..6ef6c3bd07 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/usage @@ -0,0 +1,6 @@ +To use ffmpeg add the following to your CMake project: + + find_package(FFMPEG REQUIRED) + target_include_directories(main PRIVATE ${FFMPEG_INCLUDE_DIRS}) + target_link_directories(main PRIVATE ${FFMPEG_LIBRARY_DIRS}) + target_link_libraries(main PRIVATE ${FFMPEG_LIBRARIES}) diff --git a/adm/vcpkg/ports/ffmpeg/vcpkg-cmake-wrapper.cmake b/adm/vcpkg/ports/ffmpeg/vcpkg-cmake-wrapper.cmake new file mode 100644 index 0000000000..170bf63336 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,8 @@ +set(FFMPEG_PREV_MODULE_PATH ${CMAKE_MODULE_PATH}) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) + +cmake_policy(SET CMP0012 NEW) + +_find_package(${ARGS}) + +set(CMAKE_MODULE_PATH ${FFMPEG_PREV_MODULE_PATH}) diff --git a/adm/vcpkg/ports/ffmpeg/vcpkg.json b/adm/vcpkg/ports/ffmpeg/vcpkg.json new file mode 100644 index 0000000000..2ff03dbf88 --- /dev/null +++ b/adm/vcpkg/ports/ffmpeg/vcpkg.json @@ -0,0 +1,676 @@ +{ + "name": "ffmpeg", + "version": "4.4.5", + "port-version": 0, + "description": [ + "a library to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.", + "FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created. It supports the most obscure ancient formats up to the cutting edge. No matter if they were designed by some standards committee, the community or a corporation. It is also highly portable: FFmpeg compiles, runs, and passes our testing infrastructure FATE across Linux, Mac OS X, Microsoft Windows, the BSDs, Solaris, etc. under a wide variety of build environments, machine architectures, and configurations." + ], + "homepage": "https://ffmpeg.org", + "license": null, + "dependencies": [ + { + "name": "vcpkg-cmake-get-vars", + "host": true + }, + { + "name": "vcpkg-pkgconfig-get-modules", + "host": true + } + ], + "default-features": [ + "avcodec", + "avdevice", + "avfilter", + "avformat", + "swresample", + "swscale" + ], + "features": { + "all": { + "description": "Build with all allowed dependencies selected that are compatible with the lgpl license", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "avcodec", + "avdevice", + "avfilter", + "avformat", + "avresample", + "bzip2", + "freetype", + "iconv", + "lzma", + "mp3lame", + "openjpeg", + "opus", + "snappy", + "soxr", + "speex", + "swresample", + "swscale", + "theora", + "vorbis", + "vpx", + "webp", + "xml2", + "zlib" + ] + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "alsa" + ], + "platform": "linux" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "sdl2" + ], + "platform": "!osx" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "ass" + ], + "platform": "!uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "fontconfig" + ], + "platform": "!uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "fribidi" + ], + "platform": "!uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "modplug" + ], + "platform": "!uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "opencl" + ], + "platform": "!uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "openh264" + ], + "platform": "!uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "srt" + ], + "platform": "!uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "ilbc" + ], + "platform": "!(arm & uwp)" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "ssh" + ], + "platform": "!(uwp | arm)" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "tensorflow" + ], + "platform": "x64 & !static & !uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "aom" + ], + "platform": "!(windows & arm & !uwp)" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "dav1d" + ], + "platform": "!(uwp | arm | x86 | osx)" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "opengl" + ], + "platform": "!uwp & !(arm64 & windows)" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "tesseract" + ], + "platform": "!(windows & arm) & !static & !uwp" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "nvcodec" + ], + "platform": "linux | (!osx & !uwp & !(arm64 & windows))" + } + ] + }, + "all-gpl": { + "description": "Build with all allowed dependencies selected that are compatible with the gpl license", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "all", + "gpl", + "postproc" + ] + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "x264" + ], + "platform": "!(arm & windows)" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "x265" + ], + "platform": "!uwp & !(arm & windows)" + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "avisynthplus" + ], + "platform": "windows & !arm & !uwp & !static" + } + ] + }, + "all-nonfree": { + "description": "Build with all allowed dependencies selected with a non-redistributable license", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "all-gpl", + "fdk-aac", + "nonfree", + "openssl" + ] + } + ] + }, + "alsa": { + "description": "Enable ALSA support", + "dependencies": [ + "alsa" + ] + }, + "amf": { + "description": "AMD AMF codec support", + "dependencies": [ + "amd-amf" + ] + }, + "aom": { + "description": "AV1 video encoding/decoding via libaom support in ffmpeg", + "dependencies": [ + "aom" + ] + }, + "ass": { + "description": "Libass subtitles rendering, needed for subtitles and ass filter support in ffmpeg", + "dependencies": [ + "libass" + ] + }, + "avcodec": { + "description": "Build the avcodec library" + }, + "avdevice": { + "description": "Build the avdevice library", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "avcodec", + "avformat" + ] + } + ] + }, + "avfilter": { + "description": "Build the avfilter library" + }, + "avformat": { + "description": "Build the avformat library", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "avcodec" + ] + } + ] + }, + "avisynthplus": { + "description": "Reading of AviSynth script files", + "supports": "windows & !static", + "dependencies": [ + "avisynthplus", + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "gpl" + ] + } + ] + }, + "avresample": { + "description": "Build the avresample library" + }, + "bzip2": { + "description": "Bzip2 support", + "dependencies": [ + "bzip2" + ] + }, + "dav1d": { + "description": "AV1 decoding via libdav1d", + "supports": "!osx", + "dependencies": [ + "dav1d" + ] + }, + "fdk-aac": { + "description": "AAC de/encoding via libfdk-aac, **including GPL-incompatible patent-encumbered HE-AAC**. If you do not require HE-AAC, use the built-in FFmpeg AAC codec.", + "dependencies": [ + { + "name": "fdk-aac", + "default-features": false, + "features": [ + "he-aac" + ] + }, + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "nonfree" + ] + } + ] + }, + "ffmpeg": { + "description": "Build the ffmpeg application", + "supports": "!uwp", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "avcodec", + "avfilter", + "avformat" + ] + } + ] + }, + "ffplay": { + "description": "Build the ffplay application", + "supports": "!uwp", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "avcodec", + "avfilter", + "avformat", + "sdl2", + "swresample", + "swscale" + ] + } + ] + }, + "ffprobe": { + "description": "Build the ffprobe application", + "supports": "!uwp", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "avcodec", + "avformat" + ] + } + ] + }, + "fontconfig": { + "description": "Useful for drawtext filter", + "dependencies": [ + "fontconfig" + ] + }, + "freetype": { + "description": "Needed for drawtext filter", + "dependencies": [ + "freetype" + ] + }, + "fribidi": { + "description": "Improves drawtext filter", + "dependencies": [ + "fribidi" + ] + }, + "gpl": { + "description": "Allow use of GPL code, the resulting libs and binaries will be under GPL" + }, + "iconv": { + "description": "Iconv support", + "dependencies": [ + "libiconv" + ] + }, + "ilbc": { + "description": "iLBC de/encoding via libilbc", + "dependencies": [ + "libilbc" + ] + }, + "lzma": { + "description": "lzma support", + "dependencies": [ + "liblzma" + ] + }, + "modplug": { + "description": "ModPlug via libmodplug", + "dependencies": [ + "libmodplug" + ] + }, + "mp3lame": { + "description": "MP3 encoding via libmp3lame", + "dependencies": [ + "mp3lame" + ] + }, + "nonfree": { + "description": "Allow use of nonfree code, the resulting libs and binaries will be unredistributable" + }, + "nvcodec": { + "description": "Nvidia video decoding/encoding acceleration", + "supports": "linux | (!osx & !uwp & !(arm64 & windows))", + "dependencies": [ + "ffnvcodec" + ] + }, + "opencl": { + "description": "OpenCL processing", + "supports": "!uwp", + "dependencies": [ + "opencl" + ] + }, + "opengl": { + "description": "OpenGL rendering", + "supports": "!uwp", + "dependencies": [ + "opengl", + "opengl-registry" + ] + }, + "openh264": { + "description": "H.264 de/encoding via openh264", + "dependencies": [ + "openh264" + ] + }, + "openjpeg": { + "description": "JPEG 2000 de/encoding via OpenJPEG", + "dependencies": [ + "openjpeg" + ] + }, + "openmpt": { + "description": "Decoding tracked files via libopenmpt", + "dependencies": [ + "libopenmpt" + ] + }, + "openssl": { + "description": "Needed for https support if gnutls, libtls or mbedtls is not used", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "nonfree" + ] + }, + "openssl" + ] + }, + "opus": { + "description": "Opus de/encoding via libopus", + "dependencies": [ + "opus" + ] + }, + "postproc": { + "description": "Build the postproc library", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "gpl" + ] + } + ] + }, + "qsv": { + "description": "Intel QSV Codec", + "dependencies": [ + "mfx-dispatch" + ] + }, + "sdl2": { + "description": "Sdl2 support", + "dependencies": [ + { + "name": "sdl2", + "default-features": false, + "features": [ + "x11" + ], + "platform": "linux" + }, + { + "name": "sdl2", + "platform": "!linux" + } + ] + }, + "snappy": { + "description": "Snappy compression, needed for hap encoding", + "dependencies": [ + "snappy" + ] + }, + "soxr": { + "description": "Include libsoxr resampling", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "swresample" + ] + }, + "soxr" + ] + }, + "speex": { + "description": "Speex de/encoding via libspeex", + "dependencies": [ + "speex" + ] + }, + "srt": { + "description": "Haivision SRT protocol", + "supports": "!uwp", + "dependencies": [ + "libsrt" + ] + }, + "ssh": { + "description": "SFTP protocol via libssh", + "dependencies": [ + "libssh" + ] + }, + "swresample": { + "description": "Build the swresample library" + }, + "swscale": { + "description": "Build the swscale library" + }, + "tensorflow": { + "description": "TensorFlow as a DNN module backend for DNN based filters like sr", + "supports": "!static", + "dependencies": [ + "tensorflow" + ] + }, + "tesseract": { + "description": "Tesseract, needed for ocr filter", + "supports": "!static", + "dependencies": [ + "tesseract" + ] + }, + "theora": { + "description": "Theora encoding via libtheora", + "dependencies": [ + "libtheora" + ] + }, + "version3": { + "description": "Upgrade (L)GPL to version 3" + }, + "vorbis": { + "description": "Vorbis en/decoding via libvorbis, native implementation exists", + "dependencies": [ + "libvorbis" + ] + }, + "vpx": { + "description": "VP8 and VP9 de/encoding via libvpx", + "dependencies": [ + "libvpx" + ] + }, + "webp": { + "description": "WebP encoding via libwebp", + "dependencies": [ + "libwebp" + ] + }, + "x264": { + "description": "H.264 encoding via x264", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "gpl" + ] + }, + "x264" + ] + }, + "x265": { + "description": "HEVC encoding via x265", + "dependencies": [ + { + "name": "ffmpeg", + "default-features": false, + "features": [ + "gpl" + ] + }, + "x265" + ] + }, + "xml2": { + "description": "XML parsing using the C library libxml2, needed for dash demuxing support", + "dependencies": [ + "libxml2" + ] + }, + "zlib": { + "description": "zlib support", + "dependencies": [ + "zlib" + ] + } + } +} diff --git a/adm/vcpkg/ports/jemalloc/fix-configure-ac.patch b/adm/vcpkg/ports/jemalloc/fix-configure-ac.patch new file mode 100644 index 0000000000..7799dfb9e8 --- /dev/null +++ b/adm/vcpkg/ports/jemalloc/fix-configure-ac.patch @@ -0,0 +1,13 @@ +diff --git a/configure.ac b/configure.ac +index f6d25f334..3115504e2 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1592,7 +1592,7 @@ fi + [enable_uaf_detection="0"] + ) + if test "x$enable_uaf_detection" = "x1" ; then +- AC_DEFINE([JEMALLOC_UAF_DETECTION], [ ]) ++ AC_DEFINE([JEMALLOC_UAF_DETECTION], [ ], ["enable UAF"]) + fi + AC_SUBST([enable_uaf_detection]) + diff --git a/adm/vcpkg/ports/jemalloc/portfile.cmake b/adm/vcpkg/ports/jemalloc/portfile.cmake new file mode 100644 index 0000000000..2a4f4a4dde --- /dev/null +++ b/adm/vcpkg/ports/jemalloc/portfile.cmake @@ -0,0 +1,58 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO jemalloc/jemalloc + REF 54eaed1d8b56b1aa528be3bdd1877e59c56fa90c + SHA512 527bfbf5db9a5c2b7b04df4785b6ae9d445cff8cb17298bf3e550c88890d2bd7953642d8efaa417580610508279b527d3a3b9e227d17394fd2013c88cb7ae75a + HEAD_REF master + PATCHES + fix-configure-ac.patch + preprocessor.patch +) +if(VCPKG_TARGET_IS_WINDOWS) + set(opts "ac_cv_search_log=none required" "--without-private-namespace") +endif() + +set (opts "${opts}" "--disable-initial-exec-tls") + +vcpkg_configure_make( + SOURCE_PATH "${SOURCE_PATH}" + AUTOCONFIG + NO_WRAPPERS + OPTIONS ${opts} +) + +vcpkg_install_make() + +if(VCPKG_TARGET_IS_WINDOWS) + file(COPY "${SOURCE_PATH}/include/msvc_compat/strings.h" DESTINATION "${CURRENT_PACKAGES_DIR}/include/jemalloc/msvc_compat") + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/jemalloc/jemalloc.h" "" "\"msvc_compat/strings.h\"") + if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") + file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/lib/jemalloc.lib" DESTINATION "${CURRENT_PACKAGES_DIR}/lib") + file(MAKE_DIRECTORY "${CURRENT_PACKAGES_DIR}/bin") + file(RENAME "${CURRENT_PACKAGES_DIR}/lib/jemalloc.dll" "${CURRENT_PACKAGES_DIR}/bin/jemalloc.dll") + endif() + if(NOT VCPKG_BUILD_TYPE) + if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") + file(COPY "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/lib/jemalloc.lib" DESTINATION "${CURRENT_PACKAGES_DIR}/debug/lib") + file(MAKE_DIRECTORY "${CURRENT_PACKAGES_DIR}/debug/bin") + file(RENAME "${CURRENT_PACKAGES_DIR}/debug/lib/jemalloc.dll" "${CURRENT_PACKAGES_DIR}/debug/bin/jemalloc.dll") + endif() + endif() + if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/lib/pkgconfig/jemalloc.pc" "install_suffix=" "install_suffix=_s") + if(NOT VCPKG_BUILD_TYPE) + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/jemalloc.pc" "install_suffix=" "install_suffix=_s") + endif() + endif() +endif() + +vcpkg_fixup_pkgconfig() + +vcpkg_copy_pdbs() + +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/tools") + +# Handle copyright +file(INSTALL "${SOURCE_PATH}/COPYING" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) diff --git a/adm/vcpkg/ports/jemalloc/preprocessor.patch b/adm/vcpkg/ports/jemalloc/preprocessor.patch new file mode 100644 index 0000000000..6e6e2d1403 --- /dev/null +++ b/adm/vcpkg/ports/jemalloc/preprocessor.patch @@ -0,0 +1,12 @@ +diff --git a/configure.ac b/configure.ac +index 3115504e2..ffb504b08 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -749,6 +749,7 @@ case "${host}" in + so="dll" + if test "x$je_cv_msvc" = "xyes" ; then + importlib="lib" ++ JE_APPEND_VS(CPPFLAGS, -DJEMALLOC_NO_PRIVATE_NAMESPACE) + DSO_LDFLAGS="-LD" + EXTRA_LDFLAGS="-link -DEBUG" + CTARGET='-Fo$@' diff --git a/adm/vcpkg/ports/jemalloc/vcpkg.json b/adm/vcpkg/ports/jemalloc/vcpkg.json new file mode 100644 index 0000000000..007e05b931 --- /dev/null +++ b/adm/vcpkg/ports/jemalloc/vcpkg.json @@ -0,0 +1,8 @@ +{ + "name": "jemalloc", + "version": "5.3.0", + "port-version": 1, + "description": "jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support", + "homepage": "https://jemalloc.net/", + "license": "BSD-2-Clause" +} diff --git a/adm/vcpkg/ports/tcl/force-shell-install.patch b/adm/vcpkg/ports/tcl/force-shell-install.patch new file mode 100644 index 0000000000..0725945f77 --- /dev/null +++ b/adm/vcpkg/ports/tcl/force-shell-install.patch @@ -0,0 +1,27 @@ +From 85842ba83b70d99f90ee3fff8c956e82d17759f2 Mon Sep 17 00:00:00 2001 +From: Marek Roszko +Date: Tue, 18 Aug 2020 23:11:27 -0400 +Subject: [PATCH] Remove broken exist check for shell install + +--- + win/makefile.vc | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/win/makefile.vc b/win/makefile.vc +index f5d2f4a..6bffe32 100644 +--- a/win/makefile.vc ++++ b/win/makefile.vc +@@ -869,10 +869,8 @@ install-binaries: + @$(CPY) "$(TCLLIB)" "$(BIN_INSTALL_DIR)\" + !endif + @$(CPY) "$(TCLIMPLIB)" "$(LIB_INSTALL_DIR)\" +-!if exist($(TCLSH)) + @echo Installing $(TCLSHNAME) + @$(CPY) "$(TCLSH)" "$(BIN_INSTALL_DIR)\" +-!endif + @echo Installing $(TCLSTUBLIBNAME) + @$(CPY) "$(TCLSTUBLIB)" "$(LIB_INSTALL_DIR)\" + +-- +2.28.0.windows.1 + diff --git a/adm/vcpkg/ports/tcl/portfile.cmake b/adm/vcpkg/ports/tcl/portfile.cmake new file mode 100644 index 0000000000..5c28634664 --- /dev/null +++ b/adm/vcpkg/ports/tcl/portfile.cmake @@ -0,0 +1,156 @@ +vcpkg_from_sourceforge( + OUT_SOURCE_PATH SOURCE_PATH + REPO tcl/Tcl + REF 8.6.15 + FILENAME tcl8.6.15-src.tar.gz + SHA512 9ae652823084899091467744da5a35d0fdfb453c055baea96af1bb181d161abe58b83382315cc3abee5fd57acc4ad5028df486a3e53645a28d1467e9c8d1d23e +) + +if (VCPKG_TARGET_IS_WINDOWS) + if(VCPKG_TARGET_ARCHITECTURE MATCHES "x64") + set(TCL_BUILD_MACHINE_STR MACHINE=AMD64) + else() + set(TCL_BUILD_MACHINE_STR MACHINE=IX86) + endif() + + # Handle features + set(TCL_BUILD_OPTS OPTS=pdbs) + set(TCL_BUILD_STATS STATS=none) + set(TCL_BUILD_CHECKS CHECKS=none) + if (VCPKG_LIBRARY_LINKAGE STREQUAL static) + set(TCL_BUILD_OPTS ${TCL_BUILD_OPTS},static,staticpkg) + endif() + if (VCPKG_CRT_LINKAGE STREQUAL dynamic) + set(TCL_BUILD_OPTS ${TCL_BUILD_OPTS},msvcrt) + endif() + + if ("thrdalloc" IN_LIST FEATURES) + set(TCL_BUILD_OPTS ${TCL_BUILD_OPTS},thrdalloc) + endif() + if ("profile" IN_LIST FEATURES) + set(TCL_BUILD_OPTS ${TCL_BUILD_OPTS},profile) + endif() + if ("unchecked" IN_LIST FEATURES) + set(TCL_BUILD_OPTS ${TCL_BUILD_OPTS},unchecked) + endif() + if ("utfmax" IN_LIST FEATURES) + set(TCL_BUILD_OPTS ${TCL_BUILD_OPTS},time64bit) + endif() + + vcpkg_install_nmake( + SOURCE_PATH ${SOURCE_PATH} + PROJECT_SUBPATH win + OPTIONS + ${TCL_BUILD_MACHINE_STR} + ${TCL_BUILD_STATS} + ${TCL_BUILD_CHECKS} + OPTIONS_DEBUG + ${TCL_BUILD_OPTS},symbols + INSTALLDIR=${CURRENT_PACKAGES_DIR}/debug + SCRIPT_INSTALL_DIR=${CURRENT_PACKAGES_DIR}/tools/tcl/debug/lib/tcl9.0 + OPTIONS_RELEASE + release + ${TCL_BUILD_OPTS} + INSTALLDIR=${CURRENT_PACKAGES_DIR} + SCRIPT_INSTALL_DIR=${CURRENT_PACKAGES_DIR}/tools/tcl/lib/tcl9.0 + ) + + # Install + # Note: tcl shell requires it to be in a folder adjacent to the /lib/ folder, i.e. in a /bin/ folder + if (NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL release) + file(GLOB_RECURSE TOOL_BIN + "${CURRENT_PACKAGES_DIR}/bin/*.exe" + "${CURRENT_PACKAGES_DIR}/bin/*.dll" + ) + file(COPY ${TOOL_BIN} DESTINATION "${CURRENT_PACKAGES_DIR}/tools/tcl/bin/") + + # Remove .exes only after copying + file(GLOB_RECURSE TOOL_EXES + ${CURRENT_PACKAGES_DIR}/bin/*.exe + ) + file(REMOVE ${TOOL_EXES}) + + file(GLOB_RECURSE TOOLS + "${CURRENT_PACKAGES_DIR}/lib/dde1.4/*" + "${CURRENT_PACKAGES_DIR}/lib/nmake/*" + "${CURRENT_PACKAGES_DIR}/lib/reg1.3/*" + "${CURRENT_PACKAGES_DIR}/lib/tcl8/*" + "${CURRENT_PACKAGES_DIR}/lib/tcl8.6/*" + "${CURRENT_PACKAGES_DIR}/lib/tdbcsqlite31.1.0/*" + ) + + foreach(TOOL ${TOOLS}) + get_filename_component(DST_DIR ${TOOL} PATH) + file(COPY "${TOOL}" DESTINATION ${DST_DIR}) + endforeach() + file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/lib/dde1.4" + "${CURRENT_PACKAGES_DIR}/lib/nmake" + "${CURRENT_PACKAGES_DIR}/lib/reg1.3" + "${CURRENT_PACKAGES_DIR}/lib/tcl8" + "${CURRENT_PACKAGES_DIR}/lib/tcl8.6" + "${CURRENT_PACKAGES_DIR}/lib/tdbcsqlite31.1.0" + ) + file(CHMOD_RECURSE + "${CURRENT_PACKAGES_DIR}/tools/tcl/lib/tcl9.0/msgs" "${CURRENT_PACKAGES_DIR}/tools/tcl/lib/tcl9.0/tzdata" + PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ GROUP_WRITE + WORLD_READ WORLD_WRITE + ) + endif() + if (NOT VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL debug) + file(GLOB_RECURSE TOOL_BIN + "${CURRENT_PACKAGES_DIR}/debug/bin/*.exe" + "${CURRENT_PACKAGES_DIR}/debug/bin/*.dll" + ) + file(COPY ${TOOL_BIN} DESTINATION "${CURRENT_PACKAGES_DIR}/tools/tcl/debug/bin/") + + # Remove .exes only after copying + file(GLOB_RECURSE EXES + "${CURRENT_PACKAGES_DIR}/debug/bin/*.exe" + ) + file(REMOVE ${EXES}) + + file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/lib/dde1.4" + "${CURRENT_PACKAGES_DIR}/debug/lib/nmake" + "${CURRENT_PACKAGES_DIR}/debug/lib/reg1.3" + "${CURRENT_PACKAGES_DIR}/debug/lib/tcl8" + "${CURRENT_PACKAGES_DIR}/debug/lib/tcl8.6" + "${CURRENT_PACKAGES_DIR}/debug/lib/tdbcsqlite31.1.0" + ) + + file(CHMOD_RECURSE + "${CURRENT_PACKAGES_DIR}/tools/tcl/debug/lib/tcl9.0/msgs" "${CURRENT_PACKAGES_DIR}/tools/tcl/debug/lib/tcl9.0/tzdata" + PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ GROUP_WRITE + WORLD_READ WORLD_WRITE + ) + endif() + + if(VCPKG_LIBRARY_LINKAGE STREQUAL static) + file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/debug/bin") + endif() + + file (REMOVE ${CURRENT_PACKAGES_DIR}/bin/zlib1.dll) + file (REMOVE ${CURRENT_PACKAGES_DIR}/debug/bin/zlib1.dll) + + file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") +else() + vcpkg_configure_make( + SOURCE_PATH "${SOURCE_PATH}" + PROJECT_SUBPATH unix + ) + + vcpkg_install_make() + vcpkg_fixup_pkgconfig() + + if(VCPKG_LIBRARY_LINKAGE STREQUAL static) + file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/debug/bin") + endif() + file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include" "${CURRENT_PACKAGES_DIR}/debug/share") +endif() + +file(REMOVE "${CURRENT_PACKAGES_DIR}/lib/tclConfig.sh" "${CURRENT_PACKAGES_DIR}/debug/lib/tclConfig.sh") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/license.terms") diff --git a/adm/vcpkg/ports/tcl/vcpkg.json b/adm/vcpkg/ports/tcl/vcpkg.json new file mode 100644 index 0000000000..89a8001164 --- /dev/null +++ b/adm/vcpkg/ports/tcl/vcpkg.json @@ -0,0 +1,25 @@ +{ + "name": "tcl", + "version-string": "core-8-6-15", + "port-version": 1, + "description": "Tcl provides a powerful platform for creating integration applications that tie together diverse applications, protocols, devices, and frameworks. When paired with the Tk toolkit, Tcl provides the fastest and most powerful way to create GUI applications that run on PCs, Unix, and Mac OS X. Tcl can also be used for a variety of web-related tasks and for creating powerful command languages for applications.", + "homepage": "https://github.com/tcltk/tcl", + "supports": "!android & !(windows & arm) & !uwp", + "dependencies": [ + "zlib" + ], + "features": { + "profile": { + "description": "Adds profiling hooks. Map file is assumed." + }, + "thrdalloc": { + "description": "Use the thread allocator (shared global free pool)." + }, + "unchecked": { + "description": "Allows a symbols build to not use the debug enabled runtime (msvcrt.dll not msvcrtd.dll or libcmt.lib not libcmtd.lib)." + }, + "utfmax": { + "description": "Forces Tcl_UniChar to be a 32-bit quantity in stead of 16-bits" + } + } +} diff --git a/adm/vcpkg/vcpkg-configuration.json b/adm/vcpkg/vcpkg-configuration.json new file mode 100644 index 0000000000..d3926351ae --- /dev/null +++ b/adm/vcpkg/vcpkg-configuration.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg-configuration.schema.json", + "default-registry": { + "kind": "git", + "baseline": "2ddc10c8afa00a762a69f21f6427849fe906ede0", + "repository": "https://github.com/microsoft/vcpkg" + }, + "registries": [ + { + "kind": "artifact", + "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip", + "name": "microsoft" + } + ], + "overlay-ports": [ + "./ports" + ] +} diff --git a/adm/vcpkg/vcpkg.json b/adm/vcpkg/vcpkg.json new file mode 100644 index 0000000000..d3ee6b74b6 --- /dev/null +++ b/adm/vcpkg/vcpkg.json @@ -0,0 +1,121 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", + "name": "opencascade", + "version": "7.8.1", + "description": "Open CASCADE Technology (OCCT) is an open-source software development platform for 3D CAD, CAM, CAE.", + "homepage": "https://github.com/Open-Cascade-SAS/OCCT", + "documentation": "https://github.com/Open-Cascade-SAS/OCCT/wiki", + "license": "LGPL-2.1", + "dependencies": [ + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + } + ], + "default-features": [ + { + "name": "tcl" + }, + { + "name": "freetype", + "platform": "!uwp" + }, + { + "name": "angle", + "platform": "uwp" + }, + { + "name": "opengl", + "platform": "!(android | ios | uwp | wasm32)" + } + ], + "features": { + "angle": { + "description": "Enables optional usage of ANGLE. Part of the module-visualization.", + "dependencies": [ + "angle" + ] + }, + "opengl": { + "description": "Enables optional usage of OpenGL. Part of the module-visualization.", + "dependencies": [ + "opengl" + ] + }, + "tcl": { + "description": "Enables optional usage of Tcl. Part of the module-foundation-classes.", + "dependencies": [ + "tcl" + ] + }, + "freeimage": { + "description": "Enables optional usage of FreeImage. Part of the module-visualization.", + "dependencies": [ + "freeimage" + ] + }, + "freetype": { + "description": "Enables optional usage of FreeType. Part of the module-visualization.", + "supports": "!uwp", + "dependencies": [ + "fontconfig", + { + "name": "freetype", + "default-features": false + } + ] + }, + "rapidjson": { + "description": "Enables optional usage of RapidJSON. Part of the module-data-exchange.", + "dependencies": [ + "rapidjson" + ] + }, + "tbb": { + "description": "Enables optional usage of TBB. Part of the module-foundation-classes.", + "dependencies": [ + "tbb" + ] + }, + "vtk": { + "description": "Enables optional usage of VTK. Part of the module-visualization.", + "dependencies": [ + { + "name": "vtk", + "default-features": false, + "features": [ + "opengl" + ] + } + ] + }, + "draco": { + "description": "Enables optional usage of Draco. Part of the module-data-exchange.", + "dependencies": [ + "draco" + ] + }, + "ffmpeg": { + "description": "Enables optional usage of FFmpeg. Part of the module-visualization.", + "dependencies": [ + "ffmpeg" + ] + }, + "openvr": { + "description": "Enables optional usage of OpenVR. Part of the module-visualization.", + "dependencies": [ + "openvr" + ] + }, + "jemalloc": { + "description": "Enables optional usage of jemalloc. Part of the module-foundation-classes.", + "dependencies": [ + "jemalloc" + ] + } + } +} \ No newline at end of file