Skip to content

Commit 5b35db5

Browse files
kswiecickilplewaKFilipek
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. Co-authored-by: Łukasz Plewa <[email protected]> Co-authored-by: Krzysztof Filipek <[email protected]>
1 parent d77a30d commit 5b35db5

File tree

1 file changed

+27
-26
lines changed

1 file changed

+27
-26
lines changed

cmake/FindLIBHWLOC.cmake

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,28 @@ find_file(LIBHWLOC_HEADER NAMES hwloc.h)
1414
get_filename_component(LIBHWLOC_INCLUDE_DIR ${LIBHWLOC_HEADER} DIRECTORY)
1515
set(LIBHWLOC_INCLUDE_DIRS ${LIBHWLOC_INCLUDE_DIR})
1616

17-
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}")
32-
else()
33-
message(
34-
WARNING
35-
"LIBHWLOC_INCLUDE_DIR found, but header with version info is missing"
36-
)
37-
endif()
38-
endif()
17+
set(HWLOC_VERSION_CODE
18+
"
19+
#include <stdio.h>
20+
#include <stdlib.h>
21+
#include \"hwloc.h\"
22+
23+
void main(int argc, char** argv) {
24+
unsigned LIBHWLOC_API_PATCH = HWLOC_API_VERSION & 0xFF;
25+
unsigned LIBHWLOC_API_MINOR = (HWLOC_API_VERSION >> 8) & 0xFF;
26+
unsigned LIBHWLOC_API_MAJOR = (HWLOC_API_VERSION >> 16) & 0xFF;
27+
printf(\"%d.%d.%d\", LIBHWLOC_API_MAJOR, LIBHWLOC_API_MINOR, LIBHWLOC_API_PATCH);
28+
}")
29+
30+
set(HWLOC_VERSION_CODE_FILENAME "hwloc_get_version.c")
31+
file(WRITE "${CMAKE_BINARY_DIR}/${HWLOC_VERSION_CODE_FILENAME}"
32+
"${HWLOC_VERSION_CODE}")
33+
34+
try_run(
35+
HWLOC_RUN_RESULT HWLOC_COMPILE_RESULT ${CMAKE_BINARY_DIR}
36+
"${CMAKE_BINARY_DIR}/${HWLOC_VERSION_CODE_FILENAME}"
37+
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${LIBHWLOC_INCLUDE_DIR}"
38+
RUN_OUTPUT_VARIABLE LIBHWLOC_API_VERSION)
3939

4040
if(WINDOWS)
4141
find_file(LIBHWLOC_DLL NAMES "bin/hwloc-15.dll" "bin/libhwloc-15.dll")
@@ -48,18 +48,19 @@ if(LIBHWLOC_LIBRARY)
4848
message(STATUS " LIBHWLOC_LIBRARIES = ${LIBHWLOC_LIBRARIES}")
4949
message(STATUS " LIBHWLOC_INCLUDE_DIRS = ${LIBHWLOC_INCLUDE_DIRS}")
5050
message(STATUS " LIBHWLOC_LIBRARY_DIRS = ${LIBHWLOC_LIBRARY_DIRS}")
51-
message(STATUS " LIBHWLOC_VERSION = ${LIBHWLOC_VERSION}")
51+
message(STATUS " LIBHWLOC_API_VERSION = ${LIBHWLOC_API_VERSION}")
5252
if(WINDOWS)
5353
message(STATUS " LIBHWLOC_DLL_DIRS = ${LIBHWLOC_DLL_DIRS}")
5454
endif()
5555

5656
if(LIBHWLOC_FIND_VERSION)
57-
if(NOT LIBHWLOC_VERSION)
57+
if(NOT LIBHWLOC_API_VERSION)
5858
message(FATAL_ERROR "Failed to retrieve libhwloc version")
59-
elseif(NOT LIBHWLOC_VERSION VERSION_GREATER_EQUAL LIBHWLOC_FIND_VERSION)
59+
elseif(NOT LIBHWLOC_API_VERSION VERSION_GREATER_EQUAL
60+
LIBHWLOC_FIND_VERSION)
6061
message(
6162
FATAL_ERROR
62-
" Required version: ${LIBHWLOC_FIND_VERSION}, found ${LIBHWLOC_VERSION}"
63+
" Required version: ${LIBHWLOC_FIND_VERSION}, found ${LIBHWLOC_API_VERSION}"
6364
)
6465
endif()
6566
endif()

0 commit comments

Comments
 (0)