Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Объясните пример Makefile


Автор: KVA 25.5.2010, 05:04
Надо собрать под Linux, QNX код на c++. Есть MinGW3.2.
Нашла в нете makefile, даже с комментариями. Только они мне не помогли. Вот он:
Код

# Префикс имени компилятора выбирается 
# исходя из настроек параметра CROSS
ifndef CROSS
CROSS = arm-elf
endif

# Для работы необходимо определить имя компилятора C, 
# ассемблер и утилиты перобразования объектных кодов
CC = $(CROSS)-gcc
AS = $(CROSS)-gcc
SIZE = $(CROSS)-size 
OBJCOPY = $(CROSS)-objcopy 
    
    #выбор набора программных возможностей, привязка аппаратуры
ifeq ($(DEVICE),BENDER)
    FEATURESET = USE_CNC
    CHIP  = AT91SAM9260
    ARCH  = ARM926
else ifeq ($(DEVICE),SH32LS2)
    CHIP = AT91SAM7S64
    ARCH  = ARM7TDMI
else
    CHIP  = AT91SAM9260
    ARCH  = ARM926
    FEATURESET = USE_CNC USE_OHCI
endif

    # выбор параметров оптимизации
ifeq ($(ARCH), ARM926)
    OPTIMIZATION += -march=armv5te
else
    OPTIMIZATION += -march=armv4t
endif
OPTIMIZATION +=-Os

# преобразование текстовых строк в набор определений
FEATURESET := $(filter-out $(FEATURE_DEL),$(FEATURESET))
FEATURESET += $(FEATURE_ADD)

FEATURESET_CFLAGS = $(patsubst %,-D%,$(FEATURESET))
$(foreach USE,$(FEATURESET),$(eval $(USE) = yes))

# Определение цели и вспомогательных папок
OUTPUT = $(DEVICE)-$(CHIP)-test

# правила включения директорий, флаги компиляции
INCLUDES = -I./ -I../ -Ihal/ -Icore/ -Iboard/$(BOARD)/
        
CFLAGS += -Wall
CFLAGS += $(OPTIMIZATION) $(INCLUDES) 
CFLAGS += -D$(CHIP) -D$(BOARD) $(FEATURESET_CFLAGS)

ASFLAGS = $(OPTIMIZATION) -D$(CHIP) -D__ASSEMBLY__ -c
LDFLAGS += -s $(OPTIMIZATION)

    # подключение файлов в проект
C_SOURCES += main.c
C_SOURCES += hal/aic.c hal/pio.c hal/pit.c hal/usart.c
C_SOURCES += core/config.c 

ifdef USE_OHCI
C_SOURCES += core/usb_ohci.c
endif

ifdef USE_CNC
C_SOURCES += cnc_machine.c
endif

# правила сборки по типам файлов
all: $(OBJ)

$(OBJ): $(ASM_SOURCES:.S=.o) $(C_SOURCES:.c=.o)
    $(CC) $(LDFLAGS) -n -o $(OUTPUT).elf $^
    $(SIZE) $(OUTPUT).elf

$(ASM_SOURCES:.S=.o): $(ASM_SOURCES)

clean:
    rm -rfv $(C_SOURCES:.c=.o) $(ASM_OBJECTS:.S=.o) $(OUTPUT).elf




Понятны только переменные CROSS, CC, AS,INCLUDES, CFLAGS, C_SOURCES.
Особенно не понятны:
#выбор набора программных возможностей, привязка аппаратуры
# выбор параметров оптимизации

Поясните мне, пожалуйста.


Автор: xvr 25.5.2010, 11:01
Цитата(KVA @  25.5.2010,  05:04 Найти цитируемый пост)
Особенно не понятны:
И чего тут непонятного?

Цитата

#выбор набора программных возможностей, привязка аппаратуры
Настройка (по переменной DEVICE) на конкретный чип (AT91SAM9260/AT91SAM7S64)
Цитата

# выбор параметров оптимизации
В зависимости от архитектуры чипа (задается неявно в предыдущем пункте) выбирает подмножество системы команд (для ARM926/ARM7TDMI)

Автор: GrishinUS 31.5.2010, 10:34
Код

all: $(OBJ)
$(OBJ): $(ASM_SOURCES:.S=.o) $(C_SOURCES:.c=.o)
    $(CC) $(LDFLAGS) -n -o $(OUTPUT).elf $^
    $(SIZE) $(OUTPUT).elf
$(ASM_SOURCES:.S=.o): $(ASM_SOURCES)

да, это сложный makefile если до этого не работали с ними.

Вот посмотрите
http://mrbook.org/tutorials/make/
http://linuxgazette.net/issue83/heriyanto.html
объясняется достаточно доходчиво.

Цитата

# выбор параметров оптимизации


march=armv5te

просто у компилятора есть такой ключ, см. http://linux.die.net/man/1/g++
фактически тут при выполнении условия 
Код

($(ARCH), ARM926)


к строке опций компилятора добавляется опция -march=armv5te.
Потом, когда компилятор будет вызван переменная OPTIMIZATION "раскроется" и будет вызвано что-то типа:
Код

g++ -Wall -O2 -march=armv5te


Цитата

#выбор набора программных возможностей, привязка аппаратуры


здесь тоже самое, переменные
Код

FEATURESET, CHIP, ARCH

содержат строковые значения, которые в конечном счете будут подставлены при вызове компилятора.
Например FEATURESET используется в переменной FEATURESET_CFLAGS, которая в свою очередь подставляется в CFLAGS.
Код

CFLAGS += -D$(CHIP) -D$(BOARD) $(FEATURESET_CFLAGS)
...


Если будут вопросы -- формулируйте что именно непонятно.

Автор: djamshud 31.5.2010, 10:47
Если эта тема еще не забыта, то вот хороший мануал по Makefile, фактически перевод info.

http://www.opennet.ru/docs/RUS/make_compile/make.html

Автор: KVA 31.5.2010, 12:59
Спасибо, разбираюсь smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)