#Source: https://learning.edx.org/course/course-v1:Dartmouth_IMTx+DART.IMT.C.07+1T2020/home # define the C compiler to use CC = gcc # define comipler flags CFLAGS = -std=c11 -Wall -fmax-errors=10 -Wextra # define library paths in addition to /usr/lib LFLAGS = -L. # define libraries to use LIBS = -lweather # define the object files that this project needs OBJFILES = program.o # define the name of the executable file MAIN = program # all of the below is generic - one typically only adjusts the above all: $(MAIN) $(MAIN): $(OBJFILES) $(CC) $(CFLAGS) -o $(MAIN) $(OBJFILES) $(LFLAGS) $(LIBS) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< launch: program ./program clean: rm -f $(OBJFILES) $(MAIN) Intermediate step: program: program.o gcc -std=c11 -Wall -fmax-errors=10 -Wextra program.o -L. -lweather -o program program.o: program.c gcc -std=c11 -Wall -fmax-errors=10 -Wextra -c program.c -o program.o launch: program ./program
# Thanks to Job Vranish (https://spin.atomicobject.com/2016/08/26/makefile-c-projects/) TARGET_EXEC := final_program BUILD_DIR := ./build SRC_DIRS := ./src # Find all the C and C++ files we want to compile # Note the single quotes around the * expressions. The shell will incorrectly expand these otherwise, but we want to send the * directly to the find command. SRCS := $(shell find $(SRC_DIRS) -name '*.cpp' -or -name '*.c' -or -name '*.s') # Prepends BUILD_DIR and appends .o to every src file # As an example, ./your_dir/hello.cpp turns into ./build/./your_dir/hello.cpp.o OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) # String substitution (suffix version without %). # As an example, ./build/hello.cpp.o turns into ./build/hello.cpp.d DEPS := $(OBJS:.o=.d) # Every folder in ./src will need to be passed to GCC so that it can find header files INC_DIRS := $(shell find $(SRC_DIRS) -type d) # Add a prefix to INC_DIRS. So moduleA would become -ImoduleA. GCC understands this -I flag INC_FLAGS := $(addprefix -I,$(INC_DIRS)) # The -MMD and -MP flags together generate Makefiles for us! # These files will have .d instead of .o as the output. CPPFLAGS := $(INC_FLAGS) -MMD -MP # The final build step. $(BUILD_DIR)/$(TARGET_EXEC): $(OBJS) $(CXX) $(OBJS) -o $@ $(LDFLAGS) # Build step for C source $(BUILD_DIR)/%.c.o: %.c mkdir -p $(dir $@) $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ # Build step for C++ source $(BUILD_DIR)/%.cpp.o: %.cpp mkdir -p $(dir $@) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@ .PHONY: clean clean: rm -r $(BUILD_DIR) # Include the .d makefiles. The - at the front suppresses the errors of missing # Makefiles. Initially, all the .d files will be missing, and we don't want those # errors to show up. -include $(DEPS)