2014-09-16 3 views
1

Я недавно попробовал установить приложение из источника (dwb на Debian Wheezy, если это имеет значение). Во время установки, это захлестнет проблему некоторых проблем, но мне кажется, что я встречал эту зависимость. I wasn't the only person with this problem. Который заставил меня заглянуть в config.mk проекта.Что, собственно, делает «pkg-config --exists»?

В Config.mk я нашел несколько блоков, которые выглядели так:

REQPKG=foo 
ifeq ($(shell pkg-config --exists $(REQPKG) && echo 1),1) 
LIBS=$(REQPKG) 
else 
$(error Cannot find $(REQPKG)) 
endif 

который, кажется, очень интуитивным счетчик для меня. Я искал и искал. Прочтите страницу руководства, обратитесь к Google. Прочтите все, что я могу о pkg-config, и ничего не нашел. Страница руководства особенно разочаровывает, поскольку она просто перечисляет «-exists» в качестве флага и не дает описания (я думаю, это объясняет себя как -help).

Я начал думать, что pkg-config Debian имел ошибку, в которой он возвращал обратные результаты. Но, как оказалось, «pkg-config --exists» должен возвращать 0 (то есть False), когда запрашиваемый пакет присутствует.

Почему это? Разве это не приведет к созданию более чистого кода для возврата True/False или 1/0, указывающего наличие необходимого пакета? Вы можете сделать это:

if (shell pkg-config --exists foo) 
/*do things*/ 
else 
/*throw error*/ 
endif 

Вместо того, что смотрит на меня, как:

ifeq (($(not(True) && True)),True) 
/*do things*/ 
else [...] 

Что я упускаю о PKG-конфигурации? Это действует так, потому что это утилита оболочки и какое-то странное соглашение относительно них?

Кроме того, почему документация настолько разрежена? Я пропустил ресурс, который даст информацию, которую я искал?

PS У меня нет никакого реального опыта работы с C, поэтому, если мой пример кода выглядит странно ...

ответ

1

Много команд UNIX и библиотечные функции возвращают 0 в случае успеха. Это «разумный дефолт» в этом мире.

Именно поэтому, к примеру ,. прототип «Привет, мир!» в C заканчивается «return 0;» а не «return 1» - отличные от нуля коды считаются ошибочными. (Не то, чтобы кто-то, вероятно, будет смотреть на возвращаемое значение вашего HW, но все же ...)

2

pkg-config --exists не создает никаких выходных данных он просто возвращает с кодом выхода из 0 успеха и 1 для отказа.

&& в оболочке запускает правую сторону, когда левая сторона возвращает успех.

Так что линия работает pkg-config --exists и тогда и только тогда он возвращает истину (код возврата 0) тогда echo S A 1 в качестве вывода. Затем 1 сравнивается с 1 в ifeq.

И почему вы не можете сделать что-то более простое здесь, ответ заключается в том, что make (если не в целевых правилах) не имеет дело с кодами возврата программы. В частности, $(shell) платит код возврата команды оболочки, которая вообще не обращает внимания.

Лично я бы, наверное, написано, что тест либо как:

ifeq ($(shell pkg-config --exists $(REQPKG); echo $?),0) 

или что-то вроде

REQPKG=foo 
REQPKG:=$(shell pkg-config --exists $(REQPKG) && echo '$(REQPKG)') 
ifneq ($(REQPKG),) 
    LIBS=$(REQPKG) 
else 
    $(error ...) 
fi 

 Смежные вопросы

  • Нет связанных вопросов^_^