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

 
 
 
Reply to this topicStart new topic
> Make
Злодей
сообщение Sep 15 2009, 07:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



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,
# а я имел в виду выполнять её только если нет файла.
# Спасибо.


Сообщение отредактировал Злодей - Sep 15 2009, 07:47
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Sep 15 2009, 07:56
Сообщение #2


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Может, сочтёте полезным:
Код
# Create object directory if needed
ifeq (${wildcard $(OBJECTDIR)},)
DUMMY := ${shell mkdir $(OBJECTDIR)}
endif
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Sep 15 2009, 07:59
Сообщение #3


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Злодей @ Sep 15 2009, 11:46) *
Код
$(FILENAME): force_create

Убрать?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 15 2009, 07:59
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Код
filename = file.txt

create: $(filename)

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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Злодей
сообщение Sep 15 2009, 08:06
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Цитата(AHTOXA @ Sep 15 2009, 11:59) *
Код
filename = file.txt

create: $(filename)

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

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

Спасибо smile.gif
Go to the top of the page
 
+Quote Post
boldgambler
сообщение Dec 9 2009, 12:06
Сообщение #6





Группа: Участник
Сообщений: 6
Регистрация: 26-04-09
Пользователь №: 48 288



решил не создавать отдельную тему, тут спрошу

имеем 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 не встречается.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 9 2009, 13:59
Сообщение #7


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(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 встречаются нередко.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 9 2009, 14:32
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(boldgambler @ Dec 9 2009, 14:06) *
вопрос: откуда берется первая строка?
и каким образом в нее попадает CFLAGS (если его менять, то это видно) ?
Существует некоторое количество "правил по умолчанию".

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
boldgambler
сообщение Dec 10 2009, 09:02
Сообщение #9





Группа: Участник
Сообщений: 6
Регистрация: 26-04-09
Пользователь №: 48 288



Цитата
Как попросили вызвать avr-gcc, так make и сделал.

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

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

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

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

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

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

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

мне бы просто хотелось объектники в отдельную папку запихать а не валить кучей в папку с мэйком, для этого надо правило явно описать и создать директорию сначала командами, правильно?

Сообщение отредактировал boldgambler - Dec 10 2009, 09:08
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 10 2009, 09:56
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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 $@


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
boldgambler
сообщение Dec 10 2009, 10:36
Сообщение #11





Группа: Участник
Сообщений: 6
Регистрация: 26-04-09
Пользователь №: 48 288



угу , уже вычитал из того дока что вы дали ссылку 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, 10:37
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 10 2009, 11:14
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(boldgambler @ Dec 10 2009, 12:36) *
или практичнее в цели директории добавлять?
У меня получалось, что без директорий он исходники пытался искать в директории объектников.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:32
Рейтинг@Mail.ru


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