Преглед на файлове

feat: 添加Ubuntu 24.04支持& glibc打包 (#1)

- 新增Ubuntu 24.04的Dockerfile和sources配置
- 更新默认Docker标签为ubuntu2404
- 添加IN_DOCKER变量控制本地或容器执行
- 在解析依赖时自动包含主包名
- 新增glibc打包脚本

Signed-off-by: longjin <longjin@DragonOS.org>
LoGin преди 3 седмици
родител
ревизия
6a4e833046
променени са 5 файла, в които са добавени 144 реда и са изтрити 1 реда
  1. 14 1
      Makefile
  2. 7 0
      docker/Dockerfile.ubuntu2404
  3. 12 0
      docker/ubuntu2404.sources
  4. 3 0
      main.py
  5. 108 0
      packages/glibc-ubuntu2404/pack.sh

+ 14 - 1
Makefile

@@ -1,5 +1,6 @@
-DOCKER_TAG ?= ubuntu2204
+DOCKER_TAG ?= ubuntu2404
 PACKAGE_NAME ?=
+IN_DOCKER ?= 1
 
 .PHONY: all
 all:
@@ -10,17 +11,29 @@ all:
 build-docker-ubuntu2204:
 	docker build -t deb-downloader:ubuntu2204 -f ./docker/Dockerfile.ubuntu2204 ./docker
 
+.PHONY: build-docker-ubuntu2404
+build-docker-ubuntu2404:
+	docker build -t deb-downloader:ubuntu2404 -f ./docker/Dockerfile.ubuntu2404 ./docker
+
 .PHONY: run
 run:
 	docker run --rm -it -v $(shell pwd):/app deb-downloader:$(DOCKER_TAG) bash
 
 .PHONY: download
 download:
+ifeq ($(IN_DOCKER), 1)
 	docker run --rm -it -v $(shell pwd):/app deb-downloader:$(DOCKER_TAG) python3 main.py download $(PACKAGE_NAME)
+else
+	python3 main.py download $(PACKAGE_NAME)
+endif
 
 .PHONY: unpack
 unpack:
+ifeq ($(IN_DOCKER), 1)
 	docker run --rm -it -v $(shell pwd):/app deb-downloader:$(DOCKER_TAG) python3 main.py unpack
+else
+	python3 main.py unpack
+endif
 
 .PHONY: clean
 clean:

+ 7 - 0
docker/Dockerfile.ubuntu2404

@@ -0,0 +1,7 @@
+FROM ubuntu:24.04
+
+COPY ./ubuntu2404.sources /etc/apt/sources.list.d/ubuntu.sources
+
+RUN apt-get clean all && apt-get update && apt-get install -y python3 python3-pip apt-rdepends && ln -s /usr/bin/python3 /usr/bin/python
+
+WORKDIR /app

+ 12 - 0
docker/ubuntu2404.sources

@@ -0,0 +1,12 @@
+Types: deb
+#URIs: http://archive.ubuntu.com/ubuntu/
+URIs: http://mirrors.ustc.edu.cn/ubuntu/
+Suites: noble noble-updates noble-backports
+Components: main restricted universe multiverse
+Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
+
+#Types: deb
+#URIs: http://security.ubuntu.com/ubuntu/
+#Suites: noble-security
+#Components: main restricted universe multiverse
+#Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

+ 3 - 0
main.py

@@ -46,6 +46,9 @@ def resolve_packages(package_name: str):
     # Find all package names in the output
     packages = package_pattern.findall(apt_rdepends_output)
     
+    # 将 package_name 添加到数组开头
+    packages.insert(0, package_name)
+
     # 对packages去重
     packages = list(set(packages))
     

+ 108 - 0
packages/glibc-ubuntu2404/pack.sh

@@ -0,0 +1,108 @@
+#!/bin/bash
+set -e
+
+DEB_DOWNLOAD_DIR=$(realpath "$(pwd)/../../")
+OUTPUT_DIR=${DEB_DOWNLOAD_DIR}/output
+SYSROOT_DIR=${OUTPUT_DIR}/sysroot
+
+PACKAGES=("libc-bin" "libstdc++6")
+export DOCKER_TAG=ubuntu2404
+
+TAR_NAME="glibc-ubuntu2404.tar.xz"
+TAR_PATH="$OUTPUT_DIR/$TAR_NAME"
+
+if ! mkdir -p "$OUTPUT_DIR"; then
+    echo "Error: Failed to create output directory" >&2
+    exit 1
+fi
+if ! mkdir -p "$SYSROOT_DIR"; then
+    echo "Error: Failed to create sysroot directory" >&2
+    exit 1
+fi
+
+
+pushd . || { echo "pushd failed" >&2; exit 1; }
+cd $DEB_DOWNLOAD_DIR || { echo "cd to $DEB_DOWNLOAD_DIR failed" >&2; exit 1; }
+
+if ! make clean; then
+    echo "Warning: make clean failed, retrying with sudo..." >&2
+    if ! sudo make clean; then
+        echo "Error: sudo make clean also failed" >&2
+        exit 1
+    fi
+fi
+
+for PACKAGE in "${PACKAGES[@]}"; do
+    export PACKAGE_NAME=$PACKAGE
+if ! make download; then
+        echo "Error: make download failed for $PACKAGE" >&2
+    exit 1
+fi
+done
+
+if ! make unpack; then
+    echo "Error: make unpack failed" >&2
+    exit 1
+fi
+
+pushd . || { echo "pushd failed" >&2; exit 1; }
+cd $SYSROOT_DIR || { echo "cd to $SYSROOT_DIR failed" >&2; exit 1; }
+# Create required symlinks in sysroot
+if ! ln -sf usr/lib $SYSROOT_DIR/lib; then
+    echo "Warning: lib symlink creation failed with normal user, retrying with sudo..." >&2
+    if ! sudo ln -sf usr/lib $SYSROOT_DIR/lib; then
+        echo "Error: failed to create lib symlink" >&2
+        exit 1
+    else
+       echo "/usr/lib symlink creation successful with sudo." >&2
+    fi
+fi
+if ! ln -sf usr/lib64 $SYSROOT_DIR/lib64; then
+    if ! sudo ln -sf usr/lib64 $SYSROOT_DIR/lib64; then
+        echo "Error: failed to create lib64 symlink" >&2
+        exit 1
+    else
+       echo "/usr/lib64 symlink creation successful with sudo." >&2
+    fi
+fi
+
+popd || { echo "popd failed" >&2; exit 1; }
+
+if ! sudo chmod a+r $SYSROOT_DIR ; then
+    echo "Error: Failed to set read permissions on $SYSROOT_DIR" >&2
+    exit 1
+fi
+
+if ! sudo chmod a+rw $OUTPUT_DIR ; then
+    echo "Error: Failed to set read/write permissions on $OUTPUT_DIR" >&2
+    exit 1
+fi
+
+
+pushd . || { echo "pushd failed" >&2; exit 1; }
+cd $OUTPUT_DIR || { echo "cd to $OUTPUT_DIR failed" >&2; exit 1; }
+
+echo "Packaging..."
+# Package sysroot into tarball
+if ! sudo tar -cJf $OUTPUT_DIR/${TAR_NAME} sysroot ; then
+     echo "Error: failed to create tarball" >&2
+    exit 1
+fi
+
+echo "Calculating MD5 and renaming the tarball..."
+# Calculate MD5 and rename the tarball
+MD5_SUM=$(md5sum $OUTPUT_DIR/${TAR_NAME} | cut -d' ' -f1)
+DATE_SUFFIX=$(date +"%Y%m%d%H%M")
+NEW_TAR_NAME="${TAR_NAME%.tar.xz}-${DATE_SUFFIX}-${MD5_SUM}.tar.xz"
+if ! mv $OUTPUT_DIR/${TAR_NAME} $OUTPUT_DIR/${NEW_TAR_NAME}; then
+    echo "Error: failed to rename tarball with MD5 sum" >&2
+    exit 1
+fi
+
+echo "Package ${NEW_TAR_NAME} downloaded, unpacked, and sysroot prepared successfully."
+
+
+popd || { echo "popd failed" >&2; exit 1; }
+
+popd || { echo "popd failed" >&2; exit 1; }
+