在Makefile中执行大于小于计算的次数

时间:2010-08-09 16:56:52

标签: makefile

我正在尝试在Makefile中执行此操作:

value = 2.0

if ${greaterthan ${value}, 1.50}
-> execute a rule
elseif ${lessthan ${value}, 0.50}
-> execute a rule
endif

这似乎是一件非常普通的事情。这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分:16)

试试这个

在此示例中,检查VER是否大于4

ifeq ($(shell test $(VER) -gt 4; echo $$?),0)
  IFLAGS += -I$(TOPDIR)/include
  LIBS += -L$(TOPDIR)/libs -lpcap
endif

答案 1 :(得分:10)

this question类似,但基本上你可以在Makefile中使用shell命令。所以以下是完全合法的:

foo:
    if [ ${value} -gt 2 ] ; then \
         #Do stuff;\
    fi

编辑小免责声明:IIRC,bash不了解浮点运算。它可以将它们解释为 strings ,但它可能会让事情变得有些奇怪。请务必考虑到这一点。

答案 2 :(得分:3)

我首选的方法是:

value = 2.0
ifeq ($(shell expr $(value) \>= 1.5), 1)
   # execute a rule
else ifeq ($(shell expr $(value) \<= 0.5), 1)
   # execute a rule
endif

答案 3 :(得分:0)

如其他答案中所述,使用shell命令应该足以满足大多数用例:

if [ 1 -gt 0 ]; then \
    #do something \
fi

但是,如果您和我一样想要使用大于比较来 那么 设置make变量通过make&#39; $(eval)命令,然后你会发现尝试使用其他答案的模型:

if [ 1 -gt 0 ]; then \
    $(eval FOO := value) \
fi

引发错误:

if [ 1 -gt 0 ]; then  fi;
/bin/bash: -c: line 0: syntax error near unexpected token `fi'
/bin/bash: -c: line 0: `if [ 1 -gt 0 ]; then  fi;'
make: *** [clean] Error 2```

原因是make's $(eval) expression returns the empty string.生成的bash代码格式不正确。**

我提出了以下解决方案(在尝试了许多不同的方法之后!)。

$(if $(shell [ $(FOO) -ge 1 ] && echo "OK"), \
    $(eval BAR := true), \
    $(eval BAR := false))

在执行算术比较(echo "OK"部分)后需要打印出一个字符串,因为make&#39; $(if)运算符基于空字符串逻辑:

  

$(如果是条件,那么部分[,else-part])

     

if函数在函数上下文中提供对条件扩展的支持(与GNU make makefile条件如ifeq相反(参见条件语法)。

     

第一个参数condition首先将所有前导和尾随空格剥离,然后展开。如果它扩展为任何非空字符串,则认为该条件为真。如果它扩展为空字符串,则该条件被视为false。

来源:GNU Make Manual

希望这有帮助!

** 注意:最初,我认为通过添加对表达式不做任何操作的bash命令(例如true)可以轻松解决该问题:

if [ $(VALUE) -ge 1 ]; then \
    true; $(eval BAR := GreaterOrEqualThan1) \
else \
    true; $(eval BAR := LowerThan1) \
fi

结果证明是一个糟糕的主意。我仍然无法弄清楚原因,但else分支始终执行,与比较结果无关。

我想我应该为这个案子提出一个问题。