我需要在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示例,所以我没有任何东西可以将它与我的构建环境进行比较。
非常感谢
答案 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