Compare commits
1 Commits
0ce6c93faa
...
15a7112828
Author | SHA1 | Date | |
---|---|---|---|
15a7112828 |
14
build/build-dir.zsh
Executable file
14
build/build-dir.zsh
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
# TODO: Find inspiration from zsh-select's use of the zcurses module.
|
||||||
|
# https://github.com/psprint/zsh-select/blob/master/zsh-select
|
||||||
|
|
||||||
|
build-dir() {
|
||||||
|
zmodload zsh/curses && {
|
||||||
|
zcurses init
|
||||||
|
} always {
|
||||||
|
zcurses end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
build-dir
|
@ -17,140 +17,46 @@ elif [ `uname` = Darwin ]; then
|
|||||||
alias debug='lldb --'
|
alias debug='lldb --'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Store the path to `build-dir.py`, using `${0:a:h}` does not work in a
|
||||||
|
# function because it will result in `pwd` not this scripts directory.
|
||||||
|
_build_dir_py=${0:a:h}/build-dir.py
|
||||||
|
|
||||||
# Interactively choose a `~build` directory for `build` to build.
|
# Interactively choose a `~build` directory for `build` to build.
|
||||||
|
# TODO: Support arguments:
|
||||||
|
# * [ ] [-h,--help] - show this help message and exit
|
||||||
|
# * [x] [--build] - execute the build commend
|
||||||
|
# * [ ] <dir> - start in another directory, not `pwd`
|
||||||
build-dir() {
|
build-dir() {
|
||||||
local usage='usage: build-dir [-h] [--build] [<directory>]'
|
# Get a unique filename to store the chosen build directory in.
|
||||||
local -a help do_build
|
[ `uname` = Darwin ] && local file=`mktemp` || local file=`tempfile`
|
||||||
zparseopts -D h=help -help=help -build=do_build
|
# Prompt user to choose a build directory.
|
||||||
if [[ -n $help ]]; then
|
python $_build_dir_py $file;
|
||||||
cat << EOF
|
local error=$?
|
||||||
$usage
|
# If the file exists, read the build directory from it, then delete it.
|
||||||
|
[ -f $file ] && local build_dir=$PWD/`cat $file`; rm $file
|
||||||
Find and select the current build directory interactively.
|
# If choosing a build directory failed, return that error.
|
||||||
|
[[ "$error" = "0" ]] || return $error
|
||||||
positional arguments:
|
# If `build.ninja` exists in alias `ninja`, return.
|
||||||
<directory> the build directory to select
|
[ -f $build_dir/build.ninja ] && \
|
||||||
|
local build="ninja -C $build_dir"
|
||||||
optional arguments:
|
# If `Makefile` exists in alias `make`, return.
|
||||||
-h, --help show this help message and exit
|
if [ -f $build_dir/Makefile ]; then
|
||||||
--build invoke a build after selection
|
[ `uname` = Darwin ] && \
|
||||||
EOF
|
local cpu_count=`sysctl -n hw.ncpu` ||
|
||||||
exit
|
local cpu_count=`grep -c '^processor' /proc/cpuinfo`
|
||||||
|
local build="make -j $cpu_count -C $build_dir"
|
||||||
fi
|
fi
|
||||||
error() { echo "\e[31merror:\e[0m $1"; exit 1 }
|
# If the build variable is not defined the command could not be determined.
|
||||||
local build_dir
|
if [ -z $build ]; then
|
||||||
if [[ ${#*} -gt 1 ]]; then
|
# TODO: Prompt user to choose a build command?
|
||||||
echo $usage
|
echo "could not determine build command"
|
||||||
error "unexpected position arguments: ${*[2,${#*}]}"
|
return 1
|
||||||
elif [[ ${#*} -eq 1 ]]; then
|
|
||||||
build_dir=${*[1]}
|
|
||||||
[[ ! -d $build_dir ]] && \
|
|
||||||
error "directory not found: $build_dir"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If <directory> was not set begin selection
|
|
||||||
if [[ -z $build_dir ]]; then
|
|
||||||
# Find build directories
|
|
||||||
local -a build_dirs
|
|
||||||
for entry in `ls -A`; do
|
|
||||||
[ -d $entry ] && [[ $entry =~ build* ]] && \
|
|
||||||
build_dirs+=$entry
|
|
||||||
done
|
|
||||||
|
|
||||||
# Interactively select a build directory if more than 1 found
|
|
||||||
integer index=0
|
|
||||||
if [[ ${#build_dirs} -eq 0 ]]; then
|
|
||||||
error "no build directories found"
|
|
||||||
elif [[ ${#build_dirs} -gt 1 ]]; then
|
|
||||||
zmodload zsh/curses && {
|
|
||||||
# Get the size of the terminal
|
|
||||||
local size=`stty size`
|
|
||||||
integer height=${size% *}
|
|
||||||
integer width=${size#* }
|
|
||||||
|
|
||||||
# Create the window and hide the cursor
|
|
||||||
zcurses init
|
|
||||||
zcurses addwin build-dir $height $width 0 0
|
|
||||||
|
|
||||||
# Hide the cursor for zcurses, trap SIGINT to ensure cleanup in
|
|
||||||
# always-list occurs below
|
|
||||||
tput civis; trap 'exit 130' INT
|
|
||||||
|
|
||||||
# Enter display loop
|
|
||||||
local key keypad
|
|
||||||
while (( 1 )); do
|
|
||||||
zcurses clear build-dir
|
|
||||||
|
|
||||||
# Add the prompt text
|
|
||||||
zcurses move build-dir 1 1
|
|
||||||
zcurses string build-dir 'Select a build directory:'
|
|
||||||
|
|
||||||
# Add the selections text
|
|
||||||
for (( i = 0; i < ${#build_dirs}; i++ )); do
|
|
||||||
integer line=$i+3
|
|
||||||
zcurses move build-dir $line 1
|
|
||||||
[[ $index -eq $i ]] &&
|
|
||||||
zcurses string build-dir "* " ||
|
|
||||||
zcurses string build-dir " "
|
|
||||||
zcurses string build-dir ${build_dirs[$i+1]}
|
|
||||||
done
|
|
||||||
|
|
||||||
# Display the text the and wait for input
|
|
||||||
zcurses refresh build-dir
|
|
||||||
zcurses input build-dir key keypad
|
|
||||||
|
|
||||||
# Handle user input
|
|
||||||
case $key in
|
|
||||||
(UP|k|$'\C-P')
|
|
||||||
[[ $index -gt 0 ]] && index=$index-1 ;;
|
|
||||||
(DOWN|j|$'\C-N')
|
|
||||||
[[ $index -lt ${#build_dirs}-1 ]] && index=$index+1 ;;
|
|
||||||
(ENTER|$'\n')
|
|
||||||
break ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
} always {
|
|
||||||
# Restore the cursor and cleanup zcurses
|
|
||||||
tput cvvis; tput cnorm
|
|
||||||
zcurses delwin build-dir
|
|
||||||
zcurses end
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# On success setup the build directory for use
|
|
||||||
if [[ $? -eq 0 ]]; then
|
|
||||||
# Set the build directory from selection if empty
|
|
||||||
[[ -z $build_dir ]] && \
|
|
||||||
build_dir=${build_dirs[$index+1]}
|
|
||||||
|
|
||||||
# If `build.ninja` exists in alias `ninja`, return.
|
|
||||||
local build
|
|
||||||
[ -f $build_dir/build.ninja ] && \
|
|
||||||
build="ninja -C $build_dir"
|
|
||||||
|
|
||||||
# If `Makefile` exists in alias `make`, return.
|
|
||||||
if [ -f $build_dir/Makefile ]; then
|
|
||||||
[ `uname` = Darwin ] && \
|
|
||||||
local cpu_count=`sysctl -n hw.ncpu` ||
|
|
||||||
local cpu_count=`grep -c '^processor' /proc/cpuinfo`
|
|
||||||
build="make -j $cpu_count -C $build_dir"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If the build variable is not defined the command could not be determined
|
|
||||||
if [ -n $build ]; then
|
|
||||||
echo "\e[33mwarning:\e[0m build command detection failed: $build_dir"
|
|
||||||
# Prompt user to enter a build command
|
|
||||||
vared -p 'enter comand: ' build
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Redefine the `build` alias and update the `~build` hash directory
|
|
||||||
alias build="$build"
|
|
||||||
hash -d build=$build_dir
|
|
||||||
|
|
||||||
# If `--build` is specified then evaluate the command.
|
|
||||||
[[ -n $do_build ]] && eval build
|
|
||||||
fi
|
fi
|
||||||
|
# Redefine the `build` alias and update the `~build` hash directory.
|
||||||
|
alias build="$build"
|
||||||
|
hash -d build=$build_dir
|
||||||
|
# If `--build` is specified then evaluate the command.
|
||||||
|
[[ "$1" = "--build" ]] && eval $build || true
|
||||||
}
|
}
|
||||||
|
|
||||||
# Build then run a target residing in `~build/bin`.
|
# Build then run a target residing in `~build/bin`.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user