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)"