#!/bin/sh # Written by Noah Swerhun # https://noahsw.xyz # Development: https://git.noahsw.xyz/cbuild.sh/log.html # --- USER CONFIG --- CC="gcc" CFLAGS="-Wall -Wpedantic" LDFLAGS="" LDLIBS="" TARGET="nsnake" SRCDIR="src" OBJDIR="obj" MAKEFILE=".makefile" PKG_CONFIG_LIBS="ncurses" HEADER_DIR="include" # ------------------- PROG_COMMAND="./cbuild.sh __progress__" SRC="$(find ${SRCDIR} -name '*\.c' 2> /dev/null)" OBJ="$(find ${SRCDIR} -name '*\.c' 2> /dev/null | sed "s/${SRCDIR}\//${OBJDIR}\//" | sed "s/\.c$/.o/" | tr '\n' ' ')" srcnum="$(find ${SRCDIR} -name '*\.c' -exec printf %c {} + 2> /dev/null | wc -c)" CFLAGS="${CFLAGS} $(pkg-config --cflags "${PKG_CONFIG_LIBS}")" LDLIBS="${CFLAGS} $(pkg-config --libs "${PKG_CONFIG_LIBS}")" clear_formatting="\033[0m" bold="\033[1m" info_color="\033[34m" # default: "\033[34m" - blue err_color="\033[31m" # default: "\033[31m" - red build_progress_color="\033[35m" # default: "\033[35m" - magenta build_info_color="\033[32m" # default: "\033[32m" - green link_info_color="\033[36m" # default: "\033[36m" - cyan usage() { less < "${MAKEFILE}" <<'EOF' ########################## # GENERATED BY cbuild.sh # # DO NOT MODIFY BY HAND # ########################## .POSIX: $(TARGET): $(OBJ) @$(PROG_COMMAND) link $(TARGET) @$(CC) $(LDFLAGS) -o $(TARGET) $(OBJ) $(LDLIBS) EOF i=1 echo "${SRC}" | while read srcname; do objname="$(echo "${srcname}" | sed "s/${SRCDIR}\//${OBJDIR}\//" | sed "s/\.c$/.o/")" includes="$(grep '#include ".*"' ${srcname} | awk -F\" '{ print $2 }')" printf "%s: %s " "${objname}" "${srcname}" >> "${MAKEFILE}" for line in $includes; do printf "%s " "${srcname%$(basename ${srcname})}${line}" >> "${MAKEFILE}" done printf "\n" >> "${MAKEFILE}" printf "\t@%s object %s\n" \ '$(PROG_COMMAND)' "${objname}" >> "${MAKEFILE}" printf "\t@%s %s -o %s -c %s\n" '$(CC)' '$(CFLAGS)' \ "${objname}" "${srcname}" >> "${MAKEFILE}" i=$((${i}+1)) done chmod -w "${MAKEFILE}" } build() { gen_makefile [ ! -d "${OBJDIR}" ] && mkdir "${OBJDIR}" export_vars make -f "${MAKEFILE}" -e "${TARGET}" -n | grep -c "^${CC}" > .cbuild_prog.tmp if [ "$(cat .cbuild_prog.tmp)" = 0 ]; then info "Target" "${TARGET}" "up to date" rm .cbuild_prog.tmp return 0; fi info "Beginning build..." make -f "${MAKEFILE}" -e "${TARGET}" ret=$? [ "${ret}" = 0 ] && info "Build SUCCESSFUL" || err "Build FAILURE" rm .cbuild_prog.tmp return "${ret}" } clean() { [ -d "${OBJDIR}" ] && rm -rf "${OBJDIR}" [ -f "${MAKEFILE}" ] && chmod +w "${MAKEFILE}" [ -f "${TARGET}" ] && [ -f "${MAKEFILE}" ] && rm "${TARGET}" "${MAKEFILE}" } run() { build || exit $? args="$@" info "Running" "./${TARGET} ${args}" "./${TARGET}" $@ || err "Run FAILURE" "./${TARGET}" "returned $?" } dry_run() { gen_makefile export_vars make -f "${MAKEFILE}" -e "${TARGET}" -n } new() { case $1 in header) shift 1 for arg in $@; do if [ "${arg}" != "__MODULE__" ]; then path="${SRCDIR}/${HEADER_DIR}/${arg%.h}.h" clean_path="$(echo ${path} | sed 's/\.\///g')" macro="$(basename ${clean_path} .h | tr '[a-z]' '[A-Z]')" [ ! -d "$(dirname ${clean_path})" ] && mkdir -p "$(dirname ${clean_path})" if [ ! -f "${clean_path}" ]; then cat > "${clean_path}" < "${path}" <> "${path}" || cat >> "${path}" <