From 17f63f97a3b4f4baddcc3e47fade16f8e99eafc4 Mon Sep 17 00:00:00 2001 From: Luis Miguens Fernandez Date: Mon, 8 Jun 2026 12:07:10 +0200 Subject: [PATCH 1/4] Update libsocketcan configuration to use FetchContent for improved URL handling and checksum validation --- cmake/libsocketcan.cmake | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/cmake/libsocketcan.cmake b/cmake/libsocketcan.cmake index 81339e5a..449b2b55 100644 --- a/cmake/libsocketcan.cmake +++ b/cmake/libsocketcan.cmake @@ -1,7 +1,35 @@ +include(FetchContent) + +set(LIBSOCKETCAN_DEFAULT_URL "https://github.com/linux-can/libsocketcan/archive/refs/tags/v0.0.12.zip") +set(LIBSOCKETCAN_DEFAULT_HASH "SHA256=e634d623990f63b4d67beb5a40daf5db73fb37d1a3b3acf68265b60f3f389fbf") + +set(LIBSOCKETCAN_URL "${LIBSOCKETCAN_DEFAULT_URL}" CACHE STRING "URL used to download libsocketcan") +set(LIBSOCKETCAN_HASH "" CACHE STRING "Optional checksum for a custom libsocketcan URL") + +set(LIBSOCKETCAN_FETCHCONTENT_ARGS + URL "${LIBSOCKETCAN_URL}" + DOWNLOAD_EXTRACT_TIMESTAMP True +) + +if(LIBSOCKETCAN_URL STREQUAL LIBSOCKETCAN_DEFAULT_URL) + set(_libsocketcan_hash "${LIBSOCKETCAN_HASH}") + if(_libsocketcan_hash STREQUAL "") + set(_libsocketcan_hash "${LIBSOCKETCAN_DEFAULT_HASH}") + endif() + list(APPEND LIBSOCKETCAN_FETCHCONTENT_ARGS + URL_HASH "${_libsocketcan_hash}" + ) +elseif(NOT LIBSOCKETCAN_HASH STREQUAL "") + list(APPEND LIBSOCKETCAN_FETCHCONTENT_ARGS + URL_HASH "${LIBSOCKETCAN_HASH}" + ) +else() + message(STATUS "Downloading libsocketcan without checksum validation: ${LIBSOCKETCAN_URL}") +endif() + FetchContent_Declare( - libsocketcan - GIT_REPOSITORY https://github.com/linux-can/libsocketcan.git - GIT_TAG v0.0.12 + libsocketcan + ${LIBSOCKETCAN_FETCHCONTENT_ARGS} ) FetchContent_MakeAvailable(libsocketcan) From 003e1e1103e00e08b21c372bb6c596ffc686b0eb Mon Sep 17 00:00:00 2001 From: Luis Miguens Fernandez Date: Mon, 8 Jun 2026 13:46:17 +0200 Subject: [PATCH 2/4] Refactor libsocketcan configuration to use ExternalProject for improved URL handling and checksum validation --- cmake/libsocketcan.cmake | 121 ++++++++++++++++++++++++++------------- cmake/version.cmake | 11 ++++ 2 files changed, 91 insertions(+), 41 deletions(-) diff --git a/cmake/libsocketcan.cmake b/cmake/libsocketcan.cmake index 449b2b55..ab087703 100644 --- a/cmake/libsocketcan.cmake +++ b/cmake/libsocketcan.cmake @@ -1,61 +1,100 @@ -include(FetchContent) +include(ExternalProject) -set(LIBSOCKETCAN_DEFAULT_URL "https://github.com/linux-can/libsocketcan/archive/refs/tags/v0.0.12.zip") -set(LIBSOCKETCAN_DEFAULT_HASH "SHA256=e634d623990f63b4d67beb5a40daf5db73fb37d1a3b3acf68265b60f3f389fbf") +set(LIBSOCKETCAN_DEFAULT_URL + "https://github.com/linux-can/libsocketcan/archive/refs/tags/v0.0.12.zip" +) -set(LIBSOCKETCAN_URL "${LIBSOCKETCAN_DEFAULT_URL}" CACHE STRING "URL used to download libsocketcan") -set(LIBSOCKETCAN_HASH "" CACHE STRING "Optional checksum for a custom libsocketcan URL") +set(LIBSOCKETCAN_DEFAULT_HASH + "SHA256=e634d623990f63b4d67beb5a40daf5db73fb37d1a3b3acf68265b60f3f389fbf" +) -set(LIBSOCKETCAN_FETCHCONTENT_ARGS - URL "${LIBSOCKETCAN_URL}" - DOWNLOAD_EXTRACT_TIMESTAMP True +set(LIBSOCKETCAN_URL "${LIBSOCKETCAN_DEFAULT_URL}" + CACHE STRING "URL used to download libsocketcan" ) -if(LIBSOCKETCAN_URL STREQUAL LIBSOCKETCAN_DEFAULT_URL) - set(_libsocketcan_hash "${LIBSOCKETCAN_HASH}") - if(_libsocketcan_hash STREQUAL "") - set(_libsocketcan_hash "${LIBSOCKETCAN_DEFAULT_HASH}") - endif() - list(APPEND LIBSOCKETCAN_FETCHCONTENT_ARGS - URL_HASH "${_libsocketcan_hash}" - ) -elseif(NOT LIBSOCKETCAN_HASH STREQUAL "") - list(APPEND LIBSOCKETCAN_FETCHCONTENT_ARGS - URL_HASH "${LIBSOCKETCAN_HASH}" +set(LIBSOCKETCAN_HASH "" + CACHE STRING "Checksum for libsocketcan. Required for custom URLs unless explicitly disabled." +) + +option(LIBSOCKETCAN_ALLOW_UNVERIFIED_DOWNLOAD + "Allow downloading libsocketcan without checksum validation" + OFF +) + +set(_libsocketcan_url_hash) + +if(LIBSOCKETCAN_HASH) + set(_libsocketcan_url_hash URL_HASH "${LIBSOCKETCAN_HASH}") +elseif(LIBSOCKETCAN_URL STREQUAL LIBSOCKETCAN_DEFAULT_URL) + set(_libsocketcan_url_hash URL_HASH "${LIBSOCKETCAN_DEFAULT_HASH}") +elseif(NOT LIBSOCKETCAN_ALLOW_UNVERIFIED_DOWNLOAD) + message(FATAL_ERROR + "LIBSOCKETCAN_HASH must be set when using a custom LIBSOCKETCAN_URL. " + "Set LIBSOCKETCAN_ALLOW_UNVERIFIED_DOWNLOAD=ON to bypass this check." ) else() - message(STATUS "Downloading libsocketcan without checksum validation: ${LIBSOCKETCAN_URL}") + message(WARNING + "Downloading libsocketcan without checksum validation: ${LIBSOCKETCAN_URL}" + ) endif() -FetchContent_Declare( - libsocketcan - ${LIBSOCKETCAN_FETCHCONTENT_ARGS} -) +find_program(SH_EXE NAMES sh bash REQUIRED) +find_program(MAKE_EXE NAMES gmake make REQUIRED) -FetchContent_MakeAvailable(libsocketcan) +set(LIBSOCKETCAN_PREFIX_DIR "${CMAKE_BINARY_DIR}/_deps/libsocketcan") +set(LIBSOCKETCAN_SOURCE_DIR "${LIBSOCKETCAN_PREFIX_DIR}/src") +set(LIBSOCKETCAN_BUILD_DIR "${LIBSOCKETCAN_PREFIX_DIR}/build") +set(LIBSOCKETCAN_INSTALL_DIR "${LIBSOCKETCAN_PREFIX_DIR}/install") -set(LIBSOCKETCAN_INCLUDE_DIR ${libsocketcan_SOURCE_DIR}/include) +set(LIBSOCKETCAN_INCLUDE_DIR "${LIBSOCKETCAN_INSTALL_DIR}/include") +set(LIBSOCKETCAN_LIBRARY "${LIBSOCKETCAN_INSTALL_DIR}/lib/libsocketcan.a") -set(LIBSOCKETCAN_LIB ${libsocketcan_SOURCE_DIR}/src/.libs/libsocketcan.a) +# Avoid CMake errors for imported targets whose include directory does not exist +# yet at configure time. +file(MAKE_DIRECTORY "${LIBSOCKETCAN_INCLUDE_DIR}") +file(MAKE_DIRECTORY "${LIBSOCKETCAN_INSTALL_DIR}/lib") -add_custom_command( - OUTPUT ${LIBSOCKETCAN_LIB} - WORKING_DIRECTORY ${libsocketcan_SOURCE_DIR} - COMMAND bash autogen.sh - COMMAND bash configure --enable-static --disable-shared CFLAGS=-fPIC CXXFLAGS=-fPIC - COMMAND make - DEPENDS ${libsocketcan_SOURCE_DIR} +ExternalProject_Add(libsocketcan_external + URL "${LIBSOCKETCAN_URL}" + ${_libsocketcan_url_hash} + + DOWNLOAD_EXTRACT_TIMESTAMP FALSE + + SOURCE_DIR "${LIBSOCKETCAN_SOURCE_DIR}" + BINARY_DIR "${LIBSOCKETCAN_BUILD_DIR}" + INSTALL_DIR "${LIBSOCKETCAN_INSTALL_DIR}" + + CONFIGURE_COMMAND + ${CMAKE_COMMAND} -E chdir + ${SH_EXE} ./autogen.sh + COMMAND + ${CMAKE_COMMAND} -E env + "CFLAGS=-fPIC" + "CXXFLAGS=-fPIC" + /configure + --prefix= + --enable-static + --disable-shared + + BUILD_COMMAND + ${MAKE_EXE} + + INSTALL_COMMAND + ${MAKE_EXE} install + + BUILD_BYPRODUCTS + "${LIBSOCKETCAN_LIBRARY}" + + USES_TERMINAL_CONFIGURE TRUE + USES_TERMINAL_BUILD TRUE + USES_TERMINAL_INSTALL TRUE ) add_library(libsocketcan STATIC IMPORTED GLOBAL) set_target_properties(libsocketcan PROPERTIES - IMPORTED_LOCATION ${LIBSOCKETCAN_LIB} - INTERFACE_INCLUDE_DIRECTORIES ${LIBSOCKETCAN_INCLUDE_DIR} -) - -add_custom_target(libsocketcan_build ALL - DEPENDS ${LIBSOCKETCAN_LIB} + IMPORTED_LOCATION "${LIBSOCKETCAN_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBSOCKETCAN_INCLUDE_DIR}" ) -add_dependencies(libsocketcan libsocketcan_build) +add_dependencies(libsocketcan libsocketcan_external) \ No newline at end of file diff --git a/cmake/version.cmake b/cmake/version.cmake index 8e2e32dc..a3c6a581 100644 --- a/cmake/version.cmake +++ b/cmake/version.cmake @@ -3,6 +3,7 @@ execute_process( WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_COMMIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET ) execute_process( @@ -10,7 +11,17 @@ execute_process( WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET ) + +if(NOT GIT_COMMIT_HASH) + set(GIT_COMMIT_HASH "unknown") +endif() + +if(NOT GIT_COMMIT_DATE) + set(GIT_COMMIT_DATE "unknown") +endif() + configure_file ( "${PROJECT_SOURCE_DIR}/src/include/CanVersion.h.in" "${PROJECT_BINARY_DIR}/src/include/CanVersion.h" From 95c92575126a09889abc1126d1d525061cf737e8 Mon Sep 17 00:00:00 2001 From: Luis Miguens Fernandez Date: Mon, 8 Jun 2026 13:51:55 +0200 Subject: [PATCH 3/4] Refactor libsocketcan configuration and documentation for improved checksum handling and clarity --- cmake/libsocketcan.cmake | 16 +--------------- docs/DEVELOPMENT.md | 14 +++++++++++++- docs/README.md | 5 ++++- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/cmake/libsocketcan.cmake b/cmake/libsocketcan.cmake index ab087703..29205d94 100644 --- a/cmake/libsocketcan.cmake +++ b/cmake/libsocketcan.cmake @@ -13,12 +13,7 @@ set(LIBSOCKETCAN_URL "${LIBSOCKETCAN_DEFAULT_URL}" ) set(LIBSOCKETCAN_HASH "" - CACHE STRING "Checksum for libsocketcan. Required for custom URLs unless explicitly disabled." -) - -option(LIBSOCKETCAN_ALLOW_UNVERIFIED_DOWNLOAD - "Allow downloading libsocketcan without checksum validation" - OFF + CACHE STRING "Checksum for libsocketcan download. If empty, default URL uses built-in checksum and custom URLs skip verification." ) set(_libsocketcan_url_hash) @@ -27,15 +22,6 @@ if(LIBSOCKETCAN_HASH) set(_libsocketcan_url_hash URL_HASH "${LIBSOCKETCAN_HASH}") elseif(LIBSOCKETCAN_URL STREQUAL LIBSOCKETCAN_DEFAULT_URL) set(_libsocketcan_url_hash URL_HASH "${LIBSOCKETCAN_DEFAULT_HASH}") -elseif(NOT LIBSOCKETCAN_ALLOW_UNVERIFIED_DOWNLOAD) - message(FATAL_ERROR - "LIBSOCKETCAN_HASH must be set when using a custom LIBSOCKETCAN_URL. " - "Set LIBSOCKETCAN_ALLOW_UNVERIFIED_DOWNLOAD=ON to bypass this check." - ) -else() - message(WARNING - "Downloading libsocketcan without checksum validation: ${LIBSOCKETCAN_URL}" - ) endif() find_program(SH_EXE NAMES sh bash REQUIRED) diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index d6453636..965d31fd 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -3,10 +3,22 @@ ## Dependencies -- In Linux, you must install the `libsocketcan-devel` package. +- On Linux, `libsocketcan` is downloaded and built automatically by CMake. +- If you need to use a mirrored or internal source, configure it with `LIBSOCKETCAN_URL`. +- If `LIBSOCKETCAN_HASH` is set (for example `SHA256=...`), CMake verifies the download checksum with that value. +- If `LIBSOCKETCAN_HASH` is not set and `LIBSOCKETCAN_URL` is left at its default value, CMake verifies the download with the built-in default hash. +- If `LIBSOCKETCAN_HASH` is not set and `LIBSOCKETCAN_URL` is customized, checksum verification is not performed. - Other dependencies are resolved automatically after setting the variable `ICS_REPO_DEPS_TOKEN=[value]` to your environment (`.env` file). The value is in the group `jcop-opc-ua` configuration of Gitlab CI/CD (gitlab.cern.ch). +Example: + +```bash +cmake -S . -B build \ + -DLIBSOCKETCAN_URL=https:///libsocketcan-v0.0.12.zip \ + -DLIBSOCKETCAN_HASH=SHA256= +``` + ## Development environment - Alma 9 diff --git a/docs/README.md b/docs/README.md index c94bb150..2c9a91ec 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,7 +30,10 @@ The project requires LogIt (part of the Quasar Framework) and it is downloaded a Inside CERN, the CMake will also download the Anagate API. If not, please modify the address to download the API directly from anagate.de -For Linux, the user must install `libsocketcan` and the matching devel package. +For Linux, `libsocketcan` is fetched and built automatically during CMake configuration. You can override +the download source with `LIBSOCKETCAN_URL`. If `LIBSOCKETCAN_HASH` is provided, CMake verifies the +download checksum with that value. If no hash is provided, the default URL is still verified with its +built-in hash, while custom URLs are downloaded without checksum verification. Optionally, the user must install pybind11 to generate the Python bindings. From deac3a3148ffe87b3ee38500bb3990026fab962b Mon Sep 17 00:00:00 2001 From: Luis Miguens Fernandez Date: Mon, 8 Jun 2026 13:55:02 +0200 Subject: [PATCH 4/4] pre-commit --- cmake/libsocketcan.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/libsocketcan.cmake b/cmake/libsocketcan.cmake index 29205d94..d51828f2 100644 --- a/cmake/libsocketcan.cmake +++ b/cmake/libsocketcan.cmake @@ -83,4 +83,4 @@ set_target_properties(libsocketcan PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBSOCKETCAN_INCLUDE_DIR}" ) -add_dependencies(libsocketcan libsocketcan_external) \ No newline at end of file +add_dependencies(libsocketcan libsocketcan_external)