1. 程式人生 > >Android.mk(5) 計算怎麽辦?

Android.mk(5) 計算怎麽辦?

nbsp pla file 多說 表達式 shell see strip warn

https://www.jianshu.com/p/57c01e97c9b8

計算怎麽辦?

前面我們把Makefile做為一門語言的主要特性大致做了一個描述,它集合了目標式的模式和函數式的模式,還有大量的宏的思想,已經可以寫出相當復雜的Makefile了。
但是,很不幸的是,雖然已經很復雜了,我們在實際的Android.mk當中還是會發現有很多事情光用Makefile的字符串替換搞不定啊,這可如何是好?

其實,這就是我們在第一講的最開始就講shell函數的原因,因為這要靠shell腳本來解決了。

我們看個實際的例子:core.mk中判斷make的版本號大於等於3.81版的腳本:

# Check for broken versions of make.
# (Allow any version under Cygwin since we don‘t actually build the platform there.)
ifeq (,$(findstring CYGWIN,$(shell uname -sm)))
ifneq (1,$(strip $(shell expr $(MAKE_VERSION) \>= 3.81)))
$(warning ********************************************************************************)
$(warning *  You are using version $(MAKE_VERSION) of make.)
$(warning *  Android can only be built by versions 3.81 and higher.)
$(warning *  see https://source.android.com/source/download.html)
$(warning ********************************************************************************)
$(error stopping)
endif
endif

計算表達式的值 - expr語句

expr語句可以用來計算變量計算結果的值。

  • 加法:+
  • 減法:-
  • 乘法:\*
  • 除法:/
  • 求余數: %

特別註意一下乘法,要在*之前加一個\

取消變量的定義 - unset語句

在實際寫Makefile的過程中,有時候需要修改環境變量。shell中提供了unset語句

不多說,直接上例子:

java_version_str := $(shell unset _JAVA_OPTIONS && java -version 2>&1)
javac_version_str := $(shell unset _JAVA_OPTIONS && javac -version 2>&1)

shell也搞不定怎麽辦?

shell總算是可以做些簡單的計算了,但是對於規模到一定程度的需求,還是搞不定,怎麽辦?
在Android.mk系統中,您可以看到python,ruby紛紛被引進來了,需要用的話,別客氣。完成工作是主要的,方法不重要。



作者:Jtag特工
鏈接:https://www.jianshu.com/p/57c01e97c9b8
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

Android.mk(5) 計算怎麽辦?