diff --git a/.gitignore b/.gitignore index 656c2b2..7c2c332 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ obj/* nsnake +.makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index a2c4745..0000000 --- a/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -CC = gcc -CFLAGS = -Wall -Wextra -pedantic-errors -std=c99 -Wno-format -lncurses -OUTFILE = nsnake - -SRCDIR = src -OBJDIR = obj -INCDIR = src/include - -SRC = $(wildcard $(SRCDIR)/*.c) -INC = $(wildcard $(INCDIR)/*.h) -_OBJ = $(SRC:.c=.o) -OBJ = $(subst $(SRCDIR),$(OBJDIR),$(_OBJ)) - -$(OUTFILE): $(OBJ) config.h - $(CC) $(CFLAGS) -o $(OUTFILE) $(OBJ) - -$(OBJDIR)/%.o: $(SRCDIR)/%.c $(INCDIR)/%.h config.h - @mkdir -p $(@D) - $(CC) $(CFLAGS) -o $@ -c $< - -.PHONY: clean -clean: - -rm $(OUTFILE) $(OBJ) - -.PHONY: install -install: $(OUTFILE) - cp $(OUTFILE) /usr/local/bin - chown root /usr/local/bin/$(OUTFILE) - chmod 755 /usr/local/bin/$(OUTFILE) diff --git a/cbuild.sh b/cbuild.sh new file mode 100755 index 0000000..d88d8db --- /dev/null +++ b/cbuild.sh @@ -0,0 +1,299 @@ +#!/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}" <