Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Make
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Злодей
Makefile
Код
#    Здравствуйте! Хочу что бы файл $(FILENAME) создавался по следующему закону:
#  - При вызове цели create только если файл не существует.
#  - При вызове цели force_create даже если файл уже существует.

FILENAME = test.txt

create: $(FILENAME)

$(FILENAME): force_create

force_create:
    echo "file contents..." > $(FILENAME)

.PHONY : create force_create

# В этом маке я неправильно выразил своё желание.
# При вызове create всегда выполняется force_create,
# а я имел в виду выполнять её только если нет файла.
# Спасибо.
HARMHARM
Может, сочтёте полезным:
Код
# Create object directory if needed
ifeq (${wildcard $(OBJECTDIR)},)
DUMMY := ${shell mkdir $(OBJECTDIR)}
endif
andrew_b
Цитата(Злодей @ Sep 15 2009, 11:46) *
Код
$(FILENAME): force_create

Убрать?
AHTOXA
Код
filename = file.txt

create: $(filename)

force_create: delete $(filename)
    
delete:
    rm $(filename)

$(filename):
    echo "ddddd">$(filename)
Злодей
Цитата(AHTOXA @ Sep 15 2009, 11:59) *
Код
filename = file.txt

create: $(filename)

force_create: delete $(filename)
    
delete:
    rm $(filename)

$(filename):
    echo "ddddd">$(filename)

Спасибо smile.gif
boldgambler
решил не создавать отдельную тему, тут спрошу

