conditional - Conditionally copy a potentially nonexisting file with gnu make -


i'm compiling library called libcmsdataformat.so.

when libcmsdataformat.so gets compiled, potentially makes 1 (or more) .pcm files (this platform-dependent). if these files made, should copied location (called $obj). if don't exist, program supposed end normally, i.e. without error.

the following works if .pcm file gets made, fails platform .pcm file not generated (i.e. copy gives error since no file found)

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 `libcmsdataformat.so` follows might (or might not!) create 1 or more `*.pcm` files in `$(src)`. 

any suggestions work both cases welcome, preferably case more 1 .pcm generated.

the problem you're encountering conditional being evaluated early. if use $(if) function, evaluation deferred until rule executed. means it'll see .pcm files created side-effect of build stages.

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!") 

of course, 1 option run cp, ignore return code (you can prefixing first line of recipe -). it's not recommended, however, can hide errors occur when .pcm files exist fail copy.