从Makefile安装包

时间:2016-11-03 16:25:57

标签: makefile fedora

我是编写Makefile的初学者。我正在写一个用于构建我的第一个linux应用程序。

到目前为止,我写了以下内容。

REDHATOS      := $(shell command -v cat /etc/redhat-release 2> /dev/null)
DEBIANOS      := $(shell command -v cat /etc/debian_version 2> /dev/null)
SWIG          := $(shell command -v swig 2> /dev/null)

PRE_BUILD_VALIDATION:
ifndef SWIG
    @echo "swig not installed, trying to install it first ..."
ifdef DEBIANOS  
    @sudo apt-get install swig
else
    @sudo yum install swig
endif
endif

基本上我想检查系统中是否已安装SWIG(您可以忽略它)。如果没有,它将首先安装。我想设计独立于流程平台(Fedora或Ubuntu)。

但是,当我make进入Fedora系统时,我面临以下错误。

swig not installed, trying to install it first ...
sudo: apt-get: command not found
Makefile:7: recipe for target 'PRE_BUILD_VALIDATION' failed
make: *** [PRE_BUILD_VALIDATION] Error 1

它应该实际上命中yum install swig命令,因为它的Fedora系统。我无法弄清楚我做错了什么。如果我在这里做一些愚蠢的事情,请帮助并请原谅。初学者!!!

谢谢!

2 个答案:

答案 0 :(得分:2)

嗯,您正在运行command -v,其记录如下:

-v  print a description of COMMAND similar to the `type' builtin

如果从命令行运行它:

$ command -v cat /etc/debian_version
/bin/cat

因此,这两个变量都包含字符串/bin/cat,并且其中任何一个都不为空,因此ifdef始终为真。

您可能想要取出-v

答案 1 :(得分:1)

这里的错误是变量的值不正确。

最好使用wildcard检查文件存在:

REDHATOS      := $(wildcard /etc/redhat-release*)
DEBIANOS      := $(wildcard /etc/debian_version*)

免费提示:: - )

ifneq($(DEBIANOS),)
 PKG_INSTALLER := apt-get
endif