diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index d575d4f9..8c425352 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -95,9 +95,15 @@ jobs: - name: Install SDRplay API run: wget https://www.sdrplay.com/software/SDRplay_RSP_API-MacOSX-3.07.3.pkg && sudo installer -pkg SDRplay_RSP_API-MacOSX-3.07.3.pkg -target / + - name: Install libiio + run: mkdir libiio && cd libiio && wget https://github.com/analogdevicesinc/libiio/releases/download/v0.23/macOS-10.15.pkg && sudo installer -pkg macOS-10.15.pkg -target / + + - name: Install libad9361 + run: wget https://github.com/analogdevicesinc/libad9361-iio/releases/download/v0.2/libad9361-0.2.pkg && sudo installer -pkg libad9361-0.2.pkg -target / + - name: Prepare CMake working-directory: ${{runner.workspace}}/build - run: cmake $GITHUB_WORKSPACE -DOPT_BUILD_PLUTOSDR_SOURCE=OFF -DOPT_BUILD_SOAPY_SOURCE=OFF -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_AUDIO_SINK=OFF -DOPT_BUILD_PORTAUDIO_SINK=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DUSE_DOTAPP_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release + run: cmake $GITHUB_WORKSPACE -DOPT_BUILD_PLUTOSDR_SOURCE=ON -DOPT_BUILD_SOAPY_SOURCE=OFF -DOPT_BUILD_BLADERF_SOURCE=ON -DOPT_BUILD_SDRPLAY_SOURCE=ON -DOPT_BUILD_AUDIO_SINK=OFF -DOPT_BUILD_PORTAUDIO_SINK=ON -DOPT_BUILD_NEW_PORTAUDIO_SINK=ON -DOPT_BUILD_M17_DECODER=ON -DUSE_DOTAPP_DEFAULTS=ON -DCMAKE_BUILD_TYPE=Release - name: Build working-directory: ${{runner.workspace}}/build @@ -105,7 +111,7 @@ jobs: - name: Create Archive working-directory: ${{runner.workspace}} - run: cd $GITHUB_WORKSPACE && sh make_macos_dotapp_new.sh ${{runner.workspace}}/build ./SDR++.app && zip -r ${{runner.workspace}}/sdrpp_macos_intel.zip SDR++.app + run: cd $GITHUB_WORKSPACE && sh make_macos_dotapp.sh ${{runner.workspace}}/build ./SDR++.app && zip -r ${{runner.workspace}}/sdrpp_macos_intel.zip SDR++.app - name: Save Archive uses: actions/upload-artifact@v2 diff --git a/macos/bundle_utils.sh b/macos/bundle_utils.sh new file mode 100644 index 00000000..0a286ed6 --- /dev/null +++ b/macos/bundle_utils.sh @@ -0,0 +1,183 @@ +#==============================================# +# MacOS Bundle Utilities # +# Copyright(C) Ryzerth, 2021 # +#==============================================# + +# ========================= Customization ========================= + +# bundle_is_not_to_be_installed [dylib_name] +bundle_is_not_to_be_installed() { + # NOTE: Customize this list to exclude libraries you don't want copied into the bundle + if [ "$1" = "libsdrpp_core.dylib" ]; then echo 1; fi + if [ "$1" = "OpenGL" ]; then echo 1; fi + if [ "$1" = "libc++.1.dylib" ]; then echo 1; fi + if [ "$1" = "libSystem.B.dylib" ]; then echo 1; fi + if [ "$1" = "Cocoa" ]; then echo 1; fi + if [ "$1" = "IOKit" ]; then echo 1; fi + if [ "$1" = "CoreFoundation" ]; then echo 1; fi + if [ "$1" = "AppKit" ]; then echo 1; fi + if [ "$1" = "CoreGraphics" ]; then echo 1; fi + if [ "$1" = "CoreServices" ]; then echo 1; fi + if [ "$1" = "Foundation" ]; then echo 1; fi + if [ "$1" = "CoreAudio" ]; then echo 1; fi + if [ "$1" = "AudioToolbox" ]; then echo 1; fi + if [ "$1" = "AudioUnit" ]; then echo 1; fi + if [ "$1" = "libobjc.A.dylib" ]; then echo 1; fi +} + +# ========================= FOR INTERNAL USE ONLY ========================= + +# bundle_get_first_element [elem0] [elem1] [elem2] ... +bundle_get_first_element() { + echo $1 +} + +# bundle_get_second_element [elem0] [elem1] [elem2] ... +bundle_get_second_element() { + echo $2 +} + +# bundle_get_exec_deps [exec_path] +bundle_get_exec_deps() { + DEPS_RAW=$(otool -L $1 | tail -n +2) + + # Iterate over all lines + echo "$DEPS_RAW" | while read -r DEP; do + echo $(bundle_get_first_element $DEP) + done +} + +# bundle_get_exec_rpaths [exec_path] +bundle_get_exec_rpaths() { + RPATHS_RAW=$(otool -l $1 | grep "path\ ") + + # Iterate over all lines + echo "$RPATHS_RAW" | while read -r RPATH; do + echo $(bundle_get_second_element $RPATH) + done +} + +# ========================= Public Functions ========================= + +bundle_create_struct() { + if [ $# -ne 1 ]; then + echo "bundle_create_struct [bundle_path]"; + return + fi + + mkdir -p $1 + mkdir -p $1/Contents + mkdir -p $1/Contents/MacOS + mkdir -p $1/Contents/Frameworks + mkdir -p $1/Contents/Resources + mkdir -p $1/Contents/Plugins +} + +bundle_install_binary() { + if [ $# -ne 3 ]; then + echo "bundle_install_binary [bundle_path] [exec_path] [install_path]"; + return + fi + + local EXEC_NAME=$(basename $3) + local EXEC_DEST=$2/$EXEC_NAME + + # Check if file exists + if [ ! -f $3 ]; then + echo "==NOT== Installing" $EXEC_NAME + return + fi + + echo "Installing" $EXEC_NAME + + # Copy it to its install location + cp $3 $EXEC_DEST + + # Install dependencies and change path + local DEPS=$(bundle_get_exec_deps $EXEC_DEST) + echo "$DEPS" | while read -r DEP; do + local DEP_NAME=$(basename $DEP) + + # Skip if this dep is blacklisted + local NOT_TO_BE_INSTALLED=$(bundle_is_not_to_be_installed $DEP_NAME) + if [ "$NOT_TO_BE_INSTALLED" = "1" ]; then + continue + fi + + # Skip if this dep is itself + if [ "$DEP_NAME" = "$EXEC_NAME" ]; then + continue + fi + + # If the dependency is not installed, install it + if [ ! -f $1/Contents/Frameworks/$DEP_NAME ]; then + bundle_install_binary $1 $1/Contents/Frameworks $DEP + fi + + # Fix path + install_name_tool -change $DEP @rpath/$DEP_NAME $EXEC_DEST + done + + # Remove all its rpaths + local RPATHS=$(bundle_get_exec_rpaths $EXEC_DEST) + if [ "$RPATHS" != "" ]; then + echo "$RPATHS" | while read -r RPATH; do + install_name_tool -delete_rpath $RPATH $EXEC_DEST + done + fi + + # Add new single rpath + install_name_tool -add_rpath @loader_path/../Frameworks $EXEC_DEST +} + +bundle_create_icns() { + if [ $# -ne 2 ]; then + echo "bundle_create_icns [image_path] [icns_file]"; + return + fi + + mkdir $2.iconset + sips -z 16 16 $1 --out $2.iconset/icon_16x16.png + sips -z 32 32 $1 --out $2.iconset/icon_16x16@2x.png + sips -z 32 32 $1 --out $2.iconset/icon_32x32.png + sips -z 64 64 $1 --out $2.iconset/icon_32x32@2x.png + sips -z 128 128 $1 --out $2.iconset/icon_128x128.png + sips -z 256 256 $1 --out $2.iconset/icon_128x128@2x.png + sips -z 256 256 $1 --out $2.iconset/icon_256x256.png + sips -z 512 512 $1 --out $2.iconset/icon_256x256@2x.png + sips -z 512 512 $1 --out $2.iconset/icon_512x512.png + iconutil -c icns $2.iconset + rm -R $2.iconset +} + +bundle_create_plist() { + if [ $# -ne 8 ]; then + echo "bundle_create_plist [bundle_name] [display_name] [identifier] [version] [signature] [exec] [icon] [plist]"; + return + fi + + echo '' >> $8 + echo '' >> $8 + echo '' >> $8 + echo '' >> $8 + echo ' ' >> $8 + echo ' CFBundleName'$1'' >> $8 + echo ' CFBundleDisplayName'$2'' >> $8 + echo ' CFBundleIdentifiero'$3'' >> $8 + echo ' CFBundleVersion'$4'' >> $8 + echo ' CFBundlePackageTypeAPPL' >> $8 + echo ' CFBundleSignature'$5'' >> $8 + echo ' CFBundleExecutable'$6'' >> $8 + echo ' CFBundleIconFile'$7'' >> $8 + echo ' ' >> $8 + echo '' >> $8 +} + +bundle_sign() { + if [ $# -ne 1 ]; then + echo "bundle_sign [bundle_dir]"; + return + fi + + codesign --force --deep -s - $1 +} \ No newline at end of file diff --git a/macos/delete_rpath.sh b/macos/delete_rpath.sh deleted file mode 100644 index c733e22e..00000000 --- a/macos/delete_rpath.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -set -e - -# Options -RPATH_NAME=$1 -EXEC=$2 - -# Function to keep only the second arg -get_second_arg() { - echo $2 -} - -# Get current rpath -WANTED_RPATH=$(get_second_arg $(otool -l $EXEC | grep $RPATH_NAME | grep path)) - -if [ ! -z "$WANTED_RPATH" ]; then - install_name_tool -delete_rpath $WANTED_RPATH $EXEC -fi \ No newline at end of file diff --git a/macos/get_library_path.sh b/macos/get_library_path.sh deleted file mode 100644 index 85131608..00000000 --- a/macos/get_library_path.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -set -e - -# Options -WANTED_LIB=$1 -EXEC=$2 - -# Function to extract the first element of a space seperated list -get_first_arg() { - echo $1 -} - -# Get current path -echo $(get_first_arg $(otool -L $EXEC | grep $WANTED_LIB)) \ No newline at end of file diff --git a/macos/search_rpath.sh b/macos/search_rpath.sh deleted file mode 100644 index 8acdd4fe..00000000 --- a/macos/search_rpath.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -set -e - -# Options -RPATH_NAME=$1 -EXEC=$2 - -# Function to keep only the second arg -get_second_arg() { - echo $2 -} - -# Get current rpath -echo $(get_second_arg $(otool -l $EXEC | grep $RPATH_NAME | grep path)) \ No newline at end of file diff --git a/macos/set_library_path.sh b/macos/set_library_path.sh deleted file mode 100644 index e72066cb..00000000 --- a/macos/set_library_path.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -set -e - -# Options -WANTED_LIB=$1 -NEW_PATH=$2 -EXEC=$3 - -# Function to extract the first element of a space seperated list -get_first_arg() { - echo $1 -} - -# Get current path -CURRENT_PATH=$(get_first_arg $(otool -L $EXEC | grep $WANTED_LIB)) - -# Change to the new path if found -if [ ! -z "$CURRENT_PATH" ]; then - install_name_tool -change $CURRENT_PATH $NEW_PATH $EXEC -fi \ No newline at end of file diff --git a/make_macos_bundle.sh b/make_macos_bundle.sh new file mode 100644 index 00000000..4c909e64 --- /dev/null +++ b/make_macos_bundle.sh @@ -0,0 +1,65 @@ +#!/bin/sh +set -e + +# ========================= Boilerplate ========================= +BUILD_DIR=$1 +BUNDLE=$2 + +source macos/bundle_utils.sh + +# ========================= Prepare dotapp structure ========================= + +# Clear .app +rm -rf $BUNDLE + +# Create .app structure +bundle_create_struct $BUNDLE + +# Add resources +cp -R root/res/* $BUNDLE/Contents/Resources/ + +# Create the icon file +bundle_create_icns root/res/icons/sdrpp.png $BUNDLE/Contents/Resources/sdrpp + +# Create the property list +bundle_create_plist sdrpp SDR++ org.sdrpp.sdrpp 1.0.5 sdrp sdrpp sdrpp $BUNDLE/Contents/Info.plist + +# ========================= Install binaries ========================= + +# Core +bundle_install_binary $BUNDLE $BUNDLE/Contents/MacOS $BUILD_DIR/sdrpp +bundle_install_binary $BUNDLE $BUNDLE/Contents/Frameworks $BUILD_DIR/core/libsdrpp_core.dylib + +# Source modules +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/airspy_source/airspy_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/airspyhf_source/airspyhf_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/bladerf_source/bladerf_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/file_source/file_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/hackrf_source/hackrf_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/limesdr_source/limesdr_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/plutosdr_source/plutosdr_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/rtl_sdr_source/rtl_sdr_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/rtl_tcp_source/rtl_tcp_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/sdrplay_source/sdrplay_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/soapy_source/soapy_source.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/source_modules/spyserver_source/spyserver_source.dylib + +# Sink modules +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/sink_modules/portaudio_sink/audio_sink.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/sink_modules/network_sink/network_sink.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/sink_modules/new_portaudio_sink/new_portaudio_sink.dylib + +# Decoder modules +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/decoder_modules/m17_decoder/m17_decoder.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/decoder_modules/meteor_demodulator/meteor_demodulator.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/decoder_modules/radio/radio.dylib + +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/misc_modules/discord_integration/discord_integration.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/misc_modules/frequency_manager/frequency_manager.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/misc_modules/recorder/recorder.dylib +bundle_install_binary $BUNDLE $BUNDLE/Contents/Plugins $BUILD_DIR/misc_modules/rigctl_server/rigctl_server.dylib + +# ========================= Finalize ========================= + +# Sign the app +bundle_sign $BUNDLE \ No newline at end of file diff --git a/make_macos_dotapp.sh b/make_macos_dotapp.sh deleted file mode 100644 index f053c0bb..00000000 --- a/make_macos_dotapp.sh +++ /dev/null @@ -1,225 +0,0 @@ -#!/bin/sh -set -e - -# Options -BUILD_DIR=$1 -DOTAPP=$2 - -# Remove existing .app -rm -rf $DOTAPP - -# Create .app structure -mkdir $DOTAPP -mkdir $DOTAPP/Contents -mkdir $DOTAPP/Contents/MacOS -mkdir $DOTAPP/Contents/Frameworks -mkdir $DOTAPP/Contents/Resources -mkdir $DOTAPP/Contents/Plugins - -# ========================= Boilerplate ========================= - -delete_common_rpath() { - # TODO: Also remove build/core if present - sh macos/delete_rpath.sh /usr/local/lib $1 - sh macos/delete_rpath.sh glew $1 - sh macos/delete_rpath.sh fftw $1 - sh macos/delete_rpath.sh glfw $1 -} - -set_common_rpath() { - sh macos/set_library_path.sh libGLEW @rpath/libGLEW.dylib $1 - sh macos/set_library_path.sh libfftw3f @rpath/libfftw3f.dylib $1 - sh macos/set_library_path.sh libglfw @rpath/libglfw.dylib $1 - sh macos/set_library_path.sh libvolk @rpath/libvolk.dylib $1 - install_name_tool -add_rpath @loader_path/../Frameworks $1 -} - -update_common_rpath() { - delete_common_rpath $1 - set_common_rpath $1 -} - -install_module() { - if [ -f $1 ]; then - BNAME=$(basename $1) - cp $1 $DOTAPP/Contents/Plugins/ - update_common_rpath $DOTAPP/Contents/Plugins/$BNAME - fi -} - -# ========================= CORE ========================= - -# Copy files -cp $BUILD_DIR/sdrpp $DOTAPP/Contents/MacOS/ -cp $BUILD_DIR/core/libsdrpp_core.dylib $DOTAPP/Contents/Frameworks/ - -# Get dep paths -LIBGLEW_PATH=$(sh macos/get_library_path.sh libGLEW $DOTAPP/Contents/MacOS/sdrpp) -LIBFFTW3F_PATH=$(sh macos/get_library_path.sh libfftw3f $DOTAPP/Contents/MacOS/sdrpp) -LIBGCC_PATH=$(sh macos/get_library_path.sh libgcc $LIBFFTW3F_PATH) -LIBGLFW_PATH=$(sh macos/get_library_path.sh libglfw $DOTAPP/Contents/MacOS/sdrpp) -LIBVOLK_PATH=$(sh macos/get_library_path.sh libvolk $DOTAPP/Contents/MacOS/sdrpp) - -# Copy libfftw3f in advance -cp $LIBFFTW3F_PATH $DOTAPP/Contents/Frameworks/libfftw3f.dylib -cp $LIBGCC_PATH $DOTAPP/Contents/Frameworks/libgcc.dylib - -# Udpate old RPATH for sdrpp -update_common_rpath $DOTAPP/Contents/MacOS/sdrpp -sh macos/delete_rpath.sh build/core $DOTAPP/Contents/MacOS/sdrpp - -# Udpate old RPATH for libsdrpp_core -update_common_rpath $DOTAPP/Contents/Frameworks/libsdrpp_core.dylib - -# Remove libfftw3f signature -codesign --remove-signature $DOTAPP/Contents/Frameworks/libfftw3f.dylib - -# Udpate old RPATH for libfftw3f and set new one (do it twice since it has two rpaths for some reason) -sh macos/delete_rpath.sh gcc $DOTAPP/Contents/Frameworks/libfftw3f.dylib -sh macos/delete_rpath.sh gcc $DOTAPP/Contents/Frameworks/libfftw3f.dylib -install_name_tool -add_rpath @loader_path/../Frameworks $DOTAPP/Contents/Frameworks/libfftw3f.dylib -sh macos/set_library_path.sh libgcc @rpath/libgcc.dylib $DOTAPP/Contents/Frameworks/libfftw3f.dylib - -# Add back libfftw3f's signature -codesign -s - $DOTAPP/Contents/Frameworks/libfftw3f.dylib - -# Copy deps -cp $LIBGLEW_PATH $DOTAPP/Contents/Frameworks/libGLEW.dylib -cp $LIBGLFW_PATH $DOTAPP/Contents/Frameworks/libglfw.dylib -cp $LIBVOLK_PATH $DOTAPP/Contents/Frameworks/libvolk.dylib - -# ========================= Resources ========================= -cp -R root/res/* $DOTAPP/Contents/Resources/ - -# ========================= Icon ========================= -mkdir $DOTAPP/Contents/Resources/sdrpp.iconset -sips -z 16 16 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_16x16.png -sips -z 32 32 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_16x16@2x.png -sips -z 32 32 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_32x32.png -sips -z 64 64 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_32x32@2x.png -sips -z 128 128 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_128x128.png -sips -z 256 256 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_128x128@2x.png -sips -z 256 256 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_256x256.png -sips -z 512 512 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_256x256@2x.png -sips -z 512 512 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_512x512.png -iconutil -c icns $DOTAPP/Contents/Resources/sdrpp.iconset -rm -R $DOTAPP/Contents/Resources/sdrpp.iconset - -# ========================= Source Modules ========================= - -install_module $BUILD_DIR/source_modules/airspy_source/airspy_source.dylib -LIBAIRSPY_PATH=$(sh macos/get_library_path.sh libairspy $BUILD_DIR/source_modules/airspy_source/airspy_source.dylib) -LIBUSB_PATH=$(sh macos/get_library_path.sh libusb $LIBAIRSPY_PATH) -cp $LIBAIRSPY_PATH $DOTAPP/Contents/Frameworks/libairspy.dylib -cp $LIBUSB_PATH $DOTAPP/Contents/Frameworks/libusb.dylib -sh macos/delete_rpath.sh /airspy/ $DOTAPP/Contents/Plugins/airspy_source.dylib -# sh macos/delete_rpath.sh libusb $DOTAPP/Contents/Frameworks/libairspy.dylib # NOT NEEDED???? -sh macos/set_library_path.sh libairspy @rpath/libairspy.dylib $DOTAPP/Contents/Plugins/airspy_source.dylib -sh macos/set_library_path.sh libusb @rpath/libusb.dylib $DOTAPP/Contents/Frameworks/libairspy.dylib -install_name_tool -add_rpath @loader_path/../Frameworks $DOTAPP/Contents/Frameworks/libairspy.dylib -codesign --remove-signature $DOTAPP/Contents/Frameworks/libairspy.dylib -codesign -s - $DOTAPP/Contents/Frameworks/libairspy.dylib - -install_module $BUILD_DIR/source_modules/airspyhf_source/airspyhf_source.dylib -LIBAIRSPYHF_PATH=$(sh macos/get_library_path.sh libairspyhf $BUILD_DIR/source_modules/airspyhf_source/airspyhf_source.dylib) -cp $LIBAIRSPYHF_PATH $DOTAPP/Contents/Frameworks/libairspyhf.dylib -sh macos/delete_rpath.sh /airspyhf/ $DOTAPP/Contents/Plugins/airspyhf_source.dylib -# sh macos/delete_rpath.sh libusb $DOTAPP/Contents/Frameworks/libairspyhf.dylib # NOT NEEDED???? -sh macos/set_library_path.sh libairspy @rpath/libairspyhf.dylib $DOTAPP/Contents/Plugins/airspyhf_source.dylib -sh macos/set_library_path.sh libusb @rpath/libusb.dylib $DOTAPP/Contents/Frameworks/libairspyhf.dylib -install_name_tool -add_rpath @loader_path/../Frameworks $DOTAPP/Contents/Frameworks/libairspyhf.dylib -codesign --remove-signature $DOTAPP/Contents/Frameworks/libairspyhf.dylib -codesign -s - $DOTAPP/Contents/Frameworks/libairspyhf.dylib - -install_module $BUILD_DIR/source_modules/bladerf_source/bladerf_source.dylib -LIBBLADERF_PATH=$(sh macos/get_library_path.sh libbladeRF $BUILD_DIR/source_modules/bladerf_source/bladerf_source.dylib) -cp $LIBBLADERF_PATH $DOTAPP/Contents/Frameworks/libbladeRF.dylib -sh macos/delete_rpath.sh libbladerf $DOTAPP/Contents/Plugins/bladerf_source.dylib -# sh macos/delete_rpath.sh libusb $DOTAPP/Contents/Frameworks/libbladeRF.dylib # NOT NEEDED???? -sh macos/set_library_path.sh libbladeRF @rpath/libbladeRF.dylib $DOTAPP/Contents/Plugins/bladerf_source.dylib -sh macos/set_library_path.sh libusb @rpath/libusb.dylib $DOTAPP/Contents/Frameworks/libbladeRF.dylib -install_name_tool -add_rpath @loader_path/../Frameworks $DOTAPP/Contents/Frameworks/libbladeRF.dylib -codesign --remove-signature $DOTAPP/Contents/Frameworks/libbladeRF.dylib -codesign -s - $DOTAPP/Contents/Frameworks/libbladeRF.dylib - -install_module $BUILD_DIR/source_modules/file_source/file_source.dylib - -install_module $BUILD_DIR/source_modules/hackrf_source/hackrf_source.dylib -LIBHACKRF_PATH=$(sh macos/get_library_path.sh libhackrf $BUILD_DIR/source_modules/hackrf_source/hackrf_source.dylib) -cp $LIBHACKRF_PATH $DOTAPP/Contents/Frameworks/libhackrf.dylib -sh macos/delete_rpath.sh /hackrf/ $DOTAPP/Contents/Plugins/hackrf_source.dylib -# sh macos/delete_rpath.sh libusb $DOTAPP/Contents/Frameworks/libhackrf.dylib # NOT NEEDED???? -sh macos/set_library_path.sh libhackrf @rpath/libhackrf.dylib $DOTAPP/Contents/Plugins/hackrf_source.dylib -sh macos/set_library_path.sh libusb @rpath/libusb.dylib $DOTAPP/Contents/Frameworks/libhackrf.dylib -install_name_tool -add_rpath @loader_path/../Frameworks $DOTAPP/Contents/Frameworks/libhackrf.dylib -codesign --remove-signature $DOTAPP/Contents/Frameworks/libhackrf.dylib -codesign -s - $DOTAPP/Contents/Frameworks/libhackrf.dylib - -install_module $BUILD_DIR/source_modules/rtl_sdr_source/rtl_sdr_source.dylib -LIBRTLSDR_PATH=$(sh macos/get_library_path.sh librtlsdr $BUILD_DIR/source_modules/rtl_sdr_source/rtl_sdr_source.dylib) -cp $LIBRTLSDR_PATH $DOTAPP/Contents/Frameworks/librtlsdr.dylib -sh macos/delete_rpath.sh librtlsdr $DOTAPP/Contents/Plugins/rtl_sdr_source.dylib -# sh macos/delete_rpath.sh libusb $DOTAPP/Contents/Frameworks/librtlsdr.dylib # NOT NEEDED???? -sh macos/set_library_path.sh librtlsdr @rpath/librtlsdr.dylib $DOTAPP/Contents/Plugins/rtl_sdr_source.dylib -sh macos/set_library_path.sh libusb @rpath/libusb.dylib $DOTAPP/Contents/Plugins/rtl_sdr_source.dylib # On intel needed too apparently -sh macos/set_library_path.sh libusb @rpath/libusb.dylib $DOTAPP/Contents/Frameworks/librtlsdr.dylib -install_name_tool -add_rpath @loader_path/../Frameworks $DOTAPP/Contents/Frameworks/librtlsdr.dylib -codesign --remove-signature $DOTAPP/Contents/Frameworks/librtlsdr.dylib -codesign -s - $DOTAPP/Contents/Frameworks/librtlsdr.dylib - -install_module $BUILD_DIR/source_modules/rtl_tcp_source/rtl_tcp_source.dylib - -install_module $BUILD_DIR/source_modules/sdrplay_source/sdrplay_source.dylib - -install_module $BUILD_DIR/source_modules/spyserver_source/spyserver_source.dylib - -# ========================= Sink Modules ========================= - -install_module $BUILD_DIR/sink_modules/network_sink/network_sink.dylib - -install_module $BUILD_DIR/sink_modules/portaudio_sink/audio_sink.dylib -LIBPORTAUDIO_PATH=$(sh macos/get_library_path.sh libportaudio $BUILD_DIR/sink_modules/portaudio_sink/audio_sink.dylib) -cp $LIBPORTAUDIO_PATH $DOTAPP/Contents/Frameworks/libportaudio.dylib -sh macos/delete_rpath.sh /portaudio/ $DOTAPP/Contents/Plugins/audio_sink.dylib -sh macos/set_library_path.sh libportaudio @rpath/libportaudio.dylib $DOTAPP/Contents/Plugins/audio_sink.dylib - -install_module $BUILD_DIR/sink_modules/new_portaudio_sink/new_portaudio_sink.dylib -sh macos/delete_rpath.sh /portaudio/ $DOTAPP/Contents/Plugins/new_portaudio_sink.dylib -sh macos/set_library_path.sh libportaudio @rpath/libportaudio.dylib $DOTAPP/Contents/Plugins/new_portaudio_sink.dylib - -# ========================= Decoder Modules ========================= - -install_module $BUILD_DIR/decoder_modules/m17_decoder/m17_decoder.dylib -# TODO: Add codec2 - -install_module $BUILD_DIR/decoder_modules/meteor_demodulator/meteor_demodulator.dylib - -install_module $BUILD_DIR/decoder_modules/radio/radio.dylib - -# ========================= Misc Modules ========================= - -install_module $BUILD_DIR/misc_modules/discord_integration/discord_integration.dylib - -install_module $BUILD_DIR/misc_modules/frequency_manager/frequency_manager.dylib - -install_module $BUILD_DIR/misc_modules/recorder/recorder.dylib - -install_module $BUILD_DIR/misc_modules/rigctl_server/rigctl_server.dylib - -# ========================= Create PList ========================= - -echo '' >> $DOTAPP/Contents/Info.plist -echo '' >> $DOTAPP/Contents/Info.plist -echo '' >> $DOTAPP/Contents/Info.plist -echo '' >> $DOTAPP/Contents/Info.plist -echo ' ' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleNamesdrpp' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleDisplayNameSDR++' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleIdentifierorg.sdrpp.sdrpp' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleVersion1.0.5' >> $DOTAPP/Contents/Info.plist -echo ' CFBundlePackageTypeAPPL' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleSignaturesdrp' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleExecutablesdrpp' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleIconFilesdrpp' >> $DOTAPP/Contents/Info.plist -echo ' ' >> $DOTAPP/Contents/Info.plist -echo '' >> $DOTAPP/Contents/Info.plist \ No newline at end of file diff --git a/make_macos_dotapp_new.sh b/make_macos_dotapp_new.sh deleted file mode 100644 index 95450790..00000000 --- a/make_macos_dotapp_new.sh +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/sh -set -e - -# ========================= Prepare dotapp structure ========================= - -# Options -BUILD_DIR=$1 -DOTAPP=$2 - -# Remove existing .app -rm -rf $DOTAPP - -# Create .app structure -mkdir $DOTAPP -mkdir $DOTAPP/Contents -mkdir $DOTAPP/Contents/MacOS -mkdir $DOTAPP/Contents/Frameworks -mkdir $DOTAPP/Contents/Resources -mkdir $DOTAPP/Contents/Plugins - -# ========================= Boilerplate ========================= - -# get_first_element [elem0] [elem1] [elem2] ... -get_first_element() { - echo $1 -} - -# get_second_element [elem0] [elem1] [elem2] ... -get_second_element() { - echo $2 -} - -# is_not_to_be_installed [dylib_name] -is_not_to_be_installed() { - if [ "$1" = "libsdrpp_core.dylib" ]; then echo 1; fi - if [ "$1" = "OpenGL" ]; then echo 1; fi - if [ "$1" = "libc++.1.dylib" ]; then echo 1; fi - if [ "$1" = "libSystem.B.dylib" ]; then echo 1; fi - if [ "$1" = "Cocoa" ]; then echo 1; fi - if [ "$1" = "IOKit" ]; then echo 1; fi - if [ "$1" = "CoreFoundation" ]; then echo 1; fi - if [ "$1" = "AppKit" ]; then echo 1; fi - if [ "$1" = "CoreGraphics" ]; then echo 1; fi - if [ "$1" = "CoreServices" ]; then echo 1; fi - if [ "$1" = "Foundation" ]; then echo 1; fi - if [ "$1" = "CoreAudio" ]; then echo 1; fi - if [ "$1" = "AudioToolbox" ]; then echo 1; fi - if [ "$1" = "AudioUnit" ]; then echo 1; fi - if [ "$1" = "libobjc.A.dylib" ]; then echo 1; fi -} - -# get_exec_deps [exec_path] -get_exec_deps() { - DEPS_RAW=$(otool -L $1 | tail -n +2) - - # Iterate over all lines - echo "$DEPS_RAW" | while read -r DEP; do - echo $(get_first_element $DEP) - done -} - -# get_exec_rpaths [exec_path] -get_exec_rpaths() { - RPATHS_RAW=$(otool -l $1 | grep "path\ ") - - # Iterate over all lines - echo "$RPATHS_RAW" | while read -r RPATH; do - echo $(get_second_element $RPATH) - done -} - -# install_exec [exec_path] [install_path] -install_exec() { - local EXEC_NAME=$(basename $2) - local EXEC_DEST=$1/$EXEC_NAME - - # Check if file exists - if [ ! -f $2 ]; then - echo "==NOT== Installing" $EXEC_NAME - return - fi - - echo "Installing" $EXEC_NAME - - # Copy it to its install location - cp $2 $EXEC_DEST - - # Install dependencies and change path - local DEPS=$(get_exec_deps $EXEC_DEST) - echo "$DEPS" | while read -r DEP; do - local DEP_NAME=$(basename $DEP) - - # Skip if this dep is blacklisted - local NOT_TO_BE_INSTALLED=$(is_not_to_be_installed $DEP_NAME) - if [ "$NOT_TO_BE_INSTALLED" = "1" ]; then - continue - fi - - # Skip if this dep is itself - if [ "$DEP_NAME" = "$EXEC_NAME" ]; then - continue - fi - - # If the dependency is not installed, install it - if [ ! -f $DOTAPP/Contents/Frameworks/$DEP_NAME ]; then - install_exec $DOTAPP/Contents/Frameworks $DEP - fi - - # Fix path - install_name_tool -change $DEP @rpath/$DEP_NAME $EXEC_DEST - done - - # Remove all its rpaths - local RPATHS=$(get_exec_rpaths $EXEC_DEST) - if [ "$RPATHS" != "" ]; then - echo "$RPATHS" | while read -r RPATH; do - install_name_tool -delete_rpath $RPATH $EXEC_DEST - done - fi - - # Add new single rpath - install_name_tool -add_rpath @loader_path/../Frameworks $EXEC_DEST -} - -# ========================= Install binaries ========================= - -# Core -install_exec $DOTAPP/Contents/MacOS $BUILD_DIR/sdrpp -install_exec $DOTAPP/Contents/Frameworks $BUILD_DIR/core/libsdrpp_core.dylib - -# Source modules -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/airspy_source/airspy_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/airspyhf_source/airspyhf_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/bladerf_source/bladerf_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/file_source/file_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/hackrf_source/hackrf_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/limesdr_source/limesdr_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/plutosdr_source/plutosdr_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/rtl_sdr_source/rtl_sdr_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/rtl_tcp_source/rtl_tcp_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/sdrplay_source/sdrplay_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/soapy_source/soapy_source.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/source_modules/spyserver_source/spyserver_source.dylib - -# Sink modules -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/sink_modules/portaudio_sink/audio_sink.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/sink_modules/network_sink/network_sink.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/sink_modules/new_portaudio_sink/new_portaudio_sink.dylib - -# Decoder modules -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/decoder_modules/m17_decoder/m17_decoder.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/decoder_modules/meteor_demodulator/meteor_demodulator.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/decoder_modules/radio/radio.dylib - -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/misc_modules/discord_integration/discord_integration.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/misc_modules/frequency_manager/frequency_manager.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/misc_modules/recorder/recorder.dylib -install_exec $DOTAPP/Contents/Plugins $BUILD_DIR/misc_modules/rigctl_server/rigctl_server.dylib - -# ========================= Install resources ========================= - -# Copy resource folder -cp -R root/res/* $DOTAPP/Contents/Resources/ - -# Generate icon -mkdir $DOTAPP/Contents/Resources/sdrpp.iconset -sips -z 16 16 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_16x16.png -sips -z 32 32 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_16x16@2x.png -sips -z 32 32 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_32x32.png -sips -z 64 64 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_32x32@2x.png -sips -z 128 128 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_128x128.png -sips -z 256 256 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_128x128@2x.png -sips -z 256 256 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_256x256.png -sips -z 512 512 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_256x256@2x.png -sips -z 512 512 root/res/icons/sdrpp.png --out $DOTAPP/Contents/Resources/sdrpp.iconset/icon_512x512.png -iconutil -c icns $DOTAPP/Contents/Resources/sdrpp.iconset -rm -R $DOTAPP/Contents/Resources/sdrpp.iconset - -# ========================= Generate the plist ========================= - -echo '' >> $DOTAPP/Contents/Info.plist -echo '' >> $DOTAPP/Contents/Info.plist -echo '' >> $DOTAPP/Contents/Info.plist -echo '' >> $DOTAPP/Contents/Info.plist -echo ' ' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleNamesdrpp' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleDisplayNameSDR++' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleIdentifierorg.sdrpp.sdrpp' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleVersion1.0.5' >> $DOTAPP/Contents/Info.plist -echo ' CFBundlePackageTypeAPPL' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleSignaturesdrp' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleExecutablesdrpp' >> $DOTAPP/Contents/Info.plist -echo ' CFBundleIconFilesdrpp' >> $DOTAPP/Contents/Info.plist -echo ' ' >> $DOTAPP/Contents/Info.plist -echo '' >> $DOTAPP/Contents/Info.plist - -# ========================= Sign the dotapp ========================= - -codesign --force --deep -s - $DOTAPP \ No newline at end of file