Skip to content

Commit

Permalink
Refactor library version extraction logic
Browse files Browse the repository at this point in the history
  • Loading branch information
SaillantNicolas committed Aug 22, 2024
1 parent 2fad600 commit ae10e2e
Showing 1 changed file with 50 additions and 92 deletions.
142 changes: 50 additions & 92 deletions Installation/cmake/modules/display-third-party-libs-versions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,109 +4,67 @@ set(LIBRARIES_TO_CHECK
TBB OpenCV METIS ZLIB GLPK SCIP
)

function(get_library_version header_path major_macro minor_macro patchlevel_macro version_var)
if(EXISTS ${header_path})
file(READ ${header_path} HEADER_CONTENT)
if("${HEADER_CONTENT}" MATCHES "#define[ \t]+${major_macro}[ \t]+([0-9]+)")
set(VERSION_MAJOR ${CMAKE_MATCH_1})
endif()
if("${HEADER_CONTENT}" MATCHES "#define[ \t]+${minor_macro}[ \t]+([0-9]+)")
set(VERSION_MINOR ${CMAKE_MATCH_1})
endif()
if("${HEADER_CONTENT}" MATCHES "#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+)")
set(VERSION_PATCHLEVEL ${CMAKE_MATCH_1})
else()
set(VERSION_PATCHLEVEL "")
endif()
if(VERSION_PATCHLEVEL)
set(${version_var} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}" PARENT_SCOPE)
elseif(VERSION_MAJOR AND VERSION_MINOR)
set(${version_var} "${VERSION_MAJOR}.${VERSION_MINOR}" PARENT_SCOPE)
endif()
endif()
endfunction()

function(check_library cgal_3rdparty_lib)
set(QT_NO_CREATE_VERSIONLESS_TARGETS ON)
set(CMAKE_FIND_PACKAGE_QUIET TRUE)
string(TOUPPER ${cgal_3rdparty_lib} cgal_3rdparty_lib_upper)
find_package(${cgal_3rdparty_lib} QUIET)
set(CMAKE_FIND_PACKAGE_QUIET FALSE)
if(${cgal_3rdparty_lib}_FOUND)
set(version_var "")
if(${cgal_3rdparty_lib} STREQUAL "Eigen3")
set(version_var ${EIGEN3_VERSION})
if(DEFINED ${cgal_3rdparty_lib}_VERSION)
set(version_var ${${cgal_3rdparty_lib}_VERSION})
elseif(DEFINED ${cgal_3rdparty_lib}_VERSION_STRING)
set(version_var ${${cgal_3rdparty_lib}_VERSION_STRING})
elseif(DEFINED ${cgal_3rdparty_lib_upper}_VERSION)
set(version_var ${${cgal_3rdparty_lib_upper}_VERSION})
elseif(DEFINED ${cgal_3rdparty_lib_upper}_VERSION_STRING)
set(version_var ${${cgal_3rdparty_lib_upper}_VERSION_STRING})
elseif(${cgal_3rdparty_lib} STREQUAL "GMP")
set(GMP_HEADER_PATH "${GMP_INCLUDE_DIR}/gmp.h")
file(READ "${GMP_HEADER_PATH}" GMP_HEADER_CONTENT)
string(REGEX MATCHALL "#include[ \t]+\"([^\"]+)\"" INCLUDED_HEADERS "${GMP_HEADER_CONTENT}")
set(GMP_VERSION_MAJOR "")
set(GMP_VERSION_MINOR "")
set(GMP_VERSION_PATCH "")
foreach(INCLUDED_HEADER ${INCLUDED_HEADERS})
string(REGEX REPLACE "#include[ \t]+\"([^\"]+)\"" "\\1" GMP_ARCH_HEADER "${INCLUDED_HEADER}")
set(GMP_ARCH_HEADER_PATH "${GMP_INCLUDE_DIR}/${GMP_ARCH_HEADER}")
if(EXISTS "${GMP_ARCH_HEADER_PATH}")
file(READ "${GMP_ARCH_HEADER_PATH}" GMP_ARCH_HEADER_CONTENT)
string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION[ \t]+[0-9]+" GMP_VERSION_MAJOR_LINE "${GMP_ARCH_HEADER_CONTENT}")
string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_MINOR[ \t]+[0-9]+" GMP_VERSION_MINOR_LINE "${GMP_ARCH_HEADER_CONTENT}")
string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_PATCHLEVEL[ \t]+[0-9]+" GMP_VERSION_PATCH_LINE "${GMP_ARCH_HEADER_CONTENT}")
if(GMP_VERSION_MAJOR_LINE)
string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MAJOR "${GMP_VERSION_MAJOR_LINE}")
endif()
if(GMP_VERSION_MINOR_LINE)
string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MINOR "${GMP_VERSION_MINOR_LINE}")
endif()
if(GMP_VERSION_PATCH_LINE)
string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_PATCH "${GMP_VERSION_PATCH_LINE}")
endif()
if(GMP_VERSION_MAJOR AND GMP_VERSION_MINOR AND GMP_VERSION_PATCH)
set(GMP_VERSION "${GMP_VERSION_MAJOR}.${GMP_VERSION_MINOR}.${GMP_VERSION_PATCH}")
break()
set(version_var "")
get_library_version("${GMP_INCLUDE_DIR}/gmp.h" "__GNU_MP_VERSION" "__GNU_MP_VERSION_MINOR" "__GNU_MP_VERSION_PATCHLEVEL" version_var)
if(NOT version_var)
file(READ "${GMP_INCLUDE_DIR}/gmp.h" GMP_HEADER_CONTENT)
string(REGEX MATCHALL "#include[ \t]+\"([^\"]+)\"" INCLUDED_HEADERS "${GMP_HEADER_CONTENT}")
foreach(INCLUDED_HEADER ${INCLUDED_HEADERS})
string(REGEX REPLACE "#include[ \t]+\"([^\"]+)\"" "\\1" GMP_ARCH_HEADER "${INCLUDED_HEADER}")
set(GMP_ARCH_HEADER_PATH "${GMP_INCLUDE_DIR}/${GMP_ARCH_HEADER}")
if(EXISTS ${GMP_ARCH_HEADER_PATH})
get_library_version("${GMP_ARCH_HEADER_PATH}" "__GNU_MP_VERSION" "__GNU_MP_VERSION_MINOR" "__GNU_MP_VERSION_PATCHLEVEL" version_var)
if(version_var)
break()
endif()
endif()
endif()
endforeach()
if(GMP_VERSION)
set(version_var ${GMP_VERSION})
endforeach()
endif()
elseif(${cgal_3rdparty_lib} STREQUAL "GLPK")
set(GLPK_HEADER_PATH "${GLPK_INCLUDE_DIR}/glpk.h")
if(EXISTS "${GLPK_HEADER_PATH}")
file(READ "${GLPK_HEADER_PATH}" GLPK_HEADER_CONTENT)
string(REGEX MATCH "#define[ \t]+GLP_MAJOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MAJOR_LINE "${GLPK_HEADER_CONTENT}")
string(REGEX MATCH "#define[ \t]+GLP_MINOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MINOR_LINE "${GLPK_HEADER_CONTENT}")
set(GLPK_VERSION_MAJOR "")
set(GLPK_VERSION_MINOR "")
if(GLPK_VERSION_MAJOR_LINE)
string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MAJOR "${GLPK_VERSION_MAJOR_LINE}")
endif()
if(GLPK_VERSION_MINOR_LINE)
string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MINOR "${GLPK_VERSION_MINOR_LINE}")
endif()
if(NOT GLPK_VERSION_MAJOR STREQUAL "" AND NOT GLPK_VERSION_MINOR STREQUAL "")
set(GLPK_VERSION "${GLPK_VERSION_MAJOR}.${GLPK_VERSION_MINOR}")
set(version_var ${GLPK_VERSION})
endif()
endif()
elseif(${cgal_3rdparty_lib} STREQUAL "MPFR" OR ${cgal_3rdparty_lib} STREQUAL "METIS")
set(header_name "")
set(version_macros "")
if(${cgal_3rdparty_lib} STREQUAL "MPFR")
set(header_name "mpfr.h")
set(version_macros "MPFR_VERSION_MAJOR;MPFR_VERSION_MINOR;MPFR_VERSION_PATCHLEVEL")
elseif(${cgal_3rdparty_lib} STREQUAL "METIS")
set(header_name "metis.h")
set(version_macros "METIS_VER_MAJOR;METIS_VER_MINOR;METIS_VER_SUBMINOR")
endif()

find_path(INCLUDE_DIR
NAMES ${header_name}
PATHS ${${cgal_3rdparty_lib}_INCLUDE_DIRS}
PATH_SUFFIXES ${cgal_3rdparty_lib}
)

if(INCLUDE_DIR)
set(HEADER_PATH "${INCLUDE_DIR}/${header_name}")

if(EXISTS ${HEADER_PATH})
file(READ ${HEADER_PATH} HEADER_CONTENT)

list(GET version_macros 0 major_macro)
list(GET version_macros 1 minor_macro)
list(GET version_macros 2 patchlevel_macro)

string(REGEX MATCH "#define[ \t]+${major_macro}[ \t]+([0-9]+)" _major_match ${HEADER_CONTENT})
string(REGEX MATCH "#define[ \t]+${minor_macro}[ \t]+([0-9]+)" _minor_match ${HEADER_CONTENT})
string(REGEX MATCH "#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+)" _patchlevel_match ${HEADER_CONTENT})

string(REGEX REPLACE ".*#define[ \t]+${major_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MAJOR ${_major_match})
string(REGEX REPLACE ".*#define[ \t]+${minor_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MINOR ${_minor_match})
string(REGEX REPLACE ".*#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+).*" "\\1" VERSION_PATCHLEVEL ${_patchlevel_match})

set(version_var "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}")
endif()
endif()
elseif(DEFINED ${cgal_3rdparty_lib}_VERSION)
set(version_var ${${cgal_3rdparty_lib}_VERSION})
elseif(DEFINED ${cgal_3rdparty_lib}_VERSION_STRING)
set(version_var ${${cgal_3rdparty_lib}_VERSION_STRING})
get_library_version("${GLPK_INCLUDE_DIR}/glpk.h" "GLP_MAJOR_VERSION" "GLP_MINOR_VERSION" "" version_var)
elseif(${cgal_3rdparty_lib} STREQUAL "MPFR")
get_library_version("${MPFR_INCLUDE_DIR}/mpfr.h" "MPFR_VERSION_MAJOR" "MPFR_VERSION_MINOR" "MPFR_VERSION_PATCHLEVEL" version_var)
elseif(${cgal_3rdparty_lib} STREQUAL "METIS")
get_library_version("${METIS_INCLUDE_DIR}/metis.h" "METIS_VER_MAJOR" "METIS_VER_MINOR" "METIS_VER_SUBMINOR" version_var)
endif()

if(version_var)
Expand Down

0 comments on commit ae10e2e

Please sign in to comment.