|
не работает рекурсивный вызов make, make -C $dir |
|
|
|
Mar 30 2008, 21:44
|

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

|
Ситуация смешна. makefile: Код SUBDIRS = SUBDIRS += ./a SUBDIRS += ./b
all: for subdir in $(SUBDIRS); do echo ===== building $$subdir =====;$(MAKE) -C $$subdir all; done результат: Код for subdir in ./a ./b; do echo ===== building $subdir =====;C:/Programs/UNIX_U~1/make.EXE -C $subdir all; done ===== building ./a ===== make.EXE[1]: Entering directory `C:/tmp' for subdir in ./a ./b; do echo ===== building $subdir =====;C:/Programs/UNIX_U~1/make.EXE -C $subdir all; done ===== building ./a ===== make.EXE[1]: Entering directory `C:/tmp' for subdir in ./a ./b; do echo ===== building $subdir =====;C:/Programs/UNIX_U~1/make.EXE -C $subdir all; done ===== building ./a ===== make.EXE[1]: Entering directory `C:/tmp' for subdir in ./a ./b; do echo ===== building $subdir =====;C:/Programs/UNIX_U~1/make.EXE -C $subdir all; done и так до бесконечности. Вызов "вручную" make -C ./a работает. Эффект проявляется на двух компах, на двух других все работает. make на всех компах одинаковый, от WinAVR. make от yagarto ведет себя также. Винда ХР. Цитата GNU Make 3.81 Copyright © 2006 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.
This program built for i386-pc-mingw32 Что я мог поломать?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
 |
Ответов
|
Apr 2 2008, 08:34
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(Сергей Борщ @ Mar 31 2008, 00:44)  Ситуация смешна. makefile: Код SUBDIRS = SUBDIRS += ./a SUBDIRS += ./b
all: for subdir in $(SUBDIRS); do echo ===== building $$subdir =====;$(MAKE) -C $$subdir all; done А если так: Код SUBDIRS = SUBDIRS += ./a SUBDIRS += ./b
all: $(SUBDIRS)
$(foreach f, $(SUBDIRS), $(f)): @echo "===== building $@ =====" @$(MAKE) -C $@ all
.PHONY: all $(SUBDIRS) PS: Ваш вариант у меня работает на Linux.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 2 2008, 08:51
|

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

|
Цитата(amw @ Apr 2 2008, 11:34)  А если так: так работает. теперь пытаюсь понять, как аналогично добавить цель clean. Но хотелось победить исходный - слишком много файлов переписывать. Цитата(amw @ Apr 2 2008, 11:34)  PS: Ваш вариант у меня работает на Linux. И у меня работает на двух машинах с виндой. А на двух не работает. Пока только пришло в голову, что на машинах, где не работает, процы AMD, а где работает - Интел, но я не верю, что причина может быть в этом. Надо будет внимательне посмотреть, какие версии sh стоят на этих машинах.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 2 2008, 09:45
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(Сергей Борщ @ Apr 2 2008, 11:51)  так работает. теперь пытаюсь понять, как аналогично добавить цель clean. Код SUBDIRS = SUBDIRS += ./a SUBDIRS += ./b
CLEANS = $(foreach f, $(SUBDIRS), clean-$(f))
all: $(SUBDIRS)
$(foreach f, $(SUBDIRS), $(f)): @echo "$(SUBDIRS)" @echo "===== building $@ =====" @$(MAKE) -C $@ all
clean: $(CLEANS)
$(foreach f, $(CLEANS), $(f)): @echo "$(lastword $(subst -, , $@))" $(MAKE) -C $(lastword $(subst -, , $@)) clean
.PHONY: all $(SUBDIRS) clean $(CLEANS) В выражении Код $(lastword $(subst -, , $@)) ОДИН ПРОБЕЛ между запятыми. И так, на заметку, аргументы для echo лучше брать в кавычки, по крайней мере, если там есть пробелы. К стати, а echo используется откуда? Из Windows или из чего у Вас там юниксовое (cygwin, mingw).
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 2 2008, 12:14
|

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

