GNU Make, error in shell function
От: ДимДимыч Украина http://klug.org.ua
Дата: 18.10.12 16:49
Оценка:
Коллеги, можно ли как-нибудь отследить ошибку при выполнении $(shell …) в Makefile? Достаточно, чтобы сам make в этом случае завершался с ошибкой.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re: GNU Make, error in shell function
От: Vain Россия google.ru
Дата: 19.10.12 01:44
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Коллеги, можно ли как-нибудь отследить ошибку при выполнении $(shell …) в Makefile? Достаточно, чтобы сам make в этом случае завершался с ошибкой.

Вообще, оно сохраняет то что скрипт/переменная напечатает: http://www.gnu.org/software/make/manual/html_node/Shell-Function.html
Можно попробовать проверить переменную $? сразу после вызова.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: GNU Make, error in shell function
От: ДимДимыч Украина http://klug.org.ua
Дата: 19.10.12 21:54
Оценка:
Здравствуйте, Vain, Вы писали:

V>Вообще, оно сохраняет то что скрипт/переменная напечатает: http://www.gnu.org/software/make/manual/html_node/Shell-Function.html


Это понятно, у меня с помощью shell читается содержимое файла в переменную. И нужно различать ситуации, когда файл отсутствует, когда есть, но пустой, и когда не удалось его прочитать.

V>Можно попробовать проверить переменную $? сразу после вызова.


Сейчас так и делаю:
$(shell [ -e "$1" ] && { sed 's/#.*$$//' "$1"; echo -e "\n$$?"; })
потом проверяю $(lastword), но как-то громоздко получилось, хотелось бы упростить.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[3]: GNU Make, error in shell function
От: Vain Россия google.ru
Дата: 20.10.12 01:39
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

V>>Можно попробовать проверить переменную $? сразу после вызова.

ДД>Сейчас так и делаю:
$(shell [ -e "$1" ] && { sed 's/#.*$$//' "$1"; echo -e "\n$$?"; })
потом проверяю $(lastword), но как-то громоздко получилось, хотелось бы упростить.

ну так оно вроде для коротенького кода, для длинного лучше таргет нормальный завести.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: GNU Make, error in shell function
От: ДимДимыч Украина http://klug.org.ua
Дата: 20.10.12 03:17
Оценка:
Здравствуйте, Vain, Вы писали:

V>ну так оно вроде для коротенького кода, для длинного лучше таргет нормальный завести.


Разве можно результат выполнения таргета получить в переменную?

Громоздкий не код в $(shell), а код проверки и откусывания результата выполнения:
define getlist
$(shell [ -e "$1" ] && { sed 's/#.*$$//' "$1"; echo -e "\n$$?"; })
endef

define read
$(eval _LIST:=$(call getlist,$1))\
$(if $(_LIST),$(if $(filter 0,$(lastword $(_LIST))),$(wordlist 1,$(shell expr $(words $(_LIST)) - 1),$(_LIST)),$(error $1)))
endef

CONTENT := $(call read,"file")


Подумал, может есть какой псевдо-таргет, который управляет проверкой выполнения $(shell), но в документации не нашел.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[5]: GNU Make, error in shell function
От: Vain Россия google.ru
Дата: 20.10.12 12:49
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Разве можно результат выполнения таргета получить в переменную?

Похоже ты не тот инструмент используешь, что мешает использовать сразу шелл?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: GNU Make, error in shell function
От: ДимДимыч Украина http://klug.org.ua
Дата: 20.10.12 17:52
Оценка:
Здравствуйте, Vain, Вы писали:

V>Похоже ты не тот инструмент используешь, что мешает использовать сразу шелл?


В make уже реализовано отслеживание зависимостей по меткам времени модификации. Если шелл ближе к императивной парадигме, то make ближе к функциональной. В билд-системе с кучей компонентов хочется, чтобы при небольшом изменении конфигурации одного из компонентов пересобиралось не всё, а только то, что зависит от измененной конфигурации.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[7]: GNU Make, error in shell function
От: Vain Россия google.ru
Дата: 21.10.12 04:53
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

V>>Похоже ты не тот инструмент используешь, что мешает использовать сразу шелл?

ДД>В make уже реализовано отслеживание зависимостей по меткам времени модификации. Если шелл ближе к императивной парадигме, то make ближе к функциональной. В билд-системе с кучей компонентов хочется, чтобы при небольшом изменении конфигурации одного из компонентов пересобиралось не всё, а только то, что зависит от измененной конфигурации.
Тот кусок кода который ты привел вроде никаких зависимостей не отслеживает
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[8]: GNU Make, error in shell function
От: ДимДимыч Украина http://klug.org.ua
Дата: 21.10.12 14:43
Оценка:
Здравствуйте, Vain, Вы писали:

V>Тот кусок кода который ты привел вроде никаких зависимостей не отслеживает


Отслеживает сам make, он как бы для этого и предназначен. А этот код предоставляет данные, на основании которых строится дерево зависимостей.

Вобщем, я заглянул в исходники make, там результат выполнения $(shell) в коде игнорируется, так что вопрос снят.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[9]: GNU Make, error in shell function
От: Vain Россия google.ru
Дата: 21.10.12 15:02
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

V>>Тот кусок кода который ты привел вроде никаких зависимостей не отслеживает

ДД>Отслеживает сам make, он как бы для этого и предназначен. А этот код предоставляет данные, на основании которых строится дерево зависимостей.
ДД>Вобщем, я заглянул в исходники make, там результат выполнения $(shell) в коде игнорируется, так что вопрос снят.
Ну так я тебе сразу предлагал это в шелле делать, а его можно и из таргета вызывать.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: GNU Make, error in shell function
От: ДимДимыч Украина http://klug.org.ua
Дата: 21.10.12 15:07
Оценка:
Здравствуйте, Vain, Вы писали:

V>Ну так я тебе сразу предлагал это в шелле делать, а его можно и из таргета вызывать.


В смысле, в отдельном шелл-скрипте, который вызывается в рецепте? Тогда результат выполнения только через промежуточный файл забирать, а этого тоже не хотелось бы.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[11]: GNU Make, error in shell function
От: Vain Россия google.ru
Дата: 21.10.12 19:38
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

V>>Ну так я тебе сразу предлагал это в шелле делать, а его можно и из таргета вызывать.

ДД>В смысле, в отдельном шелл-скрипте, который вызывается в рецепте? Тогда результат выполнения только через промежуточный файл забирать, а этого тоже не хотелось бы.
Если тебе промежуточный файлы мешают, то как то вообще странно использовать make.

CONTENT := $(call read,"file")

[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[12]: оффтоп
От: ДимДимыч Украина http://klug.org.ua
Дата: 22.10.12 05:27
Оценка:
Здравствуйте, Vain, Вы писали:

V>Если тебе промежуточный файлы мешают, то как то вообще странно использовать make.


Позволь уж я сам решу, каким инструментом в каком случае следует пользоваться. Я задал конкретный вопрос, подразумевающий однозначный ответ.
Но спасибо за попытку помощи и потраченное время.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.