diff --git a/.github/workflows/sub_weeklyBuild.yml b/.github/workflows/sub_weeklyBuild.yml
new file mode 100644
index 0000000000..4f15c0c980
--- /dev/null
+++ b/.github/workflows/sub_weeklyBuild.yml
@@ -0,0 +1,143 @@
+name: Weekly Build
+on:
+ schedule:
+ - cron: "42 7 * * 2"
+
+permissions:
+ contents: write
+
+jobs:
+ tag_build:
+ runs-on: ubuntu-latest
+ outputs:
+ build_tag: ${{ steps.tag_build.outputs.build_tag }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 2
+ submodules: 'recursive'
+
+ - name: Tag Build
+ id: tag_build
+ shell: bash -l {0}
+ run: |
+ export BUILD_TAG=weekly-$(date "+%Y.%m.%d")
+ git tag ${BUILD_TAG}
+ git push origin tag ${BUILD_TAG} -f
+ echo "BUILD_TAG=${BUILD_TAG}" >> "$GITHUB_ENV"
+ echo "build_tag=${BUILD_TAG}" >> "$GITHUB_OUTPUT"
+
+ - name: Upload Source
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ python3 package/rattler-build/scripts/make_version_file.py ../freecad_version.txt
+ git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
+ git config user.name 'github-actions[bot]'
+ git apply package/rattler-build/scripts/disable_git_info.patch
+ git commit -a -m "Disable git info write to Version.h"
+ git archive HEAD -o freecad_source_${BUILD_TAG}.tar
+ git submodule foreach --recursive \
+ "git archive HEAD --prefix=\$path/ -o \$sha1.tar && \
+ tar -A -f \$toplevel/freecad_source_${BUILD_TAG}.tar \$sha1.tar && \
+ rm \$sha1.tar"
+ gzip freecad_source_${BUILD_TAG}.tar
+ sha256sum freecad_source_${BUILD_TAG}.tar.gz > freecad_source_${BUILD_TAG}.tar.gz-SHA256.txt
+ gh release create ${BUILD_TAG} --title "Weekly Build ${BUILD_TAG}" --notes "Weekly Build ${BUILD_TAG}" --prerelease || true
+ gh release upload --clobber ${BUILD_TAG} "freecad_source_${BUILD_TAG}.tar.gz" "freecad_source_${BUILD_TAG}.tar.gz-SHA256.txt"
+
+ build:
+ needs: tag_build
+ strategy:
+ matrix:
+ include:
+ - { target: linux-64, os: ubuntu-22.04 }
+ - { target: linux-arm64, os: ubuntu-22.04-arm }
+ - { target: osx-64, os: macos-13 }
+ - { target: osx-arm64, os: macos-latest }
+ - { target: win-64, os: windows-latest }
+ fail-fast: false
+
+ runs-on: ${{ matrix.os }}
+ environment: weekly-build
+ steps:
+ - name: Set Platform Environment Variables
+ shell: bash -l {0}
+ env:
+ BUILD_TAG: ${{ needs.tag_build.outputs.build_tag }}
+ OPERATING_SYSTEM: ${{ runner.os }}
+ run: |
+ echo "BUILD_TAG=${BUILD_TAG}" >> "$GITHUB_ENV"
+ if [[ $OPERATING_SYSTEM == 'Windows' ]]; then
+ echo 'PIXI_CACHE_DIR=D:\rattler' >> "$GITHUB_ENV"
+ echo 'RATTLER_CACHE_DIR=D:\rattler' >> "$GITHUB_ENV"
+ fi
+
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ fetch-tags: true
+ submodules: 'recursive'
+
+ - uses: prefix-dev/setup-pixi@v0.8.3
+ with:
+ pixi-version: v0.42.1
+ cache: false
+
+ - name: Install the Apple certificate and provisioning profile
+ if: runner.os == 'macOS'
+ env:
+ APP_SPECIFIC_PASSWORD: ${{ secrets.APP_SPECIFIC_PASSWORD }}
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
+ BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
+ DEVELOPER_TEAM_ID: ${{ secrets.DEVELOPER_TEAM_ID }}
+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
+ P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
+ run: |
+ # create variables
+ CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
+ PP_PATH=$RUNNER_TEMP/FreeCAD_Weekly.provisionprofile
+ KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
+
+ export KEYCHAIN_PASSWORD=$(openssl rand -base64 8)
+
+ # import certificate and provisioning profile from secrets
+ echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
+ echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
+
+ # create temporary keychain
+ security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
+ security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
+ security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
+
+ # import certificate to keychain
+ security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
+ security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
+ security list-keychain -d user -s $KEYCHAIN_PATH
+
+ # apply provisioning profile
+ mkdir -p ~/Library/Provisioning\ Profiles
+ cp $PP_PATH ~/Library/Provisioning\ Profiles
+
+ xcrun notarytool store-credentials "FreeCAD Weekly" --keychain "$KEYCHAIN_PATH" --apple-id "${APPLE_ID}" --password "${APP_SPECIFIC_PASSWORD}" --team-id "${DEVELOPER_TEAM_ID}"
+
+ - name: Build and Release Packages
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }}
+ SIGN_RELEASE: "true"
+ TARGET_PLATFORM: ${{ matrix.target }}
+ UPLOAD_RELEASE: "true"
+ run: |
+ cd package/rattler-build
+ pixi install
+ pixi run -e package create_bundle
+
+ ## Needed if running on a self-hosted runner:
+ # - name: Clean up keychain and provisioning profile
+ # if: ${{ always() }}
+ # run: |
+ # security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
+ # rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision
diff --git a/CMakePresets.json b/CMakePresets.json
index 02c14d4ddc..5223c37672 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -63,6 +63,10 @@
"type": "BOOL",
"value": "ON"
},
+ "BUILD_REVERSEENGINEERING": {
+ "type": "BOOL",
+ "value": "OFF"
+ },
"ENABLE_DEVELOPER_TESTS": {
"type": "BOOL",
"value": "ON"
@@ -91,6 +95,10 @@
"type": "BOOL",
"value": "ON"
},
+ "FREECAD_QT_VERSION": {
+ "type": "STRING",
+ "value": "6"
+ },
"OCCT_CMAKE_FALLBACK": {
"type": "BOOL",
"value": "ON"
@@ -111,22 +119,10 @@
},
"cmakeExecutable": "${sourceDir}/conda/cmake.sh",
"cacheVariables": {
- "CMAKE_INCLUDE_PATH": {
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/include"
- },
- "CMAKE_INSTALL_LIBDIR": {
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/lib"
- },
"CMAKE_INSTALL_PREFIX": {
"type": "FILEPATH",
"value": "$env{CONDA_PREFIX}"
},
- "CMAKE_LIBRARY_PATH":{
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/lib"
- },
"CMAKE_PREFIX_PATH": {
"type": "FILEPATH",
"value": "$env{CONDA_PREFIX}"
@@ -151,22 +147,10 @@
"type": "STRING",
"value": "/opt/homebrew;/usr/local/homebrew"
},
- "CMAKE_INCLUDE_PATH": {
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/include"
- },
- "CMAKE_INSTALL_LIBDIR": {
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/lib"
- },
"CMAKE_INSTALL_PREFIX": {
"type": "FILEPATH",
"value": "$env{CONDA_PREFIX}"
},
- "CMAKE_LIBRARY_PATH":{
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/lib"
- },
"CMAKE_PREFIX_PATH": {
"type": "FILEPATH",
"value": "$env{CONDA_PREFIX}"
@@ -187,22 +171,10 @@
},
"cmakeExecutable": "${sourceDir}/conda/cmake.cmd",
"cacheVariables": {
- "CMAKE_INCLUDE_PATH": {
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/Library/include"
- },
- "CMAKE_INSTALL_LIBDIR": {
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/Library/lib"
- },
"CMAKE_INSTALL_PREFIX": {
"type": "FILEPATH",
"value": "$env{CONDA_PREFIX}/Library"
},
- "CMAKE_LIBRARY_PATH":{
- "type": "FILEPATH",
- "value": "$env{CONDA_PREFIX}/Library/lib"
- },
"CMAKE_PREFIX_PATH": {
"type": "FILEPATH",
"value": "$env{CONDA_PREFIX}/Library"
diff --git a/package/rattler-build/build.bat b/package/rattler-build/build.bat
new file mode 100644
index 0000000000..a97b6591cf
--- /dev/null
+++ b/package/rattler-build/build.bat
@@ -0,0 +1,37 @@
+@echo on
+
+@REM :: free up extra disk space, compare
+@REM :: https://github.com/conda-forge/conda-smithy/issues/1949
+@REM rmdir /s /q C:\hostedtoolcache\windows
+
+@REM set "CFLAGS= "
+@REM set "CXXFLAGS= -DBOOST_PROGRAM_OPTIONS_DYN_LINK=1"
+@REM set "LDFLAGS_SHARED= ucrt.lib"
+
+set "CMAKE_GENERATOR="
+set "CMAKE_GENERATOR_PLATFORM="
+
+cmake ^
+ --preset conda-windows-release ^
+ -D CMAKE_INCLUDE_PATH:FILEPATH="%LIBRARY_PREFIX%/include" ^
+ -D CMAKE_INSTALL_LIBDIR:FILEPATH="%LIBRARY_PREFIX%/lib" ^
+ -D CMAKE_INSTALL_PREFIX:FILEPATH="%LIBRARY_PREFIX%" ^
+ -D CMAKE_LIBRARY_PATH:FILEPATH="%LIBRARY_PREFIX%/lib" ^
+ -D CMAKE_PREFIX_PATH:FILEPATH="%LIBRARY_PREFIX%" ^
+ -D FREECAD_USE_OCC_VARIANT="Official Version" ^
+ -D INSTALL_TO_SITEPACKAGES:BOOL=ON ^
+ -D OCC_INCLUDE_DIR:FILEPATH="%LIBRARY_PREFIX%/include" ^
+ -D OCCT_CMAKE_FALLBACK:BOOL=OFF ^
+ -D Python_EXECUTABLE:FILEPATH="%PYTHON%" ^
+ -D Python3_EXECUTABLE:FILEPATH="%PYTHON%" ^
+ -B build ^
+ -S . ^
+ ${CMAKE_PLATFORM_FLAGS[@]}
+if %ERRORLEVEL% neq 0 exit 1
+
+ninja -C build install
+if %ERRORLEVEL% neq 0 exit 1
+
+rmdir /s /q "%LIBRARY_PREFIX%\doc"
+ren %LIBRARY_PREFIX%\bin\FreeCAD.exe freecad.exe
+ren %LIBRARY_PREFIX%\bin\FreeCADCmd.exe freecadcmd.exe
diff --git a/package/rattler-build/build.sh b/package/rattler-build/build.sh
new file mode 100644
index 0000000000..ebce9d2692
--- /dev/null
+++ b/package/rattler-build/build.sh
@@ -0,0 +1,47 @@
+if [[ ${HOST} =~ .*linux.* ]]; then
+ CMAKE_PRESET=conda-linux-release
+fi
+
+if [[ ${HOST} =~ .*darwin.* ]]; then
+ CMAKE_PRESET=conda-macos-release
+
+ # add hacks for osx here!
+ echo "adding hacks for osx"
+
+ # install space-mouse
+ /usr/bin/curl -o /tmp/3dFW.dmg -L 'https://download.3dconnexion.com/drivers/mac/10-7-0_B564CC6A-6E81-42b0-82EC-418EA823B81A/3DxWareMac_v10-7-0_r3411.dmg'
+ hdiutil attach -readonly /tmp/3dFW.dmg
+ sudo installer -package /Volumes/3Dconnexion\ Software/Install\ 3Dconnexion\ software.pkg -target /
+ diskutil eject /Volumes/3Dconnexion\ Software
+ CMAKE_PLATFORM_FLAGS+=(-DFREECAD_USE_3DCONNEXION:BOOL=ON)
+ CMAKE_PLATFORM_FLAGS+=(-D3DCONNEXIONCLIENT_FRAMEWORK:FILEPATH="/Library/Frameworks/3DconnexionClient.framework")
+
+ CXXFLAGS="${CXXFLAGS} -D_LIBCPP_DISABLE_AVAILABILITY"
+fi
+
+unset CMAKE_GENERATOR
+unset CMAKE_GENERATOR_PLATFORM
+
+cmake \
+ --preset ${CMAKE_PRESET} \
+ -D CMAKE_IGNORE_PREFIX_PATH="/opt/homebrew;/usr/local/homebrew" \
+ -D CMAKE_INCLUDE_PATH:FILEPATH="$PREFIX/include" \
+ -D CMAKE_INSTALL_LIBDIR:FILEPATH="$PREFIX/lib" \
+ -D CMAKE_INSTALL_PREFIX:FILEPATH="$PREFIX" \
+ -D CMAKE_LIBRARY_PATH:FILEPATH="$PREFIX/lib" \
+ -D CMAKE_PREFIX_PATH:FILEPATH="$PREFIX" \
+ -D FREECAD_USE_OCC_VARIANT="Official Version" \
+ -D INSTALL_TO_SITEPACKAGES:BOOL=ON \
+ -D OCC_INCLUDE_DIR:FILEPATH="$PREFIX/include" \
+ -D OCCT_CMAKE_FALLBACK:BOOL=OFF \
+ -D Python_EXECUTABLE:FILEPATH="$PYTHON" \
+ -D Python3_EXECUTABLE:FILEPATH="$PYTHON" \
+ -B build \
+ -S . \
+ ${CMAKE_PLATFORM_FLAGS[@]}
+
+cmake --build build
+cmake --install build
+
+mv ${PREFIX}/bin/FreeCAD ${PREFIX}/bin/freecad || true
+mv ${PREFIX}/bin/FreeCADCmd ${PREFIX}/bin/freecadcmd || true
diff --git a/package/rattler-build/conda_build_config.yaml b/package/rattler-build/conda_build_config.yaml
new file mode 100644
index 0000000000..688c3a50e4
--- /dev/null
+++ b/package/rattler-build/conda_build_config.yaml
@@ -0,0 +1,7 @@
+c_compiler: # [win]
+ - vs2022 # [win]
+cxx_compiler: # [win]
+ - vs2022 # [win]
+
+MACOSX_SDK_VERSION: # [osx]
+ - '11.0' # [osx]
diff --git a/package/rattler-build/linux/AppDir/AppRun b/package/rattler-build/linux/AppDir/AppRun
new file mode 100755
index 0000000000..2389a99b76
--- /dev/null
+++ b/package/rattler-build/linux/AppDir/AppRun
@@ -0,0 +1,31 @@
+#!/bin/bash
+HERE="$(dirname "$(readlink -f "${0}")")"
+export PREFIX=${HERE}/usr
+# export LD_LIBRARY_PATH=${HERE}/usr/lib${LD_LIBRARY_PATH:+':'}$LD_LIBRARY_PATH
+export PYTHONHOME=${HERE}/usr
+export PATH_TO_FREECAD_LIBDIR=${HERE}/usr/lib
+# export QT_QPA_PLATFORM_PLUGIN_PATH=${HERE}/usr/plugins
+# export QT_XKB_CONFIG_ROOT=${HERE}/usr/lib
+export FONTCONFIG_FILE=/etc/fonts/fonts.conf
+export FONTCONFIG_PATH=/etc/fonts
+
+# Show packages info if DEBUG env variable is set
+if [ "$DEBUG" = 1 ]; then
+ cat ${HERE}/packages.txt
+fi
+
+# SSL
+# https://forum.freecad.org/viewtopic.php?f=4&t=34873&start=20#p327416
+export SSL_CERT_FILE=$PREFIX/ssl/cacert.pem
+# https://github.com/FreeCAD/FreeCAD-AppImage/pull/20
+export GIT_SSL_CAINFO=$HERE/usr/ssl/cacert.pem
+
+# Support for launching other applications (from /usr/bin)
+# https://github.com/FreeCAD/FreeCAD-AppImage/issues/30
+if [ ! -z "$1" ] && [ -e "$HERE/usr/bin/$1" ] ; then
+ MAIN="$HERE/usr/bin/$1" ; shift
+else
+ MAIN="$HERE/usr/bin/freecad"
+fi
+
+"${MAIN}" "$@"
diff --git a/package/rattler-build/linux/create_bundle.sh b/package/rattler-build/linux/create_bundle.sh
new file mode 100755
index 0000000000..5482924cad
--- /dev/null
+++ b/package/rattler-build/linux/create_bundle.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+set -e
+set -x
+
+conda_env="AppDir/usr"
+
+mkdir -p ${conda_env}
+
+cp -a ../.pixi/envs/default/* ${conda_env}
+
+export PATH="${PWD}/${conda_env}/bin:${PATH}"
+export CONDA_PREFIX="${PWD}/${conda_env}"
+
+echo -e "\nDelete unnecessary stuff"
+rm -rf ${conda_env}/include
+find ${conda_env} -name \*.a -delete
+
+mv ${conda_env}/bin ${conda_env}/bin_tmp
+mkdir ${conda_env}/bin
+cp ${conda_env}/bin_tmp/freecad ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/freecadcmd ${conda_env}/bin
+cp ${conda_env}/bin_tmp/ccx ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/python ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/pip ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/pyside6-rcc ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/gmsh ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/dot ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/unflatten ${conda_env}/bin/
+rm -rf ${conda_env}/bin_tmp
+
+sed -i '1s|.*|#!/usr/bin/env python|' ${conda_env}/bin/pip
+
+echo -e "\nCopying Icon and Desktop file"
+cp ${conda_env}/share/applications/org.freecad.FreeCAD.desktop AppDir/
+sed -i 's/Exec=FreeCAD/Exec=AppRun/g' AppDir/org.freecad.FreeCAD.desktop
+cp ${conda_env}/share/icons/hicolor/scalable/apps/org.freecad.FreeCAD.svg AppDir/
+
+# Remove __pycache__ folders and .pyc files
+find . -path "*/__pycache__/*" -delete
+find . -name "*.pyc" -type f -delete
+
+# reduce size
+rm -rf ${conda_env}/conda-meta/
+rm -rf ${conda_env}/doc/global/
+rm -rf ${conda_env}/share/gtk-doc/
+rm -rf ${conda_env}/lib/cmake/
+
+find . -name "*.h" -type f -delete
+find . -name "*.cmake" -type f -delete
+
+build_tag=$(git describe --tags)
+python_version=$(python -c 'import platform; print("py" + platform.python_version_tuple()[0] + platform.python_version_tuple()[1])')
+version_name="FreeCAD_${build_tag}-Linux-$(uname -m)-${python_version}"
+
+echo -e "\################"
+echo -e "version_name: ${version_name}"
+echo -e "################"
+
+pixi list -e default > AppDir/packages.txt
+sed -i "1s/.*/\nLIST OF PACKAGES:/" AppDir/packages.txt
+
+export tag="weekly-builds" # should retreive from git tag
+
+curl -LO https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-$(uname -m).AppImage
+chmod a+x appimagetool-$(uname -m).AppImage
+
+echo -e "\nCreate the appimage"
+# export GPG_TTY=$(tty)
+chmod a+x ./AppDir/AppRun
+./appimagetool-$(uname -m).AppImage \
+ --comp zstd \
+ --mksquashfs-opt -Xcompression-level \
+ --mksquashfs-opt 22 \
+ -u "gh-releases-zsync|FreeCAD|FreeCAD-Bundle|$tag|FreeCAD*$(uname -m)*.AppImage.zsync" \
+ AppDir ${version_name}.AppImage
+ # -s --sign-key ${GPG_KEY_ID} \
+
+echo -e "\nCreate hash"
+sha256sum ${version_name}.AppImage > ${version_name}.AppImage-SHA256.txt
+
+if [ "${UPLOAD_RELEASE}" == "true" ]; then
+ gh release create ${BUILD_TAG} --title "Weekly Build ${BUILD_TAG}" --notes "Weekly Build ${BUILD_TAG}" --prerelease || true
+ gh release upload --clobber ${BUILD_TAG} "${version_name}.AppImage" "${version_name}.AppImage-SHA256.txt"
+fi
diff --git a/package/rattler-build/osx/Info.plist.template b/package/rattler-build/osx/Info.plist.template
new file mode 100644
index 0000000000..45ba0c2274
--- /dev/null
+++ b/package/rattler-build/osx/Info.plist.template
@@ -0,0 +1,90 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ FreeCAD
+ CFBundleGetInfoString
+
+ CFBundleIconFile
+ freecad.icns
+ CFBundleIdentifier
+ org.freecad.FreeCAD
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleLongVersionString
+
+ CFBundleName
+ APPLICATION_MENU_NAME
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ FREECAD_VERSION
+ CSResourcesFileMapped
+
+ NSHumanReadableCopyright
+
+ NSPrincipalClass
+ NSApplication
+ NSHighResolutionCapable
+ True
+ NSRequiresAquaSystemAppearance
+ False
+ CFBundleDocumentTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleTypeExtensions
+
+ FCStd
+ FCMat
+ FCParam
+
+ CFBundleTypeIconFile
+ freecad-doc.icns
+ LSIsAppleDefaultForType
+
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleTypeExtensions
+
+ FCMacro
+ FCScript
+
+ CFBundleTypeIconFile
+ freecad-script.icns
+ LSIsAppleDefaultForType
+
+
+
+ UTExportedTypeDeclarations
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ FreeCAD Document
+ UTTypeIdentifier
+ org.freecad.fcstd
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ FCStd
+
+
+
+
+
+
diff --git a/package/rattler-build/osx/create_bundle.sh b/package/rattler-build/osx/create_bundle.sh
new file mode 100644
index 0000000000..c48c92f20c
--- /dev/null
+++ b/package/rattler-build/osx/create_bundle.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+set -e
+set -x
+
+conda_env="FreeCAD.app/Contents/Resources"
+
+mkdir -p ${conda_env}
+
+cp -a ../.pixi/envs/default/* ${conda_env}
+
+export PATH="${PWD}/${conda_env}/bin:${PATH}"
+export CONDA_PREFIX="${PWD}/${conda_env}"
+
+# delete unnecessary stuff
+rm -rf ${conda_env}/include
+find ${conda_env} -name \*.a -delete
+
+mv ${conda_env}/bin ${conda_env}/bin_tmp
+mkdir ${conda_env}/bin
+cp ${conda_env}/bin_tmp/freecad ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/freecadcmd ${conda_env}/bin
+cp ${conda_env}/bin_tmp/ccx ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/python ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/pip ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/pyside6-rcc ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/gmsh ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/dot ${conda_env}/bin/
+cp ${conda_env}/bin_tmp/unflatten ${conda_env}/bin/
+rm -rf ${conda_env}/bin_tmp
+
+sed -i '1s|.*|#!/usr/bin/env python|' ${conda_env}/bin/pip
+
+# copy resources
+cp resources/* ${conda_env}
+
+# Remove __pycache__ folders and .pyc files
+find . -path "*/__pycache__/*" -delete
+find . -name "*.pyc" -type f -delete
+
+# fix problematic rpaths and reexport_dylibs for signing
+# see https://github.com/FreeCAD/FreeCAD/issues/10144#issuecomment-1836686775
+# and https://github.com/FreeCAD/FreeCAD-Bundle/pull/203
+python ../scripts/fix_macos_lib_paths.py ${conda_env}/lib
+
+# build and install the launcher
+cmake -B build launcher
+cmake --build build
+mkdir -p FreeCAD.app/Contents/MacOS
+cp build/FreeCAD FreeCAD.app/Contents/MacOS/FreeCAD
+
+python_version=$(python -c 'import platform; print("py" + platform.python_version_tuple()[0] + platform.python_version_tuple()[1])')
+version_name="FreeCAD_${BUILD_TAG}-macOS-$(uname -m)-${python_version}"
+application_menu_name="FreeCAD_${BUILD_TAG}"
+
+echo -e "\################"
+echo -e "version_name: ${version_name}"
+echo -e "################"
+
+cp Info.plist.template ${conda_env}/../Info.plist
+sed -i "s/FREECAD_VERSION/${version_name}/" ${conda_env}/../Info.plist
+sed -i "s/APPLICATION_MENU_NAME/${application_menu_name}/" ${conda_env}/../Info.plist
+
+pixi list -e default > FreeCAD.app/Contents/packages.txt
+sed -i '1s/.*/\nLIST OF PACKAGES:/' FreeCAD.app/Contents/packages.txt
+
+# copy the plugin into its final location
+cp -a ${conda_env}/Library ${conda_env}/..
+rm -rf ${conda_env}/Library
+
+if [[ "${SIGN_RELEASE}" == "true" ]]; then
+ # create the signed dmg
+ ./macos_sign_and_notarize.zsh -p "FreeCAD Weekly" -k ${SIGNING_KEY_ID} -o "${version_name}.dmg"
+else
+ # create the dmg
+ dmgbuild -s dmg_settings.py "FreeCAD" "${version_name}.dmg"
+fi
+
+# create hash
+sha256sum ${version_name}.dmg > ${version_name}.dmg-SHA256.txt
+
+if [[ "${UPLOAD_RELEASE}" == "true" ]]; then
+ gh release create ${BUILD_TAG} --title "Weekly Build ${BUILD_TAG}" --notes "Weekly Build ${BUILD_TAG}" --prerelease || true
+ gh release upload --clobber ${BUILD_TAG} "${version_name}.dmg" "${version_name}.dmg-SHA256.txt"
+fi
diff --git a/package/rattler-build/osx/dmg_settings.py b/package/rattler-build/osx/dmg_settings.py
new file mode 100644
index 0000000000..9e3b2decd9
--- /dev/null
+++ b/package/rattler-build/osx/dmg_settings.py
@@ -0,0 +1,12 @@
+# Ensure default values are set in defines if they are not already provided
+defines.setdefault('containing_folder', '.')
+defines.setdefault('app_name', 'FreeCAD.app')
+defines.setdefault('icon_path', 'Contents/Resources/freecad.icns')
+
+
+files = [f"{defines['containing_folder']}/{defines['app_name']}"]
+symlinks = {"Applications": "/Applications"}
+badge_icon = f"{defines['containing_folder']}/{defines['app_name']}/{defines['icon_path']}"
+window_rect = ((200, 200), (600, 400))
+icon_locations = {f"{defines['app_name']}": (180, 150), "Applications": (420, 150)}
+size = "4g"
diff --git a/package/rattler-build/osx/entitlements.plist b/package/rattler-build/osx/entitlements.plist
new file mode 100644
index 0000000000..8cc185af8d
--- /dev/null
+++ b/package/rattler-build/osx/entitlements.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.security.cs.disable-library-validation
+
+
+
diff --git a/package/rattler-build/osx/launcher/CMakeLists.txt b/package/rattler-build/osx/launcher/CMakeLists.txt
new file mode 100644
index 0000000000..222fd17559
--- /dev/null
+++ b/package/rattler-build/osx/launcher/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.20)
+project(freecad-launcher LANGUAGES CXX)
+
+set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version" FORCE)
+set(CMAKE_CXX_STANDARD 17)
+
+add_executable(FreeCAD FreeCAD.cpp)
+target_link_libraries(FreeCAD)
diff --git a/package/rattler-build/osx/launcher/FreeCAD.cpp b/package/rattler-build/osx/launcher/FreeCAD.cpp
new file mode 100644
index 0000000000..562acac4c3
--- /dev/null
+++ b/package/rattler-build/osx/launcher/FreeCAD.cpp
@@ -0,0 +1,75 @@
+#include
+#include
+#include
+#include