123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #!/usr/bin/env bash
- #
- # You may redistribute this program and/or modify it under the terms of
- # the GNU General Public License as published by the Free Software Foundation,
- # either version 3 of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
- #
- [[ -n "$PLATFORM" ]] \
- || PLATFORM=$(uname | tr '[:upper:]' '[:lower:]')
- [[ -n "$MARCH" ]] \
- || MARCH=$(uname -m | sed 's/i./x/g')
- build_dir="build_$PLATFORM"
- node_min_ver='v0.8.15'
- node_dl_ver='v0.10.24'
- read -d '' version_test <<"EOF"
- var currentVersion = process.version;
- var verArray = currentVersion.substring(1).split(".");
- var minVerArray = process.argv[process.argv.length-1].substring(1).split(".");
- for (var i = 0; i < minVerArray.length; i++) {
- if (Number(verArray[i]) < Number(minVerArray[i])) {
- process.exit(1);
- } else if (Number(verArray[i]) > Number(minVerArray[i])) {
- process.exit(0);
- }
- }
- EOF
- # return true if the input command exists in $PATH
- function cmd_exists() {
- type -P "$1" >/dev/null
- }
- # output an error and exit with a failed status
- function die() {
- printf '%s\n' "ERROR: $1" >&2
- exit 1
- }
- # detect and configure a copy of node.js to use with at least the minimum version
- function check_node_tool() {
- for node_tool in "$build_dir/nodejs/node/bin/node" 'nodejs' 'node'; do
- cmd_exists "$node_tool"
- if [ $? = 0 -o -f "$node_tool" ]; then
- "$node_tool" '' "$node_min_ver" <<< "$version_test" && {
- node_cmd="$node_tool"
- return 0
- }
- printf '%s\n' "You have a version of node [$node_tool] but it is too old [$($node_tool -v)]"
- fi
- done
- return 1
- }
- # detect and configure a sha256sum implementation to use that produces the expected sum for an empty string
- function get_shasum_tool() {
- expected_sum='01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b'
- for shasum_tool in 'sha256sum' 'gsha256sum' 'sha256' 'shasum -a 256' 'openssl sha256'; do
- if cmd_exists "${shasum_tool/ *}"; then
- [[ $($shasum_tool <<< '') =~ "$expected_sum" ]] && {
- shasum_cmd="$shasum_tool"
- return 0
- }
- fi
- done
- return 1
- }
- # download and configure a copy of node.js to use based on the current system
- function get_node_tool() {
- printf '%s %s\n\n' '###' "Installing node.js (you can bypass this step by manually installing node.js $node_min_ver or newer)"
- case "$PLATFORM-$MARCH" in
- linux-x86_64)
- node_download="http://nodejs.org/dist/$node_dl_ver/node-$node_dl_ver-linux-x64.tar.gz"
- node_sha='6ef93f4a5b53cdd4471786dfc488ba9977cb3944285ed233f70c508b50f0cb5f'
- ;;
- linux-x86)
- node_download="http://nodejs.org/dist/$node_dl_ver/node-$node_dl_ver-linux-x86.tar.gz"
- node_sha='fb6487e72d953451d55e28319c446151c1812ed21919168b82ab1664088ecf46'
- ;;
- linux-armv6l|linux-armv7l)
- # Raspberry Pi or Cubieboard
- node_download="http://nodejs.org/dist/$node_dl_ver/node-$node_dl_ver-linux-arm-pi.tar.gz"
- node_sha='bdd5e253132c363492fa24ed9985873733a10558240fd45b0a4a15989ab8da90'
- ;;
- darwin-x86_64)
- node_download="http://nodejs.org/dist/$node_dl_ver/node-$node_dl_ver-darwin-x64.tar.gz"
- node_sha='c1c523014124a0327d71ba5d6f737a4c866a170f1749f8895482c5fa8be877b0'
- ;;
- darwin-x86)
- node_download="http://nodejs.org/dist/$node_dl_ver/node-$node_dl_ver-darwin-x86.tar.gz"
- node_sha='8b8d2bf9828804c3f8027d7d442713318814a36df12dea97dceda8f4aff42b3c'
- ;;
- sunos-x86_64)
- node_download="http://nodejs.org/dist/$node_dl_ver/node-$node_dl_ver-sunos-x64.tar.gz"
- node_sha='7cb714df92055b93a908b3b6587ca388a2884b1a9b5247c708a867516994a373'
- ;;
- sunos-x86)
- node_download="http://nodejs.org/dist/$node_dl_ver/node-$node_dl_ver-sunos-x86.tar.gz"
- node_sha='af69ab26aae42b05841c098f5d11d17e21d22d980cd32666e2db45a53ddffe34'
- ;;
- *)
- printf '%s\n%s\n' \
- "No nodejs executable available for $PLATFORM-$MARCH" \
- "Please install nodejs (>= $node_min_ver) from your distribution package repository or from source"
- return 1
- ;;
- esac
- [[ -d "$build_dir/nodejs" ]] \
- && rm -r "$build_dir/nodejs"
- install -d "$build_dir/nodejs"
- pushd "$build_dir/nodejs" >/dev/null
- node_dl="node-${node_dl_ver}.tar.gz"
- if cmd_exists wget; then
- printf '\n%s %s ' '==>' "Downloading $node_download with wget..."
- wget -q "$node_download" -O "$node_dl"
- elif cmd_exists curl; then
- printf '%s %s ' '==>' "Downloading $node_download with curl..."
- curl -s "$node_download" > "$node_dl"
- elif cmd_exists fetch; then
- printf '%s %s ' '==>' "Downloading $node_download with fetch..."
- fetch "$node_download" -o "$node_dl"
- else
- die 'wget, curl or fetch is required download node.js but you have none!'
- fi
- [[ -f "$node_dl" ]] \
- || die 'Failed to download node.js'
- printf '%s\n' 'DONE!'
- printf '%s %s ' '==>' "Verifying the checksum of the downloaded archive..."
- [[ $($shasum_cmd "$node_dl") =~ $node_sha ]] \
- || die 'The downloaded file is damaged! Aborting'
- printf '%s\n' 'DONE!'
- printf '%s %s ' '==>' "Extracting the downloaded archive..."
- install -d node
- tar xzf "$node_dl" -C node --strip-components=1
- [[ -d 'node' ]] \
- || die 'An error prevented the archive from being extracted'
- printf '%s\n\n' 'DONE!'
- popd >/dev/null
- # Return with the success status of the check_node_tool function
- check_node_tool
- }
- cd "$(dirname $0)" \
- || die 'failed to set directory'
- [[ -d "$build_dir" ]] \
- || install -d "$build_dir" \
- || die "failed to create build dir $build_dir"
- get_shasum_tool \
- || die "couldn't find working sha256 shasum_tool";
- check_node_tool \
- || get_node_tool \
- || die "couldn't get working node.js implementation";
- "$node_cmd" ./node_build/make.js "$@"
|