]> git.feebdaed.xyz Git - 0xmirror/radare2.git/commitdiff
Improvements on the SDK compilation for apple targets ##build
authorpancake <pancake@nowsecure.com>
Tue, 9 Dec 2025 18:55:31 +0000 (19:55 +0100)
committerGitHub <noreply@github.com>
Tue, 9 Dec 2025 18:55:31 +0000 (19:55 +0100)
dist/sdk/Makefile [new file with mode: 0644]
doc/ios.md
sys/ios-libr.sh
sys/ios-sdk.sh [deleted file]
sys/menu.sh
sys/sdk-common.sh [new file with mode: 0755]
sys/sdk-ios.sh [new file with mode: 0755]
sys/sdk-macos.sh [new file with mode: 0755]
sys/sdk.sh

diff --git a/dist/sdk/Makefile b/dist/sdk/Makefile
new file mode 100644 (file)
index 0000000..5d1c490
--- /dev/null
@@ -0,0 +1,7 @@
+all:
+ifeq ($(uname),Darwin)
+       cd ../.. ; sys/sdk-macos.sh
+else
+       cd ../.. ; sys/sdk.sh
+endif
+       mv ../../*.zip .
index 3fa5bb352df1e0c701d632a302f0950c994c15a8..2344fce4c3c8815c7c06dba4bdb17d90d9778ccf 100644 (file)
@@ -15,7 +15,7 @@ It is also possible to build r2 natively on your iDevice by following the standa
 For incremental compilations or daily development you should:
 
 ```sh
-$ sys/ios-sdk.sh -s
+$ sys/sdk-ios.sh -s
 ```
 
 To get a shell with all the environment variables set to build for iOS instead of Mac.
index 1a6ca55b254cba2bcd9f9dddfce1201805bdcd25..1e9436540a01e68109def8d3badc6f09626a9ec0 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
-sys/ios-sdk.sh -simulator
-sys/ios-sdk.sh -a arm64
+sys/sdk-ios.sh -simulator
+sys/sdk-ios.sh -a arm64
 lipo -create -output "ios-libr2.dylib \
        "$INSTALL_DST/$PREFIX"/lib/libr.dylib \
        "$INSTALL_DST/$PREFIX"/lib_simulator/libr.dylib
diff --git a/sys/ios-sdk.sh b/sys/ios-sdk.sh
deleted file mode 100755 (executable)
index d9f4439..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-#!/bin/bash
-
-# You can modify these variables
-PREFIX="/usr"
-INSTALL_DST="/tmp/r2ios"
-USE_SIMULATOR=0
-#SIMULATOR_ARCHS="i386+x86_64"
-SIMULATOR_ARCHS="x86_64"
-PACKAGE_RADARE=0
-# Bitcode is deprecated; default off unless explicitly enabled
-EMBED_BITCODE=0
-CFLAGS="-O2 -miphoneos-version-min=10.0"
-DOSH=0
-ARCHS="" # Will be set by -archs argument. If you want to set it -> e.g. ARCHS="armv7+arm64".
-MERGE_LIBS=1 # Will merge libs if you build for arm and simulator
-
-# Environment variables
-. sys/ios-env.sh
-export USE_IOS_STATIC=0
-
-echo "If xcrun --sdk iphoneos cant find the profile use this line:"
-echo " sudo xcode-select -switch /Applications/Xcode.app"
-
-PLUGINS_CFG=plugins.ios-store.cfg
-#PLUGINS_CFG=plugins.ios.cfg
-
-if [ "${EMBED_BITCODE}" = 1 ]; then
-       export CFLAGS="$CFLAGS -fembed-bitcode"
-       export LDFLAGS="$LDFLAGS -fembed-bitcode"
-fi
-
-iosConfigure() {
-       cp -f dist/plugins-cfg/${PLUGINS_CFG} plugins.cfg
-       ./configure --with-libr --prefix=${PREFIX} --with-ostype=darwin \
-               --disable-debugger --without-gpl \
-               --without-fork --with-compiler=ios-sdk \
-               --target=arm64-unknown-darwin
-       return $?
-}
-
-iosClean() {
-       make clean
-       rm -rf libr/.libr libr/.libr2 libr/libr.a libr/libr.dylib shlr/libr_shlr.a
-       rm -rf shlr/capstone
-}
-
-iosBuild() {
-       time make -j4 AR="xcrun --sdk ${SDK} ar" || exit 1
-       # Build and sign
-       ( cd binr/radare2 ; make ios_sdk_sign )
-       make install DESTDIR="$INSTALL_DST"
-       rm -rf "$INSTALL_DST/$PREFIX"/share/radare2/*/www/*/node_modules
-       return $?
-}
-
-iosMergeLibs() {
-       mkdir -p $INSTALL_DST/$PREFIX/lib_merged
-       #echo "Merging dynamic libs"
-       #lipo "$INSTALL_DST/$PREFIX"/lib/libr*git.dylib $INSTALL_DST/$PREFIX/lib_simulator/libr*git.dylib -output $INSTALL_DST/$PREFIX/lib_merged/libr2.dylib -create
-       echo "Merging static libs (only libr.a)"
-       lipo "$INSTALL_DST/$PREFIX"/lib/libr.a "$INSTALL_DST/$PREFIX"/lib_simulator/libr.a -output "$INSTALL_DST/$PREFIX"/lib_merged/libr.a -create
-       echo "Merging shared libs (only libr.dylib)"
-       lipo "$INSTALL_DST/$PREFIX/lib/libr.dylib" \
-               "$INSTALL_DST/$PREFIX"/lib_simulator/libr.dylib \
-               -output "$INSTALL_DST/$PREFIX"/lib_merged/libr.dylib -create
-       echo "You can find the merged libs in $INSTALL_DST$PREFIX/lib_merged"
-}
-
-iosPackage() {
-       ( cd "$INSTALL_DST" && tar czvf $INSTALL_DST-${CPU}.tar.gz * )
-       # Prepare radare2
-       rm -rf sys/cydia/radare2/root
-       rm -rf sys/cydia/radare2/root/usr/lib/*.dSYM
-       rm -rf sys/cydia/radare2/root/usr/lib/*.a
-       mkdir -p sys/cydia/radare2/root
-       sudo tar xpzvf "$INSTALL_DST"-${CPU}.tar.gz -C sys/cydia/radare2/root
-       rm -rf sys/cydia/radare2-dev/root
-       # Prepare radare2-dev
-       mkdir -p sys/cydia/radare2-dev/root
-       mkdir -p sys/cydia/radare2-dev/root/usr/include
-       mv sys/cydia/radare2/root/usr/include/* sys/cydia/radare2-dev/root/usr/include
-       mkdir -p sys/cydia/radare2-dev/root/usr/lib
-       mv sys/cydia/radare2/root/usr/lib/lib* sys/cydia/radare2-dev/root/usr/lib
-       mv sys/cydia/radare2/root/usr/lib/pkgconfig sys/cydia/radare2-dev/root/usr/lib
-       (
-               cd sys/cydia/radare2/root/usr/bin ;
-               for a in * ; do strip $a ; done
-       )
-       ( cd sys/cydia/radare2 ; sudo make clean ; sudo make )
-       ( cd sys/cydia/radare2-dev ; sudo make clean ; sudo make )
-       return $?
-}
-
-showHelp() {
-       echo "The following arguments are available:"
-
-       echo "    -a, --archs"
-       echo "        Select the archs, you want to build for."
-       echo "        Available archs: armv7, armv7s, arm64, all"
-       echo "        You can select multiple archs by concatenating"
-       echo "        them with a '+' sign."
-       echo "        Or specify 'all' to build for armv7+armv7s+arm64."
-       echo "        See the examples below."
-
-       echo "    -h, --help"
-       echo "        Show this text."
-
-       echo "    -p, --package"
-       echo "        Package radare2."
-
-       echo "    -s, --shell"
-       echo "        Run shell."
-
-       echo "    -f, --full"
-       echo "        Same as -archs all -simulator."
-
-       echo "    -simulator"
-       echo "        Build also for i386 and x86_64 archs."
-       echo "        So you can use radare2 in the iOS simulator."
-
-       echo "Examples:"
-       echo "    sys/ios-sdk.sh -archs arm64"
-       echo "    sys/ios-sdk.sh -archs armv7s+arm64 -simulator"
-       echo "    sys/ios-sdk.sh -archs all -simulator"
-
-       echo "You can also modify some variables in sys/ios-sdk.sh."
-}
-
-# Show help text, if no archs are selected
-if [ $# -eq 0 ] && [ "${#ARCHS}" = 0 ] && [ "${USE_SIMULATOR}" = 0 ]; then
-       echo "You need to specify the archs you want to build for."
-       echo "Use the -archs/-simulator argument or modify the ARCHS/USE_SIMULATOR variable in sys/ios-sdk.sh."
-       echo
-       showHelp
-       exit 0
-fi
-
-while test $# -gt 0; do
-       case "$1" in
-       -full|--full|-f)
-               shift
-               ARCHS="armv7s+arm64"
-               USE_SIMULATOR=1
-               ;;
-       -shell|--shell|-s)
-               DOSH=1
-               shift
-               ;;
-       -archs|-a|--archs)
-               shift
-               if test $# -gt 0; then
-                       if [ "$1" == "all" ]; then
-                               ARCHS="armv7+armv7s+arm64"
-                       else
-                               ARCHS=$1
-                       fi
-               fi
-               shift
-               ;;
-       -p|--package)
-               iosPackage
-               exit 0
-               ;;
-       -simulator)
-               USE_SIMULATOR=1
-               shift
-               ;;
-       *|-h|--help)
-               showHelp
-               exit 0
-               ;;
-       esac
-done
-
-
-### BUILD PHASE
-
-# Print which archs we are building for
-if [ -n "$ARCHS" ] || [ "${USE_SIMULATOR}" = 1 ]; then
-    printf "Will build for "
-    if [ -n "$ARCHS" ]; then
-        printf "%s " "$ARCHS"
-        [ "${USE_SIMULATOR}" = 1 ] && printf "and "
-    fi
-    if [ "${USE_SIMULATOR}" = 1 ]; then
-        printf "simulator(%s)" "$SIMULATOR_ARCHS"
-    fi
-    printf "\n"
-else
-    echo "Will build for default settings"
-fi
-
-if [ "${DOSH}" = 1 ]; then
-       echo "Inside ios-sdk shell"
-       if [ "${USE_SIMULATOR}" = 1 ]; then
-               export CPU="$SIMULATOR_ARCHS"
-               export SDK=iphonesimulator
-       else
-               [ -z "$ARCHS" ] && ARCHS="armv7s+arm64"
-               export CPU="$ARCHS"
-               export SDK=iphoneos
-       fi
-CPUS=""
-CPU=`echo $CPU | sed -e 's,+, ,g'`
-EXTRA=""
-for a in `IFS=+ echo ${CPU}` ; do
-        CPUS="-arch $a ${CPUS}"
-done
-export CPUS="${CPUS}"
-export LD="xcrun --sdk ${SDK} ld"
-export ALFLAGS="${CPUS}"
-export LDFLAGS="${LDFLAGS} ${CPUS}"
-       export PS1="[ios-sdk-$CPU]> "
-       ${SHELL}
-       echo "Outside ios-sdk shell"
-       exit $?
-fi
-echo
-sleep 1
-
-rm -rf "$INSTALL_DST"
-
-# Build radare2 for i386 and x86_64
-if [ "${USE_SIMULATOR}" = 1 ]; then
-       iosClean
-       if [ 1 = 0 ]; then
-               iosConfigure
-               if [ $? = 0 ]; then
-                       export CPU="$SIMULATOR_ARCHS"
-                       export SDK=iphonesimulator
-                       echo "Building for simulator($SIMULATOR_ARCHS)"
-                       sleep 1
-                       iosBuild
-               fi
-       else
-               sys/ios-simulator.sh
-       fi
-       # backup lib folder of simulator
-       if [ "${#ARCHS}" -gt 0 ]; then
-               rm -rf "$INSTALL_DST/$PREFIX"/lib_simulator
-               mv "$INSTALL_DST/$PREFIX"/lib "$INSTALL_DST/$PREFIX"/lib_simulator
-       else
-               cp -r "$INSTALL_DST/$PREFIX"/lib "$INSTALL_DST/$PREFIX"/lib_simulator
-       fi
-fi
-
-# check if arm archs were selected and if so build radare2 for them
-# XXX this is a bashism
-if [ "${#ARCHS}" -gt 0 ]; then
-       iosClean
-       iosConfigure
-       if [ "$?" = 0 ]; then
-               export CPU="$ARCHS"
-               export SDK=iphoneos
-               echo "Building for $CPU"
-               sleep 1
-               iosBuild
-               if [ "${PACKAGE_RADARE}" = 1 ]; then
-                       iosPackage
-               fi
-       fi
-fi
-
-# Merge libs if built for simulator and arm archs
-if [ "${MERGE_LIBS}" = 1 ]; then
-       if [ "${USE_SIMULATOR}" = 1 ] && [ "${#ARCHS}" -gt 0 ]; then
-               iosMergeLibs
-       fi
-fi
index 61fd289216d56bc1372617caab07f9fbf76fbd99..9719dd5f7c9cd49ad5f629fa9c7418066b6cd77f 100755 (executable)
@@ -202,7 +202,7 @@ BuildAndInstall() {
                        KEEP_PLUGINS_CFG=1 sys/user.sh
                        ;;
                "iOS")
-                       sys/ios-sdk.sh
+                       sys/sdk-ios.sh
                        ;;
                "OSX")
                        sys/osx-pkg.sh
diff --git a/sys/sdk-common.sh b/sys/sdk-common.sh
new file mode 100755 (executable)
index 0000000..8f1a0e3
--- /dev/null
@@ -0,0 +1,118 @@
+#!/bin/bash
+
+# Common functions for SDK building
+
+# Default variables
+PREFIX="/usr/local"
+INSTALL_DST="/tmp/r2sdk"
+CFLAGS="-O2"
+DOSH=0
+ARCHS=""
+MERGE_LIBS=1
+
+sdkClean() {
+       make clean
+       rm -rf libr/.libr libr/.libr2 libr/libr.a libr/libr.dylib shlr/libr_shlr.a
+       rm -rf shlr/capstone
+}
+
+sdkBuild() {
+       time make -j4 || exit 1
+       make install DESTDIR="$INSTALL_DST"
+       rm -rf "$INSTALL_DST/$PREFIX"/share/radare2/*/www/*/node_modules
+       return $?
+}
+
+sdkMergeLibs() {
+       mkdir -p "$INSTALL_DST/$PREFIX/lib_merged"
+       echo "Merging static libs (libr.a)"
+       local libs=""
+       for arch in $(echo $ARCHS | tr '+' ' '); do
+               if [ -f "$INSTALL_DST/$PREFIX/lib_$arch/libr.a" ]; then
+                       libs="$libs $INSTALL_DST/$PREFIX/lib_$arch/libr.a"
+               fi
+       done
+       if [ -f "$INSTALL_DST/$PREFIX/lib/libr.a" ]; then
+               libs="$libs $INSTALL_DST/$PREFIX/lib/libr.a"
+       fi
+       if [ -n "$libs" ]; then
+               lipo $libs -output "$INSTALL_DST/$PREFIX/lib_merged/libr.a" -create
+       fi
+       echo "Merging shared libs (libr.dylib)"
+       libs=""
+       for arch in $(echo $ARCHS | tr '+' ' '); do
+               if [ -f "$INSTALL_DST/$PREFIX/lib_$arch/libr.dylib" ]; then
+                       libs="$libs $INSTALL_DST/$PREFIX/lib_$arch/libr.dylib"
+               fi
+       done
+       if [ -f "$INSTALL_DST/$PREFIX/lib/libr.dylib" ]; then
+               libs="$libs $INSTALL_DST/$PREFIX/lib/libr.dylib"
+       fi
+       if [ -n "$libs" ]; then
+               lipo $libs -output "$INSTALL_DST/$PREFIX/lib_merged/libr.dylib" -create
+       fi
+       echo "Merged libs in $INSTALL_DST$PREFIX/lib_merged"
+}
+
+showHelp() {
+       echo "Usage: $0 [options]"
+       echo
+       echo "Options:"
+       echo "    -a, --archs ARCHS    Architectures to build (e.g., arm64, x86_64+arm64)"
+       echo "    -h, --help           Show this help"
+       echo "    -s, --shell          Run shell with environment set"
+       echo "    -p, --prefix PREFIX  Installation prefix (default: $PREFIX)"
+       echo "    -d, --dest DEST      Installation destination (default: $INSTALL_DST)"
+}
+
+parseArgs() {
+       while test $# -gt 0; do
+               case "$1" in
+               -shell|--shell|-s)
+                       DOSH=1
+                       shift
+                       ;;
+               -archs|-a|--archs)
+                       shift
+                       if test $# -gt 0; then
+                               ARCHS=$1
+                       fi
+                       shift
+                       ;;
+               -prefix|-p|--prefix)
+                       shift
+                       if test $# -gt 0; then
+                               PREFIX=$1
+                       fi
+                       shift
+                       ;;
+               -dest|-d|--dest)
+                       shift
+                       if test $# -gt 0; then
+                               INSTALL_DST=$1
+                       fi
+                       shift
+                       ;;
+               *|-h|--help)
+                       showHelp
+                       exit 0
+                       ;;
+               esac
+       done
+}
+
+setupShell() {
+       local platform=$1
+       echo "Inside $platform-sdk shell"
+       export CPU="$ARCHS"
+       local CPUS=""
+       for a in $(echo $ARCHS | tr '+' ' '); do
+               CPUS="-arch $a ${CPUS}"
+       done
+       export CPUS="${CPUS}"
+       export LDFLAGS="${LDFLAGS} ${CPUS}"
+       export PS1="[$platform-sdk-$CPU]> "
+       ${SHELL}
+       echo "Outside $platform-sdk shell"
+       exit $?
+}
diff --git a/sys/sdk-ios.sh b/sys/sdk-ios.sh
new file mode 100755 (executable)
index 0000000..1126421
--- /dev/null
@@ -0,0 +1,177 @@
+#!/bin/bash
+
+# iOS SDK builder
+
+. sys/sdk-common.sh
+
+# iOS specific variables
+USE_SIMULATOR=0
+SIMULATOR_ARCHS="x86_64"
+PACKAGE_RADARE=0
+EMBED_BITCODE=0
+PLUGINS_CFG=plugins.ios-store.cfg
+
+# Environment variables
+. sys/ios-env.sh
+export USE_IOS_STATIC=0
+
+echo "If xcrun --sdk iphoneos cant find the profile use this line:"
+echo " sudo xcode-select -switch /Applications/Xcode.app"
+
+if [ "${EMBED_BITCODE}" = 1 ]; then
+       export CFLAGS="$CFLAGS -fembed-bitcode"
+       export LDFLAGS="$LDFLAGS -fembed-bitcode"
+fi
+
+iosConfigure() {
+       cp -f dist/plugins-cfg/${PLUGINS_CFG} plugins.cfg
+       ./configure --with-libr --prefix=${PREFIX} --with-ostype=darwin \
+               --disable-debugger --without-gpl \
+               --without-fork --with-compiler=ios-sdk \
+               --target=arm64-unknown-darwin
+       return $?
+}
+
+iosPackage() {
+       ( cd "$INSTALL_DST" && tar czvf $INSTALL_DST-${CPU}.tar.gz * )
+       # Prepare radare2
+       rm -rf sys/cydia/radare2/root
+       rm -rf sys/cydia/radare2/root/usr/lib/*.dSYM
+       rm -rf sys/cydia/radare2/root/usr/lib/*.a
+       mkdir -p sys/cydia/radare2/root
+       sudo tar xpzvf "$INSTALL_DST"-${CPU}.tar.gz -C sys/cydia/radare2/root
+       rm -rf sys/cydia/radare2-dev/root
+       # Prepare radare2-dev
+       mkdir -p sys/cydia/radare2-dev/root
+       mkdir -p sys/cydia/radare2-dev/root/usr/include
+       mv sys/cydia/radare2/root/usr/include/* sys/cydia/radare2-dev/root/usr/include
+       mkdir -p sys/cydia/radare2-dev/root/usr/lib
+       mv sys/cydia/radare2/root/usr/lib/lib* sys/cydia/radare2-dev/root/usr/lib
+       mv sys/cydia/radare2/root/usr/lib/pkgconfig sys/cydia/radare2-dev/root/usr/lib
+       (
+               cd sys/cydia/radare2/root/usr/bin ;
+               for a in * ; do strip $a ; done
+       )
+       ( cd sys/cydia/radare2 ; sudo make clean ; sudo make )
+       ( cd sys/cydia/radare2-dev ; sudo make clean ; sudo make )
+       return $?
+}
+
+showHelp() {
+       echo "iOS SDK builder"
+       echo
+       echo "Options:"
+       echo "    -a, --archs ARCHS    Architectures (armv7, armv7s, arm64, all)"
+       echo "    -simulator           Build for simulator"
+       echo "    -f, --full           Build all archs + simulator"
+       echo "    -p, --package        Package radare2"
+       echo "    -s, --shell          Run shell"
+       echo "    -h, --help           Show help"
+       echo
+       echo "Examples:"
+       echo "    sys/sdk-ios.sh -archs arm64"
+       echo "    sys/sdk-ios.sh -archs armv7s+arm64 -simulator"
+       echo "    sys/sdk-ios.sh -archs all -simulator"
+}
+
+parseArgs "$@"
+
+# iOS specific args
+while test $# -gt 0; do
+       case "$1" in
+       -full|--full|-f)
+               shift
+               ARCHS="armv7s+arm64"
+               USE_SIMULATOR=1
+               ;;
+       -p|--package)
+               iosPackage
+               exit 0
+               ;;
+       -simulator)
+               USE_SIMULATOR=1
+               shift
+               ;;
+       *)
+               shift
+               ;;
+       esac
+done
+
+# Show help if no archs
+if [ $# -eq 0 ] && [ "${#ARCHS}" = 0 ] && [ "${USE_SIMULATOR}" = 0 ]; then
+       echo "You need to specify the archs you want to build for."
+       echo "Use -archs/-simulator or modify ARCHS/USE_SIMULATOR."
+       echo
+       showHelp
+       exit 0
+fi
+
+
+# Build phase
+if [ -n "$ARCHS" ] || [ "${USE_SIMULATOR}" = 1 ]; then
+    printf "Will build for "
+    if [ -n "$ARCHS" ]; then
+        printf "%s " "$ARCHS"
+        [ "${USE_SIMULATOR}" = 1 ] && printf "and "
+    fi
+    if [ "${USE_SIMULATOR}" = 1 ]; then
+        printf "simulator(%s)" "$SIMULATOR_ARCHS"
+    fi
+    printf "\n"
+else
+    echo "Will build for default settings"
+fi
+
+if [ "${DOSH}" = 1 ]; then
+       setupShell "ios"
+fi
+
+echo
+sleep 1
+rm -rf "$INSTALL_DST"
+
+# Build for simulator
+if [ "${USE_SIMULATOR}" = 1 ]; then
+       sdkClean
+       if [ 1 = 0 ]; then
+               iosConfigure
+               if [ $? -eq 0 ]; then
+                       export CPU="$SIMULATOR_ARCHS"
+                       export SDK=iphonesimulator
+                       echo "Building for simulator($SIMULATOR_ARCHS)"
+                       sleep 1
+                       sdkBuild
+               fi
+       else
+               sys/ios-simulator.sh
+       fi
+       # backup lib folder
+       if [ "${#ARCHS}" -gt 0 ]; then
+               rm -rf "$INSTALL_DST/$PREFIX"/lib_simulator
+               mv "$INSTALL_DST/$PREFIX"/lib "$INSTALL_DST/$PREFIX"/lib_simulator
+       else
+               cp -r "$INSTALL_DST/$PREFIX"/lib "$INSTALL_DST/$PREFIX"/lib_simulator
+       fi
+fi
+
+# Build for device
+if [ "${#ARCHS}" -gt 0 ]; then
+       sdkClean
+       iosConfigure
+       if [ $? -eq 0 ]; then
+               export CPU="$ARCHS"
+               export SDK=iphoneos
+               echo "Building for $CPU"
+               sleep 1
+               sdkBuild
+               if [ "${PACKAGE_RADARE}" = 1 ]; then
+                       iosPackage
+               fi
+       fi
+fi
+
+# Merge libs
+if [ "${MERGE_LIBS}" = 1 ] && [ "${USE_SIMULATOR}" = 1 ] && [ "${#ARCHS}" -gt 0 ]; then
+       sdkMergeLibs
+fi
diff --git a/sys/sdk-macos.sh b/sys/sdk-macos.sh
new file mode 100755 (executable)
index 0000000..fbcfc54
--- /dev/null
@@ -0,0 +1,68 @@
+#!/bin/bash
+
+# macOS SDK builder
+
+. sys/sdk-common.sh
+
+# macOS specific
+PLUGINS_CFG=plugins.ios-store.cfg
+
+macosConfigure() {
+       cp -f dist/plugins-cfg/${PLUGINS_CFG} plugins.cfg
+       ./configure --with-libr --prefix=${PREFIX} --with-ostype=darwin \
+               --disable-debugger --without-gpl \
+               --without-fork --with-compiler=clang \
+               --target=x86_64-apple-darwin
+       return $?
+}
+
+showHelp() {
+       echo "macOS SDK builder"
+       echo
+       echo "Options:"
+       echo "    -a, --archs ARCHS    Architectures (x86_64, arm64, all)"
+       echo "    -s, --shell          Run shell"
+       echo "    -h, --help           Show help"
+       echo
+       echo "Examples:"
+       echo "    sys/sdk-macos.sh -archs arm64"
+       echo "    sys/sdk-macos.sh -archs x86_64+arm64"
+       echo "    sys/sdk-macos.sh -archs all"
+}
+
+parseArgs "$@"
+
+# Show help if no archs
+if [ $# -eq 0 ] && [ "${#ARCHS}" = 0 ]; then
+       echo "You need to specify the archs you want to build for."
+       echo "Use -archs or modify ARCHS."
+       echo
+       showHelp
+       exit 0
+fi
+
+# Build phase
+if [ -n "$ARCHS" ]; then
+    printf "Will build for %s\n" "$ARCHS"
+else
+    echo "Will build for default settings"
+fi
+
+if [ "${DOSH}" = 1 ]; then
+       setupShell "macos"
+fi
+
+echo
+sleep 1
+rm -rf "$INSTALL_DST"
+
+if [ "${#ARCHS}" -gt 0 ]; then
+       sdkClean
+       macosConfigure
+       if [ $? -eq 0 ]; then
+               export CPU="$ARCHS"
+               echo "Building for $CPU"
+               sleep 1
+               sdkBuild
+       fi
+fi
index c6fe7a272e6e46659009e8ae777ad358227d4a5b..dabda7e4209ec652de4568e29d6760735a505cc1 100755 (executable)
@@ -1,4 +1,8 @@
-#!/bin/sh
+#!/bin/bash
+
+# Unified SDK script
+
+. sys/sdk-common.sh
 
 WRKDIR=/tmp
 SDKDIR=${WRKDIR}/r2-sdk
@@ -10,34 +14,103 @@ if [ -n "$1" ]; then
        SDKDIR="$1"
 fi
 
-# Builds an SDK to build stuff for rbin
-export CFLAGS="-Os -fPIC"
-make mrproper
-if [ -z "${R2_PLUGINS_CFG}" ]; then
-       R2_PLUGINS_CFG=dist/plugins-cfg/plugins.bin.cfg
-fi
-cp -f "${R2_PLUGINS_CFG}" plugins.cfg
-#./configure-plugins
-./configure --prefix="$PREFIX" --with-libr --without-gpl || exit 1
-#--disable-loadlibs || exit 1
-make -j8 || exit 1
-rm -rf "${SDKDIR}"
-mkdir -p "${SDKDIR}"/lib
-rm -f libr/libr.a
-cp -rf libr/include "${SDKDIR}"
-mkdir -p "${SDKDIR}/include/sdb"
-cp -rf subprojects/sdb/include/sdb/* "${SDKDIR}/include/sdb"
-FILES=`find libr shlr -iname '*.a'`
-cp -f ${FILES} "${SDKDIR}"/lib
 OS=`uname`
-AR=`uname -m`
-SF=r2sdk-${OS}-${AR}
-
-(
-cd "${WRKDIR}"
-mv r2-sdk "${SF}"
-zip -r "${SF}".zip "${SF}"
-)
-mv "${WRKDIR}/${SF}" .
-mv "${WRKDIR}/${SF}".zip .
-ln -fs "${SF}" r2sdk
+
+if [ "$OS" = "Darwin" ]; then
+       # On macOS, build xcframework for iOS and macOS
+       echo "Building xcframework for iOS and macOS"
+       
+       # Build iOS SDK
+       echo "Building iOS SDK..."
+       INSTALL_DST_IOS="/tmp/r2ios"
+       sys/sdk-ios.sh -archs arm64 -d "$INSTALL_DST_IOS"
+       
+       # Build macOS SDK
+       echo "Building macOS SDK..."
+       INSTALL_DST_MACOS="/tmp/r2macos"
+       sys/sdk-macos.sh -archs x86_64+arm64 -d "$INSTALL_DST_MACOS"
+       
+       # Create xcframework
+       echo "Creating xcframework..."
+       XCF_DST="/tmp/Radare2.xcframework"
+       rm -rf "$XCF_DST"
+       mkdir -p "$XCF_DST"
+
+       # Prepare headers with module maps
+       XCF_HEADERS_IOS="/tmp/xcframework_headers/ios"
+       XCF_HEADERS_MACOS="/tmp/xcframework_headers/macos"
+       rm -rf "$XCF_HEADERS_IOS" "$XCF_HEADERS_MACOS"
+       mkdir -p "$XCF_HEADERS_IOS" "$XCF_HEADERS_MACOS"
+
+       # Copy headers
+       cp -r "$INSTALL_DST_IOS/usr/local/include/"* "$XCF_HEADERS_IOS/"
+       cp -r "$INSTALL_DST_MACOS/usr/local/include/"* "$XCF_HEADERS_MACOS/"
+
+       # Add module.modulemap
+       cat > "$XCF_HEADERS_IOS/module.modulemap" <<'EOF'
+module radare2 [extern_c] {
+  umbrella "."
+  export *
+}
+EOF
+       cat > "$XCF_HEADERS_MACOS/module.modulemap" <<'EOF'
+module radare2 [extern_c] {
+  umbrella "."
+  export *
+}
+EOF
+
+       # For iOS
+       IOS_LIB="$INSTALL_DST_IOS/usr/local/lib/libr.a"
+       IOS_HEADERS="$XCF_HEADERS_IOS"
+
+       # For macOS
+       MACOS_LIB="$INSTALL_DST_MACOS/usr/local/lib/libr.a"
+       MACOS_HEADERS="$XCF_HEADERS_MACOS"
+       
+       xcodebuild -create-xcframework \
+               -library "$IOS_LIB" \
+               -headers "$IOS_HEADERS" \
+               -library "$MACOS_LIB" \
+               -headers "$MACOS_HEADERS" \
+               -output "$XCF_DST"
+       
+       if [ $? -eq 0 ]; then
+               echo "XCFramework created at $XCF_DST"
+               # Zip it
+               zip -r Radare2.xcframework.zip "$XCF_DST"
+               echo "Zipped to Radare2.xcframework.zip"
+       else
+               echo "Failed to create xcframework"
+               exit 1
+       fi
+else
+       # Generic Unix build
+       export CFLAGS="-Os -fPIC"
+       make mrproper
+       if [ -z "${R2_PLUGINS_CFG}" ]; then
+               R2_PLUGINS_CFG=dist/plugins-cfg/plugins.bin.cfg
+       fi
+       cp -f "${R2_PLUGINS_CFG}" plugins.cfg
+       ./configure --prefix="$PREFIX" --with-libr --without-gpl || exit 1
+       make -j8 || exit 1
+       rm -rf "${SDKDIR}"
+       mkdir -p "${SDKDIR}"/lib
+       rm -f libr/libr.a
+       cp -rf libr/include "${SDKDIR}"
+       mkdir -p "${SDKDIR}/include/sdb"
+       cp -rf subprojects/sdb/include/sdb/* "${SDKDIR}/include/sdb"
+       FILES=`find libr shlr -iname '*.a'`
+       cp -f ${FILES} "${SDKDIR}"/lib
+       AR=`uname -m`
+       SF=r2sdk-${OS}-${AR}
+
+       (
+       cd "${WRKDIR}"
+       mv r2-sdk "${SF}"
+       zip -r "${SF}".zip "${SF}"
+       )
+       mv "${WRKDIR}/${SF}" .
+       mv "${WRKDIR}/${SF}".zip .
+       ln -fs "${SF}" r2sdk
+fi