diff --git a/dist/sdk/Makefile b/dist/sdk/Makefile new file mode 100644 index 0000000000..5d1c490a61 --- /dev/null +++ b/dist/sdk/Makefile @@ -0,0 +1,7 @@ +all: +ifeq ($(uname),Darwin) + cd ../.. ; sys/sdk-macos.sh +else + cd ../.. ; sys/sdk.sh +endif + mv ../../*.zip . diff --git a/doc/ios.md b/doc/ios.md index 3fa5bb352d..2344fce4c3 100644 --- a/doc/ios.md +++ b/doc/ios.md @@ -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. diff --git a/sys/ios-libr.sh b/sys/ios-libr.sh index 1a6ca55b25..1e9436540a 100755 --- a/sys/ios-libr.sh +++ b/sys/ios-libr.sh @@ -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 index d9f443968f..0000000000 --- a/sys/ios-sdk.sh +++ /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 diff --git a/sys/menu.sh b/sys/menu.sh index 61fd289216..9719dd5f7c 100755 --- a/sys/menu.sh +++ b/sys/menu.sh @@ -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 index 0000000000..8f1a0e38b4 --- /dev/null +++ b/sys/sdk-common.sh @@ -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 index 0000000000..1126421fa9 --- /dev/null +++ b/sys/sdk-ios.sh @@ -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 index 0000000000..fbcfc545e2 --- /dev/null +++ b/sys/sdk-macos.sh @@ -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 diff --git a/sys/sdk.sh b/sys/sdk.sh index c6fe7a272e..dabda7e420 100755 --- a/sys/sdk.sh +++ b/sys/sdk.sh @@ -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