gpt4 book ai didi

shell - Makefiles : how to get a file name for a rule target from outside, 以可移植的方式

转载 作者:行者123 更新时间:2023-12-04 16:18:02 25 4
gpt4 key购买 nike

我需要获取一些外部数据以在 Makefile 中形成输出文件名。

在 GNU Make 我可以做这样的事情:

NAME=$(shell some_commands)
$(NAME).out: file.in
compile "$<" -o "$@"

其他一些规则有 $(NAME).out作为先决条件,所以我需要 $(NAME).out作为目标。我不能在这里使用替换+引号,因为这不是由 shell 解释的。

我从 BSD Make 手册页看到,在 Mac OS X 上我应该能够做这样的事情(虽然我还不能测试):
NAME!=some_commands
$(NAME).out: file.in
compile "$<" -o "$@"

有没有一种方法可以以便携的方式做这种事情?

我不想生成 Makefile 并使构建过程变得困惑。我虽然包含,但它们在 Make 版本之间也有不同的语法。

最佳答案

我可以提出几个技巧。都是基于some_commands的外包执行到规则机构,并确保他们的结果将被正确利用。

  • 那是我最喜欢的。包括您自己创建的 makefile,其中包含 $(NAME) 的规则.在处理开始时,它将被重新创建并出现正确的目标。问题是这个 makefile 的创建过程是在 shell 命令中完成的:
    include aux_makefile
    .PHONY aux_makefile
    aux_makefile:
    NAME=`some_commands` ; ( \
    echo $$NAME.out: file.in ; \
    echo "\t rm aux_makefile" ; \
    echo "\t compile ..." ) >$@
  • 第一个的变体:制作一个包装 makefile,它首先写入辅助 makefile,然后递归调用原始 makefile,辅助 makefile 被包含在其中。不需要特殊的构建目标。
  • 使用静态名称创建一个虚拟目标;它将代表 $(NAME).out . IE。:
    all: dummy    # Instead of all: $(NAME).out
    dummy: file.in
    NAME=`some_commands`; compile "$<" -o "$$NAME"
    touch $@
  • 关于shell - Makefiles : how to get a file name for a rule target from outside, 以可移植的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2403881/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com