用似乎设置变量的目标调用`make -f`是什么意思? (为什么它不适合我?)

时间:2016-11-08 20:47:52

标签: linux makefile sh

摘要

我正在尝试理解一个复杂的Makefile链,以便让构建成功。我在构建脚本中将我的问题缩小到了这一点:

INF_RL=`make -f $BUILD_ROOT/Makefile BUILD_ROOT_MAKEFILE= show__BUILD_INF_RL`
$INF_RL/$BUILD_UTILS_RELDIR/BuildAll.sh

$INF_RL被设置为空字符串(或未设置)。如果我用

替换第一行
INF_RL=/foo_rel_linx86/infrastructure_release/v8.0.14

为了硬编码我所知道的$INF_RL应该是什么,然后构建顺利进行。但我想知道如何以正确的方式解决这个问题。

我尝试/想过的事情

我的第一个想法是make -f失败了。所以我在我的shell中尝试了它:

% make -f $BUILD_ROOT/Makefile BUILD_ROOT_MAKEFILE= show__BUILD_INF_RL

% setenv | grep BUILD_ROOT
BUILD_ROOT=/userhome/andrew.cheong/TPS

确实,它返回一个空字符串。但是我可以从中得出什么结论呢?我不确定shell是否与Make将Makefiles链接在一起的环境/范围相同。我放弃了这项调查。

接下来,我查看了show__BUILD_INF_RL$BUILD_ROOT/Makefile中似乎定义了BUILD_ROOT_MAKEFILE = 1 MAKE_DIRS = src CASE_KITS = tpsIn tpsOut REQUIRED_VERSIONS = "case.v$(INF_VS)" all: ## These next 3 rules allows any variable set in this makefile (and therefore ## the included makefile.include to have it's value echoed from the command ## "make show_<variableName>" ## NOTE: the "disp" target is vital as it allows the show_% implicit rule to be ## recognised as such - implicit rules *must* have a target. show_% := DISPLAY_MACRO = $(@:show_%=%) show_% : disp @ echo $($(DISPLAY_MACRO)) disp: include $(BUILD_ROOT)/makefile.include

BUILD_ROOT_MAKEFILE

在这里,我遇到了更多问题:

  1. 什么是1?为什么它设置为make -f,然后在make -f命令中看似其他东西?

  2. BUILD_ROOT_MAKEFILE=命令中,$BUILD_ROOT是自己的参数吗?如果是这样,那是什么样的目标或规则?否则,为什么要设置为宏?

  3. makefile.LINUX_X86.include中,还有另一个文件BUILD_INF_RL = /foo_rel_linx86/infrastructure_release/v$(INF_VS) $(warning $(BUILD_INF_RL)) BUILD_UTILS = $(BUILD_INF_RL)/build-utils_LINUX_X86

    BUILD_INF_RL

    虽然这是一个完全无知的猜测,但我认为此处设置INF_RL,并且当调用宏show__BUILD_INF_RL时,打算将其提取到构建脚本的变量/userhome/andrew.cheong/TPS/makefile.LINUX_X86.include:3: /foo_rel_linx86/infrastructure_release/v8.0.14 中。我添加了中间行以查看它是否确实被设置了,实际上,我在运行构建脚本时得到了这个输出:

    INF_RL

    看起来像我上面的硬编码方式!但是为什么它没有进入makefile.include?还有另一个文件$BUILD_ROOT,也在# # INCLUDE THIS FILE AS THE LAST LINE IN THE LOCAL MAKEFILE # # makefile.include - use this file to define global build settings # e.g. infrastructure version and location, or third-party # # supported macros in addition to build-utils-makefile.include # # BUILD_INF_RL : optional, specification of infrastructure release location # defaults to vdev_build area # include $(BUILD_ROOT)/../../makefile.include.$(BUILD_ARCH).Versions #include $(BUILD_UTILS)/makefile.archdef.include include $(BUILD_ROOT)/makefile.$(BUILD_ARCH).include $(warning $(BUILD_INF_RL)) _BUILD_INF_RL = $(BUILD_INF_RL) # place the results at the root of the infdemo tree BUILD_DEST = $(BUILD_ROOT) INCLUDE_DIRS += $(BUILD_INF_RL)/core/$(BUILD_TARGET)/include LINK_DIRS += $(BUILD_INF_RL)/core/$(BUILD_TARGET)/lib # libraries required for a typical fidessa app, including OA and DB access FIDEVMAPP_LIBS = FidApp FidInf FidCore Fidevm include $(BUILD_UTILS)/makefile.include 中:

    $(warning ...)

    /userhome/andrew.cheong/TPS/makefile.include:18: /foo_rel_linx86/infrastructure_release/v8.0.14 再次成为我的,在运行构建脚本时,我得到:

    $(warning ...)

    问题

    当我运行调用make -f ... show__BUILD_INF_RL的构建脚本时,INF_RL出现的事实告诉我,包含了那些Makefile 。然后是什么导致宏失败并返回空字符串而不是正确的<?php $tree = '{"list_Gentlemen":"root","list_Gold":"list_Gentlemen","list_Ladies":"root","list_Plata":"list_Ladies","list_Gold":"list_Ladies"}'; preg_match_all('~(,|\{)\s*"([^"]*)"\s*:~', $tree, $matches, PREG_SET_ORDER); foreach ($matches as $i => $m) { $tree = implode($m[1].'"'.$i.'-'.$m[2].'":', explode($m[0], $tree, 2)); } print_r(json_decode($tree, 1)); 路径?

    历史记录

    这些构建脚本是在我们仅为Solaris编译的时候编写的。 (这些脚本基于由基础架构团队编写的模板,这些模板松散地考虑了Solaris和Linux,但我们从未运行Linux分支,因为它是不必要的。)我们现在完全迁移到Linux,并且遇到了这个问题。我之所以怀疑它是Linux与Solaris的问题,是因为我们至少有四个其他产品使用类似的Makefile链并且没有任何问题进行迁移。不知道为什么这个特别是表现不同。

1 个答案:

答案 0 :(得分:3)

你的问题变得非常冗长和复杂,所以我没有全部阅读...因为如果你只是通过一个简单的复制案例问一个你想知道答案的具体目标问题,通常会更好。< / p>

我不能说为什么不同的makefile表现不同,但这一行:

show_% := DISPLAY_MACRO = $(@:show_%=%)

对我来说似乎非常不对劲。这是(a)设置实际上不在任何地方使用的变量show_%,(b)设置为简单扩展的字符串DISPLAY_MACRO =,因为在makefile中此时变量$@是没有设定任何价值。

也许你想要这一行代替:

show_% : DISPLAY_MACRO = $(@:show_%=%)

(注意:而不是:=),这是一个特定于模式的变量赋值,而不是一个简单的变量赋值?