Skip to content

Commit

Permalink
Use GNU realpath if realpath -e does not work
Browse files Browse the repository at this point in the history
If realpath -e oes not work, the `realpath` binary is probably BSD
realpath.
  • Loading branch information
zrhoffman committed May 30, 2024
1 parent a30432f commit 4178b59
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 25 deletions.
38 changes: 27 additions & 11 deletions build/functions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,34 @@

# macOS's version of realpath does not resolve symlinks, so we add a function
# for it.
if ! realpath -e . >/dev/null 2>&1; then
# by default, macOS does not have realpath
realpath() {
local path="$1"
shift
ls "$(
cd "$(dirname "$path")"
pwd -P # -P resolves symlinks
)/$(basename "$path")"
}
get_realpath() {
local bin
local found=''
for bin in $(type -ap ssh | sort | uniq); do
if "$bin" -e . >/dev/null 2>&1; then
found=y
break
fi
done
if [[ -n "$found" ]]; then
realpath_path="$bin"
# by default, macOS does not have realpath
realpath() {
"$realpath_path" "$@"
}
export -f realpath
fi;
else
cat <<'MESSAGE'
GNU realpath is required to build Apache Traffic Control if your
realpath binary does not support the -e flag, as is the case on BSD-like
operating systems like macOS. Install it by running the following
command:
brew install coreutils
MESSAGE
exit 1
fi
}
get_realpath

if { ! stat -c%u . >/dev/null && stat -f%u .; } >/dev/null 2>&1; then
#BSD stat uses -f as its formatting flag instead of -c
Expand Down
4 changes: 2 additions & 2 deletions docs/source/development/building.rst
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,8 @@ Install the Dependencies
+---------------------------------+---------------------+----------------------------+------------------------+---------------------------+---------------------------+--------------------------+----------+------------------------------+--------------------------+
| OS/Package Manager | Common dependencies | :ref:`dev-traffic-monitor` | :ref:`dev-traffic-ops` | :ref:`dev-traffic-portal` | :ref:`dev-traffic-router` | :ref:`dev-traffic-stats` | Grove | Grove TC Config (grovetccfg) | :ref:`Docs <docs-guide>` |
+=================================+=====================+============================+========================+===========================+===========================+==========================+==========+==============================+==========================+
| macOS\ [#mac-jdk]_ | - rpm | - go | - go | - npm | - maven | - go | - go | - go | - python3 |
| (homebrew_) | | | | - grunt-cli | | | | | |
| macOS\ [#mac-jdk]_ | - coreutils | - go | - go | - npm | - maven | - go | - go | - go | - python3 |
| (homebrew_) | - rpm | | | - grunt-cli | | | | | |
+---------------------------------+---------------------+----------------------------+------------------------+---------------------------+---------------------------+--------------------------+----------+------------------------------+--------------------------+
| Rocky\ Linux\ [#rocky-go]_, | - git | | | - epel-release | - java-11-openjdk | | | | - python3-devel |
| Red Hat, | - rpm-build | | | - npm | - maven | | | | - gcc |
Expand Down
40 changes: 28 additions & 12 deletions pkg
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,34 @@

# macOS's version of realpath does not resolve symlinks, so we add a function
# for it.
if ! realpath -e . >/dev/null 2>&1; then
# by default, macOS does not have realpath
realpath() {
local path="$1"
shift
ls "$(
cd "$(dirname "$path")"
pwd -P # -P resolves symlinks
)/$(basename "$path")"
}
get_realpath() {
local bin
local found=''
for bin in $(type -ap ssh | sort | uniq); do
if "$bin" -e . >/dev/null 2>&1; then
found=y
break
fi
done
if [[ -n "$found" ]]; then
realpath_path="$bin"
# by default, macOS does not have realpath
realpath() {
"$realpath_path" "$@"
}
export -f realpath
fi;
else
cat <<'MESSAGE'
GNU realpath is required to build Apache Traffic Control if your
realpath binary does not support the -e flag, as is the case on BSD-like
operating systems like macOS. Install it by running the following
command:
brew install coreutils
MESSAGE
exit 1
fi
}
get_realpath

# Files are relative to this script directory.
SELF="${BASH_SOURCE[0]}"
Expand Down Expand Up @@ -262,7 +278,7 @@ while (( "$#" )); do
# where <service> is the name of the specific service to be chained. The file may be a symlink to another
# compose file, in which case the symlink will be followed before it is processed.
if [ -e "$COMPOSE_FILE.$1" ] ; then
$SELF -f $(realpath "$COMPOSE_FILE.$1") $([ "$verbose" == 0 ] || echo "-v") $([ "$quiet" == 0 ] || echo "-q") $([ "$debug" == 0 ] || echo "-d") $([ "$build" == 0 ] || echo "-b") $("${COMPOSECMD[@]}" -f $(realpath "$COMPOSE_FILE.$1") config --services)
$SELF -f $(realpath -e "$COMPOSE_FILE.$1") $([ "$verbose" == 0 ] || echo "-v") $([ "$quiet" == 0 ] || echo "-q") $([ "$debug" == 0 ] || echo "-d") $([ "$build" == 0 ] || echo "-b") $("${COMPOSECMD[@]}" -f $(realpath -e "$COMPOSE_FILE.$1") config --services)
chained_exit=$?
[ $chained_exit == 0 ] || exit $chained_exit
fi
Expand Down

0 comments on commit 4178b59

Please sign in to comment.