Skip to content

Commit c3ca334

Browse files
authored
refactor: cleanup build scripts, removing old commands and make them faster (#396)
1 parent 6287cef commit c3ca334

File tree

4 files changed

+37
-98
lines changed

4 files changed

+37
-98
lines changed

backends/pixi-build-ros/src/pixi_build_ros/build_script.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,25 @@ def load_from_template(
5555
else:
5656
raise ValueError(f"Unsupported build type: {pkg.get_build_type()}")
5757

58+
script_content = ""
5859
try:
5960
# Try to load from installed package data first
6061
templates_pkg = files("pixi_build_ros") / "templates"
6162
template_file = templates_pkg / template_name
6263
script_content = template_file.read_text()
6364
except (ImportError, FileNotFoundError):
64-
# Fallback to development path
65+
# Fallback to the development path
6566
templates_pkg = Path(__file__).parent.parent.parent / "templates"
6667
script_path = templates_pkg / template_name
6768
with open(script_path) as f:
6869
script_content = f.read()
6970

70-
script_content = script_content.replace("@SRC_DIR@", str(source_dir)).replace("@DISTRO@", distro.name)
71+
script_content = (
72+
script_content.replace("@SRC_DIR@", str(source_dir))
73+
.replace("@DISTRO@", distro.name)
74+
.replace("@BUILD_DIR@", "build")
75+
.replace("@BUILD_TYPE@", "Release")
76+
)
7177

7278
return cls(
7379
script_content=script_content,

backends/pixi-build-ros/templates/bld_ament_cmake.bat

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@ setlocal EnableDelayedExpansion
55
:: Rattler-build will not set the SRC_DIR anymore so we set it through templating
66
set "SRC_DIR=@SRC_DIR@"
77

8+
set "BUILD_DIR=@BUILD_DIR@"
9+
set "BUILD_TYPE=@BUILD_TYPE@"
10+
811
set "PYTHONPATH=%LIBRARY_PREFIX%\lib\site-packages;%SP_DIR%"
912

1013
:: MSVC is preferred.
1114
set CC=cl.exe
1215
set CXX=cl.exe
1316

14-
rd /s /q build
15-
mkdir build
16-
pushd build
17+
:: Create build directory when not available
18+
if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%"
19+
pushd %BUILD_DIR%
1720

1821
:: set "CMAKE_GENERATOR=Ninja"
1922
:: We use the Visual Studio generator as a workaround for
@@ -35,7 +38,7 @@ FOR /F "tokens=* USEBACKQ" %%i IN (`python -c "import os;print(os.path.relpath(o
3538
cmake ^
3639
-G "%CMAKE_GENERATOR%" ^
3740
-DCMAKE_INSTALL_PREFIX=%LIBRARY_PREFIX% ^
38-
-DCMAKE_BUILD_TYPE=Release ^
41+
-DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
3942
-DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=True ^
4043
-DPYTHON_EXECUTABLE=%PYTHON% ^
4144
-DPython_EXECUTABLE=%PYTHON% ^

backends/pixi-build-ros/templates/build_ament_cmake.sh

Lines changed: 21 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -2,125 +2,56 @@
22
# DO NOT EDIT!
33
set -eo pipefail
44

5-
rm -rf build
6-
mkdir build
7-
cd build
5+
BUILD_DIR=@BUILD_DIR@
6+
7+
if [ ! -d "$BUILD_DIR" ]; then
8+
mkdir -p "$BUILD_DIR"
9+
fi
10+
pushd $BUILD_DIR
11+
12+
BUILD_TYPE=@BUILD_TYPE@
813

914
# necessary for correctly linking SIP files (from python_qt_bindings)
1015
export LINK=$CXX
1116

1217
if [[ "$CONDA_BUILD_CROSS_COMPILATION" != "1" ]]; then
1318
PYTHON_EXECUTABLE=$PREFIX/bin/python
1419
PKG_CONFIG_EXECUTABLE=$PREFIX/bin/pkg-config
15-
OSX_DEPLOYMENT_TARGET="10.15"
20+
export QT_HOST_PATH="$PREFIX"
1621
else
1722
PYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python
1823
PKG_CONFIG_EXECUTABLE=$BUILD_PREFIX/bin/pkg-config
19-
OSX_DEPLOYMENT_TARGET="11.0"
20-
fi
21-
22-
if [[ "${CONDA_BUILD_CROSS_COMPILATION:-}" == "1" ]]; then
2324
export QT_HOST_PATH="$BUILD_PREFIX"
24-
else
25-
export QT_HOST_PATH="$PREFIX"
2625
fi
2726

28-
echo "USING PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}"
29-
echo "USING PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_EXECUTABLE}"
30-
31-
export ROS_PYTHON_VERSION=`$PYTHON_EXECUTABLE -c "import sys; print('%i.%i' % (sys.version_info[0:2]))"`
32-
echo "Using Python ${ROS_PYTHON_VERSION}"
33-
34-
# see https://github.com/conda-forge/cross-python-feedstock/issues/24
35-
if [[ "$CONDA_BUILD_CROSS_COMPILATION" == "1" ]]; then
36-
find $PREFIX/lib/cmake -type f -exec sed -i "s~\${_IMPORT_PREFIX}/lib/python${ROS_PYTHON_VERSION}/site-packages~${BUILD_PREFIX}/lib/python${ROS_PYTHON_VERSION}/site-packages~g" {} + || true
37-
find $PREFIX/share/rosidl* -type f -exec sed -i "s~${PREFIX}/lib/python${ROS_PYTHON_VERSION}/site-packages~${BUILD_PREFIX}/lib/python${ROS_PYTHON_VERSION}/site-packages~g" {} + || true
38-
find $PREFIX/share/rosidl* -type f -exec sed -i "s~\${_IMPORT_PREFIX}/lib/python${ROS_PYTHON_VERSION}/site-packages~${BUILD_PREFIX}/lib/python${ROS_PYTHON_VERSION}/site-packages~g" {} + || true
39-
find $PREFIX/lib/cmake -type f -exec sed -i "s~message(FATAL_ERROR \"The imported target~message(WARNING \"The imported target~g" {} + || true
40-
fi
27+
# Only support 11.0+ for now
28+
OSX_DEPLOYMENT_TARGET="11.0"
4129

30+
# Added to help make portable builds when using <inttypes.h> in C++ code.
4231
if [[ $target_platform =~ linux.* ]]; then
4332
export CFLAGS="${CFLAGS} -D__STDC_FORMAT_MACROS=1"
4433
export CXXFLAGS="${CXXFLAGS} -D__STDC_FORMAT_MACROS=1"
4534
fi;
4635

47-
# Needed for qt-gui-cpp ..
48-
if [[ $target_platform =~ linux.* ]]; then
49-
ln --symbolic --force $GCC ${BUILD_PREFIX}/bin/gcc
50-
ln --symbolic --force $GXX ${BUILD_PREFIX}/bin/g++
51-
fi;
52-
53-
54-
# PYTHON_INSTALL_DIR should be a relative path, see
55-
# https://github.com/ament/ament_cmake/blob/2.3.2/ament_cmake_python/README.md
56-
# So we compute the relative path of $SP_DIR w.r.t. to $PREFIX,
57-
# but it is not trivial to do this in bash scripting, so let's do it via python
36+
echo "USING PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}"
37+
echo "USING PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_EXECUTABLE}"
38+
export ROS_PYTHON_VERSION=3
39+
echo "Using Python ${ROS_PYTHON_VERSION}"
5840
echo "Using PREFIX: $PREFIX"
59-
# TODO: Remove when SPD_DIR is available in the environment
60-
export SP_DIR=${SP_DIR:-$PREFIX/lib/python3.12/site-packages}
61-
export PY_VER=3.12
6241
echo "Using SP_DIR: $SP_DIR"
6342
echo "Using CONDA_BUILD: $CONDA_BUILD"
6443
echo "Using CPU_COUNT: $CPU_COUNT"
44+
export PY_VER=${ROS_PYTHON_VERSION}
6545
echo "Using PY_VER: $PY_VER"
6646
echo "Using PYTHON: $PYTHON"
6747
echo "Using STDLIB_DIR: $STDLIB_DIR"
6848
echo "Using ROS_PYTHON_VERSION: $ROS_PYTHON_VERSION"
6949
echo "Using SRC_DIR: $SRC_DIR"
70-
71-
export PYTHON_INSTALL_DIR=`python -c "import os;print(os.path.relpath(os.environ['SP_DIR'],os.environ['PREFIX']))"`
50+
export PYTHON_INSTALL_DIR=$(realpath --relative-to="$PREFIX" "$SP_DIR")
7251
echo "Using PYTHON_INSTALL_DIR: $PYTHON_INSTALL_DIR"
7352

74-
if [[ $target_platform =~ emscripten.* ]]; then
75-
export CONDA_BUILD_CROSS_COMPILATION="1"
76-
PYTHON_EXECUTABLE=$BUILD_PREFIX/bin/python$PY_VER
77-
echo "set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)"> $SRC_DIR/__vinca_shared_lib_patch.cmake
78-
echo "set(CMAKE_STRIP FALSE) # used by default in pybind11 on .so modules">> $SRC_DIR/__vinca_shared_lib_patch.cmake
79-
echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) # fixes an error where numpy header files are not found correctly">> $SRC_DIR/__vinca_shared_lib_patch.cmake
80-
81-
# if [ "${PKG_NAME}" == "ros-humble-examples-rclcpp-minimal-publisher" ] || [ "${PKG_NAME}" == "ros-humble-examples-rclcpp-minimal-subscriber" ] || [ "${PKG_NAME}" == "ros-humble-rclcpp-components" ]; then
82-
# echo "set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS \"-s ASSERTIONS=1 -s SIDE_MODULE=1 -sWASM_BIGINT -s USE_PTHREADS=0 -s DEMANGLE_SUPPORT=1 -s ALLOW_MEMORY_GROWTH=1 \")">> $SRC_DIR/__vinca_shared_lib_patch.cmake
83-
# echo "set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS \"-s ASSERTIONS=1 -s SIDE_MODULE=1 -sWASM_BIGINT -s USE_PTHREADS=0 -s DEMANGLE_SUPPORT=1 -s ALLOW_MEMORY_GROWTH=1 -sASYNCIFY -O3 -s ASYNCIFY_STACK_SIZE=24576 \")">> $SRC_DIR/__vinca_shared_lib_patch.cmake
84-
# echo "set(CMAKE_EXE_LINKER_FLAGS \"-sMAIN_MODULE=1 -sASSERTIONS=1 -fexceptions -lembind -sWASM_BIGINT -s USE_PTHREADS=0 -s DEMANGLE_SUPPORT=1 -sALLOW_MEMORY_GROWTH=1 -sASYNCIFY -O3 -s ASYNCIFY_STACK_SIZE=24576 -L$SRC_DIR/build -L$PREFIX/lib\") # remove SIDE_MODULE from exe linker flags">> $SRC_DIR/__vinca_shared_lib_patch.cmake
85-
# else
86-
echo "set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS \"-s ASSERTIONS=1 -s SIDE_MODULE=1 -sWASM_BIGINT -s USE_PTHREADS=0 -s ALLOW_MEMORY_GROWTH=1 -s DEMANGLE_SUPPORT=1 \")">> $SRC_DIR/__vinca_shared_lib_patch.cmake
87-
echo "set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS \"-s ASSERTIONS=1 -s SIDE_MODULE=1 -sWASM_BIGINT -s USE_PTHREADS=0 -s ALLOW_MEMORY_GROWTH=1 -s DEMANGLE_SUPPORT=1 \")">> $SRC_DIR/__vinca_shared_lib_patch.cmake
88-
echo "set(CMAKE_EXE_LINKER_FLAGS \"-sMAIN_MODULE=1 -sASSERTIONS=1 -fexceptions -lembind -sWASM_BIGINT -s USE_PTHREADS=0 -sALLOW_MEMORY_GROWTH=1 -s DEMANGLE_SUPPORT=1 -L$SRC_DIR/build -L$PREFIX/lib\") # remove SIDE_MODULE from exe linker flags">> $SRC_DIR/__vinca_shared_lib_patch.cmake
89-
# fi
90-
91-
export BUILD_TYPE="Debug"
92-
export EXTRA_CMAKE_ARGS=" \
93-
-DPYTHON_SOABI="cpython-${ROS_PYTHON_VERSION//./}-wasm32-emscripten" \
94-
-DRMW_IMPLEMENTATION=rmw_wasm_cpp \
95-
-DCMAKE_FIND_ROOT_PATH=$PREFIX \
96-
-DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \
97-
-DCMAKE_PROJECT_INCLUDE=$SRC_DIR/__vinca_shared_lib_patch.cmake \
98-
"
99-
100-
unset -f cmake
101-
export CMAKE_GEN="emcmake cmake"
102-
export CMAKE_BLD="cmake"
103-
104-
export STATIC_ROSIDL_TYPESUPPORT_C=rosidl_typesupport_introspection_c
105-
export STATIC_ROSIDL_TYPESUPPORT_CPP=rosidl_typesupport_introspection_cpp
106-
else
107-
export BUILD_TYPE="Release"
108-
export CMAKE_GEN="cmake"
109-
export CMAKE_BLD="cmake"
110-
fi;
111-
112-
if [ "${PKG_NAME}" == "ros-humble-rmw-wasm-cpp" ]; then
113-
WORK_DIR=$SRC_DIR/$PKG_NAME/src/work/rmw_wasm_cpp
114-
elif [ "${PKG_NAME}" == "ros-humble-wasm-cpp" ]; then
115-
WORK_DIR=$SRC_DIR/$PKG_NAME/src/work/wasm_cpp
116-
elif [ "${PKG_NAME}" == "dynmsg" ]; then
117-
WORK_DIR=$SRC_DIR/$PKG_NAME/src/work/dynmsg
118-
else
119-
WORK_DIR=$SRC_DIR
120-
fi;
121-
12253
if [ ! -f "build.ninja" ]; then
123-
$CMAKE_GEN \
54+
cmake \
12455
-G "Ninja" \
12556
-S @SRC_DIR@ \
12657
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
@@ -137,7 +68,7 @@ if [ ! -f "build.ninja" ]; then
13768
-DSETUPTOOLS_DEB_LAYOUT=OFF \
13869
-DCATKIN_SKIP_TESTING=$SKIP_TESTING \
13970
-DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=True \
140-
-DBUILD_SHARED_LIBS=ON \
71+
-DBUILD_SHARED_LIBS=ON \
14172
-DBUILD_TESTING=OFF \
14273
-DCMAKE_IGNORE_PREFIX_PATH="/opt/homebrew;/usr/local/homebrew" \
14374
-DCMAKE_OSX_DEPLOYMENT_TARGET=$OSX_DEPLOYMENT_TARGET \
@@ -146,4 +77,4 @@ if [ ! -f "build.ninja" ]; then
14677
.
14778
fi
14879

149-
$CMAKE_BLD --build . --config $BUILD_TYPE --target install
80+
cmake --build . --config $BUILD_TYPE --target install

backends/pixi-build-ros/templates/build_ament_python.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ if [ -f setup.cfg ] && grep -q "install[-_]scripts" setup.cfg; then
1616
PKG_NAME_SHORT=${PKG_NAME_SHORT//-/_}
1717
INSTALL_SCRIPTS_ARG="--install-scripts=$PREFIX/lib/$PKG_NAME_SHORT"
1818
echo "WARNING: setup.cfg not set, will set INSTALL_SCRIPTS_ARG to: $INSTALL_SCRIPTS_ARG"
19-
$PYTHON setup.py install --prefix="$PREFIX" --install-lib="$SP_DIR" $INSTALL_SCRIPTS_ARG --single-version-externally-managed --record=files.txt
19+
$PYTHON setup.py install --prefix="$PREFIX" --install-lib="$SP_DIR" $INSTALL_SCRIPTS_ARG --single-version-externally-managed
2020
# Remove build artifacts from setup.py install
2121
rm -rf *.egg-info 2>/dev/null || true
2222
rm -rf build/ 2>/dev/null || true
23-
rm -rf files.txt 2>/dev/null || true
2423
else
2524
$PYTHON -m pip install . --no-deps -vvv
2625
fi

0 commit comments

Comments
 (0)