У меня есть make-файл, который я использую как в Linux, так и в Windows, используя цепочку инструментов arm-none-eabi. Проект содержит файлы ассемблера с расширением .s или .S в зависимости от необходимости препроцессора.
В Linux правила make-файла могут легко различать эти целевые файлы, и для каждого из них используются отдельные правила. Нет проблем в этом мире.
Под Windows правила, которые я определил для обработки файлов .S, не обрабатывают эти файлы. С другой стороны, мое правило для файлов .s хорошо работает.
Ошибка возвращается:
make: Pas de règle pour fabriquer la cible « obj/secmodes.S », nécessaire pour « imgm_essProcMode.elf ». Arrêt.
No rule to build the target obj/secmode.S, required for imgm_essProcMode.elf. Stop
Я не понимаю, почему путь к источнику неверен: все .s, .S, .c находятся в папке "src"; папка "obj" используется для сгенерированных объектов ...
Я понял, что окна не заботятся о случае расширения! Кажется, это сбивает с толку (gnu) make.
Итак, мой вопрос, можем ли мы по-разному управлять .s и .S в make-файле, выполняемом в среде Windows? Если да, то как мои правила должны быть изменены для этого?
Вот несколько снимков моего make-файла:
AOBJ_FILES := $(addprefix obj/,$(notdir $(ASM_FILES:.s=.o)))
ASOBJ_FILES := $(addprefix obj/,$(notdir $(ASMS_FILES:.S=.o)))
ALL_OBJ_FILES := $(COBJ_FILES) $(AOBJ_FILES) $(ASOBJ_FILES)
.../...
image : $(BINEXECUTABLE)
all : $(EXECUTABLE)
obj/%.o: src/%.S
$(TCPREFIX)-gcc $(AOPTgcc) -Xassembler -acdghln=$(basename $@).lst -o $@ $<
obj/%.o: src/%.s
$(TCPREFIX)-as $(AOPT) $< -o $@ -acdghln=$(basename $@).lst
obj/%.o: src/%.c
$(TCPREFIX)-gcc $(COPT) -Wa,-acdghln=$(basename $@).lst $(DEFINES) -o $@ $<
$(EXECUTABLE): $(ALL_OBJ_FILES)
$(TCPREFIX)-gcc $(LOPTgcc) $^ -o $@
Спасибо за любую подсказку!