Testing if a file exists in a make file

自作多情 提交于 2020-01-16 01:58:46

问题


I need to add some logic to a make file and I am stuck. I see several examples out there but I'm not sure which one is the right one for me.

What I have:

$(UBIN)/%:

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

What I want:

$(UBIN)/%:

If the file $(UBIN)/$* exists

then

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

endif

But I can't figure out what the right syntax is. Some idea were to use a wildcard string holder, some use some -a option, some use if some use ifeq some include semicolons and some do not.

The current list of make files we use has ZERO examples of this logic so I have nothing to compare it to for my build environment.

Many thanks


回答1:


Assuming you don't want to see the compilation or the echo commands something like the following should work (untested written in the answer box).

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

If you do want to see the compilation command (but not the echo command) that's likely a bit more complicated (I don't have a ready solution to that offhand).




回答2:


GNU make has some nice macrose encoded in functions, consider wildcard and shell as exemplars to address this ask (no guarauntees, but look at the macros):

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


来源:https://stackoverflow.com/questions/20845614/testing-if-a-file-exists-in-a-make-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!