Задать вопрос
@Vadimatorikda
Инженер-программист, embedded разработчик

Несовместимость gnu make 3.81 и 4.2.1. Как разрешить?

Имеется данный make файл: https://github.com/Vadimatorik/chiptune_player_2.2...
Копия makefile
PROJECT_NAME	:= ay_player

#**********************************************************************
# Параметры сборки проекта.
#**********************************************************************
FREE_RTOS_OPTIMIZATION		:= -g3 -Os
STM32_F2_API_OPTIMIZATION	:= -g3 -Os
USER_CODE_OPTIMIZATION		:= -g3 -Os

LD_FILES = -T stm32f2_api/ld/stm32f205xB_mem.ld -T stm32f2_api/ld/stm32f2_section.ld

MK_FLAGS		:= -mcpu=cortex-m3 -mthumb -mfloat-abi=soft
# Размещает каждую функцию в отдельной секции.
MK_FLAGS		+= -ffunction-sections
MK_FLAGS		+= -fdata-sections

C_FLAGS			:= $(MK_FLAGS)
# Все предупреждения == ошибки.
C_FLAGS			+= -Werror
# Выдавать предупреждения (ошибки) о сомнительных констукциях.
C_FLAGS			+= -Wall
# Выдавать предупреждение (ошибку) о любых сомнительных действиях.
C_FLAGS			+= -Wextra 
C_FLAGS			+= -std=gnu99 
# Если переменная объявлена как enum, то она должна иметь возможность
# хранить в себе всевозможные состояния этого enum-а (а не только текущее).
C_FLAGS			+= -fshort-enums

CPP_FLAGS		:= $(MK_FLAGS)     
CPP_FLAGS		+= -Werror -Wall -Wextra
CPP_FLAGS		+= -std=c++14
CPP_FLAGS		+= -fshort-enums

LDFLAGS			:= $(MK_FLAGS)
LDFLAGS			+= $(LD_FILES)
LDFLAGS			+= -Werror -Wall -Wextra 
# Убираем неиспользуемые функции из .elf.
LDFLAGS			+= -Wl,--gc-sections
LDFLAGS			+= -Ofast -funroll-loops
# Развертывание циклов.
LDFLAGS			+= -funroll-loops
# Удаление из elf неиспользуемого кода.
LDFLAGS			+= -Wl,-Map="build/$(PROJECT_NAME).map"

#**********************************************************************
# Параметры toolchain-а.
#**********************************************************************
TOOLCHAIN_PATH	= arm-none-eabi

CC	= $(TOOLCHAIN_PATH)-gcc
CPP	= $(TOOLCHAIN_PATH)-g++
CCDEP	= $(TOOLCHAIN_PATH)-gcc
LD	= $(TOOLCHAIN_PATH)-g++
AR	= $(TOOLCHAIN_PATH)-ar
AS	= $(TOOLCHAIN_PATH)-gcc
OBJCOPY	= $(TOOLCHAIN_PATH)-objcopy
OBJDUMP	= $(TOOLCHAIN_PATH)-objdump
GDB	= $(TOOLCHAIN_PATH)-gdb
SIZE	= $(TOOLCHAIN_PATH)-size

