From 6a61ed0482493a2667882b92f37c2486f793db4c Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 28 Sep 2016 22:45:23 +0200 Subject: [PATCH] [DEV] build for windows --- generate/Windows/opensslconf.h | 262 +++++++++++++++++++++++++++++++++ lutin_crypto.py | 118 ++++++--------- lutin_openssl.py | 3 - 3 files changed, 310 insertions(+), 73 deletions(-) create mode 100644 generate/Windows/opensslconf.h diff --git a/generate/Windows/opensslconf.h b/generate/Windows/opensslconf.h new file mode 100644 index 0000000..7950f34 --- /dev/null +++ b/generate/Windows/opensslconf.h @@ -0,0 +1,262 @@ +/* opensslconf.h */ +/* WARNING: Generated automatically from opensslconf.h.in by Configure. */ + +#ifdef __cplusplus +extern "C" { +#endif +/* OpenSSL was configured with the following options: */ +#ifndef OPENSSL_SYSNAME_MINGW64 +# define OPENSSL_SYSNAME_MINGW64 +#endif +#ifndef OPENSSL_DOING_MAKEDEPEND + + +#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +#endif +#ifndef OPENSSL_NO_GMP +# define OPENSSL_NO_GMP +#endif +#ifndef OPENSSL_NO_JPAKE +# define OPENSSL_NO_JPAKE +#endif +#ifndef OPENSSL_NO_KRB5 +# define OPENSSL_NO_KRB5 +#endif +#ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +#endif +#ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +#endif +#ifndef OPENSSL_NO_RFC3779 +# define OPENSSL_NO_RFC3779 +#endif +#ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +#endif +#ifndef OPENSSL_NO_SSL2 +# define OPENSSL_NO_SSL2 +#endif +#ifndef OPENSSL_NO_STORE +# define OPENSSL_NO_STORE +#endif +#ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +#endif +#ifndef OPENSSL_NO_WEAK_SSL_CIPHERS +# define OPENSSL_NO_WEAK_SSL_CIPHERS +#endif + +#endif /* OPENSSL_DOING_MAKEDEPEND */ + +#ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +#endif +#ifndef OPENSSL_NO_STATIC_ENGINE +# define OPENSSL_NO_STATIC_ENGINE +#endif + +/* The OPENSSL_NO_* macros are also defined as NO_* if the application + asks for it. This is a transient feature that is provided for those + who haven't had the time to do the appropriate changes in their + applications. */ +#ifdef OPENSSL_ALGORITHM_DEFINES +# if defined(OPENSSL_NO_EC_NISTP_64_GCC_128) && !defined(NO_EC_NISTP_64_GCC_128) +# define NO_EC_NISTP_64_GCC_128 +# endif +# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP) +# define NO_GMP +# endif +# if defined(OPENSSL_NO_JPAKE) && !defined(NO_JPAKE) +# define NO_JPAKE +# endif +# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5) +# define NO_KRB5 +# endif +# if defined(OPENSSL_NO_MD2) && !defined(NO_MD2) +# define NO_MD2 +# endif +# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5) +# define NO_RC5 +# endif +# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779) +# define NO_RFC3779 +# endif +# if defined(OPENSSL_NO_SCTP) && !defined(NO_SCTP) +# define NO_SCTP +# endif +# if defined(OPENSSL_NO_SSL2) && !defined(NO_SSL2) +# define NO_SSL2 +# endif +# if defined(OPENSSL_NO_STORE) && !defined(NO_STORE) +# define NO_STORE +# endif +# if defined(OPENSSL_NO_UNIT_TEST) && !defined(NO_UNIT_TEST) +# define NO_UNIT_TEST +# endif +# if defined(OPENSSL_NO_WEAK_SSL_CIPHERS) && !defined(NO_WEAK_SSL_CIPHERS) +# define NO_WEAK_SSL_CIPHERS +# endif +#endif + +//#define OPENSSL_CPUID_OBJ + +/* crypto/opensslconf.h.in */ + +/* Generate 80386 code? */ +#undef I386_ONLY + +#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ +#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#define ENGINESDIR "/opt/mingw6/lib/engines" +#define OPENSSLDIR "/opt/mingw6/ssl" +#endif +#endif + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD + +#undef OPENSSL_EXPORT_VAR_AS_FUNCTION +#define OPENSSL_EXPORT_VAR_AS_FUNCTION + +#if defined(HEADER_IDEA_H) && !defined(IDEA_INT) +#define IDEA_INT unsigned int +#endif + +#if defined(HEADER_MD2_H) && !defined(MD2_INT) +#define MD2_INT unsigned int +#endif + +#if defined(HEADER_RC2_H) && !defined(RC2_INT) +/* I need to put in a mod for the alpha - eay */ +#define RC2_INT unsigned int +#endif + +#if defined(HEADER_RC4_H) +#if !defined(RC4_INT) +/* using int types make the structure larger but make the code faster + * on most boxes I have tested - up to %20 faster. */ +/* + * I don't know what does "most" mean, but declaring "int" is a must on: + * - Intel P6 because partial register stalls are very expensive; + * - elder Alpha because it lacks byte load/store instructions; + */ +#define RC4_INT unsigned int +#endif +#if !defined(RC4_CHUNK) +/* + * This enables code handling data aligned at natural CPU word + * boundary. See crypto/rc4/rc4_enc.c for further details. + */ +#define RC4_CHUNK unsigned long long +#endif +#endif + +#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG) +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#define DES_LONG unsigned int +#endif +#endif + +#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) +#define CONFIG_HEADER_BN_H +#undef BN_LLONG + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +#undef SIXTY_FOUR_BIT_LONG +#define SIXTY_FOUR_BIT +#undef THIRTY_TWO_BIT +#endif + +#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H) +#define CONFIG_HEADER_RC4_LOCL_H +/* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +#undef RC4_INDEX +#endif + +#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +#define CONFIG_HEADER_BF_LOCL_H +#undef BF_PTR +#endif /* HEADER_BF_LOCL_H */ + +#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H) +#define CONFIG_HEADER_DES_LOCL_H +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +#error YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#undef DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the + CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find + even newer MIPS CPU's, but at the moment one size fits all for + optimization options. Older Sparc's work better with only UNROLL, but + there's no way to tell at compile time what it is you're running on */ + +#if defined( __sun ) || defined ( sun ) /* Newer Sparc's */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#elif defined( __ultrix ) /* Older MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined( __osf1__ ) /* Alpha */ +# define DES_PTR +# define DES_RISC2 +#elif defined ( _AIX ) /* RS6000 */ + /* Unknown */ +#elif defined( __hpux ) /* HP-PA */ + /* Unknown */ +#elif defined( __aux ) /* 68K */ + /* Unknown */ +#elif defined( __dgux ) /* 88K (but P6 in latest boxes) */ +# define DES_UNROLL +#elif defined( __sgi ) /* Newer MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined(i386) || defined(__i386__) /* x86 boxes, should be gcc */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ +#endif /* HEADER_DES_LOCL_H */ +#ifdef __cplusplus +} +#endif diff --git a/lutin_crypto.py b/lutin_crypto.py index 7f2df8e..0a58b49 100644 --- a/lutin_crypto.py +++ b/lutin_crypto.py @@ -3,6 +3,7 @@ import lutin.module as module import lutin.tools as tools import os +#Windows build : CROSS_COMPILE="x86_64-w64-mingw32-" ./Configure mingw64 no-asm shared --prefix=/opt/mingw6 def get_type(): return "LIBRARY" @@ -25,49 +26,6 @@ def get_maintainer(): def get_version(): return [1,0,2] -""" -basic: -/usr/bin/perl ../util/mkbuildinf.pl "gcc -Iopenssl/crypto -Iopenssl -Iopenssl/include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM" "linux-x86_64" >buildinf.h --Iopenssl/crypto -Iopenssl -Iopenssl/include --DOPENSSL_THREADS --D_REENTRANT --DDSO_DLFCN --DHAVE_DLFCN_H --Wa,--noexecstack --m64 --DL_ENDIAN --DOPENSSL_IA32_SSE2 --DOPENSSL_BN_ASM_MONT --DOPENSSL_BN_ASM_MONT5 --DOPENSSL_BN_ASM_GF2m --DSHA1_ASM --DSHA256_ASM --DSHA512_ASM --DMD5_ASM --DAES_ASM --DVPAES_ASM --DBSAES_ASM --DWHIRLPOOL_ASM --DGHASH_ASM -""" - -""" -with no ASM : --DOPENSSL_NO_DEPRECATED --DOPENSSL_NO_EC_NISTP_64_GCC_128 --DOPENSSL_NO_GMP --DOPENSSL_NO_JPAKE --DOPENSSL_NO_MD2 --DOPENSSL_NO_RC5 --DOPENSSL_NO_RFC3779 --DOPENSSL_NO_SCTP --DOPENSSL_NO_SSL2 --DOPENSSL_NO_STORE --DOPENSSL_NO_UNIT_TEST --DOPENSSL_NO_WEAK_SSL_CIPHERS - -""" - def create(target, module_name): my_module = module.Module(__file__, module_name, get_type()) """ @@ -779,19 +737,20 @@ def create(target, module_name): 'openssl/crypto/cmac/cm_pmeth.c', ]) #line(---)= gcc -I../include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -c -o - my_module.add_src_file([ - 'openssl/engines/e_4758cca.c', - 'openssl/engines/e_aep.c', - 'openssl/engines/e_atalla.c', - 'openssl/engines/e_cswift.c', - 'openssl/engines/e_gmp.c', - 'openssl/engines/e_chil.c', - 'openssl/engines/e_nuron.c', - 'openssl/engines/e_sureware.c', - 'openssl/engines/e_ubsec.c', - 'openssl/engines/e_padlock.c', - 'openssl/engines/e_capi.c', - ]) + if "Windows" not in target.get_type(): + my_module.add_src_file([ + 'openssl/engines/e_4758cca.c', + 'openssl/engines/e_aep.c', + 'openssl/engines/e_atalla.c', + 'openssl/engines/e_cswift.c', + 'openssl/engines/e_gmp.c', + 'openssl/engines/e_chil.c', + 'openssl/engines/e_nuron.c', + 'openssl/engines/e_sureware.c', + 'openssl/engines/e_ubsec.c', + 'openssl/engines/e_padlock.c', + 'openssl/engines/e_capi.c', + ]) #line(---) = gcc -I../../include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -c -o my_module.add_src_file([ 'openssl/engines/ccgost/e_gost_err.c', @@ -813,19 +772,40 @@ def create(target, module_name): ]) my_module.add_flag('c', [ '-DOPENSSL_THREADS', - '-D_REENTRANT', - '-DDSO_DLFCN', - '-DHAVE_DLFCN_H', - '-Wa,--noexecstack', '-DL_ENDIAN', - ]) + '-D_REENTRANT', + ], + export=True) + + if "Windows" not in target.get_type(): + my_module.add_flag('c', [ + '-Wa,--noexecstack', + '-DHAVE_DLFCN_H', + '-DDSO_DLFCN', + ]) + else: + my_module.add_flag('c', [ + "-D_WINDLL", + "-DOPENSSL_PIC", + "-D_MT", + "-DDSO_WIN32", + "-DWIN32_LEAN_AND_MEAN", + "-DUNICODE", + "-D_UNICODE" + ], + export=True) if "RPI3" in target.get_type(): my_module.add_flag('c', [ '-m64', ]) my_module.add_flag('c', [ '-DOPENSSL_NO_ASM', - ]) + ], + export=True) + if "Windows" in target.get_type(): + my_module.add_depend([ + "gdi" + ]) my_module.compile_version("c", 1989, gnu=True) my_module.add_depend('z') my_module.add_path(os.path.join(tools.get_current_path(__file__), "openssl")) @@ -914,15 +894,13 @@ def create(target, module_name): 'generate/buildinf.h', ], destination_path="openssl") - # TODO : Check it and do it better ... - my_module.add_flag('link', [ - '-ldl', - ], - export=True) my_module.add_depend([ 'c', - 'm', - 'rpc', - 'arpa', + 'm' ]) + if "Linux" in target.get_type(): + my_module.add_depend([ + 'rpc', + 'arpa', + ]) return my_module diff --git a/lutin_openssl.py b/lutin_openssl.py index 8888d38..2e2b96b 100644 --- a/lutin_openssl.py +++ b/lutin_openssl.py @@ -94,9 +94,6 @@ def create(target, module_name): ], destination_path="openssl") - my_module.add_flag('c', [ - '-DOPENSSL_NO_ASM', - ]) my_module.compile_version("c", 1989, gnu=True) my_module.add_depend('crypto') my_module.add_path(os.path.join(tools.get_current_path(__file__), "openssl"))