我是编写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系统。我无法弄清楚我做错了什么。如果我在这里做一些愚蠢的事情,请帮助并请原谅。初学者!!!
谢谢!
答案 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