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