|
|
  |
gnu make, make.exe: *** No rule to make target... |
|
|
|
Dec 7 2008, 12:00
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Я думаю, что это может заинтересовать многих. Очень часто в больших проектах содержится множество исходных файлов. И если в списке SRC указан файл, отсутствующий в путях проекта, выскакивает лишь сообщение: Цитата make.exe: *** No rule to make target... Вопрос: как организовать вывод более внятного сообщения с указанием имени ненайденного файла? Я так понимаю, что надо до сборки прописать правило в котором происходит проверка доступа к каждому файлу из SRC списка. А как это сделать?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 7 2008, 15:15
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Я ещё раз проверил: Код SRC = SRC += main.c .... SRC += main2.c Файла main2.c не существует. Получаю: No rule to make target... GCC 4.3.0 (winavr) Без Код SRC += main2.c все ОК.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 7 2008, 16:13
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Правим makefile от MFile из WinAVR: Код # Define programs and commands. CHECKEXIST = fexist
# Default target. all: begin checkfiles gccversion sizebefore build sizeafter end
# Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. checkfiles: @$(CHECKEXIST) $(SRC)
begin: @echo @echo $(MSG_BEGIN)
end: @echo $(MSG_END) @echo Софтина fexist.exe (положить туда куда есть ссылки в %PATH%): Код #include <stdio.h>
int main(int argc, char *argv[]) { FILE *fp;
for(int i = 1; i < argc; i++) { fp = fopen(argv[i], "r"); if(fp == NULL) { printf("File not found: %s\r\n", argv[i]);
return 1; } else fclose(fp); }
return 0; } Имеем (запускают из pn2): Цитата > "make.exe" all
-------- begin -------- File not found: keyboard1.c
make.exe: *** [checkfiles] Error 1
> Process Exit Code: 2 > Time Taken: 00:00 Такое вот решение
|
|
|
|
|
Dec 7 2008, 17:01
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(SysRq @ Dec 7 2008, 19:13)  Такое вот решение  Так слишком ВЛОБ и нестандартно  Надо чтоб и под win и под nix одинаково шло. Наверняка должна быть какя-нибудь bash/sh утилта. Юниксойды АУ!:) Я тут порылся немного и нашёл в WinAVR\utils\bin\test.exe Судя по test.exe --help может подойти: test.exe -e filename Или touch.exe может подойти. Одним словом, нужна помощ профессионалов...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 7 2008, 18:27
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(demiurg_spb @ Dec 7 2008, 20:01)  Наверняка должна быть какя-нибудь bash/sh утилта. Логично... Код checkfiles: @for srcfile in $(SRC); do if test ! -e $$srcfile; then echo File not found: $$srcfile; echo; fi; done Цитата > "make.exe" all
-------- begin -------- File not found: keyboard1.c
avr-gcc (WinAVR 20080610) 4.3.0 Copyright © 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
make.exe: *** No rule to make target `main.elf', needed by `elf'. Stop.
> Process Exit Code: 2 > Time Taken: 00:01
Сообщение отредактировал SysRq - Dec 7 2008, 18:31
|
|
|
|
|
Dec 7 2008, 22:02
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Мнэээ.. ну, если там примерно так задается: Код SOURCE_DIRS = . "C:\TEMP" "C:\Documents and Settings\admin\Рабочий стол" "D:\MyFolder"
VPATH = $(SOURCE_DIRS) То где-то так (форум перенесет, но надо в одну строчку): Код checkfiles: @let errorstop=0; for srcfile in $(SRC); do let filesfound=0; for srcpath in $(VPATH); do if test -e "$$srcpath/$$srcfile"; then let filesfound++; fi; done; if test $$filesfound == 0; then echo File not found: $$srcfile; let errorstop++; fi; done; if test $$errorstop != 0; then echo; exit 1; fi Тестировать толком не на чем, я makefile с VPATH не видел ни разу  -- Поправил чу-чуть, чтобы все файлы проверял на наличие, а не по одному выцеплять..
Сообщение отредактировал SysRq - Dec 7 2008, 22:32
|
|
|
|
|
Dec 7 2008, 23:47
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Можно раскидать всё по каталогам и не боятся что какой-либо файл в SRC списке с ошибкой в имени! Также в исходниках программы можно подключать любые заголовочные файлы из SOURCE_DIRS не указывая полного или относительного пути, они все будут найдены автоматически! Ещё одно достоинство - в директориях SOURCE_DIRS никогда не будет появляться мусор. Вот как выглядит основной результат: Код # List source directories here: SOURCE_DIRS = . SOURCE_DIRS += ../../arclib/avr SOURCE_DIRS += ../../arclib/ic_drivers SOURCE_DIRS += ../../arclib/common SOURCE_DIRS += ../../arclib/common/modbus
VPATH := $(SOURCE_DIRS)
CFLAGS += -Wa,-adhlns=$(addprefix $(OBJDIR)/, $(notdir $(<:%.c=%.lst))) CFLAGS += $(addprefix -I, $(SOURCE_DIRS))
CPPFLAGS += -Wa,-adhlns=$(addprefix $(OBJDIR)/, $(notdir $(<:%.cpp=%.lst))) CPPFLAGS += $(addprefix -I, $(SOURCE_DIRS))
CPPFLAGS += -Wa,-adhlns=$(addprefix $(OBJDIR)/, $(notdir $(<:%.cpp=%.lst))) CPPFLAGS += $(addprefix -I, $(SOURCE_DIRS))
ASFLAGS = -Wa,-adhlns=$(addprefix $(OBJDIR)/, $(notdir $(<:%.S=%.lst))),-gstabs,--listing-cont-lines=100
# Define all object files. OBJ := $(SRC:%.c=%.o) $(CPPSRC:%.cpp=%.o) $(ASRC:%.S=%.o) OBJ := $(notdir $(OBJ)) OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
# Define all listing files. LST := $(SRC:%.c=%.lst) $(CPPSRC:%.cpp=%.lst) $(ASRC:%.S=%.lst) LST := $(notdir $(LST)) LST := $(addprefix $(OBJDIR)/,$(LST))
# Define Messages # English MSG_COMPILING = Compiling C: #..... MSG_FILE_NOT_FOUND = File not found:
# Default target. all: begin testsrc gccversion sizebefore build sizeafter end
# Eye candy. # AVR Studio 3.x does not check make's exit code but relies on # the following magic strings to be generated by the compile job. testsrc: @let errorstop=0; \ for srcfile in $(SRC); do \ let filesfound=0; \ for srcpath in $(VPATH); do \ if test -e "$$srcpath/$$srcfile"; then let filesfound++; fi; \ done; \ if test $$filesfound == 0; then echo $(MSG_FILE_NOT_FOUND) $$srcfile; let errorstop++; fi; \ done;\ if test $$errorstop != 0; then echo; exit 1; fi
begin: @echo @echo $(MSG_BEGIN)
end: @echo $(MSG_END) @echo
# Listing of phony targets. .PHONY : all testsrc begin finish end sizebefore sizeafter gccversion \ build elf hex eep lss sym coff extcoff \ clean clean_list program debug gdb-config Остался последний вопрос: exit 1 - это стандартно? Будет ли работать не под win?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 8 2008, 10:14
|
Частый гость
 
Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167

|
Мне кажется надо делать так: Код SRC = file1.c file2.c .... $(SRC): @echo File not found: $@ @exit 1 Хотя не понятно чем не устраивает сообщение: make: *** Нет правила для сборки цели `file.c', требуемой для `file.o'.
|
|
|
|
|
Dec 8 2008, 10:32
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Код $(SRC): @echo File not found: $@ @exit 1 Так ругается на строку 2 makefile:439: *** Missing separator Stop. Цитата(axle @ Dec 8 2008, 13:14)  Хотя не понятно чем не устраивает сообщение: make: *** Нет правила для сборки цели `file.c', требуемой для `file.o'. Я такого сообщения не встречал ни разу. Этого и хотелось добиться.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 10 2008, 15:32
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Сообщение: "makefile:439: *** Missing separator Stop." появлялось, если вместо табуляции я ставил пробелы перед @echo... Так всё хорошо: Код # check all src files to be accessible. testsrc: $(SRC): @echo $(MSG_FILE_NOT_FOUND) $@ @exit 1 Спасибо за красивое решение!
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 11 2008, 08:26
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Оно, конечно, оффтопик, но я давно пошёл другим путём - я не перечисляю в makefile файлы проекта вообще. Компилируется всё, что находится в текущем каталоге, в котором makefile, и в присоединённых модулях (которые в своих каталогах). Т.е. указываю только каталоги (кроме текущего, он подключается по умолчанию) и "особые" файлы, которые генерируются на лету и поэтому не обязательно присутствуют на момент запуска make, в следствие чего не попадают в wildcard makefile проекта кроме прочего содержит, например Код # путь к каталогу, от которого начинаются используеміе каталоги исходников, # относительно каталога с makefile PROJ_SRCTOP=..
common_makefiles=$(PROJ_SRCTOP)/makefiles
MODULES = c_lib/avr t02bios c_lib/spi/at45 \ c_lib/xmodem_crc c_lib/cbuf c_lib/avr/comm_m128
# это для ГЕНЕРИРУЕМЫХ исходников, скажем, файлов перекодированых строк, создаваемых # утилитой pyLCDstring либо пожатых и конвертнутых в вид массивов во флеше прошивок мелких FPGA EXTRA_CSRC = lcd_messages.c
# ... # тут прочее всякое нужное # ...
###### you should not need to change the following lines ############# # keep order! # avreal.make must be included after gcc-avr because of TRGPGM definition include $(common_makefiles)/gcc-avr.mak include $(common_makefiles)/avreal.mak
###### additional dependencies # must be after included makefiles because of main target placed in gcc-avr.mak lcd_messages.c : lcd_messages.lcd lcd_messages.h : lcd_messages.lcd общий gcc-avr.mak помимо прочего содержит Код OBJDIR := $(PROJ_SRCTOP)/../obj LSTDIR := $(PROJ_SRCTOP)/../lst EXEDIR := $(PROJ_SRCTOP)/../exe
SRCDIRS := . $(addprefix $(PROJ_SRCTOP)/,$(MODULES)) INCDIRS := $(SRCDIRS)
CSRC := $(EXTRA_CSRC) $(wildcard $(addsuffix /*.c,$(SRCDIRS))) CPPSRC := $(EXTRA_CPPSRC) $(wildcard $(addsuffix /*.cpp,$(SRCDIRS))) ASRC := $(EXTRA_ASMCSRC) $(wildcard $(addsuffix /*.S,$(SRCDIRS)))
CFLAGS += $(addprefix -I,$(INCDIRS))
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|