Я пытаюсь написать функцию make, чтобы коснуться / создать пустой файл и / или установить разрешения, пользователя и группу, где это возможно, или предупредить, если нет.Тем не менее, каждая условная проверка в моей функции, кажется, оценивается как true.
Основы моего Makefile:
INSTALL_USER := fileUser
INSTALL_GROUP := fileGroup
.PHONY: test
test:
$(call touchFile,~/test.ini)
define touchFile
$(eval fileName := $(strip $(1)))
-touch $(fileName)
-chmod -c 664 $(fileName)
$(info filename info $(fileName))
$(info $(shell stat -c "%a %U:%G" $(fileName)))
$(if ifeq "foo" "bar", @echo match is broken, @echo match works)
$(if ifneq "foo" "bar", @echo match works, @echo match is broken)
$(if ifneq ($(shell stat -c %a $(fileName)),664), $(warning Error - $(fileName) does not have expected permissions of 664))
-chgrp -c $(INSTALL_GROUP) $(fileName)
$(if ifneq ($(shell stat -c %G $(fileName)),$(INSTALL_GROUP)), $(warning Error - $(fileName) does not belong to $(INSTALL_GROUP) group))
-chown -c $(INSTALL_USER) $(fileName)
$(if ifneq ($(shell stat -c %U $(fileName)),$(INSTALL_USER)), $(warning Error - $(fileName) does not belong to $(INSTALL_USER) user))
endef
Запуск make test
выходных данных
filename info ~/test.ini
664 myUserName:myGroup
Makefile:7: Error - ~/test.ini does not have expected permissions of 664
Makefile:7: Error - ~/test.ini does not belong to common group
Makefile:7: Error - ~/test.ini does not belong to netserve user
touch ~/test.ini
chmod -c 664 ~/test.ini
match is broken
match works
chgrp -c fileGroup ~/test.ini
changed group of `/home/myUserName/test.ini' to fileGroup
chown -c fileUser ~/test.ini
chown: changing ownership of `/home/myUserName/test.ini': Operation not permitted
make: [test] Error 1 (ignored)
IМы рассмотрели / попробовали следующее:
- $ (если ...) вычисляется во время компиляции, прежде чем функция будет вызвана с параметром.Но жестко
ifeq "foo" "bar"
также дает неверный результат.Кроме того, $(info ...)
правильно оценивает $(fileName)
во время компиляции. - Документация на самом деле не дает примеров, поэтому в дополнение к
$(if ifeq...)
я также попробовал $(ifeq ...)
, который, казалось, был проигнорирован. - "Нефункциональный"
if
(то есть ifeq
без $(if...)
) внутри функции дает /bin/sh: ifeq: command not found
.
Может ли кто-нибудь помочь определить, почему мои условные выражения не работают так, как я ожидаю (или почему я ожидаю не того)?
Предостережение: Я знаю, что все еще есть ошибкинужно решить, если файл не существует, но это должно быть тривиально по сравнению с этим препятствием.