diff --git a/bin/node-build b/bin/node-build index 7d2b9f009..e9c141fe8 100755 --- a/bin/node-build +++ b/bin/node-build @@ -605,37 +605,27 @@ fetch_git() { echo "Cloning ${git_url}..." >&2 - if type git &>/dev/null; then - if [ -n "$NODE_BUILD_CACHE_PATH" ]; then - # shellcheck disable=SC2164 - pushd "$NODE_BUILD_CACHE_PATH" >&4 - local clone_name - clone_name="$(sanitize "$git_url")" - if [ -e "$clone_name" ]; then - { # shellcheck disable=SC2164 - cd "$clone_name" - git fetch --force "$git_url" "+${git_ref}:${git_ref}" - } >&4 2>&1 - else - git clone --bare --branch "$git_ref" "$git_url" "${clone_name}" >&4 2>&1 - fi - git_url="$NODE_BUILD_CACHE_PATH/${clone_name}" - # shellcheck disable=SC2164 - popd >&4 - fi + if ! type git &>/dev/null; then + echo "error: please install \`git\` and try again" >&2 + exit 1 + fi - if [ -e "${package_name}" ]; then - ( # shellcheck disable=SC2164 - cd "${package_name}" - git fetch --depth 1 origin "+${git_ref}" - git checkout -q -B "$git_ref" "origin/${git_ref}" - ) >&4 2>&1 + if [ -n "$NODE_BUILD_CACHE_PATH" ]; then + local cache_dir + cache_dir="$NODE_BUILD_CACHE_PATH/$(sanitize "$git_url")" + if [ -e "$cache_dir" ]; then + git -C "$cache_dir" fetch --force "$git_url" "+${git_ref}:${git_ref}" >&4 2>&1 else - git clone --depth 1 --branch "$git_ref" "$git_url" "${package_name}" >&4 2>&1 + git clone --bare --branch "$git_ref" "$git_url" "$cache_dir" >&4 2>&1 fi + git_url="$cache_dir" + fi + + if [ -e "${package_name}" ]; then + git -C "$package_name" fetch --depth 1 origin "+${git_ref}" >&4 2>&1 + git -C "$package_name" checkout -q -B "$git_ref" "origin/${git_ref}" >&4 2>&1 else - echo "error: please install \`git\` and try again" >&2 - exit 1 + git clone --depth 1 --branch "$git_ref" "$git_url" "${package_name}" >&4 2>&1 fi } @@ -750,14 +740,9 @@ build_package_autoconf() { } >&4 2>&1 } -build_package_copy_to() { - to="$1" - mkdir -p "$to" - cp -fR . "$to" -} - build_package_copy() { - build_package_copy_to "$PREFIX_PATH" + mkdir -p "$PREFIX_PATH" + cp -fR . "$PREFIX_PATH" } build_package_jxcore_v8_328() { @@ -832,25 +817,13 @@ require_llvm() { : } -# Ensure that directories listed in LDFLAGS exist +# Kept for backward compatibility with 3rd-party definitions. build_package_ldflags_dirs() { - local ldflags - read -d '' -r -a ldflags <<<"$LDFLAGS" || true - local index=0 - local dir - while [ "$index" -lt "${#ldflags[@]}" ]; do - dir="" - case "${ldflags[index]}" in - -L ) dir="${ldflags[index+1]}" ;; - -L* ) dir="${ldflags[index]#-L}" ;; - esac - [ -z "$dir" ] || mkdir -p "$dir" - index=$((index+1)) - done + true } build_package_enable_shared() { - if [[ " ${NODE_CONFIGURE_OPTS} " != *" --disable-shared"* ]]; then + if [[ " ${NODE_CONFIGURE_OPTS} ${NODE_CONFIGURE_OPTS_ARRAY[*]}" != *" --disable-shared"* ]]; then package_option node configure --enable-shared fi } @@ -1122,9 +1095,6 @@ else fi fi -export LDFLAGS="-L${PREFIX_PATH}/lib ${LDFLAGS}" -export CPPFLAGS="-I${PREFIX_PATH}/include ${CPPFLAGS}" - unset NODEOPT unset NODELIB diff --git a/test/arguments.bats b/test/arguments.bats index c1d6053ad..003c810cc 100755 --- a/test/arguments.bats +++ b/test/arguments.bats @@ -3,23 +3,19 @@ load test_helper @test "not enough arguments for node-build" { + mkdir -p "$TMP" # use empty inline definition so nothing gets built anyway - local definition="${BATS_TMPDIR}/build-definition" - echo '' > "$definition" - - run node-build "$definition" - + touch "${TMP}/empty-definition" + run node-build "${TMP}/empty-definition" assert_failure assert_output --partial 'Usage: node-build' } @test "extra arguments for node-build" { + mkdir -p "$TMP" # use empty inline definition so nothing gets built anyway - local definition="${BATS_TMPDIR}/build-definition" - echo '' > "$definition" - - run node-build "$definition" "${BATS_TMPDIR}/install" "" - + touch "${TMP}/empty-definition" + run node-build "${TMP}/empty-definition" "${TMP}/install" "" assert_failure assert_output --partial 'Usage: node-build' } diff --git a/test/build.bats b/test/build.bats index a4787be2a..364699c38 100755 --- a/test/build.bats +++ b/test/build.bats @@ -21,36 +21,69 @@ executable() { } cached_tarball() { - mkdir -p "$NODE_BUILD_CACHE_PATH" - pushd "$NODE_BUILD_CACHE_PATH" >/dev/null - tarball "$@" - popd >/dev/null + local save_to_fixtures + case "$*" in + "node-v4.0.0 configure" ) + save_to_fixtures=1 + ;; + esac + + local tarball="${1}.tar.gz" + local fixture_tarball="${FIXTURE_ROOT}/${tarball}" + local cached_tarball="${NODE_BUILD_CACHE_PATH}/${tarball}" + shift 1 + + if [ -n "$save_to_fixtures" ] && [ -e "$fixture_tarball" ]; then + mkdir -p "$(dirname "$cached_tarball")" + cp "$fixture_tarball" "$cached_tarball" + return 0 + fi + + generate_tarball "$cached_tarball" "$@" + [ -z "$save_to_fixtures" ] || cp "$cached_tarball" "$fixture_tarball" } -tarball() { - local name="$1" - local path="$PWD/$name" - local configure="$path/configure" +generate_tarball() { + local tarfile="$1" shift 1 + local name path + name="$(basename "${tarfile%.tar.gz}")" + path="$(mktemp -d "$TMP/tarball.XXXXX")/${name}" - executable "$configure" < "${path}/${file}" <> build.log OUT - - for file; do - mkdir -p "$(dirname "${path}/${file}")" - touch "${path}/${file}" + chmod +x "${path}/${file}" + ;; + *:* ) + target="${file#*:}" + file="${file%:*}" + mkdir -p "$(dirname "${path}/${file}")" + cp "$target" "${path}/${file}" + ;; + * ) + mkdir -p "$(dirname "${path}/${file}")" + touch "${path}/${file}" + ;; + esac done - tar czf "${path}.tar.gz" -C "${path%/*}" "$name" + mkdir -p "$(dirname "$tarfile")" + tar czf "$tarfile" -C "${path%/*}" "$name" + rm -rf "$path" } stub_make_install() { stub "$MAKE" \ " : echo \"$MAKE \$(inspect_args \"\$@\")\" >> build.log" \ - "install : echo \"$MAKE \$(inspect_args \"\$@\")\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" + "install* : echo \"$MAKE \$(inspect_args \"\$@\")\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" } assert_build_log() { @@ -59,8 +92,10 @@ assert_build_log() { } @test "apply node patch before building" { - cached_tarball "node-v4.0.0" + cached_tarball "node-v4.0.0" configure + stub_repeated uname '-s : echo Linux' + stub_repeated brew false stub_make_install stub patch ' : echo patch "$@" | sed -E "s/\.[[:alnum:]]+$/.XXX/" >> build.log' @@ -83,7 +118,7 @@ OUT } @test "striplevel node patch before building" { - cached_tarball "node-v4.0.0" + cached_tarball "node-v4.0.0" configure stub_make_install stub patch ' : echo patch "$@" | sed -E "s/\.[[:alnum:]]+$/.XXX/" >> build.log' @@ -107,7 +142,7 @@ OUT } @test "apply node patch from git diff before building" { - cached_tarball "node-v4.0.0" + cached_tarball "node-v4.0.0" configure stub_make_install stub patch ' : echo patch "$@" | sed -E "s/\.[[:alnum:]]+$/.XXX/" >> build.log' @@ -132,7 +167,7 @@ OUT } @test "forward extra command-line arguments as configure flags" { - cached_tarball "node-v4.0.0" + cached_tarball "node-v4.0.0" configure stub_make_install @@ -141,20 +176,20 @@ install_package "node-v4.0.0" "http://nodejs.org/dist/v4.0.0/node-v4.0.0.tar.gz" DEF # TODO: use configure flags meaningful to node - NODE_CONFIGURE_OPTS='--with-readline-dir=/custom' run node-build "$BATS_TMPDIR/build-definition" "$INSTALL_ROOT" -- cppflags="-DYJIT_FORCE_ENABLE -DRUBY_PATCHLEVEL_NAME=test" --with-openssl-dir=/path/to/openssl + NODE_CONFIGURE_OPTS='--with-readline-dir=/custom' run node-build "$BATS_TMPDIR/build-definition" "$INSTALL_ROOT" -- cppflags="-DYJIT_FORCE_ENABLE -DNODE_PATCHLEVEL_NAME=test" --with-openssl-dir=/path/to/openssl assert_success unstub make assert_build_log <