From b3fc5f65b792d1e32fd852719f13023523b04b47 Mon Sep 17 00:00:00 2001 From: Chris Kuethe Date: Fri, 12 May 2017 14:05:08 -0700 Subject: [PATCH] Make this usable Sync the version of GNUstep compiled to that shipped with Hopper, and update the patches to track the changes upstream. Rework the install location. The SDK now installs into the user's `ApplicationSupport/Hopper` directory, and drops a symlink to the `GNUstep.sh` environment setup script into `$HOME` --- README.md | 27 +++++++++++++++ install.sh | 67 +++++++++++++++++++++----------------- patches/gnustep-base.patch | 16 --------- 3 files changed, 64 insertions(+), 46 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..a97ead9 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Introduction + +This is an update of the Hopper +[Linux SDK](https://www.hopperapp.com/blog/?p=150) to match the +versions of libraries shipped by more recent Hopper builds. + +# Usage + +``` +git clone https://github.com/ckuethe/HopperSDK-Linux +cd HopperSDK-Linux +./install.sh + +. ${HOME}/hopper-gnustep.sh +# go about your plugin development business. +``` + +When the build finishes, the SDK will be installed in +`${HOME}/GNUstep/Library/ApplicationSupport/Hopper` as +`HopperSDK-${SDKVER}` and `gnustep-$(arch)`. Additionally a symbolic +link to `GNUstep.sh` - required to set up some environment variables +to compile plugins - will be installed at `${HOME}/hopper-gnustep.sh`. +On a multiuser machine, each user will need to run this SDK installer. + +# Notes +* On recent Ubuntu (17.04) `libxml2-dev` `libgnutls28-dev` `libxslt1-dev` +`libgcrypt20-dev` are to compile GNUstep base diff --git a/install.sh b/install.sh index 27cf4a7..9975ddb 100755 --- a/install.sh +++ b/install.sh @@ -3,47 +3,55 @@ set -e ## Variables -SUFFIX=$(uname)-$(arch) - SDKVER=4.1.5 -GNUSTEP_REV=37819 -GNUSTEP_BASE_GIT=3c4ff69d696e2b5d4afacf70352b5d483b18997b # close to svn-37819 -GNUSTEP_MAKE_GIT=0b7a76a45e9f6d7dc4d982c226fff111465d1272 # close to svn-37819 -LIBDISPATCH_REV=700a514955d6c86b29439c80f3bc0b69405b43f0 +GNUSTEP_MAKE_GIT=a964f87bdecab5156ed24f224548680aa2555676 # svn-39575, probably close to what hopper was built with +GNUSTEP_BASE_GIT=03952f1e961931828a3eba62784c02205e8c0a65 # svn-39569, hopper ships libgnustep-base 1.24.9 +LIBDISPATCH_REV=e63c3c130c5115b653beca04b7f245e20ba84a08 # hopper ships libdispatch 0.1.3.1 JOBS=$(nproc) -DEST=$(pwd)/gnustep-$SUFFIX +DEST="${HOME}/GNUstep/Library/ApplicationSupport/Hopper" +SDKDIR="${DEST}/HopperSDK-${SDKVER}" +GS_DIR="${DEST}/gnustep-$(arch)" LAYOUT=fhs CC=clang CXX=clang++ ## Cleanup +mkdir -p "${DEST}" echo "Cleaning" -rm -rf "$DEST" -rm -rf sources HopperSDK -mkdir sources HopperSDK +rm -rf sources # comment this out to not remove downloaded sources (saves dowloads) while developing this script +rm -rf "${DEST}/HopperSDK" "${SDKDIR}" "${GS_DIR}" +mkdir -p "${SDKDIR}" "${GS_DIR}" sources ## Download latest Hopper SDK echo "Downloading sources" echo " Hopper SDK" -SDKZIP="sources/HopperSDK-${SDKVER}.zip" -curl -A SDK -L --progress-bar -o $SDKZIP "https://d2ap6ypl1xbe4k.cloudfront.net/HopperSDK-${SDKVER}.zip" -unzip -d HopperSDK $SDKZIP >/dev/null 2>&1 +SDK_ZIP="HopperSDK-${SDKVER}.zip" +test -f sources/$SDK_ZIP || curl -A SDK -L --progress-bar -o sources/$SDK_ZIP "https://d2ap6ypl1xbe4k.cloudfront.net/${SDK_ZIP}" +unzip -qq -d "${SDKDIR}" sources/$SDK_ZIP >/dev/null 2>&1 +ln -s "${SDKDIR}" "${DEST}/HopperSDK" ## Download sources cd sources echo " libobjc2..." -git clone -q https://github.com/gnustep/libobjc2 gnustep-libobjc2 +D=gnustep-libobjc2 +test -d $D || git clone -q https://github.com/gnustep/libobjc2 $D + echo " gnustep-make..." -git clone -q https://github.com/gnustep/make gnustep-make -git -C gnustep-make checkout -q $GNUSTEP_MAKE_GIT +D=gnustep-make +test -d $D || git clone -q https://github.com/gnustep/make $D +git -C $D checkout -qf $GNUSTEP_MAKE_GIT + echo " gnustep-base..." -git clone -q https://github.com/gnustep/base gnustep-base -git -C gnustep-base checkout -q $GNUSTEP_BASE_GIT +D=gnustep-base +test -d $D || git clone -q https://github.com/gnustep/base $D +git -C $D checkout -qf $GNUSTEP_BASE_GIT + echo " libdispatch..." -git clone -q https://github.com/nickhutchinson/libdispatch.git -git -C libdispatch checkout -q $LIBDISPATCH_REV +D=libdispatch +test -d $D || git clone -q https://github.com/nickhutchinson/libdispatch $D +git -C $D checkout -qf $LIBDISPATCH_REV ## Compilation echo "Compilation" @@ -51,38 +59,36 @@ SRC=$(pwd) ## Compile gnustep-make echo " gnustep-make..." cd gnustep-make -./configure CC=$CC CXX=$CXX --with-layout=$LAYOUT --prefix="$DEST" +./configure CC=$CC CXX=$CXX --with-layout=$LAYOUT --prefix="${GS_DIR}" make make install -cd "$DEST/bin" -ln -s "../share/GNUstep/Makefiles/GNUstep.sh" cd $SRC -. "$DEST/share/GNUstep/Makefiles/GNUstep.sh" +. "${GS_DIR}/share/GNUstep/Makefiles/GNUstep.sh" ## Compile the Objective-C 2 runtime echo " libobjc2..." cd gnustep-libobjc2 rm -rf build ; mkdir build ; cd build -cmake .. -DCMAKE_INSTALL_PREFIX="$DEST" -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX +cmake .. -DCMAKE_INSTALL_PREFIX="${GS_DIR}" -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX make -j$JOBS make install cd $SRC cd gnustep-make -./configure CC=$CC CXX=$CXX --enable-objc-nonfragile-abi --with-layout=$LAYOUT --prefix="$DEST" +./configure CC=$CC CXX=$CXX --enable-objc-nonfragile-abi --with-layout=$LAYOUT --prefix="${GS_DIR}" make make install cd $SRC -. "$DEST/share/GNUstep/Makefiles/GNUstep.sh" +. "${GS_DIR}/share/GNUstep/Makefiles/GNUstep.sh" ## Compile GNUstep base # On recent Ubuntu (17.04...) you may need to do 'sudo apt install libxml2-dev libgnutls28-dev libxslt1-dev libgcrypt20-dev' echo " gnustep-base..." cd gnustep-base patch -p0 <../../patches/gnustep-base.patch -./configure CC=$CC CXX=$CXX --prefix="$DEST" +./configure CC=$CC CXX=$CXX --prefix="${GS_DIR}" make -j$JOBS 2>/dev/null make install cd $SRC @@ -94,7 +100,7 @@ patch -p1 <../../patches/libdispatch.patch sed -i"" "s/add_subdirectory(testing)/#add_subdirectory(testing)/" CMakeLists.txt mkdir build cd build -cmake .. -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_INSTALL_PREFIX="$DEST" -DCMAKE_BUILD_TYPE=Release +cmake .. -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX -DCMAKE_INSTALL_PREFIX="${GS_DIR}" -DCMAKE_BUILD_TYPE=Release make make install cd $SRC @@ -147,4 +153,5 @@ _EOF clang test.m -o test $(gnustep-config --objc-flags) $(gnustep-config --base-libs) -fobjc-arc -fobjc-nonfragile-abi -O0 -g -ldispatch ./test echo "GNUstep for Hopper SDK ready." -echo "source '$DEST/bin/GNUstep.sh' to use it" +echo "source '${HOME}/hopper-gnustep.sh' to use it" +ln -fs "${GS_DIR}/share/GNUstep/Makefiles/GNUstep.sh" "${HOME}/hopper-gnustep.sh" diff --git a/patches/gnustep-base.patch b/patches/gnustep-base.patch index fe6be87..12eb012 100644 --- a/patches/gnustep-base.patch +++ b/patches/gnustep-base.patch @@ -17,19 +17,3 @@ Index: Source/NSArray.m return (NSOrderedSame == CALL_BLOCK(comparator, key, [self objectAtIndex: index]) ? index : NSNotFound); } -@@ -2025,7 +2033,14 @@ - - - (void) setObject: (id)anObject atIndexedSubscript: (size_t)anIndex - { -- [self replaceObjectAtIndex: (NSUInteger)anIndex withObject: anObject]; -+ if (anIndex == [self count]) { -+ // From Apple documentation of -[NSMutableArray setObject:atIndexedSubscript:] -+ // "If the index is equal to count the element is added to the end of the array, growing the array." -+ [self addObject:anObject]; -+ } -+ else { -+ [self replaceObjectAtIndex: (NSUInteger)anIndex withObject: anObject]; -+ } - } - - /** Replaces the values in the receiver at the locations given by the