Skip to content

Commit

Permalink
Merge ubuild with lbuild
Browse files Browse the repository at this point in the history
  • Loading branch information
RadxaYuntian committed Jul 22, 2022
1 parent 7842ade commit 04e6629
Show file tree
Hide file tree
Showing 48 changed files with 2,586 additions and 121 deletions.
111 changes: 52 additions & 59 deletions bsp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ source "$SCRIPT_DIR/lib/utils.sh"
usage() {
cat >&2 << EOF
Radxa BSP Build Tool
usage: $(basename "$0") [options] <fork>
usage: $(basename "$0") [options] <linux|u-boot> <edition> [product]
When building u-boot, you can also provide 'product' argument,
which will only build for that specific image.
Supported package generation options:
-r, --revision [num]
Expand All @@ -20,6 +23,9 @@ Alternative functionalities
Supported Linux edition:
$(printf_array " %s\n" "$(get_supported_edition linux)")
Supported U-Boot edition:
$(printf_array " %s\n" "$(get_supported_edition u-boot)")
EOF
}

Expand All @@ -38,7 +44,7 @@ get_supported_edition() {
}

get_supported_infos() {
local infos=("edition linux")
local infos=("edition linux" "edition u-boot")
echo "${infos[@]}"
}

Expand All @@ -59,74 +65,30 @@ json() {
}

build() {
if ! source "$SCRIPT_DIR/lib/$1.sh" 2>/dev/null
then
error $EXIT_UNKNOWN_OPTION "$1"
fi
local TARGET=$1

if ! source "$SCRIPT_DIR/$TARGET/$2/fork.conf" 2>/dev/null
then
error $EXIT_UNKNOWN_OPTION "$2"
fi
local FORK=$2

[[ $NO_PREPARE_SOURCE != "yes" ]] && prepare_source "$TARGET"
prepare_source "$TARGET"

local LINUX_VERSION=$(make -C "$SCRIPT_DIR/.src/linux" -s kernelversion)
bsp_prepare

make -C "$SCRIPT_DIR/.src/linux" -j$(nproc) \
ARCH=$LINUX_ARCH CROSS_COMPILE=$CROSS_COMPILE \
KDEB_COMPRESS="xz" DPKG_FLAGS=$LINUX_DPKG_FLAGS \
LOCALVERSION=-$FORK KERNELRELEASE=$LINUX_VERSION-$FORK KDEB_PKGVERSION=$LINUX_VERSION-$FORK-$PKG_REVISION \
$LINUX_DEFCONFIG 2>&1 | tee "$SCRIPT_DIR/.src/build.log"
bsp_make $BSP_DEFCONFIG 2>&1 | tee -a "$SCRIPT_DIR/.src/build.log"

for d in $(find -L "$SCRIPT_DIR/$TARGET/$FORK" -type d | sort)
for d in $(find -L "$SCRIPT_DIR/$TARGET/$FORK" -mindepth 1 -type d | sort)
do
if [[ -e "$d/kconfig.conf" ]]
then
tee -a "$SCRIPT_DIR/.src/build.log" <<< "Apply kconfig from $d/kconfig.conf"
kconfig "$d/kconfig.conf"
kconfig -v "$d/kconfig.conf" | tee -a "$SCRIPT_DIR/.src/build.log"
fi
apply_kconfig "$d/kconfig.conf"
done
apply_kconfig "$SCRIPT_DIR/$TARGET/$FORK/kconfig.conf"

make -C "$SCRIPT_DIR/.src/linux" -j$(nproc) \
ARCH=$LINUX_ARCH CROSS_COMPILE=$CROSS_COMPILE \
KDEB_COMPRESS="xz" DPKG_FLAGS=$LINUX_DPKG_FLAGS \
LOCALVERSION=-$FORK KERNELRELEASE=$LINUX_VERSION-$FORK KDEB_PKGVERSION=$LINUX_VERSION-$FORK-$PKG_REVISION \
olddefconfig all bindeb-pkg 2>&1 | tee -a "$SCRIPT_DIR/.src/build.log"

mv $SCRIPT_DIR/.src/*.deb ./
for BOARD in ${SUPPORTED_BOARDS[@]}
do
local NAMES=("linux-image-$BOARD" "linux-headers-$BOARD")
local DESCRIPTIONS=("Radxa Linux kernel image for $BOARD" "Radxa Linux header for $BOARD")
local DEPENDS=("linux-image-$LINUX_VERSION-$FORK" "linux-headers-$LINUX_VERSION-$FORK")
for i in {0..1}
do
local NAME=${NAMES[$i]}
local VERSION="$LINUX_VERSION-$FORK-$PKG_REVISION"
local URL="https://github.com/radxa-pkg/linux-image-$FORK"
local DESCRIPTION=${DESCRIPTIONS[$i]}
local DEPEND=${DEPENDS[$i]}
fpm -s empty -t deb -n "$NAME" -v "$VERSION" \
--deb-compression xz \
--depends "$DEPEND" \
--url "$URL" \
--description "$DESCRIPTION" \
--license "GPL-2+" \
-m "Radxa <dev@radxa.com>" \
--vendor "Radxa" \
--force
done
done
bsp_make olddefconfig $BSP_MAKE_TARGETS 2>&1 | tee -a "$SCRIPT_DIR/.src/build.log"
}

main() {
local PKG_REVISION="1"
local NO_PREPARE_SOURCE=

if [[ -e "$SCRIPT_DIR/.src/build.log" ]]
then
rm "$SCRIPT_DIR/.src/build.log"
fi

while (( $# > 0 ))
do
case "$1" in
Expand All @@ -151,7 +113,38 @@ main() {
error $EXIT_UNKNOWN_OPTION "$1"
;;
linux)
build "$1" "$2"
load_edition "$1" "$2"
build
bsp_makedeb
return
;;
u-boot)
load_edition "$1" "$2"

if [[ -n "$3" ]]
then
if ! in_array "$3" "${SUPPORTED_BOARDS[@]}"
then
error $EXIT_UNKNOWN_OPTION "$1"
fi
local products=("$3")
else
local products=("${SUPPORTED_BOARDS[@]}")
fi

rm -rf "$SCRIPT_DIR/.root"

for BOARD in "${products[@]}"
do
load_edition "$1" "$2"
bsp_$BOARD
build
bsp_preparedeb
NO_PREPARE_SOURCE="yes"
done

SUPPORTED_BOARDS=("${products[@]}")
bsp_makedeb
return
;;
*) break ;;
Expand Down
230 changes: 230 additions & 0 deletions common/config
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0
# Manipulate options in a .config file from the command line

myname=${0##*/}

