Skip to content
Snippets Groups Projects
Commit 1b403165 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Tie cryptlib cmake into syncterm cmake build

There's still some dependency weirdness on Linux, and cryptlib
won't automagically rebuild if the patches change, but it at least
works for an initial build, which is the primary use-case.

None of this has been tested on Windows yet.
parent 7e9951c2
No related branches found
No related tags found
No related merge requests found
Pipeline #6783 passed
......@@ -513,7 +513,7 @@ spec:
- cd src/syncterm
- mkdir build
- cd build
- cmake ..
- cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DFIXED_FIXED_SEED=ON ..
- cmake --build .
artifacts:
name: "syncterm-cmake-$[[ inputs.os ]]-$[[ inputs.platform ]]"
......
......@@ -6,6 +6,11 @@ set(FIXED_FIXED_SEED OFF CACHE BOOL "Use a non-random fixed seed")
include(CheckCCompilerFlag)
include(TestBigEndian)
find_program(PATCH_BIN patch REQUIRED)
find_program(PERL_BIN perl REQUIRED)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
find_program(DOS2UNIX_BIN dos2unix REQUIRED)
endif()
find_package(Threads)
string(REGEX MATCH "[0-9]+" SYSTEM_VERSION ${CMAKE_SYSTEM_VERSION})
......@@ -25,6 +30,74 @@ else()
string(RANDOM LENGTH 16 ALPHABET "0123456789ABCDEF" FIXED_SEED)
endif()
set(PATCHES
cl-fix-test-select.patch
cl-terminal-params.patch
cl-ranlib.patch
cl-vcxproj.patch
cl-endian.patch
cl-win32-noasm.patch
cl-zz-country.patch
cl-algorithms.patch
cl-allow-duplicate-ext.patch
cl-macosx-minver.patch
cl-posix-me-gently.patch
cl-PAM-noprompts.patch
cl-zlib.patch
cl-Dynamic-linked-static-lib.patch
cl-SSL-fix.patch
cl-bigger-maxattribute.patch
cl-mingw-vcver.patch
cl-win32-build-fix.patch
cl-no-odbc.patch
cl-noasm-defines.patch
cl-bn-noasm64-fix.patch
cl-prefer-ECC.patch
cl-prefer-ECC-harder.patch
cl-clear-GCM-flag.patch
cl-use-ssh-ctr.patch
cl-ssh-list-ctr-modes.patch
cl-ssl-suite-blocksizes.patch
cl-no-tpm.patch
cl-no-via-aes.patch
cl-fix-ssh-ecc-ephemeral.patch
cl-just-use-cc.patch
cl-no-safe-stack.patch
cl-allow-pkcs12.patch
cl-openbsd-threads.patch
cl-allow-none-auth.patch
cl-poll-not-select.patch
cl-good-sockets.patch
cl-moar-objects.patch
cl-remove-march.patch
cl-server-term-support.patch
cl-add-pubkey-attribute.patch
cl-allow-ssh-auth-retries.patch
cl-fix-ssh-channel-close.patch
cl-vt-lt-2005-always-defined.patch
cl-no-pie.patch
cl-win32-lean-and-mean.patch
cl-thats-not-asm.patch
cl-make-channels-work.patch
cl-allow-ssh-2.0-go.patch
cl-read-timeout-every-time.patch
cl-pass-after-pubkey.patch
cl-allow-servercheck-pubkeys.patch
cl-double-delete-fine-on-close.patch
cl-handle-unsupported-pubkey.patch
cl-add-patches-info.patch
cl-netbsd-hmac-symbol.patch
cl-netbsd-no-getfsstat.patch
cl-fix-shell-exec-types.patch
cl-ssh-eof-half-close.patch
cl-fix-mb-w-conv-warnings.patch
cl-fix-ssh-header-read.patch
cl-ssh-service-type-for-channel.patch
cl-ssh-sbbs-id-string.patch
cl-channel-select-both.patch
cl-allow-none-auth-svr.patch
)
set(SOURCE
bn/bn_asm.c
bn/bn_exp.c
......@@ -350,7 +423,29 @@ set(SOURCE
zlib/zutil.c
)
add_library(cl STATIC ${SOURCE})
set(LAST_PATCH "")
# Linux patch -l won't deal with line ending differences. :(
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/dos2unix.done
COMMAND ${DOS2UNIX_BIN} ${CMAKE_CURRENT_SOURCE_DIR}/* ${CMAKE_CURRENT_SOURCE_DIR}/*/*
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_SOURCE_DIR}/dos2unix.done
DEPENDS ${LAST_PATCH})
set(LAST_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/dos2unix.done)
endif()
foreach(PATCH IN LISTS PATCHES)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PATCH}.done
COMMAND ${PATCH_BIN} -l -b -p0 -d ${CMAKE_CURRENT_SOURCE_DIR} -i ${CMAKE_CURRENT_SOURCE_DIR}/${PATCH}
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${PATCH}.done
DEPENDS ${LAST_PATCH})
set(LAST_PATCH ${CMAKE_CURRENT_BINARY_DIR}/${PATCH}.done)
endforeach()
add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/cryptlib.h.updated
COMMAND ${PERL_BIN} -i.bak ${CMAKE_CURRENT_SOURCE_DIR}/hashpatch.pl ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cryptlib.h
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_SOURCE_DIR}/cryptlib.h.updated
DEPENDS ${LAST_PATCH})
set(LAST_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/cryptlib.h.updated)
add_library(cl STATIC EXCLUDE_FROM_ALL ${LAST_PATCH} ${SOURCE})
if(HAVE_POINTER_SIGN)
target_compile_options(cl PRIVATE -Wno-pointer-sign)
endif()
......@@ -367,7 +462,10 @@ endif()
if(HAVE_STACK_CLASH_PROTECTION)
# Apple compilers will accept the flag, but then warn about it doing nothing
if(NOT APPLE)
target_compile_options(cl PRIVATE -fstack-clash-protection)
# OpenBSD compilers will accept the flag, but then warn about it doing nothing
if(NOT CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
target_compile_options(cl PRIVATE -fstack-clash-protection)
endif()
endif()
endif()
if(HAVE_WRAPV)
......@@ -399,4 +497,4 @@ target_include_directories(cl PUBLIC $<TARGET_FILE_DIR:cl>)
target_link_libraries(cl ${CMAKE_THREAD_LIBS_INIT})
# Copy header into build directory...
add_custom_command(TARGET cl POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/cryptlib.h $<TARGET_FILE_DIR:cl>)
add_custom_command(TARGET cl POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/cryptlib.h $<TARGET_FILE_DIR:cl>)
......@@ -2,100 +2,81 @@ cmake_minimum_required(VERSION 3.11)
project (Cryptlib C)
include(ExternalProject)
find_program(PATCH_BIN patch REQUIRED)
find_program(PERL_BIN perl REQUIRED)
include(FetchContent)
set(PATCHES
cl-fix-test-select.patch
cl-terminal-params.patch
cl-ranlib.patch
cl-vcxproj.patch
cl-endian.patch
cl-win32-noasm.patch
cl-zz-country.patch
cl-algorithms.patch
cl-allow-duplicate-ext.patch
cl-macosx-minver.patch
cl-posix-me-gently.patch
cl-PAM-noprompts.patch
cl-zlib.patch
cl-Dynamic-linked-static-lib.patch
cl-SSL-fix.patch
cl-bigger-maxattribute.patch
cl-mingw-vcver.patch
cl-win32-build-fix.patch
cl-no-odbc.patch
cl-noasm-defines.patch
cl-bn-noasm64-fix.patch
cl-prefer-ECC.patch
cl-prefer-ECC-harder.patch
cl-clear-GCM-flag.patch
cl-use-ssh-ctr.patch
cl-ssh-list-ctr-modes.patch
cl-ssl-suite-blocksizes.patch
cl-no-tpm.patch
cl-no-via-aes.patch
cl-fix-ssh-ecc-ephemeral.patch
cl-just-use-cc.patch
cl-no-safe-stack.patch
cl-allow-pkcs12.patch
cl-openbsd-threads.patch
cl-allow-none-auth.patch
cl-poll-not-select.patch
cl-good-sockets.patch
cl-moar-objects.patch
cl-remove-march.patch
cl-server-term-support.patch
cl-add-pubkey-attribute.patch
cl-allow-ssh-auth-retries.patch
cl-fix-ssh-channel-close.patch
cl-vt-lt-2005-always-defined.patch
cl-no-pie.patch
cl-win32-lean-and-mean.patch
cl-thats-not-asm.patch
cl-make-channels-work.patch
cl-allow-ssh-2.0-go.patch
cl-read-timeout-every-time.patch
cl-pass-after-pubkey.patch
cl-allow-servercheck-pubkeys.patch
cl-double-delete-fine-on-close.patch
cl-handle-unsupported-pubkey.patch
cl-add-patches-info.patch
cl-netbsd-hmac-symbol.patch
cl-netbsd-no-getfsstat.patch
cl-fix-shell-exec-types.patch
cl-ssh-eof-half-close.patch
cl-fix-mb-w-conv-warnings.patch
cl-fix-ssh-header-read.patch
cl-ssh-service-type-for-channel.patch
cl-ssh-sbbs-id-string.patch
cl-channel-select-both.patch
cl-allow-none-auth-svr.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-fix-test-select.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-terminal-params.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-ranlib.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-vcxproj.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-endian.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-win32-noasm.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-zz-country.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-algorithms.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-allow-duplicate-ext.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-macosx-minver.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-posix-me-gently.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-PAM-noprompts.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-zlib.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-Dynamic-linked-static-lib.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-SSL-fix.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-bigger-maxattribute.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-mingw-vcver.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-win32-build-fix.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-no-odbc.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-noasm-defines.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-bn-noasm64-fix.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-prefer-ECC.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-prefer-ECC-harder.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-clear-GCM-flag.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-use-ssh-ctr.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-ssh-list-ctr-modes.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-ssl-suite-blocksizes.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-no-tpm.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-no-via-aes.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-fix-ssh-ecc-ephemeral.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-just-use-cc.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-no-safe-stack.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-allow-pkcs12.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-openbsd-threads.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-allow-none-auth.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-poll-not-select.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-good-sockets.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-moar-objects.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-remove-march.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-server-term-support.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-add-pubkey-attribute.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-allow-ssh-auth-retries.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-fix-ssh-channel-close.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-vt-lt-2005-always-defined.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-no-pie.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-win32-lean-and-mean.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-thats-not-asm.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-make-channels-work.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-allow-ssh-2.0-go.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-read-timeout-every-time.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-pass-after-pubkey.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-allow-servercheck-pubkeys.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-double-delete-fine-on-close.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-handle-unsupported-pubkey.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-add-patches-info.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-netbsd-hmac-symbol.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-netbsd-no-getfsstat.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-fix-shell-exec-types.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-ssh-eof-half-close.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-fix-mb-w-conv-warnings.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-fix-ssh-header-read.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-ssh-service-type-for-channel.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-ssh-sbbs-id-string.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-channel-select-both.patch
${CMAKE_CURRENT_SOURCE_DIR}/cl-allow-none-auth-svr.patch
)
add_custom_target(cl-dir ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/sources)
# Note that remove has been replaced by rm as of 3.17
add_custom_target(cl ALL
${CMAKE_COMMAND} -E tar xzf ${CMAKE_CURRENT_SOURCE_DIR}/../dist/cryptlib.zip
COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/sources/makefile
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../dist/cryptlib.zip
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/sources)
add_custom_command(TARGET cl POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists-cl.txt ${CMAKE_CURRENT_BINARY_DIR}/sources/CMakeLists.txt)
add_dependencies(cl cl-dir)
foreach(PATCH IN LISTS PATCHES)
add_custom_command(TARGET cl POST_BUILD
COMMAND ${PATCH_BIN} -l -b -p0 -d ${CMAKE_CURRENT_BINARY_DIR}/sources -i ${CMAKE_CURRENT_SOURCE_DIR}/${PATCH}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PATCH})
endforeach()
add_custom_command(TARGET cl POST_BUILD
COMMAND ${PERL_BIN} -i.bak ${CMAKE_CURRENT_SOURCE_DIR}/hashpatch.pl ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/sources/cryptlib.h)
add_custom_command(TARGET cl POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists-cl.txt ${CMAKE_CURRENT_BINARY_DIR}/sources/CMakeLists.txt)
ExternalProject_Add(CryptLib
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/sources
FetchContent_Declare(CryptLib
DOWNLOAD_COMMAND ""
PATCH_COMMAND ""
INSTALL_COMMAND ""
DEPENDS cl)
PATCH_COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_CURRENT_SOURCE_DIR}/../dist/cryptlib.zip
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists-cl.txt CMakeLists.txt
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PATCHES} .
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/hashpatch.pl .
COMMAND ${CMAKE_COMMAND} -E rename makefile makefile.old)
FetchContent_MakeAvailable(CryptLib)
my $path = shift;
print "Path = $path\n";
while(<>) {
s/^(#define CRYPTLIB_VERSION.*)$/"$1\n#define CRYPTLIB_PATCHES \"" . (chomp($val = `cat $path\/cl-*.patch | if (which md5sum > \/dev\/null 2>&1); then md5sum; else md5; fi`), $val) . "\""/e;
} continue {
......
......@@ -45,38 +45,7 @@ set(SOURCE
../sbbs3/xmodem.c
)
if(WIN32)
set(3RDP_CRYPTLIB_LIB ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdp/win32.release/cryptlib/bin/cl32.lib)
else()
find_program(3RDP_GNU_MAKE
NAMES gmake make
)
if(${3RDP_GNU_MAKE} STREQUAL "3RDP_GNU_MAKE-NOTFOUND")
set(WITHOUT_CRYPTLIB ON CACHE BOOL "Disable cryptlib (ssh and telnet over TLS" FORCE)
message(WARNING "GNU Make not found, cannot build cryptlib")
else()
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(BUILD_TYPE_FLAG DEBUG=1)
else()
set(BUILD_TYPE_FLAG RELEASE=1)
endif()
execute_process(
COMMAND ${3RDP_GNU_MAKE} -C ${CMAKE_CURRENT_SOURCE_DIR}/../build --no-print-directory DONT_CLOBBER_CC=please ${BUILD_TYPE_FLAG}
OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/paths.txt
ERROR_FILE ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/paths.err
)
file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/paths.txt PATHS)
list(GET PATHS 0 LEGACY_LIBDIR)
list(GET PATHS 1 LEGACY_OBJDIR)
list(GET PATHS 2 LEGACY_MTOBJBDIR)
list(GET PATHS 3 LEGACY_EXEDIR)
list(GET PATHS 4 LEGACY_3RDPDIR)
add_custom_target(cryptlib
${3RDP_GNU_MAKE} cryptlib DONT_CLOBBER_CC=please ${BUILD_TYPE_FLAG}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdp/build
)
endif()
endif()
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../3rdp/build ${CMAKE_CURRENT_SOURCE_DIR}/cryptlib EXCLUDE_FROM_ALL)
if(NOT WITHOUT_OOII)
list(APPEND SOURCE ooii.c ooii_bmenus.c ooii_cmenus.c ooii_logons.c ooii_sounds.c)
......@@ -89,9 +58,6 @@ endif()
if(NOT WITHOUT_CRYPTLIB)
list(APPEND SOURCE ssh.c telnets.c)
if(WIN32)
find_library(3RDP_CRYPTLIB_LIB cl32 PATHS ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/win32.release/cryptlib/bin NO_DEFAULT_PATH)
endif()
endif()
add_executable(syncterm MACOSX_BUNDLE ${SOURCE})
......@@ -110,15 +76,7 @@ endif()
if(WITHOUT_CRYPTLIB)
target_compile_definitions(syncterm PRIVATE WITHOUT_CRYPTLIB)
else()
if(WIN32)
target_include_directories(syncterm PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/win32.release/cryptlib/include)
target_link_libraries(syncterm ${3RDP_CRYPTLIB_LIB})
else()
add_dependencies(syncterm cryptlib)
target_include_directories(syncterm PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/${LEGACY_3RDPDIR}/cl)
target_link_directories(syncterm PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../../3rdp/${LEGACY_3RDPDIR}/cl)
target_link_libraries(syncterm cl)
endif()
target_link_libraries(syncterm cl)
endif()
target_include_directories(syncterm PRIVATE ../sbbs3)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment