summaryrefslogtreecommitdiff
path: root/xibuild.sh
diff options
context:
space:
mode:
Diffstat (limited to 'xibuild.sh')
-rw-r--r--xibuild.sh190
1 files changed, 190 insertions, 0 deletions
diff --git a/xibuild.sh b/xibuild.sh
new file mode 100644
index 0000000..a5aaa8c
--- /dev/null
+++ b/xibuild.sh
@@ -0,0 +1,190 @@
+#!/bin/sh
+
+[ -f /usr/lib/colors.sh ] && . /usr/lib/colors.sh
+[ -f /usr/lib/glyphs.sh ] && . /usr/lib/glyphs.sh
+
+textout=/dev/null
+src_dir="$(pwd)"
+out_dir="$(pwd)"
+
+xibuild_dir="/var/lib/xibuild"
+build_dir="$xibuild_dir/build"
+export_dir="$xibuild_dir/build/xipkg"
+
+logfile="$xibuild_dir/build.log"
+root="/"
+
+xibuild_profile="/usr/lib/xibuild/xi_profile.sh"
+
+usage () {
+ cat << EOF
+${LIGHT_RED}Usage: ${RED}xibuild [path/command]
+${BLUE}Avaiable Options:
+ ${BLUE}-r ${LIGHT_BLUE}[path]
+ ${LIGHT_CYAN}specify the chroot to use when building packages${LIGHT_WHITE}[default: /]
+ ${BLUE}-d ${LIGHT_BLUE}[path]
+ ${LIGHT_CYAN}specify the output directory to put xipkg files ${LIGHT_WHITE}[default: ./]
+ ${BLUE}-c ${LIGHT_BLUE}[path]
+ ${LIGHT_CYAN}specify the directory to find xibuild files${LIGHT_WHITE}[default: ./]
+ ${BLUE}-b ${LIGHT_BLUE}[path]
+ ${LIGHT_CYAN}specify the directory to build things in ${LIGHT_WHITE}[default: /var/lib/xibuild]
+ ${BLUE}-p ${LIGHT_BLUE}[file]
+ ${LIGHT_CYAN}specify a non-default xi_profile script, to run inside the chroot ${LIGHT_WHITE}[default: /usr/lib/xibuild/xi_profile.sh]
+
+ ${BLUE}-v
+ ${LIGHT_CYAN}verbose: print logs to stdout
+
+${BLUE}Available Commands:
+ ${LIGHT_GREEN}prepare
+ ${LIGHT_CYAN}prepare the build directory
+ ${LIGHT_GREEN}fetch
+ ${LIGHT_CYAN}fetch the sources required for the build
+ ${LIGHT_GREEN}build
+ ${LIGHT_CYAN}build the package, chroot if requested
+ ${LIGHT_GREEN}strip
+ ${LIGHT_CYAN}strip unecessary symbols from any binaries
+ ${LIGHT_GREEN}package
+ ${LIGHT_CYAN}package the build packages into .xipkg files
+ ${LIGHT_GREEN}describe
+ ${LIGHT_CYAN}create .xipkg.info files for each built package
+ ${LIGHT_GREEN}sign
+ ${LIGHT_CYAN}sign a package with a private key
+EOF
+}
+
+extract () {
+ FILE=$1
+ case "${FILE##*.}" in
+ "gz" )
+ tar -zxf $FILE
+ ;;
+ "lz" )
+ tar --lzip -xf "$FILE"
+ ;;
+ "zip" )
+ unzip -qq -o $FILE
+ ;;
+ * )
+ tar -xf $FILE
+ ;;
+ esac
+}
+
+xibuild_prepare () {
+ rm -rf $root/$build_dir
+ rm -rf $root/$export_dir
+ mkdir -p $root/$export_dir
+ install -Dm755 $xibuild_profile $root/$build_dir/xi_profile.sh
+
+}
+
+xibuild_fetch () {
+ cd $root/$build_dir
+ [ ! -z "$SOURCE" ] && {
+ git ls-remote -q $SOURCE $BRANCH >/dev/null 2>&1 && {
+ git clone $SOURCE . >/dev/null 2>&1
+ git checkout $BRANCH >/dev/null 2>&1
+ } || {
+ local downloaded=$(basename $SOURCE)
+ curl -SsL $SOURCE > $downloaded
+ extract $downloaded
+
+ [ "$(ls -1 | wc -l)" = "2" ] && {
+ for file in */* */.*; do
+ echo $file | grep -q '\.$' || mv $file .
+ done;
+ }
+ }
+ }
+
+ [ ! -z "$ADDITIONAL" ] && {
+ for url in "$ADDITIONAL"; do
+ case $url in
+ http*|ftp*)
+ curl -SsL $url> $root/$build_dir/$(basename $url);;
+ esac
+ done
+ }
+
+ cp -r $src_dir/* $root/$build_dir/
+}
+
+xibuild_build () {
+ [ "$root" = "/" ] && {
+ $build_dir/xi_profile.sh $build_dir
+ } || {
+ xichroot "$root" $builddir/xi_profile $builddir
+ }
+}
+
+xibuild_strip () {
+ for file in \
+ $(find $export_dir/ -type f -name \*.so* ! -name \*dbg) \
+ $(find $export_dir/ -type f -name \*.a) \
+ $(find $export_dir/ -type f -executable ); do
+ strip --strip-unneeded $file
+ done
+
+ find $export_dir -name \*.la -delete
+}
+
+xibuild_package () {
+ for pkg in $(ls -1 $export_dir); do
+ cd $root/$export_dir/$pkg
+ [ "$(ls -1 $root/$export_dir/$pkg| wc -l)" = "0" ] && {
+ echo "package $pkg is empty"
+ [ ! -z ${SOURCE} ] || exit 1
+ }
+ tar -C $root/$export_dir/$pkg -czf $out_dir/$pkg.xipkg ./
+ done
+}
+
+xibuild_describe () {
+
+}
+
+
+while getopts ":r:c:p:b:d:qh" opt; do
+ case "${opt}" in
+ r)
+ root=$(realpath ${OPTARG});;
+ d)
+ out_dir=$(realpath ${OPTARG});;
+ c)
+ src_dir=$(realpath ${OPTARG});;
+ b)
+ build_dir=$(realpath ${OPTARG});;
+ p)
+ xibuild_profile=$(realpath ${OPTARG});;
+ v)
+ textout=/dev/stdout;;
+ h)
+ usage; exit 0;;
+ esac
+done
+
+shift $((OPTIND-1))
+
+tasks="prepare fetch build strip package"
+
+[ "$#" = "1" ] && {
+ [ -d "$1" ] && {
+ src_dir=$(realpath $1)
+ } || {
+ tasks="$(echo $tasks | grep $1)"
+ }
+}
+
+NAME=$(basename $(realpath "$src_dir"))
+trap "{printf \"${RED}${CROSS}\n\"}" 1
+
+. $src_dir/$NAME.xibuild
+
+printf "${BLUE}${NAME}\n"
+for task in $tasks; do
+ printf "${BLUE}${TABCHAR}$task "
+
+ xibuild_$task 2>&1 | tee -a $logfile > $textout || exit 1
+
+ printf "${GREEN}${CHECKMARK}\n"
+done