# If no prefix forced, use the default CONFIG_
CONFIG_="${CONFIG_-CONFIG_}"

# We use an uncommon delimiter for sed substitutions
SED_DELIM=$(echo -en "\001")

usage() {
cat >&2 <<EOL
Manipulate options in a .config file from the command line.
Usage:
$myname options command ...
commands:
--enable|-e option Enable option
--disable|-d option Disable option
--module|-m option Turn option into a module
--set-str option string
Set option to "string"
--set-val option value
Set option to value
--undefine|-u option Undefine option
--state|-s option Print state of option (n,y,m,undef)
--enable-after|-E beforeopt option
Enable option directly after other option
--disable-after|-D beforeopt option
Disable option directly after other option
--module-after|-M beforeopt option
Turn option into module directly after other option
commands can be repeated multiple times
options:
--file config-file .config file to change (default .config)
--keep-case|-k Keep next symbols' case (dont' upper-case it)
$myname doesn't check the validity of the .config file. This is done at next
make time.
By default, $myname will upper-case the given symbol. Use --keep-case to keep
the case of all following symbols unchanged.
$myname uses 'CONFIG_' as the default symbol prefix. Set the environment
variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ...
EOL
exit 1
}

checkarg() {
ARG="$1"
if [ "$ARG" = "" ] ; then
usage
fi
case "$ARG" in
${CONFIG_}*)
ARG="${ARG/${CONFIG_}/}"
;;
esac
if [ "$MUNGE_CASE" = "yes" ] ; then
ARG="`echo $ARG | tr a-z A-Z`"
fi
}

txt_append() {
local anchor="$1"
local insert="$2"
local infile="$3"
local tmpfile="$infile.swp"

# sed append cmd: 'a\' + newline + text + newline
cmd="$(printf "a\\%b$insert" "\n")"

sed -e "/$anchor/$cmd" "$infile" >"$tmpfile"
# replace original file with the edited one
mv "$tmpfile" "$infile"
}

txt_subst() {
local before="$1"
local after="$2"
local infile="$3"
local tmpfile="$infile.swp"

sed -e "s$SED_DELIM$before$SED_DELIM$after$SED_DELIM" "$infile" >"$tmpfile"
# replace original file with the edited one
mv "$tmpfile" "$infile"
}

txt_delete() {
local text="$1"
local infile="$2"
local tmpfile="$infile.swp"

sed -e "/$text/d" "$infile" >"$tmpfile"
# replace original file with the edited one
mv "$tmpfile" "$infile"
}

set_var() {
local name=$1 new=$2 before=$3

name_re="^($name=|# $name is not set)"
before_re="^($before=|# $before is not set)"
if test -n "$before" && grep -Eq "$before_re" "$FN"; then
txt_append "^$before=" "$new" "$FN"
txt_append "^# $before is not set" "$new" "$FN"
elif grep -Eq "$name_re" "$FN"; then
txt_subst "^$name=.*" "$new" "$FN"
txt_subst "^# $name is not set" "$new" "$FN"
else
echo "$new" >>"$FN"
fi
}

undef_var() {
local name=$1

txt_delete "^$name=" "$FN"
txt_delete "^# $name is not set" "$FN"
}

if [ "$1" = "--file" ]; then
FN="$2"
if [ "$FN" = "" ] ; then
usage
fi
shift 2
else
FN=.config
fi

if [ "$1" = "" ] ; then
usage
fi

MUNGE_CASE=yes
while [ "$1" != "" ] ; do
CMD="$1"
shift
case "$CMD" in
--keep-case|-k)
MUNGE_CASE=no
continue
;;
--refresh)
;;
--*-after|-E|-D|-M)
checkarg "$1"
A=$ARG
checkarg "$2"
B=$ARG
shift 2
;;
-*)
checkarg "$1"
shift
;;
esac
case "$CMD" in
--enable|-e)
set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
;;

--disable|-d)
set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
;;

--module|-m)
set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
;;

--set-str)
# sed swallows one level of escaping, so we need double-escaping
set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
shift
;;

--set-val)
set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
shift
;;
--undefine|-u)
undef_var "${CONFIG_}$ARG"
;;

--state|-s)
if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
echo n
else
V="$(grep "^${CONFIG_}$ARG=" $FN)"
if [ $? != 0 ] ; then
echo undef
else
V="${V/#${CONFIG_}$ARG=/}"
V="${V/#\"/}"
V="${V/%\"/}"
V="${V//\\\"/\"}"
echo "${V}"
fi
fi
;;

--enable-after|-E)
set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
;;

--disable-after|-D)
set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
;;

--module-after|-M)
set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
;;

# undocumented because it ignores --file (fixme)
--refresh)
yes "" | make oldconfig
;;

*)
echo "bad command: $CMD" >&2
usage
;;
esac
done
Loading

0 comments on commit 04e6629

Please sign in to comment.