summarylogtreecommitdiffstats
path: root/PKGBUILD
blob: ea153782492c08e84e2da046142f7b0fdb36cbfc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# Maintainer: SteamedFish <steamedfish@hotmail.com>
# Split package: amdgpu-exporter + rocprofiler-client
#   Both sub-packages are built from the same upstream source:
#   https://github.com/ROCm/device-metrics-exporter
#
# Bundled blobs replaced by source-built packages:
#   librocpclient.so / rocpctl -> rocprofiler-client (this PKGBUILD)
#   gpuagent / gpuctl          -> rocm-gpu-agent (separate PKGBUILD, gpu-agent source)
#
# Existing Arch packages used as-is (no custom build needed):
#   amdsmi      (upstream wrongly named amd-smi-lib)
#   rocprofiler (upstream wrongly named rocprofiler-sdk)

pkgbase=amdgpu-exporter
pkgname=('amdgpu-exporter' 'rocprofiler-client')
pkgver=1.5.0
pkgrel=2
pkgdesc="AMD GPU metrics exporter for Prometheus"
arch=('x86_64')
url="https://github.com/ROCm/device-metrics-exporter"
license=('Apache-2.0')
makedepends=(
    'go'
    'cmake'
    'hip-runtime-amd'
    'rocprofiler'
    'elfutils'
    'pkgconf'
    'amdsmi'
    'rocm-gpu-agent'
    'patchelf'
)

_srcname="device-metrics-exporter-${pkgver}"

source=(
    "${_srcname}.tar.gz::https://github.com/ROCm/device-metrics-exporter/archive/refs/tags/v${pkgver}.tar.gz"
    "amd-metrics-exporter.service"
    "fix-missing-iseventsdisabled.patch"
)
sha256sums=('0b5d5dfca74d97976c6fb83bddc69abe7396367ba61a410484673209cdcf8d14'
            '1200ad9753baf0cc7f16fa702303dac3b7f3ec9a049a77b0fbc7e5f7fe7c586f'
            '39fb1e4e3530679acb5ab4686f1ca1ab17be2ecea20e28523595fbe5376e7968')

# ---------------------------------------------------------------------------
# prepare(): apply patches
# ---------------------------------------------------------------------------
prepare() {
    cd "${srcdir}/${_srcname}"
    # Fix upstream bug: IsEventsDisabled is called but never defined
    patch -Np1 -i "${srcdir}/fix-missing-iseventsdisabled.patch"
}

# ---------------------------------------------------------------------------
# build(): compile all outputs from device-metrics-exporter
# ---------------------------------------------------------------------------
build() {
    local dmedir="${srcdir}/${_srcname}"

    # ---- Go binaries ----
    cd "${dmedir}"
    export CGO_ENABLED=0
    export GOFLAGS="-mod=vendor"

    export GODEBUG=netdns=cgo
    go build -trimpath -ldflags="-s -w" -buildmode=pie -o "${srcdir}/amd-metrics-exporter" ./cmd/exporter
    go build -trimpath -ldflags="-s -w" -buildmode=pie -o "${srcdir}/amd-test-runner"       ./cmd/testrunner
    go build -trimpath -ldflags="-s -w" -buildmode=pie -o "${srcdir}/metricutil"            ./tools/metricutil
    go build -trimpath -ldflags="-s -w" -buildmode=pie -o "${srcdir}/metricsclient"         ./tools/metricsclient
    go build -trimpath -ldflags="-s -w" -buildmode=pie -o "${srcdir}/amdgpuhealth"          ./tools/amd-gpu-health

    # ---- librocpclient.so + rocpctl (CMake + HIP) ----
    local rocpclientbuild="${srcdir}/build-rocprofiler-client"

    # Auto-detect HIP-capable clang
    local hip_compiler
    for candidate in \
        /opt/rocm/lib/llvm/bin/clang++ \
        /opt/rocm/bin/amdclang++ \
        /usr/bin/amdclang++; do
        if [[ -x "${candidate}" ]]; then
            hip_compiler="${candidate}"
            break
        fi
    done
    [[ -n "${hip_compiler}" ]] || { echo "ERROR: No HIP-capable clang++ found"; exit 1; }

    cmake -S "${dmedir}/rocprofilerclient" -B "${rocpclientbuild}" \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_CXX_COMPILER="${hip_compiler}" \
        -DCMAKE_PREFIX_PATH=/opt/rocm \
        -DCMAKE_INSTALL_PREFIX=/usr \
        -DCMAKE_INSTALL_LIBDIR=lib \
        -DHIP_PLATFORM=amd
    cmake --build "${rocpclientbuild}" -- -j"$(nproc)"
}

# ---------------------------------------------------------------------------
# package_amdgpu-exporter(): Go binaries + config + service units
# ---------------------------------------------------------------------------
package_amdgpu-exporter() {
    pkgdesc="AMD GPU metrics exporter for Prometheus"
    depends=(
        'glibc'
        'zlib'
        'amdsmi'
        'rocprofiler'
        'hip-runtime-amd'
        'rocm-gpu-agent'
        'rocprofiler-client'
    )
    optdepends=('prometheus: scrape /metrics HTTP endpoint')
    backup=(
        'etc/metrics/config.json'
    )

    local dmedir="${srcdir}/${_srcname}"

    install -Dm755 "${srcdir}/amd-metrics-exporter" "${pkgdir}/usr/bin/amd-metrics-exporter"
    install -Dm755 "${srcdir}/amd-test-runner"       "${pkgdir}/usr/bin/amd-test-runner"
    install -Dm755 "${srcdir}/metricutil"            "${pkgdir}/usr/bin/metricutil"
    install -Dm755 "${srcdir}/metricsclient"         "${pkgdir}/usr/bin/metricsclient"
    install -Dm755 "${srcdir}/amdgpuhealth"          "${pkgdir}/usr/bin/amdgpuhealth"
    install -Dm644 "${dmedir}/example/config.json"   "${pkgdir}/etc/metrics/config.json"

    install -Dm644 "${srcdir}/amd-metrics-exporter.service" \
        "${pkgdir}/usr/lib/systemd/system/amd-metrics-exporter.service"

    install -Dm644 "${dmedir}/LICENSE" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
}

# ---------------------------------------------------------------------------
# package_rocprofiler-client(): librocpclient.so + rocpctl
# ---------------------------------------------------------------------------
package_rocprofiler-client() {
    pkgdesc="ROCm profiler client library and CLI for amdgpu-exporter"
    depends=(
        'glibc'
        'rocprofiler'
    )
    provides=('librocpclient.so=0-64')

    install -Dm755 "${srcdir}/build-rocprofiler-client/librocpclient.so" \
        "${pkgdir}/usr/lib/librocpclient.so"
    install -Dm755 "${srcdir}/build-rocprofiler-client/rocpctl" \
        "${pkgdir}/usr/bin/rocpctl"

    # Fix insecure RPATHs baked in at build time
    patchelf --set-rpath /usr/lib "${pkgdir}/usr/lib/librocpclient.so"
    patchelf --set-rpath /usr/lib "${pkgdir}/usr/bin/rocpctl"

    install -Dm644 "${srcdir}/${_srcname}/LICENSE" \
        "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
}