lazy_single_makefile_for_c_.../Makefile
Alvin Young 999507a72e 更新 Makefile
更新Windows的兼容性
2025-12-08 15:40:47 +08:00

92 lines
2.3 KiB
Makefile

# lazy build C project Makefiles by impressionyang
# user config values
CC="/usr/bin/gcc"
# CC="E:\\impressionyang\\scoop\\apps\\mingw\\12.2.0\\bin\\gcc.exe"
PROJECT=lazy_make_test
BUILD_DIR=build
# check operating system type
ifeq ($(OS), Windows_NT)
OS_TYPE := WINDOWS
SHELL := cmd
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
OS_TYPE := LINUX
endif
ifeq ($(UNAME_S),Darwin)
OS_TYPE := OSX
endif
endif
$(info OS type = $(OS_TYPE))
# patern config
FILES_PATH := ./
SRC_FILES_SUFFIX := %.c
HDR_FILES_SUFFIX := %.h
# add build flags
CFLAGS += -fdiagnostics-color=always -g
CFLAGS += -lm
# define func to remove_same_str for debug: $(info get seen ${seen})
define remove_same_str =
$(eval seen :=)
$(foreach _,$1,$(if $(filter $_,${seen}),,$(if $_, $(eval seen += $_))))
${seen}
endef
# find recursive all files
rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
# get source file and header file
FIND_ALL_FILES := $(foreach files_path,$(FILES_PATH), $(call rwildcard,$(files_path),*.*) )
SOURCES := $(filter $(SRC_FILES_SUFFIX),$(FIND_ALL_FILES))
SOURCES := $(SOURCES:$(LOCAL_PATH)/%=%)
HEADERS := $(filter $(HDR_FILES_SUFFIX),$(FIND_ALL_FILES))
HEADERS := $(HEADERS:$(LOCAL_PATH)/%=%)
# fillter out all include path
FIND_ALL_FILES_DIR := $(dir $(foreach files_path,$(FILES_PATH), $(call rwildcard,$(files_path),*/) ) )
GET_INC_DIRS := $(call remove_same_str,$(FIND_ALL_FILES_DIR))
INC_DIRS :=
INC_DIRS += $(foreach v, $(GET_INC_DIRS), $(if $(filter %/,$v) , $(eval INC_DIRS+=$v), ))
INC_DIRS := $(subst ./, -I./, $(INC_DIRS))
INC_DIRS := $(wordlist 1, $(words $(INC_DIRS)), $(INC_DIRS))
# debug print info, no need to be change
# $(info "INC_DIRS")
# $(info $(INC_DIRS))
# $(info "HEADERS")
# $(info $(HEADERS))
# $(info "SOURCES")
# $(info $(SOURCES))
# compile job
all :
ifeq ($(OS_TYPE), WINDOWS)
mkdir $(BUILD_DIR) 2>nul || ver > nul
endif
ifeq ($(OS_TYPE), LINUX)
mkdir -p $(BUILD_DIR)
endif
ifeq ($(OS_TYPE), OSX)
mkdir -p $(BUILD_DIR)
endif
$(CC) $(CFLAGS) $(SOURCES) $(HEADERS) $(INC_DIRS) -o $(BUILD_DIR)/$(PROJECT)
# virtual clean job
.PHONY : clean
clean:
ifeq ($(OS_TYPE), WINDOWS)
rmdir /S /Q $(BUILD_DIR)
endif
ifeq ($(OS_TYPE), LINUX)
rm -rf ./$(BUILD_DIR)
endif
ifeq ($(OS_TYPE), OSX)
rm -rf ./$(BUILD_DIR)
endif