Makefile 从 for 循环更新全局变量
Makefile update global variable from for loop
我正在尝试从 for loop
更新 makefile
中的全局变量
但它似乎没有按预期工作。
PYHTONPATH := /xyz/something/:/bla/bla/python:${PYTHONPATH}
check:
@for f in $(shell ls /path_to_dir/ ); do \
PYHTONPATH+=/path_to_dir/$$f: ; \
echo $$NEW_PYTHON_PATH ; \ # here it is showing properly
done
@echo "${PYHTONPATH}" # here it prints the older value
我需要从 for 循环更新全局变量。
任何线索将不胜感激。
提前致谢:)
确保您了解 shell 变量和 make 变量之间的区别。在代码片段的第一行中,您分配了一个名为 PYHTONPATH
的 make 变量。在您的 check
规则的配方中,您将一个字符串连接到名为 PYHTONPATH
的 shell 变量,这与具有相同名称的 make 变量无关。因为它可能在 for 循环开始时未定义,所以在最后,它可能会将所有路径存储在 /path_to_dir/
中,仅此而已。然后你的第一个 echo 将打印 NEW_PYTHON_PATH
shell 变量(因为双 $$
)。由于未定义,我不明白为什么它会“正确”打印。你应该换行。在你最后的回声中,你打印了 make ,未修改的变量(一个 $
)。请注意,即使您在最后一条语句中将 $
加倍,因为它是不同配方的一部分,由不同的 shell 执行,它可能不会像您预期的那样运行,它可能会再次打印只有一个换行符。
尝试这个,而不是,并得到,也许更好地理解 shell 变量和 make 变量之间的区别:
MAKEVAR := /xyz/something/:/bla/bla/python:${PYTHONPATH}
check:
@SHELLVAR="$(MAKEVAR)"; \
for f in /path_to_dir/*; do \
SHELLVAR+="/path_to_dir/$$f:"; \
echo "$$SHELLVAR"; \
done; \
echo "Final value of SHELLVAR = $$SHELLVAR"
echo "Value of SHELLVAR in a different shell = $$SHELLVAR"
echo "Make variable MAKEVAR = $(MAKEVAR)"
我正在尝试从 for loop
更新 makefile
中的全局变量
但它似乎没有按预期工作。
PYHTONPATH := /xyz/something/:/bla/bla/python:${PYTHONPATH}
check:
@for f in $(shell ls /path_to_dir/ ); do \
PYHTONPATH+=/path_to_dir/$$f: ; \
echo $$NEW_PYTHON_PATH ; \ # here it is showing properly
done
@echo "${PYHTONPATH}" # here it prints the older value
我需要从 for 循环更新全局变量。
任何线索将不胜感激。
提前致谢:)
确保您了解 shell 变量和 make 变量之间的区别。在代码片段的第一行中,您分配了一个名为 PYHTONPATH
的 make 变量。在您的 check
规则的配方中,您将一个字符串连接到名为 PYHTONPATH
的 shell 变量,这与具有相同名称的 make 变量无关。因为它可能在 for 循环开始时未定义,所以在最后,它可能会将所有路径存储在 /path_to_dir/
中,仅此而已。然后你的第一个 echo 将打印 NEW_PYTHON_PATH
shell 变量(因为双 $$
)。由于未定义,我不明白为什么它会“正确”打印。你应该换行。在你最后的回声中,你打印了 make ,未修改的变量(一个 $
)。请注意,即使您在最后一条语句中将 $
加倍,因为它是不同配方的一部分,由不同的 shell 执行,它可能不会像您预期的那样运行,它可能会再次打印只有一个换行符。
尝试这个,而不是,并得到,也许更好地理解 shell 变量和 make 变量之间的区别:
MAKEVAR := /xyz/something/:/bla/bla/python:${PYTHONPATH}
check:
@SHELLVAR="$(MAKEVAR)"; \
for f in /path_to_dir/*; do \
SHELLVAR+="/path_to_dir/$$f:"; \
echo "$$SHELLVAR"; \
done; \
echo "Final value of SHELLVAR = $$SHELLVAR"
echo "Value of SHELLVAR in a different shell = $$SHELLVAR"
echo "Make variable MAKEVAR = $(MAKEVAR)"