我正在尝试理解一个复杂的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
?为什么它设置为make -f
,然后在make -f
命令中看似其他东西?
在BUILD_ROOT_MAKEFILE=
命令中,$BUILD_ROOT
是自己的参数吗?如果是这样,那是什么样的目标或规则?否则,为什么要设置为宏?
在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链并且没有任何问题进行迁移。不知道为什么这个特别是表现不同。
答案 0 :(得分:3)
你的问题变得非常冗长和复杂,所以我没有全部阅读...因为如果你只是通过一个简单的复制案例问一个你想知道答案的具体目标问题,通常会更好。< / p>
我不能说为什么不同的makefile表现不同,但这一行:
show_% := DISPLAY_MACRO = $(@:show_%=%)
对我来说似乎非常不对劲。这是(a)设置实际上不在任何地方使用的变量show_%
,(b)设置为简单扩展的字符串DISPLAY_MACRO =
,因为在makefile中此时变量$@
是没有设定任何价值。
也许你想要这一行代替:
show_% : DISPLAY_MACRO = $(@:show_%=%)
(注意:
而不是:=
),这是一个特定于模式的变量赋值,而不是一个简单的变量赋值?