编译脚本Makefile干些什么事情

编译脚本Makefile干些什么事情

一个工程中的源文件不计其数,按其类型,模块,功能划分在各个目录,所以Makefile就定义了一系列的规则来指定,哪些文件需要编译,用什么编译,怎么编译,文件编译的先后顺序等,以及一些更为复杂的功能。Makefile分布至工程中的各个目录。
一般工程的,工程根目录下的Makefile描述了整个工程的编译、链接等规则。其中包括了工程中一些环境参数的配置,工程下各模块的编译规则,生成文件存放路径,清理掉编译完成后生成的临时文件等等。通过编写Makefile的好处便是能够通过一行命令来完成自动化编译极大地提高了效率。


下面是一个删掉很多细节工作后的简略的实例,来看看一个工程根目录中的Makefile的一般做些什么事情.
1.先初始化一些参数(编译器,文件名,路径,关键配置等等)

export OSDRV_DIR=$(shell pwd)
export ARCH=arm
export FLASH_TYPE

ifeq ($(OSDRV_CROSS),arm-hisiv300-linux)
LIB_TYPE:=uclibc
BUSYBOX_CFG:=config_v300_softfp_neon
TOOLCHAIN_DIR:=arm-hisiv300-linux
CROSS_SPECIFIED:=y
endif

UIMAGE:=uImage_hi3516a
UBOOT:=u-boot-hi3516a.bin
UBOOT_HI3516D:=u-boot-hi3516d.bin
UBOOT_REG_BIN_HI3516D:=reg_info_hi3516d.bin
JFFS2_IMAGE_BIN_64K:=rootfs_hi3516a_64k.jffs2

2.预先制做好生成文件目录

    mkdir $(OSDRV_DIR)/pub/$(PUB_IMAGE) -p
    mkdir $(OSDRV_DIR)/pub/bin/$(PUB_BOARD) -p
    mkdir $(OSDRV_DIR)/pub/bin/pc -p

3.编译fastboot,拷贝生成镜像到生成目录,删除编译文件等

    make -C $(OSDRV_DIR)/opensource/uboot/u-boot-2010.06 ARCH=arm CROSS_COMPILE=$(OSDRV_CROSS)- $(UBOOT_CONFIG)
    cp $(OSDRV_DIR)/opensource/uboot/u-boot-2010.06/u-boot.bin $(OSDRV_DIR)/pub/$(PUB_IMAGE)
    rm $(OSDRV_DIR)/pub/$(PUB_IMAGE)/u-boot.bin

4.编译内核,拷贝生成镜像,删除编译文件等

    make -C $(OSDRV_DIR)/opensource/kernel/linux-3.4.y ARCH=arm CROSS_COMPILE=$(OSDRV_CROSS)- $(KERNEL_CFG)
    cp $(OSDRV_DIR)/opensource/kernel/linux-3.4.y/arch/arm/boot/uImage 
    rm $(OSDRV_DIR)/opensource/kernel/linux-3.4.y -rf
$(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(UIMAGE)

5.编译busybox制作根文件系统

    tar xzf $(OSDRV_DIR)/rootfs_scripts/rootfs.tgz -C $(OSDRV_DIR)/pub
    mv $(OSDRV_DIR)/pub/rootfs $(OSDRV_DIR)/pub/$(PUB_ROOTFS)
    make -C $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER) install
    cp -af $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER)/_install/* $(OSDRV_DIR)/pub/$(PUB_ROOTFS)
    cp -af $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER)/_install/* $(OSDRV_DIR)/pub/$(PUB_ROOTFS)

6.编译镜像制作等工具,用工具制作根文件系统镜像等

    make -C $(OSDRV_DIR)/tools/pc/mkyaffs2image/
    cp $(OSDRV_DIR)/tools/pc/mkyaffs2image/bin/$(YAFFS_TOOL) $(OSDRV_DIR)/pub/bin/pc
    make -C $(OSDRV_DIR)/tools/pc/jffs2_tool/
    pushd $(OSDRV_DIR)/pub/bin/pc;./mkfs.jffs2 -d $(OSDRV_DIR)/pub/$(PUB_ROOTFS) -l -e 0x10000 -o $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(JFFS2_IMAGE_BIN_64K);popd

7.做些编译完成后的清理工作

clean:
    rm $(OSDRV_DIR)/pub/$(PUB_IMAGE)/ -rf
    rm $(OSDRV_DIR)/pub/bin/ -rf
    rm $(OSDRV_DIR)/pub/$(PUB_ROOTFS).tgz -rf
    rm $(OSDRV_DIR)/kernel/linux-3.4.y -rf

一个小模块下的Makefile做些什么事情.

#定义源文件、目标文件、编译器选择、编译标志、
SRC := $(wildcard *.c)
OBJ := $(SRC:%.c=%.o)
TARGET := sample
CC :=gcc
#CC := arm-hisiv300-linux-gcc

CFLAGS := -g -w -ldl -DSENSOR_TYPE=PANASONIC_MN34220_SUBLVDS_1080P_30FPS
CFLAGS += -I../include/

#编译用到的库文件
MPILIB := ../lib/libmpi.a
ISPLIB := ../lib/libisp.a ../lib/lib_hiae.a

#编译规则
all: $(OBJ) $(TARGET)
$(TARGET):
    @echo "SRC is " $(SRC)
    @echo "OBJ is " $(OBJ)
    @echo "TARGET is " $(TARGET)
    $(CC) $(CFLAGS) $(OBJ) -lpthread -lm -o $(TARGET) $(ISPLIB) $(MPILIB) $(SENSORLIB) $(OTHERLIB) $(AUDIO_LIBS)

#清理善后
.PHONY: clean
clean:
    rm -rf $(OBJ) $(TARGET)

这样,我们在工程Makefile中通过make -C(ObjDir)进入目标目录就能编译出小模块的文件,然后在拷贝生成的文件到我们指定的生成目录,既可完成整个工程高效的编译工作。

本文主要介绍了散布在工程中各个目录的Makefile的主要作用–完成自动化编译,小模块Makefile定义了本模块的编译链接规则,而工程Makefile则定义了一系列小模块的整合规则。

猜你喜欢

转载自blog.csdn.net/qq_17308321/article/details/79971961