- 编译环境:
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
, 同时传递了一些参数, 有许多, 我就不贴了, 大家可以自行打印