diff options
6 files changed, 770 insertions, 86 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 <chris.r.jones.1983@gmail.com> +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-1.0.1-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 new file mode 100644 index 000000000000..3eb2e79c4c3d --- /dev/null +++ b/media-gfx/freecad/files/freecad-1.0.1-tests-src-Qt-only-build-test-for-BUILD_GUI-ON.patch @@ -0,0 +1,20 @@ +--- 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 + ) + +-setup_qt_test(InventorBuilder) ++if(BUILD_GUI) ++ setup_qt_test(InventorBuilder) ++endif() +--- a/tests/src/Gui/CMakeLists.txt ++++ b/tests/src/Gui/CMakeLists.txt +@@ -6,4 +6,6 @@ target_sources( + ) + + # Qt tests +-setup_qt_test(QuantitySpinBox) ++if(BUILD_GUI) ++ setup_qt_test(QuantitySpinBox) ++endif() 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 <negril.nx@gmail.com> +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 <negril.nx+gentoo@gmail.com> + +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-1.0.1.ebuild b/media-gfx/freecad/freecad-1.0.1.ebuild new file mode 100644 index 000000000000..1e5f622c62de --- /dev/null +++ b/media-gfx/freecad/freecad-1.0.1.ebuild @@ -0,0 +1,575 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +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" +HOMEPAGE="https://www.freecad.org/ https://github.com/FreeCAD/FreeCAD" + +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}" +fi + +# code is licensed LGPL-2 +# examples are licensed CC-BY-SA (without note of specific version) +LICENSE="LGPL-2 CC-BY-SA-4.0" +SLOT="0" +IUSE="debug designer +gui netgen pcl +smesh spacenav test X" +# Modules are found in src/Mod/ and their options defined in: +# cMake/FreeCAD_Helpers/InitializeFreeCADBuildOptions.cmake +# To get their dependencies: +# 'grep REQUIRES_MODS cMake/FreeCAD_Helpers/CheckInterModuleDependencies.cmake' +IUSE+=" addonmgr assembly +bim cam cloud fem idf inspection +mesh openscad points reverse robot surface +techdraw" + +REQUIRED_USE=" + ${PYTHON_REQUIRED_USE} + bim? ( mesh ) + cam? ( mesh ) + gui? ( bim ) + designer? ( gui ) + fem? ( smesh ) + inspection? ( points ) + mesh? ( smesh ) + openscad? ( mesh ) + reverse? ( mesh points ) + test? ( techdraw ) +" +# Draft Workbench needs BIM + +RESTRICT="!test? ( test )" + +# if opencascade[tbb], we link to tbb +# if vtk[cuda], we use cuda +RDEPEND=" + ${PYTHON_DEPS} + dev-cpp/tbb:= + dev-cpp/yaml-cpp:= + dev-libs/boost:= + dev-libs/libfmt:= + dev-libs/xerces-c:=[icu] + dev-qt/qtbase:6[concurrent,network,xml] + media-libs/freetype + sci-libs/opencascade:=[json] + sys-libs/zlib + $(python_gen_cond_dep ' + dev-python/numpy[${PYTHON_USEDEP}] + <dev-python/pybind11-3[${PYTHON_USEDEP}] + dev-python/pyyaml[${PYTHON_USEDEP}] + ') + assembly? ( sci-libs/ondselsolver ) + cloud? ( + dev-libs/openssl:= + net-misc/curl + ) + fem? ( + sci-libs/vtk:= + $(python_gen_cond_dep 'dev-python/ply[${PYTHON_USEDEP}]') + ) + gui? ( + >=media-libs/coin-4.0.0 + dev-qt/qtbase:6[gui,opengl,widgets] + dev-qt/qtsvg:6 + dev-qt/qttools:6[designer?,widgets] + $(python_gen_cond_dep ' + dev-python/matplotlib[${PYTHON_USEDEP}] + >=dev-python/pivy-0.6.5[${PYTHON_USEDEP}] + dev-python/pyside:6=[uitools(-),gui,svg,${PYTHON_USEDEP}] + ' ) + virtual/opengl + spacenav? ( dev-libs/libspnav[X?] ) + ) + netgen? ( media-gfx/netgen[opencascade] ) + openscad? ( $(python_gen_cond_dep 'dev-python/ply[${PYTHON_USEDEP}]') ) + pcl? ( sci-libs/pcl:= ) + smesh? ( + >=sci-libs/med-4.0.0-r1 + sci-libs/vtk:= + ) +" +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-cpp/gtest + ) +" +BDEPEND=" + dev-lang/swig + test? ( + gui? ( + $(python_gen_cond_dep ' + dev-python/pytest[${PYTHON_USEDEP}] + dev-python/typing-extensions[${PYTHON_USEDEP}] + ' ) + ) + ) +" + +PATCHES=( + "${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}-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 ) + +CHECKREQS_DISK_BUILD="2G" + +cuda_get_host_compiler() { + if [[ -v NVCC_CCBIN ]]; then + echo "${NVCC_CCBIN}" + return + fi + + if [[ -v CUDAHOSTCXX ]]; then + echo "${CUDAHOSTCXX}" + return + fi + + if ! command -v nvcc >/dev/null; then + eerror "Could not find nvcc. Is the CUDA SDK installed?" + die "nvcc not found" + fi + + einfo "Trying to find working CUDA host compiler" + + if ! tc-is-gcc && ! tc-is-clang; then + die "$(tc-get-compiler-type) compiler is not supported" + fi + + # compiler with CHOST prefix + # x86_64-pc-linux-gnu-g++ + local compiler + + # gcc or clang + local compiler_type + + # major version of the current compiler. 15 + local compiler_version + + # cat/pkg of the compiler + # sys-devel/gcc, llvm-core/clang + local package + + # QPN of the package we are checking + # sys-devel/gcc, <sys-devel/gcc-15 + local package_version + + # system compiler e.g. tc-getCXX plus version + # used to skip rechecking, as we check NVCC_CCBIN first + # x86_64-pc-linux-gnu-g++-15 + local NVCC_CCBIN_default + + compiler_type="$(tc-get-compiler-type)" + compiler_version="$("${compiler_type}-major-version")" + + # try the default compiler first + NVCC_CCBIN="$(tc-getCXX)" + NVCC_CCBIN_default="${NVCC_CCBIN}-${compiler_version}" + + compiler="${NVCC_CCBIN/%-${compiler_version}}" + + # store the package so we can re-use it later + if tc-is-gcc; then + package="sys-devel/${compiler_type}" + elif tc-is-clang; then + package="llvm-core/${compiler_type}" + else + die "$(tc-get-compiler-type) compiler is not supported" + fi + + package_version="${package}" + + ebegin "testing ${NVCC_CCBIN_default} (default)" + + while ! \ + nvcc "${NVCCFLAGS:-}" \ + -ccbin "${NVCC_CCBIN}" \ + - \ + -x cu \ + <<<"int main(){}" \ + &>> "${T:?}/cuda_get_host_compiler.log" ; + do + eend 1 + + while true; do + # prepare next version + local package_version_next + package_version_next="$(best_version "${package_version}")" + + if [[ -z "${package_version_next}" ]]; then + eerror "Compiler lookup failed. Nothing installed matches: ${package_version}." + eerror "You can use NVCC_CCBIN to specify the exact compiler to use." + eerror "Check ${T}/cuda_get_host_compiler.log for details." + die "Could not find a supported version of ${compiler}. Did not find \"${package_version}\". NVCC_CCBIN is unset." + fi + + package_version="<${package_version_next}" + + NVCC_CCBIN="${compiler}-$(ver_cut 1 "${package_version/#<${package}-/}")" + + # skip the next version equals the already checked system default + [[ "${NVCC_CCBIN}" != "${NVCC_CCBIN_default}" ]] && break + done + ebegin "testing ${NVCC_CCBIN}" + done + eend $? + + echo "${NVCC_CCBIN}" + export NVCC_CCBIN +} + +pkg_setup() { + check-reqs_pkg_setup + python-single-r1_pkg_setup +} + +src_prepare() { + # Fix desktop file + sed -e 's/Exec=FreeCAD/Exec=freecad/' -i src/XDGData/org.freecad.FreeCAD.desktop || die + + # deprecated in python-3.11 removed in python-3.13 + 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() { + # -Werror=odr, -Werror=lto-type-mismatch + # https://bugs.gentoo.org/875221 + # https://github.com/FreeCAD/FreeCAD/issues/13173 + append-flags -fno-strict-aliasing + filter-lto + + # Fix building tests + if tc-ld-is-bfd; then # 940524 + append-ldflags -Wl,--copy-dt-needed-entries + fi + + local mycmakeargs=( + -DCMAKE_POLICY_DEFAULT_CMP0144="OLD" # FLANN_ROOT + -DCMAKE_POLICY_DEFAULT_CMP0167="OLD" # FindBoost + -DCMAKE_POLICY_DEFAULT_CMP0175="OLD" # add_custom_command + -DCMAKE_POLICY_DEFAULT_CMP0153="OLD" # exec_program + + -DBUILD_DESIGNER_PLUGIN=$(usex designer) + -DBUILD_FORCE_DIRECTORY=ON # force building in a dedicated directory + -DBUILD_GUI=$(usex gui) + -DBUILD_SMESH=$(usex smesh) + -DBUILD_VR=OFF + -DBUILD_WITH_CONDA=OFF + + # Modules + -DBUILD_ADDONMGR=$(usex addonmgr) + -DBUILD_ASSEMBLY=$(usex assembly) + -DBUILD_BIM=$(usex bim) + -DBUILD_CAM=$(usex cam) + -DBUILD_CLOUD=$(usex cloud) + -DBUILD_DRAFT=ON + # see below for DRAWING + -DBUILD_FEM=$(usex fem) + -DBUILD_FEM_NETGEN=$(usex fem $(usex netgen)) + -DBUILD_FLAT_MESH=$(usex mesh) # a submodule of MeshPart + -DBUILD_HELP=ON + -DBUILD_IDF=$(usex idf) + -DBUILD_IMPORT=ON # import module for various file formats + -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) + -DBUILD_OPENSCAD=$(usex openscad) + -DBUILD_PART=ON + -DBUILD_PART_DESIGN=ON + -DBUILD_PLOT=ON + -DBUILD_POINTS=$(usex points) + -DBUILD_REVERSEENGINEERING=$(usex reverse) + -DBUILD_ROBOT=$(usex robot) + # -DBUILD_SANDBOX=OFF + -DBUILD_SHOW=$(usex gui) + -DBUILD_SKETCHER=ON # needed by draft workspace + -DBUILD_SPREADSHEET=ON + -DBUILD_START=ON + -DBUILD_SURFACE=$(usex surface) + -DBUILD_TECHDRAW=$(usex techdraw) + -DBUILD_TEST="$(usex test)" # always build test workbench for run-time testing + -DBUILD_TUX=$(usex gui) + -DBUILD_WEB=ON # needed by start workspace + + # 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 + -DFREECAD_USE_EXTERNAL_FMT="yes" + -DFREECAD_USE_EXTERNAL_KDL=OFF # https://github.com/FreeCAD/FreeCAD/commit/9f98866 + -DFREECAD_USE_FREETYPE=ON + -DFREECAD_USE_OCC_VARIANT:STRING="Official Version" + -DFREECAD_USE_PCL=$(usex pcl) + -DFREECAD_USE_PYBIND11=ON + -DFREECAD_USE_QT_FILEDIALOG=ON + + # install python modules to site-packages' dir. True only for the main package, + # sub-packages will still be installed inside /usr/lib64/freecad + -DINSTALL_TO_SITEPACKAGES=ON + + # Use the version of pyside[tools] that matches the selected python version + -DPYTHON_CONFIG_SUFFIX="-${EPYTHON}" + # -DPython3_EXECUTABLE=${EPYTHON} + ) + + 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 + + if use debug; then + # BUILD_SANDBOX currently broken, see + # https://forum.freecadweb.org/viewtopic.php?f=4&t=36071&start=30#p504595 + mycmakeargs+=( + -DBUILD_SANDBOX=OFF + -DBUILD_TEMPLATE=ON + ) + else + mycmakeargs+=( + -DBUILD_SANDBOX=OFF + -DBUILD_TEMPLATE=OFF + ) + fi + + # fem and smesh depend on sci-lib/vtk, which looks up a cuda compiler when build with USE=cuda. + # We therefore need to set the correct CUDAHOSTCXX and setup the sandbox. + if use fem || use smesh; then + if has_version "sci-libs/vtk[cuda]" ; then + cuda_add_sandbox + addpredict "/dev/char/" + export CUDAHOSTCXX="$(cuda_get_host_compiler)" + fi + fi + + if use gui; then + mycmakeargs+=( + -DFREECAD_QT_MAJOR_VERSION=6 + -DFREECAD_QT_VERSION=6 + -DQT_DEFAULT_MAJOR_VERSION=6 + -DQt6Core_MOC_EXECUTABLE="$(qt6_get_bindir)/moc" + -DQt6Core_RCC_EXECUTABLE="$(qt6_get_bindir)/rcc" + -DBUILD_QT5=OFF + # Drawing module unmaintained and not ported to qt6 + -DBUILD_DRAWING=OFF + ) + fi + + cmake_src_configure +} + +# We use the FreeCADCmd binary instead of the FreeCAD binary here +# for two reasons: +# 1. It works out of the box with USE=-gui as well, not needing a guard +# 2. We don't need virtualx.eclass and its dependencies +# The environment variables are needed, so that FreeCAD knows +# where to save its temporary files, and where to look and write its +# 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" + ) + + 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}/data" + local -x FREECAD_USER_TEMP="${T}/temp" + + mkdir -p "${FREECAD_USER_DATA}" "${FREECAD_USER_TEMP}" || die + + local failed=() + local run + + if \ + ! nonfatal \ + edo \ + "${BUILD_DIR}/bin/FreeCADCmd" \ + --run-test 0 \ + --set-config AppHomePath="${BUILD_DIR}/" \ + --log-file "${T}/FreeCADCmd.log"; then + ret=$? + eerror "FreeCADCmd failed $ret" + failed+=( "FreeCADCmd" ) + fi + + if use gui; then + 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" + + if \ + ! nonfatal \ + virtx \ + edo \ + "${BUILD_DIR}/bin/FreeCAD" \ + --run-test 0 \ + --set-config AppHomePath="${BUILD_DIR}/" \ + --log-file "${T}/FreeCAD.log" ; then + ret=$? + eerror "FreeCAD failed $ret" + failed+=( "FreeCAD" ) + fi + + run="virtx" + fi + + 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 use gui; then + newbin - freecad <<- _EOF_ + #!/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_ + 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/" "${ED}/usr/$(get_libdir)/${PN}/"{Ext,Mod}/ + # compile main package in python site-packages as well + python_optimize +} + +pkg_postinst() { + xdg_pkg_postinst + + einfo "You can load a lot of additional workbenches using the integrated" + einfo "AddonManager." + + einfo "There are a lot of additional tools, for which FreeCAD has builtin" + einfo "support. Some of them are available in Gentoo. Take a look at" + einfo "https://wiki.freecad.org/Installing_additional_components" + optfeature_header "External programs used by FreeCAD" + optfeature "dependency graphs" media-gfx/graphviz + optfeature "importing and exporting 2D AutoCAD DWG files" media-gfx/libredwg + optfeature "importing OpenSCAD files, Mesh booleans" media-gfx/openscad + use bim && optfeature "working with COLLADA documents" dev-python/pycollada + 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() { + xdg_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 |
