Skip to content

Commit 7f18587

Browse files
Merge pull request #492 from kswiecicki/hwloc-cmake-version-fix
Retrieve HWLOC API version from hwloc.h header
2 parents 5df8800 + 5b35db5 commit 7f18587

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)