|
Make |
|
|
|
Sep 15 2009, 07:46
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Sep 15 2009, 08:06
|

Частый гость
 
Группа: Участник
Сообщений: 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) Спасибо
|
|
|
|
|
Dec 9 2009, 12:06
|
Группа: Участник
Сообщений: 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 не встречается.
|
|
|
|
|
Dec 9 2009, 13:59
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 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 встречаются нередко.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Dec 9 2009, 14:32
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 10 2009, 09:02
|
Группа: Участник
Сообщений: 6
Регистрация: 26-04-09
Пользователь №: 48 288

|
Цитата Как попросили вызвать avr-gcc, так make и сделал. нет, я попросил одно, а он сделал два  Цитата Вы привели не весь makefile, в нем обычно определяется тим контроллера, его частота и флаги запуска gcc. Имеет смысл ознакомится с документацией на make, есть на русском языке перевод. есть все это .. для этого "..." и вставил, только к чему это остальное для моего вопроса. вот и не привел. Цитата Существует некоторое количество "правил по умолчанию". вот я так и думал, хотел получить подтверждение ... жаль только не на русском описание. спасибо. Цитата Чтение документации "от корки до корки" дает много интересной и полезной информации. прочитал "Эффективное использование GNU Make", не подумал что он там это опустит. мне бы просто хотелось объектники в отдельную папку запихать а не валить кучей в папку с мэйком, для этого надо правило явно описать и создать директорию сначала командами, правильно?
Сообщение отредактировал boldgambler - Dec 10 2009, 09:08
|
|
|
|
|
Dec 10 2009, 09:56
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 10 2009, 10:36
|
Группа: Участник
Сообщений: 6
Регистрация: 26-04-09
Пользователь №: 48 288

|
угу , уже вычитал из того дока что вы дали ссылку  только я чуть более просто описал, я еще не сильно понимаю мудреные мэйки Код 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 Программа управления компиляцией" ... для полного понимания (правда объем немалый  ). а пока перейдем к скрипту линкера и загрузчику, ... пошел искать по ним тему какую нить где спрашивать буду
Сообщение отредактировал boldgambler - Dec 10 2009, 10:37
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|