Android.mk/makefile .mk的ifeq和ifdef的区别

上面的Makefile在make时报错:
Makefile中,当 ifeq, else 和 endif 没有缩进时,make会正确识别它们,将其作为分支选择的标识
当&ifeq, else 和 endif 有缩进时,make将它们当做普通的shell script
去掉&ifeq, else 和 endif 的缩进,像下面这样
本文已收录于以下专栏:
相关文章推荐
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。 
一、示例 
下面的例子,判断$(CC)变量是否“gcc”,如果...
makefile详解 条件判断 二十
使用条件判断
——————
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和...
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。 
一、示例 
下面的例子,判断$(CC)变量是否“gcc”,如果...
今天用Qt Creator 3.4.1 打开一个很老的工程,还是QT 4.5.2的,VS2008版本编辑的;没有语法错误,却在链接时提示&LNK2019: 无法解析的外部符号 &public: ...
--------------------
发现Fedora 13下用vim乱码,在网上找到解决办法:
将/etc/vimrc中的fileencodings改为如下内容:
因为Onenote定位的是笔记本,所以本身并不带有首行缩进功能。下面来介绍如何用其它辅助手段来实现这个功能。楼主现在用的是onenote2016,其它版本未测试过这个方法,不过应该是可行的。
首先下载...
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)#可以用命令行传递变量
RELEASE = abc
#ifdef 变量名称不能加$()
ifdef RELEASE
$(warning RELEASE defined)
$(warning RELEASE not defined)
#ifeq 后面参数要叫$(), 因为是值引用, 值可以为数值或字符串
ifeq ($(RELEASE),abc)
$(warning RELEASE eqal abc)
$(warning RELEASE not equal abc)
&&& @echo ok!
**************************************************
make 编译不同版本,例如debug, release 的简单示例。
用make 变量ver, 控制CFLAGS 变量,从而编译出不同版本。
[/pts/2@hjj ~/test]$ cat test.c
#include &stdio.h&
#include &unistd.h&
int main(int argc,char *argv[])
&& &char *tty=ttyname(0);
&& &printf(&tty is %s\n&,tty);
&& &return 0;
[/pts/2@hjj ~/test]$ cat Makefile
TARGET = test
OBJS = test.o
ifeq ($(ver), debug)
$(warning ver is debug)
CFLAGS = -g -Ddebug
$(warning ver is not debug)
CFLAGS = -c -O3
$(TARGET): $(OBJS)
&& &$(CC) -o $@ $^
&& &rm test test.o
注释: makefile 采用了ifeq-else-endif 结构
可以判别莫个make变量是否定义。
make变量可以在makefile中定义,也可以由make命令行传递。
由于makefile 支持环境变量,所以你预先定义了环境变量,也可以不在命令行中传递而直接使用环境变量
这种机制使得编写脚本控制不同的复杂的编译成为可能,
例如支持各种地域的不同的版本。用地域变量,控制make的编译选项/D,控制编译出不同的版本
----------------------------------------
编译debug 版本, 从命令行传递变量
----------------------------------------
[/pts/2@hjj ~/test]$ make ver=debug
Makefile:6: ver is debug
gcc -g -Ddebug&&& -c -o test.o test.c
gcc -o test test.o
----------------------------------------
清理,无所谓版本信息
----------------------------------------
[/pts/2@hjj ~/test]$ make clean
Makefile:9: ver is not debug
rm test test.o
----------------------------------------
编译release 版本
----------------------------------------
[/pts/2@hjj ~/test]$ make
Makefile:9: ver is not debug
gcc -c -O3&&& -c -o test.o test.c
gcc -o test test.o
**************************************************
本文已收录于以下专栏:
相关文章推荐
Makefile中的ifeq 多条件使用
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。 
一、示例 
下面的例子,判断$(CC)变量是否“gcc”,如果...
makefile详解 条件判断 二十
使用条件判断
——————
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和...
ifdef 只是测试一个变量是否有值,不会对变量进行
替换展开来判断变量的值是否为空。对于变量“VARIABLE-NAME” ,除了
“VARIABLE-NAME=”这种情况以外,使用其它方式对它...
设置一个目标指定变量的语法为: 
  
