LINUX.ORG.RU

История изменений

Исправление 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)/*