Защо $$PWD вместо $PWD в makefile на TI x-loader за omap устройства

Започнах да анализирам TI X-Loader, включително неговите makefiles. Намерих следните редове в горния makefile:

TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)

и

ifeq (include/config.mk,$(wildcard include/config.mk))
...

Относно първия ред: знам, че "$PWD" означава стойността на PWD (работната директория)
Моят въпрос:
защо двойният знак за долар в този специален случай?

Относно втория ред: Опитвам се да разбера какво се сравнява и защо. Вече изредих ръчното обяснение за заместващи символи на GNU MAKE. Все нещо ми липсва.

Моите въпроси:
за какво е "$(заместващият знак"?
Кои config.mk файлове точно се сравняват един с друг?
Защо се сравняват? (този въпрос е повече за структурата на makefile)

Благодаря за помощта предварително.

Мартин


person martin    schedule 13.01.2014    source източник
comment
1. Избягвайте да публикувате множество запитвания в един и същи въпрос. 2. $$ се използва за препратка към променлива на shell, $ за препратка към променлива make. 3. Редът wildcard изглежда излишен.   -  person devnull    schedule 13.01.2014


Отговори (1)


В make избягвате знак за долар (така че да не се разширява от make), като използвате два знака за долар ($$). Така че, ако напишете $PWD, тогава make ще интерпретира $P като препратка към променлива make, която вероятно не е зададена и е празна, и резултатът (предаден на обвивката) ще бъде WD. Ако използвате $$PWD, тогава знакът за долар се екранира и резултатът, предаден на командата на обвивката, ще бъде $PWD, което е това, което искате.

За втория ред функцията wildcard, наред с други неща, ще се разшири до празния низ, ако няма файлове, които съответстват на заместващия знак. Така че това извикване на wildcard тества дали файлът include/config.mk съществува или не. Ако го направи, тогава резултатът от функцията ще бъде include/config.mk и тестът ifeq ще бъде верен. Ако не стане, тогава резултатът ще бъде празен низ и тестът ifeq ще бъде false.

Нищо тук не сравнява съдържанието или времевите клейма или нещо друго на include/config.mk. Това е чисто "този файл съществува ли?" тест.

person MadScientist    schedule 13.01.2014
comment
Благодаря за вашият отговор. Разбрах това. - person martin; 13.01.2014