Buildroot OpenJDK 编译配置

平台

Ubuntu 20.04 + Buildroot 2021.02 + OpenJDK 11.0.8

目标

配置Buildroot使能OpenJDK,
编译后模拟器运行如下:

~/codes/buildroot-2021.02$ ./output/images/start-qemu.sh 
VNC server running on ::1:5900
Booting Linux on physical CPU 0x0
Linux version 5.10.7 (anson@server4) (arm-buildroot-linux-gnueabihf-gcc.br_real (Buildroot 2021.02) 9.3.0, GNU ld (GNU Binutils) 2.35.2) #1 SMP Fri Jul 16 12:00:54 CST 2021
CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
OF: fdt: Machine model: V2P-CA9
Memory policy: Data cache writeback
Reserved memory: created DMA memory pool at 0x4c000000, size 8 MiB
OF: reserved mem: initialized node vram@4c000000, compatible id shared-dma-pool
cma: Reserved 16 MiB at 0x6f000000
Zone ranges:
  Normal   [mem 0x0000000060000000-0x000000006fffffff]
Movable zone start for each node
Early memory node ranges
  node   0: [mem 0x0000000060000000-0x000000006fffffff]
Initmem setup node 0 [mem 0x0000000060000000-0x000000006fffffff]
CPU: All CPU(s) started in SVC mode.
percpu: Embedded 19 pages/cpu s46156 r8192 d23476 u77824
Built 1 zonelists, mobility grouping on.  Total pages: 65024
Kernel command line: console=ttyAMA0,115200 rootwait root=/dev/mmcblk0
printk: log_buf_len individual max cpu contribution: 4096 bytes
printk: log_buf_len total cpu_extra contributions: 12288 bytes
printk: log_buf_len min size: 16384 bytes
printk: log_buf_len: 32768 bytes
printk: early log buf free: 14800(90%)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes, linear)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes, linear)
mem auto-init: stack:off, heap alloc:off, heap free:off
Memory: 231920K/262144K available (7168K kernel code, 583K rwdata, 1748K rodata, 1024K init, 181K bss, 13840K reserved, 16384K cma-reserved)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
rcu: Hierarchical RCU implementation.
rcu: 	RCU event tracing is enabled.
rcu: 	RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
GIC CPU mask not found - kernel will fail to boot.
GIC CPU mask not found - kernel will fail to boot.
L2C: platform modifies aux control register: 0x02020000 -> 0x02420000
L2C: DT/platform modifies aux control register: 0x02020000 -> 0x02420000
L2C-310 enabling early BRESP for Cortex-A9
L2C-310 full line of zeros enabled for Cortex-A9
L2C-310 dynamic clock gating disabled, standby mode disabled
L2C-310 cache controller enabled, 8 ways, 128 kB
L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x46420001
random: get_random_bytes called from start_kernel+0x384/0x538 with crng_init=0
sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
clocksource: arm,sp804: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275 ns
Failed to initialize '/bus@4000000/motherboard/iofpga@7,00000000/timer@12000': -22
smp_twd: clock not found -2
Console: colour dummy device 80x30
Calibrating local timer... 99.89MHz.
Calibrating delay loop... 439.91 BogoMIPS (lpj=2199552)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
CPU: Testing write buffer coherency: ok
CPU0: Spectre v2: using BPIALL workaround
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x60100000 - 0x60100060
rcu: Hierarchical SRCU implementation.
smp: Bringing up secondary CPUs ...
smp: Brought up 1 node, 1 CPU
SMP: Total of 1 processors activated (439.91 BogoMIPS).
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 0
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor ladder
hw-breakpoint: debug architecture 0x4 unsupported.
Serial: AMBA PL011 UART driver
irq: type mismatch, failed to map hwirq-75 for interrupt-controller@1e001000!
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Advanced Linux Sound Architecture Driver Initialized.
clocksource: Switched to clocksource arm,sp804
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes, linear)
TCP established hash table entries: 2048 (order: 1, 8192 bytes, linear)
TCP bind hash table entries: 2048 (order: 2, 16384 bytes, linear)
TCP: Hash tables configured (established 2048 bind 2048)
UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
hw perfevents: enabled with armv7_cortex_a9 PMU driver, 5 counters available
workingset: timestamp_bits=30 max_order=16 bucket_order=0
squashfs: version 4.0 (2009/01/31) Phillip Lougher
jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
9p: Installing v9fs 9p2000 file system support
io scheduler mq-deadline registered
io scheduler kyber registered
i2c i2c-0: Added multiplexed i2c bus 2
physmap-flash 40000000.flash: physmap platform flash device: [mem 0x40000000-0x43ffffff]
40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000
Intel/Sharp Extended Query Table at 0x0031
Using buffer write method
physmap-flash 40000000.flash: physmap platform flash device: [mem 0x44000000-0x47ffffff]
40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000
Intel/Sharp Extended Query Table at 0x0031
Using buffer write method
Concatenating MTD devices:
(0): "40000000.flash"
(1): "40000000.flash"
into device "40000000.flash"
physmap-flash 48000000.psram: physmap platform flash device: [mem 0x48000000-0x49ffffff]
libphy: Fixed MDIO Bus: probed
libphy: smsc911x-mdio: probed
smsc911x 4e000000.ethernet eth0: MAC Address: 52:54:00:12:34:56
isp1760 4f000000.usb: bus width: 32, oc: digital
isp1760 4f000000.usb: NXP ISP1760 USB Host Controller
isp1760 4f000000.usb: new USB bus registered, assigned bus number 1
isp1760 4f000000.usb: Scratch test failed.
isp1760 4f000000.usb: can't setup: -19
isp1760 4f000000.usb: USB bus 1 deregistered
usbcore: registered new interface driver usb-storage
ledtrig-cpu: registered to indicate activity on CPUs
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
NET: Registered protocol family 17
9pnet: Installing 9P2000 support
oprofile: using arm/armv7-ca9
Registering SWP/SWPB emulation handler
aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 32
aaci-pl041 10004000.aaci: FIFO 512 entries
mmci-pl18x 10005000.mmci: Got CD GPIO
mmci-pl18x 10005000.mmci: Got WP GPIO
mmci-pl18x 10005000.mmci: mmc0: PL181 manf 41 rev0 at 0x10005000 irq 33,34 (pio)
10009000.uart: ttyAMA0 at MMIO 0x10009000 (irq = 37, base_baud = 0) is a PL011 rev1
printk: console [ttyAMA0] enabled
1000a000.uart: ttyAMA1 at MMIO 0x1000a000 (irq = 38, base_baud = 0) is a PL011 rev1
1000b000.uart: ttyAMA2 at MMIO 0x1000b000 (irq = 39, base_baud = 0) is a PL011 rev1
1000c000.uart: ttyAMA3 at MMIO 0x1000c000 (irq = 40, base_baud = 0) is a PL011 rev1
rtc-pl031 10017000.rtc: registered as rtc0
rtc-pl031 10017000.rtc: setting system clock to 2021-08-10T00:58:06 UTC (1628557086)
mmc0: new SD card at address 4567
drm-clcd-pl111 1001f000.clcd: assigned reserved memory node vram@4c000000
drm-clcd-pl111 1001f000.clcd: using device-specific reserved memory
drm-clcd-pl111 1001f000.clcd: core tile graphics present
drm-clcd-pl111 1001f000.clcd: this device will be deactivated
drm-clcd-pl111 1001f000.clcd: Versatile Express init failed - -19
drm-clcd-pl111 10020000.clcd: DVI muxed to daughterboard 1 (core tile) CLCD
mmcblk0: mmc0:4567 QEMU! 256 MiB 
drm-clcd-pl111 10020000.clcd: initializing Versatile Express PL111
drm-clcd-pl111 10020000.clcd: found bridge on endpoint 0
drm-clcd-pl111 10020000.clcd: Using non-panel bridge
input: AT Raw Set 2 keyboard as /devices/platform/bus@4000000/bus@4000000:motherboard/bus@4000000:motherboard:iofpga@7,00000000/10006000.kmi/serio0/input/input0
[drm] Initialized pl111 1.0.0 20170317 for 10020000.clcd on minor 0
Console: switching to colour frame buffer device 128x48
drm-clcd-pl111 10020000.clcd: [drm] fb0: pl111drmfb frame buffer device
ALSA device list:
  #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 32
