From 686abccf412767382124e73c9564e99d9759decd Mon Sep 17 00:00:00 2001 From: Jethro Grassie Date: Mon, 28 Jan 2019 19:19:40 -0500 Subject: [PATCH 1/2] scripts: gui build fixes --- bin/build-launcher.sh | 4 ++-- bin/import-packages.sh | 25 ++++++++++++++----------- bin/java-config.sh | 6 ++++-- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/bin/build-launcher.sh b/bin/build-launcher.sh index f696378..7ac09a3 100755 --- a/bin/build-launcher.sh +++ b/bin/build-launcher.sh @@ -14,7 +14,7 @@ rm -fr target/org.getmonero.i2p.zero.gui/classes # compile the Main class that starts the I2P router and SAM listener echo "*** Compiling Main class" $JAVA_HOME/bin/javac --module-path import/lib -d target/org.getmonero.i2p.zero/classes $(find org.getmonero.i2p.zero/src -name '*.java') -$JAVA_HOME/bin/javac --module-path import/lib:import/javafx-sdk-11.0.2/lib:target/org.getmonero.i2p.zero/classes -d target/org.getmonero.i2p.zero.gui/classes $(find org.getmonero.i2p.zero.gui/src -name '*.java') +$JAVA_HOME/bin/javac --module-path import/lib:import/javafx-sdks/linux/javafx-sdk-$JAVAFX_VERSION/lib:target/org.getmonero.i2p.zero/classes -d target/org.getmonero.i2p.zero.gui/classes $(find org.getmonero.i2p.zero.gui/src -name '*.java') cp -r org.getmonero.i2p.zero.gui/src/* target/org.getmonero.i2p.zero.gui/classes find target -type f -name '*.java' -delete @@ -40,7 +40,7 @@ for i in linux mac win; do esac echo "Using JAVA_HOME_VARIANT: $JAVA_HOME_VARIANT" $JAVA_HOME/bin/jlink --module-path ${JAVA_HOME_VARIANT}/jmods:target/modules:target/org.getmonero.i2p.zero.jar --add-modules org.getmonero.i2p.zero --output dist/$i/router --strip-debug --compress 2 --no-header-files --no-man-pages - $JAVA_HOME/bin/jlink --module-path ${JAVA_HOME_VARIANT}/jmods:import/javafx-jmods/$i/javafx-jmods-11.0.2:target/modules:target/org.getmonero.i2p.zero.jar:target/org.getmonero.i2p.zero.gui.jar --add-modules org.getmonero.i2p.zero,org.getmonero.i2p.zero.gui,javafx.controls,javafx.fxml,java.desktop --output dist/$i-gui/router --strip-debug --compress 2 --no-header-files --no-man-pages + $JAVA_HOME/bin/jlink --module-path ${JAVA_HOME_VARIANT}/jmods:import/javafx-jmods/$i/javafx-jmods-${JAVAFX_VERSION}:target/modules:target/org.getmonero.i2p.zero.jar:target/org.getmonero.i2p.zero.gui.jar --add-modules org.getmonero.i2p.zero,org.getmonero.i2p.zero.gui,javafx.controls,javafx.fxml,java.desktop --output dist/$i-gui/router --strip-debug --compress 2 --no-header-files --no-man-pages done for i in linux mac linux-gui mac-gui; do diff --git a/bin/import-packages.sh b/bin/import-packages.sh index 2cb330b..38a1bbd 100755 --- a/bin/import-packages.sh +++ b/bin/import-packages.sh @@ -37,14 +37,17 @@ if [ ! -d "$basedir/import/apache-ant-1.10.5" ]; then tar zxvf apache-ant-1.10.5-bin.tar.gz fi -if [ ! -d "$basedir/import/javafx-sdk-11.0.2" ]; then - if [ $(uname -s) = Darwin ]; then - wget $JAVAFX_SDK_DOWNLOAD_URL_MAC - unzip openjfx-11.0.2_osx-x64_bin-sdk.zip - else - wget $JAVAFX_SDK_DOWNLOAD_URL_LINUX - unzip openjfx-11.0.2_linux-x64_bin-sdk.zip - fi +if [ ! -d "$basedir/import/javafx-sdks" ]; then + mkdir -p javafx-sdks + mkdir -p javafx-sdks/linux javafx-sdks/mac javafx-sdks/win + + wget --directory-prefix=javafx-sdks/linux $JAVAFX_SDK_DOWNLOAD_URL_LINUX + wget --directory-prefix=javafx-sdks/mac $JAVAFX_SDK_DOWNLOAD_URL_MAC + wget --directory-prefix=javafx-sdks/win $JAVAFX_SDK_DOWNLOAD_URL_WIN + + unzip javafx-sdks/linux/`basename $JAVAFX_SDK_DOWNLOAD_URL_LINUX` -d javafx-sdks/linux/ + unzip javafx-sdks/mac/`basename $JAVAFX_SDK_DOWNLOAD_URL_MAC` -d javafx-sdks/mac/ + unzip javafx-sdks/win/`basename $JAVAFX_SDK_DOWNLOAD_URL_WIN` -d javafx-sdks/win/ fi if [ ! -d "$basedir/import/javafx-jmods" ]; then @@ -54,9 +57,9 @@ if [ ! -d "$basedir/import/javafx-jmods" ]; then wget --directory-prefix=javafx-jmods/mac $JAVAFX_JMODS_DOWNLOAD_URL_MAC wget --directory-prefix=javafx-jmods/win $JAVAFX_JMODS_DOWNLOAD_URL_WIN - unzip jdks/linux/$JAVAFX_JMODS_DOWNLOAD_FILENAME_LINUX -d javafx-jmods/linux/ - unzip jdks/mac/$JAVAFX_JMODS_DOWNLOAD_FILENAME_MAC -d javafx-jmods/mac/ - unzip jdks/win/$JAVAFX_JMODS_DOWNLOAD_FILENAME_WIN -d javafx-jmods/win/ + unzip javafx-jmods/linux/$JAVAFX_JMODS_DOWNLOAD_FILENAME_LINUX -d javafx-jmods/linux/ + unzip javafx-jmods/mac/$JAVAFX_JMODS_DOWNLOAD_FILENAME_MAC -d javafx-jmods/mac/ + unzip javafx-jmods/win/$JAVAFX_JMODS_DOWNLOAD_FILENAME_WIN -d javafx-jmods/win/ fi diff --git a/bin/java-config.sh b/bin/java-config.sh index 9b83fd8..45682c8 100644 --- a/bin/java-config.sh +++ b/bin/java-config.sh @@ -18,8 +18,10 @@ JAVA_HOME_LINUX=$basedir/import/jdks/linux/jdk-11.0.1+13 JAVA_HOME_MAC=$basedir/import/jdks/mac/jdk-11.0.1+13/Contents/Home JAVA_HOME_WIN=$basedir/import/jdks/win/jdk-11.0.1+13 -JAVAFX_SDK_DOWNLOAD_URL_LINUX=https://download2.gluonhq.com/openjfx/11.0.2/openjfx-11.0.2_linux-x64_bin-sdk.zip -JAVAFX_SDK_DOWNLOAD_URL_MAC=https://download2.gluonhq.com/openjfx/11.0.2/openjfx-11.0.2_osx-x64_bin-sdk.zip +JAVAFX_VERSION=11.0.2 +JAVAFX_SDK_DOWNLOAD_URL_LINUX=https://download2.gluonhq.com/openjfx/$JAVAFX_VERSION/openjfx-${JAVAFX_VERSION}_linux-x64_bin-sdk.zip +JAVAFX_SDK_DOWNLOAD_URL_MAC=https://download2.gluonhq.com/openjfx/$JAVAFX_VERSION/openjfx-${JAVAFX_VERSION}_osx-x64_bin-sdk.zip +JAVAFX_SDK_DOWNLOAD_URL_WIN=https://download2.gluonhq.com/openjfx/$JAVAFX_VERSION/openjfx-${JAVAFX_VERSION}_windows-x64_bin-sdk.zip JAVAFX_JMODS_DOWNLOAD_URL_LINUX=https://download2.gluonhq.com/openjfx/11.0.2/openjfx-11.0.2_linux-x64_bin-jmods.zip JAVAFX_JMODS_DOWNLOAD_URL_MAC=https://download2.gluonhq.com/openjfx/11.0.2/openjfx-11.0.2_osx-x64_bin-jmods.zip From 2bf7cb1d48e81e8d2c1a1063807e63718db0abf3 Mon Sep 17 00:00:00 2001 From: Jethro Grassie Date: Mon, 28 Jan 2019 20:43:10 -0500 Subject: [PATCH 2/2] mac-gui: add rudimentary app bundle --- bin/build-launcher.sh | 17 ++++++++++-- resources/i2p-zero.app/Contents/Info.plist | 26 ++++++++++++++++++ .../i2p-zero.app/Contents/MacOS/launch-gui.sh | 6 ++++ .../Contents/MacOS/tunnel-control.sh | 3 ++ .../Contents/Resources/app-icon.icns | Bin 0 -> 11396 bytes 5 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 resources/i2p-zero.app/Contents/Info.plist create mode 100755 resources/i2p-zero.app/Contents/MacOS/launch-gui.sh create mode 100755 resources/i2p-zero.app/Contents/MacOS/tunnel-control.sh create mode 100644 resources/i2p-zero.app/Contents/Resources/app-icon.icns diff --git a/bin/build-launcher.sh b/bin/build-launcher.sh index 7ac09a3..ef561a5 100755 --- a/bin/build-launcher.sh +++ b/bin/build-launcher.sh @@ -43,21 +43,32 @@ for i in linux mac win; do $JAVA_HOME/bin/jlink --module-path ${JAVA_HOME_VARIANT}/jmods:import/javafx-jmods/$i/javafx-jmods-${JAVAFX_VERSION}:target/modules:target/org.getmonero.i2p.zero.jar:target/org.getmonero.i2p.zero.gui.jar --add-modules org.getmonero.i2p.zero,org.getmonero.i2p.zero.gui,javafx.controls,javafx.fxml,java.desktop --output dist/$i-gui/router --strip-debug --compress 2 --no-header-files --no-man-pages done +cp -R $basedir/resources/i2p-zero.app $basedir/dist/mac-gui/router/bin/ + for i in linux mac linux-gui mac-gui; do - cp $basedir/resources/launch.sh $basedir/dist/$i/router/bin/ - cp $basedir/resources/tunnel-control.sh $basedir/dist/$i/router/bin/ + if [ $i = mac-gui ]; then + mac_root=$basedir/dist/$i/router/bin/i2p-zero.app/Contents/MacOS + cp $basedir/resources/tunnel-control.sh $mac_root/ + mv $basedir/dist/$i/router/bin/java $mac_root/ + mv $basedir/dist/$i/router/bin/jrunscript $mac_root/ + mv $basedir/dist/$i/router/bin/keytool $mac_root/ + else + cp $basedir/resources/launch.sh $basedir/dist/$i/router/bin/ + cp $basedir/resources/tunnel-control.sh $basedir/dist/$i/router/bin/ + fi done for i in win win-gui; do cp $basedir/resources/launch.bat $basedir/dist/$i/router/bin/ done -for i in linux-gui mac-gui; do +for i in linux-gui; do cp $basedir/resources/launch-gui.sh $basedir/dist/$i/router/bin/ done for i in win-gui; do cp $basedir/resources/launch-gui.bat $basedir/dist/$i/router/bin/ done + for i in linux mac win linux-gui mac-gui win-gui; do cp -r $basedir/import/i2p.base $basedir/dist/$i/router/; done for i in linux mac win linux-gui mac-gui win-gui; do mkdir -p $basedir/dist/$i/router/i2p.config; done diff --git a/resources/i2p-zero.app/Contents/Info.plist b/resources/i2p-zero.app/Contents/Info.plist new file mode 100644 index 0000000..41d660d --- /dev/null +++ b/resources/i2p-zero.app/Contents/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleGetInfoString + i2p-zero + CFBundleExecutable + launch-gui.sh + CFBundleIdentifier + org.getmonero.i2p.zero.gui + CFBundleName + i2p-zero + CFBundleIconFile + app-icon + CFBundleShortVersionString + 0.01 + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + IFMajorVersion + 0 + IFMinorVersion + 1 + + diff --git a/resources/i2p-zero.app/Contents/MacOS/launch-gui.sh b/resources/i2p-zero.app/Contents/MacOS/launch-gui.sh new file mode 100755 index 0000000..933aa9f --- /dev/null +++ b/resources/i2p-zero.app/Contents/MacOS/launch-gui.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +wd=${0%/*} +cd "$wd" +basedir="$wd/../../../.." +./java -cp $basedir/i2p.base/jbigi.jar -m org.getmonero.i2p.zero.gui --i2p.dir.base=$basedir/i2p.base --i2p.dir.config=$basedir/i2p.config diff --git a/resources/i2p-zero.app/Contents/MacOS/tunnel-control.sh b/resources/i2p-zero.app/Contents/MacOS/tunnel-control.sh new file mode 100755 index 0000000..24ad902 --- /dev/null +++ b/resources/i2p-zero.app/Contents/MacOS/tunnel-control.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +exec 3<>/dev/tcp/localhost/30000; echo "$1 $2 $3" >&3; cat <&3 \ No newline at end of file diff --git a/resources/i2p-zero.app/Contents/Resources/app-icon.icns b/resources/i2p-zero.app/Contents/Resources/app-icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..5a18ced63f872b0e2bb63c778240857bab503230 GIT binary patch literal 11396 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 z z$&?zW0s@3SswiBKpkFTif`BTzc~sso0v{`lXXAV@Gps6AY1^EDy_D^M8D6c=TtQza$S#SA09HJT{s2qG=go^-0~+p zRk#C!dg-=##OHqfZOaI{mKfMgSN!fwd{*FhHn5g1Y!SkI9X99dy%ApJf*skn>2{D$}${U$4CVH(xiEJiNm(U^u!oD)oq?;Fz@)Ualh+EXK1 oB-O8X&o?SaG5^;O{SGQUUTf$;fAY0+FOUA$U+{l7{2LMYPeDNdP5=M^ literal 0 HcmV?d00001