测试make文件中是否存在文件

时间:2013-12-30 18:52:55

标签: if-statement makefile logic

我需要在make文件中添加一些逻辑而且我被卡住了。我看到了几个例子,但我不确定哪一个对我来说是正确的。

我有什么:

$(UBIN)/%:

$(CC) $(CFLAGS) -o $(UBIN)/$* $(OBJS) -L $(ORAHOME) $(ORALIBS) \
$(LNKPATH) $(DSTN_LIBS)
@echo ""

我想要的是什么:

$(UBIN)/%:

If the file $(UBIN)/$* exists

then

$(CC) $(CFLAGS) -o $(UBIN)/$* $(OBJS) -L $(ORAHOME) $(ORALIBS) \
$(LNKPATH) $(DSTN_LIBS)
@echo ""

endif

但我无法弄清楚正确的语法是什么。一些想法是使用通配符字符串持有者,一些使用一些-a选项,一些使用ifeq一些包括分号而一些不包括。

我们使用的当前make文件列表中包含了这个逻辑的ZERO示例,所以我没有任何东西可以将它与我的构建环境进行比较。

非常感谢

2 个答案:

答案 0 :(得分:3)

假设您不希望看到编译或echo命令,则应该使用以下内容(未经测试写在答案框中)。

$(UBIN)/%:
    @if [ -f '$@' ]; then \
        $(CC) $(CFLAGS) -o '$@' $(OBJS) -L $(ORAHOME) $(ORALIBS) \
        $(LNKPATH) $(DSTN_LIBS); \
        echo ""; \
    fi

如果你想查看编译命令(但不是echo命令),那可能会有点复杂(我没有现成的解决方案)。

答案 1 :(得分:0)

GNU make在函数中编码了一些不错的宏,将通配符和shell作为解决此问题的示例(没有保证,但请看一下宏):

ifeq(,$(wildcard paths.txt))
target: export PATH=$(PATH):$(subst \n,:,$(shell cat paths.txt))
else
target: export PATH=$(PATH_CLEAN)
endif
target:
    $(MAKE) -C task_in_path