#**********************************************************************
# Конфигурация проекта пользователя.
#**********************************************************************
# Все файлы из папки cfg в каталоге проекта.
USER_CFG_H_FILE		:= $(wildcard cfg/*.h)
USER_CFG_DIR		:= cfg
USER_CFG_PATH		:= -I$(USER_CFG_DIR)

#**********************************************************************
# Для сборки FreeRTOS.
#**********************************************************************
# Собираем все необходимые .h файлы FreeRTOS.
# FreeRTOS.h должен обязательно идти первым! 
FREE_RTOS_H_FILE	:= FreeRTOS_for_stm32f2/FreeRTOS.h
FREE_RTOS_H_FILE	+= $(wildcard FreeRTOS_for_stm32f2/include/*.h)

# Директории, в которых лежат файлы FreeRTOS.
FREE_RTOS_DIR		:= FreeRTOS_for_stm32f2
FREE_RTOS_DIR		+= FreeRTOS_for_stm32f2/include

# Подставляем перед каждым путем директории префикс -I.
FREE_RTOS_PATH		:= $(addprefix -I, $(FREE_RTOS_DIR))

# Получаем список .c файлов ( путь + файл.c ).
FREE_RTOS_C_FILE	:= $(wildcard FreeRTOS_for_stm32f2/*.c)

# Получаем список .o файлов ( путь + файл.o ).
# Сначала прибавляем префикс ( чтобы все .o лежали в отдельной директории
# с сохранением иерархии.
FREE_RTOS_OBJ_FILE	:= $(addprefix build/obj/, $(FREE_RTOS_C_FILE))
# Затем меняем у всех .c на .o.
FREE_RTOS_OBJ_FILE	:= $(patsubst %.c, %.obj, $(FREE_RTOS_OBJ_FILE))

FREE_RTOS_INCLUDE_FILE	:= -include"./FreeRTOS_for_stm32f2/include/StackMacros.h"
# Сборка FreeRTOS.
# $< - текущий .c файл (зависемость).
# $@ - текущая цель (создаваемый .o файл).
# $(dir путь) - создает папки для того, чтобы путь файла существовал.
build/obj/FreeRTOS_for_stm32f2/%.obj:	FreeRTOS_for_stm32f2/%.c 
	@echo [CC] $<
	@mkdir -p $(dir $@)
	@$(CC) $(C_FLAGS) $(FREE_RTOS_PATH) $(USER_CFG_PATH) $(FREE_RTOS_INCLUDE_FILE) -c $< -o $@

#**********************************************************************
# Для сборки stm32f2_api.
#**********************************************************************
# Собираем все необходимые .h файлы библиотеки.
STM32_F2_API_H_FILE	:= $(shell find stm32f2_api/ -maxdepth 3 -type f -name "*.h" )

# Получаем список .cpp файлов ( путь + файл.c ).
STM32_F2_API_CPP_FILE	:= $(shell find stm32f2_api/ -maxdepth 3 -type f -name "*.cpp" )

# Директории библиотеки.
STM32_F2_API_DIR	:= $(shell find stm32f2_api/ -maxdepth 3 -type d -name "*" )

# Подставляем перед каждым путем директории префикс -I.
STM32_F2_API_PATH	:= $(addprefix -I, $(STM32_F2_API_DIR))

# Получаем список .o файлов ( путь + файл.o ).
# Сначала прибавляем префикс ( чтобы все .o лежали в отдельной директории
# с сохранением иерархии.
STM32_F2_API_OBJ_FILE	:= $(addprefix build/obj/, $(STM32_F2_API_CPP_FILE))
# Затем меняем у всех .c на .o.
STM32_F2_API_OBJ_FILE	:= $(patsubst %.cpp, %.obj, $(STM32_F2_API_OBJ_FILE))

# Сборка stm32f2_api.
# $< - текущий .c файл (зависемость).
# $@ - текущая цель (создаваемый .o файл).
# $(dir путь) - создает папки для того, чтобы путь файла существовал.
build/obj/stm32f2_api/%.obj:	stm32f2_api/%.cpp $(USER_CFG_H_FILE) $(FREE_RTOS_H_FILE)
	@echo [CPP] $<
	@mkdir -p $(dir $@)
	@$(CPP) $(CPP_FLAGS) $(STM32_F2_API_PATH) $(USER_CFG_PATH) $(FREE_RTOS_PATH) $(STM32_F2_API_OPTIMIZATION) -c $< -o $@

#**********************************************************************
# Сборка кода пользователя.
# Весь код пользователя должен быть в корневой папке.
#**********************************************************************
# Собираем все необходимые .h файлы библиотеки.
USER_H_FILE	:= $(wildcard ./*.h)	

# Получаем список .cpp файлов ( путь + файл.cpp ).
USER_CPP_FILE	:= $(wildcard ./*.cpp)	

# Директории библиотеки.
USER_DIR	:= ./

# Подставляем перед каждым путем директории префикс -I.
USER_PATH	:= $(addprefix -I, $(USER_DIR))

# Получаем список .o файлов ( путь + файл.o ).
# Сначала прибавляем префикс ( чтобы все .o лежали в отдельной директории
# с сохранением иерархии.
USER_OBJ_FILE	:= $(addprefix build/obj/, $(USER_CPP_FILE))
# Затем меняем у всех .c на .o.
USER_OBJ_FILE	:= $(patsubst %.cpp, %.obj, $(USER_OBJ_FILE))

# Сборка файлов пользователя.
# $< - текущий .c файл (зависемость).
# $@ - текущая цель (создаваемый .o файл).
# $(dir путь) - создает папки для того, чтобы путь файла существовал.
build/obj/%.obj:	%.cpp $(USER_CFG_H_FILE) $(FREE_RTOS_H_FILE)
	@echo [CPP] $<
	@mkdir -p $(dir $@)
	@$(CPP) $(CPP_FLAGS) $(USER_PATH) $(STM32_F2_API_PATH) $(USER_CFG_PATH) $(FREE_RTOS_PATH) $(USER_CODE_OPTIMIZATION) -c $< -o $@

#**********************************************************************
# Компановка проекта.
#**********************************************************************
PROJECT_OBJ_FILE	:= $(FREE_RTOS_OBJ_FILE) $(STM32_F2_API_OBJ_FILE) $(USER_OBJ_FILE)

build/$(PROJECT_NAME).elf:	$(PROJECT_OBJ_FILE)
	@echo 'Project Composition:'
	@echo ' '

$(LD):	$(LDFLAGS) -o build/$(PROJECT_NAME).elf
	@$(LD) $(LDFLAGS) $(PROJECT_OBJ_FILE)  -o build/$(PROJECT_NAME).elf
	@echo 'Finished building target: $@'
	@echo ' '

$(PROJECT_NAME).siz:	build/$(PROJECT_NAME).elf
	@echo 'Print Size:'
	@arm-none-eabi-size --format=berkeley "build/$(PROJECT_NAME).elf"
	@echo ' '

all:	$(PROJECT_NAME).siz
	@$(OBJDUMP) -D build/$(PROJECT_NAME).elf > build/$(PROJECT_NAME).asm
	@$(OBJCOPY) build/$(PROJECT_NAME).elf build/$(PROJECT_NAME).bin -O binary

Склонировать и попробовать собрать можно так:
git cline https://github.com/Vadimatorik/chiptune_player_2.22
cd chiptune_player_2.22
git submodule init 
git submodule update
make all

В версии 3.81 компиляция проходит без проблем. Однако в версии 4.2.1 при (и 4.1) компиляция падает на первом же .cpp файле, сообщая, что нет правила для сборки, хотя оно имеется и точно работает (на git-е, строка 130).
  • Вопрос задан
  • 357 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
файл FreeRTOS_for_stm32f2/FreeRTOS.h откоторого зависят все цели в следующем правиле не существует:
build/obj/%.obj:        %.cpp $(USER_CFG_H_FILE) $(FREE_RTOS_H_FILE)


Чтобы заработало должно быть
FREE_RTOS_H_FILE        := FreeRTOS_for_stm32f2/include/FreeRTOS.h

вместо
FREE_RTOS_H_FILE        := FreeRTOS_for_stm32f2/FreeRTOS.h
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы