make命令执行时,需要一个
Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
一、使用条件判断
下面的例子,判断$(CC)变量是否“gcc”,如果是的话,则使用GNU函数编译目标。
libs_for_gcc = -lgnu normal_libs = foo: $(objects) ifeq ($(CC),gcc) $(CC) -o foo $(objects) $(libs_for_gcc) else $(CC) -o foo $(objects) $(normal_libs) endif
我们可以从上面的示例中看到三个关键字:ifeq、else和endif。ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。
libs_for_gcc = -lgnu normal_libs = ifeq ($(CC),gcc) libs=$(libs_for_gcc) else libs=$(normal_libs) endif foo: $(objects) $(CC) -o foo $(objects) $(libs)下面是关于一段arm驱动程序的分析
ifneq ($(KERNELRELEASE),) obj-m :=hello.o else KERNELDIR :=/home/ZP1015/Desktop/linux-2.6.32.2 all: make -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux- clean: rm -f *.o *.ko *.mod.o *.mod.c *.symvers modul* endif
KERNELDIR
:=/home/ZP1015/Desktop/linux-2.6.32.2 这句是对KERNELDIR进行赋值,这个变量是后面我们用到的指代内核源码目录用的。
2、make
-C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
这句是Makefile的规则:这里的$(MAKE)就相当于make,-C 选项的作用是指将当前工作目录转移到你所指定的位置。“M=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成KO文件。M不是makefile的选项,是内核根目录下的Makefile中使用的变量
原文地址:http://blog.csdn.net/xy010902100449/article/details/45021523