Makefile回顾,阅读makefile,config.ini文件,自行写阅读理解。
1,Makefile文件的理解
打开Makefile文件所在路径,如下图。

用vim文本编译器打开Makefile进行阅读,内容如下图。

自己阅读理解如下标注#后的中文解释。

#MODEL ?= hi3518a  //是否有赋值,没有的就赋值为hi3518a,以下的#MODEL语句也类似作用
#MODEL ?= hi3518e
#MODEL ?= hi3518e_w
#MODEL ?= hi3518c
#MODEL ?= hi3516c
#MODEL ?= hi3518a_s
#MODEL ?= hi3518a_p
#MODEL ?= hi3516a
#MODEL ?= hi3516d
#MODEL ?= m388c2g
#MODEL ?= m388c1g
#MODEL ?= hi3518e_v2
#MODEL ?= hi3516c_v2
#MODEL ?= hi3518e_ws
#MODEL ?= hi3518c_ws
#MODEL ?= hi3518e_wsc
#MODEL ?= hi3518a_wsc
LDFLAGS_EXT :=
DEF_EXT :=ifeq ($(MODEL),hi3518a) #如果MODEL变量的值等于hi3518a则执行下面的语句,以下的ifeq ... endif语句也类似
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518a_inc_config.ini  //将对应的config.ini文件赋值给CONFIG_DIR_SRC
endififeq ($(MODEL),hi3518e)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518e_inc_config.ini
endififeq ($(MODEL),hi3518e_w)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518e_w_inc_config.ini
endififeq ($(MODEL),hi3518c)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518c_inc_config.ini
endififeq ($(MODEL),hi3516c)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3516c_inc_config.ini
endififeq ($(MODEL),hi3518a_s)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518a_s_inc_config.ini
endififeq ($(MODEL),hi3518a_p)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518a_p_inc_config.ini
endififeq ($(MODEL),hi3516a)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3516a_inc_config.ini
endififeq ($(MODEL),hi3516d)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3516d_inc_config.ini
endififeq ($(MODEL),m388c2g)
CONFIG_DIR_SRC := $(CURDIR)/configs/m388c2g_inc_config.ini
endififeq ($(MODEL),m388c1g)
CONFIG_DIR_SRC := $(CURDIR)/configs/m388c1g_inc_config.ini
endififeq ($(MODEL),hi3518e_v2)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518e_v2_inc_config.ini
endififeq ($(MODEL),hi3516c_v2)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3516c_v2_inc_config.ini
endififeq ($(MODEL),hi3518e_ws)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518e_ws_inc_config.ini
endififeq ($(MODEL),hi3518c_ws)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518c_ws_inc_config.ini
endififeq ($(MODEL),hi3518e_wsc)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518e_wsc_inc_config.ini
endififeq ($(MODEL),hi3518a_wsc)
CONFIG_DIR_SRC := $(CURDIR)/configs/hi3518a_wsc_inc_config.ini
endififndef MODEL  #如果前面有定义MODEL则执行ifdef和endif之间的语句
include  $(CURDIR)/config.ini #CURDIR表示当前路径,即把当前路径下的config.ini文件包含进来
endif INC_PATH := $(CURDIR)/include #当前路径下的include文件赋值给INC_PATH
LIB_PATH := $(CURDIR)/lib/$(CROSS)
BIN_PATH := $(CURDIR)/bin
DBG_PATH := $(CURDIR)/debug
PAK_PATH := $(CURDIR)/package_demoSRC_FUNCTION_DEF := $(foreach str,$(FUNCTION_DEF),-D$(str)) #foreach循环将FUNCTION_DEF表达式中的值挨个取出,并存放到变量str中,然后-D$(str)编译时间并放到变量str中
#JUAN ONVIF NVT lib
ifeq (ONVIFNVT,$(findstring ONVIFNVT, $(FUNCTION_DEF)))  #在变量FUNCTION_DEF存放的字符串中搜索字符串”ONVIFNVT“,如果找到则返回”ONVIFNVT“,找不到返回空,并将返回值与ONIVFNVT进行比较,相等则执行ifeq后面的语句,不等则跳过该语句。
LDFLAGS_EXT += "-lonvif" #将字符串-lonvif累加赋值给LDFLAGS_EXT
endif
#Danale p2p lib
ifeq (DANALE,$(findstring DANALE,$(FUNCTION_DEF)))
LDFLAGS_EXT += "-ldana_video"
endif
#UDX p2p lib
ifeq (P2P,$(findstring P2P,$(FUNCTION_DEF)))
LDFLAGS_EXT += "-lP2PSDKDevice"
LDFLAGS_EXT += "-lNkECloud"
LDFLAGS_EXT += "-lcares"
#LDFLAGS_EXT += "-lFUdx"
#LDFLAGS_EXT += "-lFastUdx"
LDFLAGS_EXT += "-lFastUdx2"
LDFLAGS_EXT += "-lNkEmbedded"
LDFLAGS_EXT += "-lstdc++"
endif
#ants lib
ifeq (ANTS,$(findstring ANTS,$(FUNCTION_DEF)))
LDFLAGS_EXT += "-lantsserver"
LDFLAGS_EXT += "-lpublic"
LDFLAGS_EXT += "-ltinyxml"
endif
# N1 Reference Library
ifeq (N1,$(findstring N1,$(FUNCTION_DEF)))
LDFLAGS_EXT += "-lNkN1SDK"
LDFLAGS_EXT += "-lNkCipher"
LDFLAGS_EXT += "-lNkEmbedded"
LDFLAGS_EXT += "-lNkUtils"
LDFLAGS_EXT += "-lstdc++"
LDFLAGS_EXT += "-ldl"
endifLDFLAGS_EXT += "-lsecuredat"MAKE := @make #不显示make命令本身,只显示make的结果.PHONY: target all src shell sdk api sdk_clean tarball image config#info:
#       @echo $(PRODUCT_CLASS) #输出变量PRODUCT_CLASS里的内容
#       @echo $(PRODUCT_MODEL)
#       @echo $(SOC_MODEL)
#target: src  #target表示目标文件,src表示依赖的源文件src: srclib  #目标文件src经过以下语句生成,且依赖的srclib文件echo $(PRODUCT_CLASS)  #输出变量PRODUCT_CLASS的值$(MAKE) -C src CROSS="$(CROSS)" \ PRODUCT_CLASS="$(PRODUCT_CLASS)" \PRODUCT_MODEL="$(PRODUCT_MODEL)" \SOC_MODEL="$(SOC_MODEL)" \INC_PATH="$(INC_PATH)" \LIB_PATH="$(LIB_PATH)" \BIN_PATH="$(BIN_PATH)" \DBG_PATH="$(DBG_PATH)" \SERISE_CODE="$(SERISE_CODE)" \FUNCTION_DEF_LIB="$(shell echo $(FUNCTION_DEF) | tr A-Z a-z )" \SRC_FUNCTION_DEF="$(SRC_FUNCTION_DEF)" \LDFLAGS_EXT="$(LDFLAGS_EXT)" \DEVICE_MODEL="$(DEVICE_MODEL)" \DEF_EXT="$(DEF_EXT)"    \PRODUCT_NAME="$(PRODUCT_NAME)" \srclib:#目标文件srclib经过以下语句生成rm -f $(BIN_PATH)/ipcam_app$(MAKE) -C src srclib CROSS="@$(CROSS)" \PRODUCT_CLASS="$(PRODUCT_CLASS)" \PRODUCT_MODEL="$(PRODUCT_MODEL)" \SOC_MODEL="$(SOC_MODEL)" \INC_PATH="$(INC_PATH)" \LIB_PATH="$(LIB_PATH)" \BIN_PATH="$(BIN_PATH)" \DBG_PATH="$(DBG_PATH)" \SERISE_CODE="$(SERISE_CODE)" \FUNCTION_DEF_LIB="$(shell echo $(FUNCTION_DEF) | tr A-Z a-z )" \SRC_FUNCTION_DEF="$(SRC_FUNCTION_DEF)" \DEVICE_MODEL="$(DEVICE_MODEL)" \DEF_EXT="$(DEF_EXT)"    \PRODUCT_NAME="$(PRODUCT_NAME)" \shell:#目标文件shell经过以下语句生成$(MAKE) -C shell CROSS="@$(CROSS)" \INC_PATH="$(INC_PATH)" \LIB_PATH="$(LIB_PATH)" \BIN_PATH="$(BIN_PATH)" \DBG_PATH="$(DBG_PATH)" \sdk:#目标文件sdk经过以下语句生成$(MAKE) --directory=sdk SOC_MODEL="$(SOC_MODEL)" \PRODUCT_MODEL="$(PRODUCT_MODEL)" \SRC_FUNCTION_DEF="$(SRC_FUNCTION_DEF)" \DEF_EXT="$(DEF_EXT)"    \PRODUCT_NAME="$(PRODUCT_NAME)" \api:#目标文件api经过以下语句生成$(MAKE) --directory=api CROSS=$(CROSS)tarball:#目标文件 tarball将有以下语句编译生成$(MAKE) --directory=sdk cleancheckinclude:#目标文件checkinclude 将有以下语句编译生成rm -rf include/sdkcp -a api/include/* includecp -a sdk/sdk includeimage: src #目标文件image将有以下语句编译生成,且依赖于src文件#cd ../release$(MAKE) -C ../release DEVICE_MODEL="$(DEVICE_MODEL)" PRODUCT_MODEL="$(PRODUCT_MODEL)" FUNCTION_DEF="$(FUNCTION_DEF)" MODEL_ROOTFS="$(MODEL_ROOTFS)" CROSS="$(CROSS)"all: clean sdk srclib src image  //这里的all:表示将要执行生成后面的文件clean sdk srclib src imagedemoapp: #目标文件demoapp将有以下语句编译生成echo $(PRODUCT_CLASS)rm -f $(BIN_PATH)/demo_app$(MAKE) -C demo CROSS="$(CROSS)" \PRODUCT_CLASS="$(PRODUCT_CLASS)" \PRODUCT_MODEL="$(PRODUCT_MODEL)" \SOC_MODEL="$(SOC_MODEL)" \INC_PATH="$(INC_PATH)" \LIB_PATH="$(LIB_PATH)" \BIN_PATH="$(BIN_PATH)" \DBG_PATH="$(DBG_PATH)" \FUNCTION_DEF_LIB="$(shell echo $(FUNCTION_DEF) | tr A-Z a-z )" \SRC_FUNCTION_DEF="$(SRC_FUNCTION_DEF)" \LDFLAGS_EXT="$(LDFLAGS_EXT)" \DEVICE_MODEL="$(DEVICE_MODEL)" \DEF_EXT="$(DEF_EXT)"    \demo: clean sdk demoapp #目标文件依赖于clean,sdk,demoapp文件packet_demo: api #目标文件packet_demo由以下命令语句生成,且依赖于api文件rm -f IPC_demo*.tar.gz rm -rf $(PAK_PATH)mkdir $(PAK_PATH)mkdir $(PAK_PATH)/bincp -a demo $(PAK_PATH)cp -a include $(PAK_PATH)cp -a sdk $(PAK_PATH)cp -a Makefile $(PAK_PATH)cp -a lib $(PAK_PATH)tar -zcvf `date "+IPC_demo-%Y%m%d-%H%M-$(MODEL_NAME).tar.gz"` package_demo;config: #目标文件config由以下rm ,cp语句编译生成rm -f $(CURDIR)/config.inicp -a  $(CONFIG_DIR_SRC)  $(CURDIR)/config.ini
#eg: make config MODEL=hi3518a#这里的clean表示清除,当执行amke clean事将执行下面的rm -f 删除语句
clean: rm -f $(shell find $(CURDIR) -name *.o)rm -f $(shell find $(CURDIR) -name *.d)

2config.ini文件的阅读理解
打开config.ini所在路径,自己阅读理解如下图标注#后的中文解释

![ac33b2a5c4b98dbdc4893178cb91857a.png](en-resource://database/554:1)
用vi文本编译器打开 config.ini进行阅读 ,内容如下图。
![39aea61c6d640e621a050947f2b9a72d.png](en-resource://database/553:0)
自己的阅读理解如下标注#后的中文解释。#Hisilicon Hi3516d  inception
#以下的:=语句表示将:=右边的表达式或变量赋值给左边的表达式或变量
DEVICE_MODEL := hi3516d_inc
PRODUCT_CLASS := hi3516d-inception
PRODUCT_MODEL := 564220
SOC_MODEL := HI3516D
CROSS := arm-hisiv300-linux-
SERISE_CODE := C5
FUNCTION_DEF := N1 ONVIFNVT TFCARD  P2P STEPER_AF
MODEL_ROOTFS := rootfs_16a
DEF_EXT += "-DUART_PTZ"
DEF_EXT += "-DSAFETY"
DEF_EXT += "-DSD_GPIO_I2C"
#DEF_EXT += "-DXC_PRODUCT"
NULL_FOLDER := null_folder
PRODUCT_NAME := HI3516D_MODEL#############################################################
FLASH_MAP_INI := flashmap_hi3516d_xc.ini
UBOOT_ENV_TXT := uboot_env_hi3516d.txt
UBOOT_ENV_SIZE := 128K
MPP_PACKET := 3516a_xc
NETSDK_PACKET_MODEL1 := 3516a_xc
NETSDK_PACKET_MODEL2 := $(NULL_FOLDER)
SHELL_MODEL_SRC := 3516a
RESOURCE_MODEL_SRC := 16d_web_new
ISP_CFG_MODEL_SRC := hi_isp_cfg_ini_16A_D
JA_TOOLS_SRC := ja_tools
MODEL_CONF_SRC := model/3516DV100
LICENSE := license
#############################################################MPP_PACKET_PATH := mpp
NETSDK_PACKET_PATH := netsdk
RESOURCE_PACKET_PATH := resource
SHELL_PACKET_PATH := shell
MODEL_CONF_PATH := model_conf
#以下的:=语句表示将:=右边的路径或变量赋值给左边的变量
IMAGE_PATH := "$(CURDIR)/image/"
IMAGE_ROOTFS := $(IMAGE_PATH)rootfs.squash.uboot
IMAGE_RESOURCE := $(IMAGE_PATH)rootfs.squash.resource
IMAGE_UBOOTENV := $(IMAGE_PATH)u-boot-env.bin
#MK_ROM_BIN := "./tools/mk_rom_bin"
#MK_UBOOT_ENV := "./tools/mk_uboot_env"IMAGE_APP_HOME_DIR_SRC := $(CURDIR)/../app_rebulid/bin
IMAGE_APP_EXEC_SRC := $(IMAGE_APP_HOME_DIR_SRC)/ipcam_app_rel
IMAGE_APP_SHELL_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(SHELL_PACKET_PATH)/$(SHELL_MODEL_SRC)
IMAGE_APP_RESOURCE_DIR_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(RESOURCE_PACKET_PATH)/$(RESOURCE_MODEL_SRC)
IMAGE_APP_FLASH_MAP_SRC := $(CURDIR)/flashmap/$(FLASH_MAP_INI)
IMAGE_APP_NETSDK_DIR_SRC_MODEL1 := $(IMAGE_APP_HOME_DIR_SRC)/$(NETSDK_PACKET_PATH)/$(NETSDK_PACKET_MODEL1) # FIXME:
IMAGE_APP_NETSDK_DIR_SRC_MODEL2 := $(IMAGE_APP_HOME_DIR_SRC)/$(NETSDK_PACKET_PATH)/$(NETSDK_PACKET_MODEL2) # FIXME:
IMAGE_LINUX_MODULE_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(MPP_PACKET_PATH)/$(MPP_PACKET)
IMAGE_APP_WIFI_DIR_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(NULL_FOLDER)
IMAGE_APP_SDCARD_DIR_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(NULL_FOLDER)
IMAGE_APP_JA_TOOLS_DIR_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(JA_TOOLS_SRC)
IMAGE_APP_ISP_CFG_INI_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(ISP_CFG_MODEL_SRC)
IMAGE_APP_MODEL_CONF_DIR_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(MODEL_CONF_PATH)/$(MODEL_CONF_SRC)
IMAGE_APP_LICENSE_DIR_SRC := $(IMAGE_APP_HOME_DIR_SRC)/$(LICENSE)IMAGE_APP_HOME_DIR_DST := $(MODEL_ROOTFS)/usr/share/ipcam
IMAGE_APP_EXEC_DST  := $(IMAGE_APP_HOME_DIR_DST)/app
IMAGE_APP_SHELL_DST := $(IMAGE_APP_HOME_DIR_DST)/shell
IMAGE_APP_RESOURCE_DIR_DST := ./resource
IMAGE_APP_FLASH_MAP_DST := $(IMAGE_APP_HOME_DIR_DST)/flashmap.ini
IMAGE_APP_NETSDK_DIR_DST_MODEL1 := $(IMAGE_APP_HOME_DIR_DST)/resource/netsdk_3516a100 # FIXME:
IMAGE_APP_NETSDK_DIR_DST_MODEL2 := $(IMAGE_APP_HOME_DIR_DST)/resource/netsdk_3516c100 # FIXME:
IMAGE_APP_NETSDK_DIR_RESOURCE_DST_MODEL1 := $(IMAGE_APP_RESOURCE_DIR_DST)/netsdk_3516a100 # FIXME:
IMAGE_APP_NETSDK_DIR_RESOURCE_DST_MODEL2 := $(IMAGE_APP_RESOURCE_DIR_DST)/netsdk_3516c100 # FIXME:
IMAGE_LINUX_MODULE_DST := $(IMAGE_APP_HOME_DIR_DST)/mpp
IMAGE_APP_WIFI_DIR_DST := $(IMAGE_APP_HOME_DIR_DST)/wifi_tools
IMAGE_APP_SDCARD_DIR_DST := $(IMAGE_APP_HOME_DIR_DST)/sdcard_tools
IMAGE_APP_JA_TOOLS_DIR_DST := $(IMAGE_APP_HOME_DIR_DST)/ja_tools
IMAGE_APP_ISP_CFG_INI_DST := $(IMAGE_APP_RESOURCE_DIR_DST)/ispcfg # FIXME:
IMAGE_APP_MODEL_CONF_DIR_DST := $(IMAGE_APP_RESOURCE_DIR_DST)/model_conf
IMAGE_APP_LICENSE_DIR_DST := $(IMAGE_APP_RESOURCE_DIR_DST)/license

(07)Makefile回顾之config.ini文件理解相关推荐

  1. 解答:一个perl操作config.ini的出现的 cannot find file or dirctionary,可明明文件存在

    需求:perl 脚本动态的获取配置文件,将有exception的异常大文件in.log 抓取exception异常出来写入一个小文件out.log中 问题:perl操作一个config.ini文件读取 ...

  2. ini文件中文乱码 python_python编程之ini文件处理-configparser模块应用

    一.configparser模块是什么 可以用来操作后缀为 .ini 的配置文件: python标准库(就是python自带的意思,无需安装) 二.configparser模块基本使用 2.1 读取 ...

  3. 语言 读ini文件_让C语言的调试更加高大上

    一般在写一个项目的时候,为了更直观的调试,我们在程序里都会打printf调试语句,随着项目越写越多,printf也会越来越多,但项目准备结尾的时候,这时候开始优化就会发现,你想完全把printf语句都 ...

  4. python读取ini文件

    import configparser import os config=configparser.ConfigParser()#创建config对象 file_path=os.path.dirnam ...

  5. python解析ini文件

    新建一个config.ini文件 [LocalDB] ip=127.0.0.1 prot=3306 user=root passwd=123456 db=proxy python中解析ini文件的库为 ...

  6. C# INI文件的读取

    下面举一个常见例子,数据库连接配置INI文件,首先创建config.ini文件,输入如下: [Database] Server=127.0.0.1 DB=test_bak User=sa Passwo ...

  7. Java读取.ini文件

    src/config/config.ini文件内容如下: [login] autorun=n jls=2 url=10.10.1.29 port=80 account=ufsoft 代码如下: pac ...

  8. Java读取ini文件

    Java读取ini文件 文章目录 Java读取ini文件 1. ini文件 2. 代码示例 1. ini文件 src/config/config.ini文件内容如下: [login] autorun= ...

  9. python读取ini文件编码格式_Python读取txt(.ini)文件BOM问题

    2018-06-13   11:20:40 在windows上使用open打开utf-8编码的txt文件时开头会有一个多余的字符,它叫BOM,是用来声明编码等信息的,但python会把它当作文本解析 ...

最新文章

  1. 百度2016笔试题第一题:页面请求失败值
  2. PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 (20 分)
  3. iview 表单提交之前验证是否符合条件
  4. cookie无法读取bdstoken_第二章(第12节):cookie操作
  5. android camera工程师,Android从Camera中获取图片的两种方法
  6. 翻译:swift 5通过使用泛型进行高级异步操作Operation
  7. Apache POI简单入门
  8. 解决:Eclipse SVN一直要求输出登陆密码
  9. win10计算机的数字小键盘,win10开启数字小键盘的方法(图文)
  10. Matlab坐标修改 gca
  11. 查询计算机软件运行的时间,BootTime(电脑运行时间查询)
  12. 网易数读所有精致图片,Python百行代码搞定!
  13. 微信分享与支付开发详解
  14. 微信域名防封系统,APP下载链接域名怎么避免在微信中被封
  15. WPS的Excel做一个下拉选择功能
  16. win10系统安装mscomm32.ocx控件
  17. 在c语言中 程序的最小编译单位是,C语言课堂练习习题集
  18. 锁定计算机忘记密码,笔记本防盗锁忘记密码_笔记本电脑锁忘记密码
  19. day17-csv文件excel文件操作和面向对象编程
  20. MSSQL和MYSQL数据库降权

热门文章

  1. java实现报时助手_用C++实现:报时助手
  2. java 数组中位数_找到数组总和的中位数
  3. 办公软件 - 华为mate pro浏览器允许安装
  4. 手机收不到短信怎么回事?8个原因全面解读
  5. Sublime Text 3 3126 注册码
  6. Docker搭建RabbitMQ集群
  7. 四、RabbitMQ 集群
  8. sql 语句查询 mysql 版本号
  9. 使用Python 开发录屏小工具
  10. 在vue中使用rules对表单字段进行验证