diff --git a/CMakeLists.txt b/CMakeLists.txt index 22ab3cc..00bf90d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,9 +38,15 @@ set(CROSS OFF CACHE BOOL "Cross-compiling?") set(CROSS_TARGET OFF CACHE STRING "Cross-compilation target") set(SYSTEM_OPENSSL OFF CACHE STRING "Use system-provided openssl libraries (instead of prebuilts or building)") +option(LOCAL_BUILD "Build in the intranet" OFF) +set(LOCAL_OPENSSL OFF CACHE STRING "The local openssl resource dir") # allow including our modules list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") +if(NOT OPENSSL_BUILD_VERSION) + set(OPENSSL_BUILD_VERSION "1.1.1t") +endif() + # mimic system ssl and crypto targets add_library(ssl INTERFACE) add_library(crypto INTERFACE) @@ -55,7 +61,7 @@ if (SYSTEM_OPENSSL) add_custom_target(openssl) else() # build our own or use prebuilts - + # set up fake targets add_library(ssl_lib STATIC IMPORTED GLOBAL) add_library(crypto_lib STATIC IMPORTED GLOBAL) @@ -70,16 +76,16 @@ else() set(OPENSSL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/openssl-prefix/src/openssl) endif() - set(OPENSSL_LIBSSL_PATH ${OPENSSL_PREFIX}/usr/local/lib/libssl.a) - set(OPENSSL_LIBCRYPTO_PATH ${OPENSSL_PREFIX}/usr/local/lib/libcrypto.a) - + set(OPENSSL_LIBSSL_PATH ${OPENSSL_PREFIX}/usr/local/lib/libssl.so) + set(OPENSSL_LIBCRYPTO_PATH ${OPENSSL_PREFIX}/usr/local/lib/libcrypto.so) + # set up openssl target if (BUILD_OPENSSL) include(BuildOpenSSL) else() include(PrebuiltOpenSSL) endif() - + # set import locations set_target_properties(ssl_lib PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBSSL_PATH}) set_target_properties(crypto_lib PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBCRYPTO_PATH}) @@ -91,4 +97,11 @@ else() # add fake targets to common target add_dependencies(ssl_lib openssl) add_dependencies(crypto_lib openssl) + + install(FILES + ${OPENSSL_LIBCRYPTO_PATH}.1.1 + ${OPENSSL_LIBCRYPTO_PATH} + ${OPENSSL_LIBSSL_PATH}.1.1 + ${OPENSSL_LIBSSL_PATH} + DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) endif() diff --git a/cmake/BuildOpenSSL.cmake b/cmake/BuildOpenSSL.cmake index e31f4bb..1cb990e 100644 --- a/cmake/BuildOpenSSL.cmake +++ b/cmake/BuildOpenSSL.cmake @@ -46,129 +46,143 @@ if (OPENSSL_BUILD_HASH) set(OPENSSL_CHECK_HASH URL_HASH SHA256=${OPENSSL_BUILD_HASH}) endif() -# if already built, do not build again -if ((EXISTS ${OPENSSL_LIBSSL_PATH}) AND (EXISTS ${OPENSSL_LIBCRYPTO_PATH})) - message(WARNING "Not building OpenSSL again. Remove ${OPENSSL_LIBSSL_PATH} and ${OPENSSL_LIBCRYPTO_PATH} for rebuild") +# Always build again +if (WIN32 AND NOT CROSS) + # yep, windows needs special treatment, but neither cygwin nor msys, since they provide an UNIX-like environment + + if (MINGW) + set(OS "WIN32") + message(WARNING "Building on windows is experimental") + + find_program(MSYS_BASH "bash.exe" PATHS "C:/Msys/" "C:/MinGW/msys/" PATH_SUFFIXES "/1.0/bin/" "/bin/" + DOC "Path to MSYS installation") + if (NOT MSYS_BASH) + message(FATAL_ERROR "Specify MSYS installation path") + endif(NOT MSYS_BASH) + + set(MINGW_MAKE ${CMAKE_MAKE_PROGRAM}) + message(WARNING "Assuming your make program is a sibling of your compiler (resides in same directory)") + elseif(NOT (CYGWIN OR MSYS)) + message(FATAL_ERROR "Unsupported compiler infrastructure") + endif(MINGW) + + set(MAKE_PROGRAM ${CMAKE_MAKE_PROGRAM}) +elseif(NOT UNIX) + message(FATAL_ERROR "Unsupported platform") else() - if (NOT OPENSSL_BUILD_VERSION) - message(FATAL_ERROR "You must specify OPENSSL_BUILD_VERSION!") - endif() + # for OpenSSL we can only use GNU make, no exotic things like Ninja (MSYS always uses GNU make) + find_program(MAKE_PROGRAM make) +endif() - if (WIN32 AND NOT CROSS) - # yep, windows needs special treatment, but neither cygwin nor msys, since they provide an UNIX-like environment - - if (MINGW) - set(OS "WIN32") - message(WARNING "Building on windows is experimental") - - find_program(MSYS_BASH "bash.exe" PATHS "C:/Msys/" "C:/MinGW/msys/" PATH_SUFFIXES "/1.0/bin/" "/bin/" - DOC "Path to MSYS installation") - if (NOT MSYS_BASH) - message(FATAL_ERROR "Specify MSYS installation path") - endif(NOT MSYS_BASH) - - set(MINGW_MAKE ${CMAKE_MAKE_PROGRAM}) - message(WARNING "Assuming your make program is a sibling of your compiler (resides in same directory)") - elseif(NOT (CYGWIN OR MSYS)) - message(FATAL_ERROR "Unsupported compiler infrastructure") - endif(MINGW) - - set(MAKE_PROGRAM ${CMAKE_MAKE_PROGRAM}) - elseif(NOT UNIX) - message(FATAL_ERROR "Unsupported platform") - else() - # for OpenSSL we can only use GNU make, no exotic things like Ninja (MSYS always uses GNU make) - find_program(MAKE_PROGRAM make) - endif() +# save old git values for core.autocrlf and core.eol +execute_process(COMMAND ${GIT_EXECUTABLE} config --global --get core.autocrlf OUTPUT_VARIABLE GIT_CORE_AUTOCRLF OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND ${GIT_EXECUTABLE} config --global --get core.eol OUTPUT_VARIABLE GIT_CORE_EOL OUTPUT_STRIP_TRAILING_WHITESPACE) - # save old git values for core.autocrlf and core.eol - execute_process(COMMAND ${GIT_EXECUTABLE} config --global --get core.autocrlf OUTPUT_VARIABLE GIT_CORE_AUTOCRLF OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND ${GIT_EXECUTABLE} config --global --get core.eol OUTPUT_VARIABLE GIT_CORE_EOL OUTPUT_STRIP_TRAILING_WHITESPACE) +# on windows we need to replace path to perl since CreateProcess(..) cannot handle unix paths +if (WIN32 AND NOT CROSS) + set(PERL_PATH_FIX_INSTALL sed -i -- 's/\\/usr\\/bin\\/perl/perl/g' Makefile) +else() + set(PERL_PATH_FIX_INSTALL true) +endif() - # on windows we need to replace path to perl since CreateProcess(..) cannot handle unix paths - if (WIN32 AND NOT CROSS) - set(PERL_PATH_FIX_INSTALL sed -i -- 's/\\/usr\\/bin\\/perl/perl/g' Makefile) - else() - set(PERL_PATH_FIX_INSTALL true) - endif() +# CROSS and CROSS_ANDROID cannot both be set (because of internal reasons) +if (CROSS AND CROSS_ANDROID) + # if user set CROSS_ANDROID and CROSS we assume he wants CROSS_ANDROID, so set CROSS to OFF + set(CROSS OFF) +endif() - # CROSS and CROSS_ANDROID cannot both be set (because of internal reasons) - if (CROSS AND CROSS_ANDROID) - # if user set CROSS_ANDROID and CROSS we assume he wants CROSS_ANDROID, so set CROSS to OFF - set(CROSS OFF) - endif() +if (CROSS_ANDROID) + set(OS "LINUX_CROSS_ANDROID") +endif() - if (CROSS_ANDROID) - set(OS "LINUX_CROSS_ANDROID") - endif() +# python helper script for corrent building environment +set(BUILD_ENV_TOOL ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/building_env.py ${OS} ${MSYS_BASH} ${MINGW_MAKE}) + +# user-specified modules +set(CONFIGURE_OPENSSL_MODULES ${OPENSSL_MODULES}) - # python helper script for corrent building environment - set(BUILD_ENV_TOOL ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/building_env.py ${OS} ${MSYS_BASH} ${MINGW_MAKE}) +# additional configure script parameters +set(CONFIGURE_OPENSSL_PARAMS --libdir=lib) +if (OPENSSL_DEBUG_BUILD) + set(CONFIGURE_OPENSSL_PARAMS "${CONFIGURE_OPENSSL_PARAMS} no-asm -g3 -O0 -fno-omit-frame-pointer -fno-inline-functions") +endif() - # user-specified modules - set(CONFIGURE_OPENSSL_MODULES ${OPENSSL_MODULES}) +# set install command depending of choice on man page generation +if (OPENSSL_INSTALL_MAN) + set(INSTALL_OPENSSL_MAN "install_docs") +endif() - # additional configure script parameters - set(CONFIGURE_OPENSSL_PARAMS --libdir=lib) - if (OPENSSL_DEBUG_BUILD) - set(CONFIGURE_OPENSSL_PARAMS "${CONFIGURE_OPENSSL_PARAMS} no-asm -g3 -O0 -fno-omit-frame-pointer -fno-inline-functions") - endif() - - # set install command depending of choice on man page generation - if (OPENSSL_INSTALL_MAN) - set(INSTALL_OPENSSL_MAN "install_docs") - endif() - - # disable building tests - if (NOT OPENSSL_ENABLE_TESTS) - set(CONFIGURE_OPENSSL_MODULES ${CONFIGURE_OPENSSL_MODULES} no-tests) - set(COMMAND_TEST "true") +# disable building tests +if (NOT OPENSSL_ENABLE_TESTS) + set(CONFIGURE_OPENSSL_MODULES ${CONFIGURE_OPENSSL_MODULES} no-tests) + set(COMMAND_TEST "true") +endif() + +# cross-compiling +if (CROSS) + set(COMMAND_CONFIGURE ./Configure ${CONFIGURE_OPENSSL_PARAMS} --cross-compile-prefix=${CROSS_PREFIX} ${CROSS_TARGET} ${CONFIGURE_OPENSSL_MODULES} --prefix=/usr/local/) + set(COMMAND_TEST "true") +elseif(CROSS_ANDROID) + + # Android specific configuration options + set(CONFIGURE_OPENSSL_MODULES ${CONFIGURE_OPENSSL_MODULES} no-hw) + + # silence warnings about unused arguments (Clang specific) + set(CFLAGS "${CMAKE_C_FLAGS} -Qunused-arguments") + set(CXXFLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments") + + # required environment configuration is already set (by e.g. ndk) so no need to fiddle around with all the OpenSSL options ... + if (NOT ANDROID) + message(FATAL_ERROR "Use NDK cmake toolchain or cmake android autoconfig") endif() - # cross-compiling - if (CROSS) - set(COMMAND_CONFIGURE ./Configure ${CONFIGURE_OPENSSL_PARAMS} --cross-compile-prefix=${CROSS_PREFIX} ${CROSS_TARGET} ${CONFIGURE_OPENSSL_MODULES} --prefix=/usr/local/) - set(COMMAND_TEST "true") - elseif(CROSS_ANDROID) - - # Android specific configuration options - set(CONFIGURE_OPENSSL_MODULES ${CONFIGURE_OPENSSL_MODULES} no-hw) - - # silence warnings about unused arguments (Clang specific) - set(CFLAGS "${CMAKE_C_FLAGS} -Qunused-arguments") - set(CXXFLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments") - - # required environment configuration is already set (by e.g. ndk) so no need to fiddle around with all the OpenSSL options ... - if (NOT ANDROID) - message(FATAL_ERROR "Use NDK cmake toolchain or cmake android autoconfig") - endif() - - if (ARMEABI_V7A) - set(OPENSSL_PLATFORM "arm") - set(CONFIGURE_OPENSSL_PARAMS ${CONFIGURE_OPENSSL_PARAMS} "-march=armv7-a") + if (ARMEABI_V7A) + set(OPENSSL_PLATFORM "arm") + set(CONFIGURE_OPENSSL_PARAMS ${CONFIGURE_OPENSSL_PARAMS} "-march=armv7-a") + else() + if (CMAKE_ANDROID_ARCH_ABI MATCHES "arm64-v8a") + set(OPENSSL_PLATFORM "arm64") else() - if (CMAKE_ANDROID_ARCH_ABI MATCHES "arm64-v8a") - set(OPENSSL_PLATFORM "arm64") - else() - set(OPENSSL_PLATFORM ${CMAKE_ANDROID_ARCH_ABI}) - endif() - endif() - - # ... but we have to convert all the CMake options to environment variables! - set(PATH "${ANDROID_TOOLCHAIN_ROOT}/bin/:${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_NAME}/bin/") - set(LDFLAGS ${CMAKE_MODULE_LINKER_FLAGS}) - - set(COMMAND_CONFIGURE ./Configure android-${OPENSSL_PLATFORM} ${CONFIGURE_OPENSSL_PARAMS} ${CONFIGURE_OPENSSL_MODULES}) - set(COMMAND_TEST "true") - else() # detect host system automatically - set(COMMAND_CONFIGURE ./config ${CONFIGURE_OPENSSL_PARAMS} ${CONFIGURE_OPENSSL_MODULES}) - - if (NOT COMMAND_TEST) - set(COMMAND_TEST ${BUILD_ENV_TOOL} ${MAKE_PROGRAM} test) + set(OPENSSL_PLATFORM ${CMAKE_ANDROID_ARCH_ABI}) endif() endif() - - # add openssl target + + # ... but we have to convert all the CMake options to environment variables! + set(PATH "${ANDROID_TOOLCHAIN_ROOT}/bin/:${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_NAME}/bin/") + set(LDFLAGS ${CMAKE_MODULE_LINKER_FLAGS}) + + set(COMMAND_CONFIGURE ./Configure android-${OPENSSL_PLATFORM} ${CONFIGURE_OPENSSL_PARAMS} ${CONFIGURE_OPENSSL_MODULES}) + set(COMMAND_TEST "true") +else() # detect host system automatically + set(COMMAND_CONFIGURE ./config ${CONFIGURE_OPENSSL_PARAMS} ${CONFIGURE_OPENSSL_MODULES}) + + if (NOT COMMAND_TEST) + set(COMMAND_TEST ${BUILD_ENV_TOOL} ${MAKE_PROGRAM} test) + endif() +endif() + +# add openssl target +if(LOCAL_BUILD) + ExternalProject_Add(openssl + SOURCE_DIR ${LOCAL_OPENSSL} + UPDATE_COMMAND ${GIT_EXECUTABLE} clean -dfx -e buildenv.txt && ${GIT_EXECUTABLE} stash && ${GIT_EXECUTABLE} checkout OpenSSL_1_1_1t + + CONFIGURE_COMMAND ${BUILD_ENV_TOOL} ${COMMAND_CONFIGURE} + PATCH_COMMAND ${PATCH_PROGRAM} -p1 --forward -r - < ${CMAKE_CURRENT_SOURCE_DIR}/patches/0001-Fix-failing-cms-test-when-no-des-is-used.patch || echo + + BUILD_COMMAND ${BUILD_ENV_TOOL} ${MAKE_PROGRAM} -j ${NUM_JOBS} + BUILD_BYPRODUCTS ${OPENSSL_LIBSSL_PATH} ${OPENSSL_LIBCRYPTO_PATH} + + TEST_BEFORE_INSTALL 0 + TEST_COMMAND ${COMMAND_TEST} + + INSTALL_COMMAND ${BUILD_ENV_TOOL} ${PERL_PATH_FIX_INSTALL} + COMMAND ${BUILD_ENV_TOOL} ${MAKE_PROGRAM} DESTDIR=${CMAKE_CURRENT_BINARY_DIR} install_sw ${INSTALL_OPENSSL_MAN} + COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR} ${CMAKE_BINARY_DIR} # force CMake-reload + + LOG_INSTALL 1 + ) +else() ExternalProject_Add(openssl URL https://mirror.viaduck.org/openssl/openssl-${OPENSSL_BUILD_VERSION}.tar.gz ${OPENSSL_CHECK_HASH} @@ -189,53 +203,58 @@ else() LOG_INSTALL 1 ) +endif() - # set git config values to openssl requirements (no impact on linux though) - ExternalProject_Add_Step(openssl setGitConfig - COMMAND ${GIT_EXECUTABLE} config --global core.autocrlf false - COMMAND ${GIT_EXECUTABLE} config --global core.eol lf - DEPENDEES - DEPENDERS download - ALWAYS ON - ) +# set git config values to openssl requirements (no impact on linux though) +ExternalProject_Add_Step(openssl setGitConfig + COMMAND ${GIT_EXECUTABLE} config --global core.autocrlf false + COMMAND ${GIT_EXECUTABLE} config --global core.eol lf + DEPENDEES + DEPENDERS download + ALWAYS ON +) - # set, don't abort if it fails (due to variables being empty). To realize this we must only call git if the configs - # are set globally, otherwise do a no-op command ("echo 1", since "true" is not available everywhere) - if (GIT_CORE_AUTOCRLF) - set (GIT_CORE_AUTOCRLF_CMD ${GIT_EXECUTABLE} config --global core.autocrlf ${GIT_CORE_AUTOCRLF}) - else() - set (GIT_CORE_AUTOCRLF_CMD echo) - endif() - if (GIT_CORE_EOL) - set (GIT_CORE_EOL_CMD ${GIT_EXECUTABLE} config --global core.eol ${GIT_CORE_EOL}) - else() - set (GIT_CORE_EOL_CMD echo) - endif() - ## +# set, don't abort if it fails (due to variables being empty). To realize this we must only call git if the configs +# are set globally, otherwise do a no-op command ("echo 1", since "true" is not available everywhere) +if (GIT_CORE_AUTOCRLF) + set (GIT_CORE_AUTOCRLF_CMD ${GIT_EXECUTABLE} config --global core.autocrlf ${GIT_CORE_AUTOCRLF}) +else() + set (GIT_CORE_AUTOCRLF_CMD echo) +endif() +if (GIT_CORE_EOL) + set (GIT_CORE_EOL_CMD ${GIT_EXECUTABLE} config --global core.eol ${GIT_CORE_EOL}) +else() + set (GIT_CORE_EOL_CMD echo) +endif() +## - # set git config values to previous values - ExternalProject_Add_Step(openssl restoreGitConfig - # unset first (is required, since old value could be omitted, which wouldn't take any effect in "set" - COMMAND ${GIT_EXECUTABLE} config --global --unset core.autocrlf - COMMAND ${GIT_EXECUTABLE} config --global --unset core.eol +# set git config values to previous values +ExternalProject_Add_Step(openssl restoreGitConfig +# unset first (is required, since old value could be omitted, which wouldn't take any effect in "set" + COMMAND ${GIT_EXECUTABLE} config --global --unset core.autocrlf + COMMAND ${GIT_EXECUTABLE} config --global --unset core.eol - COMMAND ${GIT_CORE_AUTOCRLF_CMD} - COMMAND ${GIT_CORE_EOL_CMD} + COMMAND ${GIT_CORE_AUTOCRLF_CMD} + COMMAND ${GIT_CORE_EOL_CMD} - DEPENDEES download - DEPENDERS configure - ALWAYS ON - ) + DEPENDEES download + DEPENDERS configure + ALWAYS ON +) - # write environment to file, is picked up by python script - get_cmake_property(_variableNames VARIABLES) - foreach (_variableName ${_variableNames}) - if (NOT _variableName MATCHES "lines") - set(OUT_FILE "${OUT_FILE}${_variableName}=\"${${_variableName}}\"\n") - endif() - endforeach() +# write environment to file, is picked up by python script +get_cmake_property(_variableNames VARIABLES) +foreach (_variableName ${_variableNames}) + if ((NOT _variableName MATCHES "lines") OR (NOT _variableName MATCHES "CMAKE_CXX_COMPILER_ID_PLATFORM_CONTENT")) + set(OUT_FILE "${OUT_FILE}${_variableName}=\"${${_variableName}}\"\n") + endif() +endforeach() +if (NOT LOCAL_OPENSSL) + # Write in openssl-cmake-build/, because the file will be overwritten when the download is performed later file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/buildenv.txt ${OUT_FILE}) - - set_target_properties(ssl_lib PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBSSL_PATH}) - set_target_properties(crypto_lib PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBCRYPTO_PATH}) +else() + # Write in specified dir LOCAL_OPENSSL + file(WRITE ${LOCAL_OPENSSL}/buildenv.txt ${OUT_FILE}) endif() +set_target_properties(ssl_lib PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBSSL_PATH}) +set_target_properties(crypto_lib PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBCRYPTO_PATH}) diff --git a/scripts/building_env.py b/scripts/building_env.py index aab2f42..4a7c932 100644 --- a/scripts/building_env.py +++ b/scripts/building_env.py @@ -28,6 +28,7 @@ from subprocess import PIPE, Popen from sys import argv, exit import os, re +import os.path env = os.environ l = [] @@ -57,23 +58,24 @@ l.extend(argv[offset+1:]) # routed commands l[0] = '"'+l[0]+'"' -# ensure target dir exists for mingw cross -target_dir = binary_openssl_dir_source+"/../../../usr/local/bin" -if not os.path.exists(target_dir): - os.makedirs(target_dir) - # read environment from file if cross-compiling if os_s == "LINUX_CROSS_ANDROID": expr = re.compile('^(.*?)="(.*?)"', re.MULTILINE | re.DOTALL) - f = open(binary_openssl_dir_source+"/../../../buildenv.txt", "r") + if not os.path.exists(binary_openssl_dir_source+"buildenv.txt"): + f = open(binary_openssl_dir_source+"../../../buildenv.txt", "r") + else: + f = open(binary_openssl_dir_source+"buildenv.txt", "r") content = f.read() f.close() for k, v in expr.findall(content): - if k != "PATH": - env[k] = v.replace('"', '') - else: - env[k] = v.replace('"', '')+":"+env[k] + try: + if k != "PATH": + env[k] = v.replace('"', '') + else: + env[k] = v.replace('"', '')+":"+env[k] + except: + pass proc = None if os_s == "WIN32":