TARGET ... : VARIABLE-ASSIGNMENT 
或者: 
TARGET ... : override VARIABLE-...
关键词: Make宏定义 Make传递宏定义 Makefile中添加宏定义 Makefile -D
在Makefile中我们可以通过宏定义来控制源程序的编译。只要在Makefile中的CFLAGS中...
GNU make 支持同时执行多条命令。通常情况下,同一时刻只有一个命令在执行,
下一个命令只有在当前命令执行完成之后才能够开始执行。不过可以通过 make的命令
行选项“-j”或者“--job”...
makefile 多目标
一个规则中可以有多个目标,规则所定义的命令对所有目标有效。
多目标意味着所有的目标具有相同的依赖文件,多目标通常用在一下两种情况:
仅需要一个描述依赖关系的规则,不需要...
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)android(336)
(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下
Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:
LOCAL_PATH:=$(call my-dir)
上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径。
(2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始
以include $(BUILD_XXX)结束。
include $(CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表示编译成静态库
include $(BUILD_SHARED_LIBRARY)表示编译成动态库。
include $(BUILD_EXECUTABLE)表示编译成可执行程序
(3)举例如下(frameworks/base/libs/audioflinger/Android.mk):
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)& 模块一
ifeq ($(AUDIO_POLICY_TEST),true)
& ENABLE_AUDIO_DUMP := true
LOCAL_SRC_FILES:= \
&&& AudioHardwareGeneric.cpp \
&&& AudioHardwareStub.cpp \
&&& AudioHardwareInterface.cpp
ifeq ($(ENABLE_AUDIO_DUMP),true)
& LOCAL_SRC_FILES += AudioDumpInterface.cpp
& LOCAL_CFLAGS += -DENABLE_AUDIO_DUMP
LOCAL_SHARED_LIBRARIES := \
&&& libcutils \
&&& libutils \
&&& libbinder \
&&& libmedia \
&&& libhardware_legacy
ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)
& LOCAL_CFLAGS += -DGENERIC_AUDIO
LOCAL_MODULE:= libaudiointerface
ifeq ($(BOARD_HAVE_BLUETOOTH),true)
& LOCAL_SRC_FILES += A2dpAudioInterface.cpp
& LOCAL_SHARED_LIBRARIES += liba2dp
& LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP
& LOCAL_C_INCLUDES += $(call include-path-for, bluez)
include $(BUILD_STATIC_LIBRARY)& 模块一编译成静态库
include $(CLEAR_VARS)& 模块二
LOCAL_SRC_FILES:=&&&&&&&&&&&&&& \
&&& AudioPolicyManagerBase.cpp
LOCAL_SHARED_LIBRARIES := \
&&& libcutils \
&&& libutils \
&&& libmedia
ifeq ($(TARGET_SIMULATOR),true)
&LOCAL_LDLIBS += -ldl
&LOCAL_SHARED_LIBRARIES += libdl
LOCAL_MODULE:= libaudiopolicybase
ifeq ($(BOARD_HAVE_BLUETOOTH),true)
& LOCAL_CFLAGS += -DWITH_A2DP
ifeq ($(AUDIO_POLICY_TEST),true)
& LOCAL_CFLAGS += -DAUDIO_POLICY_TEST
include $(BUILD_STATIC_LIBRARY) 模块二编译成静态库
include $(CLEAR_VARS) 模块三
LOCAL_SRC_FILES:=&&&&&&&&&&&&&& \
&&& AudioFlinger.cpp&&&&&&&&&&& \
&&& AudioMixer.cpp.arm&&&&&&&&& \
&&& AudioResampler.cpp.arm&&&&& \
&&& AudioResamplerSinc.cpp.arm& \
&&& AudioResamplerCubic.cpp.arm \
&&& AudioPolicyService.cpp
LOCAL_SHARED_LIBRARIES := \
&&& libcutils \
&&& libutils \
&&& libbinder \
&&& libmedia \
&&& libhardware_legacy
ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)
& LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybase
& LOCAL_CFLAGS += -DGENERIC_AUDIO
& LOCAL_SHARED_LIBRARIES += libaudio libaudiopolicy
ifeq ($(TARGET_SIMULATOR),true)
&LOCAL_LDLIBS += -ldl
&LOCAL_SHARED_LIBRARIES += libdl
LOCAL_MODULE:= libaudioflinger
ifeq ($(BOARD_HAVE_BLUETOOTH),true)
& LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP
& LOCAL_SHARED_LIBRARIES += liba2dp
ifeq ($(AUDIO_POLICY_TEST),true)
& LOCAL_CFLAGS += -DAUDIO_POLICY_TEST
ifeq ($(TARGET_SIMULATOR),true)
&&& ifeq ($(HOST_OS),linux)
&&&&&&& LOCAL_LDLIBS += -lrt -lpthread
ifeq ($(BOARD_USE_LVMX),true)
&&& LOCAL_CFLAGS += -DLVMX
&&& LOCAL_C_INCLUDES += vendor/nxp
&&& LOCAL_STATIC_LIBRARIES += liblifevibes
&&& LOCAL_SHARED_LIBRARIES += liblvmxservice
#&&& LOCAL_SHARED_LIBRARIES += liblvmxipc
include $(BUILD_SHARED_LIBRARY) 模块三编译成动态库
(4)编译一个应用程序(APK)
& LOCAL_PATH := $(call my-dir)
& include $(CLEAR_VARS)
& # Build all java files in the java subdirectory--&直译(建立在java子目录中的所有Java文件)
& LOCAL_SRC_FILES := $(call all-subdir-java-files)
& # Name of the APK to build--&直译(创建APK的名称)
& LOCAL_PACKAGE_NAME := LocalPackage
& # Tell it to build an APK--&直译(告诉它来建立一个APK)
& include $(BUILD_PACKAGE)
(5)编译一个依赖于静态Java库(static.jar)的应用程序
& LOCAL_PATH := $(call my-dir)
& include $(CLEAR_VARS)
& # List of static libraries to include in the package
& LOCAL_STATIC_JAVA_LIBRARIES := static-library
& # Build all java files in the java subdirectory
& LOCAL_SRC_FILES := $(call all-subdir-java-files)
& # Name of the APK to build
& LOCAL_PACKAGE_NAME := LocalPackage
& # Tell it to build an APK
& include $(BUILD_PACKAGE)
(6)编译一个需要用平台的key签名的应用程序
& LOCAL_PATH := $(call my-dir)
& include $(CLEAR_VARS)
& # Build all java files in the java subdirectory
& LOCAL_SRC_FILES := $(call all-subdir-java-files)
& # Name of the APK to build
& LOCAL_PACKAGE_NAME := LocalPackage
& LOCAL_CERTIFICATE := platform
& # Tell it to build an APK
& include $(BUILD_PACKAGE)
(7)编译一个需要用特定key前面的应用程序
& LOCAL_PATH := $(call my-dir)
& include $(CLEAR_VARS)
& # Build all java files in the java subdirectory
& LOCAL_SRC_FILES := $(call all-subdir-java-files)
& # Name of the APK to build
& LOCAL_PACKAGE_NAME := LocalPackage
& LOCAL_CERTIFICATE := vendor/example/certs/app
& # Tell it to build an APK
& include $(BUILD_PACKAGE)
(8)添加一个预编译应用程序
& LOCAL_PATH := $(call my-dir)
& include $(CLEAR_VARS)
& # Module name should match apk name to be installed.
& LOCAL_MODULE := LocalModuleName
& LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
& LOCAL_MODULE_CLASS := APPS
& LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
& include $(BUILD_PREBUILT)
(9)添加一个静态JAVA库
& LOCAL_PATH := $(call my-dir)
& include $(CLEAR_VARS)
& # Build all java files in the java subdirectory
& LOCAL_SRC_FILES := $(call all-subdir-java-files)
& # Any libraries that this library depends on
& LOCAL_JAVA_LIBRARIES := android.test.runner
& # The name of the jar file to create
& LOCAL_MODULE := sample
& # Build a static jar file.
& include $(BUILD_STATIC_JAVA_LIBRARY)
(10)Android.mk的编译模块中间可以定义相关的编译内容,也就是指定相关的变量如下:
LOCAL_AAPT_FLAGS
LOCAL_ACP_UNAVAILABLE&
LOCAL_ADDITIONAL_JAVA_DIR&
LOCAL_AIDL_INCLUDES&
LOCAL_ALLOW_UNDEFINED_SYMBOLS&
LOCAL_ARM_MODE&
LOCAL_ASFLAGS&
LOCAL_ASSET_DIR&
LOCAL_ASSET_FILES 在Android.mk文件中编译应用程序(BUILD_PACKAGE)时设置此变量,表示资源文件,
&&&&&&&&&&&&&&&&& 通常会定义成LOCAL_ASSET_FILES += $(call find-subdir-assets)
LOCAL_BUILT_MODULE_STEM&&
LOCAL_C_INCLUDES 额外的C/C++编译头文件路径,用LOCAL_PATH表示本文件所在目录
&&&&&&&&&&&&&&&& 举例如下:
&&&&&&&&&&&&&&&& LOCAL_C_INCLUDES += extlibs/zlib-1.2.3
&&&&&&&&&&&&&&&& LOCAL_C_INCLUDES += $(LOCAL_PATH)/src&
LOCAL_CC 指定C编译器
LOCAL_CERTIFICATE& 签名认证
LOCAL_CFLAGS 为C/C++编译器定义额外的标志(如宏定义),举例:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1
LOCAL_CLASSPATH&
LOCAL_COMPRESS_MODULE_SYMBOLS&
LOCAL_COPY_HEADERS install应用程序时需要复制的头文件,必须同时定义LOCAL_COPY_HEADERS_TO
LOCAL_COPY_HEADERS_TO install应用程序时复制头文件的目的路径
LOCAL_CPP_EXTENSION 如果你的C++文件不是以cpp为文件后缀,你可以通过LOCAL_CPP_EXTENSION指定C++文件后缀名&
&&&&&&&&&&&&&&&&&&& 如:LOCAL_CPP_EXTENSION := .cc
&&&&&&&&&&&&&&&&&&& 注意统一模块中C++文件后缀必须保持一致。
LOCAL_CPPFLAGS 传递额外的标志给C++编译器,如:LOCAL_CPPFLAGS += -ffriend-injection
LOCAL_CXX 指定C++编译器
LOCAL_DX_FLAGS
LOCAL_EXPORT_PACKAGE_RESOURCES
LOCAL_FORCE_STATIC_EXECUTABLE 如果编译的可执行程序要进行静态链接(执行时不依赖于任何动态库),则设置LOCAL_FORCE_STATIC_EXECUTABLE:=true&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 目前只有libc有静态库形式,这个只有文件系统中/sbin目录下的应用程序会用到,这个目录下的应用程序在运行时通常
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 文件系统的其它部分还没有加载,所以必须进行静态链接。
LOCAL_GENERATED_SOURCES
LOCAL_INSTRUMENTATION_FOR
LOCAL_INSTRUMENTATION_FOR_PACKAGE_NAME
LOCAL_INTERMEDIATE_SOURCES
LOCAL_INTERMEDIATE_TARGETS
LOCAL_IS_HOST_MODULE
LOCAL_JAR_MANIFEST
LOCAL_JARJAR_RULES
LOCAL_JAVA_LIBRARIES 编译java应用程序和库的时候指定包含的java类库,目前有core和framework两种
&&&&&&&&&&&&&&&&&&&& 多数情况下定义成:LOCAL_JAVA_LIBRARIES := core framework
&&&&&&&&&&&&&&&&&&&& 注意LOCAL_JAVA_LIBRARIES不是必须的,而且编译APK时不允许定义(系统会自动添加)
LOCAL_JAVA_RESOURCE_DIRS&
LOCAL_JAVA_RESOURCE_FILES&
LOCAL_JNI_SHARED_LIBRARIES&
LOCAL_LDFLAGS 传递额外的参数给连接器(务必注意参数的顺序)
LOCAL_LDLIBS 为可执行程序或者库的编译指定额外的库,指定库以&-lxxx&格式,举例:
&&&&&&&&&&&& LOCAL_LDLIBS += -lcurses -lpthread
&&&&&&&&&&&& LOCAL_LDLIBS += -Wl,-z,origin&
LOCAL_MODULE 生成的模块的名称(注意应用程序名称用LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)
LOCAL_MODULE_PATH 生成模块的路径
LOCAL_MODULE_STEM&
LOCAL_MODULE_TAGS 生成模块的标记&
LOCAL_NO_DEFAULT_COMPILER_FLAGS&
LOCAL_NO_EMMA_COMPILE&
LOCAL_NO_EMMA_INSTRUMENT&
LOCAL_NO_STANDARD_LIBRARIES&
LOCAL_OVERRIDES_PACKAGES&
LOCAL_PACKAGE_NAME APK应用程序的名称&
LOCAL_POST_PROCESS_COMMAND
LOCAL_PREBUILT_EXECUTABLES 预编译including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)时所用,指定需要复制的可执行文件
LOCAL_PREBUILT_JAVA_LIBRARIES&
LOCAL_PREBUILT_LIBS 预编译including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)时所用, 指定需要复制的库.
LOCAL_PREBUILT_OBJ_FILES&
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES&&
LOCAL_PRELINK_MODULE 是否需要预连接处理(默认需要,用来做动态库优化)
LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)
LOCAL_RESOURCE_DIR
LOCAL_SDK_VERSION
LOCAL_SHARED_LIBRARIES 可链接动态库
LOCAL_SRC_FILES 编译源文件
LOCAL_STATIC_JAVA_LIBRARIES&
LOCAL_STATIC_LIBRARIES 可链接静态库&
LOCAL_UNINSTALLABLE_MODULE&
LOCAL_UNSTRIPPED_PATH
LOCAL_WHOLE_STATIC_LIBRARIES 指定模块所需要载入的完整静态库(这些精通库在链接是不允许链接器删除其中无用的代码)
LOCAL_YACCFLAGS
OVERRIDE_BUILT_MODULE_PATH
接下来我们详细看一下android里的makefile文件
android最顶层的目录结构如下:&
|-- Makefile& && &&&(全局的Makefile)& &&&
|-- bionic& && && & (Bionic含义为仿生,这里面是一些基础的库的源代码)& &&&
|-- bootloader& && &(引导加载器)& &&&
|-- build& && && &&&(build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)& &&&
|-- dalvik& && && & (JAVA&虚拟机&)&
|-- development& &&&(程序开发所需要的模板和工具)& &&&
|-- external& && &&&(目标机器使用的一些库)& &&&
|-- frameworks& && &(&应用程序&的框架层)&
|-- hardware& && &&&(与硬件相关的库)& &&&
|-- kernel& && && & (Linux2.6的源代码)& &&&
|-- packages& && &&&(Android的各种&应用&程序)&
|-- prebuilt& && &&&(Android在各种平台下编译的预置脚本)& &&&
|-- recovery& && &&&(与目标的恢复功能相关)& &&&
`-- system& && && & (Android的底层的一些库)&
本文将要分析的是build目录下的makefile和&shell&文件,android的代码是1.5的版本。&
主要的目录结构如下:&
1.makefile入门&
& & 1.1 makefile helloworld&
& & 1.2 用makefile构建交叉编译环境&
& & 1.3 makefile里面的一些技巧&
2.android makefile分析&
& & 2.1 android shell分析&
& & 2.2 android build下的各个makefile分析&
3. android其他目录的android.mk分析&
大家先通过网络的一些文章来了解一下andoroid的makefile。&
1.1 makefile helloworld&
Makefile&的规则如下:&
target ... : prerequisites ...&&
command ... ...&
target可以是一个目标文件,也可以是Object File(例如helloworld.obj),也可以是执行文件和标签。&
prerequisites就是生成target所需要的文件或是目标。&
也就是要达到target这个目标所需要执行的命令。这里没有说“使用生成target所需要执行的命令”,是因为target可能是标签。需要注意的是&
command前面必须是TAB键,而不是空格,因此喜欢在编辑器里面将TAB键用空格替换的人需要特别小心了。&
我们写程序一般喜欢写helloworld,当我们写了一个c的helloworld之后,我们该如何写helloworld来编译helloworld.c呢?&
下面就是编译helloworld的makefile。&
& && && && && && && &&&&
helloworld : helloworld.o&
& && && &&&
& & cc -o helloworld helloworld .o&
& && && &&&
helloworld.o : helloworld.c&&
& && && &&&
& & cc -c main.c&
& && && &&&
& && && &&&
& & rm helloworld helloworl.o&
& && && && && &&&&
之后我们执行make就可以编译helloworld.c了,执行make clean就可以清除编译结果了(其实就是删除helloworld helloworl.o)。&
可能有人问为什么执行make就会生成helloworld呢?这得从make的默认处理说起:make将makefile的第一个target作为作为最终的&
target,凡是这个规则依赖的规则都将被执行,否则就不会执行。所以在执行make的时候,clean这个规则就没有被执行。&
面的是最简单的makefile,复杂点makefile就开始使用高级点的技巧了,例如使用变量,使用隐式规则,执行负责点shell命令(常见的是字&
符串处理和文件处理等),这里不打算介绍这些规则,后面在分析android的makefile时会结合具体代码进行具体分析,大家可以先看看陈皓的《跟&
我一起写makefile》来了解了解。&
makefile的大体的结构是程序树形的,如下:&
& && && && && && && && && && && && && && && && && &&&&
这样写起makefile也简单,我们将要达到的目标作为第一个规则,然后将目标分解成子目标,然后一个个写规则,依次类推,直到最下面的规则很容易实现为止。这其实和算法里面的分治法很像,将一个复杂的问题分而治之。&
到树,我想到了编译原理里面的语法分析,语法分析里面有自顶而下的分析方法和自底而下的分析方法。当然makefile并不是要做语法分析,而是要做与语&
法分析分析相反的事。(语法分析要做的是一个句子是不是根据语法可以推出来,而makefile要做的是根据规则生成一个command&
执行队列。)不过makefile的规则和词法分析还是很像的。下面出一道编译原理上面的一个例子,大家可以理解一下makefile和词法分析的不同点&
和相同点:&
&&-&& &&&&
& && &-& |||ε& &&&&
& & -&& && &&
& & -& |ε& &&&&
& & -& +& &&&&
& & -& -& &&&&
& &-& && &&&&
& & -& &=&
最后,介绍一下autoconfautomake,使用这两个工具可以自动生成makefile。&
上面的图可以看出,通过autoscan,我们可以根据代码生成一个叫做configure.scan的文件,然后我们编辑这个文件,参数一个&
configure.in的文件。接着我们写一个makefile.am的文件,然后就可以用automake生成makefile.in,最后,根据&
makefile.in和configure就可以生成makefile了。在很多开源的工程里面,我们都可以看到&
makefile.am,configure.in,makefine.in,configure文件,还有可能看到一个十分复杂的makefile文&
件,许多人学习makefile的时候想通过看这个文件来学习,最终却发现太复杂了。如果我们知道这个文件是自动生成的,就理解这个makefile文件&
为什么这个复杂了。&
欲更加详细的理解automake等工具,可以参考&
1.2 用makefile构建交叉编译环境&
这节的内容请参考&
里面的交叉编译场景分析,我只是说一下我做的步骤:&
1.下载交叉编译环境(&
)并安装,一般解压就可以了,然后将里面的bin目录加到环境变量的PATH里面,我的做法是在~/.bashrc最下面加一行:export PATH=$PATH:~/arm-2009q1/bin。&
2.在用户的home目录(cd ~)建一个目录cross-compile&
3.在cross-compile创建一个文件cross.env,内容如下:&
export WORK_DIR=~/cross-compile& &&
export ROOTFS_DIR=$WORK_DIR/rootfs& &&&
export ARCH=arm& &&&
export PKG_CONFIG_PATH=$ROOTFS_DIR/usr/local/lib/pkgconfig:$ROOTFS_DIR/usr/lib/pkgconfig:$ROOTFS_DIR/usr/X11R6/lib/pkgconfig& &&&
if [ ! -e &$ROOTFS_DIR/usr/local/include& ]; then mkdir -p $ROOTFS_DIR/usr/local/& &&&
if [ ! -e &$ROOTFS_DIR/usr/local/lib& ]; then mkdir -p $ROOTFS_DIR/usr/local/& &&&
if [ ! -e &$ROOTFS_DIR/usr/local/etc& ]; then mkdir -p $ROOTFS_DIR/usr/local/& &&&
if [ ! -e &$ROOTFS_DIR/usr/local/bin& ]; then mkdir -p $ROOTFS_DIR/usr/local/& &&&
if [ ! -e &$ROOTFS_DIR/usr/local/share& ]; then mkdir -p $ROOTFS_DIR/usr/local/& &&&
if [ ! -e &$ROOTFS_DIR/usr/local/man& ]; then mkdir -p $ROOTFS_DIR/usr/local/& &&&
if [ ! -e &$ROOTFS_DIR/usr/include& ]; then mkdir -p $ROOTFS_DIR/usr/& &&&
if [ ! -e &$ROOTFS_DIR/usr/lib& ]; then mkdir -p $ROOTFS_DIR/usr/& &&&
if [ ! -e &$ROOTFS_DIR/usr/etc& ]; then mkdir -p $ROOTFS_DIR/usr/& &&&
if [ ! -e &$ROOTFS_DIR/usr/bin& ]; then mkdir -p $ROOTFS_DIR/usr/& &&&
if [ ! -e &$ROOTFS_DIR/usr/share& ]; then mkdir -p $ROOTFS_DIR/usr/& &&&
if [ ! -e &$ROOTFS_DIR/usr/man& ]; then mkdir -p $ROOTFS_DIR/usr/&
4.开启命令行,进入cross-compile目录下,执行. cross.env&
5.将编译linux时生产的头文件,so等拷贝到cross-compile目录下rootfs/usr对应的目录(头文件一般可以拷pc的,so一定要拷arm版的)。&
5.下载要编译的源代码,并放在cross-compile目录下&
里面的方法写makefile文件,放在cross-compile目录下&
7.在命令行执行make -f libxml2.mk(libxml2.mk为上一步写的makefile)
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:370353次
积分:5975
积分:5975
排名:第4485名
原创:98篇
转载:426篇
评论:88条
(1)(3)(2)(2)(1)(5)(2)(1)(2)(4)(1)(2)(3)(3)(1)(2)(9)(4)(16)(11)(2)(2)(1)(2)(7)(5)(5)(11)(8)(8)(6)(26)(17)(9)(5)(8)(23)(9)(10)(14)(29)(4)(17)(12)(42)(2)(2)(6)(11)(11)(29)(10)(15)(5)(3)(1)(7)(1)(9)(15)(2)(7)(3)(3)(1)(11)(7)(6)
&a href=&http://jameswxx
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 android.mk和makefile 的文章

 

随机推荐