#!/bin/bash
# ============================================================
# 在【离线麒麟V10 Server】机器上以 root 运行
# 前提：本目录下已有 rpms/、gmt-6.1.0-src.tar.xz、
#       gshhg-gmt-2.3.7.tar.gz、dcw-gmt-2.1.2.tar.gz、
#       netcdf-c-4.9.2.tar.gz（麒麟源里没有netcdf包，需源码编译）
# 功能：装依赖 -> 源码编译netcdf-c -> 编译GMT 6.1.0 -> 安装到
#       /opt/gmt -> 配置环境变量
# ============================================================
set -e
BASE=$(cd "$(dirname "$0")" && pwd)
PREFIX=/opt/gmt
NETCDF_PREFIX=/usr/local

echo "==== [1/7] 安装编译依赖 RPM ===="
if [ -d "$BASE/rpms" ] && ls "$BASE"/rpms/*.rpm >/dev/null 2>&1; then
    # 优先用 dnf localinstall（自动处理顺序和冲突），失败再退回 rpm
    if command -v dnf >/dev/null 2>&1; then
        dnf localinstall -y --disablerepo='*' "$BASE"/rpms/*.rpm || \
        rpm -Uvh --force --nodeps "$BASE"/rpms/*.rpm || true
    else
        yum localinstall -y --disablerepo='*' "$BASE"/rpms/*.rpm || \
        rpm -Uvh --force --nodeps "$BASE"/rpms/*.rpm || true
    fi
else
    echo "警告: 未找到 rpms/ 目录或其中无RPM，假定依赖已装好"
fi

echo "==== [2/7] 检查基础编译环境 ===="
for c in gcc g++ make cmake; do
    command -v $c >/dev/null || { echo "缺少 $c，请检查 rpms/ 是否完整"; exit 1; }
done
gcc --version | head -1
cmake --version | head -1

echo "==== [3/7] 源码编译安装 netcdf-c 4.9.2 ===="
if nc-config --version >/dev/null 2>&1 || [ -x /usr/local/bin/nc-config ]; then
    echo "系统已有 netcdf，跳过编译:"
    nc-config --version 2>/dev/null || /usr/local/bin/nc-config --version
else
    if [ ! -f "$BASE/netcdf-c-4.9.2.tar.gz" ]; then
        echo "错误: 缺少 netcdf-c-4.9.2.tar.gz 且系统无netcdf，无法继续"; exit 1
    fi
    # 检查netcdf编译所需的头文件（来自rpms里的 zlib-devel/libcurl-devel）
    [ -f /usr/include/zlib.h ] || { echo "缺少 zlib-devel"; exit 1; }
    cd "$BASE"
    tar -xzf netcdf-c-4.9.2.tar.gz
    cd netcdf-c-4.9.2
    # 不启用 netcdf-4/HDF5（麒麟源没有hdf5-devel），经典netCDF-3格式
    # GMT 完全够用；关闭DAP避免联网功能（离线机器用不上）
    ./configure --prefix=$NETCDF_PREFIX \
        --disable-netcdf-4 --disable-dap --disable-byterange \
        --enable-static --enable-shared
    make -j$(nproc)
    make install
    ldconfig
    $NETCDF_PREFIX/bin/nc-config --version
fi

echo "==== [4/7] 解压岸线(GSHHG)与国界(DCW)数据 ===="
mkdir -p $PREFIX/share
tar -xzf "$BASE/gshhg-gmt-2.3.7.tar.gz" -C $PREFIX/share
tar -xzf "$BASE/dcw-gmt-2.1.2.tar.gz"  -C $PREFIX/share

echo "==== [5/7] 解压GMT源码并编译 ===="
cd "$BASE"
tar -xJf gmt-6.1.0-src.tar.xz
cd gmt-6.1.0
# GMT 6.1.0 官方bug：无GDAL编译时 gmt_api.c 引用了不存在的 gdal_read_in 成员
# （上游 6.1.1 已修复），打上随包补丁
if [ -f "$BASE/gmt-6.1.0-no-gdal-fix.patch" ]; then
    patch -p1 --forward < "$BASE/gmt-6.1.0-no-gdal-fix.patch" || \
        echo "提示: 补丁可能已应用过，继续"
else
    echo "错误: 缺少 gmt-6.1.0-no-gdal-fix.patch（无GDAL时编译必失败）"; exit 1
fi
rm -rf build && mkdir build && cd build
cmake .. \
  -DCMAKE_INSTALL_PREFIX=$PREFIX \
  -DCMAKE_BUILD_TYPE=Release \
  -DnetCDF_ROOT=$NETCDF_PREFIX \
  -DnetCDF_INCLUDE_DIR=$NETCDF_PREFIX/include \
  -DnetCDF_LIBRARY=$NETCDF_PREFIX/lib/libnetcdf.so \
  -DGSHHG_ROOT=$PREFIX/share/gshhg-gmt-2.3.7 \
  -DDCW_ROOT=$PREFIX/share/dcw-gmt-2.1.2
make -j$(nproc)
make install

echo "==== [6/7] 配置环境变量 ===="
cat > /etc/profile.d/gmt.sh <<EOF
export GMT6DIR=$PREFIX
export PATH=$PREFIX/bin:\$PATH
export LD_LIBRARY_PATH=$PREFIX/lib64:$PREFIX/lib:$NETCDF_PREFIX/lib:\$LD_LIBRARY_PATH
EOF
chmod +x /etc/profile.d/gmt.sh
# netcdf库路径写入ldconfig，保证非登录shell也能找到
echo "$NETCDF_PREFIX/lib" > /etc/ld.so.conf.d/usrlocal.conf
ldconfig

echo "==== [7/7] 验证 ===="
export PATH=$PREFIX/bin:$PATH
export LD_LIBRARY_PATH=$PREFIX/lib64:$PREFIX/lib:$NETCDF_PREFIX/lib:$LD_LIBRARY_PATH
gmt --version
gmt --show-datadir
echo ""
echo "安装完成！新开终端或执行 source /etc/profile.d/gmt.sh 后即可使用 gmt 命令"
