diff --git a/.github/workflows/build_package_sources.yml b/.github/workflows/build_package_sources.yml index 6d2d7f84ccc..caccffabb3e 100644 --- a/.github/workflows/build_package_sources.yml +++ b/.github/workflows/build_package_sources.yml @@ -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 diff --git a/docker/build/package_sources.Dockerfile b/docker/build/package_sources.Dockerfile index 2fc333fc52c..f2531386b48 100644 --- a/docker/build/package_sources.Dockerfile +++ b/docker/build/package_sources.Dockerfile @@ -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/" diff --git a/scripts/install_prerequisites.sh b/scripts/install_prerequisites.sh index 02f8f0644c2..da627de417c 100755 --- a/scripts/install_prerequisites.sh +++ b/scripts/install_prerequisites.sh @@ -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='' @@ -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 @@ -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