在Makefile中使用Linux和MacOS

时间:2015-03-16 13:40:50

标签: linux macos sed makefile bsd

我正在编写一个Makefile,它可以在Linux和MacOS系统上运行。我使用sed程序。 事实证明,BSD sed和gnu sed在一个小而重要的细节上有所不同。我从手册页中引用:

BSD:
-i extension ...

GNU:
-i[SUFFIX], --in-place[=SUFFIX]

所以在Mac上我必须打电话

sed -i '' -e 's/foo/bar/' file.tmp

其中-i之后的空字符串是必需的,而在Linux机器上我调用

sed -i' s / foo / bar /' file.tmp

以下是问题:

有没有一种安全的方法来区分Makefile中的两个操作系统?

我当然可以让用户拨打Makefile.macMakefile.linux,但我宁愿避免这种情况。

2 个答案:

答案 0 :(得分:3)

安全的方法是不使用-i的{​​{1}}选项。此选项是不可移植的扩展,不属于POSIX。

答案 1 :(得分:2)

您可以使用以下代码完全避免使用-i

sed 's/foo/bar/' file > tmp && mv tmp file

然后它会将数据写入tmp文件> tmp
如果没有错误发生&&将tmp文件移回原始file

您会在短时间内获得临时文件 我不确定这是否会慢于-i选项。