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