8b7b30a8b09b35030ea9c78cce8c7e696135c697
[iotivity.git] / extlibs / mbedtls / SConscript
1 #******************************************************************
2 #
3 # Copyright 2016 Samsung Electronics All Rights Reserved.
4 #
5 #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #      http://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19 #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 Import('env')
22 import SCons.Errors
23 import SCons.Util
24 import os
25 import sys
26 import re
27 import subprocess
28 from shutil import copyfile
29
30 target_os = env.get('TARGET_OS')
31 root_dir = env.get('SRC_DIR')
32 mbedtls_dir = os.path.join(root_dir, 'extlibs', 'mbedtls', 'mbedtls')
33 start_dir = os.getcwd()
34 mbedtls_config_file = 'config-iotivity.h' if target_os != 'windows' else 'config-iotivity_windows.h'
35
36 # The mbedtls_revision tag here must match the one in extlibs/mbedtls/prep.sh.
37 mbedtls_revision = 'mbedtls-2.4.2'
38 if not os.path.exists(mbedtls_dir):
39     msg = '''
40 *********************************** Error: ************************************
41 * The iotivity repository does not include cryptgraphic software,
42 * but requires it to be added by the developer.
43 * Please download mbedtls using the following command:
44 * $ git clone https://github.com/ARMmbed/mbedtls.git extlibs/mbedtls/mbedtls -b %s
45 *******************************************************************************
46 ''' % mbedtls_revision
47     Exit(msg)
48
49 os.chdir(mbedtls_dir)
50
51 # Right now this script assumes the revision is a tag, and not a branch or
52 # an arbitrary commit. If this changes, update the check below, or else
53 # the script will always conclude the repo is not up to date because a tag
54 # with that name doesn't exist.
55 # Tizen uses its own process to prepare the mbedTLS repo in gbsbuild.sh.
56 if os.path.exists('.git/HEAD'):
57     out = subprocess.check_output('git tag -l ' + mbedtls_revision, shell=True).rstrip()
58     if mbedtls_revision not in SCons.Util.to_String(out):
59         msg = '''
60 *********************************** Error: ************************************
61 * Your mbedTLS repo is not up to date with the version required by iotivity.
62 * Please update with the following commands:
63 *     $ cd extlibs/mbedtls/mbedtls
64 *     $ git fetch
65 *******************************************************************************
66 '''
67         Exit(msg)
68
69 found = False
70
71 # Check for the desired version of mbedTLS, first.
72 pattern = '#define MBEDTLS_VERSION_NUMBER         0x02040200'
73 mbedtls_header = os.path.join('include', 'mbedtls', 'version.h')
74 with open(mbedtls_header, 'r') as stream:
75     for line in stream:
76         if pattern in line:
77             found = True
78             break
79
80 # If we're on the right version, check for the patch being applied.
81 if found:
82     found = False
83     pattern = '#if defined(MBEDTLS_HAVE_WINSOCK2)'
84     mbedtls_header = os.path.join('include', 'mbedtls', 'net_sockets.h')
85     with open(mbedtls_header, 'r') as stream:
86         for line in stream:
87             if pattern in line:
88                 found = True
89                 break
90
91 # If either is not the case, reset and apply the patch.
92 if not found:
93     if os.path.exists('.git/HEAD'):
94         # Apply ocf patch on git revision
95         print("Syncing/patching mbedtls external project...")
96         cmd = 'git checkout -f development && git reset --hard ' + mbedtls_revision + ' && git clean -f && git apply --whitespace=fix ../ocf.patch'
97     else:
98         # Fallback to regular patch command
99         cmd = 'patch -p1 -l -f < ../ocf.patch'
100
101     try:
102         retcode = subprocess.call(cmd, shell=True)
103         if retcode:
104             Exit("mbedtls: sync failed: " + str(retcode))
105     except OSError as e:
106         Exit("mbedtls: execution failed: " + e)
107
108 os.chdir(start_dir)
109
110 # Copy IoTivity's version of the mbedtls build configuration file
111 # from extlibs/mbedtls/iotivity-config.h
112 # to extlibs/mbedtls/mbedtls/include/mbedtls/config.h
113 iotivity_config = os.path.join(root_dir, 'extlibs', 'mbedtls', mbedtls_config_file)
114 mbedtls_config = os.path.join(root_dir, 'extlibs', 'mbedtls', 'mbedtls',
115                               'include', 'mbedtls', 'config.h')
116
117 try:
118     copyfile(iotivity_config, mbedtls_config)
119 except:
120     msg = 'mbedtls SConscript: cannot copy ' + iotivity_config + ' to ' + mbedtls_config
121     msg += 'error: ' + str(sys.exc_info()[0])
122     Exit(msg)
123 else:
124     print('Copied IoTivity version of config.h to ' + mbedtls_config)
125
126 mbedtls_env = env.Clone()
127
128 mbedtls_env.AppendUnique(CPPPATH=[
129     mbedtls_dir,
130     os.path.join(mbedtls_dir, 'include'),
131     os.path.join(mbedtls_dir, 'include', 'mbedtls')
132 ])
133 if 'g++' in mbedtls_env.get('CXX'):
134     mbedtls_env.AppendUnique(CFLAGS=['-Wall'])
135
136     if mbedtls_env['CC'] != 'cl':
137         mbedtls_env.AppendUnique(CFLAGS=['-fPIC'])
138
139 ######################################################################
140 # Source files and Target(s)
141 ######################################################################
142 mbedtls_src = [
143     'mbedtls/library/debug.c',
144     'mbedtls/library/net_sockets.c',
145     'mbedtls/library/ssl_cache.c',
146     'mbedtls/library/ssl_ciphersuites.c',
147     'mbedtls/library/ssl_cli.c',
148     'mbedtls/library/ssl_cookie.c',
149     'mbedtls/library/ssl_srv.c',
150     'mbedtls/library/ssl_ticket.c',
151     'mbedtls/library/ssl_tls.c'
152 ]
153
154 mbedcrypto_src = [
155     'mbedtls/library/aes.c',
156     'mbedtls/library/aesni.c',
157     'mbedtls/library/arc4.c',
158     'mbedtls/library/asn1parse.c',
159     'mbedtls/library/asn1write.c',
160     'mbedtls/library/base64.c',
161     'mbedtls/library/bignum.c',
162     'mbedtls/library/blowfish.c',
163     'mbedtls/library/camellia.c',
164     'mbedtls/library/ccm.c',
165     'mbedtls/library/cipher.c',
166     'mbedtls/library/cipher_wrap.c',
167     'mbedtls/library/ctr_drbg.c',
168     'mbedtls/library/des.c',
169     'mbedtls/library/dhm.c',
170     'mbedtls/library/ecdh.c',
171     'mbedtls/library/ecdsa.c',
172     'mbedtls/library/ecjpake.c',
173     'mbedtls/library/ecp.c',
174     'mbedtls/library/ecp_curves.c',
175     'mbedtls/library/entropy.c',
176     'mbedtls/library/entropy_poll.c',
177     'mbedtls/library/error.c',
178     'mbedtls/library/gcm.c',
179     'mbedtls/library/havege.c',
180     'mbedtls/library/hmac_drbg.c',
181     'mbedtls/library/md.c',
182     'mbedtls/library/md2.c',
183     'mbedtls/library/md4.c',
184     'mbedtls/library/md5.c',
185     'mbedtls/library/md_wrap.c',
186     'mbedtls/library/memory_buffer_alloc.c',
187     'mbedtls/library/oid.c',
188     'mbedtls/library/padlock.c',
189     'mbedtls/library/pem.c',
190     'mbedtls/library/pk.c',
191     'mbedtls/library/pk_wrap.c',
192     'mbedtls/library/pkcs12.c',
193     'mbedtls/library/pkcs5.c',
194     'mbedtls/library/pkparse.c',
195     'mbedtls/library/pkwrite.c',
196     'mbedtls/library/platform.c',
197     'mbedtls/library/ripemd160.c',
198     'mbedtls/library/rsa.c',
199     'mbedtls/library/sha1.c',
200     'mbedtls/library/sha256.c',
201     'mbedtls/library/sha512.c',
202     'mbedtls/library/threading.c',
203     'mbedtls/library/timing.c',
204     'mbedtls/library/version.c',
205     'mbedtls/library/version_features.c',
206     'mbedtls/library/xtea.c'
207 ]
208
209 mbeX509_src = [
210     'mbedtls/library/certs.c',
211     'mbedtls/library/pkcs11.c',
212     'mbedtls/library/x509.c',
213     'mbedtls/library/x509_create.c',
214     'mbedtls/library/x509_crl.c',
215     'mbedtls/library/x509_crt.c',
216     'mbedtls/library/x509_csr.c',
217     'mbedtls/library/x509write_crt.c',
218     'mbedtls/library/x509write_csr.c'
219 ]
220
221 mbedcrypto_env = mbedtls_env.Clone()
222 static_libmbedcrypto = mbedcrypto_env.StaticLibrary('mbedcrypto', mbedcrypto_src)
223 mbedcrypto_env.InstallTarget(static_libmbedcrypto, 'mbedcrypto')
224 mbedcrypto_env.UserInstallTargetLib(static_libmbedcrypto, 'mbedcrypto')
225
226 mbex509_env = mbedtls_env.Clone()
227 mbex509_env.AppendUnique(LIBS=['mbedcrypto'])
228 static_libmbedx509 = mbex509_env.StaticLibrary('mbedx509', mbeX509_src)
229 mbex509_env.InstallTarget(static_libmbedx509, 'mbedx509')
230 mbex509_env.UserInstallTargetLib(static_libmbedx509, 'mbedx509')
231
232 mbedtls_env.AppendUnique(LIBS=['mbedx509', 'mbedcrypto'])
233 static_libmbedtls = mbedtls_env.StaticLibrary('mbedtls', mbedtls_src)
234 mbedtls_env.InstallTarget(static_libmbedtls, 'mbedtls')
235 mbedtls_env.UserInstallTargetLib(static_libmbedtls, 'mbedtls')