Kaynağa Gözat

Implement per-profile modes

bryan 1 gün önce
ebeveyn
işleme
d22d21148c
2 değiştirilmiş dosya ile 87 ekleme ve 67 silme
  1. 84 67
      openwrtbuilder
  2. 3 0
      profiles

+ 84 - 67
openwrtbuilder

@@ -158,18 +158,22 @@ parse_input() {
 }
 
 # @description Install build dependencies on major distros
+# @arg $1 string Build mode ("source" or "imagebuilder")
 install_dependencies() {
   debug "${FUNCNAME[0]}"
+  local mode="$1"
   local -a pkg_list
   local lock_file
-  if ((FROM_SOURCE)); then
-    lock_file="$BUILD_ROOT/.dependencies_source"
-  else
-    lock_file="$BUILD_ROOT/.dependencies_ib"
+
+  # Set appropriate lock file based on mode
+  if [[ "$mode" == "source" ]]; then
+    lock_file="$BUILD_ROOT/.dependencies_source.lock"
+  elif [[ "$mode" == "imagebuilder" ]]; then
+    lock_file="$BUILD_ROOT/.dependencies_ib.lock"
   fi
 
-  if ((FORCE_DEPENDS)) || [[ ! -f $lock_file ]]; then
-    if ((FROM_SOURCE)); then
+  if [[ ! -f $lock_file ]]; then
+    if [[ "$mode" == "source" ]]; then
       # For building from source code see:
       # https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem
       case "$ID" in
@@ -272,7 +276,7 @@ install_dependencies() {
           ) ;;
         *) debug "Unsupported OS, skipping dependencies"; return 1 ;;
       esac
-    else
+    elif [[ "$mode" == "imagebuilder" ]]; then
       # For Imagebuilder
       case "$ID" in
         fedora|centos)
@@ -315,25 +319,55 @@ install_dependencies() {
   fi
 }
 
-# @description Determine the commit to use for the OpenWRT ImageBuilder or worktree
-determine_wt_commit() {
-  local rel="$1" wt_commit branch tag
-  case "$rel" in
-    snapshot) wt_commit="main" ;;
+# @description Normalize user‐input release and compute the worktree/ref key
+# @arg $1 user release (eg "v24.10.2", "snapshot", "24.10.2-rc1", or a commitish)
+# @arg $2 build mode ("imagebuilder" or "source")
+# @stdout prints two words: <normalized_release> <ref>
+normalize_and_ref() {
+  local input="$1" mode="$2"
+  # interpret “source” mode as “from_src”
+  local from_src=0
+  [[ "$mode" == "source" ]] && from_src=1
+
+  local rel ref branch tag
+
+  case "$input" in
+    snapshot|latest|main|master)
+      rel="snapshot"
+      ref="main"
+      ;;
+    v[0-9][0-9].[0-9][0-9].*)
+      rel="${input#v}"
+      if (( from_src )); then
+        branch="openwrt-${rel%.*}"
+        tag="v$rel"
+        if ask_ok "Use branch $branch HEAD (y) or tag $tag (n)?"; then
+          ref="$branch"
+        else
+          ref="$tag"
+        fi
+      else
+        ref="$rel"
+      fi
+      ;;
     [0-9][0-9].[0-9][0-9].*)
-      branch="openwrt-${rel%.*}"
-      tag="v$rel"
-      if ask_ok "Use $branch branch HEAD (y, recommended) or $tag tag (n)?"; then
-        wt_commit="$branch"
+      rel="$input"
+      ref="$rel"
+      ;;
+    *)
+      if (( from_src )); then
+        # arbitrary commit-ish allowed
+        rel="$input"
+        ref="$input"
       else
-        wt_commit="$tag"
+        echo "Error: invalid release '$input'" >&2
+        exit 1
       fi
       ;;
-    *) wt_commit="$rel" ;;
   esac
-  echo "$wt_commit"
-}
 
+  printf '%s %s' "$rel" "$ref"
+}
 
 # @description Acquires the OpenWRT Image Builder
 get_imagebuilder() {
@@ -357,17 +391,6 @@ get_imagebuilder() {
   done
 }
 
-add_repos() {
-  debug "${FUNCNAME[0]}"
-
-  if [[ -v P_ARR[repo] ]]; then
-    if ! grep -q "${P_ARR[repo]}" "$BUILD_DIR/repositories.conf"; then
-      echo "${P_ARR[repo]}" >> "$BUILD_DIR/repositories.conf"
-    fi
-    sed -i '/option check_signature/d' "$BUILD_DIR/repositories.conf"
-  fi
-}
-
 ssh_backup() {
   debug "${FUNCNAME[0]}"
   local date hostname backup_fname
@@ -747,7 +770,11 @@ main() {
     exit $?
   fi
 
-  install_dependencies
+  # Remove dependency lock files for --depends
+  if ((FORCE_DEPENDS)); then
+    [[ -f "$BUILD_ROOT/.dependencies_source.lock" ]] && rm -f "$BUILD_ROOT/.dependencies_source.lock"
+    [[ -f "$BUILD_ROOT/.dependencies_ib.lock" ]] && rm -f "$BUILD_ROOT/.dependencies_ib.lock"
+  fi
 
   # Run selected profiles
   for profile in "${PROFILES[@]}"; do
@@ -759,49 +786,34 @@ main() {
     fi
 
     # Store profile in P_ARR nameref
-    declare -gn P_ARR="$profile"
+    local -n P_ARR="$profile"
+    local mode="${P_ARR[mode]:="imagebuilder"}"
+    ((FROM_SOURCE)) && mode="source" # allow cli override
+    install_dependencies "$mode"
+    local repo="${P_ARR[repo]:-}"
     declare -g FILESYSTEM="${P_ARR[filesystem]:="squashfs"}"
     declare -g TARGET="${P_ARR[target]}"
     declare -g DEVICE="${P_ARR[device]}"
     declare -g PACKAGES="${P_ARR[packages]:-}"
 
-    # normalize RELEASE
-    local normalized
-    case "${USER_RELEASE:=${P_ARR[release]:=$RELEASE}}" in
-      snapshot|latest|main|master) normalized="snapshot" ;;
-      v[0-9][0-9].[0-9][0-9].*) RELEASE="${RELEASE#v}" ;;
-      [0-9][0-9].[0-9][0-9].*) ;;
-      *)
-        if ! ((FROM_SOURCE)); then
-          echo "Error: Invalid release version format"
-          echo "Use semantic version, tag, or 'snapshot'"
-          exit 1
-        fi
-        ;;
-    esac
-    declare -g RELEASE="$normalized"
-
-    local ref mode
-    if (( FROM_SOURCE )); then
-      ref=$(determine_wt_commit "$RELEASE")
-      mode="source"
-    else
-      ref="$RELEASE"
-      mode="imagebuilder"
-    fi
-    
+    # pull in USER_RELEASE from args or profile default
+    local raw_release="${USER_RELEASE:=${P_ARR[release]:=$RELEASE}}"
+
+    # single call to normalize+ref
+    read -r release ref < <(normalize_and_ref "$raw_release" "$mode")
+
     declare -g SRC_DIR="$BUILD_ROOT/src/.openwrt"
     declare -g BUILD_DIR="$BUILD_ROOT/src/$profile/$mode-$ref"
     declare -g BIN_DIR="$BUILD_ROOT/bin/$profile/$mode-$ref"
 
