+include(GNUInstallDirs)
+include(CheckLibraryExists)
+include(CheckFunctionExists)
+include(CheckCSourceRuns)
+
+enable_testing()
+
+find_package(OpenSSL 3.0 REQUIRED)
+
+if (NOT DEFINED OPENSSL_ROOT_DIR)
+ get_filename_component(OPENSSL_ROOT_DIR ${OPENSSL_INCLUDE_DIR} DIRECTORY)
+ message(STATUS "Setting OpenSSL root: ${OPENSSL_ROOT_DIR}")
+endif()
+find_program(OPENSSL_PROGRAM openssl
+ PATHS ${OPENSSL_ROOT_DIR} PATH_SUFFIXES apps bin NO_DEFAULT_PATH)
+message(STATUS "Found OpenSSL application: ${OPENSSL_PROGRAM}")
+include_directories(${OPENSSL_INCLUDE_DIR})
+
+if (CMAKE_C_COMPILER_ID MATCHES "Clang")
+ set(CMAKE_C_FLAGS_RELEASE -O2)
+ set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
+ set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -ggdb")
+ add_compile_options(-Werror -Wall -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Qunused-arguments -Wno-deprecated-declarations)
+elseif(CMAKE_C_COMPILER_ID MATCHES "GNU")
+ set(CMAKE_C_FLAGS_RELEASE -O2)
+ set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
+ set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -ggdb")
+ add_compile_options(-Werror -Wall -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Wno-error=unknown-pragmas -Wno-error=pragmas -Wno-deprecated-declarations)
+elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
+ add_definitions(-D_CRT_SECURE_NO_WARNINGS)
+ add_definitions(-D_CRT_DEPRECATED_NO_WARNINGS)
+ add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
+ add_compile_options(/MP /WX /W4 /wd4100 /wd4267 /wd4206 /wd4706 /wd4244 /wd4115)
+endif()
+
+if (ASAN)
+ message(STATUS "address sanitizer enabled")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -g3 -fno-omit-frame-pointer")
+ set(SKIP_PERL_TESTS 1)
+endif()
+
+# DEPRECATEDIN_3_0 CMAC
+set_source_files_properties(gost_omac.c PROPERTIES COMPILE_FLAGS -Wno-error=deprecated-declarations)
+# DEPRECATEDIN_3_0 HMAC
+set_source_files_properties(gost_keyexpimp.c PROPERTIES COMPILE_FLAGS -Wno-error=deprecated-declarations)
+
+set(CMAKE_C_STANDARD 90)
+CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME_C)
+CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_CLOCK_GETTIME_RT)
+if(HAVE_CLOCK_GETTIME_RT AND NOT HAVE_CLOCK_GETTIME_C)
+ set(CLOCK_GETTIME_LIB rt)
+endif()