From 1f4a0e06af5bea1bdc20c93073bbe2674b8714c3 Mon Sep 17 00:00:00 2001 From: Alice Boucher Date: Tue, 25 Nov 2025 10:23:14 +0000 Subject: [PATCH 1/7] build script changes --- Makefile | 15 +++++++++++++++ build.sh | 35 ++++++++++++++++++++++++++++++++--- cpp/CMakeLists.txt | 5 +++++ 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..15ed54d07 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Makefile + +LIBCUOPT_BUILD_DIR ?= cpp/build +VERBOSE_FLAG ?= +PARALLEL_LEVEL ?= + +.PHONY: all ninja-build + +all: ninja-build + +ninja-build: + cmake --build $(LIBCUOPT_BUILD_DIR) $(VERBOSE_FLAG) $(if $(PARALLEL_LEVEL),-j$(PARALLEL_LEVEL),) diff --git a/build.sh b/build.sh index 2903684f6..38471ce47 100755 --- a/build.sh +++ b/build.sh @@ -15,7 +15,7 @@ REPODIR=$(cd "$(dirname "$0")"; pwd) LIBCUOPT_BUILD_DIR=${LIBCUOPT_BUILD_DIR:=${REPODIR}/cpp/build} LIBMPS_PARSER_BUILD_DIR=${LIBMPS_PARSER_BUILD_DIR:=${REPODIR}/cpp/libmps_parser/build} -VALIDARGS="clean libcuopt libmps_parser cuopt_mps_parser cuopt cuopt_server cuopt_sh_client docs deb -a -b -g -fsanitize -v -l= --verbose-pdlp --build-lp-only --no-fetch-rapids --skip-c-python-adapters --skip-tests-build --skip-routing-build --skip-fatbin-write --host-lineinfo [--cmake-args=\\\"\\\"] [--cache-tool=] -n --allgpuarch --ci-only-arch --show_depr_warn -h --help" +VALIDARGS="clean libcuopt libmps_parser cuopt_mps_parser cuopt cuopt_server cuopt_sh_client docs deb -a -b -g -fsanitize -v -j -l= --verbose-pdlp --build-lp-only --no-fetch-rapids --skip-c-python-adapters --skip-tests-build --skip-routing-build --skip-fatbin-write --host-lineinfo [--cmake-args=\\\"\\\"] [--cache-tool=] -n --allgpuarch --ci-only-arch --show_depr_warn -h --help" HELP="$0 [ ...] [ ...] where is: clean - remove all existing build artifacts and configuration (start over) @@ -34,6 +34,7 @@ HELP="$0 [ ...] [ ...] -b - Build with benchmark settings -fsanitize - Build with sanitizer -n - no install step + -j - parallel build jobs (unlimited if no value, or -j for N threads) --no-fetch-rapids - don't fetch rapids dependencies -l= - log level. Options are: TRACE | DEBUG | INFO | WARN | ERROR | CRITICAL | OFF. Default=INFO --verbose-pdlp - verbose mode for pdlp solver @@ -85,6 +86,7 @@ CACHE_ARGS=() PYTHON_ARGS_FOR_INSTALL=("-m" "pip" "install" "--no-build-isolation" "--no-deps") LOGGING_ACTIVE_LEVEL="INFO" FETCH_RAPIDS=ON +PARALLEL_LEVEL="" # Set defaults for vars that may not have been defined externally # FIXME: if PREFIX is not set, check CONDA_PREFIX, but there is no fallback @@ -172,6 +174,26 @@ function cmakeArgs { read -ra EXTRA_CMAKE_ARGS <<< "$EXTRA_CMAKE_ARGS" } +function parallelArgs { + # Check for -j option + if [[ -n $(echo "$ARGS" | { grep -E "\-j" || true; } ) ]]; then + # Extract -j with optional number (e.g., -j, -j8, -j16) + PARALLEL_ARG=$(echo "$ARGS" | { grep -Eo "\-j[0-9]*" || true; } | head -1) + if [[ -n ${PARALLEL_ARG} ]]; then + # Remove the -j argument from list of args so that it passes validArgs function + ARGS=${ARGS//$PARALLEL_ARG/} + # Extract the number if present + PARALLEL_NUM=$(echo "$PARALLEL_ARG" | sed 's/-j//') + if [[ -z ${PARALLEL_NUM} ]]; then + # If no number specified, use nproc + PARALLEL_LEVEL=$(nproc) + else + PARALLEL_LEVEL=${PARALLEL_NUM} + fi + fi + fi +} + if hasArg -h || hasArg --help; then echo "${HELP}" @@ -183,6 +205,7 @@ if (( NUMARGS != 0 )); then cacheTool cmakeArgs loggingArgs + parallelArgs for a in ${ARGS}; do if ! (echo " ${VALIDARGS} " | grep -q " ${a} "); then echo "Invalid option: ${a}" @@ -349,13 +372,19 @@ if buildAll || hasArg libcuopt; then -DSKIP_ROUTING_BUILD=${SKIP_ROUTING_BUILD} \ -DWRITE_FATBIN=${WRITE_FATBIN} \ -DHOST_LINEINFO=${HOST_LINEINFO} \ + -DPARALLEL_LEVEL="${PARALLEL_LEVEL}" \ "${CACHE_ARGS[@]}" \ "${EXTRA_CMAKE_ARGS[@]}" \ "${REPODIR}"/cpp if hasArg -n; then - cmake --build "${LIBCUOPT_BUILD_DIR}" ${VERBOSE_FLAG} + # Manual make invocation to start its jobserver + make -j${PARALLEL_LEVEL} -C "${REPODIR}" LIBCUOPT_BUILD_DIR="${LIBCUOPT_BUILD_DIR}" VERBOSE_FLAG="${VERBOSE_FLAG}" PARALLEL_LEVEL="${PARALLEL_LEVEL}" ninja-build else - cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} -j"${PARALLEL_LEVEL}" + if [[ -n "${PARALLEL_LEVEL}" ]]; then + cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} -j"${PARALLEL_LEVEL}" + else + cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} + fi fi fi diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 4391c53df..7e71054e4 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -124,6 +124,11 @@ if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 12.9 AND CMAKE_CUDA_COMPILE endif() list(APPEND CUOPT_CUDA_FLAGS -fopenmp) +# Add jobserver flags for parallel compilation if PARALLEL_LEVEL is set +if(PARALLEL_LEVEL AND NOT "${PARALLEL_LEVEL}" STREQUAL "") + message(STATUS "Enabling nvcc jobserver support for parallel builds") + list(APPEND CUOPT_CUDA_FLAGS --threads=0 --split-compile=0 --jobserver) +endif() if(NOT DISABLE_OPENMP) find_package(OpenMP) From 970ccc4d734f0a6f04c513b59045af207fef9de6 Mon Sep 17 00:00:00 2001 From: Alice Boucher Date: Tue, 25 Nov 2025 11:20:27 +0000 Subject: [PATCH 2/7] fix CI build --- conda/recipes/libcuopt/recipe.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/conda/recipes/libcuopt/recipe.yaml b/conda/recipes/libcuopt/recipe.yaml index 5f122e623..99e723d9f 100644 --- a/conda/recipes/libcuopt/recipe.yaml +++ b/conda/recipes/libcuopt/recipe.yaml @@ -55,6 +55,7 @@ cache: - ${{ stdlib("c") }} - cuda-version =${{ cuda_version }} - cmake ${{ cmake_version }} + - make - ninja - tbb-devel - zlib From a111bf6a76221c92adfb541ba50a474914fe798f Mon Sep 17 00:00:00 2001 From: Alice Boucher Date: Tue, 25 Nov 2025 12:38:51 +0000 Subject: [PATCH 3/7] address rewview comment --- build.sh | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/build.sh b/build.sh index 38471ce47..96c725900 100755 --- a/build.sh +++ b/build.sh @@ -376,15 +376,12 @@ if buildAll || hasArg libcuopt; then "${CACHE_ARGS[@]}" \ "${EXTRA_CMAKE_ARGS[@]}" \ "${REPODIR}"/cpp + JFLAG="${PARALLEL_LEVEL:+-j${PARALLEL_LEVEL}}" if hasArg -n; then # Manual make invocation to start its jobserver - make -j${PARALLEL_LEVEL} -C "${REPODIR}" LIBCUOPT_BUILD_DIR="${LIBCUOPT_BUILD_DIR}" VERBOSE_FLAG="${VERBOSE_FLAG}" PARALLEL_LEVEL="${PARALLEL_LEVEL}" ninja-build + make ${JFLAG} -C "${REPODIR}" LIBCUOPT_BUILD_DIR="${LIBCUOPT_BUILD_DIR}" VERBOSE_FLAG="${VERBOSE_FLAG}" PARALLEL_LEVEL="${PARALLEL_LEVEL}" ninja-build else - if [[ -n "${PARALLEL_LEVEL}" ]]; then - cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} -j"${PARALLEL_LEVEL}" - else - cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} - fi + cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} ${JFLAG} fi fi From a7ed7a73a08ed8e3df1fc7a2f269cc1c79e1c86f Mon Sep 17 00:00:00 2001 From: Alice Boucher Date: Tue, 25 Nov 2025 13:05:26 +0000 Subject: [PATCH 4/7] review comment --- build.sh | 2 +- Makefile => cpp/Makefile | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Makefile => cpp/Makefile (100%) diff --git a/build.sh b/build.sh index 96c725900..a69addbec 100755 --- a/build.sh +++ b/build.sh @@ -379,7 +379,7 @@ if buildAll || hasArg libcuopt; then JFLAG="${PARALLEL_LEVEL:+-j${PARALLEL_LEVEL}}" if hasArg -n; then # Manual make invocation to start its jobserver - make ${JFLAG} -C "${REPODIR}" LIBCUOPT_BUILD_DIR="${LIBCUOPT_BUILD_DIR}" VERBOSE_FLAG="${VERBOSE_FLAG}" PARALLEL_LEVEL="${PARALLEL_LEVEL}" ninja-build + make ${JFLAG} -C "${REPODIR}/cpp" LIBCUOPT_BUILD_DIR="${LIBCUOPT_BUILD_DIR}" VERBOSE_FLAG="${VERBOSE_FLAG}" PARALLEL_LEVEL="${PARALLEL_LEVEL}" ninja-build else cmake --build "${LIBCUOPT_BUILD_DIR}" --target ${INSTALL_TARGET} ${VERBOSE_FLAG} ${JFLAG} fi diff --git a/Makefile b/cpp/Makefile similarity index 100% rename from Makefile rename to cpp/Makefile From bce14948f64c1949f9f80dd5f1912120154b38fa Mon Sep 17 00:00:00 2001 From: Alice Boucher Date: Wed, 17 Dec 2025 16:34:30 +0000 Subject: [PATCH 5/7] address review comments --- build.sh | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/build.sh b/build.sh index 626a1be8e..6d599e548 100755 --- a/build.sh +++ b/build.sh @@ -15,7 +15,7 @@ REPODIR=$(cd "$(dirname "$0")"; pwd) LIBCUOPT_BUILD_DIR=${LIBCUOPT_BUILD_DIR:=${REPODIR}/cpp/build} LIBMPS_PARSER_BUILD_DIR=${LIBMPS_PARSER_BUILD_DIR:=${REPODIR}/cpp/libmps_parser/build} -VALIDARGS="clean libcuopt libmps_parser cuopt_mps_parser cuopt cuopt_server cuopt_sh_client docs deb -a -b -g -fsanitize -v -j -l= --verbose-pdlp --build-lp-only --no-fetch-rapids --skip-c-python-adapters --skip-tests-build --skip-routing-build --skip-fatbin-write --host-lineinfo [--cmake-args=\\\"\\\"] [--cache-tool=] -n --allgpuarch --ci-only-arch --show_depr_warn -h --help" +VALIDARGS="clean libcuopt libmps_parser cuopt_mps_parser cuopt cuopt_server cuopt_sh_client docs deb -a -b -g -fsanitize -v -l= --verbose-pdlp --build-lp-only --no-fetch-rapids --skip-c-python-adapters --skip-tests-build --skip-routing-build --skip-fatbin-write --host-lineinfo [--cmake-args=\\\"\\\"] [--cache-tool=] -n --allgpuarch --ci-only-arch --show_depr_warn -h --help" HELP="$0 [ ...] [ ...] where is: clean - remove all existing build artifacts and configuration (start over) @@ -34,7 +34,6 @@ HELP="$0 [ ...] [ ...] -b - Build with benchmark settings -fsanitize - Build with sanitizer -n - no install step - -j - parallel build jobs (unlimited if no value, or -j for N threads) --no-fetch-rapids - don't fetch rapids dependencies -l= - log level. Options are: TRACE | DEBUG | INFO | WARN | ERROR | CRITICAL | OFF. Default=INFO --verbose-pdlp - verbose mode for pdlp solver @@ -86,7 +85,7 @@ CACHE_ARGS=() PYTHON_ARGS_FOR_INSTALL=("-m" "pip" "install" "--no-build-isolation" "--no-deps") LOGGING_ACTIVE_LEVEL="INFO" FETCH_RAPIDS=ON -PARALLEL_LEVEL="" +PARALLEL_LEVEL=${PARALLEL_LEVEL:=$(nproc)} # Set defaults for vars that may not have been defined externally # FIXME: if PREFIX is not set, check CONDA_PREFIX, but there is no fallback @@ -174,26 +173,6 @@ function cmakeArgs { read -ra EXTRA_CMAKE_ARGS <<< "$EXTRA_CMAKE_ARGS" } -function parallelArgs { - # Check for -j option - if [[ -n $(echo "$ARGS" | { grep -E "\-j" || true; } ) ]]; then - # Extract -j with optional number (e.g., -j, -j8, -j16) - PARALLEL_ARG=$(echo "$ARGS" | { grep -Eo "\-j[0-9]*" || true; } | head -1) - if [[ -n ${PARALLEL_ARG} ]]; then - # Remove the -j argument from list of args so that it passes validArgs function - ARGS=${ARGS//$PARALLEL_ARG/} - # Extract the number if present - PARALLEL_NUM=$(echo "$PARALLEL_ARG" | sed 's/-j//') - if [[ -z ${PARALLEL_NUM} ]]; then - # If no number specified, use nproc - PARALLEL_LEVEL=$(nproc) - else - PARALLEL_LEVEL=${PARALLEL_NUM} - fi - fi - fi -} - if hasArg -h || hasArg --help; then echo "${HELP}" @@ -205,7 +184,6 @@ if (( NUMARGS != 0 )); then cacheTool cmakeArgs loggingArgs - parallelArgs for a in ${ARGS}; do if ! (echo " ${VALIDARGS} " | grep -q " ${a} "); then echo "Invalid option: ${a}" From 3159ab1c81eadeedd05fefe0f16f833c2500e434 Mon Sep 17 00:00:00 2001 From: Alice Boucher Date: Fri, 9 Jan 2026 08:41:23 +0000 Subject: [PATCH 6/7] update copyrights --- build.sh | 2 +- cpp/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 6d599e548..2cc2f8cdb 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -# SPDX-FileCopyrightText: Copyright (c) 2021-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 diff --git a/cpp/Makefile b/cpp/Makefile index 15ed54d07..d451e9bed 100644 --- a/cpp/Makefile +++ b/cpp/Makefile @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # Makefile From 14d9f4ee52084c533947e19502b66fb1b0ea81b6 Mon Sep 17 00:00:00 2001 From: Alice Boucher Date: Tue, 13 Jan 2026 15:42:09 +0000 Subject: [PATCH 7/7] version check for jobserver option --- cpp/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index cb2a376b2..a80e49d34 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -125,8 +125,12 @@ list(APPEND CUOPT_CUDA_FLAGS -fopenmp) # Add jobserver flags for parallel compilation if PARALLEL_LEVEL is set if(PARALLEL_LEVEL AND NOT "${PARALLEL_LEVEL}" STREQUAL "") - message(STATUS "Enabling nvcc jobserver support for parallel builds") - list(APPEND CUOPT_CUDA_FLAGS --threads=0 --split-compile=0 --jobserver) + message(STATUS "Enabling nvcc parallel compilation support") + list(APPEND CUOPT_CUDA_FLAGS --threads=0 --split-compile=0) + if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0) + message(STATUS "Enabling nvcc jobserver support (NVCC >= 13.0)") + list(APPEND CUOPT_CUDA_FLAGS --jobserver) + endif() endif() if(NOT DISABLE_OPENMP)