ENH: Improve macOS build script (#4310)

* ENH: Improve macOS build script

 - Update shebang to bash, as it is already expected to be present in
   run_gettext.sh
 - Added fail-fast shell options.
 - Changed default CMake generator to Ninja
 - Adopted configuration for non-multi-config generators (Ninja, Make)
 - Added new options:
   - Allow to set CMake generator back to Xcode, no option for make
     thou.
   - Allow to build without reconfiguring CMake, improves build times.
     Unnecessary Cmake reconfigurations require full rebuild.
   - Allow to set build configuration for CMake
 - Reorganized targets into separate function to break "cd" dependency.
 - Reformat shell code.
 - Fix all warnings reported by ShellCheck linter tool.
 - Update run_gettext.sh to respect build dir in full mode.

Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com>

* FIX: Install ninja with brew on CI.

Test if building works with Ninja by default.

Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com>

* ENH: Set Xcode back as default generator.

Use Ninja on CI with explicit option.

Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com>

* FIX: Partially revent changes in run_gettext.sh

Revert changes for option parsing.
Leave fixes for issues found by ShellCheck linter tool.

Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com>

---------

Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com>
This commit is contained in:
Dzmitry Neviadomski 2024-03-05 17:35:46 +03:00 committed by GitHub
parent eae2703610
commit 7b31ee3a45
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 177 additions and 69 deletions

View file

@ -70,12 +70,12 @@ jobs:
if: inputs.os == 'macos-12' if: inputs.os == 'macos-12'
working-directory: ${{ github.workspace }} working-directory: ${{ github.workspace }}
run: | run: |
brew install cmake git gettext automake texinfo brew install cmake git gettext automake texinfo ninja
brew list brew list
mkdir -p ${{ github.workspace }}/deps/build_${{ inputs.arch }} mkdir -p ${{ github.workspace }}/deps/build_${{ inputs.arch }}
mkdir -p ${{ github.workspace }}/deps/build_${{ inputs.arch }}/OrcaSlicer_dep_${{ inputs.arch }} mkdir -p ${{ github.workspace }}/deps/build_${{ inputs.arch }}/OrcaSlicer_dep_${{ inputs.arch }}
brew uninstall --ignore-dependencies zstd brew uninstall --ignore-dependencies zstd
./build_release_macos.sh -dp -a ${{ inputs.arch }} -t 10.15 ./build_release_macos.sh -dpx -a ${{ inputs.arch }} -t 10.15
brew install zstd brew install zstd

View file

@ -75,7 +75,7 @@ jobs:
- name: Install tools mac - name: Install tools mac
if: inputs.os == 'macos-12' if: inputs.os == 'macos-12'
run: | run: |
brew install cmake git gettext tree brew install cmake git gettext tree ninja
brew list brew list
mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}} mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}}
mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}}/OrcaSlicer_dep_${{inputs.arch}} mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}}/OrcaSlicer_dep_${{inputs.arch}}
@ -85,7 +85,7 @@ jobs:
if: inputs.os == 'macos-12' if: inputs.os == 'macos-12'
working-directory: ${{ github.workspace }} working-directory: ${{ github.workspace }}
run: | run: |
./build_release_macos.sh -s -n -a ${{inputs.arch}} -t 10.15 ./build_release_macos.sh -s -n -x -a ${{inputs.arch}} -t 10.15
# Thanks to RaySajuuk, it's working now # Thanks to RaySajuuk, it's working now
- name: Sign app and notary - name: Sign app and notary

View file

