1- .PHONY : all clean test cupti-amd64 cupti-arm64 test-infra docker-push docker-test-build docker-test-run
1+ .PHONY : all clean test cupti-amd64 cupti-arm64 cupti-all cupti-all-versions cross test-infra docker-push push-cuda-headers docker-test-build docker-test-run format
2+
3+ # CUDA version configuration
4+ CUDA_MAJOR ?= 12
5+ CUDA_FULL_VERSION ?= 12.9.1
6+ LIB_NAME = libparcagpucupti.so.$(CUDA_MAJOR )
27
38# Default target: build everything for native architecture
49all : cupti-all test-infra
510
611# Build libparcagpucupti.so for AMD64 using Docker
712cupti-amd64 :
8- @echo " === Building libparcagpucupti.so for AMD64 with Docker ==="
13+ @echo " === Building $( LIB_NAME ) for AMD64 with Docker (CUDA $( CUDA_MAJOR ) ) ==="
914 @mkdir -p /tmp/parcagpu-build-amd64
1015 @docker buildx use default
1116 @docker buildx build -f Dockerfile \
12- --target export \
17+ --build-arg CUDA_12_HEADERS=$(CUDA_12_HEADERS ) \
18+ --build-arg CUDA_13_HEADERS=$(CUDA_13_HEADERS ) \
19+ --target export-cuda$(CUDA_MAJOR ) \
1320 --output type=local,dest=/tmp/parcagpu-build-amd64 \
14- --platform linux/amd64 cupti
15- @mkdir -p build/amd64
16- @cp /tmp/parcagpu-build-amd64/libparcagpucupti.so build/amd64/
17- @echo " AMD64 library built: build/amd64/libparcagpucupti.so"
21+ --platform linux/amd64 .
22+ @mkdir -p build/$(CUDA_MAJOR ) /amd64
23+ @cp /tmp/parcagpu-build-amd64/$(LIB_NAME ) build/$(CUDA_MAJOR ) /amd64/
24+ @ln -sf $(LIB_NAME ) build/$(CUDA_MAJOR ) /amd64/libparcagpucupti.so
25+ @echo " AMD64 library built: build/$( CUDA_MAJOR) /amd64/$( LIB_NAME) "
1826
1927# Build libparcagpucupti.so for ARM64 using Docker
2028cupti-arm64 :
21- @echo " === Building libparcagpucupti.so for ARM64 with Docker ==="
29+ @echo " === Building $( LIB_NAME ) for ARM64 with Docker (CUDA $( CUDA_MAJOR ) ) ==="
2230 @mkdir -p /tmp/parcagpu-build-arm64
2331 @docker buildx create --name parcagpu-builder --use --bootstrap 2> /dev/null || docker buildx use parcagpu-builder
2432 @docker buildx build -f Dockerfile \
25- --target export \
33+ --build-arg CUDA_12_HEADERS=$(CUDA_12_HEADERS ) \
34+ --build-arg CUDA_13_HEADERS=$(CUDA_13_HEADERS ) \
35+ --target export-cuda$(CUDA_MAJOR ) \
2636 --output type=local,dest=/tmp/parcagpu-build-arm64 \
27- --platform linux/arm64 cupti
28- @mkdir -p build/arm64
29- @cp /tmp/parcagpu-build-arm64/libparcagpucupti.so build/arm64/
30- @echo " ARM64 library built: build/arm64/libparcagpucupti.so"
37+ --platform linux/arm64 .
38+ @mkdir -p build/$(CUDA_MAJOR ) /arm64
39+ @cp /tmp/parcagpu-build-arm64/$(LIB_NAME ) build/$(CUDA_MAJOR ) /arm64/
40+ @ln -sf $(LIB_NAME ) build/$(CUDA_MAJOR ) /arm64/libparcagpucupti.so
41+ @echo " ARM64 library built: build/$( CUDA_MAJOR) /arm64/$( LIB_NAME) "
3142
32- # Build both architectures
43+ # Build both architectures for current CUDA version
3344cupti-all : cupti-amd64 cupti-arm64
3445
46+ # Build runtime container with both CUDA versions for both architectures
47+ # Note: Builds but doesn't load into Docker (multi-platform images can't be loaded)
48+ # Use docker-push to push to a registry, or remove one platform to load locally
49+ cross :
50+ @echo " === Building runtime container for AMD64 and ARM64 (includes CUDA 12 and 13) ==="
51+ @docker buildx create --name parcagpu-builder --use --bootstrap 2> /dev/null || docker buildx use parcagpu-builder
52+ @docker buildx build -f Dockerfile \
53+ --build-arg CUDA_12_HEADERS=$(CUDA_12_HEADERS ) \
54+ --build-arg CUDA_13_HEADERS=$(CUDA_13_HEADERS ) \
55+ --target runtime \
56+ --platform linux/amd64,linux/arm64 \
57+ .
58+ @echo " Runtime container built for both platforms (cached, not loaded into Docker)"
59+
60+ # Build all artifacts (CUDA 12 & 13 for both amd64 and arm64)
61+ cupti-all-versions :
62+ @echo " === Building all CUDA versions (12 and 13) for both architectures ==="
63+ @$(MAKE ) cupti-amd64 CUDA_MAJOR=12 CUDA_FULL_VERSION=12.9.1
64+ @$(MAKE ) cupti-arm64 CUDA_MAJOR=12 CUDA_FULL_VERSION=12.9.1
65+ @$(MAKE ) cupti-amd64 CUDA_MAJOR=13 CUDA_FULL_VERSION=13.0.2
66+ @$(MAKE ) cupti-arm64 CUDA_MAJOR=13 CUDA_FULL_VERSION=13.0.2
67+ @echo " === All artifacts built ==="
68+ @echo " CUDA 12: build/12/amd64/libparcagpucupti.so.12"
69+ @echo " CUDA 12: build/12/arm64/libparcagpucupti.so.12"
70+ @echo " CUDA 13: build/13/amd64/libparcagpucupti.so.13"
71+ @echo " CUDA 13: build/13/arm64/libparcagpucupti.so.13"
72+
73+ # CUDA header image configuration
74+ # Can be overridden to use local images (e.g., make cupti-all CUDA_12_HEADERS=cuda-headers:12)
75+ CUDA_HEADERS_REGISTRY ?= ghcr.io/parca-dev/cuda-headers
76+ CUDA_12_HEADERS ?= $(CUDA_HEADERS_REGISTRY ) :12
77+ CUDA_13_HEADERS ?= $(CUDA_HEADERS_REGISTRY ) :13
78+
79+ # Build and push CUDA header images to registry
80+ # These are lightweight images (~35MB each) containing only CUDA headers and libcupti
81+ # Note: Only needs to be run manually when:
82+ # - CUDA versions are updated (12.9.1 -> 12.x.x, 13.0.2 -> 13.x.x)
83+ # - New CUDA major versions are added
84+ # - CUPTI API changes require header updates
85+ push-cuda-headers :
86+ @echo " === Building and pushing CUDA header images ==="
87+ @docker buildx create --name parcagpu-builder --use --bootstrap 2> /dev/null || docker buildx use parcagpu-builder
88+ @echo " Building CUDA 12 headers..."
89+ @docker buildx build -f Dockerfile.cuda-headers \
90+ --build-arg CUDA_VERSION=12.9.1 \
91+ --platform linux/amd64,linux/arm64 \
92+ --tag $(CUDA_HEADERS_REGISTRY ) :12 \
93+ --push \
94+ .
95+ @echo " Building CUDA 13 headers..."
96+ @docker buildx build -f Dockerfile.cuda-headers \
97+ --build-arg CUDA_VERSION=13.0.2 \
98+ --platform linux/amd64,linux/arm64 \
99+ --tag $(CUDA_HEADERS_REGISTRY ) :13 \
100+ --push \
101+ .
102+ @echo " CUDA header images pushed to $( CUDA_HEADERS_REGISTRY) :12 and :13"
103+
35104# Build test infrastructure with Zig
36105test-infra :
37106 @echo " === Building test infrastructure with Zig ==="
@@ -52,13 +121,17 @@ clean:
52121# Build and push multi-arch Docker images to ghcr.io
53122# Set IMAGE_TAG to override the default tag (e.g., make docker-push IMAGE_TAG=v1.0.0)
54123# Set IMAGE to override the image name (e.g., make docker-push IMAGE=ghcr.io/myuser/parcagpu)
124+ # Set CUDA_12_HEADERS and CUDA_13_HEADERS to override header images (e.g., cuda-headers:12 for local)
125+ # Note: Runtime image includes both CUDA 12 and 13
55126IMAGE ?= ghcr.io/parca-dev/parcagpu
56127IMAGE_TAG ?= latest
57128docker-push :
58129 @echo " === Setting up buildx builder ==="
59130 @docker buildx create --name parcagpu-builder --use --bootstrap 2> /dev/null || docker buildx use parcagpu-builder
60- @echo " === Building and pushing multi-arch Docker images to $( IMAGE) :$( IMAGE_TAG) ==="
131+ @echo " === Building and pushing multi-arch Docker images to $( IMAGE) :$( IMAGE_TAG) (includes CUDA 12 and 13) ==="
61132 @docker buildx build -f Dockerfile \
133+ --build-arg CUDA_12_HEADERS=$(CUDA_12_HEADERS ) \
134+ --build-arg CUDA_13_HEADERS=$(CUDA_13_HEADERS ) \
62135 --target runtime \
63136 --platform linux/amd64,linux/arm64 \
64137 --tag $(IMAGE ) :$(IMAGE_TAG ) \
0 commit comments