ranczo-io/libs/modbus.cmake
Bartosz Wieczorek e58f3fc139 fix mem problems
2025-11-07 11:23:05 +01:00

58 lines
2.3 KiB
CMake

#
# Build libmodbus entirely under the current binary dir and expose IMPORTED target: modbus
#
include(ExternalProject)
# ---- Configurable inputs ----
set(LIBMODBUS_GIT_REPO "https://github.com/stephane/libmodbus.git" CACHE STRING "libmodbus git repository")
set(LIBMODBUS_GIT_TAG "v3.1.10" CACHE STRING "git tag/branch for libmodbus")
# ---- Layout strictly in BINARY dir ----
set(MODBUS_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/libmodbus") # install root (include/, lib/)
set(MODBUS_SRC "${CMAKE_CURRENT_BINARY_DIR}/libmodbus-src") # git checkout
set(MODBUS_BUILD "${CMAKE_CURRENT_BINARY_DIR}/libmodbus-build") # out-of-source build dir
set(MODBUS_STATIC_LIB "${MODBUS_PREFIX}/lib/libmodbus.a")
set(MODBUS_INCLUDES "${MODBUS_PREFIX}/include")
file(MAKE_DIRECTORY "${MODBUS_PREFIX}")
file(MAKE_DIRECTORY "${MODBUS_BUILD}")
file(MAKE_DIRECTORY "${MODBUS_INCLUDES}")
# Some environments need -fPIC for static archives used in shared libs
set(_LIBMODBUS_ENV "CFLAGS=-fPIC" "CPPFLAGS=-fPIC" "CXXFLAGS=-fPIC")
ExternalProject_Add(libmodbus_ep
PREFIX "${MODBUS_PREFIX}" # bookkeeping also under binary dir
GIT_REPOSITORY "${LIBMODBUS_GIT_REPO}"
GIT_TAG "${LIBMODBUS_GIT_TAG}"
GIT_SHALLOW 1
UPDATE_DISCONNECTED 1
SOURCE_DIR "${MODBUS_SRC}"
BINARY_DIR "${MODBUS_BUILD}"
# Run autogen in source tree, then configure out-of-source pointing to install prefix under binary dir
CONFIGURE_COMMAND
${CMAKE_COMMAND} -E env ${_LIBMODBUS_ENV}
/bin/sh -c "cd '${MODBUS_SRC}' && ./autogen.sh && cd '${MODBUS_BUILD}' && '${MODBUS_SRC}/configure' --srcdir='${MODBUS_SRC}' --prefix='${MODBUS_PREFIX}' --enable-static=yes --disable-shared"
BUILD_COMMAND ${CMAKE_COMMAND} -E env ${_LIBMODBUS_ENV} make -j
INSTALL_COMMAND make install
BUILD_BYPRODUCTS "${MODBUS_STATIC_LIB}"
)
# ---- Imported target exposing the built library ----
add_library(modbus STATIC IMPORTED GLOBAL)
add_dependencies(modbus libmodbus_ep)
set_target_properties(modbus PROPERTIES
IMPORTED_LOCATION "${MODBUS_STATIC_LIB}"
INTERFACE_INCLUDE_DIRECTORIES "${MODBUS_INCLUDES}"
)
# (opcjonalnie) jeśli potrzebujesz ścieżek w innych miejscach projektu:
# set(MODBUS_PREFIX "${MODBUS_PREFIX}" PARENT_SCOPE)
# set(MODBUS_INCLUDES "${MODBUS_INCLUDES}" PARENT_SCOPE)
# set(MODBUS_STATIC_LIB "${MODBUS_STATIC_LIB}" PARENT_SCOPE)