summaryrefslogtreecommitdiffstats
path: root/core/modules/kernel-system/module.build
blob: 99536ad2edf77dafe8754e50b0f89a97bb29bc67 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# kernel-system: Try to use the system's kernel without recompiling

# overloaded get_kernel_version function from kernel.inc
get_kernel_version(){
	[ -z "${SYSTEM_KERNEL_LONG}" ] && perror "SYSTEM_KERNEL_LONG is not set, should be done by kernel.inc on startup. Aborting..."
	[ -n "${TARGET_KERNEL_LONG}" ] && return

	# set TARGET_KERNEL_LONG and TARGET_KERNEL_SHORT correctly
	declare -rg TARGET_KERNEL_LONG="${SYSTEM_KERNEL_LONG}"
	declare -rg TARGET_KERNEL_SHORT="$(echo ${SYSTEM_KERNEL_LONG} | grep -o -E '^[0-9\.]+')"

	# figure out linux headers directory
	local DIR
	local RES=
	for DIR in "/lib/modules/$SYSTEM_KERNEL_LONG/build" "/lib/modules/$SYSTEM_KERNEL_LONG/source" \
			"/usr/src/linux-headers-$SYSTEM_KERNEL_LONG" "/usr/src/kernels/$SYSTEM_KERNEL_LONG"; do
		[ -e "$DIR/include/linux/input" ] && RES=$DIR && break
		# Sometimes the directory exists, but doesn't contain headers yet. Need a good way to
		# figure that out. "include/linux/input" is a quick first idea that works on fedora and ubuntu. :)
	done
	# maybe fetch source did not install the headers correctly?
	[ -z "$RES" ] && perror "kernel headers for $SYSTEM_KERNEL_LONG not found! Re-build the kernel-system module"
	declare -rg KERNEL_HEADERS_DIR="$RES" 2>/dev/null

	# check kernel modules/firmware	directory
	if [ -d "/lib/modules/${SYSTEM_KERNEL_LONG}" -a -d "/lib/firmware" ]; then
		# The expected paths exists, set KERNEL_BASE_DIR to /
		declare -rg KERNEL_BASE_DIR="/" 2>/dev/null
	else
		perror "Could not find kernel modules / firmware for kernel version '$SYSTEM_KERNEL_LONG'. \
			Does '/lib/modules/$SYSTEM_KERNEL_LONG' exist?"
	fi

	# print debug info
	pinfo "TARGET_KERNEL_LONG: '$TARGET_KERNEL_LONG'"
	pinfo "TARGET_KERNEL_SHORT: '$TARGET_KERNEL_SHORT'"
	pdebug "KERNEL_BASE_DIR: '$KERNEL_BASE_DIR'"

}



fetch_source() {
	:
}

build() {
	
	# simply copy the kernel from the running system
	# to the build directory as it is.
	local KERNEL_SYSTEM_PATH=""
	local BOOT_IMAGE=""
	
	# 1st "parse" /proc/cmdline for the kernel name
	for i in $(cat /proc/cmdline); do
		[[ "$i" == BOOT_IMAGE=* ]] && BOOT_IMAGE="$(basename "${i#BOOT_IMAGE=}")"
	done
	[ -z "${BOOT_IMAGE}" ] && local BOOT_IMAGE="$(uname -r)"

	# exit if KERNEL_SYSTEM_FILENAME is empty, should not happen
	[ -z "${BOOT_IMAGE}" ] && perror "Could not determine the full path to the running kernel..."

	# now find it in KERNEL_SYSTEM_SEARCH_PATH
	# NOTE: this variable should be expanded in the future if new locations are to be searched
	local KERNEL_SYSTEM_SEARCH_PATH="/boot"
	local KERNEL_SYSTEM_SEARCH_RESULTS="$(find "${KERNEL_SYSTEM_SEARCH_PATH}" -type f -name "${BOOT_IMAGE}")"

	if [ "$(echo $KERNEL_SYSTEM_SEARCH_RESULTS|wc -w)" -eq 1 ]; then
		# we found the running kernel path
		KERNEL_SYSTEM_PATH="${KERNEL_SYSTEM_SEARCH_RESULTS}"
	else 
		# we found more than one, shouldn't happen...
		perror "Found no or more than one kernel named '${BOOT_IMAGE}' in '${KERNEL_SYSTEM_SEARCH_PATH}'."
	fi

	# at this point, we should definitly have KERNEL_SYSTEM_PATH, check just in case :)
	[ -z "${KERNEL_SYSTEM_PATH}" ] && perror "KERNEL_SYSTEM_PATH isn't set, kernel not found. This shouldn't happen!"
	pinfo "Live kernel path: $KERNEL_SYSTEM_PATH"

	# copy kernel to build directory
	cp "${KERNEL_SYSTEM_PATH}" "${MODULE_BUILD_DIR}/kernel" \
		|| perror "Copy of kernel failed: From '${KERNEL_SYSTEM_PATH}' to '${MODULE_BUILD_DIR}/kernel'"
}

post_copy() {
	:
}