chore: add usual files
						commit
						84132fa681
					
				|  | @ -0,0 +1,5 @@ | ||||||
|  | root = true | ||||||
|  | 
 | ||||||
|  | [*.{c,cpp,h}] | ||||||
|  | indent_style = space | ||||||
|  | indent_size = 2 | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | build/ | ||||||
|  | .cache/ | ||||||
|  | compile_commands.json | ||||||
|  | .cache/ | ||||||
|  | vgcore.* | ||||||
|  | @ -0,0 +1,134 @@ | ||||||
|  | # https://spin.atomicobject.com/2016/08/26/makefile-c-projects/ was a great
 | ||||||
|  | # base for this Makefile
 | ||||||
|  | 
 | ||||||
|  | -include config.mk | ||||||
|  | 
 | ||||||
|  | LIB := $(BUILD_DIR)/$(LIB_FILENAME) | ||||||
|  | 
 | ||||||
|  | SRCS != find '$(SRC_DIR)' -iname '*.c' | ||||||
|  | SRCS_H != find include -iname '*.h' | ||||||
|  | SRCS_H_INTERNAL != find $(SRC_DIR) -iname '*.h' | ||||||
|  | SRCS_TEST != find '$(TEST_DIR)' -iname '*.c' | ||||||
|  | SRCS_EXAMPLE != find '$(EXAMPLE_DIR)' -iname '*.c' | ||||||
|  | 
 | ||||||
|  | OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) | ||||||
|  | OBJS_TEST := $(SRCS_TEST:%=$(BUILD_DIR)/%.o) | ||||||
|  | OBJS_EXAMPLE := $(SRCS_EXAMPLE:%=$(BUILD_DIR)/%.o) | ||||||
|  | 
 | ||||||
|  | DEPS := $(SRCS:%=$(BUILD_DIR)/%.d) $(SRCS_TEST:%=$(BUILD_DIR)/%.d) | ||||||
|  | 
 | ||||||
|  | BINS_TEST := $(OBJS_TEST:%.c.o=%) | ||||||
|  | BINS_EXAMPLE := $(OBJS_EXAMPLE:%.c.o=%) | ||||||
|  | 
 | ||||||
|  | TARGETS_TEST := $(BINS_TEST:%=test-%) | ||||||
|  | TARGETS_MEM_TEST := $(BINS_TEST:%=test-mem-%) | ||||||
|  | TARGETS_EXAMPLE := $(BINS_EXAMPLE:%=example-%) | ||||||
|  | 
 | ||||||
|  | _CFLAGS := $(addprefix -I,$(INC_DIRS)) $(CFLAGS) -Wall -Wextra | ||||||
|  | 
 | ||||||
|  | .PHONY: all | ||||||
|  | all: lib | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # =====COMPILATION=====
 | ||||||
|  | # Utility used by the CI to lint
 | ||||||
|  | .PHONY: objs | ||||||
|  | objs: $(OBJS) | ||||||
|  | 
 | ||||||
|  | .PHONY: lib | ||||||
|  | lib: $(LIB) | ||||||
|  | $(LIB): $(OBJS) | ||||||
|  | 	ar -rcs $@ $(OBJS) | ||||||
|  | 
 | ||||||
