From 47a23d01986d05b58bbeb58f85d7856ccfa17479 Mon Sep 17 00:00:00 2001 From: Noah Swerhun Date: Thu, 23 Dec 2021 22:34:22 -0600 Subject: [PATCH] first commit --- .gitignore | 4 ++ cbuild.sh | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 .gitignore create mode 100755 cbuild.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6704726 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.makefile +foo +obj/ +src/ diff --git a/cbuild.sh b/cbuild.sh new file mode 100755 index 0000000..8b863e2 --- /dev/null +++ b/cbuild.sh @@ -0,0 +1,129 @@ +#!/bin/sh + +# --- USER CONFIG --- +CC="gcc" +CFLAGS="-Wall -Wpedantic -std=c99" +LDFLAGS="" +LDLIBS="" +TARGET="foo" +SRCDIR="src" +OBJDIR="obj" +MAKEFILE=".makefile" +# ------------------- + +PROG_COMMAND="./cbuild.sh __progress__" +SRC="$(find ${SRCDIR} -name '*\.c')" +OBJ="$(find ${SRCDIR} -name '*\.c' | + sed "s/${SRCDIR}\//${OBJDIR}\//" | + sed "s/\.c$/.o/" | + tr '\n' ' ')" + +srcnum="$(find ${SRCDIR} -name '*\.c' -exec printf %c {} + | wc -c)" + +export_vars() { + export CC + export CFLAGS + export LDFLAGS + export LDLIBS + export TARGET + export OBJ + export PROG_COMMAND +} + +info() { + printf "\e[34;1m[*]\e[21m %s\e[0m\n" "$@" +} + +err() { + printf "\e[31;1m[!]\e[21m %s\e[0m\n" "$@" +} + +gen_makefile() { + info "Generating makefile..." + [ -f "${MAKEFILE}" ] && chmod +w "${MAKEFILE}" + cat > "${MAKEFILE}" <<'EOF' +########################## +# GENERATED BY cbuild.sh # +# DO NOT MODIFY BY HAND # +########################## +.POSIX: +.SUFFIXES: + +$(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/")" + + gcc -MM -MT "${objname}" "${srcname}" >> "${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 "^${CC}" | wc -l > .cbuild_prog.tmp + info "Beginning build..." + make -f "${MAKEFILE}" -e "${TARGET}" && + info "Build SUCCESSFUL" || + err "Build FAILURE" + rm .cbuild_prog.tmp +} + +clean() { + rm -rf "${OBJDIR}" + chmod +w "${MAKEFILE}" + rm "${TARGET}" "${MAKEFILE}" +} + +run() { + build + printf '\e[36;1mRunning\e[0m %s\n' "./${TARGET}" + "./${TARGET}" +} + +dry_run() { + gen_makefile + export_vars + make -f "${MAKEFILE}" -e "${TARGET}" -n +} + +__progress__() { + ntargets=$(cat .cbuild_prog.tmp) + export_vars + rtargets="$(make -f "${MAKEFILE}" -e "${TARGET}" -n | grep "^${CC}" | wc -l)" + targetno=$((${ntargets} - ${rtargets} + 1)) + if [ "${1}" = "object" ]; then + printf '\e[35;1m[%3d/%d]\e[0m ' "${targetno}" "${ntargets}" + printf '\e[32mBuilding\e[0m ' + elif [ "${1}" = "link" ]; then + printf '\e[36;1m[%3d/%d]\e[0m ' "${targetno}" "${ntargets}" + printf '\e[36;1mLinking\e[0m ' + fi + + echo "${2}" +} +case $1 in + build) build;; + clean) clean;; + buildcn) clean ; build;; + generate) gen_makefile && info "Done";; + run) run;; + dryrun) dry_run;; + __progress__) __progress__ "${2}" "${3}";; +esac