@ -1,7 +1,10 @@
#!/bin/sh #!/bin/bash
while getopts ":a:sdpt:hn" opt; do set -e
case ${opt} in set -o pipefail
while getopts ":dpa:snt:xbc:h" opt; do
case "${opt}" in
d ) d )
export BUILD_TARGET="deps" export BUILD_TARGET="deps"
;; ;;
@ -20,25 +23,62 @@ while getopts ":a:sdpt:hn" opt; do
t ) t )
export OSX_DEPLOYMENT_TARGET="$OPTARG" export OSX_DEPLOYMENT_TARGET="$OPTARG"
;; ;;
x )
export CMAKE_GENERATOR="Ninja"
;;
b )
export BUILD_ONLY="1"
;;
c )
export BUILD_CONFIG="$OPTARG"
;;
h ) echo "Usage: ./build_release_macos.sh [-d]" h ) echo "Usage: ./build_release_macos.sh [-d]"
echo " -d: Build deps only" echo " -d: Build deps only"
echo " -a: Set ARCHITECTURE (arm64 or x86_64)" echo " -a: Set ARCHITECTURE (arm64 or x86_64)"
echo " -s: Build slicer only" echo " -s: Build slicer only"
echo " -n: Nightly build" echo " -n: Nightly build"
echo " -t: Specify minimum version of the target platform, default is 11.3" echo " -t: Specify minimum version of the target platform, default is 11.3"
echo " -x: Use Ninja CMake generator, default is Xcode"
echo " -b: Build without reconfiguring CMake"
echo " -c: Set CMake build configuration, default is Release"
exit 0 exit 0
;; ;;
* )
;;
esac esac
done done
if [ -z "$ARCH" ] # Set defaults
then
export ARCH=$(uname -m) if [ -z "$ARCH" ]; then
ARCH="$(uname -m)"
export ARCH
fi fi
echo "Arch: $ARCH" if [ -z "$BUILD_CONFIG" ]; then
echo "BUILD_TARGET: $BUILD_TARGET" export BUILD_CONFIG="Release"
echo "OSX_DEPLOYMENT_TARGET: $OSX_DEPLOYMENT_TARGET" fi
if [ -z "$BUILD_TARGET" ]; then
export BUILD_TARGET="all"
fi
if [ -z "$CMAKE_GENERATOR" ]; then
export CMAKE_GENERATOR="Xcode"
fi
if [ -z "$OSX_DEPLOYMENT_TARGET" ]; then
export OSX_DEPLOYMENT_TARGET="11.3"
fi
echo "Build params:"
echo " - ARCH: $ARCH"
echo " - BUILD_CONFIG: $BUILD_CONFIG"
echo " - BUILD_TARGET: $BUILD_TARGET"
echo " - CMAKE_GENERATOR: $CMAKE_GENERATOR"
echo " - OSX_DEPLOYMENT_TARGET: $OSX_DEPLOYMENT_TARGET"
echo
# if which -s brew; then # if which -s brew; then
# brew --prefix libiconv # brew --prefix libiconv
# brew --prefix zstd # brew --prefix zstd
@ -52,49 +92,92 @@ echo "OSX_DEPLOYMENT_TARGET: $OSX_DEPLOYMENT_TARGET"
# exit 1 # exit 1
# fi # fi
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_BUILD_DIR="$PROJECT_DIR/build_$ARCH"
DEPS_DIR="$PROJECT_DIR/deps"
DEPS_BUILD_DIR="$DEPS_DIR/build_$ARCH"
DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep_$ARCH"
WD="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Fix for Multi-config generators
cd $WD/deps if [ "$CMAKE_GENERATOR" == "Xcode" ]; then
mkdir -p build_$ARCH export BUILD_DIR_CONFIG_SUBDIR="$BUILD_CONFIG/"
cd build_$ARCH else
DEPS=$PWD/OrcaSlicer_dep_$ARCH export BUILD_DIR_CONFIG_SUBDIR=""
mkdir -p $DEPS
if [ "slicer." != $BUILD_TARGET. ];
then
echo "building deps..."
echo "cmake ../ -DDESTDIR=$DEPS -DOPENSSL_ARCH=darwin64-${ARCH}-cc -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES:STRING=${ARCH} -DCMAKE_OSX_DEPLOYMENT_TARGET=${OSX_DEPLOYMENT_TARGET}"
cmake ../ -DDESTDIR="$DEPS" -DOPENSSL_ARCH="darwin64-${ARCH}-cc" -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES:STRING=${ARCH} -DCMAKE_OSX_DEPLOYMENT_TARGET=${OSX_DEPLOYMENT_TARGET}
cmake --build . --config Release --target deps
if [ "1." == "$PACK_DEPS". ];
then
tar -zcvf OrcaSlicer_dep_mac_${ARCH}_$(date +"%Y%m%d").tar.gz OrcaSlicer_dep_$ARCH
fi
fi fi
function build_deps() {
if [ "deps." == "$BUILD_TARGET". ]; echo "Building deps..."
then (
exit 0 set -x
mkdir -p "$DEPS"
cd "$DEPS_BUILD_DIR"
if [ "1." != "$BUILD_ONLY". ]; then
cmake .. \
-DDESTDIR="$DEPS" \
-DOPENSSL_ARCH="darwin64-${ARCH}-cc" \
-DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \
-DCMAKE_OSX_ARCHITECTURES:STRING="${ARCH}" \
-DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}"
fi fi
cmake --build . --config "$BUILD_CONFIG" --target deps
)
}
cd $WD function pack_deps() {
mkdir -p build_$ARCH echo "Packing deps..."
cd build_$ARCH (
echo "building slicer..." set -x
cmake .. -GXcode -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="$DEPS/usr/local" -DCMAKE_INSTALL_PREFIX="$PWD/OrcaSlicer" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MACOSX_RPATH=ON -DCMAKE_INSTALL_RPATH="$DEPS/usr/local" -DCMAKE_MACOSX_BUNDLE=ON -DCMAKE_OSX_ARCHITECTURES=${ARCH} -DCMAKE_OSX_DEPLOYMENT_TARGET=${OSX_DEPLOYMENT_TARGET} mkdir -p "$DEPS"
cmake --build . --config Release --target ALL_BUILD cd "$DEPS_BUILD_DIR"
cd .. tar -zcvf "OrcaSlicer_dep_mac_${ARCH}_$(date +"%Y%m%d").tar.gz" "OrcaSlicer_dep_$ARCH"
)
}
function build_slicer() {
echo "Building slicer..."
(
set -x
mkdir -p "$PROJECT_BUILD_DIR"
cd "$PROJECT_BUILD_DIR"
if [ "1." != "$BUILD_ONLY". ]; then
cmake .. \
-DBBL_RELEASE_TO_PUBLIC=1 \
-DCMAKE_PREFIX_PATH="$DEPS/usr/local" \
-DCMAKE_INSTALL_PREFIX="$PWD/OrcaSlicer" \
-DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \
-DCMAKE_MACOSX_RPATH=ON \
-DCMAKE_INSTALL_RPATH="${DEPS}/usr/local" \
-DCMAKE_MACOSX_BUNDLE=ON \
-DCMAKE_OSX_ARCHITECTURES="${ARCH}" \
-DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}"
fi
cmake --build . --config "$BUILD_CONFIG" --target all
)
echo "Verify localization with gettext..."
(
cd "$PROJECT_DIR"
./run_gettext.sh ./run_gettext.sh
cd build_$ARCH # ./run_gettext.sh --full "$PROJECT_BUILD_DIR" "$BUILD_DIR_CONFIG_SUBDIR"
)
echo "Fix macOS app package..."
(
cd "$PROJECT_BUILD_DIR"
mkdir -p OrcaSlicer mkdir -p OrcaSlicer
cd OrcaSlicer cd OrcaSlicer
rm -r ./OrcaSlicer.app # remove previously built app
cp -pR ../src/Release/OrcaSlicer.app ./OrcaSlicer.app rm -rf ./OrcaSlicer.app
# fully copy newly built app
cp -pR "../src$BUILD_DIR_CONFIG_SUBDIR/OrcaSlicer.app" ./OrcaSlicer.app
# fix resources
resources_path=$(readlink ./OrcaSlicer.app/Contents/Resources) resources_path=$(readlink ./OrcaSlicer.app/Contents/Resources)
rm ./OrcaSlicer.app/Contents/Resources rm ./OrcaSlicer.app/Contents/Resources
cp -R $resources_path ./OrcaSlicer.app/Contents/Resources cp -R "$resources_path" ./OrcaSlicer.app/Contents/Resources
# delete .DS_Store file # delete .DS_Store file
find ./OrcaSlicer.app/ -name '.DS_Store' -delete find ./OrcaSlicer.app/ -name '.DS_Store' -delete
)
# extract version # extract version
# export ver=$(grep '^#define SoftFever_VERSION' ../src/libslic3r/libslic3r_version.h | cut -d ' ' -f3) # export ver=$(grep '^#define SoftFever_VERSION' ../src/libslic3r/libslic3r_version.h | cut -d ' ' -f3)
# ver="_V${ver//\"}" # ver="_V${ver//\"}"
@ -104,5 +187,26 @@ find ./OrcaSlicer.app/ -name '.DS_Store' -delete
# ver=${ver}_dev # ver=${ver}_dev
# fi # fi
# zip -FSr OrcaSlicer${ver}_Mac_${ARCH}.zip OrcaSlicer.app # zip -FSr OrcaSlicer${ver}_Mac_${ARCH}.zip OrcaSlicer.app
}
case "${BUILD_TARGET}" in
all)
build_deps
build_slicer
;;
deps)
build_deps
;;
slicer)
build_slicer
;;
*)
echo "Unknown target: $BUILD_TARGET. Available targets: deps, slicer, all."
exit 1
;;
esac
if [ "1." == "$PACK_DEPS". ]; then
pack_deps
fi

