#!/bin/bash # Copyright 2022, 2024 Patrick J. Volkerding, Sebeka, Minnesota, USA # All rights reserved. # # Thanks to Audrius Kažukauskas, Ryan P.C. McQuen, and Willy Sudiarto Raharjo # for the slackbuilds.org version of this script. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version, with the following exception: # the text of the GPL license may be omitted. # # You may have received a copy of the GNU General Public License # along with this program (most likely, a file named COPYING). If # not, see . cd $(dirname $0) ; CWD=$(pwd) PKGNAM=nodejs SRCNAM=node VERSION=${VERSION:-$(echo $SRCNAM-*.tar.?z | rev | cut -f 3- -d . | cut -f 1 -d - | rev | tr -d v)} BUILD=${BUILD:-1} # Automatically determine the architecture we're building on: if [ -z "$ARCH" ]; then case "$(uname -m)" in i?86) ARCH=i586 ;; arm*) readelf /usr/bin/file -A | grep -E -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;; # Unless $ARCH is already set, use uname -m for all other archs: *) ARCH=$(uname -m) ;; esac export ARCH fi # If the variable PRINT_PACKAGE_NAME is set, then this script will report what # the name of the created package would be, and then exit. This information # could be useful to other scripts. if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then echo "$PKGNAM-$VERSION-$ARCH-$BUILD.txz" exit 0 fi NUMJOBS=${NUMJOBS:-" -j $(expr $(nproc) + 1) "} if [ "$ARCH" = "i686" ]; then SLKCFLAGS="-O2 -march=pentium4 -mtune=generic" LIBDIRSUFFIX="" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-O2 -march=x86-64 -mtune=generic -fPIC" LIBDIRSUFFIX="64" elif [ "$ARCH" = "i586" ]; then SLKCFLAGS="-O2 -march=i586 -mtune=i686" LIBDIRSUFFIX="" else SLKCFLAGS=${SLKCFLAGS:-"-O2"} LIBDIRSUFFIX=${LIBDIRSUFFIX:-""} fi TMP=${TMP:-/tmp} PKG=$TMP/package-$PKGNAM rm -rf $PKG mkdir -p $TMP $PKG cd $TMP rm -rf $SRCNAM-v${VERSION} echo "Extracting $CWD/$SRCNAM-v${VERSION}.tar.?z..." tar xf $CWD/$SRCNAM-v${VERSION}.tar.?z || exit 1 cd $SRCNAM-v${VERSION} || exit 1 chown -R root:root . find . \ \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ -exec chmod 755 {} \+ -o \ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ -exec chmod 644 {} \+ ## Fix libdir for 64-bit: sed -i "s|lib/|lib${LIBDIRSUFFIX}/|g" tools/install.py sed -i "s|'lib'|'lib${LIBDIRSUFFIX}'|g" lib/module.js sed -i "s|'lib'|'lib${LIBDIRSUFFIX}'|g" deps/npm/lib/npm.js ## Fix various non-x86 architectures: for p in $CWD/patches/*.diff.gz do zcat $p | patch --verbose -p1 || exit 1 done # Not sure if this one is really needed. #sed -i "s|math.h|cmath|" src/node_crypto.cc ./configure \ --prefix=/usr \ --with-intl=system-icu \ --shared-openssl \ --shared-zlib \ --shared-libuv \ --experimental-http-parser \ --shared-nghttp2 \ --shared-nghttp3 \ --shared-cares \ --shared-brotli || exit 1 # --shared-v8 # --shared-http-parser export CFLAGS="$SLKCFLAGS" export CXXFLAGS="$SLKCFLAGS" export LDFLAGS="-Wl,--copy-dt-needed-entries" make $NUMJOBS || make || exit 1 make install DESTDIR=$PKG || exit 1 # Strip binaries: find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null # Relocate manual pages: if [ -d $PKG/usr/share/man ]; then mv $PKG/usr/share/man $PKG/usr fi # Compress manual pages: find $PKG/usr/man -type f -exec gzip -9 {} \+ for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz rm $i done # Remove unneeded files: find $PKG/usr \( -name '.git*' \) -exec rm -f {} \; # Set NODE_PATH to look for globally installed modules: mkdir -p $PKG/etc/profile.d cat > $PKG/etc/profile.d/${PKGNAM}.csh << EOF #!/bin/csh setenv NODE_PATH /usr/lib${LIBDIRSUFFIX}/node_modules EOF cat > $PKG/etc/profile.d/${PKGNAM}.sh << EOF #!/bin/sh export NODE_PATH=/usr/lib${LIBDIRSUFFIX}/node_modules EOF chmod 0755 $PKG/etc/profile.d/* # Symlink bash-completion if needed: mkdir -p $PKG/usr/share/bash-completion/completions if [ ! -r $PKG/usr/share/bash-completion/completions/npm -a -r $PKG/usr/lib${LIBDIRSUFFIX}/node_modules/npm/lib/utils/completion.sh ]; then ( cd $PKG/usr/share/bash-completion/completions/npm ; ln -sf ../../../lib${LIBDIRSUFFIX}/node_modules/npm/lib/utils/completion.sh npm ) fi # Add a documentation directory: mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION cp -a \ AUTHORS* BUILDING* CHANGELOG* CODE_OF_CONDUCT* CONTRIBUTING* GOVERNANCE* LICENSE* README* SECURITY* \ $PKG/usr/doc/${PKGNAM}-$VERSION # If there's a CHANGELOG, installing at least part of the recent history # is useful, but don't let it get totally out of control: if [ -r CHANGELOG ]; then DOCSDIR=$(echo $PKG/usr/doc/${PKGNAM}-$VERSION) cat CHANGELOG | head -n 1000 > $DOCSDIR/CHANGELOG touch -r CHANGELOG $DOCSDIR/CHANGELOG fi mkdir -p $PKG/install cat $CWD/slack-desc > $PKG/install/slack-desc cd $PKG /sbin/makepkg -l y -c n $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz