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

 
 
 
Reply to this topicStart new topic
> gnu make, make.exe: *** No rule to make target...
demiurg_spb
сообщение Dec 7 2008, 12:00
Сообщение #1


неотягощённый злом
******

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



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 7 2008, 14:18
Сообщение #2


Чайник, 1 литр
****

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



Разве? Тут скорее makefile вообще отсутствует, или написан неверно.

--

Нет, вы правы! No rule to make target...

Сообщение отредактировал SysRq - Dec 7 2008, 14:25
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 7 2008, 15:15
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 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
все ОК.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 7 2008, 16:13
Сообщение #4


Чайник, 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


Такое вот решение rolleyes.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 7 2008, 17:01
Сообщение #5


неотягощённый злом
******

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



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 7 2008, 18:27
Сообщение #6


Чайник, 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 7 2008, 18:36
Сообщение #7


неотягощённый злом
******

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



Во! Это уже очень хорошо. Спасибо!
Но для полноценного использования необходимо чтобы поиск происходил и во всех "остальных" путях указаннвх в:
VPATH := $(SOURCE_DIRS), а то это неприменимо к проектам распределённым по директориям, коих большинство...
И ещё один вопрос (для большей лучшести).
Как сделать, чтобы при нахождении отсутствующего файла сразу прекращалось
выполнение сценария makefile (а не выводилась версия gcc и остальное).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 7 2008, 22:02
Сообщение #8


Чайник, 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 не видел ни разу unsure.gif

--

Поправил чу-чуть, чтобы все файлы проверял на наличие, а не по одному выцеплять..

Сообщение отредактировал SysRq - Dec 7 2008, 22:32
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 7 2008, 23:47
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 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?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 8 2008, 00:27
Сообщение #10


Чайник, 1 литр
****

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



Насчет разделения мусора и исходников мысль отличная, надо перенять smile.gif

Цитата(demiurg_spb @ Dec 8 2008, 02:47) *
exit 1 - это стандартно? Будет ли работать не под win?

Это тоже команда sh. Это всё его команды.
Go to the top of the page
 
+Quote Post
axle
сообщение Dec 8 2008, 10:14
Сообщение #11


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

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



Мне кажется надо делать так:
Код
SRC = file1.c file2.c
....
$(SRC):
    @echo File not found: $@
    @exit 1

Хотя не понятно чем не устраивает сообщение:
make: *** Нет правила для сборки цели `file.c', требуемой для `file.o'.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 8 2008, 10:32
Сообщение #12


неотягощённый злом
******

Группа: Свой
Сообщений: 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'.
Я такого сообщения не встречал ни разу. Этого и хотелось добиться.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Dec 8 2008, 10:52
Сообщение #13


Чайник, 1 литр
****

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



Цитата(axle @ Dec 8 2008, 13:14) *
Мне кажется надо делать так...

Пойду-ка я читать доки по make. Эффектно! Не то что я выдумал..
twak.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 10 2008, 15:32
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 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
Спасибо за красивое решение!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 11 2008, 08:26
Сообщение #15


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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))


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:29
Рейтинг@Mail.ru


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