diff --git a/check_tools.sh b/check_tools.sh index 34298e572d95da0a0fbc88fc1f1ff644cdee0a2a..4ab4a3c0c3cbe4f8a9d59f390c1d02b5b802e1ab 100644 --- a/check_tools.sh +++ b/check_tools.sh @@ -60,7 +60,7 @@ check_tools() { check_tool cmake "cmake --version 2>&1 | head -n1 | awk '{print \$3}'" "CMake" check_tool gcc "gcc --version 2>&1 | head -n1 | awk '{print \$3}'" "GCC" check_tool ldd "" "glibc" - check_tool doxygen "doxygen --version" "Doxygen" + check_tool node "node -v" "Node.js" echo "==========================================" @@ -78,7 +78,7 @@ check_tools() { "cmake" "gcc" "ldd" - "doxygen" + "node" ) for cmd in "${tools[@]}"; do diff --git a/install_tools.sh b/install_tools.sh index 33483f51413ab894ac86e3e992045719c24160bc..699c1e98561a2e8d830b0f7a23837c64659fa33e 100644 --- a/install_tools.sh +++ b/install_tools.sh @@ -1,58 +1,33 @@ #!/bin/bash set -e -# ============================================================================== -# Build Tools Installer (Simplified, Full English) -# Installs ninja via yum, then creates 'ninja' symlink from 'ninja-build' -# All packages use Huawei Cloud mirrors. -# ============================================================================== -source check_tools.sh +source check_tools.sh || { echo "❌ check_tools.sh not found"; exit 1; } -# check environment +# Early exit if already installed if check_tools; then - echo "Build environment is ready." - echo "Run: source /etc/profile.d/*.sh to load in current shell." + echo "✅ Build environment is ready." + echo "👉 Run: source /etc/profile.d/buildtools.sh to load in current shell." exit 0 fi -# Configuration -TMP_DIR="/tmp" -BUILD_TOOLS="/opt/buildtools" - -# Detect architecture +# --- Detect architecture --- ARCH=$(uname -m) case "$ARCH" in x86_64) - ARCH_TAG="x64" - BAZEL_ARCH="x86_64" - echo "Detected x86_64 architecture" + PKG_ARCH="x64" + OBS_ARCH="x64" ;; aarch64) - ARCH_TAG="aarch64" - BAZEL_ARCH="arm64" - echo "Detected aarch64 (ARM64) architecture" + PKG_ARCH="arm64" + OBS_ARCH="arm" ;; *) - echo "Error: Unsupported architecture: $ARCH" >&2 + echo "❌ Unsupported architecture: $ARCH" >&2 exit 1 ;; esac -# Ensure sudo is available -if ! command -v sudo &> /dev/null; then - echo "Warning: sudo not found, installing..." - yum install -y sudo || echo "Failed to install sudo, proceeding..." -fi - -# Create build tools directory -echo "Creating $BUILD_TOOLS..." -sudo mkdir -p "$BUILD_TOOLS" -sudo chown "$(whoami):$(whoami)" "$BUILD_TOOLS" || true - -# ============================================================================== -# 0. Install system dependencies including ninja-build -# ============================================================================== -echo "Installing system dependencies via yum..." +# --- install yum repos --- sudo yum install -y \ gcc gcc-c++ git make libstdc++-devel curl libtool \ binutils binutils-devel libcurl-devel zlib zlib-devel automake expat-devel \ @@ -60,230 +35,142 @@ sudo yum install -y \ sqlite-devel bison gawk texinfo glibc glibc-devel wget bzip2-devel sudo \ rsync nfs-utils xz libuuid unzip util-linux-devel cpio libcap-devel libatomic \ chrpath numactl-devel openeuler-lsb libasan dos2unix net-tools pigz cmake \ - protobuf protobuf-devel patchelf golang ninja-build doxygen || \ - echo "Dependency installation completed or partially failed" - -# ============================================================================== -# 1. Setup 'ninja' command via symlink to 'ninja-build' -# ============================================================================== -echo "Setting up 'ninja' command..." -if [ -f "/usr/bin/ninja-build" ] && [ ! -f "/usr/bin/ninja" ]; then - sudo ln -sf ninja-build /usr/bin/ninja - echo "Created symlink: /usr/bin/ninja -> /usr/bin/ninja-build" -else - echo "ninja command already exists or ninja-build not installed" -fi + protobuf protobuf-devel patchelf +echo "✅ Detected architecture: $ARCH → using package suffix: $PKG_ARCH" -# ============================================================================== -# 2. Define package names and URLs -# ============================================================================== -# JDK 8 -JDK_TAR="OpenJDK8U-jdk_${ARCH_TAG}_linux_hotspot_8u382b05.tar.gz" -JDK_URL="https://mirrors.huaweicloud.com/eclipse/temurin-compliance/temurin/8/jdk8u382-b05/$JDK_TAR" - -# Maven 3.9.11 -MAVEN_TAR="apache-maven-3.9.11-bin.tar.gz" -MAVEN_URL="https://mirrors.huaweicloud.com/apache/maven/maven-3/3.9.11/binaries/$MAVEN_TAR" - -# Go 1.21.4 source -GO_SRC_TAR="go1.21.4.src.tar.gz" -GO_REPO_URL="https://gitee.com/src-openeuler/golang.git" -GO_REPO_BRANCH="openEuler-24.03-LTS" - -# Python versions -PYTHON_VERSIONS=("3.9.11" "3.10.2" "3.11.4") -declare -A PYTHON_URLS -for ver in "${PYTHON_VERSIONS[@]}"; do - major_minor=$(echo "$ver" | cut -d. -f1-2) - PYTHON_URLS["$ver"]="https://mirrors.huaweicloud.com/python/${ver}/Python-${ver}.tgz" +PKG_DIR="$(pwd)/offline-pkgs" +BUILD_TOOLS="/opt/buildtools" +REMOTE_BASE="https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/build_tools/openeuler_22.03_LTS/${OBS_ARCH}" + +mkdir -p "$PKG_DIR" + +# --- Required packages --- +REQUIRED_PKGS=( + "jdk8-linux-${PKG_ARCH}.tar.gz" + "apache-maven-3.9.11-bin.tar.gz" + "go-1.24.1-linux-${PKG_ARCH}.tar.gz" + "python-3.9.11-linux-${PKG_ARCH}.tar.gz" + "python-3.10.2-linux-${PKG_ARCH}.tar.gz" + "python-3.11.4-linux-${PKG_ARCH}.tar.gz" + "bazel-6.5.0-linux-${PKG_ARCH}.tar.gz" + "ninja-1.12.0-linux-${PKG_ARCH}.tar.gz" + "nodejs-20.19.0-linux-${PKG_ARCH}.tar.gz" +) + +# --- Ensure all packages are present (download if missing) --- +echo "🔍 Checking and fetching required packages..." +for pkg in "${REQUIRED_PKGS[@]}"; do + local_path="$PKG_DIR/$pkg" + + if [ -f "$local_path" ]; then + echo "✅ Found locally: $pkg" + else + # Determine remote subpath: most go under ${PKG_ARCH}/, but Maven is arch-independent + remote_url="${REMOTE_BASE}/${pkg}" + echo "⬇️ Downloading missing package: $pkg" + echo " From: $remote_url" + + # Use curl if available, fallback to wget + if command -v curl >/dev/null 2>&1; then + curl -fL --retry 3 --connect-timeout 10 --max-time 60 "$remote_url" -o "$local_path" + elif command -v wget >/dev/null 2>&1; then + wget -q --timeout=10 --tries=3 -O "$local_path" "$remote_url" + else + echo "❌ Neither curl nor wget found. Cannot download $pkg." >&2 + exit 1 + fi + + if [ ! -s "$local_path" ]; then + echo "❌ Download failed or empty file: $pkg" >&2 + rm -f "$local_path" + exit 1 + fi + + echo "✅ Downloaded: $pkg" + fi done -# Bazel 6.5.0 -BAZEL_BINARY="bazel-6.5.0-linux-$BAZEL_ARCH" -BAZEL_URL="https://mirrors.huaweicloud.com/bazel/6.5.0/$BAZEL_BINARY" - - -# ============================================================================== -# 3. Install tools: JDK, Maven, Go, Python, Bazel -# ============================================================================== - -# --- Install JDK 8 --- -if [ ! -d "$BUILD_TOOLS/jdk8" ]; then - echo "Installing JDK 8..." - if [ ! -f "$TMP_DIR/$JDK_TAR" ]; then - wget -O "$TMP_DIR/$JDK_TAR" "$JDK_URL" - fi - tar -xf "$TMP_DIR/$JDK_TAR" -C "$BUILD_TOOLS" - mv "$BUILD_TOOLS/jdk8u382-b05" "$BUILD_TOOLS/jdk8" -else - echo "JDK already installed at $BUILD_TOOLS/jdk8" -fi +echo "✅ All packages ready." -# --- Install Bazel --- -if [ ! -f "/usr/local/bin/bazel" ]; then - echo "Installing Bazel 6.5.0..." - sudo wget -O /usr/local/bin/bazel "$BAZEL_URL" - sudo chmod +x /usr/local/bin/bazel -else - echo "Bazel already installed at /usr/local/bin/bazel" -fi +# --- Rest of installation logic (unchanged) --- +sudo mkdir -p "$BUILD_TOOLS" +sudo chown "$(whoami):$(whoami)" "$BUILD_TOOLS" || true -# --- Install Maven --- -if [ ! -d "$BUILD_TOOLS/apache-maven-3.9.11" ]; then - echo "Installing Maven..." - if [ ! -f "$TMP_DIR/$MAVEN_TAR" ]; then - wget -O "$TMP_DIR/$MAVEN_TAR" "$MAVEN_URL" - fi - tar -xf "$TMP_DIR/$MAVEN_TAR" -C "$BUILD_TOOLS" +echo "📦 Installing JDK..." +sudo tar -xzf "$PKG_DIR/jdk8-linux-${PKG_ARCH}.tar.gz" -C "$BUILD_TOOLS" -else - echo "Maven already installed" -fi +echo "📦 Installing Maven..." +sudo tar -xzf "$PKG_DIR/apache-maven-3.9.11-bin.tar.gz" -C "$BUILD_TOOLS" -# --- Build and Install Go from source --- -if [ ! -d "$BUILD_TOOLS/golang_go-1.21.4" ]; then - echo "Building Go 1.21.4 from source..." - if [ ! -f "$TMP_DIR/$GO_SRC_TAR" ]; then - git clone "$GO_REPO_URL" -b "$GO_REPO_BRANCH" "$TMP_DIR/golang_repo" - cp "$TMP_DIR/golang_repo/$GO_SRC_TAR" "$TMP_DIR/" - fi - tar -xzf "$TMP_DIR/$GO_SRC_TAR" -C "$TMP_DIR" - cd "$TMP_DIR/go/src" && ./make.bash - mv "$TMP_DIR/go" "$BUILD_TOOLS/golang_go-1.21.4" - sudo yum remove -y golang || true -else - echo "Go already built and installed" -fi +echo "📦 Installing Go..." +sudo tar -xzf "$PKG_DIR/go-1.24.1-linux-${PKG_ARCH}.tar.gz" -C "$BUILD_TOOLS" -# --- Install Python versions --- -install_python() { - local version=$1 - local major_minor=$(echo "$version" | cut -d. -f1-2) - local tarball="Python-${version}.tgz" - local url="${PYTHON_URLS[$version]}" +echo "📦 Installing Python versions..." +sudo tar -xzf "$PKG_DIR/python-3.9.11-linux-${PKG_ARCH}.tar.gz" -C / +sudo tar -xzf "$PKG_DIR/python-3.10.2-linux-${PKG_ARCH}.tar.gz" -C / +sudo tar -xzf "$PKG_DIR/python-3.11.4-linux-${PKG_ARCH}.tar.gz" -C / - if [ -d "$BUILD_TOOLS/python$major_minor" ]; then - echo "Python $version already installed" - return - fi +echo "📦 Installing Bazel..." +sudo tar -xzf "$PKG_DIR/bazel-6.5.0-linux-${PKG_ARCH}.tar.gz" -C /usr/local/bin/ +sudo chmod +x /usr/local/bin/bazel - echo "Installing Python $version..." +echo "📦 Installing Ninja..." +sudo tar -xzf "$PKG_DIR/ninja-1.12.0-linux-${PKG_ARCH}.tar.gz" -C / - if [ ! -f "$TMP_DIR/$tarball" ]; then - wget -O "$TMP_DIR/$tarball" "$url" - fi +echo "📦 Installing Node.js..." +sudo tar -xzf "$PKG_DIR/nodejs-20.19.0-linux-${PKG_ARCH}.tar.gz" -C "$BUILD_TOOLS" - tar -xzf "$TMP_DIR/$tarball" -C "$TMP_DIR" - cd "$TMP_DIR/Python-$version" - ./configure \ - --prefix="$BUILD_TOOLS/python$major_minor" \ - --with-openssl=/usr \ - --enable-loadable-sqlite-extensions \ - --enable-shared - make -j $(nproc) - sudo make install - sudo chmod -R 755 "$BUILD_TOOLS/python$major_minor" -} - -for ver in "${PYTHON_VERSIONS[@]}"; do - install_python "$ver" +# --- Python symlinks --- +for ver in "3.9" "3.10" "3.11"; do + sudo ln -sf "$BUILD_TOOLS/python$ver/bin/python$ver" "/usr/local/bin/python$ver" + sudo ln -sf "$BUILD_TOOLS/python$ver/bin/python$ver" "$BUILD_TOOLS/python$ver/bin/python" + sudo ln -sf "$BUILD_TOOLS/python$ver/bin/pip$ver" "/usr/local/bin/pip$ver" done +sudo ln -sf /usr/local/bin/python3.9 /usr/bin/python3 2>/dev/null || true +sudo ln -sf /usr/bin/python3 /usr/bin/python 2>/dev/null || true -# ============================================================================== -# 4. Set environment variables (Huawei Cloud mirrors) -# ============================================================================== - -# --- JAVA & MAVEN --- -sudo tee /etc/profile.d/buildtools-java-maven.sh > /dev/null << 'EOF' -export JAVA_HOME=/opt/buildtools/jdk8 -export MAVEN_HOME=/opt/buildtools/apache-maven-3.9.11 -export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH -EOF +# --- Dynamic linker config --- +echo "/opt/buildtools/python3.9/lib" | sudo tee /etc/ld.so.conf.d/python3.9.conf > /dev/null +echo "/opt/buildtools/python3.10/lib" | sudo tee /etc/ld.so.conf.d/python3.10.conf > /dev/null +echo "/opt/buildtools/python3.11/lib" | sudo tee /etc/ld.so.conf.d/python3.11.conf > /dev/null +sudo ldconfig +# --- Global environment setup --- +sudo tee /etc/profile.d/buildtools.sh > /dev/null << 'EOF' export JAVA_HOME=/opt/buildtools/jdk8 export MAVEN_HOME=/opt/buildtools/apache-maven-3.9.11 -export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH - -mkdir -p "$MAVEN_HOME/conf" - cat > "$MAVEN_HOME/conf/settings.xml" << 'EOF' - - - - - huaweicloud - central - https://repo.huaweicloud.com/repository/maven/ - - - -EOF - -# --- Go --- -sudo tee /etc/profile.d/buildtools-go.sh > /dev/null << 'EOF' -export GOROOT=/opt/buildtools/golang_go-1.21.4 -export GOPATH=/opt/buildtools/go_workspace -export GO111MODULE=on -export GONOSUMDB=* -export GOPROXY=https://goproxy.cn,direct -export PATH=$GOROOT/bin:$GOPATH/bin:$PATH -EOF - -export GOROOT=/opt/buildtools/golang_go-1.21.4 +export GOROOT=/opt/buildtools/golang_go-1.24.1 export GOPATH=/opt/buildtools/go_workspace -mkdir -p "$GOPATH" -chmod 777 -R "$GOPATH" +export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$GOROOT/bin:$GOPATH/bin:/opt/buildtools/nodejs/bin:$PATH export GO111MODULE=on +export GOPROXY=https://mirrors.huaweicloud.com/repository/goproxy/ export GONOSUMDB=* -export GOPROXY=https://goproxy.cn,direct -export PATH=$GOROOT/bin:$GOPATH/bin:$PATH -go install google.golang.org/protobuf/cmd/protoc-gen-go@latest -go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest - -# --- Python --- -sudo tee /etc/profile.d/python-env.sh > /dev/null << 'EOF' export PYTHON_PATH_3911=/opt/buildtools/python3.9 export PYTHON_PATH_3102=/opt/buildtools/python3.10 export PYTHON_PATH_3114=/opt/buildtools/python3.11 -export PATH=$PYTHON_PATH_3911/bin:$PYTHON_PATH_3102/bin:$PYTHON_PATH_3114/bin:$PATH +export PATH=$PYTHON_PATH_3911/bin:$PYTHON_PATH_3102/bin:$PYTHON_PATH_3114/bin:$HOME/.local/bin:$PATH export LD_LIBRARY_PATH=$PYTHON_PATH_3911/lib:$PYTHON_PATH_3102/lib:$PYTHON_PATH_3114/lib:/usr/lib:/usr/lib64:$LD_LIBRARY_PATH -EOF -export PYTHON_PATH_3911=/opt/buildtools/python3.9 -export PYTHON_PATH_3102=/opt/buildtools/python3.10 -export PYTHON_PATH_3114=/opt/buildtools/python3.11 -export PATH=$PYTHON_PATH_3911/bin:$PYTHON_PATH_3102/bin:$PYTHON_PATH_3114/bin:$PATH -export LD_LIBRARY_PATH=$PYTHON_PATH_3911/lib:$PYTHON_PATH_3102/lib:$PYTHON_PATH_3114/lib:/usr/lib:/usr/lib64:$LD_LIBRARY_PATH +export LANG=C.UTF-8 +export TMOUT=0 +EOF -# Create symlinks for Python and pip -sudo ln -sf "$BUILD_TOOLS/python3.9/bin/python3.9" "/usr/local/bin/python3.9" -sudo ln -sf "$BUILD_TOOLS/python3.9/bin/pip3.9" "/usr/local/bin/pip3.9" -sudo ln -sf "$BUILD_TOOLS/python3.10/bin/python3.10" "/usr/local/bin/python3.10" -sudo ln -sf "$BUILD_TOOLS/python3.10/bin/pip3.10" "/usr/local/bin/pip3.10" -sudo ln -sf "$BUILD_TOOLS/python3.11/bin/python3.11" "/usr/local/bin/python3.11" -sudo ln -sf "$BUILD_TOOLS/python3.11/bin/pip3.11" "/usr/local/bin/pip3.11" -sudo ln -sf /usr/local/bin/python3.9 /usr/bin/python3 || true -sudo ln -sf /usr/bin/python3 /usr/bin/python || true - -# Update shared library cache -echo "$PYTHON_PATH_3911/lib" | sudo tee /etc/ld.so.conf.d/python3.9.conf > /dev/null -echo "$PYTHON_PATH_3102/lib" | sudo tee /etc/ld.so.conf.d/python3.10.conf > /dev/null -echo "$PYTHON_PATH_3114/lib" | sudo tee /etc/ld.so.conf.d/python3.11.conf > /dev/null -sudo ldconfig -# Set locale and disable timeout -echo 'export LANG=C.UTF-8' | sudo tee /etc/profile.d/lang.sh > /dev/null -export LANG=C.UTF-8 +# --- Configure pip mirrors --- +for py in "3.9" "3.10" "3.11"; do + pip_cmd="pip$(echo $py | tr -d .)" + if command -v "$pip_cmd" &> /dev/null; then + "$pip_cmd" config --user set global.index-url https://mirrors.huaweicloud.com/repository/pypi/simple + "$pip_cmd" config --user set global.trusted-host mirrors.huaweicloud.com + fi +done -echo 'export TMOUT=0' | sudo tee /etc/profile.d/timeout.sh > /dev/null -export TMOUT=0 # ============================================================================== -# 5. Configure pip to use Huawei Cloud mirror +# Configure pip to use Huawei Cloud mirror # ============================================================================== echo "Configuring pip to use Huawei Cloud mirror..." pip3.9 config --user set global.index-url https://mirrors.huaweicloud.com/repository/pypi/simple @@ -298,15 +185,25 @@ pip3.11 config --user set global.index-url https://mirrors.huaweicloud.com/repos pip3.11 config --user set global.trusted-host mirrors.huaweicloud.com pip3.11 install wheel==0.36.2 +# --- Configure npm --- +export PATH="/opt/buildtools/nodejs/bin:$PATH" +if command -v npm &> /dev/null; then + npm config set registry https://mirrors.huaweicloud.com/repository/npm/ + npm config set strict-ssl false +fi -# ============================================================================== -# 6. Verify essential tools -# ============================================================================== -if check_tools; then - echo "Build environment is ready." - echo "Run: source /etc/profile.d/*.sh to load in current shell." - exit 0 -else - echo "Error, init environment failed" - exit 1 -fi \ No newline at end of file +sudo chown -R "$(whoami):$(whoami)" /opt/buildtools + +echo +echo "🎉 Installation completed successfully on $ARCH!" +echo "👉 Run this to activate environment:" +echo " source /etc/profile.d/buildtools.sh" +echo +echo "✅ Verify your tools:" +echo " java -version # Should show JDK 8" +echo " mvn -v # Maven 3.9.11" +echo " go version # Go 1.24.1" +echo " python3.9 --version # Python 3.9.11" +echo " node -v # Node.js 20.19.0" +echo " bazel --version # Bazel 6.5.0" +echo " ninja --version # Ninja 1.12.0" \ No newline at end of file