From 8c9d0defc9631aecc37deb02a5bcb1243d1ba0a3 Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Tue, 28 Apr 2026 14:51:48 -0700 Subject: [PATCH] fix: resolve lbug includes correctly in monorepo builds The standalone precompiled-liblbug support added in fbeac16 changed the imported lbug target to default its include directories from PROJECT_SOURCE_DIR/PROJECT_BINARY_DIR. That works when this repo is configured standalone, but breaks when tools/nodejs_api is built from the Ladybug monorepo because PROJECT_SOURCE_DIR points at the addon directory rather than the top-level Ladybug tree. In CI this produced a non-existent tools/nodejs_api/src/include path and CMake failed during generate. Fix the imported-target path resolution to prefer explicit LBUG_SOURCE_DIR/LBUG_BUILD_DIR overrides, then fall back to the embedding monorepo source/build directories, and only then to the standalone sibling layout when those directories actually exist. Also fail with a clear error if no valid Ladybug source or generated include tree can be found. --- CMakeLists.txt | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7fdffe3..a185fdc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,16 @@ set(LBUG_SOURCE_DIR "" CACHE PATH "Path to the Ladybug source tree used for stan set(LBUG_BUILD_DIR "" CACHE PATH "Path to the Ladybug build tree used for standalone Node.js builds") set(LBUG_NODEJS_EXTRA_LINK_LIBS "" CACHE STRING "Additional link libraries for standalone Node.js builds against a precompiled liblbug") +function(lbug_nodejs_set_default_dir out_var suffix) + foreach(base_dir IN ITEMS "${LBUG_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/../.." "${CMAKE_CURRENT_SOURCE_DIR}/../ladybug") + if(base_dir AND EXISTS "${base_dir}/${suffix}") + set(${out_var} "${base_dir}/${suffix}" PARENT_SCOPE) + return() + endif() + endforeach() + set(${out_var} "" PARENT_SCOPE) +endfunction() + # If on Windows use npx.cmd instead of npx if(WIN32) set(NPX_CMD npx.cmd) @@ -115,15 +125,25 @@ if(NOT TARGET lbug) message(FATAL_ERROR "Precompiled liblbug archive not found: ${LBUG_NODEJS_PRECOMPILED_LIB_PATH}") endif() - set(LBUG_NODEJS_SOURCE_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/src/include") - set(LBUG_NODEJS_BUILD_INCLUDE_DIR "${PROJECT_BINARY_DIR}/src/include") - if(LBUG_SOURCE_DIR) - set(LBUG_NODEJS_SOURCE_INCLUDE_DIR "${LBUG_SOURCE_DIR}/src/include") - endif() - if(LBUG_BUILD_DIR) + lbug_nodejs_set_default_dir(LBUG_NODEJS_SOURCE_INCLUDE_DIR "src/include") + set(LBUG_NODEJS_BUILD_INCLUDE_DIR "") + if(LBUG_BUILD_DIR AND EXISTS "${LBUG_BUILD_DIR}/src/include") set(LBUG_NODEJS_BUILD_INCLUDE_DIR "${LBUG_BUILD_DIR}/src/include") - elseif(LBUG_SOURCE_DIR) + elseif(LBUG_SOURCE_DIR AND EXISTS "${LBUG_SOURCE_DIR}/build/release/src/include") set(LBUG_NODEJS_BUILD_INCLUDE_DIR "${LBUG_SOURCE_DIR}/build/release/src/include") + elseif(EXISTS "${CMAKE_BINARY_DIR}/src/include") + set(LBUG_NODEJS_BUILD_INCLUDE_DIR "${CMAKE_BINARY_DIR}/src/include") + elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../build/release/src/include") + set(LBUG_NODEJS_BUILD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../build/release/src/include") + elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../ladybug/build/release/src/include") + set(LBUG_NODEJS_BUILD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../ladybug/build/release/src/include") + endif() + + if(NOT LBUG_NODEJS_SOURCE_INCLUDE_DIR) + message(FATAL_ERROR "Could not determine the Ladybug source include directory. Set LBUG_SOURCE_DIR to a Ladybug checkout.") + endif() + if(NOT LBUG_NODEJS_BUILD_INCLUDE_DIR) + message(FATAL_ERROR "Could not determine the Ladybug build include directory. Set LBUG_BUILD_DIR or LBUG_SOURCE_DIR to a built Ladybug tree.") endif() add_library(lbug STATIC IMPORTED GLOBAL)