Skip to content
Closed
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ COPYING
INSTALL
aclocal.m4
autom4te.cache
configure~
config.guess
config.log
config.status
Expand Down
1 change: 1 addition & 0 deletions sources/CONTRIBUTION.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@

It is suggested for the new contributors to use the following tools:
- `clang-format` for all the C files, source and headers.
- `shfmt -ci -i 4 -ln posix` for shell format with the following parameters.
287 changes: 19 additions & 268 deletions sources/autogen.sh
Original file line number Diff line number Diff line change
@@ -1,275 +1,26 @@
#!/usr/bin/env bash
#!/bin/sh
#
# autogen.sh - Tools for manipulating Jalali representation of Iranian calendar
# and necessary conversations to Gregorian calendar.
# Copyright (C) 2006, 2007, 2009, 2010, 2011 Ashkan Ghassemi.
# Run GNU Autotool commands forcefully to regenerate stuff.
#
# This file is part of libjalali.
#
# libjalali is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# libjalali is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with libjalali. If not, see <http://www.gnu.org/licenses/>.
#

# @OPTIONS
OPTS="anch"
LONG_OPTS="nocolor,clean,help,alternative"

# @USAGE
function usage() {
echo -e "Jalali calendar library autogen build script."
echo -e "usage: autogen.sh [-nch]"
echo -e "try \`autogen.sh --help\' for more information."
}

# @HELP
function help() {
echo -e "usage: autogen.sh [-nch]..."
echo -ne "Invokes GNU build system tools in order to create"
echo -e " necessary configuration scripts.\n"
echo -e "Operation modes:"
echo -e " -a, --alternative\tdo not invoke autoreconf"
echo -e " -n, --nocolor\t\tdisable output colors"
echo -ne " -c, --clean\t\tremove all auto-generated scripts"
echo -e " and files from source tree"
echo -e " -h, --help\t\tprint this help, then exit\n"
echo -e "Report bugs to <[email protected]>."
echo -e "Jalali calendar home page: <http://nongnu.org/jcal>."
}

# echoes ``ok'' if parameter is zero, ''failed'' otherwise.
function printk() {
local STAT=$1

if [ $1 -eq 0 ]; then
echo -e "${GREEN}ok${RESET}"
else
echo -e "${RED}failed${RESET}"
fi

return ${STAT}
}

# performs make distclean and removes auto-generated files by GNU build system.
function clean() {
local STAT
# files
local FUBARS=( "autom4te.cache" "Makefile.in" "m4" "aclocal.m4"
"configure" "config.sub" "config.guess" "config.log"
"config.status" "depcomp" "install-sh" "libtool" "ltmain.sh"
"missing" "src/Makefile.in" "man/Makefile.in"
"test_kit/jalali/Makefile.in" "test_kit/jalali/Makefile"
"test_kit/Makefile.in" "test_kit/Makefile"
"test_kit/jalali/.deps" "test_kit/jtime/.deps"
"test_kit/jtime/Makefile.in" "test_kit/jalali/Makefile"
"libjalali/Makefile.in" "INSTALL" )

echo -e "${GREEN}*${RESET} ${YELLOW}cleaning source tree...${RESET}"

# Makefile is present.
if test -f Makefile; then
echo -ne "${GREEN}* ${RESET}${YELLOW}performing distclean on"
echo -ne " sources if possible...${RESET} "
make distclean >/dev/null 2>&1
let STAT=$?

printk ${STAT}
if [ ${STAT} -ne 0 ]; then
echo -ne "${RED}error${RESET}: cannot perform make distclean."
echo -e " run make distclean manually and check for erros."
fi
fi

for i in ${FUBARS[@]}; do
if [ -f $i ] || [ -d $i ]; then
echo -ne "${GREEN}*${RESET} ${YELLOW}deleting $i...${RESET} "
rm -rf $i
printk 0
fi
done

echo -e "${GREEN}* done${RESET}"
}

# Setting colors to vt100 standard values, NULL if 0 gets passed to set_color()
function set_colors() {
local HAS_COLOR=$1

if [ ${HAS_COLOR} -eq 1 ]; then
RED="\033[1;31m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
CYAN="\033[1;36m"
RESET="\033[0m"
else
RED=""
GREEN=""
YELLOW=""
CYAN=""
RESET=""
fi
}

# @is_present() $SERVICE $NAME $OUTPUT $EXIT
# Checks whether a service is present on system.
# $SERVICE is the path to service.
# $NAME is the service name.
# $OUTPUT specifies whether is_present() should work silently or not.
# $EXIT specifies whther is_present() should exit on the event of
# service not found.
function is_present() {
local SERVICE=$1
local NAME=$2
local OUTPUT=$3
local EXIT=$4
local PRESENT=0

if [ -n "${SERVICE}" ]; then
let PRESENT=1
fi

if [ ${OUTPUT} -eq 1 ]; then
echo -ne "${GREEN}*${RESET} checking for ${YELLOW}${NAME}${RESET}... "
if [ ${PRESENT} -eq 1 ]; then
echo -e "${GREEN}yes${RESET}"
else
echo -e "${RED}no${RESET}"
fi
fi

if [ ${PRESENT} -eq 0 ] && [ ${EXIT} -eq 1 ]; then
echo -ne "${RED}error${RESET}: ${YELLOW}${NAME}${RESET} was not found"
echo -e "on your system. autogen.sh cannot continue."
exit 1
fi

return ${PRESENT}
}

