История изменений
Исправление nikitalol, (текущая версия) :
На скорую руку переделал из своего проекта, но для обычного приложения, изучи ты cmake и не парь людям мозги с нестандартной сборкой.
Пользоваться так: положить файл в корень, распихать файлы по указанным папкам, и обозвать в шапке всё как нужно
Файл сам подцепит все файлы в сорцах на 2 уровня и автоматом пересоберёт что нужно
Файл не учитывает массу тонких моментов, не линкует so-шники и a-шники, только компилируемые к проекту, не умеет делать отдельно папки debug и release, не тестировался и вообще изначально писался для микроконтроллеров, на скорую руку передал в обычный
Решена важная проблема самописных мейкфайлов: они часто не чувствуют неизменений в хедерах
# Path you your toolchain installation, leave empty if already in system PATH
# TOOLCHAIN_PATH =
###############################################################################
# Project specific
SRC_DIR = Src
INC_DIR = Inc
BUILD_DIR = Build
DEBUG_DIR = Debug
RELEASE_DIR = Release
OBJ_DIR = Obj
TARGET = app
# Some_nonebin_Lib =
# Toolchain
ifdef TOOLCHAIN_PATH
CC = $(TOOLCHAIN_PATH)/g++
AS = $(TOOLCHAIN_PATH)/g++ -x assembler-with-cpp
CP = $(TOOLCHAIN_PATH)/objcopy
SZ = $(TOOLCHAIN_PATH)/size -d -G
else
CC = g++
AS = g++ -x assembler-with-cpp
CP = arm-none-eabi-objcopy
SZ = arm-none-eabi-size -d -G
endif
# Project sources
CXX_FILES = $(wildcard $(SRC_DIR)/*.c) $(wildcard $(SRC_DIR)/*/*.c)
CPP_FILES = $(wildcard $(SRC_DIR)/*.cpp) $(wildcard $(SRC_DIR)/*/*.cpp)
ASM_FILES = $(wildcard $(SRC_DIR)/*.s) $(wildcard $(SRC_DIR)/*/*.s)
# LD_SCRIPT =
# Project includes
INCLUDES = -I$(INC_DIR)
ifdef Some_nonebin_Lib
CXX_FILES += $(wildcard $(Some_nonebin_Lib)/*.c)
CPP_FILES += $(wildcard $(Some_nonebin_Lib)/*.cpp)
INCLUDES += -I$(Some_nonebin_Lib)
endif
# Compiler Flags
# GCC
# ifdef DEBUG
# $(info [info] debug mode)
# CFLAGS = -g -Og
# BUILD_MODE = $(DEBUG_DIR)
# else
# $(info [info] nodebug mode)
# CFLAGS = -O2
# BUILD_MODE = $(RELEASE_DIR)
# endif
CFLAGS = -Wall -Wextra -Warray-bounds
CFLAGS += -std=c11
CFLAGS += -lc -lgcc -lm
# Generate dependency information
CFLAGS += -MMD -MP
# -MF"$(@:%.o=%.d)"
# CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS += -Wno-comment -Wno-unused-parameter
# PROJECT
# Linker Flags
# LFLAGS = -Wl,--gc-sections -Wl,-T$(LD_SCRIPT) --specs=rdimon.specs
###############################################################################
# Unlike the original source, this file throws object files into the correct directory.
OBJECTS = $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CXX_FILES:.c=.o)))
OBJECTS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.o)))
OBJECTS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(ASM_FILES:.s=.o)))
DEPENDS = $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CXX_FILES:.c=.d)))
DEPENDS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.d)))
DEPENDS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(ASM_FILES:.s=.d)))
.PHONY: clean
vpath %.c $(sort $(dir $(CXX_FILES)))
vpath %.cpp $(sort $(dir $(CPP_FILES)))
vpath %.s $(sort $(dir $(ASM_FILES)))
# .PHONY: clean
all: CFLAGS += -O2
all: $(BUILD_DIR)/$(TARGET)
# all: make
debug: CFLAGS += -g -Og -DDEBUG
debug: $(BUILD_DIR)/$(TARGET)
-include $(DEPENDS)
# Compile asm
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.s Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[AS] $< -> $@"
@$(AS) -c $< -o $@ $(CFLAGS)
# Compile cpp
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[CC] $< -> $@"
@$(CC) -c $< -o $@ $(CFLAGS)
# Compile c
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.c Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[CC] $< -> $@"
@$(CC) -c $< -o $@ $(CFLAGS)
# Link
$(BUILD_DIR)/$(TARGET): $(OBJECTS) Makefile
@echo "[LD] $@"
@$(CC) -o $@ $(CFLAGS) $(OBJECTS)
@$(SZ) $@
# Make directory
# $(BUILD_DIR)/$(DEBUG_DIR)/$(OBJ_DIR): | $(BUILD_DIR)/$(DEBUG_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(RELEASE_DIR)/$(OBJ_DIR): | $(BUILD_DIR)/$(RELEASE_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(DEBUG_DIR): | $(BUILD_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(RELEASE_DIR): | $(BUILD_DIR)
# @mkdir $@
$(BUILD_DIR)/$(OBJ_DIR): | $(BUILD_DIR)
@mkdir $@
$(BUILD_DIR):
@mkdir $@
# Clean
clean:
@rm $(BUILD_DIR)/$(TARGET)* $(BUILD_DIR)/$(OBJ_DIR)/*
# @rm $(BUILD_DIR)/$(DEBUG_DIR)/$(TARGET)* \
# $(BUILD_DIR)/$(RELEASE_DIR)/$(TARGET)* \
# $(BUILD_DIR)/$(DEBUG_DIR)/$(OBJ_DIR)/* \
# $(BUILD_DIR)/$(RELEASE_DIR)/$(OBJ_DIR)/*
Исправление nikitalol, :
На скорую руку переделал из своего проекта, но для обычного приложения, изучи ты cmake и не парь людям мозги с нестандартной сборкой.
Пользоваться так: положить файл в корень, распихать файлы по указанным папкам, и обозвать в шапке всё как нужно
Файл сам подцепит все файлы в сорцах на 2 уровня и автоматом пересоберёт что нужно
Файл не учитывает массу тонких моментов, не линкует либы типа gtk, qt, boost и тд, только самопсиные, не умеет делать отдельно папки debug и release, не тестировался и вообще изначально писался для микроконтроллеров, на скорую руку передал в обычный
Решена важная проблема самописных мейкфайлов: они часто не чувствуют неизменений в хедерах
# Path you your toolchain installation, leave empty if already in system PATH
# TOOLCHAIN_PATH =
###############################################################################
# Project specific
SRC_DIR = Src
INC_DIR = Inc
BUILD_DIR = Build
DEBUG_DIR = Debug
RELEASE_DIR = Release
OBJ_DIR = Obj
TARGET = app
# Some_nonebin_Lib =
# Toolchain
ifdef TOOLCHAIN_PATH
CC = $(TOOLCHAIN_PATH)/g++
AS = $(TOOLCHAIN_PATH)/g++ -x assembler-with-cpp
CP = $(TOOLCHAIN_PATH)/objcopy
SZ = $(TOOLCHAIN_PATH)/size -d -G
else
CC = g++
AS = g++ -x assembler-with-cpp
CP = arm-none-eabi-objcopy
SZ = arm-none-eabi-size -d -G
endif
# Project sources
CXX_FILES = $(wildcard $(SRC_DIR)/*.c) $(wildcard $(SRC_DIR)/*/*.c)
CPP_FILES = $(wildcard $(SRC_DIR)/*.cpp) $(wildcard $(SRC_DIR)/*/*.cpp)
ASM_FILES = $(wildcard $(SRC_DIR)/*.s) $(wildcard $(SRC_DIR)/*/*.s)
# LD_SCRIPT =
# Project includes
INCLUDES = -I$(INC_DIR)
ifdef Some_nonebin_Lib
CXX_FILES += $(wildcard $(Some_nonebin_Lib)/*.c)
CPP_FILES += $(wildcard $(Some_nonebin_Lib)/*.cpp)
INCLUDES += -I$(Some_nonebin_Lib)
endif
# Compiler Flags
# GCC
# ifdef DEBUG
# $(info [info] debug mode)
# CFLAGS = -g -Og
# BUILD_MODE = $(DEBUG_DIR)
# else
# $(info [info] nodebug mode)
# CFLAGS = -O2
# BUILD_MODE = $(RELEASE_DIR)
# endif
CFLAGS = -Wall -Wextra -Warray-bounds
CFLAGS += -std=c11
CFLAGS += -lc -lgcc -lm
# Generate dependency information
CFLAGS += -MMD -MP
# -MF"$(@:%.o=%.d)"
# CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS += -Wno-comment -Wno-unused-parameter
# PROJECT
# Linker Flags
# LFLAGS = -Wl,--gc-sections -Wl,-T$(LD_SCRIPT) --specs=rdimon.specs
###############################################################################
# Unlike the original source, this file throws object files into the correct directory.
OBJECTS = $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CXX_FILES:.c=.o)))
OBJECTS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.o)))
OBJECTS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(ASM_FILES:.s=.o)))
DEPENDS = $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CXX_FILES:.c=.d)))
DEPENDS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.d)))
DEPENDS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(ASM_FILES:.s=.d)))
.PHONY: clean
vpath %.c $(sort $(dir $(CXX_FILES)))
vpath %.cpp $(sort $(dir $(CPP_FILES)))
vpath %.s $(sort $(dir $(ASM_FILES)))
# .PHONY: clean
all: CFLAGS += -O2
all: $(BUILD_DIR)/$(TARGET)
# all: make
debug: CFLAGS += -g -Og -DDEBUG
debug: $(BUILD_DIR)/$(TARGET)
-include $(DEPENDS)
# Compile asm
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.s Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[AS] $< -> $@"
@$(AS) -c $< -o $@ $(CFLAGS)
# Compile cpp
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[CC] $< -> $@"
@$(CC) -c $< -o $@ $(CFLAGS)
# Compile c
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.c Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[CC] $< -> $@"
@$(CC) -c $< -o $@ $(CFLAGS)
# Link
$(BUILD_DIR)/$(TARGET): $(OBJECTS) Makefile
@echo "[LD] $@"
@$(CC) -o $@ $(CFLAGS) $(OBJECTS)
@$(SZ) $@
# Make directory
# $(BUILD_DIR)/$(DEBUG_DIR)/$(OBJ_DIR): | $(BUILD_DIR)/$(DEBUG_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(RELEASE_DIR)/$(OBJ_DIR): | $(BUILD_DIR)/$(RELEASE_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(DEBUG_DIR): | $(BUILD_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(RELEASE_DIR): | $(BUILD_DIR)
# @mkdir $@
$(BUILD_DIR)/$(OBJ_DIR): | $(BUILD_DIR)
@mkdir $@
$(BUILD_DIR):
@mkdir $@
# Clean
clean:
@rm $(BUILD_DIR)/$(TARGET)* $(BUILD_DIR)/$(OBJ_DIR)/*
# @rm $(BUILD_DIR)/$(DEBUG_DIR)/$(TARGET)* \
# $(BUILD_DIR)/$(RELEASE_DIR)/$(TARGET)* \
# $(BUILD_DIR)/$(DEBUG_DIR)/$(OBJ_DIR)/* \
# $(BUILD_DIR)/$(RELEASE_DIR)/$(OBJ_DIR)/*
Исходная версия nikitalol, :
На скорую руку переделал из своего проекта, но для обычного приложения, изучи ты cmake и не парь людям мозги с нестандартной сборкой.
Пользоваться так: положить файл в корень, распихать файлы по указанным папкам, и обозвать в шапке всё как нужно
Файл сам подцепит все файлы в сорцах на 2 уровня и автоматом пересоберёт что нужно
Файл не учитывает массу тонких моментов, не умеет делать отдельно папки debug и release, не тестировался и вообще изначально писался для микроконтроллеров, на скорую руку передал в обычный
Решена важная проблема самописных мейкфайлов: они часто не чувствуют неизменений в хедерах
# Path you your toolchain installation, leave empty if already in system PATH
# TOOLCHAIN_PATH =
###############################################################################
# Project specific
SRC_DIR = Src
INC_DIR = Inc
BUILD_DIR = Build
DEBUG_DIR = Debug
RELEASE_DIR = Release
OBJ_DIR = Obj
TARGET = app
# Some_nonebin_Lib =
# Toolchain
ifdef TOOLCHAIN_PATH
CC = $(TOOLCHAIN_PATH)/g++
AS = $(TOOLCHAIN_PATH)/g++ -x assembler-with-cpp
CP = $(TOOLCHAIN_PATH)/objcopy
SZ = $(TOOLCHAIN_PATH)/size -d -G
else
CC = g++
AS = g++ -x assembler-with-cpp
CP = arm-none-eabi-objcopy
SZ = arm-none-eabi-size -d -G
endif
# Project sources
CXX_FILES = $(wildcard $(SRC_DIR)/*.c) $(wildcard $(SRC_DIR)/*/*.c)
CPP_FILES = $(wildcard $(SRC_DIR)/*.cpp) $(wildcard $(SRC_DIR)/*/*.cpp)
ASM_FILES = $(wildcard $(SRC_DIR)/*.s) $(wildcard $(SRC_DIR)/*/*.s)
# LD_SCRIPT =
# Project includes
INCLUDES = -I$(INC_DIR)
ifdef Some_nonebin_Lib
CXX_FILES += $(wildcard $(Some_nonebin_Lib)/*.c)
CPP_FILES += $(wildcard $(Some_nonebin_Lib)/*.cpp)
INCLUDES += -I$(Some_nonebin_Lib)
endif
# Compiler Flags
# GCC
# ifdef DEBUG
# $(info [info] debug mode)
# CFLAGS = -g -Og
# BUILD_MODE = $(DEBUG_DIR)
# else
# $(info [info] nodebug mode)
# CFLAGS = -O2
# BUILD_MODE = $(RELEASE_DIR)
# endif
CFLAGS = -Wall -Wextra -Warray-bounds
CFLAGS += -std=c11
CFLAGS += -lc -lgcc -lm
# Generate dependency information
CFLAGS += -MMD -MP
# -MF"$(@:%.o=%.d)"
# CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS += -Wno-comment -Wno-unused-parameter
# PROJECT
# Linker Flags
# LFLAGS = -Wl,--gc-sections -Wl,-T$(LD_SCRIPT) --specs=rdimon.specs
###############################################################################
# Unlike the original source, this file throws object files into the correct directory.
OBJECTS = $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CXX_FILES:.c=.o)))
OBJECTS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.o)))
OBJECTS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(ASM_FILES:.s=.o)))
DEPENDS = $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CXX_FILES:.c=.d)))
DEPENDS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(CPP_FILES:.cpp=.d)))
DEPENDS += $(addprefix $(BUILD_DIR)/$(OBJ_DIR)/,$(notdir $(ASM_FILES:.s=.d)))
.PHONY: clean
vpath %.c $(sort $(dir $(CXX_FILES)))
vpath %.cpp $(sort $(dir $(CPP_FILES)))
vpath %.s $(sort $(dir $(ASM_FILES)))
# .PHONY: clean
all: CFLAGS += -O2
all: $(BUILD_DIR)/$(TARGET)
# all: make
debug: CFLAGS += -g -Og -DDEBUG
debug: $(BUILD_DIR)/$(TARGET)
-include $(DEPENDS)
# Compile asm
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.s Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[AS] $< -> $@"
@$(AS) -c $< -o $@ $(CFLAGS)
# Compile cpp
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[CC] $< -> $@"
@$(CC) -c $< -o $@ $(CFLAGS)
# Compile c
$(BUILD_DIR)/$(OBJ_DIR)/%.o: %.c Makefile | $(BUILD_DIR)/$(OBJ_DIR)
@echo "[CC] $< -> $@"
@$(CC) -c $< -o $@ $(CFLAGS)
# Link
$(BUILD_DIR)/$(TARGET): $(OBJECTS) Makefile
@echo "[LD] $@"
@$(CC) -o $@ $(CFLAGS) $(OBJECTS)
@$(SZ) $@
# Make directory
# $(BUILD_DIR)/$(DEBUG_DIR)/$(OBJ_DIR): | $(BUILD_DIR)/$(DEBUG_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(RELEASE_DIR)/$(OBJ_DIR): | $(BUILD_DIR)/$(RELEASE_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(DEBUG_DIR): | $(BUILD_DIR)
# @mkdir $@
# $(BUILD_DIR)/$(RELEASE_DIR): | $(BUILD_DIR)
# @mkdir $@
$(BUILD_DIR)/$(OBJ_DIR): | $(BUILD_DIR)
@mkdir $@
$(BUILD_DIR):
@mkdir $@
# Clean
clean:
@rm $(BUILD_DIR)/$(TARGET)* $(BUILD_DIR)/$(OBJ_DIR)/*
# @rm $(BUILD_DIR)/$(DEBUG_DIR)/$(TARGET)* \
# $(BUILD_DIR)/$(RELEASE_DIR)/$(TARGET)* \
# $(BUILD_DIR)/$(DEBUG_DIR)/$(OBJ_DIR)/* \
# $(BUILD_DIR)/$(RELEASE_DIR)/$(OBJ_DIR)/*