View file

@ -8,7 +8,7 @@
FULL_MODE=false FULL_MODE=false
for arg in "$@" for arg in "$@"
do do
if [ "$arg" == "--full" ]; then if [ "$arg" = "--full" ]; then
FULL_MODE=true FULL_MODE=true
fi fi
done done
@ -19,7 +19,7 @@ if $FULL_MODE; then
fi fi
echo $PWD echo "$0: working dir = $PWD"
pot_file="./localization/i18n/OrcaSlicer.pot" pot_file="./localization/i18n/OrcaSlicer.pot"
for dir in ./localization/i18n/*/ for dir in ./localization/i18n/*/
do do
@ -28,10 +28,10 @@ do
if [ -f "$dir/OrcaSlicer_${lang}.po" ]; then if [ -f "$dir/OrcaSlicer_${lang}.po" ]; then
if $FULL_MODE; then if $FULL_MODE; then
msgmerge -N -o $dir/OrcaSlicer_${lang}.po $dir/OrcaSlicer_${lang}.po $pot_file msgmerge -N -o "$dir/OrcaSlicer_${lang}.po" "$dir/OrcaSlicer_${lang}.po" "$pot_file"
fi fi
mkdir -p ./resources/i18n/${lang}/ mkdir -p "resources/i18n/${lang}"
msgfmt --check-format -o ./resources/i18n/${lang}/OrcaSlicer.mo $dir/OrcaSlicer_${lang}.po msgfmt --check-format -o "resources/i18n/${lang}/OrcaSlicer.mo" "$dir/OrcaSlicer_${lang}.po"
# Check the exit status of the msgfmt command # Check the exit status of the msgfmt command
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Error encountered with msgfmt command for language ${lang}." echo "Error encountered with msgfmt command for language ${lang}."

View file

@ -249,7 +249,11 @@ else ()
set(BIN_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/../resources") set(BIN_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/../resources")
endif () endif ()
if (CMAKE_MACOSX_BUNDLE) if (CMAKE_MACOSX_BUNDLE)
if (XCODE)
set(BIN_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/OrcaSlicer.app/Contents/Resources") set(BIN_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/OrcaSlicer.app/Contents/Resources")
else()
set(BIN_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/OrcaSlicer.app/Contents/Resources")
endif()
set(MACOSX_BUNDLE_ICON_FILE Icon.icns) set(MACOSX_BUNDLE_ICON_FILE Icon.icns)
set(MACOSX_BUNDLE_BUNDLE_NAME "OrcaSlicer") set(MACOSX_BUNDLE_BUNDLE_NAME "OrcaSlicer")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${SoftFever_VERSION}) set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${SoftFever_VERSION})