first commit
This commit is contained in:
commit
47a23d0198
2 changed files with 133 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
.makefile
|
||||
foo
|
||||
obj/
|
||||
src/
|
129
cbuild.sh
Executable file
129
cbuild.sh
Executable file
|
@ -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
|
Loading…
Reference in a new issue