Last active
July 11, 2025 00:16
-
-
Save likema/f5c04dad837d2f5068ae7a8860c180e7 to your computer and use it in GitHub Desktop.
CMake macro to detect glibc version by filename.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # - Check glibc version | |
| # CHECK_GLIBC_VERSION() | |
| # | |
| # Once done this will define | |
| # | |
| # GLIBC_VERSION - glibc version | |
| # | |
| MACRO (CHECK_GLIBC_VERSION) | |
| EXECUTE_PROCESS ( | |
| COMMAND ${CMAKE_C_COMPILER} -print-file-name=libc.so.6 | |
| OUTPUT_VARIABLE GLIBC | |
| OUTPUT_STRIP_TRAILING_WHITESPACE) | |
| GET_FILENAME_COMPONENT (GLIBC ${GLIBC} REALPATH) | |
| GET_FILENAME_COMPONENT (GLIBC_VERSION ${GLIBC} NAME) | |
| STRING (REPLACE "libc-" "" GLIBC_VERSION ${GLIBC_VERSION}) | |
| STRING (REPLACE ".so" "" GLIBC_VERSION ${GLIBC_VERSION}) | |
| IF (NOT GLIBC_VERSION MATCHES "^[0-9.]+$") | |
| MESSAGE (FATAL_ERROR "Unknown glibc version: ${GLIBC_VERSION}") | |
| ENDIF (NOT GLIBC_VERSION MATCHES "^[0-9.]+$") | |
| ENDMACRO (CHECK_GLIBC_VERSION) |
Well, one thing which often works - not sure whether it always works - is run
libc.so.6. Yes, it's typically executable - and prints version information.It does not work for cross compiler, such as aarch64
Maybe you can implement CMake macro like
objdump -T `gcc -print-file-name=libc.so.6` \ | grep -o 'GLIBC_[0-9]\+\(\.[0-9]\+\)*' \ | sort -ruV \ | head -1
realpath `gcc -print-file-name=libc.so.6`
/usr/lib/x86_64-linux-gnu/libc.so.6
Or adding one more line would be fine, like this.
MACRO (CHECK_GLIBC_VERSION)
EXECUTE_PROCESS (
COMMAND ${CMAKE_C_COMPILER} -print-file-name=libc.so.6
OUTPUT_VARIABLE GLIBC
OUTPUT_STRIP_TRAILING_WHITESPACE)
GET_FILENAME_COMPONENT (GLIBC ${GLIBC} REALPATH)
GET_FILENAME_COMPONENT (GLIBC_VERSION ${GLIBC} NAME)
STRING (REPLACE "libc-" "" GLIBC_VERSION ${GLIBC_VERSION})
STRING (REPLACE "libc" "" GLIBC_VERSION ${GLIBC_VERSION}) # added
STRING (REPLACE ".so" "" GLIBC_VERSION ${GLIBC_VERSION})
IF (NOT GLIBC_VERSION MATCHES "^[0-9.]+$")
MESSAGE (FATAL_ERROR "Unknown glibc version: ${GLIBC_VERSION}")
ENDIF (NOT GLIBC_VERSION MATCHES "^[0-9.]+$")
ENDMACRO (CHECK_GLIBC_VERSION)Even added this line, it seems that only the major version of glibc can be extracted
MACRO (CHECK_GLIBC_VERSION)
message("Checking GLIBC Version.")
EXECUTE_PROCESS (
COMMAND ${CMAKE_C_COMPILER} -print-file-name=libc.so.6
OUTPUT_VARIABLE GLIBC
OUTPUT_STRIP_TRAILING_WHITESPACE)
GET_FILENAME_COMPONENT (GLIBC ${GLIBC} REALPATH)
EXECUTE_PROCESS (
COMMAND ${GLIBC}
OUTPUT_VARIABLE GLIBC_OUTPUT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
STRING (REGEX MATCH "release version ([0-9]+\\.[0-9]+)" GLIBC_VERSION ${GLIBC_OUTPUT})
STRING (REPLACE "release version " "" GLIBC_VERSION ${GLIBC_VERSION})
IF (NOT GLIBC_VERSION MATCHES "^[0-9.]+$")
MESSAGE (FATAL_ERROR "Unknown glibc version: ${GLIBC_VERSION}")
ENDIF (NOT GLIBC_VERSION MATCHES "^[0-9.]+$")
ENDMACRO (CHECK_GLIBC_VERSION)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It does not work for cross compiler, such as aarch64
Maybe you can implement CMake macro like