# Checking for tools
# aclocal, libtoolize, autoconf, automake and autoreconf
function check_services() {
local STAT
ACLOCAL="$(which aclocal 2>/dev/null)"
is_present "${ACLOCAL}" "aclocal" 1 1
# glibtoolize glue-patch
LIBTOOLIZE="$(which glibtoolize 2>/dev/null)"
STAT=$?
is_present "${LIBTOOLIZE}" "glibtoolize" 1 0
if [ ${STAT} -ne 0 ]; then
LIBTOOLIZE="$(which libtoolize 2>/dev/null)"
is_present "${LIBTOOLIZE}" "libtoolize" 1 1
fi
AUTOCONF="$(which autoconf 2>/dev/null)"
is_present "${AUTOCONF}" "autoconf" 1 1
AUTOMAKE="$(which automake 2>/dev/null)"
is_present "${AUTOMAKE}" "automake" 1 1
AUTORECONF="$(which autoreconf 2>/dev/null)"
is_present "${AUTORECONF}" "autoreconf" 1 0
echo -e "${GREEN}* done${RESET}\n"
}

# @perform() $SERVICE $NAME $EXIT $PARAMS
# runs a service with a set of parameters.
# $SERVICE is the path to the service.
# $NAME is the service name.
# $EXIT specifies whether perform() should exit on the event of
# encoutering any errors or not.
# $PARAMS are the parameters passed to the service.
function perform() {
local SERVICE=$1
local NAME=$2
local EXIT=$3
local PARAMS=$4
local SSTAT

echo -ne "${GREEN}*${RESET} running ${YELLOW}${NAME}${RESET} ${CYAN}${PARAMS}${RESET}... "
${SERVICE} ${PARAMS} >/dev/null 2>&1
let STAT=$?

printk ${STAT}

if [ ${STAT} -ne 0 ]; then
echo -ne "${RED}error${RESET}: cannot run ${YELLOW}${NAME}${RESET}."
echo -e " please run ${NAME} manually and check for errors."
fi

if [ ${EXIT} -eq 1 ] && [ ${STAT} -ne 0 ]; then
exit 1
fi
}

# Operation modes.
CLEAN=0
HELP=0
COLOR=1
ALTERN=0

which which 1>/dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "cannot find \`\`which''. autogen cannot continue."
exit 1
# Reverse the generation by removing any file created (`git clean -fxdn` lists
# them).

libtoolize="$(command -v libtoolize || command -v glibtoolize)"
if [ -z "$libtoolize" ]; then
printf "libtoolize or glibtoolize is needed and not found.
Add to \$PATH or use another way to bootstrap the project.\n"
exit 1
fi

# Parsing command-line arguments
GETOPT=`which getopt 2>/dev/null`
if [ -z ${GETOPT} ]; then
echo -ne "warning: getopt(1) was not found on your system."
echo -e " command line arguments will be ignored."
else
TEMP=`${GETOPT} -o ${OPTS} -l ${LONG_OPTS} -n 'autogen.sh' -- "$@"`

for i in $TEMP; do
case $i in
-c|--clean) let CLEAN=1;;
-n|--nocolor) let COLOR=0;;
-h|--help) let HELP=1;;
-a|--alternative) let ALTERN=1;;
esac
done
fi

# Setting colors.
set_colors ${COLOR}

# HELP
if [ ${HELP} -eq 1 ]; then
help
exit 0
fi

# CLEAN
if [ ${CLEAN} -eq 1 ]; then
clean
exit 0
fi

# Checking for services.
check_services

# alternative method.
if [ -z "${AUTORECONF}" ] || [ ${ALTERN} -eq 1 ]; then
echo -e "using alternative method: ${YELLO}manual${RESET}"
perform "${LIBTOOLIZE}" "libtoolize" "1" "--force --copy --install"
perform "${ACLOCAL}" "aclocal" "1" "--force"
perform "${AUTOMAKE}" "automake" "1" "--add-missing --force-missing --copy"
perform "${AUTOCONF}" "autoconf" "1" "--force"
echo -e "${GREEN}* done${RESET}"
# autoreconf method
"$libtoolize" --force --copy --install || exit 1
if command -v autoreconf; then
printf 'using autoreconf...\n'
autoreconf --force --install || exit 1
else
echo -e "using prefered method: ${YELLOW}autoreconf${RESET}"
perform "${LIBTOOLIZE}" "libtoolize" "1" "--force --copy --install"
perform "${AUTORECONF}" "autoreconf" "1" "--force --install"
echo -e "${GREEN}* done${RESET}"
printf 'not using autoreconf...\n'
aclocal --force || exit 1
automake --add-missing --force-missing --copy || exit 1
autoconf --force || exit 1
fi

exit 0
printf "done. Read the README and INSTALL files.\n"