имеем makefile для сборки под avr
Код
...
CFLAGS          = -mmcu=${CPU} -g -O0 -Wall
...
SOURCE            = $(wildcard $(addsuffix /*.c, $(SOURCE_DIRS)))
OBJECTS_DIRS  = $(notdir $(SOURCE))
OBJECTS           = $(OBJECTS_DIRS:.c=.o)
...
${NAME}.elf: ${OBJECTS}
    ${CC} -mmcu=${CPU} -o $@ ${OBJECTS} ${LDFLAGS}
...


так вот, ответом на это служит
Цитата
avr-gcc -mmcu=atmega32 -g -O0 -Wall -c -o main.o ../src/main.c
avr-gcc -mmcu=atmega32 -o test.elf main.o


вопрос: откуда берется первая строка?
и каким образом в нее попадает CFLAGS (если его менять, то это видно) ?
ну и "-c -o" тоже нигде в makefile не встречается.
mdmitry
Цитата(boldgambler @ Dec 9 2009, 15:06) *
решил не создавать отдельную тему, тут спрошу

имеем makefile для сборки под avr
Код
...
CFLAGS          = -mmcu=${CPU} -g -O0 -Wall
...
SOURCE            = $(wildcard $(addsuffix /*.c, $(SOURCE_DIRS)))
OBJECTS_DIRS  = $(notdir $(SOURCE))
OBJECTS           = $(OBJECTS_DIRS:.c=.o)
...
${NAME}.elf: ${OBJECTS}
    ${CC} -mmcu=${CPU} -o $@ ${OBJECTS} ${LDFLAGS}
...



вопрос: откуда берется первая строка?
и каким образом в нее попадает CFLAGS (если его менять, то это видно) ?
ну и "-c -o" тоже нигде в makefile не встречается.

Как попросили вызвать avr-gcc, так make и сделал. Вы привели не весь makefile, в нем обычно определяется тим контроллера, его частота и флаги запуска gcc. Имеет смысл ознакомится с документацией на make, есть на русском языке перевод.
У Вас определены файлы для сборки (SOURCE), ключи компилятора (CFLAGS) и другие макро для make. Есть правило для сборки цели (${NAME}.elf: ${OBJECTS}). Все это подробно описано в документации.
Поищите по форуму, вопросы о makefile встречаются нередко.
Сергей Борщ
Цитата(boldgambler @ Dec 9 2009, 14:06) *
вопрос: откуда берется первая строка?
и каким образом в нее попадает CFLAGS (если его менять, то это видно) ?
Существует некоторое количество "правил по умолчанию".

Чтение документации "от корки до корки" дает много интересной и полезной информации.
boldgambler
Цитата
Как попросили вызвать avr-gcc, так make и сделал.

нет, я попросил одно, а он сделал два smile.gif

Цитата
Вы привели не весь makefile, в нем обычно определяется тим контроллера, его частота и флаги запуска gcc. Имеет смысл ознакомится с документацией на make, есть на русском языке перевод.

есть все это .. для этого "..." и вставил, только к чему это остальное для моего вопроса. вот и не привел.

Цитата
Существует некоторое количество "правил по умолчанию".

вот я так и думал, хотел получить подтверждение ... жаль только не на русском описание.
спасибо.

Цитата
Чтение документации "от корки до корки" дает много интересной и полезной информации.

прочитал "Эффективное использование GNU Make", не подумал что он там это опустит.

мне бы просто хотелось объектники в отдельную папку запихать а не валить кучей в папку с мэйком, для этого надо правило явно описать и создать директорию сначала командами, правильно?
Сергей Борщ
Цитата(boldgambler @ Dec 10 2009, 11:02) *
мне бы просто хотелось объектники в отдельную папку запихать а не валить кучей в папку с мэйком, для этого надо правило явно описать и создать директорию сначала командами, правильно?
Да. И в целях эти объектники должны быть с путем. примерно так (заимствовано у ReAl, полные версии в исходниках gcc-avr порта scmRTOS):
Код
OUTDIR = release
OBJDIR = $(OUTDIR)/obj
LSTDIR = $(OUTDIR)/lst
DEPDIR = $(OUTDIR)/dep

##
........
CFLAGS += -MD -MP -MT $(OBJDIR)/$(*F).o -MF $(DEPDIR)/$(@F).d

## Source files
SRCDIRS = . $(addprefix $(PROJ_SRCTOP)/,$(MODULES))
CSRC    = $(wildcard $(addsuffix /*.c,$(SRCDIRS)))
CPPSRC    = $(wildcard $(addsuffix /*.cpp,$(SRCDIRS)))
ASRC    = $(wildcard $(addsuffix /*.S,$(SRCDIRS)))

## Objects that must be built in order to link
OBJ = $(addprefix $(OBJDIR)/,$(notdir $(CSRC:.c=.o) $(CPPSRC:.cpp=.o) $(ASRC:.S=.o) ))

$(OBJ) : makefile

## Compile
$(OBJDIR)/%.o: %.c
    @echo Compiling: $<
    $(CC) $(INCLUDES) $(CFLAGS) -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.c=.lst)) -c  $< -o $@
$(OBJDIR)/%.o: %.cpp
    @echo Compiling: $<
    $(CC) $(INCLUDES) $(CFLAGS) -Wa,-ahlmsd=$(LSTDIR)/$(notdir $(<:.cpp=.lst)) -c  $< -o $@
$(OBJDIR)/%.o: %.S
    @echo Assembling: $<
    $(CC) $(INCLUDES) $(ASMFLAGS) -c  $< -o $@
$(OBJDIR)/%.o: %.s
    @echo Assembling: $<
    $(CC) $(INCLUDES) $(ASMFLAGS) -c  $< -o $@

##Link
$(ELF): $(OBJ) $(LDSCRIPT)
    @echo Linking: $@
     $(CC) $(LDFLAGS) $(OBJ) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $@
boldgambler
угу , уже вычитал из того дока что вы дали ссылку smile.gif
только я чуть более просто описал, я еще не сильно понимаю мудреные мэйки

Код
SOURCE            = $(wildcard $(addsuffix /*.c, $(SOURCE_DIRS)))
SOURCE_LIST    = $(notdir $(SOURCE))
OBJECTS_LIST   = $(SOURCE_LIST:.c=.o)
OBJECTS           = $(addprefix obj/, $(OBJECTS_LIST))

OBJ_DIR         = obj
LIST_DIR        = list
OUT_DIR         = out

all: create_dir ${NAME}.elf ${NAME}.hex

create_dir:
    -mkdir obj
    -mkdir out
    -mkdir list

%.o: %.c
    $(CC) -c $(CFLAGS) $< -o ${OBJ_DIR}/$@
        
${NAME}.elf: ${OBJECTS_LIST}
    ${CC} -mmcu=${CPU} -o ${OUT_DIR}/$@ ${OBJECTS} ${LDFLAGS}

${NAME}.hex: ${NAME}.elf
    $(OBJCOPY) -O ihex ${OUT_DIR}/$^ ${OUT_DIR}/$@

не коряво получилось?
или практичнее в цели директории добавлять?
правда он каждый раз ругается на то что директории уже есть.

а так .. будем читать "GNU Make Программа управления компиляцией" ... для полного понимания (правда объем немалый smile.gif ).
а пока перейдем к скрипту линкера и загрузчику, ... пошел искать по ним тему какую нить где спрашивать буду smile.gif
Сергей Борщ
Цитата(boldgambler @ Dec 10 2009, 12:36) *
или практичнее в цели директории добавлять?
У меня получалось, что без директорий он исходники пытался искать в директории объектников.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.