11#! /bin/bash
2- # This script builds GTSAM and GTDynamics using a clean prefix-installation strategy.
3- # This prevents "Double Linking" of Boost and other dependencies.
4-
2+ # Refined Hybrid Build Script: Proven Copy Logic + Clean Prefix Strategy
53set -e
64set -x
75
86PROJECT_DIR=" $( cd " $1 " && pwd) "
97INSTALL_PREFIX=" /opt/gtdynamics-deps"
108NUM_CORES=$( nproc)
119
12- # Source environment from before-all (defines BOOST_ROOT, etc.)
10+ # 1. Setup Environment
1311source ${INSTALL_PREFIX} /env.sh
14-
15- # Get the Python executable provided by cibuildwheel
1612PYTHON_EXE=$( which python)
1713PYTHON_VERSION=$( $PYTHON_EXE -c " import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" )
1814
1915echo " Building for Python ${PYTHON_VERSION} at ${PYTHON_EXE} "
2016
21- # Install Python build-time dependencies
2217$PYTHON_EXE -m pip install --upgrade pip
2318$PYTHON_EXE -m pip install numpy pyparsing pybind11 hatchling ninja " cmake>=3.26,<4"
2419
@@ -27,11 +22,12 @@ GTSAM_SOURCE="${INSTALL_PREFIX}/gtsam_source"
2722GTSAM_BUILD=" ${INSTALL_PREFIX} /gtsam_build_py${PYTHON_VERSION} "
2823GTSAM_PREFIX=" ${INSTALL_PREFIX} /gtsam_py${PYTHON_VERSION} "
2924
30- # 1 . Build and INSTALL GTSAM to a clean prefix
25+ # 2 . Build and INSTALL GTSAM to Clean Prefix
3126echo " Building GTSAM..."
3227rm -rf ${GTSAM_BUILD} ${GTSAM_PREFIX}
3328mkdir -p ${GTSAM_BUILD}
3429cd ${GTSAM_BUILD}
30+
3531cmake ${GTSAM_SOURCE} \
3632 -DCMAKE_BUILD_TYPE=Release \
3733 -DCMAKE_INSTALL_PREFIX=${GTSAM_PREFIX} \
@@ -50,27 +46,45 @@ cmake ${GTSAM_SOURCE} \
5046cmake --build . --config Release -j${NUM_CORES}
5147cmake --install .
5248
53- # 2. Stage GTSAM Python package for bundling
54- echo " Staging GTSAM for bundling..."
49+ # 3. Stage GTSAM using your Working Copy Logic
50+ echo " Staging GTSAM Python package for bundling..."
51+ GTSAM_PY_SRC=" ${GTSAM_BUILD} /python/gtsam"
5552GTSAM_PY_DST=" ${PROJECT_DIR} /python/gtsam"
5653rm -rf ${GTSAM_PY_DST}
5754mkdir -p ${GTSAM_PY_DST}
5855
59- # Find where CMake installed the gtsam python package
60- GTSAM_PKG_SRC=$( find ${GTSAM_PREFIX} -name " gtsam" -type d | grep " site-packages/gtsam" | head -n 1)
61- if [ -z " $GTSAM_PKG_SRC " ]; then
62- echo " ERROR: Could not find gtsam package in ${GTSAM_PREFIX} "
63- exit 1
64- fi
65- cp -r " ${GTSAM_PKG_SRC} /." " ${GTSAM_PY_DST} /"
56+ cp ${GTSAM_PY_SRC} /__init__.py ${GTSAM_PY_DST} /
57+ cp ${GTSAM_PY_SRC} /__init__.pyi ${GTSAM_PY_DST} / 2> /dev/null || true
58+ cp ${GTSAM_PY_SRC} /* .py ${GTSAM_PY_DST} /
59+ find ${GTSAM_PY_SRC} -maxdepth 1 -name " gtsam*.so" -exec cp {} ${GTSAM_PY_DST} / \;
60+
61+ for subdir in utils preamble specializations gtsam Data; do
62+ if [ -d " ${GTSAM_PY_SRC} /${subdir} " ]; then
63+ cp -r ${GTSAM_PY_SRC} /${subdir} ${GTSAM_PY_DST} /
64+ fi
65+ done
66+
6667rm -rf ${GTSAM_PY_DST} /tests ${GTSAM_PY_DST} /examples ${GTSAM_PY_DST} /notebooks ${GTSAM_PY_DST} /__pycache__
6768
68- # 3. Build and INSTALL GTDynamics to its own prefix
69- echo " Building GTDynamics..."
69+ # 4. Finalize Environment for GTDynamics
70+ export GTSAM_DIR=" ${GTSAM_PREFIX} /lib/cmake/GTSAM"
71+ export CMAKE_PREFIX_PATH=" ${GTSAM_PREFIX} :${CMAKE_PREFIX_PATH} "
72+ export LD_LIBRARY_PATH=" ${GTSAM_PREFIX} /lib:${LD_LIBRARY_PATH} "
73+
74+ rm -f ${INSTALL_PREFIX} /gtsam_current
75+ ln -sf ${GTSAM_PREFIX} ${INSTALL_PREFIX} /gtsam_current
76+
77+ # Patch gtwrap for manylinux compatibility
78+ sed -i ' s/Interpreter Development/Interpreter Development.Module/g' \
79+ ${GTSAM_PREFIX} /lib/cmake/gtwrap/GtwrapUtils.cmake
80+
81+ # 5. Build and INSTALL GTDynamics
82+ echo " Building GTDynamics C++ extension..."
7083GTD_BUILD=" ${INSTALL_PREFIX} /gtd_build_py${PYTHON_VERSION} "
7184GTD_PREFIX=" ${INSTALL_PREFIX} /gtd_py${PYTHON_VERSION} "
7285rm -rf ${GTD_BUILD} ${GTD_PREFIX}
7386mkdir -p ${GTD_BUILD}
87+
7488cd ${GTD_BUILD}
7589cmake ${PROJECT_DIR} \
7690 -DCMAKE_BUILD_TYPE=Release \
@@ -88,13 +102,13 @@ cmake ${PROJECT_DIR} \
88102cmake --build . --config Release --target gtdynamics_py -j${NUM_CORES}
89103cmake --install .
90104
91- # 4 . Stage GTDynamics extension for bundling
92- echo " Staging GTDynamics extension..."
105+ # 6 . Stage GTDynamics extension from Clean Prefix
106+ echo " Copying built extension to source tree ..."
93107find " ${GTD_PREFIX} " -name " gtdynamics*.so" -exec cp -v {} " ${PROJECT_DIR} /python/gtdynamics/" \;
94108
95- # Finalize Environment for Auditwheel
96- rm -f ${INSTALL_PREFIX} /gtsam_current ${INSTALL_PREFIX} /gtd_current
97- ln -sf ${GTSAM_PREFIX} ${INSTALL_PREFIX} /gtsam_current
109+ # Finalize GTDynamics library path
110+ rm -f ${INSTALL_PREFIX} /gtd_current
98111ln -sf ${GTD_PREFIX} ${INSTALL_PREFIX} /gtd_current
112+ export LD_LIBRARY_PATH=" ${GTD_PREFIX} /lib:${LD_LIBRARY_PATH} "
99113
100114echo " before-build completed successfully!"
0 commit comments