- 编译环境:
Archlinux, 4.4.15-1-lts, x86_64 g++ 6.1.1, openjdk-7
hotspot: 包括构建openjdk hotspot virtual macine的源代码和工具
langtools: 包括构建javac和language tools的源代码和工具
corba: 包括构建openjdk corba
jaxws
jaxp
top level 构建整个openjdk
在jaxp和jaxws中并不包含源代码, 这些工具在网页上可以获得. 完整的jdk image是需要JAXP和JAX-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_product与all_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, 同时传递了一些参数, 有许多, 我就不贴了, 大家可以自行打印