Makefile

参考make语法

默认目标

all: px4_sitl_default

目标的生成

可以操作的目标很多,以px4平台为例:

boards/px4/raspberrypi/default.px4board
boards/px4/fmu-v6u/bootloader.px4board
boards/px4/fmu-v6u/default.px4board
boards/px4/fmu-v4pro/test.px4board
boards/px4/fmu-v4pro/default.px4board
boards/px4/io-v2/default.px4board
boards/px4/fmu-v3/test.px4board
boards/px4/fmu-v3/default.px4board
boards/px4/fmu-v5/uavcanv0periph.px4board
boards/px4/fmu-v5/rtps.px4board
boards/px4/fmu-v5/cryptotest.px4board
boards/px4/fmu-v5/cyphal.px4board
boards/px4/fmu-v5/test.px4board
boards/px4/fmu-v5/stackcheck.px4board
boards/px4/fmu-v5/protected.px4board
boards/px4/fmu-v5/default.px4board
boards/px4/fmu-v5/lto.px4board
boards/px4/fmu-v5/debug.px4board
boards/px4/fmu-v2/multicopter.px4board
boards/px4/fmu-v2/rover.px4board
boards/px4/fmu-v2/fixedwing.px4board
boards/px4/fmu-v2/default.px4board
boards/px4/fmu-v2/lto.px4board
boards/px4/fmu-v4/rtps.px4board
boards/px4/fmu-v4/test.px4board
boards/px4/fmu-v4/default.px4board
boards/px4/fmu-v6x/bootloader.px4board
boards/px4/fmu-v6x/default.px4board
boards/px4/fmu-v5x/rtps.px4board
boards/px4/fmu-v5x/test.px4board
boards/px4/fmu-v5x/default.px4board
boards/px4/sitl/rtps.px4board
boards/px4/sitl/test.px4board
boards/px4/sitl/replay.px4board
boards/px4/sitl/nolockstep.px4board
boards/px4/sitl/default.px4board
boards/px4/fmu-v6c/bootloader.px4board
boards/px4/fmu-v6c/default.px4board

通过代码

$(shell find boards -maxdepth 3 -mindepth 3 -name '*.px4board' -print | sed -e 's|boards\/||' | sed -e 's|\.px4board||' | sed -e 's|\/|_|g' | sort)

处理,得到

px4_raspberrypi_default
px4_fmu-v6u_bootloader
px4_fmu-v6u_default
px4_fmu-v4pro_test
px4_fmu-v4pro_default
px4_io-v2_default
px4_fmu-v3_test
px4_fmu-v3_default
px4_fmu-v5_uavcanv0periph
px4_fmu-v5_rtps
px4_fmu-v5_cryptotest
px4_fmu-v5_cyphal
px4_fmu-v5_test
px4_fmu-v5_stackcheck
px4_fmu-v5_protected
px4_fmu-v5_default
px4_fmu-v5_lto
px4_fmu-v5_debug
px4_fmu-v2_multicopter
px4_fmu-v2_rover
px4_fmu-v2_fixedwing
px4_fmu-v2_default
px4_fmu-v2_lto
px4_fmu-v4_rtps
px4_fmu-v4_test
px4_fmu-v4_default
px4_fmu-v6x_bootloader
px4_fmu-v6x_default
px4_fmu-v5x_rtps
px4_fmu-v5x_test
px4_fmu-v5x_default
px4_sitl_rtps
px4_sitl_test
px4_sitl_replay
px4_sitl_nolockstep
px4_sitl_default
px4_fmu-v6c_bootloader
px4_fmu-v6c_default

上述代码处理的逻辑:

  1. 查找board目录下扩展名为px4board的文件:find boards -maxdepth 3 -mindepth 3 -name '*.px4board' -print
  2. 去掉目录名board:sed -e 's|boards\/||'
  3. 去掉扩展名px4board:sed -e 's|\.px4board||'
  4. 将‘/’替换为‘_’:sed -e 's|\/|_|g'
  5. 排序 : sort
    最终形成上述结果。

然后存储在变量ALL_CONFIG_TARGET中,并生成目标:

  231 $(ALL_CONFIG_TARGETS):
  232     @$(call cmake-build,$@$(BUILD_DIR_SUFFIX))

至此,make target的target生成完毕。

进一步处理了一下

  235 CONFIG_TARGETS_DEFAULT := $(patsubst %_default,%,$(filter %_default,$(ALL_CONFIG_TARGETS)))
  236 $(CONFIG_TARGETS_DEFAULT):
  237     @$(call cmake-build,$@_default$(BUILD_DIR_SUFFIX))