input: ImExPS/2 Generic Explorer Mouse as /devices/platform/bus@4000000/bus@4000000:motherboard/bus@4000000:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2
random: fast init done
EXT4-fs (mmcblk0): mounted filesystem without journal. Opts: (null)
VFS: Mounted root (ext4 filesystem) readonly on device 179:0.
devtmpfs: mounted
Freeing unused kernel memory: 1024K
Run /sbin/init as init process
random: crng init done
EXT4-fs (mmcblk0): warning: mounting unchecked fs, running e2fsck is recommended
EXT4-fs (mmcblk0): re-mounted. Opts: (null)
ext4 filesystem being remounted at / supports timestamps until 2038 (0x7fffffff)
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Initializing random number generator: OK
Saving random seed: OK
Starting network: Generic PHY 4e000000.ethernet-ffffffff:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=4e000000.ethernet-ffffffff:01, irq=POLL)
smsc911x 4e000000.ethernet eth0: SMSC911x/921x identified at 0x908b0000, IRQ: 30
udhcpc: started, v1.33.0
udhcpc: sending discover
udhcpc: sending select for 10.0.2.15
udhcpc: lease of 10.0.2.15 obtained, lease time 86400
deleting routers
adding dns 10.0.2.3
OK
Starting cupsd: OK

