Jenkins: Universal macOS building bringup

This commit is contained in:
RichardG867
2022-05-01 16:10:47 -03:00
parent ce1dc5d3b1
commit 97b5d2de7a
3 changed files with 184 additions and 19 deletions

View File

@@ -37,7 +37,9 @@
# build_arch x86_64 (or arm64) # build_arch x86_64 (or arm64)
# universal_archs (blank) # universal_archs (blank)
# ui_interactive no # ui_interactive no
# macosx_deployment_target 10.13 # macosx_deployment_target 10.13 (for x86_64, or 11.0 for arm64)
# - For universal building on Apple Silicon hardware, install native MacPorts on the default
# /opt/local and Intel MacPorts on /opt/intel, then tell build.sh to build for "x86_64+arm64"
# - port is called through sudo to manage dependencies; make sure it is configured # - port is called through sudo to manage dependencies; make sure it is configured
# as NOPASSWD in /etc/sudoers if you're doing unattended builds # as NOPASSWD in /etc/sudoers if you're doing unattended builds
# #
@@ -100,6 +102,7 @@ cwd=$(pwd)
package_name= package_name=
arch= arch=
tarball_name= tarball_name=
skip_archive=0
strip=0 strip=0
cmake_flags= cmake_flags=
while [ $# -gt 0 ] while [ $# -gt 0 ]
@@ -113,6 +116,11 @@ do
shift shift
;; ;;
-n)
shift
skip_archive=1
;;
-s) -s)
shift shift
tarball_name="$1" tarball_name="$1"
@@ -330,15 +338,164 @@ then
# macOS lacks nproc, but sysctl can do the same job. # macOS lacks nproc, but sysctl can do the same job.
alias nproc='sysctl -n hw.logicalcpu' alias nproc='sysctl -n hw.logicalcpu'
# Handle universal build.
if echo "$arch" | grep -q '+'
then
# Create temporary directory for merging app bundles.
rm -rf archive_tmp_universal
mkdir archive_tmp_universal
# Build for each architecture.
merge_src=
for arch_universal in $(echo "$arch" | tr '+' ' ')
do
# Run build for the architecture.
strip_arg=
[ $strip -ne 0 ] && strip_arg="-t "
case $arch_universal in # workaround: force new dynarec on for ARM
arm32 | arm64) cmake_flags_extra="-D NEW_DYNAREC=ON";;
*) cmake_flags_extra=;;
esac
zsh -lc 'exec "'"$0"'" -n -b "universal part" "'"$arch_universal"'" '"$strip_arg""$cmake_flags"' '"$cmake_flags_extra"
status=$?
if [ $status -eq 0 ]
then
# Move app bundle to the temporary directory.
app_bundle_name="archive_tmp/$(ls archive_tmp | grep '.app$')"
mv "$app_bundle_name" "archive_tmp_universal/$arch_universal.app"
status=$?
# Merge app bundles.
if [ -z "$merge_src" ]
then
# This is the first bundle, nothing to merge with.
merge_src="$arch_universal"
else
# Merge previous bundle with this one.
merge_dest="$merge_src+$arch_universal"
echo [-] Merging app bundles [$merge_src] and [$arch_universal] into [$merge_dest]
# Merge directory structures.
(cd "archive_tmp_universal/$merge_src.app" && find . -type d && cd "../../archive_tmp_universal/$arch_universal.app" && find . -type d && cd ../..) | sort > universal_listing.txt
cat universal_listing.txt | uniq | while IFS= read line
do
echo '> Directory:' "$line"
mkdir -p "archive_tmp_universal/$merge_dest.app/$line"
done
# Create merged file listing.
(cd "archive_tmp_universal/$merge_src.app" && find . -type f && cd "../../archive_tmp_universal/$arch_universal.app" && find . -type f && cd ../..) | sort > universal_listing.txt
# Move files that only exist on one bundle.
cat universal_listing.txt | uniq -u | while IFS= read line
do
if [ -e "archive_tmp_universal/$merge_src.app/$line" ]
then
file_src="$merge_src"
else
file_src="$arch_universal"
fi
echo '> Only on' "[$file_src]:" "$line"
cp -p "archive_tmp_universal/$file_src.app/$line" "archive_tmp_universal/$merge_dest.app/$line"
done
# Move or lipo files that exist on both bundles.
cat universal_listing.txt | uniq -d | while IFS= read line
do
# Merge identical files.
if cmp -s "archive_tmp_universal/$merge_src.app/$line" "archive_tmp_universal/$arch_universal.app/$line"
then
echo '> Identical:' "$line"
cp -p "archive_tmp_universal/$merge_src.app/$line" "archive_tmp_universal/$merge_dest.app/$line"
elif lipo -create -output "archive_tmp_universal/$merge_dest.app/$line" "archive_tmp_universal/$merge_src.app/$line" "archive_tmp_universal/$arch_universal.app/$line" 2> /dev/null
then
echo '> Merged:' "$line"
else
echo '> Copied from' "[$merge_src]:" "$line"
cp -p "archive_tmp_universal/$merge_src.app/$line" "archive_tmp_universal/$merge_dest.app/$line"
fi
done
# Merge symlinks.
(cd "archive_tmp_universal/$merge_src.app" && find . -type l && cd "../../archive_tmp_universal/$arch_universal.app" && find . -type l && cd ../..) | sort > universal_listing.txt
cat universal_listing.txt | uniq | while IFS= read line
do
if [ -e "archive_tmp_universal/$merge_src.app/$line" ]
then
file_src="$merge_src"
else
file_src="$arch_universal"
fi
link_dest="$(readlink "archive_tmp_universal/$file_src.app/$line")"
echo '> Symlink:' "$line" '=>' "$link_dest"
ln -s "$link_dest" "archive_tmp_universal/$merge_dest.app/$line"
done
# Merge a subsequent bundle with this one.
merge_src="$merge_dest"
fi
fi
if [ $status -ne 0 ]
then
echo [!] Aborting universal build: [$arch_universal] failed with status [$status]
exit $status
fi
done
# Rename final app bundle.
rm -rf archive_tmp
mkdir archive_tmp
mv "archive_tmp_universal/$merge_src.app" "$app_bundle_name"
# Sign final app bundle.
codesign --force --deep -s - "$app_bundle_name"
# Create zip.
cd archive_tmp
zip -r "$cwd/$package_name.zip" .
status=$?
# Check if the archival succeeded.
if [ $status -ne 0 ]
then
echo [!] Artifact archive creation failed with status [$status]
exit 7
fi
# All good.
echo [-] Universal build of [$package_name] for [$arch] with flags [$cmake_flags] successful
exit 0
fi
# Switch into the correct architecture if required.
case $arch in
x86_64) arch_mac="i386";;
*) arch_mac="$arch";;
esac
if [ "$(arch)" != "$arch" -a "$(arch)" != "$arch_mac" ]
then
# Call build with the correct architecture.
echo [-] Switching to architecture [$arch]
cd "$cwd"
strip_arg=
[ $strip -ne 0 ] && strip_arg="-t "
arch -"$arch" zsh -lc 'exec "'"$0"'" -b "'"$package_name"'" "'"$arch"'" '"$strip_arg""$cmake_flags"
exit $?
fi
echo [-] Using architecture [$(arch)]
# Locate the MacPorts prefix. # Locate the MacPorts prefix.
macports="/opt/local" macports="/opt/local"
[ -e "/opt/$arch/bin/port" ] && macports="/opt/$arch" [ -e "/opt/$arch/bin/port" ] && macports="/opt/$arch"
[ "$arch" = "x86_64" -a -e "/opt/intel/bin/port" ] && macports="/opt/intel" [ "$arch" = "x86_64" -a -e "/opt/intel/bin/port" ] && macports="/opt/intel"
export PATH="$macports/bin:$macports/sbin:$PATH"
# Install dependencies. # Install dependencies.
echo [-] Installing dependencies through MacPorts echo [-] Installing dependencies through MacPorts
sudo $macports/bin/port selfupdate sudo "$macports/bin/port" selfupdate
sudo $macports/bin/port install $(cat .ci/dependencies_macports.txt) sudo "$macports/bin/port" install $(cat .ci/dependencies_macports.txt)
# Point CMake to the toolchain file. # Point CMake to the toolchain file.
[ -e "cmake/$toolchain.cmake" ] && cmake_flags_extra="$cmake_flags_extra -D \"CMAKE_TOOLCHAIN_FILE=cmake/$toolchain.cmake\"" [ -e "cmake/$toolchain.cmake" ] && cmake_flags_extra="$cmake_flags_extra -D \"CMAKE_TOOLCHAIN_FILE=cmake/$toolchain.cmake\""
@@ -563,8 +720,8 @@ then
unzip -j discord_game_sdk.zip "lib/$arch_discord/discord_game_sdk.dylib" -d "archive_tmp/"*".app/Contents/Frameworks" unzip -j discord_game_sdk.zip "lib/$arch_discord/discord_game_sdk.dylib" -d "archive_tmp/"*".app/Contents/Frameworks"
[ ! -e "archive_tmp/"*".app/Contents/Frameworks/discord_game_sdk.dylib" ] && echo [!] No Discord Game SDK for architecture [$arch_discord] [ ! -e "archive_tmp/"*".app/Contents/Frameworks/discord_game_sdk.dylib" ] && echo [!] No Discord Game SDK for architecture [$arch_discord]
# Sign app bundle. # Sign app bundle, unless we're in an universal build.
codesign --force --deep -s - "archive_tmp/"*".app" [ $skip_archive -eq 0 ] && codesign --force --deep -s - "archive_tmp/"*".app"
fi fi
else else
cwd_root=$(pwd) cwd_root=$(pwd)
@@ -698,6 +855,13 @@ then
exit 6 exit 6
fi fi
# Stop if artifact archive creation was disabled.
if [ $skip_archive -ne 0 ]
then
echo [-] Skipping artifact archive creation
exit 0
fi
# Produce artifact archive. # Produce artifact archive.
echo [-] Creating artifact archive echo [-] Creating artifact archive
if is_windows if is_windows
@@ -708,7 +872,7 @@ then
status=$? status=$?
elif is_mac elif is_mac
then then
# Create zip. (TODO: dmg) # Create zip.
cd archive_tmp cd archive_tmp
zip -r "$cwd/$package_name.zip" . zip -r "$cwd/$package_name.zip" .
status=$? status=$?
@@ -771,7 +935,6 @@ EOF
status=$? status=$?
fi fi
fi fi
cd ..
# Check if the archival succeeded. # Check if the archival succeeded.
if [ $status -ne 0 ] if [ $status -ne 0 ]

View File

@@ -1,10 +1,10 @@
cmake@3.22.3_0 cmake
pkgconfig@0.29.2_0 pkgconfig
ninja@1.10.2_4 ninja
freetype@2.11.1_0 freetype
libsdl2@2.0.20_0 libsdl2
libpng@1.6.37_0 libpng
openal-soft@1.21.1_0 openal-soft
rtmidi@5.0.0_0 rtmidi
qt5@5.15.3_0 qt5
wget wget

8
.gitignore vendored
View File

@@ -1,8 +1,8 @@
# CMake # CMake
/CMakeUserPresets.json CMakeUserPresets.json
/CMakeCache.txt CMakeCache.txt
/build
CMakeFiles CMakeFiles
/build
Makefile Makefile
*.a *.a
/src/*.exe /src/*.exe
@@ -26,9 +26,11 @@ Makefile
# Build scripts # Build scripts
/archive_tmp /archive_tmp
/archive_tmp_universal
/static2dll.* /static2dll.*
/pacman.txt /pacman.txt
/deps.txt /deps.txt
/universal_listing.txt
/VERSION /VERSION
*.zip *.zip
*.tar *.tar