Модификация Makefile для создания файлов сборки - PullRequest
0 голосов
/ 12 января 2020

Я новичок ie в make, и я не могу добавить вывод .asm в уже существующий make-файл. Я хотел бы сделать makefile для создания файлов .asm (используя AVR-G CC -S) для всех файлов. c. Не могли бы вы помочь мне разобраться?

    # AVR model
MMCU = atmega16
# Clock frequency
F_CPU = 16000000
# Programmer model
PROGRAMMER = usbasp
PROGRAMMER_PORT = usb
# Output file name
PROJECT = main
# Sources files
SOURCES = main.c\
                cross/drivers/internals/GPIO/GPIO.c \
                cross/drivers/internals/PPI/PPI8Bit.c \
                cross/drivers/internals/USART/USART_0.c \

CC = avr-gcc
ASM = avr-gcc
OBJCOPY = avr-objcopy
CDEFS = -DF_CPU=$(F_CPU)UL
CFLAGS = $(CDEFS)
CFLAGS += -mmcu=$(MMCU) -g -Os -Wall
OBJS = $(SOURCES:.c=.o)
ASMS = $(SOURCES:.c=.s)

$(PROJECT).hex: $(PROJECT).out
    $(OBJCOPY) -O ihex -R .eeprom $(PROJECT).out $(PROJECT).hex

$(PROJECT).out:  $(OBJS)
    $(CC)  $(CFLAGS) $^ -o $@ -lm
$.o:%.c
    $(CC) $(CFLAGS) $< -o $@
##???
$.s:%.c
    $(CC) $(CFLAGS) -S $< -o $@

asm: $(OBJS_S)

flash: $(PROJECT).hex
    avrdude -c $(PROGRAMMER) -P $(PROGRAMMER_PORT) -p $(MMCU) -U flash:w:$(PROJECT).hex

clean:
    rm -f $(OBJS)
    rm -f $(PROJECT).out
    rm -f $(PROJECT).hex

.PHONY: clean program_flash

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 января 2020

При обращении за помощью всегда указывайте версию make, точную команду (вырезать и вставить), которую вы ввели, и точное описание того, в чем именно заключается проблема (с выходными данными вырезания и вставки, если необходимо). Сказать «я не могу это сделать» не поможет нам понять, в чем проблема.

Это определенно не правильно:

$.o:%.c
  ...
$.s:%.c

Шаблонные правила Использование % на обеих сторонах :, например:

%.o:%.c
  ...
%.s:%.c

Во-вторых, вы помещаете свои файлы asm в эту переменную:

ASMS = $(SOURCES:.c=.s)

но затем вы указываете совершенно другую переменную в качестве предпосылки цели asm:

asm: $(OBJS_S)

Эта переменная OBJS_S никогда не определяется, насколько я вижу.

0 голосов
/ 14 января 2020

При компиляции файла C / C ++ (или с любого другого языка в этом отношении) G CC всегда создает промежуточный код сборки. Это сохраняется в некотором каталоге tmp (за исключением того, что вы используете -pipe). Если вы хотите, чтобы G CC сохранил эту промежуточную сборку в файлах .s, есть опция -save-temps (в дополнение к промежуточной сборке также сохраняются предварительно обработанные источники в .i (C) и соответственно .ii (C ++). )). Вы можете добавить дополнительные комментарии, которые содержат код C / C ++ для руководства; используйте -fverbose-asm для этого. В случае, если вы используете LTO (-flto) et c., Новые версии компилятора записывают только lto gibberi sh в сборку (которая будет выбрана компилятором lto во время компоновки). Чтобы сохранить ассемблерный код в этом случае, добавьте -ffat-lto-objects. Однако обратите внимание, что это не последний asm, когда вы связываете с -flto (который вызывает компилятор lto, который компилирует lto gibberi sh в asm). Окончательный asm можно увидеть с -save-temps в некоторых дампах ltrans. Вы также можете использовать -save-temps=obj и -save-temps=src, которые сохраняют промежуточные файлы рядом с вашими объектными файлами, соответственно. ваши исходные файлы (в случае, если это имеет значение).

...