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

 
 
> 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
 
Start new topic
Ответов
SysRq
сообщение Dec 7 2008, 22:02
Сообщение #2


Чайник, 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
Сообщение #3


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

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

Сообщений в этой теме
- demiurg_spb   gnu make   Dec 7 2008, 12:00
- - SysRq   Разве? Тут скорее makefile вообще отсутствует, или...   Dec 7 2008, 14:18
|- - demiurg_spb   Я ещё раз проверил: КодSRC = SRC += main.c .... SR...   Dec 7 2008, 15:15
- - SysRq   Правим makefile от MFile из WinAVR:Код# Define pro...   Dec 7 2008, 16:13
|- - demiurg_spb   Цитата(SysRq @ Dec 7 2008, 19:13) Такое в...   Dec 7 2008, 17:01
|- - SysRq   Цитата(demiurg_spb @ Dec 7 2008, 20:01) Н...   Dec 7 2008, 18:27
|- - demiurg_spb   Во! Это уже очень хорошо. Спасибо! Но для ...   Dec 7 2008, 18:36
|- - SysRq   Насчет разделения мусора и исходников мысль отличн...   Dec 8 2008, 00:27
- - axle   Мне кажется надо делать так: КодSRC = file1.c file...   Dec 8 2008, 10:14
|- - demiurg_spb   Код$(SRC): @echo File not found...   Dec 8 2008, 10:32
||- - demiurg_spb   Сообщение: "makefile:439: *** Missing separat...   Dec 10 2008, 15:32
|- - SysRq   Цитата(axle @ Dec 8 2008, 13:14) Мне каже...   Dec 8 2008, 10:52
- - ReAl   Оно, конечно, оффтопик, но я давно пошёл другим пу...   Dec 11 2008, 08:26


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

 


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


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