-    if [[ "$RELEASE" == "snapshot" ]]; then
+    if [[ "$release" == "snapshot" ]]; then
       local url_prefix="https://downloads.openwrt.org/snapshots/targets/$TARGET"
       local url_filename="openwrt-imagebuilder-${TARGET//\//-}.Linux-x86_64.tar.zst"
       local img_fname="openwrt-${TARGET//\//-}-$DEVICE-$FILESYSTEM" 
     else
-      local url_prefix="https://downloads.openwrt.org/releases/$RELEASE/targets/$TARGET"
-      local url_filename="openwrt-imagebuilder-$RELEASE-${TARGET//\//-}.Linux-x86_64.tar.zst"
-      local img_fname="openwrt-$RELEASE-${TARGET//\//-}-$DEVICE-$FILESYSTEM"
+      local url_prefix="https://downloads.openwrt.org/releases/$release/targets/$TARGET"
+      local url_filename="openwrt-imagebuilder-$release-${TARGET//\//-}.Linux-x86_64.tar.zst"
+      local img_fname="openwrt-$release-${TARGET//\//-}-$DEVICE-$FILESYSTEM"
     fi
 
     local ib_url="$url_prefix/$url_filename"
@@ -810,22 +822,27 @@ main() {
     local ib_sha256_file="$BUILD_DIR/sha256sums"
     local seed_url="$url_prefix/config.buildinfo"
 
-    if ((FROM_SOURCE)); then
+    if [[ "$mode" == "source" ]]; then
       declare -g SYSUPGRADEIMGGZ="$BIN_DIR/targets/$TARGET/$img_fname-sysupgrade.img.gz"
     else
       declare -g SYSUPGRADEIMGGZ="$BUILD_DIR/$img_fname-sysupgrade.img.gz"
     fi
 
-    backup "$SYSUPGRADEIMGGZ" "$BACKUP_DIR/$profile/$RELEASE"
+    backup "$SYSUPGRADEIMGGZ" "$BACKUP_DIR/$profile/$mode-$ref"
 
-    if ((FROM_SOURCE)); then
+    if [[ "$mode" == "source" ]]; then
       from_source "$seed_url" "$profile" "$ref" || return $?
-    else
+    elif [[ "$mode" == "imagebuilder" ]]; then
       [[ -d $BUILD_DIR ]] || mkdir -p "$BUILD_DIR"
       get_imagebuilder "$ib_url" "$ib_file" "$ib_sha256_url" "$ib_sha256_file" && 
       verify "$ib_file" "$ib_sha256_file" &&
       extract "$ib_file" "$BUILD_DIR" || return $?
-      add_repos
+      if [[ -v $repo ]]; then
+        if ! grep -q "$repo" "$BUILD_DIR/repositories.conf"; then
+          echo "$repo" >> "$BUILD_DIR/repositories.conf"
+        fi
+        sed -i '/option check_signature/d' "$BUILD_DIR/repositories.conf"
+      fi
       make_images
       # Verify output image for stock builds (in testing)
       if [[ ! -v P_ARR[packages] || -z ${P_ARR[packages]} ]]; then

+ 3 - 0
profiles

@@ -10,6 +10,7 @@ default_packages="luci luci-ssl luci-proto-wireguard luci-app-statistics \
 
 # Current devices
 declare -Ag r4s=(
+  [mode]="source"
   [device]="friendlyarm_nanopi-r4s"
   [target]="rockchip/armv8"
   [filesystem]="ext4"
@@ -24,6 +25,7 @@ declare -Ag r4s=(
 )
 
 declare -Ag ax6000=(
+  [mode]="imagebuilder"
   [device]="xiaomi_redmi-router-ax6000-stock"
   [target]="mediatek/filogic"
   [release]="snapshot"
@@ -32,6 +34,7 @@ declare -Ag ax6000=(
 )
 
 declare -Ag ax6000_uboot=(
+  [mode]="imagebuilder"
   [device]="xiaomi_redmi-router-ax6000-ubootmod"
   [target]="mediatek/filogic"
   [release]="snapshot"