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