|
Ну это слишком сложно... лишних 6 строчек вместо одной. Не, "это не наш метод" (с). Хм, кое-что проясняется. Цитата(amw @ Apr 2 2008, 12:45)  Кстати, а echo используется откуда? Из Windows или из чего у Вас там юниксовое (cygwin, mingw). Вот эта фраза натолкнула на исследования. Запускается гнутый echo, но даже выкидывая его результат не меняется. Попробовал на еще одной машине (проц интел). Поскольку там никаких гнутых инструментов не стоит, то скопировал в папку с makefile программы make.exe, sh.exe, echo.exe, библиотеку msys-1.0.dll. Получил тот же эффект - циклится до бесконечности. Запустил с той же флешки на своем компе (где все работало) - тоже циклится. Начал убирать по одному файлу. Выяснил такую закономерность: make.exe, sh.exe, msys-1.0.dll лежат в одной папке - работает неправильно. make.exe + msys-1.0.dll лежат в одной папке, sh.exe в другой - работает неправильно. make.exe лежит в одной папке, sh.exe + msys-1.0.dll в другой - все работает. make.exe в одной папке, sh.exe в другой, msys-1.0.dll в третьей - все работает. добавлено:make.exe + msys-1.0.dll лежат в одной папке, sh.exe + msys-1.0.dll в другой - все работает. О как... теперь понятно, почему на двух машинах работало - там make.exe лежал в отдельной папке, которая указана в path до папки WinAVR/utils/bin Осталось выяснить, чем вызвано такое странное поведение - какими-то еще установленными программами или это бага mingw. Учитывая, что на "чистой" машине поведение было неадекватным - скорее всего бага. версия sh.exe: GNU bash, version 2.04.0(1)-release (i686-pc-msys) Copyright 1999 Free Software Foundation, Inc. кто-нибудь из пользователей WinAVR может повторить эксперимент? Для этого надо приведенный makefile из поста №1 (восстановив табулятор перед for) положить в одну папку с make.exe, sh.exe и msys-1.0.dll и запустить make P.S. за кавычки спасибо, учту.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 2 2008, 19:26
|

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

|
Цитата(Сергей Борщ @ Apr 2 2008, 15:14)  Выяснил такую закономерность:
make.exe, sh.exe, msys-1.0.dll лежат в одной папке - работает неправильно. make.exe + msys-1.0.dll лежат в одной папке, sh.exe в другой - работает неправильно.
make.exe лежит в одной папке, sh.exe + msys-1.0.dll в другой - все работает. make.exe в одной папке, sh.exe в другой, msys-1.0.dll в третьей - все работает. Проблема решена окончательно заменой msys-1.0.dll из комплекта WinAVR на свежую из комплекта msys: MSYS-1.0.11-20080821-dll.tar.gz. Точнее, она давно решилась отказом от утилит из комплекта WinAVR в пользу свежих версий из msys, но сегодня решил проверить на всякий случай - действительно, замена msys-1.0.dll лечит описанный баг и в WinAVRовых. тот же mkdir 5.97 в свежем msys тоже работает. Видимо все проблемы были в dll
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Сергей Борщ не работает рекурсивный вызов make Mar 30 2008, 21:44 AHTOXA Цитата(Сергей Борщ @ Mar 31 2008, 02:44) ... Mar 31 2008, 03:25    amw Цитата(Сергей Борщ @ Apr 2 2008, 15:14) m... Apr 2 2008, 13:02     Сергей Борщ Цитата(amw @ Apr 2 2008, 16:02) По моему ... Apr 2 2008, 13:16      amw Цитата(Сергей Борщ @ Apr 2 2008, 16:16) П... Apr 2 2008, 13:35       AHTOXA Цитата(amw @ Apr 2 2008, 19:35) В пердиду... Apr 2 2008, 14:26       Сергей Борщ Цитата(amw @ Apr 2 2008, 16:35) В пердиду... Apr 2 2008, 14:39        amw Цитата(Сергей Борщ @ Apr 2 2008, 17:39) П... Apr 2 2008, 14:54         Сергей Борщ Цитата(amw @ Apr 2 2008, 17:54) Ну может ... Apr 2 2008, 18:22          ReAl Цитата(Сергей Борщ @ Apr 2 2008, 20:22) М... Apr 2 2008, 19:13           Сергей Борщ Цитата(ReAl @ Apr 2 2008, 22:13) Короче, ... Apr 2 2008, 19:23            ReAl Цитата(Сергей Борщ @ Apr 2 2008, 21:23) К... Apr 2 2008, 19:53             Сергей Борщ Цитата(ReAl @ Apr 2 2008, 22:53) Код... Apr 2 2008, 20:14 AHTOXA Проверил со сборкой от klen-а, работает нормально:... Apr 2 2008, 19:25
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|