This PR does two things:

1. I moved `package.json` into the root directory. Why? We are using `npx` from the `Makefile` which is executing usually under the root directory. If we install `node_modules` in `src/js` then these invocations don't see `node_modules` and install an extra copy of the packages. So we want `node_modules` in the root directory. node wants to put `node_modules` in the same directory as `package.json` hence I moved `package.json`. I also updated the build rules so that any recipe that uses `npx` has a dependency on `node_modules/.installed`.
2. We invoke `file_packager.py` from both the Makefile (in two places) and from `build_pkg`. There has been some drift in which options are applied in the two places. I extracted the common options and the task of locating the `file_packager.py` script into `tools/file_packager.sh`. I also shortened the make rules for `distutils.data` and `test.data` and made some minor updates to the dev docs about `file_packager.py`.
MAINT Improvements to node and file_packager invocations. This PR does two things:

1. I moved `package.json` into the root directory. Why? We are using `npx` from the `Makefile` which is executing usually under the root directory. If we install `node_modules` in `src/js` then these invocations don't see `node_modules` and install an extra copy of the packages. So we want `node_modules` in the root directory. node wants to put `node_modules` in the same directory as `package.json` hence I moved `package.json`. I also updated the build rules so that any recipe that uses `npx` has a dependency on `node_modules/.installed`.
2. We invoke `file_packager.py` from both the Makefile (in two places) and from `build_pkg`. There has been some drift in which options are applied in the two places. I extracted the common options and the task of locating the `file_packager.py` script into `tools/file_packager.sh`. I also shortened the make rules for `distutils.data` and `test.data` and made some minor updates to the dev docs about `file_packager.py`.
#!/usr/bin/env bash

failure_exit() {
  echo >&2 "Could not find ${1}.  Please install that before continuing."
  exit 1
}

check_python_version() {
  if ! command -v python3.8 &> /dev/null; then
    echo >&2 "Must compile with python 3.8."
    exit 1
  fi
}
check_python_headers() {
  local python_headers_present
  python_headers_present="$(pkg-config --libs python-3.8)"

  if [ ! "${python_headers_present}" ]; then
    failure_exit "Python 3.8 headers"
  fi
}

check_binary_present() {
  local binary_exists
  binary_exists="$(command -v "${1}")"
  if [ ! "${binary_exists}" ]; then
    failure_exit "${1}"
  fi
}

check_pkgconfig() {
  check_binary_present "pkg-config"
}

check_fortran_dependencies() {
  check_binary_present "gfortran"
  check_binary_present "f2c"
}

check_pyyaml() {
  local pyyaml_import_check
  pyyaml_import_check="$(python3 -c 'import yaml' 2>&1)"
  if [ "${pyyaml_import_check}" ]; then
    failure_exit "PyYAML"
  fi
}

check_python_version
check_pkgconfig
#check_python_headers
check_fortran_dependencies
check_pyyaml

#!/usr/bin/env bash

failure_exit() {
  echo >&2 "Could not find ${1}.  Please install that before continuing."
  exit 1
}

check_python_version() {
  if ! command -v python3.8 &> /dev/null; then
    echo >&2 "Must compile with python 3.8."
    exit 1
  fi
}
check_python_headers() {
  local python_headers_present
  python_headers_present="$(pkg-config --libs python-3.8)"

  if [ ! "${python_headers_present}" ]; then
    failure_exit "Python 3.8 headers"
  fi
}

check_binary_present() {
  local binary_exists
  binary_exists="$(command -v "${1}")"
  if [ ! "${binary_exists}" ]; then
    failure_exit "${1}"
  fi
}

check_pkgconfig() {
  check_binary_present "pkg-config"
}

check_fortran_dependencies() {
  check_binary_present "gfortran"
  check_binary_present "f2c"
}

check_pyyaml() {
  local pyyaml_import_check
  pyyaml_import_check="$(python3 -c 'import yaml' 2>&1)"
  if [ "${pyyaml_import_check}" ]; then
    failure_exit "PyYAML"
  fi
}

check_python_version
check_pkgconfig
#check_python_headers
check_fortran_dependencies
check_pyyaml
