调用另一个shell文件make的Makefile问题

时间:2017-01-04 21:02:50

标签: bash shell makefile

我创建了一个父makefile。如下:

SHELL = /bin/bash

HOMEDIR = $(shell pwd)

PKGNAM = PARAMETIS

override VERSION = 4.0.3
YESDIR = $(shell echo $(@:install-%=%) | tr A-Z a-z)
NODIR = $(shell echo $(@:clean-%=%) | tr A-Z a-z)


install:
    $(MAKE) install-$(VERSION)

install-%:
    @if [ ! -e $(YESDIR) ]; then \
        echo "Library $(PKGNAM) Version=$(YESDIR) does not exist"; \
    elif [ -e $(YESDIR)/Install.sh ]; then \
        echo "Installing $(PKGNAM) version=$(YESDIR)" ; \
        cd $(YESDIR) ;\
        $(SHELL) Install.sh $(HOMEDIR) 1 ;\
    elif [ -e $(YESDIR)/Makefile ]; then \
        cd $(YESDIR); \
        $(MAKE); \
    else \
        echo "Installation instruction for $(@:install-%=%) Version=$(YESDIR) does not exist"; \
    fi;

clean:
    @$(MAKE) clean-$(VERSION)

clean-%:
    @if [! -e ${NODIR} ]; then ;\
        echo "Library does not exist $(PKGNAM) version=$(NODIR)" ; \
    else \
        cd $(NODIR) ;\
        echo "Installing $(PKGNAM) version=$(NODIR)" ; \
        $(SHELL) Install.sh $(HOMEDIR) 0 ;\
    fi;

这个makefile在每个版本的库目录中调用不同的bash文件来构建它们,如果我从终端调用它们,bash文件可以成功构建每个库,当我从make文件中调用它们时,

  

make install

执行install.sh并构建库后,我收到此错误

  

没有规定制定目标' w'。停止。

任何想法为什么会发生,我怎么能摆脱它?

如果有帮助,HERE是bash文件:

if (test $2 = 1) then
    make --silent -f Makefile config prefix=$1/exec
    make --silent -f Makefile
    make --silent -f Makefile install
elif (test $2 = 0) then
    make --silent -f Makefile clean
fi

由于

1 个答案:

答案 0 :(得分:0)

问题是由在Install.sh中调用的库的makefile中使用-C调用其他Makefile引起的。这会自动将MAKEFLAGS设置为w。不幸的是,图书馆的开发人员在调用makefile时犯了错误:

  

$(MAKE)-C $(SUBDIR)$ @ $(MAKEFLAGS)

当从另一个makefile调用makefile时,此MAKEFLAGS被设置为w,但是在从终端调用的bash中它们是空的。因为开发人员忘记在标志之前添加MAKEFLAGS =,它假定w是另一个目标,因为它没有定义,所以它会产生错误,我是menotiond。

我通过更改下面的makefile解决了这个问题:

  

$(MAKE)-c $(SUBDIR)$ @ MAKEFLAGS = $(MAKEFLAGS)

现在一切都按预期工作了。