Skip to content

Commit 4a1d10b

Browse files
committed
Retrieve HWLOC API version from hwloc.h header
The FindLIBHWLOC.cmake module previously used the config.h header to retrieve the HWLOC library version. This header was not always present depending on how the library was distributed. To address this issue, we now rely on the HWLOC API version retrieved from hwloc.h, the main HWLOC library header.
1 parent d77a30d commit 4a1d10b

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

cmake/FindLIBHWLOC.cmake

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,25 @@ get_filename_component(LIBHWLOC_INCLUDE_DIR ${LIBHWLOC_HEADER} DIRECTORY)
1515
set(LIBHWLOC_INCLUDE_DIRS ${LIBHWLOC_INCLUDE_DIR})
1616

1717
if(LIBHWLOC_INCLUDE_DIR)
18-
if(EXISTS "${LIBHWLOC_INCLUDE_DIR}/hwloc/autogen/config.h")
19-
file(
20-
STRINGS "${LIBHWLOC_INCLUDE_DIR}/hwloc/autogen/config.h"
21-
LIBHWLOC_VERSION
22-
REGEX
23-
"#define[ \t]HWLOC_VERSION[ \t]\"([0-9]+.[0-9]+.[0-9]+(rc[0-9])?)(-git)?\""
24-
)
25-
string(
26-
REGEX
27-
REPLACE
28-
"#define[ \t]HWLOC_VERSION[ \t]\"([0-9]+.[0-9]+.[0-9]+(rc[0-9])?)(-git)?\""
29-
"\\1"
30-
LIBHWLOC_VERSION
31-
"${LIBHWLOC_VERSION}")
18+
if(EXISTS "${LIBHWLOC_INCLUDE_DIR}/hwloc.h")
19+
file(STRINGS "${LIBHWLOC_INCLUDE_DIR}/hwloc.h" LIBHWLOC_API_VERSION
20+
REGEX "#define[ \t]HWLOC_API_VERSION[ \t]0x[0-9]+")
21+
string(REGEX
22+
REPLACE "#define[ \t]HWLOC_API_VERSION[ \t](0x[0-9]+)" "\\1"
23+
LIBHWLOC_API_VERSION "${LIBHWLOC_API_VERSION}")
24+
25+
math(EXPR LIBHWLOC_API_PATCH "(${LIBHWLOC_API_VERSION} & 0xFF)")
26+
math(EXPR LIBHWLOC_API_MINOR "(${LIBHWLOC_API_VERSION} & 0xFF00) >> 8")
27+
math(EXPR LIBHWLOC_API_MAJOR
28+
"(${LIBHWLOC_API_VERSION} & 0xFF0000) >> 16")
29+
30+
set(LIBHWLOC_API_VERSION
31+
"${LIBHWLOC_API_MAJOR}.${LIBHWLOC_API_MINOR}.${LIBHWLOC_API_PATCH}")
32+
3233
else()
3334
message(
3435
WARNING
35-
"LIBHWLOC_INCLUDE_DIR found, but header with version info is missing"
36+
"LIBHWLOC_INCLUDE_DIR found, but header with API version info is missing"
3637
)
3738
endif()
3839
endif()
@@ -48,18 +49,19 @@ if(LIBHWLOC_LIBRARY)
4849
message(STATUS " LIBHWLOC_LIBRARIES = ${LIBHWLOC_LIBRARIES}")
4950
message(STATUS " LIBHWLOC_INCLUDE_DIRS = ${LIBHWLOC_INCLUDE_DIRS}")
5051
message(STATUS " LIBHWLOC_LIBRARY_DIRS = ${LIBHWLOC_LIBRARY_DIRS}")
51-
message(STATUS " LIBHWLOC_VERSION = ${LIBHWLOC_VERSION}")
52+
message(STATUS " LIBHWLOC_API_VERSION = ${LIBHWLOC_API_VERSION}")
5253
if(WINDOWS)
5354
message(STATUS " LIBHWLOC_DLL_DIRS = ${LIBHWLOC_DLL_DIRS}")
5455
endif()
5556

5657
if(LIBHWLOC_FIND_VERSION)
57-
if(NOT LIBHWLOC_VERSION)
58+
if(NOT LIBHWLOC_API_VERSION)
5859
message(FATAL_ERROR "Failed to retrieve libhwloc version")
59-
elseif(NOT LIBHWLOC_VERSION VERSION_GREATER_EQUAL LIBHWLOC_FIND_VERSION)
60+
elseif(NOT LIBHWLOC_API_VERSION VERSION_GREATER_EQUAL
61+
LIBHWLOC_FIND_VERSION)
6062
message(
6163
FATAL_ERROR
62-
" Required version: ${LIBHWLOC_FIND_VERSION}, found ${LIBHWLOC_VERSION}"
64+
" Required version: ${LIBHWLOC_FIND_VERSION}, found ${LIBHWLOC_API_VERSION}"
6365
)
6466
endif()
6567
endif()

0 commit comments

Comments
 (0)