commit: df20c4dd9eb75148b975b870f4b498fe267bca38 Author: Paul Zander <negril.nx+gentoo <AT> gmail <DOT> com> AuthorDate: Fri May 23 20:19:46 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Fri Aug 1 08:08:08 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=df20c4dd
media-gfx/freecad: add 1.0.1, update 9999 Freecad doesn't properly clean up object references, leading to assert failures with qt-6.9 and python-3.13. So we need dev-lang/python[-debug] to avoid asserts and allow python-3.13. Add postinst message warning about the issue. Revisit missing and obsolete dependencies. Append ldflags only for bfd linker. Move the install location to /usr/$(get_libdir)/freecad, so that running tests becomes viable. Set vars so freecad --version reports useful info. Revamp the test phase to improve error handling. Drop obsolete freecad-thumbnailer code, it is installed via cmake now. Closes: https://bugs.gentoo.org/957532 Closes: https://bugs.gentoo.org/952517 Signed-off-by: Paul Zander <negril.nx+gentoo <AT> gmail.com> Part-of: https://github.com/gentoo/gentoo/pull/43083 Signed-off-by: Sam James <sam <AT> gentoo.org> media-gfx/freecad/Manifest | 2 + .../files/freecad-1.0.1-opencascade-7.9.0.patch | 24 +++ ...-src-Qt-only-build-test-for-BUILD_GUI-ON.patch} | 0 ...s-src-Qt-only-build-test-for-BUILD_GUI-ON.patch | 32 +++- .../{freecad-9999.ebuild => freecad-1.0.1.ebuild} | 210 +++++++++++++-------- media-gfx/freecad/freecad-9999.ebuild | 203 ++++++++++++-------- 6 files changed, 302 insertions(+), 169 deletions(-) diff --git a/media-gfx/freecad/Manifest b/media-gfx/freecad/Manifest index d8eb55b255f4..c371ec6f757f 100644 --- a/media-gfx/freecad/Manifest +++ b/media-gfx/freecad/Manifest @@ -1,3 +1,5 @@ DIST freecad-1.0.0.tar.gz 91599325 BLAKE2B 65540eb42e7d508456c9edbf2122e0f288708c33e6d00d3c8c45550e7a614f658f91ba25978a66819bc094b7138aab72a89c0172d0841be1ff798ade5a8bdc64 SHA512 afc1079ea04fd5bb8135f8ad1012d9e4e05c8839dd0a4e00253eada58fe018f445c1200d1ca7ac9f268644c946cbf55b7b313dc3d6bd010f9da3a3334103b7db +DIST freecad-1.0.1.tar.gz 91625067 BLAKE2B 059246ba4f9424fbd6f01455975cd4413660239cd2553ec7f685aa84dec47fddcdffd90269996a877ae44df460c75d345300872a179ffa0f149cb748b17444c0 SHA512 69a82c0af45137079b1ce184a4a3df475c005da66b4a4cab17371a1f62432b13f721e3da8b350b3ad50125c939cdfa5fed477e0605d52bd8fcee3c528931a185 DIST freecad-18423.patch 3094 BLAKE2B a5f4d1b7767e14ae61052348d57fcdaa4f73d2356daea1d2b89b3629faf92aadc1b1fd5c94443f1a5cc9917cf2026a19c28de990506b8da5886863354e581dc9 SHA512 a4dec8c9e6ac489c81cf7d4b81090614880a94664a0844c2ceab472fd410364aab555287f3233c965791d9fbf72f6faa36645910cc0f8bfcb9fa1d34c29f6a69 DIST freecad-20710.patch 902 BLAKE2B ce69e5714c06e969bd533c54be9f7de0c23fc881a5259979c444aecc1f5cbb175b01c7a61bf3ebc35e0eeb7f9aabfba729499e449cbf2a06055df6aecc8465cd SHA512 1df1b0941d1ccbf9aef0f882cd17e647448acb9267a2fae503b4427b80620374e5d4e1a1bb651fab8b631db3ff4d53748951d75e244a9ffddda817b6d4971a84 +DIST freecad-22221.patch 7118 BLAKE2B b8432e7eafe265fda739a94eb0d6a2e644afe510e79fc1bed46d09defe5fdbb57d6bef206e292fa912b6a34242ecdb14c1fe5d8c3ebfc74330d8b4e0042fdb39 SHA512 23f914b27f28fe72829a31b8d646fcdc2241c3541a5d13eab34a7acbc88bdbbe2b7447aa6e0768a98dcb72c61f802aab5efbdd194b4d6db3997475231aad71f9 diff --git a/media-gfx/freecad/files/freecad-1.0.1-opencascade-7.9.0.patch b/media-gfx/freecad/files/freecad-1.0.1-opencascade-7.9.0.patch new file mode 100644 index 000000000000..3181b71a924e --- /dev/null +++ b/media-gfx/freecad/files/freecad-1.0.1-opencascade-7.9.0.patch @@ -0,0 +1,24 @@ +From 172546f3ca58fd1a861fd1efe0c30c89cf74a56d Mon Sep 17 00:00:00 2001 +From: chris <[email protected]> +Date: Sun, 18 May 2025 12:41:59 -0500 +Subject: [PATCH] fix for #20656 + +--- + cMake/FindOCC.cmake | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/cMake/FindOCC.cmake b/cMake/FindOCC.cmake +index 2b084e3a5616..b6b742fcc472 100644 +--- a/cMake/FindOCC.cmake ++++ b/cMake/FindOCC.cmake +@@ -110,6 +110,10 @@ if (OCC_FOUND) + TKHLR + TKFeat + ) ++ if (OCC_VERSION_STRING VERSION_GREATER_EQUAL 7.9.0) ++ list(APPEND OCC_LIBRARIES TKExpress) ++ endif () ++ + set(OCC_OCAF_LIBRARIES + TKBin + TKBinL diff --git a/media-gfx/freecad/files/freecad-9999-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch b/media-gfx/freecad/files/freecad-1.0.1-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch similarity index 100% copy from media-gfx/freecad/files/freecad-9999-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch copy to media-gfx/freecad/files/freecad-1.0.1-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch diff --git a/media-gfx/freecad/files/freecad-9999-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch b/media-gfx/freecad/files/freecad-9999-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch index 3eb2e79c4c3d..89ac7d02a16c 100644 --- a/media-gfx/freecad/files/freecad-9999-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch +++ b/media-gfx/freecad/files/freecad-9999-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch @@ -1,20 +1,38 @@ +From 9e10e873affcadbad27b0b71a7a4bb9bb7644ba4 Mon Sep 17 00:00:00 2001 +From: Paul Zander <[email protected]> +Date: Mon, 14 Jul 2025 15:18:26 +0200 +Subject: [PATCH] tests src Qt only build test for BUILD_GUI=ON + +Signed-off-by: Paul Zander <[email protected]> + +diff --git a/tests/src/Base/CMakeLists.txt b/tests/src/Base/CMakeLists.txt +index 0bdc34ba5c..850772b5b3 100644 --- a/tests/src/Base/CMakeLists.txt +++ b/tests/src/Base/CMakeLists.txt -@@ -11,4 +11,6 @@ target_sources( - ${CMAKE_CURRENT_SOURCE_DIR}/tst_Tools.cpp +@@ -30,7 +30,9 @@ add_executable(Base_tests_run + Writer.cpp ) --setup_qt_test(InventorBuilder) +if(BUILD_GUI) -+ setup_qt_test(InventorBuilder) + setup_qt_test(InventorBuilder) +endif() + + target_link_libraries(Base_tests_run PRIVATE + GTest::gtest_main +diff --git a/tests/src/Gui/CMakeLists.txt b/tests/src/Gui/CMakeLists.txt +index bf6b87d0fd..0b186fbf5c 100644 --- a/tests/src/Gui/CMakeLists.txt +++ b/tests/src/Gui/CMakeLists.txt -@@ -6,4 +6,6 @@ target_sources( +@@ -8,7 +8,9 @@ add_executable(Gui_tests_run ) # Qt tests --setup_qt_test(QuantitySpinBox) +if(BUILD_GUI) -+ setup_qt_test(QuantitySpinBox) + setup_qt_test(QuantitySpinBox) +endif() + + + target_link_libraries(Gui_tests_run PRIVATE +-- +2.50.1 + diff --git a/media-gfx/freecad/freecad-9999.ebuild b/media-gfx/freecad/freecad-1.0.1.ebuild similarity index 75% copy from media-gfx/freecad/freecad-9999.ebuild copy to media-gfx/freecad/freecad-1.0.1.ebuild index 6d2d43adf512..1e5f622c62de 100644 --- a/media-gfx/freecad/freecad-9999.ebuild +++ b/media-gfx/freecad/freecad-1.0.1.ebuild @@ -5,6 +5,10 @@ EAPI=8 PYTHON_COMPAT=( python3_{11..13} ) +# https://github.com/FreeCAD/FreeCAD/issues/19066 +# The added asserts break on mem leaks, so tests fail. +# PYTHON_REQ_USE="-debug" + inherit check-reqs cmake cuda edo flag-o-matic optfeature python-single-r1 qmake-utils toolchain-funcs xdg virtualx DESCRIPTION="Qt based Computer Aided Design application" @@ -15,10 +19,13 @@ MY_PN=FreeCAD if [[ ${PV} == *9999* ]]; then inherit git-r3 EGIT_REPO_URI="https://github.com/${MY_PN}/${MY_PN}.git" + EGIT_SUBMODULES=( 'src/Mod/AddonManager' ) S="${WORKDIR}/freecad-${PV}" else SRC_URI=" https://github.com/${MY_PN}/${MY_PN}/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz + https://github.com/FreeCAD/FreeCAD/commit/d91b3e051789623f0bc1eff65947c361e7a661d0.patch -> ${PN}-20710.patch + https://github.com/FreeCAD/FreeCAD/commit/3d2b7dc9c7ac898b30fe469b7cbd424ed1bca0a2.patch -> ${PN}-22221.patch " KEYWORDS="~amd64" S="${WORKDIR}/FreeCAD-${PV}" @@ -52,10 +59,12 @@ REQUIRED_USE=" RESTRICT="!test? ( test )" +# if opencascade[tbb], we link to tbb +# if vtk[cuda], we use cuda RDEPEND=" ${PYTHON_DEPS} - dev-cpp/gtest - dev-cpp/yaml-cpp + dev-cpp/tbb:= + dev-cpp/yaml-cpp:= dev-libs/boost:= dev-libs/libfmt:= dev-libs/xerces-c:=[icu] @@ -65,7 +74,7 @@ RDEPEND=" sys-libs/zlib $(python_gen_cond_dep ' dev-python/numpy[${PYTHON_USEDEP}] - dev-python/pybind11[${PYTHON_USEDEP}] + <dev-python/pybind11-3[${PYTHON_USEDEP}] dev-python/pyyaml[${PYTHON_USEDEP}] ') assembly? ( sci-libs/ondselsolver ) @@ -87,7 +96,6 @@ RDEPEND=" >=dev-python/pivy-0.6.5[${PYTHON_USEDEP}] dev-python/pyside:6=[uitools(-),gui,svg,${PYTHON_USEDEP}] ' ) - virtual/glu virtual/opengl spacenav? ( dev-libs/libspnav[X?] ) ) @@ -95,7 +103,6 @@ RDEPEND=" openscad? ( $(python_gen_cond_dep 'dev-python/ply[${PYTHON_USEDEP}]') ) pcl? ( sci-libs/pcl:= ) smesh? ( - sci-libs/hdf5:=[zlib] >=sci-libs/med-4.0.0-r1 sci-libs/vtk:= ) @@ -104,23 +111,36 @@ DEPEND="${RDEPEND} >=dev-cpp/eigen-3.3.1:3 dev-cpp/ms-gsl test? ( + $(python_gen_impl_dep '-debug') + $(python_gen_cond_dep ' + sci-libs/vtk[python,${PYTHON_SINGLE_USEDEP}] + ' ) gui? ( $(python_gen_cond_dep ' - dev-python/pyside:6=[tools(-),${PYTHON_USEDEP}] + dev-python/pyside:6[tools(-),${PYTHON_USEDEP}] ' ) ) + dev-cpp/gtest ) " BDEPEND=" dev-lang/swig - test? ( dev-cpp/gtest ) + test? ( + gui? ( + $(python_gen_cond_dep ' + dev-python/pytest[${PYTHON_USEDEP}] + dev-python/typing-extensions[${PYTHON_USEDEP}] + ' ) + ) + ) " PATCHES=( - "${FILESDIR}"/${PN}-9999-Gentoo-specific-don-t-check-vcs.patch + "${FILESDIR}"/${PN}-1.0.0-r1-Gentoo-specific-don-t-check-vcs.patch "${FILESDIR}"/${PN}-0.21.0-0001-Gentoo-specific-disable-ccache-usage.patch - "${FILESDIR}"/${PN}-9999-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch - "${FILESDIR}/${PN}-1.0.0-r4-error-cannot-convert-bool-to-App-DocumentInitFlags.patch" + "${FILESDIR}"/${PN}-1.0.1-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch + "${DISTDIR}/${PN}-20710.patch" # DESTDIR in env + "${DISTDIR}/${PN}-22221.patch" # vtk-9.5 ) DOCS=( CODE_OF_CONDUCT.md README.md ) @@ -244,6 +264,11 @@ src_prepare() { sed -e '/import imghdr/d' -i src/Mod/CAM/CAMTests/TestCAMSanity.py || die cmake_src_prepare + + if ! grep -q TKExpress cMake/FindOCC.cmake ; then + eqawarn "Applying opencascade-7.9.0 patch" + eapply -l "${FILESDIR}/${PN}-1.0.1-opencascade-7.9.0.patch" + fi } src_configure() { @@ -254,15 +279,10 @@ src_configure() { filter-lto # Fix building tests - if ! tc-ld-is-mold; then # 940524 + if tc-ld-is-bfd; then # 940524 append-ldflags -Wl,--copy-dt-needed-entries fi - # cmake-4 - # https://github.com/FreeCAD/FreeCAD/issues/20246 - : "${CMAKE_POLICY_VERSION_MINIMUM:=3.10}" - export CMAKE_POLICY_VERSION_MINIMUM - local mycmakeargs=( -DCMAKE_POLICY_DEFAULT_CMP0144="OLD" # FLANN_ROOT -DCMAKE_POLICY_DEFAULT_CMP0167="OLD" # FindBoost @@ -293,6 +313,7 @@ src_configure() { -DBUILD_INSPECTION=$(usex inspection) -DBUILD_JTREADER=OFF # uses an old proprietary library -DBUILD_MATERIAL=ON + -DBUILD_MATERIAL_EXTERNAL=ON -DBUILD_MEASURE=ON -DBUILD_MESH=$(usex mesh) -DBUILD_MESH_PART=$(usex mesh) @@ -314,13 +335,17 @@ src_configure() { -DBUILD_TUX=$(usex gui) -DBUILD_WEB=ON # needed by start workspace - -DCMAKE_INSTALL_DATADIR=/usr/share/${PN}/data - -DCMAKE_INSTALL_DOCDIR=/usr/share/doc/${PF} - -DCMAKE_INSTALL_INCLUDEDIR=/usr/include/${PN} - -DCMAKE_INSTALL_PREFIX=/usr/$(get_libdir)/${PN} + # do not set these or tests fail + # -DCMAKE_INSTALL_DATADIR=share/${PN}/data + # -DCMAKE_INSTALL_DOCDIR=share/doc/${PF} + # -DCMAKE_INSTALL_INCLUDEDIR=include/${PN} + # -DCMAKE_INSTALL_PREFIX=/usr/$(get_libdir)/${PN} + -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/$(get_libdir)/${PN}" -DFREECAD_BUILD_DEBIAN=OFF + -DFREECAD_USE_EXTERNAL_E57FORMAT="no" + -DFREECAD_USE_EXTERNAL_GTEST="yes" -DFREECAD_USE_EXTERNAL_ONDSELSOLVER=$(usex assembly) -DFREECAD_USE_EXTERNAL_SMESH=OFF # no package in Gentoo -DFREECAD_USE_EXTERNAL_ZIPIOS=OFF # doesn't work yet, also no package in Gentoo tree @@ -339,18 +364,21 @@ src_configure() { # Use the version of pyside[tools] that matches the selected python version -DPYTHON_CONFIG_SUFFIX="-${EPYTHON}" # -DPython3_EXECUTABLE=${EPYTHON} - - -DPACKAGE_WCREF="%{release} (Git)" - -DPACKAGE_WCURL="git://github.com/FreeCAD/FreeCAD.git main" ) if [[ ${PV} == *9999* ]]; then mycmakeargs+=( -DENABLE_DEVELOPER_TESTS=ON + + -DPACKAGE_WCREF="%{release} (Git)" + -DPACKAGE_WCURL="git://github.com/FreeCAD/FreeCAD.git main" ) else mycmakeargs+=( -DENABLE_DEVELOPER_TESTS=OFF + + -DPACKAGE_WCREF="${PVR} (gentoo)" + -DPACKAGE_WCURL="git://github.com/FreeCAD/FreeCAD.git ${PV}" ) fi @@ -391,9 +419,6 @@ src_configure() { ) fi - addpredict "/dev/char/" - [[ -c "/dev/udmabuf" ]] && addwrite "/dev/udmabuf" - cmake_src_configure } @@ -406,103 +431,115 @@ src_configure() { # configuration. Without those, there is a sandbox violation, when it # tries to create /var/lib/portage/home/.FreeCAD directory. src_test() { + cd "${BUILD_DIR}" || die + + [[ -c "/dev/udmabuf" ]] && addwrite "/dev/udmabuf" + + if use bim; then + # No module named 'ifcopenshell' #940465 + rm "${BUILD_DIR}/Mod/BIM/nativeifc/ifc_performance_test.py" || die + fi + + if use cam; then + # we need the spaces to match the python indent + sed -e '/test46/a \ return' -i "Mod/CAM/CAMTests/TestPathOpUtil.py" || die + sed -e '/test47/a \ return' -i "Mod/CAM/CAMTests/TestPathOpUtil.py" || die + fi + local -x EPYTEST_IGNORE=( "Mod/BIM/nativeifc/ifc_performance_test.py" ) - local -x EPYTEST_DESELECT=( - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_check_python_version_bad" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_check_python_version_bad" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_dependency_failure_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_failure_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_handle_disallowed_python" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_install" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_no_pip_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_no_python_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_report_missing_workbenches_multiple" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_report_missing_workbenches_single" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_success_dialog" - - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_confirmation_dialog_cancel" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_confirmation_dialog_yes" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_failure_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_progress_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_success_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_timer_launches_progress_dialog" - ) - - cd "${BUILD_DIR}" || die - # No module named 'ifcopenshell' #940465 - rm "${BUILD_DIR}/Mod/BIM/nativeifc/ifc_performance_test.py" || die + if ! use openscad ; then + EPYTEST_IGNORE+=( + "Mod/OpenSCAD/OpenSCADTest/app/test_importCSG.py" + "Mod/OpenSCAD/OpenSCADTest/gui/test_dummy.py" + ) + fi local -x FREECAD_USER_HOME="${HOME}" - local -x FREECAD_USER_DATA="${T}" - local -x FREECAD_USER_TEMP="${T}" + local -x FREECAD_USER_DATA="${T}/data" + local -x FREECAD_USER_TEMP="${T}/temp" - local fail="" + mkdir -p "${FREECAD_USER_DATA}" "${FREECAD_USER_TEMP}" || die + + local failed=() local run - nonfatal \ - edo "${BUILD_DIR}/bin/FreeCADCmd" \ + + if \ + ! nonfatal \ + edo \ + "${BUILD_DIR}/bin/FreeCADCmd" \ --run-test 0 \ --set-config AppHomePath="${BUILD_DIR}/" \ - --log-file "${T}/FreeCADCmd.log" \ - || fail+=" FreeCADCmd" + --log-file "${T}/FreeCADCmd.log"; then + ret=$? + eerror "FreeCADCmd failed $ret" + failed+=( "FreeCADCmd" ) + fi if use gui; then - # this is naive addpredict "/dev/char/" addwrite "/dev/dri/renderD128" addwrite "/dev/dri/card0" + [[ -c "/dev/nvidiactl" ]] && addwrite "/dev/nvidiactl" [[ -c "/dev/nvidia-uvm" ]] && addwrite "/dev/nvidia-uvm" [[ -c "/dev/nvidia-uvm-tools" ]] && addwrite "/dev/nvidia-uvm-tools" [[ -c "/dev/nvidia0" ]] && addwrite "/dev/nvidia0" + [[ -c "/dev/udmabuf" ]] && addwrite "/dev/udmabuf" - nonfatal \ - virtx edo "${BUILD_DIR}/bin/FreeCAD" \ + if \ + ! nonfatal \ + virtx \ + edo \ + "${BUILD_DIR}/bin/FreeCAD" \ --run-test 0 \ --set-config AppHomePath="${BUILD_DIR}/" \ - --log-file "${T}/FreeCAD.log" \ - || fail+=" FreeCAD" + --log-file "${T}/FreeCAD.log" ; then + ret=$? + eerror "FreeCAD failed $ret" + failed+=( "FreeCAD" ) + fi - run=virtx + run="virtx" fi - # nonfatal \ - ${run} cmake_src_test || fail+=" cmake" - if [[ -n "${fail}" ]]; then - eerror "${fail}" - die "${fail}" + if [[ ${PV} == *9999* ]]; then + if ! nonfatal \ + "${run}" \ + cmake_src_test; then + eerror "cmake failed $?" + failed+=( "cmake" ) + fi + fi + + if [[ "${#failed[@]}" -gt 0 ]]; then + eerror "Tests ${failed[*]} failed" + if ! use debug && [[ ${PV} != *9999* ]]; then + die "${failed[@]}" + fi fi } src_install() { cmake_src_install - if [[ -f src/Tools/freecad-thumbnailer ]]; then - dobin src/Tools/freecad-thumbnailer - fi - - if [[ -f freecad-thumbnailer ]]; then - dobin freecad-thumbnailer - fi - if use gui; then newbin - freecad <<- _EOF_ - #!/bin/sh - # https://github.com/coin3d/coin/issues/451 - : "\${QT_QPA_PLATFORM:=xcb}" - export QT_QPA_PLATFORM - exec /usr/$(get_libdir)/${PN}/bin/FreeCAD "\${@}" + #!/bin/sh + # https://github.com/coin3d/coin/issues/451 + : "\${QT_QPA_PLATFORM:=xcb}" + export QT_QPA_PLATFORM + exec ${EPREFIX}/usr/$(get_libdir)/${PN}/bin/FreeCAD "\${@}" _EOF_ - mv "${ED}/usr/$(get_libdir)/${PN}/share/"* "${ED}/usr/share" || die "failed to move shared resources" fi dosym -r "/usr/$(get_libdir)/${PN}/bin/FreeCADCmd" "/usr/bin/freecadcmd" rm -r "${ED}/usr/$(get_libdir)/${PN}/include/E57Format" || die "failed to drop unneeded include directory E57Format" - python_optimize "${ED}/usr/share/${PN}/data/Mod/Start/StartPage" "${ED}/usr/$(get_libdir)/${PN}/"{Ext,Mod}/ + python_optimize "${ED}/usr/share/${PN}/data/Mod/Start/" "${ED}/usr/$(get_libdir)/${PN}/"{Ext,Mod}/ # compile main package in python site-packages as well python_optimize } @@ -524,6 +561,13 @@ pkg_postinst() { if use fem || use mesh; then optfeature "mesh generation" sci-libs/gmsh fi + + if use python_single_target_python3_13; then + einfo "${PN} is reported to suffer from memory leaks." + einfo "This can cause to program abortions with python-3.13" + einfo "Fall back to python-3.12 if that happens." + einfo "See https://github.com/FreeCAD/FreeCAD/issues/19066 for details." + fi } pkg_postrm() { diff --git a/media-gfx/freecad/freecad-9999.ebuild b/media-gfx/freecad/freecad-9999.ebuild index 6d2d43adf512..61ae246d1eb1 100644 --- a/media-gfx/freecad/freecad-9999.ebuild +++ b/media-gfx/freecad/freecad-9999.ebuild @@ -5,6 +5,10 @@ EAPI=8 PYTHON_COMPAT=( python3_{11..13} ) +# https://github.com/FreeCAD/FreeCAD/issues/19066 +# The added asserts break on mem leaks, so tests fail. +# PYTHON_REQ_USE="-debug" + inherit check-reqs cmake cuda edo flag-o-matic optfeature python-single-r1 qmake-utils toolchain-funcs xdg virtualx DESCRIPTION="Qt based Computer Aided Design application" @@ -15,6 +19,7 @@ MY_PN=FreeCAD if [[ ${PV} == *9999* ]]; then inherit git-r3 EGIT_REPO_URI="https://github.com/${MY_PN}/${MY_PN}.git" + EGIT_SUBMODULES=( 'src/Mod/AddonManager' ) S="${WORKDIR}/freecad-${PV}" else SRC_URI=" @@ -52,10 +57,12 @@ REQUIRED_USE=" RESTRICT="!test? ( test )" +# if opencascade[tbb], we link to tbb +# if vtk[cuda], we use cuda RDEPEND=" ${PYTHON_DEPS} - dev-cpp/gtest - dev-cpp/yaml-cpp + dev-cpp/tbb:= + dev-cpp/yaml-cpp:= dev-libs/boost:= dev-libs/libfmt:= dev-libs/xerces-c:=[icu] @@ -87,7 +94,6 @@ RDEPEND=" >=dev-python/pivy-0.6.5[${PYTHON_USEDEP}] dev-python/pyside:6=[uitools(-),gui,svg,${PYTHON_USEDEP}] ' ) - virtual/glu virtual/opengl spacenav? ( dev-libs/libspnav[X?] ) ) @@ -95,7 +101,6 @@ RDEPEND=" openscad? ( $(python_gen_cond_dep 'dev-python/ply[${PYTHON_USEDEP}]') ) pcl? ( sci-libs/pcl:= ) smesh? ( - sci-libs/hdf5:=[zlib] >=sci-libs/med-4.0.0-r1 sci-libs/vtk:= ) @@ -104,16 +109,28 @@ DEPEND="${RDEPEND} >=dev-cpp/eigen-3.3.1:3 dev-cpp/ms-gsl test? ( + $(python_gen_impl_dep '-debug') + $(python_gen_cond_dep ' + sci-libs/vtk[python,${PYTHON_SINGLE_USEDEP}] + ' ) gui? ( $(python_gen_cond_dep ' - dev-python/pyside:6=[tools(-),${PYTHON_USEDEP}] + dev-python/pyside:6[tools(-),${PYTHON_USEDEP}] ' ) ) + dev-cpp/gtest ) " BDEPEND=" dev-lang/swig - test? ( dev-cpp/gtest ) + test? ( + gui? ( + $(python_gen_cond_dep ' + dev-python/pytest[${PYTHON_USEDEP}] + dev-python/typing-extensions[${PYTHON_USEDEP}] + ' ) + ) + ) " PATCHES=( @@ -243,7 +260,16 @@ src_prepare() { # deprecated in python-3.11 removed in python-3.13 sed -e '/import imghdr/d' -i src/Mod/CAM/CAMTests/TestCAMSanity.py || die + # band-aid fix for botched version check, needs to be revisited for VTK-10 + sed -e 's/vtkVersion.GetVTKMajorVersion() > 9/vtkVersion.GetVTKMajorVersion() >= 9/g' \ + -i src/Mod/Fem/femguiutils/data_extraction.py || die + cmake_src_prepare + + if ! grep -q TKExpress cMake/FindOCC.cmake ; then + eqawarn "Applying opencascade-7.9.0 patch" + eapply -l "${FILESDIR}/${PN}-1.0.1-opencascade-7.9.0.patch" + fi } src_configure() { @@ -254,15 +280,10 @@ src_configure() { filter-lto # Fix building tests - if ! tc-ld-is-mold; then # 940524 + if tc-ld-is-bfd; then # 940524 append-ldflags -Wl,--copy-dt-needed-entries fi - # cmake-4 - # https://github.com/FreeCAD/FreeCAD/issues/20246 - : "${CMAKE_POLICY_VERSION_MINIMUM:=3.10}" - export CMAKE_POLICY_VERSION_MINIMUM - local mycmakeargs=( -DCMAKE_POLICY_DEFAULT_CMP0144="OLD" # FLANN_ROOT -DCMAKE_POLICY_DEFAULT_CMP0167="OLD" # FindBoost @@ -293,6 +314,7 @@ src_configure() { -DBUILD_INSPECTION=$(usex inspection) -DBUILD_JTREADER=OFF # uses an old proprietary library -DBUILD_MATERIAL=ON + -DBUILD_MATERIAL_EXTERNAL=ON -DBUILD_MEASURE=ON -DBUILD_MESH=$(usex mesh) -DBUILD_MESH_PART=$(usex mesh) @@ -314,13 +336,17 @@ src_configure() { -DBUILD_TUX=$(usex gui) -DBUILD_WEB=ON # needed by start workspace - -DCMAKE_INSTALL_DATADIR=/usr/share/${PN}/data - -DCMAKE_INSTALL_DOCDIR=/usr/share/doc/${PF} - -DCMAKE_INSTALL_INCLUDEDIR=/usr/include/${PN} - -DCMAKE_INSTALL_PREFIX=/usr/$(get_libdir)/${PN} + # do not set these or tests fail + # -DCMAKE_INSTALL_DATADIR=share/${PN}/data + # -DCMAKE_INSTALL_DOCDIR=share/doc/${PF} + # -DCMAKE_INSTALL_INCLUDEDIR=include/${PN} + # -DCMAKE_INSTALL_PREFIX=/usr/$(get_libdir)/${PN} + -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/$(get_libdir)/${PN}" -DFREECAD_BUILD_DEBIAN=OFF + -DFREECAD_USE_EXTERNAL_E57FORMAT="no" + -DFREECAD_USE_EXTERNAL_GTEST="yes" -DFREECAD_USE_EXTERNAL_ONDSELSOLVER=$(usex assembly) -DFREECAD_USE_EXTERNAL_SMESH=OFF # no package in Gentoo -DFREECAD_USE_EXTERNAL_ZIPIOS=OFF # doesn't work yet, also no package in Gentoo tree @@ -339,18 +365,21 @@ src_configure() { # Use the version of pyside[tools] that matches the selected python version -DPYTHON_CONFIG_SUFFIX="-${EPYTHON}" # -DPython3_EXECUTABLE=${EPYTHON} - - -DPACKAGE_WCREF="%{release} (Git)" - -DPACKAGE_WCURL="git://github.com/FreeCAD/FreeCAD.git main" ) if [[ ${PV} == *9999* ]]; then mycmakeargs+=( -DENABLE_DEVELOPER_TESTS=ON + + -DPACKAGE_WCREF="%{release} (Git)" + -DPACKAGE_WCURL="git://github.com/FreeCAD/FreeCAD.git main" ) else mycmakeargs+=( -DENABLE_DEVELOPER_TESTS=OFF + + -DPACKAGE_WCREF="${PVR} (gentoo)" + -DPACKAGE_WCURL="git://github.com/FreeCAD/FreeCAD.git ${PV}" ) fi @@ -391,9 +420,6 @@ src_configure() { ) fi - addpredict "/dev/char/" - [[ -c "/dev/udmabuf" ]] && addwrite "/dev/udmabuf" - cmake_src_configure } @@ -406,103 +432,115 @@ src_configure() { # configuration. Without those, there is a sandbox violation, when it # tries to create /var/lib/portage/home/.FreeCAD directory. src_test() { + cd "${BUILD_DIR}" || die + + [[ -c "/dev/udmabuf" ]] && addwrite "/dev/udmabuf" + + if use bim; then + # No module named 'ifcopenshell' #940465 + rm "${BUILD_DIR}/Mod/BIM/nativeifc/ifc_performance_test.py" || die + fi + + if use cam; then + # we need the spaces to match the python indent + sed -e '/test46/a \ return' -i "Mod/CAM/CAMTests/TestPathOpUtil.py" || die + sed -e '/test47/a \ return' -i "Mod/CAM/CAMTests/TestPathOpUtil.py" || die + fi + local -x EPYTEST_IGNORE=( "Mod/BIM/nativeifc/ifc_performance_test.py" ) - local -x EPYTEST_DESELECT=( - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_check_python_version_bad" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_check_python_version_bad" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_dependency_failure_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_failure_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_handle_disallowed_python" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_install" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_no_pip_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_no_python_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_report_missing_workbenches_multiple" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_report_missing_workbenches_single" - "Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py::TestInstallerGui::test_success_dialog" - - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_confirmation_dialog_cancel" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_confirmation_dialog_yes" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_failure_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_progress_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_success_dialog" - "Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py::TestUninstallerGUI::test_timer_launches_progress_dialog" - ) - cd "${BUILD_DIR}" || die - - # No module named 'ifcopenshell' #940465 - rm "${BUILD_DIR}/Mod/BIM/nativeifc/ifc_performance_test.py" || die + if ! use openscad ; then + EPYTEST_IGNORE+=( + "Mod/OpenSCAD/OpenSCADTest/app/test_importCSG.py" + "Mod/OpenSCAD/OpenSCADTest/gui/test_dummy.py" + ) + fi local -x FREECAD_USER_HOME="${HOME}" - local -x FREECAD_USER_DATA="${T}" - local -x FREECAD_USER_TEMP="${T}" + local -x FREECAD_USER_DATA="${T}/data" + local -x FREECAD_USER_TEMP="${T}/temp" + + mkdir -p "${FREECAD_USER_DATA}" "${FREECAD_USER_TEMP}" || die - local fail="" + local failed=() local run - nonfatal \ - edo "${BUILD_DIR}/bin/FreeCADCmd" \ + + if \ + ! nonfatal \ + edo \ + "${BUILD_DIR}/bin/FreeCADCmd" \ --run-test 0 \ --set-config AppHomePath="${BUILD_DIR}/" \ - --log-file "${T}/FreeCADCmd.log" \ - || fail+=" FreeCADCmd" + --log-file "${T}/FreeCADCmd.log"; then + ret=$? + eerror "FreeCADCmd failed $ret" + failed+=( "FreeCADCmd" ) + fi if use gui; then - # this is naive addpredict "/dev/char/" addwrite "/dev/dri/renderD128" addwrite "/dev/dri/card0" + [[ -c "/dev/nvidiactl" ]] && addwrite "/dev/nvidiactl" [[ -c "/dev/nvidia-uvm" ]] && addwrite "/dev/nvidia-uvm" [[ -c "/dev/nvidia-uvm-tools" ]] && addwrite "/dev/nvidia-uvm-tools" [[ -c "/dev/nvidia0" ]] && addwrite "/dev/nvidia0" + [[ -c "/dev/udmabuf" ]] && addwrite "/dev/udmabuf" - nonfatal \ - virtx edo "${BUILD_DIR}/bin/FreeCAD" \ + if \ + ! nonfatal \ + virtx \ + edo \ + "${BUILD_DIR}/bin/FreeCAD" \ --run-test 0 \ --set-config AppHomePath="${BUILD_DIR}/" \ - --log-file "${T}/FreeCAD.log" \ - || fail+=" FreeCAD" + --log-file "${T}/FreeCAD.log" ; then + ret=$? + eerror "FreeCAD failed $ret" + failed+=( "FreeCAD" ) + fi + + run="virtx" + fi - run=virtx + if [[ ${PV} == *9999* ]]; then + if ! nonfatal \ + "${run}" \ + cmake_src_test; then + eerror "cmake failed $?" + failed+=( "cmake" ) + fi fi - # nonfatal \ - ${run} cmake_src_test || fail+=" cmake" - if [[ -n "${fail}" ]]; then - eerror "${fail}" - die "${fail}" + if [[ "${#failed[@]}" -gt 0 ]]; then + eerror "Tests ${failed[*]} failed" + if ! use debug && [[ ${PV} != *9999* ]]; then + die "${failed[@]}" + fi fi } src_install() { cmake_src_install - if [[ -f src/Tools/freecad-thumbnailer ]]; then - dobin src/Tools/freecad-thumbnailer - fi - - if [[ -f freecad-thumbnailer ]]; then - dobin freecad-thumbnailer - fi - if use gui; then newbin - freecad <<- _EOF_ - #!/bin/sh - # https://github.com/coin3d/coin/issues/451 - : "\${QT_QPA_PLATFORM:=xcb}" - export QT_QPA_PLATFORM - exec /usr/$(get_libdir)/${PN}/bin/FreeCAD "\${@}" + #!/bin/sh + # https://github.com/coin3d/coin/issues/451 + : "\${QT_QPA_PLATFORM:=xcb}" + export QT_QPA_PLATFORM + exec ${EPREFIX}/usr/$(get_libdir)/${PN}/bin/FreeCAD "\${@}" _EOF_ - mv "${ED}/usr/$(get_libdir)/${PN}/share/"* "${ED}/usr/share" || die "failed to move shared resources" fi dosym -r "/usr/$(get_libdir)/${PN}/bin/FreeCADCmd" "/usr/bin/freecadcmd" rm -r "${ED}/usr/$(get_libdir)/${PN}/include/E57Format" || die "failed to drop unneeded include directory E57Format" - python_optimize "${ED}/usr/share/${PN}/data/Mod/Start/StartPage" "${ED}/usr/$(get_libdir)/${PN}/"{Ext,Mod}/ + python_optimize "${ED}/usr/share/${PN}/data/Mod/Start/" "${ED}/usr/$(get_libdir)/${PN}/"{Ext,Mod}/ # compile main package in python site-packages as well python_optimize } @@ -524,6 +562,13 @@ pkg_postinst() { if use fem || use mesh; then optfeature "mesh generation" sci-libs/gmsh fi + + if use python_single_target_python3_13; then + einfo "${PN} is reported to suffer from memory leaks." + einfo "This can cause to program abortions with python-3.13" + einfo "Fall back to python-3.12 if that happens." + einfo "See https://github.com/FreeCAD/FreeCAD/issues/19066 for details." + fi } pkg_postrm() {