Welcome to Buildroot
buildroot login: root
# 
# 
# 
# 
# java -version
openjdk version "11.0.8" 2020-07-14
OpenJDK Runtime Environment (build 11.0.8+11)
OpenJDK Server VM (build 11.0.8+11, mixed mode)

参考.config

准备

OpenJDK的包处于:

~/codes/buildroot-2021.02$ ll package/openjdk
total 104
drwxrwxr-x    4 anson anson  4096 3月   7 05:16 ./
drwxrwxr-x 2495 anson anson 69632 3月   7 05:16 ../
drwxrwxr-x    2 anson anson  4096 3月   7 05:16 11.0.8+10/
drwxrwxr-x    2 anson anson  4096 3月   7 05:16 14.0.2+12/
-rw-rw-r--    1 anson anson  5178 3月   7 05:16 Config.in
-rw-rw-r--    1 anson anson   291 3月   7 05:16 openjdk.hash
-rw-rw-r--    1 anson anson  5099 3月   7 05:16 openjdk.mk

Config.in

cat package/openjdk/Config.in
config BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	bool
	default y if BR2_HOSTARCH = "x86_64"

# Taken from make/autoconf/platform.m4
config BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	bool
	default y if BR2_aarch64
	default y if BR2_arm
	default y if BR2_i386 || BR2_x86_64
	default y if BR2_m68k
	default y if BR2_powerpc || BR2_powerpc64 || BR2_powerpc64le
	default y if BR2_sh

config BR2_PACKAGE_OPENJDK
	bool "openjdk"
	depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on !BR2_SOFT_FLOAT
	depends on !BR2_STATIC_LIBS # glibc
	depends on BR2_INSTALL_LIBSTDCPP # cups
	depends on BR2_TOOLCHAIN_HAS_THREADS # alsa-lib, cups, libusb
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_9 # libusb
	depends on BR2_TOOLCHAIN_USES_GLIBC
	depends on BR2_USE_MMU # cups
	depends on BR2_PACKAGE_XORG7
	select BR2_PACKAGE_ALSA_LIB
	select BR2_PACKAGE_ALSA_LIB_MIXER
	select BR2_PACKAGE_ALSA_LIB_PCM
	select BR2_PACKAGE_ALSA_LIB_RAWMIDI
	select BR2_PACKAGE_ALSA_LIB_SEQ
	select BR2_PACKAGE_CUPS
	select BR2_PACKAGE_FONTCONFIG
	select BR2_PACKAGE_GIFLIB
	select BR2_PACKAGE_JPEG
	select BR2_PACKAGE_LCMS2
	select BR2_PACKAGE_LIBPNG
	select BR2_PACKAGE_LIBUSB
	select BR2_PACKAGE_XLIB_LIBXRANDR
	select BR2_PACKAGE_XLIB_LIBXRENDER
	select BR2_PACKAGE_XLIB_LIBXT
	select BR2_PACKAGE_XLIB_LIBXTST
	select BR2_PACKAGE_ZLIB
	help
	  OpenJDK is a free and open-source implementation of the
	  Java Platform.

	  http://openjdk.java.net/

if BR2_PACKAGE_OPENJDK

choice
	prompt "openjdk version"
	default BR2_OPENJDK_VERSION_LATEST
	help
	  Select the version of OpenJDK you wish to use.

config BR2_OPENJDK_VERSION_LTS
	bool "LTS (OpenJDK 11)"

config BR2_OPENJDK_VERSION_LATEST
	bool "latest (OpenJDK 14)"

endchoice

