diff --git a/ports/lapack-reference/fix_prefix.patch b/ports/lapack-reference/fix-prefix.patch similarity index 59% rename from ports/lapack-reference/fix_prefix.patch rename to ports/lapack-reference/fix-prefix.patch index d0fdcdeb276279..3ed1090c52c6c1 100644 --- a/ports/lapack-reference/fix_prefix.patch +++ b/ports/lapack-reference/fix-prefix.patch @@ -1,17 +1,17 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index c99d71a..7333110 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -10,6 +10,12 @@ set( - ${LAPACK_MAJOR_VERSION}.${LAPACK_MINOR_VERSION}.${LAPACK_PATCH_VERSION} - ) - -+if(WIN32) -+ set(CMAKE_STATIC_LIBRARY_PREFIX "") -+ set(CMAKE_SHARED_LIBRARY_PREFIX "lib") -+ set(CMAKE_IMPORT_LIBRARY_PREFIX "") -+endif() -+ - # Add the CMake directory for custom CMake modules - set(CMAKE_MODULE_PATH "${LAPACK_SOURCE_DIR}/CMAKE" ${CMAKE_MODULE_PATH}) - +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 73056dc2e9..56356bf354 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -14,6 +14,12 @@ set( + set(CMAKE_STATIC_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") + set(CMAKE_SHARED_LIBRARY_PREFIX "lib${LIBRARY_PREFIX}") + ++if(WIN32 AND CMAKE_GNUtoMS) ++ set(CMAKE_STATIC_LIBRARY_PREFIX "") ++ set(CMAKE_SHARED_LIBRARY_PREFIX "lib") ++ set(CMAKE_IMPORT_LIBRARY_PREFIX "") ++endif() ++ + # Add the CMake directory for custom CMake modules + set(CMAKE_MODULE_PATH "${LAPACK_SOURCE_DIR}/CMAKE" ${CMAKE_MODULE_PATH}) + diff --git a/ports/lapack-reference/lapacke.patch b/ports/lapack-reference/lapacke.patch deleted file mode 100644 index 964f0e31927fce..00000000000000 --- a/ports/lapack-reference/lapacke.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 1ee66f1..7cec7ca 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -392,8 +392,9 @@ endif() - set(LAPACK_INSTALL_EXPORT_NAME ${LAPACK_INSTALL_EXPORT_NAME_CACHE}) - unset(LAPACK_INSTALL_EXPORT_NAME_CACHE) - --add_subdirectory(LAPACKE) -- -+if(LAPACKE) -+ add_subdirectory(LAPACKE) -+endif() - - #------------------------------------- - # BLAS++ / LAPACK++ diff --git a/ports/lapack-reference/portfile.cmake b/ports/lapack-reference/portfile.cmake index 093f7f8c21be63..20b382aba233a9 100644 --- a/ports/lapack-reference/portfile.cmake +++ b/ports/lapack-reference/portfile.cmake @@ -8,8 +8,6 @@ if(EXISTS "${CURRENT_INSTALLED_DIR}/share/clapack/copyright") message(FATAL_ERROR "Can't build ${PORT} if clapack is installed. Please remove clapack:${TARGET_TRIPLET}, and try to install ${PORT}:${TARGET_TRIPLET} again.") endif() -vcpkg_minimum_required(VERSION 2022-10-12) # for ${VERSION} - include(vcpkg_find_fortran) SET(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) set(VCPKG_POLICY_ALLOW_OBSOLETE_MSVCRT enabled) @@ -18,12 +16,12 @@ vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO "Reference-LAPACK/lapack" REF "v${VERSION}" - SHA512 fc3258b9d91a833149a68a89c5589b5113e90a8f9f41c3a73fbfccb1ecddd92d9462802c0f870f1c3dab392623452de4ef512727f5874ffdcba6a4845f78fc9a + SHA512 f8f3c733a0221be0b3f5618235408ac59cbd4e5f1c4eab5f509b831a6ec6a9ef14b8849aa6ea10810df1aff90186ca454d15e9438d1dd271c2449d42d3da9dda HEAD_REF master PATCHES + fix-prefix.patch cmake-config.patch - lapacke.patch - fix_prefix.patch + print-implicit-libs.patch ) if(NOT VCPKG_TARGET_IS_WINDOWS) @@ -63,6 +61,7 @@ vcpkg_cmake_configure( "-DCMAKE_REQUIRE_FIND_PACKAGE_BLAS=${USE_OPTIMIZED_BLAS}" "-DCBLAS=${CBLAS}" "-DTEST_FORTRAN_COMPILER=OFF" + "-DCMAKE_Fortran_INIT_FLAGS=-fno-tree-vectorize" # This is used by openblas to compile lapack since there seems to be a bug in gfortran ${FORTRAN_CMAKE} MAYBE_UNUSED_VARIABLES CMAKE_REQUIRE_FIND_PACKAGE_BLAS @@ -106,6 +105,10 @@ if("cblas" IN_LIST FEATURES) file(READ "${pcfile}" _contents) file(WRITE "${pcfile}" "prefix=${CURRENT_INSTALLED_DIR}/debug\n${_contents}") endif() + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/lib/pkgconfig/lapack.pc" " blas" " blas cblas") + if(NOT VCPKG_BUILD_TYPE) + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/lapack.pc" " blas" " blas cblas") + endif() endif() vcpkg_fixup_pkgconfig() @@ -152,3 +155,49 @@ file(COPY "${CMAKE_CURRENT_LIST_DIR}/FindLAPACK.cmake" DESTINATION "${CURRENT_PA file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +if(NOT VCPKG_TARGET_IS_WINDOWS) + file(READ "${CURRENT_BUILDTREES_DIR}/config-${TARGET_TRIPLET}-out.log" config_log) + string(REGEX MATCH "CMAKE_C_IMPLICIT_LINK_LIBRARIES:([^\n]+)" implicit_c_libs "${config_log}") + set(implicit_c_libs "${CMAKE_MATCH_1}") + list(REVERSE implicit_c_libs) + list(REMOVE_DUPLICATES implicit_c_libs) + list(REVERSE implicit_c_libs) + string(REGEX MATCH "CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES:([^\n]+)" implicit_fortran_libs "${config_log}") + set(implicit_fortran_libs "${CMAKE_MATCH_1}") + list(REVERSE implicit_fortran_libs) + list(REMOVE_DUPLICATES implicit_fortran_libs) + list(REVERSE implicit_fortran_libs) + list(REMOVE_ITEM implicit_fortran_libs ${implicit_c_libs} quadmath m) # libgfortran already has quadmath and m as a dependency + list(JOIN implicit_fortran_libs " -l" implicit_fortran_libs) + + string(REGEX MATCH "CMAKE_C_IMPLICIT_LINK_DIRECTORIES:([^\n]+)" implicit_c_dirs "${config_log}") + set(implicit_c_dirs "${CMAKE_MATCH_1}") + list(REVERSE implicit_c_dirs) + list(REMOVE_DUPLICATES implicit_c_dirs) + list(REVERSE implicit_c_dirs) + string(REGEX MATCH "CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES:([^\n]+)" implicit_fortran_dirs "${config_log}") + set(implicit_fortran_dirs "${CMAKE_MATCH_1}") + list(REVERSE implicit_fortran_dirs) + list(REMOVE_DUPLICATES implicit_fortran_dirs) + list(REVERSE implicit_fortran_dirs) + list(REMOVE_ITEM implicit_fortran_dirs ${implicit_c_dirs}) # libgfortran already has quadmath and m as a dependency + if(VCPKG_TARGET_IS_OSX) + list(APPEND implicit_fortran_dirs "/usr/local/lib") + endif() + list(JOIN implicit_fortran_dirs " -L" implicit_fortran_dirs) + + message(STATUS "implicit_fortran_libs:${implicit_fortran_libs}|implicit_c_libs:${implicit_c_libs}") + message(STATUS "implicit_fortran_dirs:${implicit_fortran_dirs}|implicit_c_dirs:${implicit_c_dirs}") + if(NOT implicit_fortran_libs STREQUAL "" AND NOT implicit_fortran_dirs STREQUAL "") + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/lib/pkgconfig/lapack-reference.pc" "-llapack" "-llapack -L${implicit_fortran_dirs} -l${implicit_fortran_libs}") + if(NOT VCPKG_BUILD_TYPE) + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/lapack-reference.pc" "-llapack" "-llapack -L${implicit_fortran_dirs} -l${implicit_fortran_libs}") + endif() + elseif(NOT implicit_fortran_libs STREQUAL "") + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/lib/pkgconfig/lapack-reference.pc" "-llapack" "-llapack -l${implicit_fortran_libs}") + if(NOT VCPKG_BUILD_TYPE) + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/lapack-reference.pc" "-llapack" "-llapack -l${implicit_fortran_libs}") + endif() + endif() +endif() diff --git a/ports/lapack-reference/print-implicit-libs.patch b/ports/lapack-reference/print-implicit-libs.patch new file mode 100644 index 00000000000000..317e2ee1cd12e3 --- /dev/null +++ b/ports/lapack-reference/print-implicit-libs.patch @@ -0,0 +1,14 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index c99d71a267..34fd8445b1 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -697,3 +697,8 @@ if(BUILD_HTML_DOCUMENTATION OR BUILD_MAN_DOCUMENTATION) + + endif() + endif() ++ ++message(STATUS "CMAKE_C_IMPLICIT_LINK_LIBRARIES:${CMAKE_C_IMPLICIT_LINK_LIBRARIES}") ++message(STATUS "CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES:${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}") ++message(STATUS "CMAKE_C_IMPLICIT_LINK_DIRECTORIES:${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") ++message(STATUS "CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES:${CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES}") +\ No newline at end of file diff --git a/ports/lapack-reference/vcpkg.json b/ports/lapack-reference/vcpkg.json index 684be12305a098..169b5b682eb0d2 100644 --- a/ports/lapack-reference/vcpkg.json +++ b/ports/lapack-reference/vcpkg.json @@ -1,7 +1,6 @@ { "name": "lapack-reference", - "version": "3.11.0", - "port-version": 6, + "version": "3.12.0", "description": "LAPACK - Linear Algebra PACKage", "homepage": "https://netlib.org/lapack/", "license": "BSD-3-Clause-Open-MPI", diff --git a/ports/numpy/fix-tests.patch b/ports/numpy/fix-tests.patch new file mode 100644 index 00000000000000..ebc8e10ec24bed --- /dev/null +++ b/ports/numpy/fix-tests.patch @@ -0,0 +1,36 @@ +diff --git a/numpy/testing/_private/extbuild.py b/numpy/testing/_private/extbuild.py +index 292060e76f..49dd3b3556 100644 +--- a/numpy/testing/_private/extbuild.py ++++ b/numpy/testing/_private/extbuild.py +@@ -182,7 +182,7 @@ def _c_compile(cfile, outputfilename, include_dirs=[], libraries=[], + library_dirs=[]): + if sys.platform == 'win32': + compile_extra = ["/we4013"] ++ link_extra = ["/LIBPATH:" + os.path.join(sys.base_prefix, '../../lib')] +- link_extra = ["/LIBPATH:" + os.path.join(sys.base_prefix, 'libs')] + elif sys.platform.startswith('linux'): + compile_extra = [ + "-O0", "-g", "-Werror=implicit-function-declaration", "-fPIC"] +@@ -229,17 +229,19 @@ def build(cfile, outputfilename, compile_extra, link_extra, + name_suffix: 'dummy', + ) + """)) ++ meson = os.environ.get('MESON', "meson.py") ++ + if sys.platform == "win32": +- subprocess.check_call(["meson", "setup", ++ subprocess.check_call([sys.executable, meson, "setup", + "--buildtype=release", + "--vsenv", ".."], + cwd=build_dir, + ) + else: +- subprocess.check_call(["meson", "setup", "--vsenv", ".."], ++ subprocess.check_call([sys.executable, meson, "setup", "--vsenv", ".."], + cwd=build_dir + ) +- subprocess.check_call(["meson", "compile"], cwd=build_dir) ++ subprocess.check_call([sys.executable, meson, "compile"], cwd=build_dir) + os.rename(str(build_dir / so_name) + ".dummy", cfile.parent / so_name) + + def get_so_suffix(): diff --git a/ports/numpy/portfile.cmake b/ports/numpy/portfile.cmake new file mode 100644 index 00000000000000..cac623c9439a6c --- /dev/null +++ b/ports/numpy/portfile.cmake @@ -0,0 +1,137 @@ +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) # Numpy includes are stored in the module itself +set(VCPKG_POLICY_MISMATCHED_NUMBER_OF_BINARIES enabled) +set(VCPKG_BUILD_TYPE release) # No debug builds required for pure python modules since vcpkg does not install a debug python executable. + +#TODO: Fix E:\vcpkg_folders\numpy\installed\x64-windows-release\tools\python3\Lib\site-packages\numpy\testing\_private\extbuild.py + +vcpkg_get_vcpkg_installed_python(VCPKG_PYTHON3) +cmake_path(GET VCPKG_PYTHON3 PARENT_PATH VCPKG_PYTHON3_BASEDIR) + +find_program(VCPKG_CYTHON NAMES cython PATHS "${VCPKG_PYTHON3_BASEDIR}" "${CURRENT_HOST_INSTALLED_DIR}/tools/python3/Scripts" NO_DEFAULT_PATH) + +set(ENV{PYTHON3} "${VCPKG_PYTHON3}") +set(PYTHON3 "${VCPKG_PYTHON3}") + +cmake_path(GET SCRIPT_MESON PARENT_PATH MESON_DIR) +vcpkg_add_to_path(PREPEND "${VCPKG_PYTHON3_BASEDIR}") +if(VCPKG_TARGET_IS_WINDOWS) + cmake_path(GET VCPKG_CYTHON PARENT_PATH CYTHON_DIR) + vcpkg_add_to_path(PREPEND "${CYTHON_DIR}") +endif() + +cmake_path(GET SCRIPT_MESON PARENT_PATH MESON_DIR) +set(ENV{MESON} "${SCRIPT_MESON}") + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO numpy/numpy + REF v${VERSION} + SHA512 01b6a124c72d082f1dafdd98cdaaa84ab57f2bf0112d89d9355fa458a04deb8309c7e78449767429049971793c040e51412060681218a51c671ac6086dba2fa4 + HEAD_REF main + PATCHES + fix-tests.patch +) + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH_SIMD + REPO intel/x86-simd-sort + REF 0631a88763a4a0a4c9e84d5eeb0ec5d36053730b + SHA512 cd44796fc10e13004932be05d5bee46070e061bcc429c7ee8d9e11520e18c45bdec2f4fcd3555d9769891a763e151b0a0a4c00385ea30f24c99da1c65d736e39 + HEAD_REF main +) + +file(COPY "${SOURCE_PATH_SIMD}/" DESTINATION "${SOURCE_PATH}/numpy/core/src/npysort/x86-simd-sort") + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH_MESON_NUMPY + REPO numpy/meson + REF 4e370ca8ab73c07f7b84abe8a4b937caace050a4 + SHA512 dec6e3b9428f95790f85a863778227a73e4f432f8f54e87d61fd6499b5a0723c59a334fcaf880afd59ae50c924d8f2cfa340a143f752cb39f976c731ca0ea123 + HEAD_REF main +) + +file(COPY "${SOURCE_PATH_MESON_NUMPY}/mesonbuild/modules/features" DESTINATION "${MESON_DIR}/mesonbuild/modules") + +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH_SVML + REPO numpy/SVML + REF 1b21e453f6b1ba6a6aca392b1d810d9d41576123 + SHA512 c9ea7bf9effbf5750750ddfdfc7db3d95614ed176bd4540d68eddb90a15f819510e9564c9454ef34be02dd6a8e48a7f292a70cb5b63c25c3d1c450a8e3b77d35 + HEAD_REF main +) + +file(COPY "${SOURCE_PATH_SVML}/" DESTINATION "${SOURCE_PATH}/numpy/core/src/umath/svml") + +vcpkg_replace_string("${SOURCE_PATH}/meson.build" "py.dependency()" "dependency('python-3.${PYTHON3_VERSION_MINOR}', method : 'pkg-config')") + +#debug replacement +vcpkg_replace_string("${SOURCE_PATH}/numpy/_build_utils/tempita.py" "import argparse" "import argparse\nprint(sys.executable)\nimport os\n +print(os.environ['PATH'])") + +if(VCPKG_TARGET_IS_WINDOWS AND VCPKG_CROSSCOMPILING AND VCPKG_TARGET_ARCHITECTURE MATCHES "arm") + set(opts + ADDITIONAL_PROPERTIES + "longdouble_format = 'IEEE_DOUBLE_LE'" + ) +endif() + +vcpkg_generate_meson_cmd_args( + OUTPUT meson_opts + CONFIG RELEASE + LANGUAGES C;CXX + ${opts} +) + +z_vcpkg_setup_pkgconfig_path(CONFIG "RELEASE") + +list(APPEND meson_opts "--python.platlibdir" "${CURRENT_INSTALLED_DIR}/lib") +list(JOIN meson_opts "\",\"" meson_opts) + +set(build_dir "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel") +file(REMOVE_RECURSE "${build_dir}") +file(MAKE_DIRECTORY "${build_dir}") + +vcpkg_python_build_and_install_wheel( + SOURCE_PATH "${SOURCE_PATH}" + OPTIONS + --config-json "{\"setup-args\" : [\"-Dblas=blas\", \"-Dlapack=lapack\", \"-Duse-ilp64=false\", \"-Dallow-noblas=true\", \"${meson_opts}\" ], \"build-dir\" : \"${build_dir}\" }" +) + + +# message(STATUS "PATH is: '$ENV{PATH}'") +# vcpkg_configure_meson( + # SOURCE_PATH "${SOURCE_PATH}" + # OPTIONS + # -Dblas=blas + # -Dlapack=lapack + # #-Duse-ilp64=true + # ADDITIONAL_BINARIES + # cython=['${VCPKG_CYTHON}'] + # python3=['${VCPKG_PYTHON3}'] + # python=['${VCPKG_PYTHON3}'] + # ${opts} + # ) +# message(STATUS "PATH is: '$ENV{PATH}'") +# vcpkg_install_meson() +# message(STATUS "PATH is: '$ENV{PATH}'") +# vcpkg_fixup_pkgconfig() + +# #E:\vcpkg_folders\numpy\packages\numpy_arm64-windows-release\tools\python3\Lib\site-packages\numpy\__config__.py +# # "path": r"E:/vcpkg_folders/numpy/installed/x64-windows-release/tools/python3/python.exe", and full paths to compilers +# #"commands": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.39.33519/bin/Hostx64/arm64/cl.exe, -DWIN32, -D_WINDOWS, -W3, -utf-8, -MP, -MD, -O2, -Oi, -Gy, -DNDEBUG, -Z7", + +find_program(REAL_PYTHON3_LOCATION NAMES python${PYTHON3_VERSION_MAJOR}.${PYTHON3_VERSION_MINOR} python${PYTHON3_VERSION_MAJOR} python PATHS "${CURRENT_HOST_INSTALLED_DIR}/tools/python3" PATH_SUFFIXES "bin" NO_DEFAULT_PATH) +file(TO_NATIVE_PATH "${REAL_PYTHON3_LOCATION}" REAL_PYTHON3_LOCATION) + + +set(subdir "${CURRENT_PACKAGES_DIR}/${PYTHON3_SITE}/") +set(pyfile "${subdir}/numpy/__config__.py") +file(READ "${pyfile}" contents) +string(REPLACE "${CURRENT_INSTALLED_DIR}" "$(prefix)" contents "${contents}") +string(REPLACE "r\"${REAL_PYTHON3_LOCATION}\"" "sys.executable" contents "${contents}") +file(WRITE "${pyfile}" "import sys\n${contents}") + + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE.txt") + +vcpkg_python_test_import(MODULE "numpy") diff --git a/ports/numpy/vcpkg.json b/ports/numpy/vcpkg.json new file mode 100644 index 00000000000000..493b0e3528e67b --- /dev/null +++ b/ports/numpy/vcpkg.json @@ -0,0 +1,36 @@ +{ + "name": "numpy", + "version": "1.26.4", + "description": "The fundamental package for scientific computing with Python.", + "homepage": "https://www.numpy.org/", + "license": "BSD-3-Clause", + "dependencies": [ + "blas", + "lapack", + { + "name": "py-cython", + "host": true + }, + { + "name": "py-meson", + "host": true + }, + { + "name": "py-setuptools", + "host": true + }, + "python3", + { + "name": "python3", + "host": true + }, + { + "name": "vcpkg-python-scripts", + "host": true + }, + { + "name": "vcpkg-tool-meson", + "host": true + } + ] +} diff --git a/ports/opencv3/portfile.cmake b/ports/opencv3/portfile.cmake index a9bd5c140c506e..9d6aab0cfb41c5 100644 --- a/ports/opencv3/portfile.cmake +++ b/ports/opencv3/portfile.cmake @@ -126,8 +126,6 @@ if("python" IN_LIST FEATURES) if (VCPKG_LIBRARY_LINKAGE STREQUAL static AND VCPKG_TARGET_IS_WINDOWS) message(WARNING "The python module is currently unsupported on Windows when building static OpenCV libraries") else() - x_vcpkg_get_python_packages(PYTHON_VERSION "3" PACKAGES numpy OUT_PYTHON_VAR "PYTHON3") - set(ENV{PYTHON} "${PYTHON3}") set(BUILD_opencv_python3 ON) set(WITH_PYTHON ON) endif() diff --git a/ports/opencv3/vcpkg.json b/ports/opencv3/vcpkg.json index 64eb00a625ee2d..1106b918a6bcd7 100644 --- a/ports/opencv3/vcpkg.json +++ b/ports/opencv3/vcpkg.json @@ -229,6 +229,7 @@ "python": { "description": "Python wrapper support for opencv", "dependencies": [ + "numpy", { "name": "opencv3", "default-features": false, diff --git a/ports/opencv4/portfile.cmake b/ports/opencv4/portfile.cmake index 4b25002076077a..1676543db9f42f 100644 --- a/ports/opencv4/portfile.cmake +++ b/ports/opencv4/portfile.cmake @@ -150,8 +150,6 @@ if("python" IN_LIST FEATURES) if (VCPKG_LIBRARY_LINKAGE STREQUAL static AND VCPKG_TARGET_IS_WINDOWS) message(WARNING "The python module is currently unsupported on Windows when building static OpenCV libraries") else() - x_vcpkg_get_python_packages(PYTHON_VERSION "3" PACKAGES numpy OUT_PYTHON_VAR "PYTHON3") - set(ENV{PYTHON} "${PYTHON3}") set(BUILD_opencv_python3 ON) set(WITH_PYTHON ON) endif() diff --git a/ports/opencv4/vcpkg.json b/ports/opencv4/vcpkg.json index 5c90ed18d22106..07439264170ec1 100644 --- a/ports/opencv4/vcpkg.json +++ b/ports/opencv4/vcpkg.json @@ -301,6 +301,7 @@ "python": { "description": "Python wrapper support for opencv", "dependencies": [ + "numpy", "python3" ] }, diff --git a/ports/py-build/portfile.cmake b/ports/py-build/portfile.cmake new file mode 100644 index 00000000000000..f34bd7f84affff --- /dev/null +++ b/ports/py-build/portfile.cmake @@ -0,0 +1,13 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO pypa/build + REF cd06da25481b9a610f846fa60cb67b5a5fa9a051 + SHA512 02e7021ec3ddd2fa3d5aa3b34193e858ba35d04d36244f1db2e84efbc37fc1f0e118d8ecd32d54ee1feb276e79d753f69979f430ebec7b3e0a0e85e144d1b692 + HEAD_REF main +) + +file(COPY "${SOURCE_PATH}/src/build" DESTINATION "${CURRENT_PACKAGES_DIR}/${PYTHON3_SITE}") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) diff --git a/ports/py-build/vcpkg.json b/ports/py-build/vcpkg.json new file mode 100644 index 00000000000000..a699b3364a89b6 --- /dev/null +++ b/ports/py-build/vcpkg.json @@ -0,0 +1,11 @@ +{ + "name": "py-build", + "version": "0.10.0", + "port-version": 1, + "description": "A simple, correct Python build frontend ", + "homepage": "https://python-build.readthedocs.io", + "license": "MIT", + "dependencies": [ + "python3" + ] +} diff --git a/ports/py-cython/portfile.cmake b/ports/py-cython/portfile.cmake new file mode 100644 index 00000000000000..96be85858318e9 --- /dev/null +++ b/ports/py-cython/portfile.cmake @@ -0,0 +1,18 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO cython/cython + REF ${VERSION} + SHA512 585d3fe810ace55278fcc6ea4508b3b5259320f92998cd688da787cd5f88ac5fc2467025f20da6d968969eb3296ae9c517136d24a4dbb475441271227968f6be + HEAD_REF main +) + +vcpkg_python_build_and_install_wheel(SOURCE_PATH "${SOURCE_PATH}") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE.txt") + +if(NOT VCPKG_TARGET_IS_WINDOWS) + vcpkg_copy_tools(TOOL_NAMES cygdb cython cythonize DESTINATION "${CURRENT_PACKAGES_DIR}/${VCPKG_PYTHON3_SCRIPTS}" AUTO_CLEAN) +endif() + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) +set(VCPKG_POLICY_MISMATCHED_NUMBER_OF_BINARIES enabled) \ No newline at end of file diff --git a/ports/py-cython/vcpkg.json b/ports/py-cython/vcpkg.json new file mode 100644 index 00000000000000..ac4c3efa2ae597 --- /dev/null +++ b/ports/py-cython/vcpkg.json @@ -0,0 +1,15 @@ +{ + "name": "py-cython", + "version": "3.0.5", + "description": "Cython is a Python compiler that makes writing C extensions for Python as easy as Python itself. Cython is based on Pyrex, but supports more cutting edge functionality and optimizations.", + "homepage": "https://cython.org/", + "license": "Apache-2.0", + "dependencies": [ + "py-setuptools", + "python3", + { + "name": "vcpkg-python-scripts", + "host": true + } + ] +} diff --git a/ports/py-flit-core/portfile.cmake b/ports/py-flit-core/portfile.cmake new file mode 100644 index 00000000000000..eb6a7224c58d59 --- /dev/null +++ b/ports/py-flit-core/portfile.cmake @@ -0,0 +1,29 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO pypa/flit + REF c8ae08dc9f3f067feeec9dfd2c443db592f4d3d1 + SHA512 4f561b142bb97432d7815f8e0579b562ce5c7eec666f36d52f088adcdd1846337b89ca090ae9849feafc6beb49f7b59fdd11c2b4c730d7b8337729c76cd346d3 + HEAD_REF main +) + +vcpkg_get_vcpkg_installed_python(VCPKG_PYTHON3_EXECUTABLE) +message(STATUS "Building dist with '${VCPKG_PYTHON3_EXECUTABLE}'!") +execute_process(COMMAND "${VCPKG_PYTHON3_EXECUTABLE}" "${SOURCE_PATH}/flit_core/build_dists.py" + COMMAND_ERROR_IS_FATAL ANY + #WORKING_DIRECTORY "${wheeldir}" +) + +file(GLOB wheel "${SOURCE_PATH}/flit_core/dist/*.whl") + +file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/${PYTHON3_SITE}) +message(STATUS "Installing wheel!") +execute_process(COMMAND "${VCPKG_PYTHON3_EXECUTABLE}" "${SOURCE_PATH}/flit_core/bootstrap_install.py" "${wheel}" -i "${CURRENT_PACKAGES_DIR}/${PYTHON3_SITE}" + COMMAND_ERROR_IS_FATAL ANY + #WORKING_DIRECTORY "${wheeldir}" +) +message(STATUS "Finished installing wheel!") +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +vcpkg_python_test_import(MODULE "flit_core") diff --git a/ports/py-flit-core/vcpkg.json b/ports/py-flit-core/vcpkg.json new file mode 100644 index 00000000000000..6b9a9b74d38ab3 --- /dev/null +++ b/ports/py-flit-core/vcpkg.json @@ -0,0 +1,19 @@ +{ + "name": "py-flit-core", + "version": "3.9.0", + "port-version": 1, + "description": "Simplified packaging of Python modules", + "homepage": "https://flit.pypa.io", + "license": "BSD-3-Clause", + "dependencies": [ + { + "name": "python3", + "host": true, + "default-features": false + }, + { + "name": "python3", + "default-features": false + } + ] +} diff --git a/ports/py-gpep517/portfile.cmake b/ports/py-gpep517/portfile.cmake new file mode 100644 index 00000000000000..5c29225c3c913e --- /dev/null +++ b/ports/py-gpep517/portfile.cmake @@ -0,0 +1,16 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO projg2/gpep517 + REF v${VERSION} + SHA512 fcd7cb0f98003a8ecb9976cffe3d4140b16e537dbfcfa8e8416569cd7e38e8e9ab359b35c1e22b830dc2711b3c07f8e3113c0f6b73d415ce63ad5f7d76f180c6 + HEAD_REF main +) + +file(COPY "${SOURCE_PATH}/gpep517" DESTINATION "${CURRENT_PACKAGES_DIR}/${PYTHON3_SITE}") +# TODO: python3 -m compileall "$pkgdir/$sitedir" + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/COPYING") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +#vcpkg_python_test_import(MODULE "gpep517") diff --git a/ports/py-gpep517/vcpkg.json b/ports/py-gpep517/vcpkg.json new file mode 100644 index 00000000000000..bff6dc95f83c7b --- /dev/null +++ b/ports/py-gpep517/vcpkg.json @@ -0,0 +1,22 @@ +{ + "name": "py-gpep517", + "version": "16", + "description": "Python package builder and installer for non-pip-centric world", + "homepage": "https://github.com/projg2/gpep517", + "license": "MIT", + "dependencies": [ + { + "name": "py-flit-core", + "host": true + }, + { + "name": "py-installer", + "host": true + }, + { + "name": "python3", + "host": true, + "default-features": false + } + ] +} diff --git a/ports/py-installer/portfile.cmake b/ports/py-installer/portfile.cmake new file mode 100644 index 00000000000000..688610d48a3ac8 --- /dev/null +++ b/ports/py-installer/portfile.cmake @@ -0,0 +1,15 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO pypa/installer + REF b1d39180f8548820d09ce992dfadff0a42242c48 + SHA512 09beb22bde94f2a5ec8c164d16af6322d9d05c6ec98507538070a9ab4f161802fc068c5e31540f4adf92c574488f3e0f94dc31e3bf58c09eac4096a8096bf873 + HEAD_REF main +) + +file(COPY "${SOURCE_PATH}/src/installer" DESTINATION "${CURRENT_PACKAGES_DIR}/${PYTHON3_SITE}") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +vcpkg_python_test_import(MODULE "installer") diff --git a/ports/py-installer/vcpkg.json b/ports/py-installer/vcpkg.json new file mode 100644 index 00000000000000..4a38fad0608b61 --- /dev/null +++ b/ports/py-installer/vcpkg.json @@ -0,0 +1,14 @@ +{ + "name": "py-installer", + "version": "0.7.0", + "port-version": 1, + "description": "A low-level library for installing from a Python wheel distribution.", + "homepage": "https://installer.pypa.io", + "license": "MIT", + "dependencies": [ + { + "name": "python3", + "default-features": false + } + ] +} diff --git a/ports/py-meson/portfile.cmake b/ports/py-meson/portfile.cmake new file mode 100644 index 00000000000000..2ca4c43b72d427 --- /dev/null +++ b/ports/py-meson/portfile.cmake @@ -0,0 +1,26 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO mesonbuild/meson-python + REF ${VERSION} + SHA512 f1fce89bb0a3d279b9900c4ecec78e5f24da92d72f64ebf6c27648b4201a75a65204c3fac08aaa3e8d70dbeef245c3235e39994c7c0b9cba27c0df528211c7f7 + HEAD_REF main +) + +#vcpkg_python_build_and_install_wheel(SOURCE_PATH "${SOURCE_PATH}" OPTIONS -x) + +set(VCPKG_BUILD_TYPE release) + +vcpkg_configure_meson(SOURCE_PATH "${SOURCE_PATH}") +vcpkg_install_meson() + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +file(MAKE_DIRECTORY "${CURRENT_PACKAGES_DIR}/tools/python3/Lib") +file(RENAME "${CURRENT_PACKAGES_DIR}/Lib/site-packages/" "${CURRENT_PACKAGES_DIR}/${PYTHON3_SITE}/") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/Lib") + +vcpkg_python_test_import(MODULE "mesonpy") + +configure_file("${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" "${CURRENT_PACKAGES_DIR}/share/${PORT}/vcpkg-port-config.cmake" @ONLY) diff --git a/ports/py-meson/vcpkg-port-config.cmake b/ports/py-meson/vcpkg-port-config.cmake new file mode 100644 index 00000000000000..d12bb437507924 --- /dev/null +++ b/ports/py-meson/vcpkg-port-config.cmake @@ -0,0 +1,2 @@ +# Overwrite builtin scripts +include("${CMAKE_CURRENT_LIST_DIR}/../vcpkg-tool-meson/vcpkg-port-config.cmake") diff --git a/ports/py-meson/vcpkg.json b/ports/py-meson/vcpkg.json new file mode 100644 index 00000000000000..68b4c272327ff6 --- /dev/null +++ b/ports/py-meson/vcpkg.json @@ -0,0 +1,30 @@ +{ + "name": "py-meson", + "version": "0.15.0", + "description": "Meson PEP 517 Python build backend", + "homepage": "https://github.com/mesonbuild/meson-python", + "license": "MIT", + "dependencies": [ + { + "name": "py-pyproject-metadata", + "host": true + }, + { + "name": "py-setuptools", + "host": true + }, + { + "name": "py-tomli", + "host": true + }, + { + "name": "python3", + "default-features": false + }, + "vcpkg-python-scripts", + { + "name": "vcpkg-tool-meson", + "host": true + } + ] +} diff --git a/ports/py-packaging/portfile.cmake b/ports/py-packaging/portfile.cmake new file mode 100644 index 00000000000000..5d56aa7e6202fc --- /dev/null +++ b/ports/py-packaging/portfile.cmake @@ -0,0 +1,15 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO pypa/packaging + REF ${VERSION} + SHA512 bfffe6e677f3bdcaee87053caf5840396b694dfa771c37680282d70d62b6d928dae399a2da7f1a9ea2af482f1b61b353da0c6902d80ad932535995a8b21baabc + HEAD_REF main +) + +vcpkg_python_build_and_install_wheel(SOURCE_PATH "${SOURCE_PATH}") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +vcpkg_python_test_import(MODULE "packaging") diff --git a/ports/py-packaging/vcpkg.json b/ports/py-packaging/vcpkg.json new file mode 100644 index 00000000000000..45efccb4d44542 --- /dev/null +++ b/ports/py-packaging/vcpkg.json @@ -0,0 +1,13 @@ +{ + "name": "py-packaging", + "version": "24.0", + "description": "Core utilities for Python packages", + "homepage": "https://packaging.pypa.io/", + "license": "MIT", + "dependencies": [ + { + "name": "vcpkg-python-scripts", + "host": true + } + ] +} diff --git a/ports/py-pyproject-metadata/portfile.cmake b/ports/py-pyproject-metadata/portfile.cmake new file mode 100644 index 00000000000000..510b0d46c684a3 --- /dev/null +++ b/ports/py-pyproject-metadata/portfile.cmake @@ -0,0 +1,15 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO FFY00/python-pyproject-metadata + REF ${VERSION} + SHA512 8d8c7839a318acce64b0cf15b3adbc49c2f309b453135b55f2d7942967ba8bbd4f85696d0f3c651e1246c50e33657e6108f0f05ac20b4a9162cdb2875269c548 + HEAD_REF main +) + +vcpkg_python_build_and_install_wheel(SOURCE_PATH "${SOURCE_PATH}") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +vcpkg_python_test_import(MODULE "pyproject_metadata") diff --git a/ports/py-pyproject-metadata/vcpkg.json b/ports/py-pyproject-metadata/vcpkg.json new file mode 100644 index 00000000000000..04e442093b291a --- /dev/null +++ b/ports/py-pyproject-metadata/vcpkg.json @@ -0,0 +1,14 @@ +{ + "name": "py-pyproject-metadata", + "version": "0.8.0", + "description": "PEP 621 metadata parsing", + "homepage": "https://pep621.readthedocs.io/", + "license": "MIT", + "dependencies": [ + { + "name": "py-setuptools", + "host": true + }, + "vcpkg-python-scripts" + ] +} diff --git a/ports/py-setuptools/fix-prefix.patch b/ports/py-setuptools/fix-prefix.patch new file mode 100644 index 00000000000000..3fa6274d6d87e3 --- /dev/null +++ b/ports/py-setuptools/fix-prefix.patch @@ -0,0 +1,76 @@ +diff --git a/setuptools/_distutils/command/build_ext.py b/setuptools/_distutils/command/build_ext.py +index fbeec342c0..ff28ab2df4 100644 +--- a/setuptools/_distutils/command/build_ext.py ++++ b/setuptools/_distutils/command/build_ext.py +@@ -186,6 +186,14 @@ class build_ext(Command): + elif isinstance(self.rpath, str): + self.rpath = self.rpath.split(os.pathsep) + ++ prefix = os.path.normpath(sys.base_prefix) ++ vcpkg_prefix = os.path.dirname(os.path.dirname(prefix)) # Add debug compile? ++ ++ if self.debug: ++ self.library_dirs.append(os.path.join(vcpkg_prefix, 'debug', 'lib')) ++ else: ++ self.library_dirs.append(os.path.join(vcpkg_prefix, 'lib')) ++ + # for extensions under windows use different directories + # for Release and Debug builds. + # also Python's library directory must be appended to library_dirs +@@ -193,9 +201,9 @@ class build_ext(Command): + # the 'libs' directory is for binary installs - we assume that + # must be the *native* platform. But we don't really support + # cross-compiling via a binary install anyway, so we let it go. +- self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs')) +- if sys.base_exec_prefix != sys.prefix: # Issue 16116 +- self.library_dirs.append(os.path.join(sys.base_exec_prefix, 'libs')) ++ # self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs')) ++ # if sys.base_exec_prefix != sys.prefix: # Issue 16116 ++ # self.library_dirs.append(os.path.join(sys.base_exec_prefix, 'libs')) + if self.debug: + self.build_temp = os.path.join(self.build_temp, "Debug") + else: +@@ -243,9 +243,10 @@ class build_ext(Command): + else: + # win-amd64 + suffix = self.plat_name[4:] +- new_lib = os.path.join(sys.exec_prefix, 'PCbuild') +- if suffix: +- new_lib = os.path.join(new_lib, suffix) ++ if self.debug: ++ new_lib = os.path.join(sys.base_prefix, '../../debug/lib') ++ else: ++ new_lib = os.path.join(sys.base_prefix, '../../lib') + self.library_dirs.append(new_lib) + + # For extensions under Cygwin, Python's library directory must be +diff --git a/setuptools/_distutils/sysconfig.py b/setuptools/_distutils/sysconfig.py +index a40a7231b3..7194f440b4 100644 +--- a/setuptools/_distutils/sysconfig.py ++++ b/setuptools/_distutils/sysconfig.py +@@ -190,18 +190,21 @@ def _get_python_inc_from_config(plat_specific, spec_prefix): + def _get_python_inc_posix_prefix(prefix): + implementation = 'pypy' if IS_PYPY else 'python' + python_dir = implementation + get_python_version() + build_flags +- return os.path.join(prefix, "include", python_dir) ++ vcpkg_prefix = os.path.dirname(os.path.dirname(prefix)) ++ return os.path.join(vcpkg_prefix, "include", python_dir) + + + def _get_python_inc_nt(prefix, spec_prefix, plat_specific): ++ vcpkg_prefix = os.path.dirname(os.path.dirname(prefix)) ++ python_dir = 'python' + get_python_version() + if python_build: + # Include both include dirs to ensure we can find pyconfig.h + return ( +- os.path.join(prefix, "include") ++ os.path.join(vcpkg_prefix, "include", python_dir) + + os.path.pathsep +- + os.path.dirname(sysconfig.get_config_h_filename()) ++ + os.path.join(vcpkg_prefix,os.path.dirname(sysconfig.get_config_h_filename())) + ) +- return os.path.join(prefix, "include") ++ return os.path.join(vcpkg_prefix, "include", python_dir) + + + # allow this behavior to be monkey-patched. Ref pypa/distutils#2. diff --git a/ports/py-setuptools/portfile.cmake b/ports/py-setuptools/portfile.cmake new file mode 100644 index 00000000000000..92445facfeb16f --- /dev/null +++ b/ports/py-setuptools/portfile.cmake @@ -0,0 +1,16 @@ +vcpkg_from_pythonhosted( + OUT_SOURCE_PATH SOURCE_PATH + PACKAGE_NAME setuptools + VERSION ${VERSION} + SHA512 81f4a5184976a0d4aa070261bb56458c54ec6a479786fa469e98cb336e9a1691b281ae771abe41bc5398fac15b2dd039c07cf014ee00572f46908ce6830fcb6a + PATCHES + fix-prefix.patch +) + +vcpkg_python_build_and_install_wheel(SOURCE_PATH "${SOURCE_PATH}") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +vcpkg_python_test_import(MODULE "setuptools") diff --git a/ports/py-setuptools/vcpkg.json b/ports/py-setuptools/vcpkg.json new file mode 100644 index 00000000000000..c63a632b01459e --- /dev/null +++ b/ports/py-setuptools/vcpkg.json @@ -0,0 +1,15 @@ +{ + "name": "py-setuptools", + "version": "69.5.1", + "description": "Official project repository for the Setuptools build system ", + "homepage": "https://pypi.org/project/setuptools/", + "license": "MIT", + "dependencies": [ + { + "name": "py-packaging", + "host": true + }, + "py-wheel", + "vcpkg-python-scripts" + ] +} diff --git a/ports/py-tomli/portfile.cmake b/ports/py-tomli/portfile.cmake new file mode 100644 index 00000000000000..d74d59e64b5d0c --- /dev/null +++ b/ports/py-tomli/portfile.cmake @@ -0,0 +1,15 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO hukkin/tomli + REF 36ef51d6a5a55e0eca077b58695390d041061bd4 + SHA512 fe47a06dddad298dd64975f7618e7c8d03de83a8f4b44da868abd78e062138ad9df18fbc810e55e4cb240fac2c3c023b18ee4e87cab5e93cd776b34fac497bdf + HEAD_REF main +) + +vcpkg_python_build_and_install_wheel(SOURCE_PATH "${SOURCE_PATH}") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +vcpkg_python_test_import(MODULE "tomli") diff --git a/ports/py-tomli/vcpkg.json b/ports/py-tomli/vcpkg.json new file mode 100644 index 00000000000000..eaedfb0d5b12a0 --- /dev/null +++ b/ports/py-tomli/vcpkg.json @@ -0,0 +1,10 @@ +{ + "name": "py-tomli", + "version": "2.0.1", + "description": "A simple, correct Python build frontend ", + "homepage": "py-build.readthedocs.io/en/stable/", + "license": "MIT", + "dependencies": [ + "vcpkg-python-scripts" + ] +} diff --git a/ports/py-wheel/portfile.cmake b/ports/py-wheel/portfile.cmake new file mode 100644 index 00000000000000..37eb70ae96f399 --- /dev/null +++ b/ports/py-wheel/portfile.cmake @@ -0,0 +1,19 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO pypa/wheel + REF ${VERSION} + SHA512 16e556272f6d47d33f2be39efc3c0882c8da90aa2945ec3574105df21ed2cb090390f7736d05a319a008f4842b3f109abea5e7607064ee80e663d499c2e67308 + HEAD_REF main +) + +vcpkg_python_build_and_install_wheel(SOURCE_PATH "${SOURCE_PATH}") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE.txt") + +if(NOT VCPKG_TARGET_IS_WINDOWS) + vcpkg_copy_tools(TOOL_NAMES wheel DESTINATION "${CURRENT_PACKAGES_DIR}/tools/python3" AUTO_CLEAN) +endif() + +set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled) + +vcpkg_python_test_import(MODULE "wheel") diff --git a/ports/py-wheel/vcpkg.json b/ports/py-wheel/vcpkg.json new file mode 100644 index 00000000000000..f8f2e0fe94a41a --- /dev/null +++ b/ports/py-wheel/vcpkg.json @@ -0,0 +1,11 @@ +{ + "name": "py-wheel", + "version": "0.43.0", + "description": "The official binary distribution format for Python", + "homepage": "https://github.com/pypa/wheel", + "license": "MIT", + "dependencies": [ + "py-gpep517", + "vcpkg-python-scripts" + ] +} diff --git a/ports/python3/0018-fix-sysconfig-include.patch b/ports/python3/0018-fix-sysconfig-include.patch index 1efdb5a8a72cdd..62c6672aad4d44 100644 --- a/ports/python3/0018-fix-sysconfig-include.patch +++ b/ports/python3/0018-fix-sysconfig-include.patch @@ -13,3 +13,34 @@ index ebe371182..e351df7da 100644 'scripts': '{base}/Scripts', 'data': '{base}', }, +@@ -90,8 +90,8 @@ _INSTALL_SCHEMES = { + 'platstdlib': '{base}/Lib', + 'purelib': '{base}/Lib/site-packages', + 'platlib': '{base}/Lib/site-packages', +- 'include': '{installed_base}/Include', +- 'platinclude': '{installed_base}/Include', ++ 'include': '{installed_base}/../../include/python{py_version_short}{abiflags}', ++ 'platinclude': '{installed_base}../../Include/python{py_version_short}{abiflags}', + 'scripts': '{base}/Scripts', + 'data': '{base}', + }, +diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py +index c90b85b872..eb9e5919b3 100644 +--- a/Lib/distutils/command/build_ext.py ++++ b/Lib/distutils/command/build_ext.py +@@ -211,9 +211,12 @@ class build_ext(Command): + else: + # win-amd64 + suffix = self.plat_name[4:] +- new_lib = os.path.join(sys.exec_prefix, 'PCbuild') +- if suffix: +- new_lib = os.path.join(new_lib, suffix) ++ if self.debug: ++ new_lib = os.path.join(sys.base_prefix, '../../debug/lib') ++ else: ++ new_lib = os.path.join(sys.base_prefix, '../../lib') ++ #if suffix: ++ #new_lib = os.path.join(new_lib, suffix) + self.library_dirs.append(new_lib) + + # For extensions under Cygwin, Python's library directory must be diff --git a/ports/python3/0019-fix-ssl-linkage.patch b/ports/python3/0019-fix-ssl-linkage.patch new file mode 100644 index 00000000000000..3b6f922177c83b --- /dev/null +++ b/ports/python3/0019-fix-ssl-linkage.patch @@ -0,0 +1,22 @@ +diff --git a/configure.ac b/configure.ac +index ef899b881d..9ed1836608 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -6712,7 +6712,7 @@ done + + # check if OpenSSL libraries work as expected + WITH_SAVE_ENV([ +- LIBS="$LIBS $OPENSSL_LIBS" ++ LIBS="$OPENSSL_LIBS $LIBS" + CFLAGS="$CFLAGS $OPENSSL_INCLUDES" + LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH" + +@@ -6737,7 +6737,7 @@ WITH_SAVE_ENV([ + ]) + + WITH_SAVE_ENV([ +- LIBS="$LIBS $LIBCRYPTO_LIBS" ++ LIBS="$LIBCRYPTO_LIBS $LIBS" + CFLAGS="$CFLAGS $OPENSSL_INCLUDES" + LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH" + diff --git a/ports/python3/portfile.cmake b/ports/python3/portfile.cmake index 19985c80d6ce9e..92a2a4ad583dfe 100644 --- a/ports/python3/portfile.cmake +++ b/ports/python3/portfile.cmake @@ -3,6 +3,15 @@ if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic AND VCPKG_CRT_LINKAGE STREQUAL static set(VCPKG_LIBRARY_LINKAGE static) endif() +if("extensions" IN_LIST FEATURES) + if(VCPKG_TARGET_IS_WINDOWS) + vcpkg_check_linkage(ONLY_DYNAMIC_LIBRARY) + endif() + set(PYTHON_HAS_EXTENSIONS ON) +else() + set(PYTHON_HAS_EXTENSIONS OFF) +endif() + if(NOT VCPKG_HOST_IS_WINDOWS) message(WARNING "${PORT} currently requires the following programs from the system package manager: autoconf automake autoconf-archive @@ -35,6 +44,7 @@ set(PATCHES 0015-dont-use-WINDOWS-def.patch 0016-undup-ffi-symbols.patch # Required for lld-link. 0018-fix-sysconfig-include.patch + 0019-fix-ssl-linkage.patch ) if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") @@ -257,13 +267,18 @@ else() "--without-ensurepip" "--with-suffix=" "--with-system-expat" - "--without-readline" "--disable-test-modules" ) if(VCPKG_TARGET_IS_OSX) list(APPEND OPTIONS "LIBS=-liconv -lintl") endif() + if("readline" IN_LIST FEATURES) + list(APPEND OPTIONS "--with-readline") + else() + list(APPEND OPTIONS "--without-readline") + endif() + # The version of the build Python must match the version of the cross compiled host Python. # https://docs.python.org/3/using/configure.html#cross-compiling-options if(VCPKG_CROSSCOMPILING) @@ -384,10 +399,11 @@ else() file(COPY_FILE "${CURRENT_PACKAGES_DIR}/tools/python3/python3.${PYTHON_VERSION_MINOR}" "${CURRENT_PACKAGES_DIR}/tools/python3/python3") endif() -configure_file("${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" "${CURRENT_PACKAGES_DIR}/share/python3/vcpkg-port-config.cmake" @ONLY) +configure_file("${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" "${CURRENT_PACKAGES_DIR}/share/${PORT}/vcpkg-port-config.cmake" @ONLY) # For testing block() set(CURRENT_HOST_INSTALLED_DIR "${CURRENT_PACKAGES_DIR}") vcpkg_get_vcpkg_installed_python(VCPKG_PYTHON3) -endblocK() \ No newline at end of file + vcpkg_python_test_import(PYTHON_EXECUTABLE "${VCPKG_PYTHON3}" MODULES "sys" "ctypes" "ssl") +endblock() diff --git a/ports/python3/vcpkg-port-config.cmake b/ports/python3/vcpkg-port-config.cmake index c474d428b17ee3..781a649db2329c 100644 --- a/ports/python3/vcpkg-port-config.cmake +++ b/ports/python3/vcpkg-port-config.cmake @@ -1,7 +1,9 @@ +include_guard(GLOBAL) set(PYTHON3_VERSION "@VERSION@") set(PYTHON3_VERSION_MAJOR "@PYTHON_VERSION_MAJOR@") set(PYTHON3_VERSION_MINOR "@PYTHON_VERSION_MINOR@") set(PYTHON3_INCLUDE "include/python${PYTHON3_VERSION_MAJOR}.${PYTHON3_VERSION_MINOR}") +set(PYTHON3_HAS_EXTENSIONS "@PYTHON_HAS_EXTENSIONS@") set(site_base "") if(VCPKG_TARGET_IS_WINDOWS) set(site_base "tools/python${PYTHON3_VERSION_MAJOR}/Lib") @@ -11,3 +13,6 @@ endif() set(PYTHON3_SITE "${site_base}/site-packages") include("${CURRENT_HOST_INSTALLED_DIR}/share/vcpkg-get-python/vcpkg-port-config.cmake") +if(PYTHON3_HAS_EXTENSIONS) + include("${CURRENT_HOST_INSTALLED_DIR}/share/vcpkg-python-test-import/vcpkg-port-config.cmake") +endif() \ No newline at end of file diff --git a/ports/python3/vcpkg.json b/ports/python3/vcpkg.json index 0af7f3bfd83633..c0ae8118e1f353 100644 --- a/ports/python3/vcpkg.json +++ b/ports/python3/vcpkg.json @@ -1,48 +1,35 @@ { "name": "python3", "version": "3.11.8", - "port-version": 4, + "port-version": 5, "description": "The Python programming language", "homepage": "https://github.com/python/cpython", "license": "Python-2.0", "supports": "!uwp & !mingw", "dependencies": [ - { - "name": "bzip2", - "platform": "!(windows & static)" - }, - "expat", { "name": "gettext", "platform": "osx" }, - { - "name": "libffi", - "platform": "!(windows & static)" - }, { "name": "libiconv", "platform": "osx" }, - { - "name": "liblzma", - "platform": "!(windows & static)" - }, { "name": "libuuid", "platform": "!osx & !windows" }, - { - "name": "openssl", - "platform": "!(windows & static)" - }, { "name": "python3", - "host": true + "host": true, + "default-features": false }, { - "name": "sqlite3", - "platform": "!(windows & static)" + "name": "python3", + "features": [ + "extensions" + ], + "platform": "!windows" }, { "name": "vcpkg-get-python", @@ -55,9 +42,53 @@ }, "zlib" ], + "default-features": [ + { + "name": "extensions", + "platform": "!(staticcrt & windows)" + } + ], "features": { "deprecated-win7-support": { "description": "Deprecated support for the Windows 7 platform -- may be removed at any time." + }, + "extensions": { + "description": "Allow the build and usage of python extensions. On windows this requires python to be a dynamic library!", + "supports": "!(staticcrt & windows)", + "dependencies": [ + { + "name": "bzip2", + "default-features": false + }, + { + "name": "expat", + "default-features": false + }, + { + "name": "libffi", + "default-features": false + }, + { + "name": "liblzma", + "default-features": false + }, + { + "name": "openssl", + "default-features": false + }, + { + "name": "sqlite3", + "default-features": false + }, + { + "name": "vcpkg-python-test-import", + "host": true + } + ] + }, + "readline": { + "description": "Build with readline. Requires system readline to be installed", + "supports": "!windows" } } } diff --git a/ports/vcpkg-get-python/vcpkg-port-config.cmake b/ports/vcpkg-get-python/vcpkg-port-config.cmake index 3f6cbd73c8ea26..5cd78e6964d65b 100644 --- a/ports/vcpkg-get-python/vcpkg-port-config.cmake +++ b/ports/vcpkg-get-python/vcpkg-port-config.cmake @@ -1,9 +1,15 @@ +include_guard(GLOBAL) + function(vcpkg_get_vcpkg_installed_python out_python) if(NOT VCPKG_TARGET_IS_WINDOWS) # vcpkg installed python on !windows works as normal python would work. set(${out_python} "${CURRENT_HOST_INSTALLED_DIR}/tools/python3/python3" PARENT_SCOPE) return() endif() + if(DEFINED CACHE{z_vcpkg_get_vcpkg_installed_python}) + set(${out_python} "${z_vcpkg_get_vcpkg_installed_python}" PARENT_SCOPE) + return() + endif() # On windows python is unable to lookup DLLs, so a manual venv is created set(python_home "${CURRENT_HOST_INSTALLED_DIR}/tools/python3") @@ -43,4 +49,5 @@ if vcpkg_bin_path.is_dir(): ) set(${out_python} "${python_base}/Scripts/python.exe" PARENT_SCOPE) + set(z_vcpkg_get_vcpkg_installed_python "${python_base}/Scripts/python.exe" CACHE INTERNAL "") endfunction() diff --git a/ports/vcpkg-get-python/vcpkg.json b/ports/vcpkg-get-python/vcpkg.json index d67c9c1fe263d4..aa06c06e35b76c 100644 --- a/ports/vcpkg-get-python/vcpkg.json +++ b/ports/vcpkg-get-python/vcpkg.json @@ -1,6 +1,6 @@ { "name": "vcpkg-get-python", - "version-date": "2024-06-08", + "version-date": "2024-06-22", "license": "MIT", "supports": "native" } diff --git a/ports/vcpkg-python-scripts/import_test.py.in b/ports/vcpkg-python-scripts/import_test.py.in new file mode 100644 index 00000000000000..f1ebcf9a9f048a --- /dev/null +++ b/ports/vcpkg-python-scripts/import_test.py.in @@ -0,0 +1,4 @@ +import os +os.add_dll_directory('@DLL_DIR@') if os.name == 'nt' else None + +from @arg_MODULE@ import * \ No newline at end of file diff --git a/ports/vcpkg-python-scripts/portfile.cmake b/ports/vcpkg-python-scripts/portfile.cmake new file mode 100644 index 00000000000000..77452c8f28d18f --- /dev/null +++ b/ports/vcpkg-python-scripts/portfile.cmake @@ -0,0 +1,8 @@ +file(INSTALL + "${CMAKE_CURRENT_LIST_DIR}/vcpkg_python_functions.cmake" + "${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" + "${CMAKE_CURRENT_LIST_DIR}/import_test.py.in" + DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") + +file(INSTALL "${VCPKG_ROOT_DIR}/LICENSE.txt" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) +set(VCPKG_POLICY_CMAKE_HELPER_PORT enabled) diff --git a/ports/vcpkg-python-scripts/vcpkg-port-config.cmake b/ports/vcpkg-python-scripts/vcpkg-port-config.cmake new file mode 100644 index 00000000000000..34671c1be02425 --- /dev/null +++ b/ports/vcpkg-python-scripts/vcpkg-port-config.cmake @@ -0,0 +1,13 @@ +include_guard(GLOBAL) + +include("${CMAKE_CURRENT_LIST_DIR}/../python3/vcpkg-port-config.cmake") + +set(PYTHON3_BASEDIR "${CURRENT_HOST_INSTALLED_DIR}/tools/python3") +find_program(VCPKG_PYTHON3_EXECUTABLE + NAMES python${PYTHON3_VERSION_MAJOR}.${PYTHON3_VERSION_MINOR} python${PYTHON3_VERSION_MAJOR} python + PATHS "${PYTHON3_BASEDIR}" + NO_DEFAULT_PATH +) + + +include("${CMAKE_CURRENT_LIST_DIR}/vcpkg_python_functions.cmake") diff --git a/ports/vcpkg-python-scripts/vcpkg.json b/ports/vcpkg-python-scripts/vcpkg.json new file mode 100644 index 00000000000000..12bca4e6f8b973 --- /dev/null +++ b/ports/vcpkg-python-scripts/vcpkg.json @@ -0,0 +1,23 @@ +{ + "name": "vcpkg-python-scripts", + "version-date": "2024-05-16", + "documentation": "https://vcpkg.io/en/docs/README.html", + "license": "MIT", + "dependencies": [ + { + "name": "py-crossenv", + "host": true, + "platform": "!native" + }, + "py-gpep517", + { + "name": "python3", + "host": true + }, + "python3", + { + "name": "vcpkg-python-scripts", + "host": true + } + ] +} diff --git a/ports/vcpkg-python-scripts/vcpkg_python_functions.cmake b/ports/vcpkg-python-scripts/vcpkg_python_functions.cmake new file mode 100644 index 00000000000000..a37683369e7dd9 --- /dev/null +++ b/ports/vcpkg-python-scripts/vcpkg_python_functions.cmake @@ -0,0 +1,182 @@ +set(ENV{SETUPTOOLS_SCM_PRETEND_VERSION} "${VERSION}") +set(ENV{PDM_BUILD_SCM_VERSION} "${VERSION}") + +set(z_vcpkg_python_func_python "${VCPKG_PYTHON3_EXECUTABLE}") + +function(vcpkg_from_pythonhosted) + cmake_parse_arguments( + PARSE_ARGV 0 + "arg" + "" + "OUT_SOURCE_PATH;PACKAGE_NAME;VERSION;SHA512;FILENAME" + "PATCHES") + + if(DEFINED arg_UNPARSED_ARGUMENTS) + message(WARNING "vcpkg_from_pythonhosted was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + + if(NOT DEFINED arg_OUT_SOURCE_PATH) + message(FATAL_ERROR "OUT_SOURCE_PATH must be specified.") + endif() + if(NOT DEFINED arg_PACKAGE_NAME) + message(FATAL_ERROR "PACKAGE_NAME must be specified.") + endif() + if(NOT DEFINED arg_VERSION) + message(FATAL_ERROR "VERSION must be specified.") + endif() + if(NOT DEFINED arg_FILENAME) + set(arg_FILENAME "${arg_PACKAGE_NAME}") + endif() + + string(SUBSTRING "${arg_PACKAGE_NAME}" 0 1 _PACKAGE_PREFIX) + vcpkg_download_distfile(ARCHIVE + URLS "https://files.pythonhosted.org/packages/source/${_PACKAGE_PREFIX}/${arg_PACKAGE_NAME}/${arg_FILENAME}-${arg_VERSION}.tar.gz" + FILENAME "${arg_PACKAGE_NAME}-${arg_VERSION}.tar.gz" + SHA512 ${arg_SHA512} + ) + + vcpkg_extract_source_archive_ex( + OUT_SOURCE_PATH SOURCE_PATH + ARCHIVE ${ARCHIVE} + PATCHES ${arg_PATCHES} + ) + + set("${arg_OUT_SOURCE_PATH}" "${SOURCE_PATH}" PARENT_SCOPE) +endfunction() + +function(vcpkg_python_build_wheel) + cmake_parse_arguments( + PARSE_ARGV 0 + "arg" + "" + "SOURCE_PATH;OUTPUT_WHEEL" + "OPTIONS;ENVIRONMENT" + ) + + # These are common variables used by python backends + set(ENV{SETUPTOOLS_SCM_PRETEND_VERSION} "${VERSION}") + set(ENV{PDM_BUILD_SCM_VERSION} "${VERSION}") + + set(build_ops "${arg_OPTIONS}") + + set(z_vcpkg_wheeldir "${CURRENT_PACKAGES_DIR}/wheels") + + file(MAKE_DIRECTORY "${z_vcpkg_wheeldir}") + + message(STATUS "Building python wheel!") + + list(JOIN arg_ENVIRONMENT " " env) + if(CMAKE_HOST_WIN32) + set(env "") + set(env_backup_vars "") + foreach(envvarline IN LISTS arg_ENVIRONMENT) + if(envvarline MATCHES "([^=]+)=(.+)") + list(APPEND env_backup_vars "${CMAKE_MATCH_1}") + if(DEFINED ENV{${CMAKE_MATCH_1}}) + set(env_bak_${CMAKE_MATCH_1} "$ENV{${CMAKE_MATCH_1}}") + endif() + set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}") + else() + message(FATAL_ERROR "'${envvarline}' is not a valid line for setting an environment variable!") + endif() + endforeach() + endif() + + if(VCPKG_CROSSCOMPILING) + set(build_python "${z_vcpkg_python_func_python}") + find_program(host_python + NAMES python${PYTHON3_VERSION_MAJOR}.${PYTHON3_VERSION_MINOR} python${PYTHON3_VERSION_MAJOR} python + PATHS "${CURRENT_INSTALLED_DIR}/tools/python3" + NO_DEFAULT_PATH REQUIRED + ) + set(venv_build "${CURRENT_BUILDTREES_DIR}/venv-${TARGET_TRIPLET}") + file(REMOVE_RECURSE "${venv_build}") + + vcpkg_execute_required_process( + COMMAND ${env} "${build_python}" -m crossenv "${host_python}" "venv-${TARGET_TRIPLET}" + LOGNAME "python-crossenv-${TARGET_TRIPLET}" + WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}" + ) + + endif() + + vcpkg_execute_required_process( + COMMAND ${env} "${z_vcpkg_python_func_python}" -m gpep517 build-wheel --wheel-dir "${z_vcpkg_wheeldir}" --output-fd 1 ${build_ops} + LOGNAME "python-build-${TARGET_TRIPLET}" + WORKING_DIRECTORY "${arg_SOURCE_PATH}" + ) + + foreach(env_var IN LISTS env_backup_vars) + if(DEFINED env_bak_${env_var}) + set(ENV{${env_var}} "${env_bak_${env_var}}") + else() + unset(ENV{${env_var}}) + endif() + endforeach() + + message(STATUS "Finished building python wheel!") + + file(GLOB WHEEL "${z_vcpkg_wheeldir}/*.whl") + + set(${arg_OUTPUT_WHEEL} "${WHEEL}" PARENT_SCOPE) +endfunction() + +function(vcpkg_python_install_wheel) + cmake_parse_arguments( + PARSE_ARGV 0 + "arg" + "" + "WHEEL" + "" + ) + + set(build_ops "") + + set(install_prefix "${CURRENT_INSTALLED_DIR}") + if(VCPKG_TARGET_IS_WINDOWS) + string(APPEND install_prefix "/tools/python3") + endif() + + message(STATUS "Installing python wheel:'${arg_WHEEL}'") + vcpkg_execute_required_process(COMMAND "${z_vcpkg_python_func_python}" -m installer + --prefix "${install_prefix}" + --destdir "${CURRENT_PACKAGES_DIR}" "${arg_WHEEL}" + LOGNAME "python-installer-${TARGET_TRIPLET}" + WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}" + ) + message(STATUS "Finished installing python wheel!") + + cmake_path(GET CURRENT_INSTALLED_DIR ROOT_NAME rootName) + cmake_path(GET CURRENT_INSTALLED_DIR ROOT_DIRECTORY rootDir) + cmake_path(GET CURRENT_INSTALLED_DIR STEM fullStem) + string(REPLACE "${rootName}/" "/" without_drive_letter_installed ${CURRENT_INSTALLED_DIR}) + + string(REPLACE "/" ";" path_list "${without_drive_letter_installed}") + list(GET path_list 1 path_to_delete) + + if(NOT EXISTS "${CURRENT_PACKAGES_DIR}/tools" AND EXISTS "${CURRENT_PACKAGES_DIR}${without_drive_letter_installed}/tools") + file(RENAME "${CURRENT_PACKAGES_DIR}${without_drive_letter_installed}/tools" "${CURRENT_PACKAGES_DIR}/tools") + else() + file(COPY "${CURRENT_PACKAGES_DIR}${without_drive_letter_installed}/" DESTINATION "${CURRENT_PACKAGES_DIR}/") + endif() + file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/${path_to_delete}") +endfunction() + +function(vcpkg_python_build_and_install_wheel) + cmake_parse_arguments( + PARSE_ARGV 0 + "arg" + "" + "SOURCE_PATH" + "OPTIONS;ENVIRONMENT" + ) + vcpkg_python_build_wheel( + OUTPUT_WHEEL wheel + ENVIRONMENT ${arg_ENVIORNMENT} + SOURCE_PATH "${arg_SOURCE_PATH}" + OPTIONS ${arg_OPTIONS} + ) + vcpkg_python_install_wheel( + WHEEL "${wheel}" + ) +endfunction() diff --git a/ports/vcpkg-python-test-import/import_test.py.in b/ports/vcpkg-python-test-import/import_test.py.in new file mode 100644 index 00000000000000..b879f12f55ae78 --- /dev/null +++ b/ports/vcpkg-python-test-import/import_test.py.in @@ -0,0 +1,5 @@ +import os + +@PYTHON_DLL_SEARCH_DIRS@ + +@PYTHON_IMPORTS@ diff --git a/ports/vcpkg-python-test-import/portfile.cmake b/ports/vcpkg-python-test-import/portfile.cmake new file mode 100644 index 00000000000000..3eeeeddaeac1ea --- /dev/null +++ b/ports/vcpkg-python-test-import/portfile.cmake @@ -0,0 +1,9 @@ +file(INSTALL + "${CMAKE_CURRENT_LIST_DIR}/import_test.py.in" + "${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" + DESTINATION + "${CURRENT_PACKAGES_DIR}/share/${PORT}" +) + +file(INSTALL "${VCPKG_ROOT_DIR}/LICENSE.txt" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) +set(VCPKG_POLICY_CMAKE_HELPER_PORT enabled) diff --git a/ports/vcpkg-python-test-import/vcpkg-port-config.cmake b/ports/vcpkg-python-test-import/vcpkg-port-config.cmake new file mode 100644 index 00000000000000..60167d7491e229 --- /dev/null +++ b/ports/vcpkg-python-test-import/vcpkg-port-config.cmake @@ -0,0 +1,65 @@ +include_guard(GLOBAL) +include("${CURRENT_HOST_INSTALLED_DIR}/share/vcpkg-get-python/vcpkg-port-config.cmake") + +function(vcpkg_python_test_import) + cmake_parse_arguments( + PARSE_ARGV 0 + "arg" + "" + "MODULE;PYTHON_EXECUTABLE" + "MODULES;DLL_SEARCH_PATHS" + ) + + if(VCPKG_CROSSCOMPILING OR (VCPKG_CRT_LINKAGE STREQUAL "static" AND NOT arg_PYTHON_EXECUTABLE)) + return() + endif() + + if(NOT arg_PYTHON_EXECUTABLE AND COMMAND vcpkg_get_vcpkg_installed_python) + vcpkg_get_vcpkg_installed_python(arg_PYTHON_EXECUTABLE) + elseif(NOT DEFINED arg_PYTHON_EXECUTABLE) + message(FATAL_ERROR "arg_PYTHON_EXECUTABLE is not defined and command vcpkg_get_vcpkg_installed_python is not available!") + endif() + + if(arg_MODULE) + list(APPEND arg_MODULES "${arg_MODULE}") + endif() + + set(PYTHON_DLL_SEARCH_DIRS "") + if(VCPKG_TARGET_IS_WINDOWS) + list(APPEND arg_DLL_SEARCH_PATHS "${CURRENT_INSTALLED_DIR}/bin") + foreach(dll_path IN LISTS arg_DLL_SEARCH_PATHS) + if(NOT EXISTS "${dll_path}") + message(FATAL_ERROR "Path '${dll_path}' in DLL_SEARCH_PATHS does not exist!") + endif() + string(APPEND PYTHON_DLL_SEARCH_DIRS "os.add_dll_directory('${dll_path}')\n") + endforeach() + endif() + + set(PYTHON_IMPORTS "") + foreach(module IN LISTS arg_MODULES) + string(APPEND PYTHON_IMPORTS "from ${module} import *\n") + endforeach() + + unset(pythonpath_bak) + if(DEFINED ENV{PYTHONPATH}) + set(pythonpath_bak "$ENV{PYTHONPATH}") + endif() + + set(ENV{PYTHONPATH} "${CURRENT_PACKAGES_DIR}/${PYTHON3_SITE}") + + message(STATUS "Testing import of python module '${arg_MODULES}' ...") + + configure_file("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/import_test.py.in" "${CURRENT_BUILDTREES_DIR}/import_test.py" @ONLY) + + vcpkg_execute_required_process(COMMAND "${arg_PYTHON_EXECUTABLE}" "${CURRENT_BUILDTREES_DIR}/import_test.py" + LOGNAME "python-import-${arg_MODULE}-${TARGET_TRIPLET}" + WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}" + ) + message(STATUS "Import of '${arg_MODULES}' successful") + + if(DEFINED pythonpath_bak) + set(ENV{PYTHONPATH} "${pythonpath_bak}") + else() + unset(ENV{PYTHONPATH}) + endif() +endfunction() diff --git a/ports/vcpkg-python-test-import/vcpkg.json b/ports/vcpkg-python-test-import/vcpkg.json new file mode 100644 index 00000000000000..4d424953fb5aef --- /dev/null +++ b/ports/vcpkg-python-test-import/vcpkg.json @@ -0,0 +1,10 @@ +{ + "name": "vcpkg-python-test-import", + "version-date": "2024-06-22", + "description": "Helper script to test if python imports work as expected", + "license": "MIT", + "supports": "native", + "dependencies": [ + "vcpkg-get-python" + ] +} diff --git a/scripts/ci.baseline.txt b/scripts/ci.baseline.txt index a318cab6b24c1a..4867d0b6307258 100644 --- a/scripts/ci.baseline.txt +++ b/scripts/ci.baseline.txt @@ -819,6 +819,9 @@ ngspice:x64-windows-static=fail nmap:arm-neon-android=fail nmap:arm64-android=fail nmap:x64-android=fail +# Cannot build dynamic extensions against static python +numpy:x64-windows-static=skip +numpy:x64-windows-static-md=skip nrf-ble-driver:arm-neon-android=fail nrf-ble-driver:arm64-android=fail nrf-ble-driver:x64-android=fail