2013-10-08 42 views
0

本地我使用MacOS上的GNU Make 3.8(i386-apple-darwin11.3.0)如何将shell命令的结果存储在makefile中?

我试图根据目录中的文件生成一堆测试文件。

现在我能够抓住这些文件的基本名字,但我不能弄清楚如何将它们存储在一个变量,所以我可以生成与基本名称另一个文件

TEST_FILES = lib/*.js 

build-test: 
    @mkdir -p tests 
    [email protected] file in $(TEST_FILES); do \ 
     echo $$file; \ 
     MYNAMES = $(basename $$file .js) \ 
     echo $MYNAMES; \ 
    done 

我想接着使用STDOUT流的输出创建一堆名为$ MYNAME.log的文件。

我卡上获取名称到变量,这些解决方案I've foundso far扔错误对我来说,当我试图实现他们

+0

目前尚不清楚你正在尝试做什么,你试图做什么或者是否使用了一种好方法。假设你有'lib/foo.js'和'lib/bar.js',那么呢? – Beta

+0

@beta应该创建一个名为test/foo.log的文件test/bar.log – qodeninja

回答

3

这条线在这里

echo $MYNAMES; \ 

将在值替代的变量M,就像你写了$(M)YNAMES一样。你想

echo $$MYNAMES; \ 

改为。

此行

MYNAMES = $(basename $$file .js) \ 

不能工作 - 您使用的是只有一次前的子shell被调用执行规则执行make命令basename,而file是一个shell变量,它改变的每次迭代循环。你的意思可能是$$(basename $$file),它会以“$(basename $ file)”的形式传递给shell。该shell将插入运行basename命令的结果。

确保您确实想将它们存储在shell变量中,而不是作为make变量。了解其差异至关重要。

+0

简而言之:您需要转义Makefile中的每个$,以便在shell脚本中使用。 – Coroos

+0

@Gavin_Smith我也试过这种方法 - \t MYNAMES = $$(basename $$ file); \ echo $ MYNAMES; \ - 然后我得到“/ bin/bash:MYNAMES:command not found” – qodeninja

+0

变量名和'='符号之间不应有空格(这与分配make变量的语法不同)。 –

相关问题