ALL_CONFIG_TARGETS过滤了一下,只保留包含default的结果,又生成一组target。
这一步的意义在于,如果输入 make px4_fmu_v2,就会默认匹配到 make px4_fmu_v2_default规则上。

目标如何编译

  231 $(ALL_CONFIG_TARGETS):                                                                                                                                                                                                
  232     @$(call cmake-build,$@$(BUILD_DIR_SUFFIX))

  236 $(CONFIG_TARGETS_DEFAULT):
  237     @$(call cmake-build,$@_default$(BUILD_DIR_SUFFIX))

例如:make px4_fmu-v2_default,就会调用 cmake-build, px4_fmu-v2_default。

  180 # Functions                                                                                                                                                                                                           
  181 # --------------------------------------------------------------------
  182 # describe how to build a cmake config
  183 define cmake-build
  184     $(eval override CMAKE_ARGS += -DCONFIG=$(1))
  185     @$(eval BUILD_DIR = "$(SRC_DIR)/build/$(1)")
  186     @# check if the desired cmake configuration matches the cache then CMAKE_CACHE_CHECK stays empty
  187     @$(call cmake-cache-check)
  188     @# make sure to start from scratch when switching from GNU Make to Ninja
  189     @if [ $(PX4_CMAKE_GENERATOR) = "Ninja" ] && [ -e $(BUILD_DIR)/Makefile ]; then rm -rf $(BUILD_DIR); fi
  190     @# make sure to start from scratch if ninja build file is missing
  191     @if [ $(PX4_CMAKE_GENERATOR) = "Ninja" ] && [ ! -f $(BUILD_DIR)/build.ninja ]; then rm -rf $(BUILD_DIR); fi
  192     @# only excplicitly configure the first build, if cache file already exists the makefile will rerun cmake automatically if necessary
  193     @if [ ! -e $(BUILD_DIR)/CMakeCache.txt ] || [ $(CMAKE_CACHE_CHECK) ]; then \
  194         mkdir -p $(BUILD_DIR) \
  195         && cd $(BUILD_DIR) \
  196         && cmake "$(SRC_DIR)" -G"$(PX4_CMAKE_GENERATOR)" $(CMAKE_ARGS) \
  197         || (rm -rf $(BUILD_DIR)); \
  198     fi
  199     @# run the build for the specified target
  200     @cmake --build $(BUILD_DIR) -- $(PX4_MAKE_ARGS) $(ARGS)
  201 endef
  202 
  203 # check if the options we want to build with in CMAKE_ARGS match the ones which are already configured in the cache inside BUILD_DIR
  204 define cmake-cache-check
  205     @# change to build folder which fails if it doesn't exist and CACHED_CMAKE_OPTIONS stays empty
  206     @# fetch all previously configured and cached options from the build folder and transform them into the OPTION=VALUE format without type (e.g. :BOOL)
  207     @$(eval CACHED_CMAKE_OPTIONS = $(shell cd $(BUILD_DIR) 2>/dev/null && cmake -L 2>/dev/null | sed -n 's|\([^[:blank:]]*\):[^[:blank:]]*\(=[^[:blank:]]*\)|\1\2|gp' ))
  208     @# transform the options in CMAKE_ARGS into the OPTION=VALUE format without -D
  209     @$(eval DESIRED_CMAKE_OPTIONS = $(shell echo $(CMAKE_ARGS) | sed -n 's|-D\([^[:blank:]]*=[^[:blank:]]*\)|\1|gp' ))
  210     @# find each currently desired option in the already cached ones making sure the complete configured string value is the same
  211     @$(eval VERIFIED_CMAKE_OPTIONS = $(foreach option,$(DESIRED_CMAKE_OPTIONS),$(strip $(findstring $(option)$(space),$(CACHED_CMAKE_OPTIONS)))))
  212     @# if the complete list of desired options is found in the list of verified options we don't need to reconfigure and CMAKE_CACHE_CHECK stays empty
  213     @$(eval CMAKE_CACHE_CHECK = $(if $(findstring $(DESIRED_CMAKE_OPTIONS),$(VERIFIED_CMAKE_OPTIONS)),,y))
  214 endef

关键逻辑

BUILD_DIR = "$(SRC_DIR)/build/$(1)"
mkdir -p $(BUILD_DIR) && cd $(BUILD_DIR) && cmake "$(SRC_DIR)" -G"$(PX4_CMAKE_GENERATOR)" $(CMAKE_ARGS) 
cmake --build $(BUILD_DIR) -- $(PX4_MAKE_ARGS) $(ARGS)

即 ```cmake -G 然后 cmake --build。

CMAKE_ARGS += -DCONFIG=$(1) 这里将Makefile中选中的配置,传递给CMake去处理,比如px4_fmu-v2_default

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容