gnumake奇怪的重定向问题

时间:2011-04-14 14:37:23

标签: ubuntu makefile gnu-make

我有一个系统,我在其中生成一个makefile,它在Mac OS X下完美运行。当我在Linux下运行它时,我遇到了一个奇怪的问题。我设法将我的makefile简化为一个非常简单的例子:

    compile:
        gcc -o prog *.c &> compile__

    chm:
        chmod u=rwx,g=rwx,o= prog

    both0:
        gcc -o prog *.c &> compile__ ;  \
        chmod u=rwx,g=rwx,o= prog

    both1:
        gcc -o prog *.c ;  \
        chmod u=rwx,g=rwx,o= prog

想法是编译文件然后更改其权限。如果我执行命令序列:

    make compile
    make chm
一切正常。但是,如果我执行:

    make both0

我收到消息:

    chmod: cannot access `prog': No such file or directory

并且权限不会更改。另一方面,如果我执行:

    make both1

权限已正确更改。唯一的区别是两个0下的重定向“&> compile__”我删除了两个。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

&> compile__

是可移植的重定向。在bash中,它重定向标准错误和标准输出,我认为这是你的意图。其他炮弹可能会用它做不同的事情。特别是,破折号背景命令(&),并重定向标准输出(> compile__)。 chmod在编译完成之前执行并创建prog。重定向标准错误和标准输出可以使用cc -o prog *.c > compile__ 2>&1进行移植。

(为什么它在mac上运行?可能是另一个以不同方式解释&>的shell,可能是编译器先前打开文件,可能是竞争条件略有不同。)

答案 1 :(得分:0)

另一种解决方案是为GNU make指定要使用的 shell 。手册的Section 5.3.1有关于此的信息。例如,以下

export SHELL=`which bash`

Makefile 中似乎在Ubuntu / Debian上获得Gnu Make 3.8.1以选择 bash 作为shell。

其他问题是所有shell 内置的的行为存在差异,例如echoprintftest等。这些问题的深奥选项在基于Debian的系统上make下运行时,内置的可能会神秘地失败。