• 编译环境: Archlinux, 4.4.15-1-lts, x86_64 g++ 6.1.1, openjdk-7

hotspot: 包括构建openjdk hotspot virtual macine的源代码和工具

langtools: 包括构建javaclanguage tools的源代码和工具

corba: 包括构建openjdk corba

jaxws

jaxp

top level 构建整个openjdk

jaxpjaxws中并不包含源代码, 这些工具在网页上可以获得. 完整的jdk image是需要JAXPJAX-WS的, 它们是jdk的一部分

编译成功后, 默认在build/j2sdk-image文件夹中

ALT_BOOTDIR Bootstrap JDK的目录 ALT_OUTPUTDIR : 生成文件路径(绝对路径) ALT_COMPILE_PATH: 编译器路径

我主要学习了hotspot, hotspot目录结构是这样的

hotspot目录

1
2
3
4
5
6
7
8
9
10
.
├── agent
├── ASSEMBLY_EXCEPTION
├── build/ # 结果输出
├── make/ # 存放编译文件
├── src/ # 源代码
├── test/
├── README
├── LICENSE
└── THIRD_PARTY_README

入口Makefile

Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
all:	all_product all_fastdebug

all_product: $(COMMON_VM_PRODUCT_TARGETS)
all_fastdebug: $(COMMON_VM_FASTDEBUG_TARGETS)
all_debug: $(COMMON_VM_DEBUG_TARGETS)

COMMON_VM_PRODUCT_TARGETS=product product1 docs export_product
COMMON_VM_FASTDEBUG_TARGETS=fastdebug fastdebug1 docs export_fastdebug
COMMON_VM_DEBUG_TARGETS=jvmg jvmg1 docs export_debug

C1_VM_TARGETS=product1 fastdebug1 optimized1 jvmg1
C2_VM_TARGETS=product fastdebug optimized jvmg
ZERO_VM_TARGETS=productzero fastdebugzero optimizedzero jvmgzero
SHARK_VM_TARGETS=productshark fastdebugshark optimizedshark jvmgshark

由上面的目标可知, 要生成all_productall_fastdebug, 其实就是生成product, product1, docs, export, fastdebug, fastdebug1, 这下就得一个一个准备构建了

而后有这么几条语句, 基本就将整个Makefile要做的事完全表现了出来 首先获取得到$(GAMMADIR), 就是hotspot目录. 而$(GAMMADIR)/make 就是指当前文件夹. 这下, 清晰了许多, 这几条语句都是在调用自己所在的Makefile.

这也提供了一种Makefile的写作思路, 当你有一些依赖需要构建时, 你不想把所有的变量传递进去, 就可以选用这种方法, 来有选择的传递参数. (自己的见解, 如有不合理还请指出)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$(C1_VM_TARGETS):
$(CD) $(GAMMADIR)/make; \
$(MAKE) BUILD_FLAVOR=$(@:%1=%) VM_TARGET=$@ generic_build1 $(ALT_OUT)

$(C2_VM_TARGETS):
$(CD) $(GAMMADIR)/make; \
$(MAKE) BUILD_FLAVOR=$@ VM_TARGET=$@ generic_build2 $(ALT_OUT)

$(ZERO_VM_TARGETS):
$(CD) $(GAMMADIR)/make; \
$(MAKE) BUILD_FLAVOR=$(@:%zero=%) VM_TARGET=$@ \
generic_buildzero $(ALT_OUT)

$(SHARK_VM_TARGETS):
$(CD) $(GAMMADIR)/make; \
$(MAKE) BUILD_FLAVOR=$(@:%shark=%) VM_TARGET=$@ \
generic_buildshark $(ALT_OUT)

generic_build2

接下来我们就已经有了方向: Makefile首先调用了generic_build2, 可能是因为product这个依赖在前

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
generic_build2:
$(MKDIR) -p $(OUTPUTDIR)
ifeq ($(OSNAME),windows)
$(CD) $(OUTPUTDIR); \
$(NMAKE) -f $(ABS_OS_MAKEFILE) \
Variant=compiler2 \
WorkSpace=$(ABS_GAMMADIR) \
BootStrapDir=$(ABS_BOOTDIR) \
BuildUser=$(USERNAME) \
$(MAKE_ARGS) $(VM_TARGET)
else
# 第一行为调试时所用, 原文件中没有
echo -e "\033[32;1m In generic_build2 Line 208 ${MAKE_ARGS}\033[0m"; \
$(CD) $(OUTPUTDIR); \
$(MAKE) -f $(ABS_OS_MAKEFILE) \
$(MAKE_ARGS) $(VM_TARGET) \
endif

以我在linux上为主, 此处调用make/linux/Makefile, 同时传递了一些参数, 有许多, 我就不贴了, 大家可以自行打印