|  | $(BUILD_DIR)/$(SRC_DIR)/%.c.o: $(SRC_DIR)/%.c | ||||||
|  | 	mkdir -p $(dir $@) | ||||||
|  | 	$(CC) -c $(_CFLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | # =====TESTING=====
 | ||||||
|  | .PHONY: test | ||||||
|  | test: $(TARGETS_TEST) | ||||||
|  | 
 | ||||||
|  | .PHONY: test-mem | ||||||
|  | test-mem: $(TARGETS_MEM_TEST) | ||||||
|  | 
 | ||||||
|  | .PHONY: $(TARGETS_TEST) | ||||||
|  | $(TARGETS_TEST): test-%: % | ||||||
|  | 	./$^ | ||||||
|  | 
 | ||||||
|  | .PHONY: $(TARGETS_MEM_TEST) | ||||||
|  | $(TARGETS_MEM_TEST): test-mem-%: % | ||||||
|  | 	valgrind --tool=memcheck --error-exitcode=1 --track-origins=yes --leak-check=full ./$^ | ||||||
|  | 
 | ||||||
|  | .PHONY: build-test | ||||||
|  | build-test: $(BINS_TEST) | ||||||
|  | 
 | ||||||
|  | $(BINS_TEST): %: %.c.o $(LIB) | ||||||
|  | 	$(CC) \
 | ||||||
|  | 		$^ -o $@ | ||||||
|  | 
 | ||||||
|  | # Along with the include directory, each test includes $(TEST_DIR) (which
 | ||||||
|  | # contains the acutest.h header file), and the src directory of the module it's
 | ||||||
|  | # testing. This allows tests to access internal methods, which aren't publicly
 | ||||||
|  | # exposed.
 | ||||||
|  | $(BUILD_DIR)/$(TEST_DIR)/%.c.o: $(TEST_DIR)/%.c | ||||||
|  | 	mkdir -p $(dir $@) | ||||||
|  | 	$(CC) $(_CFLAGS) -I$(TEST_DIR) \
 | ||||||
|  | 		-I$(SRC_DIR)/_include \
 | ||||||
|  | 		-c $< -o $@ | ||||||
|  | 
 | ||||||
|  | # =====EXAMPLES=====
 | ||||||
|  | .PHONY: build-example | ||||||
|  | build-example: $(BINS_EXAMPLE) | ||||||
|  | 
 | ||||||
|  | $(BINS_EXAMPLE): %: %.c.o $(LIB) | ||||||
|  | 	$(CC) $(LDFLAGS) \
 | ||||||
|  | 		$^ -o $@ | ||||||
|  | 
 | ||||||
|  | # Example binaries link the resulting library
 | ||||||
|  | $(BUILD_DIR)/$(EXAMPLE_DIR)/%.c.o: $(EXAMPLE_DIR)/%.c | ||||||
|  | 	mkdir -p $(dir $@) | ||||||
|  | 	$(CC) $(_CFLAGS) -I$(PUB_INC_DIR) -c $< -o $@ | ||||||
|  | 
 | ||||||
|  | # =====MAINTENANCE=====
 | ||||||
|  | .PHONY: lint | ||||||
|  | lint: | ||||||
|  | 	clang-format -n --Werror \
 | ||||||
|  | 		$(filter-out $(THIRDPARTY),$(SRCS)) \
 | ||||||
|  | 		$(filter-out $(THIRDPARTY),$(SRCS_H)) \
 | ||||||
|  | 		$(filter-out $(THIRDPARTY),$(SRCS_H_INTERNAL)) | ||||||
|  | 
 | ||||||
|  | .PHONY: fmt | ||||||
|  | fmt: | ||||||
|  | 	clang-format -i \
 | ||||||
|  | 		$(filter-out $(THIRDPARTY),$(SRCS)) \
 | ||||||
|  | 		$(filter-out $(THIRDPARTY),$(SRCS_H)) \
 | ||||||
|  | 		$(filter-out $(THIRDPARTY),$(SRCS_H_INTERNAL)) | ||||||
|  | 
 | ||||||
|  | .PHONY: check | ||||||
|  | check: | ||||||
|  | 	mkdir -p $(BUILD_DIR)/cppcheck | ||||||
|  | 	cppcheck \
 | ||||||
|  | 		$(addprefix -I,$(INC_DIRS)) \
 | ||||||
|  | 		--cppcheck-build-dir=$(BUILD_DIR)/cppcheck \
 | ||||||
|  | 		--error-exitcode=1 \
 | ||||||
|  | 		--enable=warning,style \
 | ||||||
|  | 		--inline-suppr \
 | ||||||
|  | 		--check-level=exhaustive \
 | ||||||
|  | 		--quiet \
 | ||||||
|  | 		-j$(shell nproc) \
 | ||||||
|  | 		$(filter-out $(THIRDPARTY),$(SRCS)) | ||||||
|  | 
 | ||||||
|  | .PHONY: clean | ||||||
|  | clean: | ||||||
|  | 	rm -rf '$(BUILD_DIR)' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .PHONY: bear | ||||||
|  | bear: clean | ||||||
|  | 	bear -- make | ||||||
|  | 	bear --append -- make build-test | ||||||
|  | 	bear --append -- make build-example | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Make make aware of the .d files
 | ||||||
|  | -include $(DEPS) | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | LIB_FILENAME =  | ||||||
|  | # BIN_FILENAME =
 | ||||||
|  | 
 | ||||||
|  | BUILD_DIR = build | ||||||
|  | SRC_DIR = src | ||||||
|  | TEST_DIR = test | ||||||
|  | EXAMPLE_DIR = example | ||||||
|  | THIRDPARTY =  | ||||||
|  | 
 | ||||||
|  | PUB_INC_DIR = include | ||||||
|  | INC_DIRS = $(PUB_INC_DIR) src/_include | ||||||
|  | 
 | ||||||
|  | # -MMD: generate a .d file for every source file. This file can be imported by
 | ||||||
|  | #  make and makes make aware that a header file has been changed, ensuring an
 | ||||||
|  | #  object file is also recompiled if only a header is changed.
 | ||||||
|  | # -MP: generate a dummy target for every header file (according to the  docs it
 | ||||||
|  | #  prevents some errors when removing header files)
 | ||||||
|  | CFLAGS ?= -MMD -MP -g | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue