@@ -305,42 +305,58 @@ if(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h")
305305 REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*" )
306306
307307 string (COMPARE EQUAL "${openssl_version_str} " "" _is_empty)
308- if (_is_empty)
309- message (
310- FATAL_ERROR
311- "Incorrect OPENSSL_VERSION_NUMBER define in header"
312- ": ${OPENSSL_INCLUDE_DIR} /openssl/opensslv.h"
313- )
308+ if (NOT _is_empty)
309+ # Version parsing pre 3.x i.e 1.1.1 etc.
310+ # The version number is encoded as 0xMNNFFPPS: major minor fix patch status
311+ # The status gives if this is a developer or prerelease and is ignored here.
312+ # Major, minor, and fix directly translate into the version numbers shown in
313+ # the string. The patch field translates to the single character suffix that
314+ # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
315+ # on.
316+
317+ string (REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$"
318+ "\\ 1;\\ 2;\\ 3;\\ 4;\\ 5" OPENSSL_VERSION_LIST "${openssl_version_str} " )
319+ list (GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
320+ list (GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
321+ from_hex("${OPENSSL_VERSION_MINOR} " OPENSSL_VERSION_MINOR)
322+ list (GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
323+ from_hex("${OPENSSL_VERSION_FIX} " OPENSSL_VERSION_FIX)
324+ list (GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
325+
326+ if (NOT OPENSSL_VERSION_PATCH STREQUAL "00" )
327+ from_hex("${OPENSSL_VERSION_PATCH} " _tmp)
328+ # 96 is the ASCII code of 'a' minus 1
329+ math (EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96" )
330+ unset (_tmp)
331+ # Once anyone knows how OpenSSL would call the patch versions beyond 'z'
332+ # this should be updated to handle that, too. This has not happened yet
333+ # so it is simply ignored here for now.
334+ string (ASCII "${OPENSSL_VERSION_PATCH_ASCII} " OPENSSL_VERSION_PATCH_STRING)
335+ endif ()
336+
337+ set (OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR} .${OPENSSL_VERSION_MINOR} .${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING} " )
338+ else ()
339+ # Version parsing post 3.x
340+ file (STRINGS "${OPENSSL_INCLUDE_DIR} /openssl/opensslv.h" OPENSSL_VERSION_MAJOR
341+ REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_MAJOR[\t ]+([0-9a-fA-F])+.*" )
342+ string (COMPARE EQUAL "${OPENSSL_VERSION_MAJOR} " "" _major_is_empty)
343+ file (STRINGS "${OPENSSL_INCLUDE_DIR} /openssl/opensslv.h" OPENSSL_VERSION_MINOR
344+ REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_MINOR[\t ]+([0-9a-fA-F])+.*" )
345+ string (COMPARE EQUAL "${OPENSSL_VERSION_MINOR} " "" _minor_is_empty)
346+ file (STRINGS "${OPENSSL_INCLUDE_DIR} /openssl/opensslv.h" OPENSSL_VERSION_PATCH
347+ REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_PATCH[\t ]+([0-9a-fA-F])+.*" )
348+ string (COMPARE EQUAL "${OPENSSL_VERSION_PATCH} " "" _patch_is_empty)
349+
350+ if (_major_is_empty OR _minor_is_empty OR _patch_is_empty)
351+ message (
352+ FATAL_ERROR
353+ "Incorrect OPENSSL_VERSION_NUMBER define in header"
354+ ": ${OPENSSL_INCLUDE_DIR} /openssl/opensslv.h"
355+ )
356+ endif ()
357+ set (OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR} .${OPENSSL_VERSION_MINOR} .${OPENSSL_VERSION_PATCH} " )
314358 endif ()
315359
316- # The version number is encoded as 0xMNNFFPPS: major minor fix patch status
317- # The status gives if this is a developer or prerelease and is ignored here.
318- # Major, minor, and fix directly translate into the version numbers shown in
319- # the string. The patch field translates to the single character suffix that
320- # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
321- # on.
322-
323- string (REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$"
324- "\\ 1;\\ 2;\\ 3;\\ 4;\\ 5" OPENSSL_VERSION_LIST "${openssl_version_str} " )
325- list (GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
326- list (GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
327- from_hex("${OPENSSL_VERSION_MINOR} " OPENSSL_VERSION_MINOR)
328- list (GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
329- from_hex("${OPENSSL_VERSION_FIX} " OPENSSL_VERSION_FIX)
330- list (GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
331-
332- if (NOT OPENSSL_VERSION_PATCH STREQUAL "00" )
333- from_hex("${OPENSSL_VERSION_PATCH} " _tmp)
334- # 96 is the ASCII code of 'a' minus 1
335- math (EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96" )
336- unset (_tmp)
337- # Once anyone knows how OpenSSL would call the patch versions beyond 'z'
338- # this should be updated to handle that, too. This has not happened yet
339- # so it is simply ignored here for now.
340- string (ASCII "${OPENSSL_VERSION_PATCH_ASCII} " OPENSSL_VERSION_PATCH_STRING)
341- endif ()
342-
343- set (OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR} .${OPENSSL_VERSION_MINOR} .${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING} " )
344360endif ()
345361
346362include (FindPackageHandleStandardArgs)
0 commit comments