Makefile学习笔记

${LIB_STATIC}: libs ${objects}
    $(AR) rcs $@ $(objects) $(BUILD_OUT_PATH)*.o 
    -rm ${objects}
    -rm -rf ${BUILD_OUT_PATH}

格式:ar rcs libxxx.a xx1.o xx2.o 链接

  • 参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
  • 参数c:创建一个库。不管库是否存在,都将创建。
  • 参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)

函数wildcard: 但在变量的定义和函数引用时,通配符将失效,使用该函数让通配符展开。链接


make -C $(MBEDTLS_PATH) lib -e CC=$(PLATFORM_CC) AR=$(PLATFORM_AR)
cp -RP $(TLS_LIB_DIR)libmbedtls.*   $(BUILD_OUT_PATH)
cp -RP $(TLS_LIB_DIR)libmbedx509.*  $(BUILD_OUT_PATH)
cp -RP $(TLS_LIB_DIR)libmbedcrypto.* $(BUILD_OUT_PATH)
cd $(BUILD_OUT_PATH) && $(AR) x libmbedtls.a
cd $(BUILD_OUT_PATH) && $(AR) x libmbedx509.a
cd $(BUILD_OUT_PATH) && $(AR) x libmbedcrypto.a

1、-e或者--environment-override: 不允许在Makefile中对系统环境变量进行重新赋值,比如上面代码中规定CC和AR禁止被重新赋值。

2、make -C $(MBEDTLS_PATH) lib -e CC=$(PLATFORM_CC) AR=$(PLATFORM_AR)

  • 这段代码的意思是在MBEDTLS_PATH路径下执行该路径的Makefile文件的lib目标,执行过程中,系统环境变量CCAR禁止被再次赋值。

3、cp -RP $(TLS_LIB_DIR)libmbedtls.* $(BUILD_OUT_PATH)

  • cp -RP: -R/r:递归处理,将指定目录下的所有文件与子目录一并处理;-p:保留源文件或目录的属性;该代码会将TLS_LIB_DIR目录前缀为libmbedtls的文件拷贝到BUILD_OUT_PATH路径下并且会保留源文件。链接

CFLAGS += -Wall -O2 ${INCLUDE_DIRS}
  • -Wall: 显示警告信息,使用这个参数会在编译时显示更多的警告信息。这个参数很有用,特别是找不到libs/header之类的问题。参考
  • -O:表示最佳优化的程度。-O默认值是-O1,你可以指定成-O2或-O3,数字越大表示最佳优化程度越高,但是也会增加编译的时间。
CFLAGS += -DSTD_OUT
  • -DSTD_OUT = #define STD_OUT 1。参考
CFLAGS += -DIOT_SDK_TRACE
  • 同上,如果工程中有.h或者.c含有下列代码,则会打印字符defined

    #ifdef IOT_SDK_TRACE
        printf("defined");
    #endif
    

${objects}:%.o:%.c
    $(CC) $(CFLAGS) -c $^ -o $@
  1. $^ : 指代所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,那么 $^ 就指代 p1 p2 。
  2. $@ : $@指代当前目标,就是Make命令当前构建的那个目标, 这里就是${objects}。参考

你可能感兴趣的:(Makefile学习笔记)