Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GNU Make-动态创建的变量名_C++_C_Makefile_Gnu Make - Fatal编程技术网

C++ GNU Make-动态创建的变量名

C++ GNU Make-动态创建的变量名,c++,c,makefile,gnu-make,C++,C,Makefile,Gnu Make,我有一个makefile设置,它接受一个命令行参数,该参数在构建时被解析以确定要使用哪个编译器,CPULIST 因此,我计划通过以下命令进行构建:makeallcpulist=“armx86”。然后,我创建了一些虚假规则,以便进行所有的循环,并有效地执行以下操作: make all CPULIST=x86 make all CPULIST=arm 规则: .PHONY: all all: @echo "Detected CPULIST:${CPULIST_DETECTED}"

我有一个makefile设置,它接受一个命令行参数,该参数在构建时被解析以确定要使用哪个编译器,
CPULIST

因此,我计划通过以下命令进行构建:
makeallcpulist=“armx86”
。然后,我创建了一些虚假规则,以便
进行所有的
循环,并有效地执行以下操作:

make all CPULIST=x86
make all CPULIST=arm
规则:

.PHONY: all
all:
    @echo "Detected CPULIST:${CPULIST_DETECTED}"
    @echo "CPULIST:${CPULIST}"
    @for cpu in $(CPULIST_DETECTED); do         \
        echo "CPU:$${cpu}";                      \
        variant_$${cpu}=abc;                        \
        echo "variant_$${cpu}: $${variant_x86}"; \
        $(MAKE) build CPULIST=$$cpu;             \
    done
    @true

.PHONY: build
build: sanity_check $(TARGET)
    @true
如果这是一个bash脚本,我将使用
variant_${cpu}
动态创建变量名和赋值,例如:

variant_x86=abc;
variant_arm=abc;
看来我没有得到正确的转义序列,至少在GNU make语法中是这样

为list_algorithms.o生成依赖项文件

Detected CPULIST:x86 arm
CPULIST:test arm x86
CPU:x86
/bin/sh: 3: variant_x86=abc: not found
variant_x86:
make[1]: Entering directory `/home/svn/public/lib/libMYLib'
CPULIST:x86
我似乎有两个问题:

  • 我的字符串扩展似乎是makefile在扩展后试图执行的
  • 我似乎没有为
    variant\u x86
    分配任何内容,因此语法已关闭
  • 我如何解决这两个问题


    谢谢。

    这与make无关。你试图做的事情是不合法的,正如你在shell中写的那样。您不能像这样在shell中创建“动态变量名”:

    $ a=foo
    $ xxx$a=baz
    xxxfoo=baz: command not found
    
    如果要在shell中执行此操作,必须使用eval:

    $ a=foo
    $ eval xxx$a=baz
    $ echo $xxxfoo
    baz
    
    因此,请重写您的生成规则:

    all:
            @echo "Detected CPULIST:${CPULIST_DETECTED}"
            @echo "CPULIST:${CPULIST}"
            @for cpu in $(CPULIST_DETECTED); do          \
                echo "CPU:$${cpu}";                      \
                eval variant_$${cpu}=abc;                \
                echo "variant_$${cpu}: $${variant_x86}"; \
                $(MAKE) build CPULIST=$$cpu;             \
            done
    

    此外,在配方末尾添加
    @true
    也没有用。

    这与制作无关。你试图做的事情是不合法的,正如你在shell中写的那样。您不能像这样在shell中创建“动态变量名”:

    $ a=foo
    $ xxx$a=baz
    xxxfoo=baz: command not found
    
    如果要在shell中执行此操作,必须使用eval:

    $ a=foo
    $ eval xxx$a=baz
    $ echo $xxxfoo
    baz
    
    因此,请重写您的生成规则:

    all:
            @echo "Detected CPULIST:${CPULIST_DETECTED}"
            @echo "CPULIST:${CPULIST}"
            @for cpu in $(CPULIST_DETECTED); do          \
                echo "CPU:$${cpu}";                      \
                eval variant_$${cpu}=abc;                \
                echo "variant_$${cpu}: $${variant_x86}"; \
                $(MAKE) build CPULIST=$$cpu;             \
            done
    

    此外,在食谱末尾添加一个
    @true
    也没有用。

    我忘了一件事。如何将
    echo“variant\u${cpu}:$${variant\ux86}”
    更新为类似
    echo“variant\u${cpu}:$$${variant\u${cpu}”
    ?您必须再次使用
    eval
    :在shell提示下,它将是:
    eval echo variant\u${cpu}:${variant\u${cpu}
    ,因此在makefile中,您必须将美元符号加倍,例如:
    eval echo variant\u\$${cpu}:\$${variant\u$$${cpu}}
    。基本上,编写makefile配方的方法是:首先让命令在shell提示符下工作,然后将其放入makefile配方中,并将美元符号加倍。谢谢。最后一件事:我如何知道何时使用
    $$
    而不是
    \$$
    ?您可以使用
    $$
    来转义shell中通常是
    $
    的内容。
    \$
    构造用于引用变量展开,因此eval不会在第一个过程中展开它,而shell会在第二个过程中展开它。如果您感兴趣,我这里有一个相关但独立的makefile问题:我忘了一件事。如何将
    echo“variant\u${cpu}:$${variant\ux86}”
    更新为类似
    echo“variant\u${cpu}:$$${variant\u${cpu}”
    ?您必须再次使用
    eval
    :在shell提示下,它将是:
    eval echo variant\u${cpu}:${variant\u${cpu}
    ,因此在makefile中,您必须将美元符号加倍,例如:
    eval echo variant\u\$${cpu}:\$${variant\u$$${cpu}}
    。基本上,编写makefile配方的方法是:首先让命令在shell提示符下工作,然后将其放入makefile配方中,并将美元符号加倍。谢谢。最后一件事:我如何知道何时使用
    $$
    而不是
    \$$
    ?您可以使用
    $$
    来转义shell中通常是
    $
    的内容。
    \$
    构造用于引用变量展开,因此eval不会在第一个过程中展开它,而shell会在第二个过程中展开它。如果您感兴趣,我这里有一个相关但独立的makefile问题: