Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions .github/workflows/build_package_sources.yml
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,86 @@ jobs:
cat tpls_commits.lock
wc -l tpls_commits.lock || true

- name: Download CUDA-Q prerequisite sources
run: |
set -euo pipefail
# Generate cudaq_prereqs.lock for the current configuration
bash scripts/install_prerequisites.sh -l
cat cudaq_prereqs.lock

mkdir -p prereqs
while IFS= read -r line; do
# Skip comments and empty lines
[ -z "$line" ] && continue
case "$line" in
\#*) continue ;;
esac

name=""
type=""
url=""
ref=""

for kv in $line; do
key="${kv%%=*}"
val="${kv#*=}"
case "$key" in
name) name="$val" ;;
type) type="$val" ;;
url) url="$val" ;;
ref) ref="$val" ;;
esac
done

if [ -z "$name" ] || [ -z "$type" ]; then
echo "Skipping malformed lock entry: $line"
continue
fi

# Ensure a dedicated subdirectory for each prerequisite
mkdir -p "prereqs/${name}"

case "$type" in
tar)
fname="$(basename "$url")"
dest="prereqs/${name}/${fname}"
echo "Downloading tar archive for $name from $url -> $dest"
curl -L "$url" -o "$dest"
;;
sh)
fname="$(basename "$url")"
dest="prereqs/${name}/${fname}"
echo "Downloading shell installer for $name from $url -> $dest"
curl -L "$url" -o "$dest"
chmod +x "$dest"
;;
pem)
dest="prereqs/${name}/${name}.pem"
echo "Downloading PEM bundle for $name from $url -> $dest"
curl -L "$url" -o "$dest"
;;
git)
dest_dir="prereqs/${name}"
echo "Cloning git repo for $name from $url (ref=${ref:-HEAD}) -> $dest_dir"
git clone "$url" "$dest_dir"
if [ -n "${ref:-}" ]; then
git -C "$dest_dir" checkout "$ref"
fi
;;
script)
# No direct URL; record the script/target so downstream tooling
# can resolve the concrete sources if desired.
echo "$line" > "prereqs/${name}/lockentry"
;;
*)
echo "Unknown type '$type' in lock entry: $line"
;;
esac
done < cudaq_prereqs.lock

echo "Contents of prereqs/ (directories only):"
find prereqs -type d | sort

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

Expand Down
3 changes: 2 additions & 1 deletion docker/build/package_sources.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,13 @@ RUN mkdir -p "${SOURCES_ROOT}/NOTICES" \

ENV SCRIPTS_DIR=${SOURCES_ROOT}/.scripts

# Copy .gitmodules, tpls lock file, clone script, package lists, and pip sdist fetcher
# Copy .gitmodules, tpls lock file, clone script, package lists, pip sdist fetcher, and prereq sources
COPY .gitmodules "${SCRIPTS_DIR}"/.gitmodules
COPY tpls_commits.lock "${SCRIPTS_DIR}"/tpls_commits.lock
COPY scripts/clone_tpls_from_lock.sh "${SCRIPTS_DIR}"/clone_tpls_from_lock.sh
COPY package-source-diff/apt_packages_cudaq.txt package-source-diff/apt_packages_cudaqx.txt package-source-diff/apt_packages_cudaqx_trimmed.txt "${SCRIPTS_DIR}"/
COPY package-source-diff/pip_packages_cudaq.txt package-source-diff/pip_packages_cudaqx.txt package-source-diff/pip_packages_cudaqx_trimmed.txt package-source-diff/pip_packages_macos.txt package-source-diff/pip_packages_macos_trimmed.txt "${SCRIPTS_DIR}"/
COPY prereqs/ "${SOURCES_ROOT}/prereqs/"

# Copy attribution into NOTICES folder (NOTICE_PIP_* and NOTICE_APT_* generated per variant with CUDA version, e.g. NOTICE_PIP_cudaq_cu12)
COPY NOTICE LICENSE "${SOURCES_ROOT}/NOTICES/"
Expand Down
47 changes: 27 additions & 20 deletions scripts/install_prerequisites.sh
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,18 @@ CACERT_SHA256_URL="${CACERT_URL}.sha256"
AWS_SDK_CPP_URL="https://github.com/aws/aws-sdk-cpp"
AWS_SDK_CPP_REF="1.11.454"

# QRMI pre-built C artifacts for Pasqal QRMI connector
QRMI_RELEASE_REPO=${QRMI_RELEASE_REPO:-qiskit-community/qrmi}
QRMI_RELEASE_TAG=${QRMI_RELEASE_TAG:-v0.12.0}
QRMI_RELEASE_VERSION=${QRMI_RELEASE_TAG#v}
QRMI_RELEASE_BASE="https://github.com/${QRMI_RELEASE_REPO}/releases/download/${QRMI_RELEASE_TAG}"
QRMI_ARCHIVE="libqrmi-${QRMI_RELEASE_VERSION}-el8-x86_64.tar.gz"
QRMI_UNPACK_DIR="libqrmi-${QRMI_RELEASE_VERSION}"
# NOTE: This needs to be updated whenever the pre-built artifacts are updated. The SHA-256 can be computed with:
# wget -O qrmi.tar.gz "${QRMI_RELEASE_BASE}/${QRMI_ARCHIVE}"
# sha256sum qrmi.tar.gz | awk '{print $1}'
QRMI_ARCHIVE_SHA256=${QRMI_ARCHIVE_SHA256:-2986150d4f55e1f6566bef16d9fb3897ca04dd7eaa681865f7ef244f298a6746}

# Process command line arguments
toolchain=''
exclude_prereq=''
Expand Down Expand Up @@ -175,6 +187,13 @@ if $lock_mode; then
"url=${AWS_SDK_CPP_URL}" \
"ref=${AWS_SDK_CPP_REF}"

# [QRMI] Pre-built C artifacts for Pasqal QRMI connector
# Keep this in sync with the QRMI section in the installation path below.
add_lock_line "qrmi" \
"type=tar" \
"url=${QRMI_RELEASE_BASE}/${QRMI_ARCHIVE}" \
"version=${QRMI_RELEASE_VERSION}" \
"sha256=${QRMI_ARCHIVE_SHA256}"

echo "Prerequisites lockfile written to ${LOCK_FILE}."
(return 0 2>/dev/null) && return 0 || exit 0
Expand Down Expand Up @@ -575,38 +594,26 @@ if [ -n "$QRMI_INSTALL_PREFIX" ] && [ -z "$(echo $exclude_prereq | grep qrmi)" ]
temp_install_if_command_unknown wget wget
pushd "$PREREQS_BUILD_DIR"

QRMI_RELEASE_REPO=${QRMI_RELEASE_REPO:-qiskit-community/qrmi}
QRMI_RELEASE_TAG=${QRMI_RELEASE_TAG:-v0.12.0}
QRMI_RELEASE_VERSION=${QRMI_RELEASE_TAG#v}
qrmi_release_base="https://github.com/${QRMI_RELEASE_REPO}/releases/download/${QRMI_RELEASE_TAG}"
qrmi_archive="libqrmi-${QRMI_RELEASE_VERSION}-el8-x86_64.tar.gz" # Note: el8 build works on Ubuntu 18.04+.
qrmi_unpack_dir="libqrmi-${QRMI_RELEASE_VERSION}"

# NOTE: This needs to be updated whenever the pre-built artifacts are updated. The SHA-256 can be computed with:
# wget -O qrmi.tar.gz "${qrmi_release_base}/${qrmi_archive}"
# sha256sum qrmi.tar.gz | awk '{print $1}'
QRMI_ARCHIVE_SHA256="2986150d4f55e1f6566bef16d9fb3897ca04dd7eaa681865f7ef244f298a6746"

mkdir -p "$QRMI_INSTALL_PREFIX/include" "$QRMI_INSTALL_PREFIX/lib64"
wget "${qrmi_release_base}/${qrmi_archive}" -O "${qrmi_archive}"
wget "${QRMI_RELEASE_BASE}/${QRMI_ARCHIVE}" -O "${QRMI_ARCHIVE}"

if [ -x "$(command -v sha256sum)" ]; then
computed_sha256="$(sha256sum "${qrmi_archive}" | awk '{print $1}')"
computed_sha256="$(sha256sum "${QRMI_ARCHIVE}" | awk '{print $1}')"
else
computed_sha256="$(shasum -a 256 "${qrmi_archive}" | awk '{print $1}')"
computed_sha256="$(shasum -a 256 "${QRMI_ARCHIVE}" | awk '{print $1}')"
fi
if [ "$computed_sha256" != "$QRMI_ARCHIVE_SHA256" ]; then
echo -e "\e[01;31mError: SHA-256 checksum mismatch for ${qrmi_archive}.\e[0m" >&2
echo -e "\e[01;31mError: SHA-256 checksum mismatch for ${QRMI_ARCHIVE}.\e[0m" >&2
echo "Expected: $QRMI_ARCHIVE_SHA256" >&2
echo "Got: $computed_sha256" >&2
rm -f "${qrmi_archive}"
(return 1 2>/dev/null) && return 1 || exit 1
fi

tar -xzf "${qrmi_archive}"
cp "${qrmi_unpack_dir}/qrmi.h" "$qrmi_header"
cp "${qrmi_unpack_dir}/libqrmi.so" "$qrmi_library"
rm -rf "${qrmi_archive}" "${qrmi_unpack_dir}"
tar -xzf "${QRMI_ARCHIVE}"
cp "${QRMI_UNPACK_DIR}/qrmi.h" "$qrmi_header"
cp "${QRMI_UNPACK_DIR}/libqrmi.so" "$qrmi_library"
rm -rf "${QRMI_ARCHIVE}" "${QRMI_UNPACK_DIR}"

popd
remove_temp_installs
Expand Down
Loading