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