config BR2_PACKAGE_OPENJDK_FULL_JDK
	bool "Build the full JDK"
	help
	  Install the full JDK instead of just the run time.
	  The full JDK includes several packages used for debugging and
	  development. Some useful tools included with the JDK are:
	    - javaws
	      Command line tool for launching Java Web Start and setting
	      various options.

	    - jcmd:
	      JVM Diagnostic Commands tool: Sends diagnostic command
	      requests to a running Java Virtual Machine.

	    - jinfo
	      Configuration Info for Java: Prints configuration
	      information for a given process or core file or a remote
	      debug server.

	    - jmap
	      Memory Map for Java: Prints shared object memory maps or
	      heap memory details of a given process or core file or a
	      remote debug server.

	    - jsadebugd
	      Serviceability Agent Debug Daemon for Java: Attaches to a
	      process or core file and acts as a debug server.

	    - jstack
	      Stack Trace for Java - Prints a stack trace of threads for
	      a given process or core file or remote debug server.

	    - jstat
	      JVM Statistics Monitoring Tool: Attaches to an
	      instrumented HotSpot Java virtual machine and collects and
	      logs performance statistics as specified by the command
	      line options.

	    - jstatd
	      JVM jstat Daemon - Launches an RMI server application that
	      monitors for the creation and termination of instrumented
	      HotSpot Java virtual machines and provides an interface to
	      allow remote monitoring tools to attach to Java virtual
	      machines running on the local system.

	  Note:
	  While the JDK also comes with several tools which can be used
	  for developing java applications on a target, Buildroot does
	  not support development on a target. Building the full JDK is
	  supported for debugging purposes only.

	  Selecting this option increases the file system by
	  approximately 110M.

choice
	prompt "openjdk variant"
	default BR2_PACKAGE_OPENJDK_JVM_VARIANT_SERVER if !BR2_powerpc
	default BR2_PACKAGE_OPENJDK_JVM_VARIANT_ZERO if BR2_powerpc

config BR2_PACKAGE_OPENJDK_JVM_VARIANT_CLIENT
	bool "client"
	depends on !BR2_powerpc
	help
	  Quick loading, but slower run-time performance.

config BR2_PACKAGE_OPENJDK_JVM_VARIANT_SERVER
	bool "server"
	depends on !BR2_powerpc
	help
	  Slower loading, but faster run-time performance.

config BR2_PACKAGE_OPENJDK_JVM_VARIANT_ZERO
	bool "zero"
	select BR2_PACKAGE_LIBFFI
	help
	  A non-assembler variant with wide arch support, however
	  performance is less then client/server.

	  http://openjdk.java.net/projects/zero

endchoice
endif

comment "openjdk needs X.Org"
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_USE_MMU
	depends on !BR2_PACKAGE_XORG7

comment "openjdk needs glibc, and a toolchain w/ wchar, dynamic library, threads, C++, gcc >= 4.9"
	depends on BR2_USE_MMU
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_STATIC_LIBS || !BR2_INSTALL_LIBSTDCPP || \
		!BR2_TOOLCHAIN_HAS_THREADS || \
		!BR2_TOOLCHAIN_USES_GLIBC || \
		!BR2_TOOLCHAIN_GCC_AT_LEAST_4_9

comment "openjdk does not support soft float configurations"
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_USE_MMU
	depends on BR2_SOFT_FLOAT

依赖的配置不少:

depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on !BR2_SOFT_FLOAT
	depends on !BR2_STATIC_LIBS # glibc
	depends on BR2_INSTALL_LIBSTDCPP # cups
	depends on BR2_TOOLCHAIN_HAS_THREADS # alsa-lib, cups, libusb
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_9 # libusb
	depends on BR2_TOOLCHAIN_USES_GLIBC
	depends on BR2_USE_MMU # cups
	depends on BR2_PACKAGE_XORG7

配置 menuconfig

Buildroot OpenJDK 编译配置_第1张图片
Buildroot OpenJDK 编译配置_第2张图片
Buildroot OpenJDK 编译配置_第3张图片


一些过程

若出现 openjdk 无法勾选:

Buildroot OpenJDK 编译配置_第4张图片
检查对应的依赖.
Buildroot OpenJDK 编译配置_第5张图片

改下 glibc:
Buildroot OpenJDK 编译配置_第6张图片
再去打开X.org即可

openjdk needs glibc, and a toolchain w/ wchar, dynamic library, threads, C++, gcc

勾选上:
Buildroot OpenJDK 编译配置_第7张图片

写在最后

虽然在模拟环境下, 已经打通了任督二脉, 可惜没有办法在实际设备上做更多测试, 手上有的设备使用的是MIPS架构, 而OPENJDK对MIPS的支持早在几年前就停止

你可能感兴趣的:(Linux,OpenJDK,buildroot)