реклама на сайте
подробности

 
 
> Makefile мечты, распихивание результатов сборки по каталогам.
zemlemer
сообщение Jun 8 2015, 15:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 10-06-08
Пользователь №: 38 190



Добрый день.

Хочется странного. На данный момент есть вполне рабочий makefile со следующим кодом.

CODE

# C source files
CFILES = $(filter %.c, $(SRC))
# Assembly source files
ASMFILES = $(filter %.S, $(SRC))

# Object files
COBJ = $(CFILES:.c=.o)
SOBJ = $(ASMFILES:.S=.o)
OBJ = $(SOBJ) $(COBJ)

##### OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC))

#all: $(SRC) $(PROJECT).elf $(PROJECT).bin $(PROJECT).lst

$(PROJECT).lst: $(PROJECT).elf
$(OD) -h -S $(PROJECT).elf > $(PROJECT).lst
$(SZ) --format=berkeley $(PROJECT).elf

$(PROJECT).bin: $(PROJECT).elf
$(CP) -O binary $(PROJECT).elf $@

$(PROJECT).elf: $(OBJ)
$(CC) $(LDFLAGS) $(OBJ) -o $@

$(COBJ): %.o: %.c
$(CC) -c $(FEATURES) $(INC) $(CFLAGS) $< -o $@

$(SOBJ): %.o: %.S
$(CC) -c $(ASFLAGS) $< -o $@

$(SRC) - полное имя файла, включая путь. Данная конструкция нормально собирает проект.
Хочется, чтобы объектные файлы лежали в отдельном каталоге: например /obj/.
Написал следующую конструкцию:
CODE

# Object files
COBJ := $(addprefix $(OBJDIR)/,$(notdir $(CSRC:.c=.o)))
AOBJ := $(addprefix $(OBJDIR)/,$(notdir $(ASRC:.S=.o)))

$(PROJECT).lst: $(PROJECT).elf
$(OD) -h -S $(PROJECT).elf > $(PROJECT).lst
$(SZ) --format=berkeley $(PROJECT).elf

$(PROJECT).bin: $(PROJECT).elf
$(CP) -O binary $(PROJECT).elf $@

$(PROJECT).elf: OBJDIR $(AOBJ) $(COBJ)
$(CC) $(LDFLAGS) $(AOBJ) $(COBJ) -o $@

OBJDIR:
$(MKDIR) $(OBJDIR)

$(AOBJ): $(OBJDIR)/%.o : %.S
$(CC) -c $(ASFLAGS) $< -o $@

$(COBJ): $(OBJDIR)/%.o : %.c
$(CC) -c $(FEATURES) $(INC) $(CFLAGS) $< -o $@


При этом получаю ругань на то, что отсутствует цель для ассемблерного файла (.S). Для "сишных", как я понимаю, тоже нет цели. Как мне уговорить make "увидеть" цель для компиляции ассемблерных и сишных исходников?
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Jun 9 2015, 06:07
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Какие требования к make.exe?

Начал прикручивать - в files.mk перечислил пару .c файлов, запускаю (с ключём -d) и вижу:
Код
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for Windows32
Reading makefiles...
Reading makefile `Makefile.arm'...
Reading makefile `makef.mk' (search path) (no ~ expansion)...
makef.mk:309: *** missing separator.  Stop.


Другие сборки make.exe (но той же версии) ведут себя точно так же.

Сообщение отредактировал Genadi Zawidowski - Jun 9 2015, 06:10
Go to the top of the page
 
+Quote Post
501-q
сообщение Jun 9 2015, 07:31
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 24-02-09
Из: Екатеринбург
Пользователь №: 45 296



Цитата(Genadi Zawidowski @ Jun 9 2015, 11:07) *
Какие требования к make.exe?


У меня 4.1. Директива undefine появилась только в 3.82 (http://stackoverflow.com/questions/20384656/can-we-undefine-unset-a-variable-in-makefile). Кроме того, функция $(file ...) в 3.81 или отсутствует или работает как-то не так.

Подредактировал, теперь работает в 3.81.

Илья

Цитата(501-q @ Jun 9 2015, 11:58) *
Подредактировал, теперь работает в 3.81.


Проверил, работает один раз ;-)

В 4.1 по-другому выполняется обработка строк, передаваемых в вызываемую программу.

Вот этот фрагмент:
@$(SED) -e "1s/^.*:/\n$(subst /,\/,$@) $(subst /,\/,$@).d : /" \
-e "\$s/$/ \\\\\n $(subst /,\/,$($(strip $(1))_MK_FILES_{:content:}lt;))\n/" \
< $@.p.d >> $@.d
в 3.81 добавляет строки "\n" вместо символов перевода строки. В 4.1 добавляет переводы строк, как и задумано.

Илья

Цитата(501-q @ Jun 9 2015, 12:17) *
в 3.81 добавляет строки "\n" вместо символов перевода строки. В 4.1 добавляет переводы строк, как и задумано.


Вот вариант, который в 3.81 работает правильно.

@$(SED) -e "1s/^.*:/\n$(subst /,\/,$@) $(subst /,\/,$@).d : /" \
-e "\$s/$/ \\\\\\\\\n $(subst /,\/,$($(strip $(1))_MK_FILES_{:content:}lt;))\n/" \
< $@.p.d >> $@.d



Сообщение отредактировал 501-q - Jun 10 2015, 00:25
Прикрепленные файлы
Прикрепленный файл  arm_test.rar ( 213.55 килобайт ) Кол-во скачиваний: 13
 
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 12:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016