export TREE_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/tre.org/tre_1.0.0
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/bin
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1
export CARGO_TARGET_DIR=${PWD}/target
export TARGET=aarch64-unknown-linux-musl
export CC_aarch64_unknown_linux_musl=${CC}
export CXX_aarch64_unknown_linux_musl=${CXX}
export AR_aarch64_unknown_linux_musl=${AR}
export RANLIB_aarch64_unknown_linux_musl=${RANLIB}
export STRIP_aarch64_unknown_linux_musl=${STRIP}
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=${CC}
mkdir -p .cargo
SDK_PATH=${OHOS_SDK:-/Users/jianguo/Desktop/ohosdk}
LINKER_WRAPPER=$(mktemp)
cat > "${LINKER_WRAPPER}" << LINKER_EOF
#!/bin/bash
# 链接器包装脚本:过滤掉 LLD 不支持的选项
ARGS=()
SKIP_NEXT=false
for arg in "\$@"; do
if [ "\$SKIP_NEXT" = true ]; then
SKIP_NEXT=false
continue
fi
# 过滤掉 --as-needed 和 -Wl,--as-needed 选项
case "\$arg" in
*--as-needed*)
# 跳过这个选项
;;
-Wl,--as-needed)
# 跳过这个选项
;;
-Wl,--no-as-needed)
# 也跳过这个选项(LLD 不支持)
;;
*)
ARGS+=("\$arg")
;;
esac
done
# 调用实际的链接器
exec "${CC}" "\${ARGS[@]}"
LINKER_EOF
chmod +x "${LINKER_WRAPPER}"
cat > .cargo/config.toml << EOF
[target.aarch64-unknown-linux-musl]
linker = "${LINKER_WRAPPER}"
rustflags = [
"-C", "link-arg=--target=aarch64-linux-ohos",
"-C", "link-arg=--sysroot=${SDK_PATH}/native/sysroot",
"-C", "link-arg=-fuse-ld=lld",
"-C", "link-arg=--ld-path=${SDK_PATH}/native/llvm/bin/ld.lld",
]
EOF
echo "Created .cargo/config.toml with SDK path: ${SDK_PATH}"
echo "Created linker wrapper: ${LINKER_WRAPPER}"
echo "Cleaning previous build..."
cargo clean 2>/dev/null || true
echo "Building tre with cargo..."
cargo build --release --target ${TARGET} --verbose || {
echo "Error: Cargo build failed"
exit 1
}
BINARY_PATH=${CARGO_TARGET_DIR}/${TARGET}/release/tre
if [ ! -f "${BINARY_PATH}" ]; then
echo "Error: Binary not found at ${BINARY_PATH}"
exit 1
fi
echo "Installing tre binary..."
cp ${BINARY_PATH} ${TREE_INSTALL_HNP_PATH}/usr/bin/tre || {
echo "Error: Failed to copy binary"
exit 1
}
chmod +x ${TREE_INSTALL_HNP_PATH}/usr/bin/tre
if [ -f manual/tre.1 ]; then
echo "Installing man pages..."
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1
cp manual/tre.1 ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1/ 2>/dev/null || true
fi
cp hnp.json ${TREE_INSTALL_HNP_PATH}/ || {
echo "Error: Failed to copy hnp.json"
exit 1
}
echo "Packaging..."
pushd ${TREE_INSTALL_HNP_PATH}/../
${HNP_TOOL} pack -i ${TREE_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/ || {
echo "Error: HNP pack failed"
popd
exit 1
}
tar -zvcf ${ARCHIVE_PATH}/ohos_tre_1.0.0.tar.gz tre_1.0.0/ || {
echo "Error: Tar packaging failed"
popd
exit 1
}
popd
echo ""
echo "=========================================="
echo "Build completed successfully!"
echo "=========================================="
echo "HNP Package: ${ARCHIVE_PATH}/tre.org_tre_1.0.0.hnp"
echo "Tar Archive: ${ARCHIVE_PATH}/ohos_tre_1.0.0.tar.gz"
echo "Installation Path: ${TREE_INSTALL_HNP_PATH}"
echo "=========================================="
echo ""
export PREFIX=${sys_prefix}