有条件地使用gnu make复制可能不存在的文件

时间:2016-06-06 20:09:15

标签: copy conditional gnu-make

我正在编译名为libCMSDataFormat.so的库。

编译libCMSDataFormat.so时,它可能会生成一个(或多个).pcm个文件(这取决于平台)。 如果生成了这些文件,则应将它们复制到另一个位置(称为$ OBJ)。 但如果它们不存在,该程序应该正常结束,即没有错误。

如果.pcm文件生成,则以下情况有效,但对于未生成.pcm文件的平台失败(即复制因未找到文件而出错)

SRC=../src
OBJ=../lib
all: $(OBJ) $(OBJ)/libCMSDataFormat.so MoveFile
.Phony : MoveFile
MoveFile: $(OBJ)/libCMSDataFormat.so
ifeq ($(*.pcm $(SRC)),)
    @echo "copying.."
    cp $(SRC)/*_rdict.pcm $(OBJ)
else
    @echo "no .pcm found!"
endif

 (Rule for `libCMSDataFormat.so` follows which might (or might not!) create one or more `*.pcm` files in `$(SRC)`.

欢迎任何建议让这两种情况都适用,最好也是为了生成多个.pcm的情况。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是过早地评估条件。如果使用$(if)函数,那么它的评估将推迟到执行规则。这意味着它会看到任何.pcm文件被创建为早期构建阶段的副作用。

SRC=../src
OBJ=../lib
all: $(OBJ) $(OBJ)/libCMSDataFormat.so MoveFile
.Phony : MoveFile
MoveFile: $(OBJ)/libCMSDataFormat.so
        $(if $(wildcard $(SRC)/*.pcm), \
            @echo "copying.."; \
            cp $(SRC)/*_rdict.pcm $(OBJ) \
          , \
            @echo "no .pcm found!")

当然,一个选项只是始终运行cp,但忽略其返回代码(您可以通过在-前面添加配方的第一行来完成此操作)。但是,不建议这样做,因为它还可以隐藏.pcm文件存在但无法复制时发生的错误。