blob: f1e4d982218d27eebbb5b0c22cb2c4eac08d0705 [file] [log] [blame]
Adam Langleycfd80a92019-11-08 14:40:08 -08001# coding=utf8
2
Adam Langley9e1a6602015-05-05 17:47:53 -07003# Copyright (c) 2015, Google Inc.
4#
5# Permission to use, copy, modify, and/or distribute this software for any
6# purpose with or without fee is hereby granted, provided that the above
7# copyright notice and this permission notice appear in all copies.
8#
9# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
12# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
14# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
15# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
Matt Braithwaite16695892016-06-09 09:34:11 -070017"""Enumerates source files for consumption by various build systems."""
Adam Langley9e1a6602015-05-05 17:47:53 -070018
Matt Braithwaite16695892016-06-09 09:34:11 -070019import optparse
Adam Langley9e1a6602015-05-05 17:47:53 -070020import os
21import subprocess
22import sys
Adam Langley9c164b22015-06-10 18:54:47 -070023import json
Adam Langley9e1a6602015-05-05 17:47:53 -070024
25
26# OS_ARCH_COMBOS maps from OS and platform to the OpenSSL assembly "style" for
27# that platform and the extension used by asm files.
28OS_ARCH_COMBOS = [
David Benjamin351b2f82022-02-06 12:57:17 -050029 ('apple', 'arm', 'ios32', [], 'S'),
30 ('apple', 'aarch64', 'ios64', [], 'S'),
31 ('apple', 'x86', 'macosx', ['-fPIC', '-DOPENSSL_IA32_SSE2'], 'S'),
32 ('apple', 'x86_64', 'macosx', [], 'S'),
Adam Langley9e1a6602015-05-05 17:47:53 -070033 ('linux', 'arm', 'linux32', [], 'S'),
34 ('linux', 'aarch64', 'linux64', [], 'S'),
Adam Langley7c075b92017-05-22 15:31:13 -070035 ('linux', 'ppc64le', 'linux64le', [], 'S'),
Adam Langley9e1a6602015-05-05 17:47:53 -070036 ('linux', 'x86', 'elf', ['-fPIC', '-DOPENSSL_IA32_SSE2'], 'S'),
37 ('linux', 'x86_64', 'elf', [], 'S'),
Adam Langley9e1a6602015-05-05 17:47:53 -070038 ('win', 'x86', 'win32n', ['-DOPENSSL_IA32_SSE2'], 'asm'),
39 ('win', 'x86_64', 'nasm', [], 'asm'),
Anthony Robertsafd5dba2020-10-19 12:27:51 +010040 ('win', 'aarch64', 'win64', [], 'S'),
Adam Langley9e1a6602015-05-05 17:47:53 -070041]
42
43# NON_PERL_FILES enumerates assembly files that are not processed by the
44# perlasm system.
45NON_PERL_FILES = {
46 ('linux', 'arm'): [
Adam Langley7b8b9c12016-01-04 07:13:00 -080047 'src/crypto/curve25519/asm/x25519-asm-arm.S',
David Benjamin3c4a5cb2016-03-29 17:43:31 -040048 'src/crypto/poly1305/poly1305_arm_asm.S',
Adam Langley7b935932018-11-12 13:53:42 -080049 ],
50 ('linux', 'x86_64'): [
51 'src/crypto/hrss/asm/poly_rq_mul.S',
Adam Langley9e1a6602015-05-05 17:47:53 -070052 ],
53}
54
Matt Braithwaite16695892016-06-09 09:34:11 -070055PREFIX = None
Adam Langley990a3232018-05-22 10:02:59 -070056EMBED_TEST_DATA = True
Matt Braithwaite16695892016-06-09 09:34:11 -070057
58
59def PathOf(x):
60 return x if not PREFIX else os.path.join(PREFIX, x)
61
Adam Langley9e1a6602015-05-05 17:47:53 -070062
Adam Langley9e1a6602015-05-05 17:47:53 -070063class Android(object):
64
65 def __init__(self):
66 self.header = \
67"""# Copyright (C) 2015 The Android Open Source Project
68#
69# Licensed under the Apache License, Version 2.0 (the "License");
70# you may not use this file except in compliance with the License.
71# You may obtain a copy of the License at
72#
73# http://www.apache.org/licenses/LICENSE-2.0
74#
75# Unless required by applicable law or agreed to in writing, software
76# distributed under the License is distributed on an "AS IS" BASIS,
77# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78# See the License for the specific language governing permissions and
79# limitations under the License.
80
Dan Willemsenb57e4fc2016-07-21 11:08:44 -070081# This file is created by generate_build_files.py. Do not edit manually.
Adam Langley9e1a6602015-05-05 17:47:53 -070082"""
83
84 def PrintVariableSection(self, out, name, files):
85 out.write('%s := \\\n' % name)
86 for f in sorted(files):
87 out.write(' %s\\\n' % f)
88 out.write('\n')
89
90 def WriteFiles(self, files, asm_outputs):
Dan Willemsenb57e4fc2016-07-21 11:08:44 -070091 # New Android.bp format
92 with open('sources.bp', 'w+') as blueprint:
93 blueprint.write(self.header.replace('#', '//'))
94
Pete Bentley44544d92019-08-15 15:01:26 +010095 # Separate out BCM files to allow different compilation rules (specific to Android FIPS)
96 bcm_c_files = files['bcm_crypto']
97 non_bcm_c_files = [file for file in files['crypto'] if file not in bcm_c_files]
98 non_bcm_asm = self.FilterBcmAsm(asm_outputs, False)
99 bcm_asm = self.FilterBcmAsm(asm_outputs, True)
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700100
Pete Bentley44544d92019-08-15 15:01:26 +0100101 self.PrintDefaults(blueprint, 'libcrypto_sources', non_bcm_c_files, non_bcm_asm)
102 self.PrintDefaults(blueprint, 'libcrypto_bcm_sources', bcm_c_files, bcm_asm)
103 self.PrintDefaults(blueprint, 'libssl_sources', files['ssl'])
104 self.PrintDefaults(blueprint, 'bssl_sources', files['tool'])
105 self.PrintDefaults(blueprint, 'boringssl_test_support_sources', files['test_support'])
106 self.PrintDefaults(blueprint, 'boringssl_crypto_test_sources', files['crypto_test'])
107 self.PrintDefaults(blueprint, 'boringssl_ssl_test_sources', files['ssl_test'])
108
109 # Legacy Android.mk format, only used by Trusty in new branches
110 with open('sources.mk', 'w+') as makefile:
111 makefile.write(self.header)
112 makefile.write('\n')
113 self.PrintVariableSection(makefile, 'crypto_sources', files['crypto'])
114
115 for ((osname, arch), asm_files) in asm_outputs:
116 if osname != 'linux':
117 continue
118 self.PrintVariableSection(
119 makefile, '%s_%s_sources' % (osname, arch), asm_files)
120
121 def PrintDefaults(self, blueprint, name, files, asm_outputs={}):
122 """Print a cc_defaults section from a list of C files and optionally assembly outputs"""
123 blueprint.write('\n')
124 blueprint.write('cc_defaults {\n')
125 blueprint.write(' name: "%s",\n' % name)
126 blueprint.write(' srcs: [\n')
127 for f in sorted(files):
128 blueprint.write(' "%s",\n' % f)
129 blueprint.write(' ],\n')
130
131 if asm_outputs:
132 blueprint.write(' target: {\n')
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700133 for ((osname, arch), asm_files) in asm_outputs:
Steven Valdez93d242b2016-10-06 13:49:01 -0400134 if osname != 'linux' or arch == 'ppc64le':
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700135 continue
136 if arch == 'aarch64':
137 arch = 'arm64'
138
Dan Willemsen2eb4bc52017-10-16 14:37:00 -0700139 blueprint.write(' linux_%s: {\n' % arch)
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700140 blueprint.write(' srcs: [\n')
141 for f in sorted(asm_files):
142 blueprint.write(' "%s",\n' % f)
143 blueprint.write(' ],\n')
144 blueprint.write(' },\n')
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700145 blueprint.write(' },\n')
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700146
Pete Bentley44544d92019-08-15 15:01:26 +0100147 blueprint.write('}\n')
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700148
Pete Bentley44544d92019-08-15 15:01:26 +0100149 def FilterBcmAsm(self, asm, want_bcm):
150 """Filter a list of assembly outputs based on whether they belong in BCM
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700151
Pete Bentley44544d92019-08-15 15:01:26 +0100152 Args:
153 asm: Assembly file lists to filter
154 want_bcm: If true then include BCM files, otherwise do not
Dan Willemsenb57e4fc2016-07-21 11:08:44 -0700155
Pete Bentley44544d92019-08-15 15:01:26 +0100156 Returns:
157 A copy of |asm| with files filtered according to |want_bcm|
158 """
159 return [(archinfo, filter(lambda p: ("/crypto/fipsmodule/" in p) == want_bcm, files))
160 for (archinfo, files) in asm]
Adam Langley9e1a6602015-05-05 17:47:53 -0700161
162
David Benjamineca48e52019-08-13 11:51:53 -0400163class AndroidCMake(object):
164
165 def __init__(self):
166 self.header = \
167"""# Copyright (C) 2019 The Android Open Source Project
168#
169# Licensed under the Apache License, Version 2.0 (the "License");
170# you may not use this file except in compliance with the License.
171# You may obtain a copy of the License at
172#
173# http://www.apache.org/licenses/LICENSE-2.0
174#
175# Unless required by applicable law or agreed to in writing, software
176# distributed under the License is distributed on an "AS IS" BASIS,
177# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
178# See the License for the specific language governing permissions and
179# limitations under the License.
180
181# This file is created by generate_build_files.py. Do not edit manually.
182# To specify a custom path prefix, set BORINGSSL_ROOT before including this
183# file, or use list(TRANSFORM ... PREPEND) from CMake 3.12.
184
185"""
186
187 def PrintVariableSection(self, out, name, files):
188 out.write('set(%s\n' % name)
189 for f in sorted(files):
190 # Ideally adding the prefix would be the caller's job, but
191 # list(TRANSFORM ... PREPEND) is only available starting CMake 3.12. When
192 # sources.cmake is the source of truth, we can ask Android to either write
193 # a CMake function or update to 3.12.
194 out.write(' ${BORINGSSL_ROOT}%s\n' % f)
195 out.write(')\n')
196
197 def WriteFiles(self, files, asm_outputs):
198 # The Android emulator uses a custom CMake buildsystem.
199 #
200 # TODO(davidben): Move our various source lists into sources.cmake and have
201 # Android consume that directly.
202 with open('android-sources.cmake', 'w+') as out:
203 out.write(self.header)
204
205 self.PrintVariableSection(out, 'crypto_sources', files['crypto'])
206 self.PrintVariableSection(out, 'ssl_sources', files['ssl'])
207 self.PrintVariableSection(out, 'tool_sources', files['tool'])
208 self.PrintVariableSection(out, 'test_support_sources',
209 files['test_support'])
210 self.PrintVariableSection(out, 'crypto_test_sources',
211 files['crypto_test'])
212 self.PrintVariableSection(out, 'ssl_test_sources', files['ssl_test'])
213
214 for ((osname, arch), asm_files) in asm_outputs:
215 self.PrintVariableSection(
216 out, 'crypto_sources_%s_%s' % (osname, arch), asm_files)
217
218
Adam Langley049ef412015-06-09 18:20:57 -0700219class Bazel(object):
220 """Bazel outputs files suitable for including in Bazel files."""
221
222 def __init__(self):
223 self.firstSection = True
224 self.header = \
225"""# This file is created by generate_build_files.py. Do not edit manually.
226
227"""
228
229 def PrintVariableSection(self, out, name, files):
230 if not self.firstSection:
231 out.write('\n')
232 self.firstSection = False
233
234 out.write('%s = [\n' % name)
235 for f in sorted(files):
Matt Braithwaite16695892016-06-09 09:34:11 -0700236 out.write(' "%s",\n' % PathOf(f))
Adam Langley049ef412015-06-09 18:20:57 -0700237 out.write(']\n')
238
239 def WriteFiles(self, files, asm_outputs):
Chuck Haysc608d6b2015-10-06 17:54:16 -0700240 with open('BUILD.generated.bzl', 'w+') as out:
Adam Langley049ef412015-06-09 18:20:57 -0700241 out.write(self.header)
242
243 self.PrintVariableSection(out, 'ssl_headers', files['ssl_headers'])
Adam Langleyfd499932017-04-04 14:21:43 -0700244 self.PrintVariableSection(out, 'fips_fragments', files['fips_fragments'])
Adam Langley049ef412015-06-09 18:20:57 -0700245 self.PrintVariableSection(
246 out, 'ssl_internal_headers', files['ssl_internal_headers'])
247 self.PrintVariableSection(out, 'ssl_sources', files['ssl'])
248 self.PrintVariableSection(out, 'crypto_headers', files['crypto_headers'])
249 self.PrintVariableSection(
250 out, 'crypto_internal_headers', files['crypto_internal_headers'])
251 self.PrintVariableSection(out, 'crypto_sources', files['crypto'])
252 self.PrintVariableSection(out, 'tool_sources', files['tool'])
Adam Langleyf11f2332016-06-30 11:56:19 -0700253 self.PrintVariableSection(out, 'tool_headers', files['tool_headers'])
Adam Langley049ef412015-06-09 18:20:57 -0700254
255 for ((osname, arch), asm_files) in asm_outputs:
Adam Langley049ef412015-06-09 18:20:57 -0700256 self.PrintVariableSection(
Piotr Sikora3f5fe602015-10-28 12:24:35 -0700257 out, 'crypto_sources_%s_%s' % (osname, arch), asm_files)
Adam Langley049ef412015-06-09 18:20:57 -0700258
Chuck Haysc608d6b2015-10-06 17:54:16 -0700259 with open('BUILD.generated_tests.bzl', 'w+') as out:
Adam Langley9c164b22015-06-10 18:54:47 -0700260 out.write(self.header)
261
262 out.write('test_support_sources = [\n')
David Benjaminc5aa8412016-07-29 17:41:58 -0400263 for filename in sorted(files['test_support'] +
264 files['test_support_headers'] +
265 files['crypto_internal_headers'] +
266 files['ssl_internal_headers']):
Adam Langley9c164b22015-06-10 18:54:47 -0700267 if os.path.basename(filename) == 'malloc.cc':
268 continue
Matt Braithwaite16695892016-06-09 09:34:11 -0700269 out.write(' "%s",\n' % PathOf(filename))
Adam Langley9c164b22015-06-10 18:54:47 -0700270
Adam Langley7b6acc52017-07-27 16:33:27 -0700271 out.write(']\n')
Chuck Haysc608d6b2015-10-06 17:54:16 -0700272
David Benjamin96628432017-01-19 19:05:47 -0500273 self.PrintVariableSection(out, 'crypto_test_sources',
274 files['crypto_test'])
275 self.PrintVariableSection(out, 'ssl_test_sources', files['ssl_test'])
Adam Langley990a3232018-05-22 10:02:59 -0700276 self.PrintVariableSection(out, 'crypto_test_data',
277 files['crypto_test_data'])
Adam Langley3e502c82019-10-16 09:56:38 -0700278 self.PrintVariableSection(out, 'urandom_test_sources',
279 files['urandom_test'])
David Benjamin96628432017-01-19 19:05:47 -0500280
Adam Langley049ef412015-06-09 18:20:57 -0700281
Robert Sloane091af42017-10-09 12:47:17 -0700282class Eureka(object):
283
284 def __init__(self):
285 self.header = \
286"""# Copyright (C) 2017 The Android Open Source Project
287#
288# Licensed under the Apache License, Version 2.0 (the "License");
289# you may not use this file except in compliance with the License.
290# You may obtain a copy of the License at
291#
292# http://www.apache.org/licenses/LICENSE-2.0
293#
294# Unless required by applicable law or agreed to in writing, software
295# distributed under the License is distributed on an "AS IS" BASIS,
296# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
297# See the License for the specific language governing permissions and
298# limitations under the License.
299
300# This file is created by generate_build_files.py. Do not edit manually.
301
302"""
303
304 def PrintVariableSection(self, out, name, files):
305 out.write('%s := \\\n' % name)
306 for f in sorted(files):
307 out.write(' %s\\\n' % f)
308 out.write('\n')
309
310 def WriteFiles(self, files, asm_outputs):
311 # Legacy Android.mk format
312 with open('eureka.mk', 'w+') as makefile:
313 makefile.write(self.header)
314
315 self.PrintVariableSection(makefile, 'crypto_sources', files['crypto'])
316 self.PrintVariableSection(makefile, 'ssl_sources', files['ssl'])
317 self.PrintVariableSection(makefile, 'tool_sources', files['tool'])
318
319 for ((osname, arch), asm_files) in asm_outputs:
320 if osname != 'linux':
321 continue
322 self.PrintVariableSection(
323 makefile, '%s_%s_sources' % (osname, arch), asm_files)
324
325
David Benjamin38d01c62016-04-21 18:47:57 -0400326class GN(object):
327
328 def __init__(self):
329 self.firstSection = True
330 self.header = \
331"""# Copyright (c) 2016 The Chromium Authors. All rights reserved.
332# Use of this source code is governed by a BSD-style license that can be
333# found in the LICENSE file.
334
335# This file is created by generate_build_files.py. Do not edit manually.
336
337"""
338
339 def PrintVariableSection(self, out, name, files):
340 if not self.firstSection:
341 out.write('\n')
342 self.firstSection = False
343
344 out.write('%s = [\n' % name)
345 for f in sorted(files):
346 out.write(' "%s",\n' % f)
347 out.write(']\n')
348
349 def WriteFiles(self, files, asm_outputs):
350 with open('BUILD.generated.gni', 'w+') as out:
351 out.write(self.header)
352
David Benjaminc5aa8412016-07-29 17:41:58 -0400353 self.PrintVariableSection(out, 'crypto_sources',
James Robinson98dd68f2018-04-11 14:47:34 -0700354 files['crypto'] +
David Benjaminc5aa8412016-07-29 17:41:58 -0400355 files['crypto_internal_headers'])
James Robinson98dd68f2018-04-11 14:47:34 -0700356 self.PrintVariableSection(out, 'crypto_headers',
357 files['crypto_headers'])
David Benjaminc5aa8412016-07-29 17:41:58 -0400358 self.PrintVariableSection(out, 'ssl_sources',
James Robinson98dd68f2018-04-11 14:47:34 -0700359 files['ssl'] + files['ssl_internal_headers'])
360 self.PrintVariableSection(out, 'ssl_headers', files['ssl_headers'])
David Benjaminbb0cb952020-12-17 16:35:39 -0500361 self.PrintVariableSection(out, 'tool_sources',
362 files['tool'] + files['tool_headers'])
David Benjamin38d01c62016-04-21 18:47:57 -0400363
364 for ((osname, arch), asm_files) in asm_outputs:
365 self.PrintVariableSection(
366 out, 'crypto_sources_%s_%s' % (osname, arch), asm_files)
367
368 fuzzers = [os.path.splitext(os.path.basename(fuzzer))[0]
369 for fuzzer in files['fuzz']]
370 self.PrintVariableSection(out, 'fuzzers', fuzzers)
371
372 with open('BUILD.generated_tests.gni', 'w+') as out:
373 self.firstSection = True
374 out.write(self.header)
375
David Benjamin96628432017-01-19 19:05:47 -0500376 self.PrintVariableSection(out, 'test_support_sources',
David Benjaminc5aa8412016-07-29 17:41:58 -0400377 files['test_support'] +
378 files['test_support_headers'])
David Benjamin96628432017-01-19 19:05:47 -0500379 self.PrintVariableSection(out, 'crypto_test_sources',
380 files['crypto_test'])
David Benjaminf014d602019-05-07 18:58:06 -0500381 self.PrintVariableSection(out, 'crypto_test_data',
382 files['crypto_test_data'])
David Benjamin96628432017-01-19 19:05:47 -0500383 self.PrintVariableSection(out, 'ssl_test_sources', files['ssl_test'])
David Benjamin38d01c62016-04-21 18:47:57 -0400384
385
386class GYP(object):
387
388 def __init__(self):
389 self.header = \
390"""# Copyright (c) 2016 The Chromium Authors. All rights reserved.
391# Use of this source code is governed by a BSD-style license that can be
392# found in the LICENSE file.
393
394# This file is created by generate_build_files.py. Do not edit manually.
395
396"""
397
398 def PrintVariableSection(self, out, name, files):
399 out.write(' \'%s\': [\n' % name)
400 for f in sorted(files):
401 out.write(' \'%s\',\n' % f)
402 out.write(' ],\n')
403
404 def WriteFiles(self, files, asm_outputs):
405 with open('boringssl.gypi', 'w+') as gypi:
406 gypi.write(self.header + '{\n \'variables\': {\n')
407
David Benjaminc5aa8412016-07-29 17:41:58 -0400408 self.PrintVariableSection(gypi, 'boringssl_ssl_sources',
409 files['ssl'] + files['ssl_headers'] +
410 files['ssl_internal_headers'])
411 self.PrintVariableSection(gypi, 'boringssl_crypto_sources',
412 files['crypto'] + files['crypto_headers'] +
413 files['crypto_internal_headers'])
David Benjamin38d01c62016-04-21 18:47:57 -0400414
415 for ((osname, arch), asm_files) in asm_outputs:
416 self.PrintVariableSection(gypi, 'boringssl_%s_%s_sources' %
417 (osname, arch), asm_files)
418
419 gypi.write(' }\n}\n')
420
Adam Langleycfd80a92019-11-08 14:40:08 -0800421class CMake(object):
422
423 def __init__(self):
424 self.header = \
425R'''# Copyright (c) 2019 The Chromium Authors. All rights reserved.
426# Use of this source code is governed by a BSD-style license that can be
427# found in the LICENSE file.
428
429# This file is created by generate_build_files.py. Do not edit manually.
430
David Benjamind0b66c72021-03-22 17:30:02 -0400431cmake_minimum_required(VERSION 3.5)
Adam Langleycfd80a92019-11-08 14:40:08 -0800432
433project(BoringSSL LANGUAGES C CXX)
434
435if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
436 set(CLANG 1)
437endif()
438
439if(CMAKE_COMPILER_IS_GNUCXX OR CLANG)
440 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti")
441 if(APPLE)
442 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
443 endif()
444
David Benjamin49f03292021-03-22 17:35:06 -0400445 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fno-common -std=c11")
Adam Langleycfd80a92019-11-08 14:40:08 -0800446endif()
447
448# pthread_rwlock_t requires a feature flag.
449if(NOT WIN32)
450 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE=700")
451endif()
452
453if(WIN32)
454 add_definitions(-D_HAS_EXCEPTIONS=0)
455 add_definitions(-DWIN32_LEAN_AND_MEAN)
456 add_definitions(-DNOMINMAX)
457 # Allow use of fopen.
458 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
459 # VS 2017 and higher supports STL-only warning suppressions.
460 # A bug in CMake < 3.13.0 may cause the space in this value to
461 # cause issues when building with NASM. In that case, update CMake.
462 add_definitions("-D_STL_EXTRA_DISABLED_WARNINGS=4774 4987")
463endif()
464
465add_definitions(-DBORINGSSL_IMPLEMENTATION)
466
Adam Langley89730072020-01-17 08:18:07 -0800467# CMake's iOS support uses Apple's multiple-architecture toolchain. It takes an
468# architecture list from CMAKE_OSX_ARCHITECTURES, leaves CMAKE_SYSTEM_PROCESSOR
469# alone, and expects all architecture-specific logic to be conditioned within
470# the source files rather than the build. This does not work for our assembly
471# files, so we fix CMAKE_SYSTEM_PROCESSOR and only support single-architecture
472# builds.
473if(NOT OPENSSL_NO_ASM AND CMAKE_OSX_ARCHITECTURES)
474 list(LENGTH CMAKE_OSX_ARCHITECTURES NUM_ARCHES)
David Benjamin7e265972021-08-04 14:28:55 -0400475 if(NOT NUM_ARCHES EQUAL 1)
Adam Langley89730072020-01-17 08:18:07 -0800476 message(FATAL_ERROR "Universal binaries not supported.")
477 endif()
478 list(GET CMAKE_OSX_ARCHITECTURES 0 CMAKE_SYSTEM_PROCESSOR)
479endif()
480
Adam Langleycfd80a92019-11-08 14:40:08 -0800481if(OPENSSL_NO_ASM)
482 add_definitions(-DOPENSSL_NO_ASM)
483 set(ARCH "generic")
David Benjamin7e265972021-08-04 14:28:55 -0400484elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
Adam Langleycfd80a92019-11-08 14:40:08 -0800485 set(ARCH "x86_64")
David Benjamin7e265972021-08-04 14:28:55 -0400486elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64")
Adam Langleycfd80a92019-11-08 14:40:08 -0800487 set(ARCH "x86_64")
David Benjamin7e265972021-08-04 14:28:55 -0400488elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64")
Adam Langleycfd80a92019-11-08 14:40:08 -0800489 # cmake reports AMD64 on Windows, but we might be building for 32-bit.
David Benjamin884614c2020-06-16 10:59:58 -0400490 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
Adam Langleycfd80a92019-11-08 14:40:08 -0800491 set(ARCH "x86_64")
492 else()
493 set(ARCH "x86")
494 endif()
David Benjamin7e265972021-08-04 14:28:55 -0400495elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86")
Adam Langleycfd80a92019-11-08 14:40:08 -0800496 set(ARCH "x86")
David Benjamin7e265972021-08-04 14:28:55 -0400497elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "i386")
Adam Langleycfd80a92019-11-08 14:40:08 -0800498 set(ARCH "x86")
David Benjamin7e265972021-08-04 14:28:55 -0400499elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686")
Adam Langleycfd80a92019-11-08 14:40:08 -0800500 set(ARCH "x86")
David Benjamin7e265972021-08-04 14:28:55 -0400501elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
Adam Langleycfd80a92019-11-08 14:40:08 -0800502 set(ARCH "aarch64")
David Benjamin7e265972021-08-04 14:28:55 -0400503elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
Adam Langleycfd80a92019-11-08 14:40:08 -0800504 set(ARCH "aarch64")
505# Apple A12 Bionic chipset which is added in iPhone XS/XS Max/XR uses arm64e architecture.
David Benjamin7e265972021-08-04 14:28:55 -0400506elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64e")
Adam Langleycfd80a92019-11-08 14:40:08 -0800507 set(ARCH "aarch64")
David Benjamin7e265972021-08-04 14:28:55 -0400508elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm*")
Adam Langleycfd80a92019-11-08 14:40:08 -0800509 set(ARCH "arm")
David Benjamin7e265972021-08-04 14:28:55 -0400510elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "mips")
Adam Langleycfd80a92019-11-08 14:40:08 -0800511 # Just to avoid the “unknown processor” error.
512 set(ARCH "generic")
David Benjamin7e265972021-08-04 14:28:55 -0400513elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le")
Adam Langleycfd80a92019-11-08 14:40:08 -0800514 set(ARCH "ppc64le")
515else()
516 message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR})
517endif()
518
519if(NOT OPENSSL_NO_ASM)
520 if(UNIX)
521 enable_language(ASM)
522
523 # Clang's integerated assembler does not support debug symbols.
524 if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang")
525 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g")
526 endif()
527
528 # CMake does not add -isysroot and -arch flags to assembly.
529 if(APPLE)
530 if(CMAKE_OSX_SYSROOT)
531 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"")
532 endif()
533 foreach(arch ${CMAKE_OSX_ARCHITECTURES})
534 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}")
535 endforeach()
536 endif()
537 else()
538 set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -gcv8")
539 enable_language(ASM_NASM)
540 endif()
541endif()
542
Adam Langleya0cdbf92020-01-21 09:07:46 -0800543if(BUILD_SHARED_LIBS)
544 add_definitions(-DBORINGSSL_SHARED_LIBRARY)
545 # Enable position-independent code globally. This is needed because
546 # some library targets are OBJECT libraries.
547 set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
548endif()
549
Adam Langleycfd80a92019-11-08 14:40:08 -0800550include_directories(src/include)
551
552'''
553
554 def PrintLibrary(self, out, name, files):
555 out.write('add_library(\n')
556 out.write(' %s\n\n' % name)
557
558 for f in sorted(files):
559 out.write(' %s\n' % PathOf(f))
560
561 out.write(')\n\n')
562
563 def PrintExe(self, out, name, files, libs):
564 out.write('add_executable(\n')
565 out.write(' %s\n\n' % name)
566
567 for f in sorted(files):
568 out.write(' %s\n' % PathOf(f))
569
570 out.write(')\n\n')
571 out.write('target_link_libraries(%s %s)\n\n' % (name, ' '.join(libs)))
572
573 def PrintSection(self, out, name, files):
574 out.write('set(\n')
575 out.write(' %s\n\n' % name)
576 for f in sorted(files):
577 out.write(' %s\n' % PathOf(f))
578 out.write(')\n\n')
579
580 def WriteFiles(self, files, asm_outputs):
581 with open('CMakeLists.txt', 'w+') as cmake:
582 cmake.write(self.header)
583
584 for ((osname, arch), asm_files) in asm_outputs:
585 self.PrintSection(cmake, 'CRYPTO_%s_%s_SOURCES' % (osname, arch),
586 asm_files)
587
588 cmake.write(
David Benjamin7e265972021-08-04 14:28:55 -0400589R'''if(APPLE AND ARCH STREQUAL "aarch64")
David Benjamin351b2f82022-02-06 12:57:17 -0500590 set(CRYPTO_ARCH_SOURCES ${CRYPTO_apple_aarch64_SOURCES})
David Benjamin7e265972021-08-04 14:28:55 -0400591elseif(APPLE AND ARCH STREQUAL "arm")
David Benjamin351b2f82022-02-06 12:57:17 -0500592 set(CRYPTO_ARCH_SOURCES ${CRYPTO_apple_arm_SOURCES})
Adam Langleycfd80a92019-11-08 14:40:08 -0800593elseif(APPLE)
David Benjamin351b2f82022-02-06 12:57:17 -0500594 set(CRYPTO_ARCH_SOURCES ${CRYPTO_apple_${ARCH}_SOURCES})
Adam Langleycfd80a92019-11-08 14:40:08 -0800595elseif(UNIX)
596 set(CRYPTO_ARCH_SOURCES ${CRYPTO_linux_${ARCH}_SOURCES})
597elseif(WIN32)
598 set(CRYPTO_ARCH_SOURCES ${CRYPTO_win_${ARCH}_SOURCES})
599endif()
600
601''')
602
603 self.PrintLibrary(cmake, 'crypto',
604 files['crypto'] + ['${CRYPTO_ARCH_SOURCES}'])
605 self.PrintLibrary(cmake, 'ssl', files['ssl'])
Adam Langleyff631132020-01-13 15:24:22 -0800606 self.PrintExe(cmake, 'bssl', files['tool'], ['ssl', 'crypto'])
607
608 cmake.write(
David Benjamin8f88b272020-07-09 13:35:01 -0400609R'''if(NOT WIN32 AND NOT ANDROID)
Adam Langleyff631132020-01-13 15:24:22 -0800610 target_link_libraries(crypto pthread)
611endif()
612
David Benjamin8f88b272020-07-09 13:35:01 -0400613if(WIN32)
614 target_link_libraries(bssl ws2_32)
615endif()
616
Adam Langleyff631132020-01-13 15:24:22 -0800617''')
David Benjamin38d01c62016-04-21 18:47:57 -0400618
David Benjamin8c0a6eb2020-07-16 14:45:51 -0400619class JSON(object):
620 def WriteFiles(self, files, asm_outputs):
621 sources = dict(files)
622 for ((osname, arch), asm_files) in asm_outputs:
623 sources['crypto_%s_%s' % (osname, arch)] = asm_files
624 with open('sources.json', 'w+') as f:
625 json.dump(sources, f, sort_keys=True, indent=2)
626
Adam Langley9e1a6602015-05-05 17:47:53 -0700627def FindCMakeFiles(directory):
628 """Returns list of all CMakeLists.txt files recursively in directory."""
629 cmakefiles = []
630
631 for (path, _, filenames) in os.walk(directory):
632 for filename in filenames:
633 if filename == 'CMakeLists.txt':
634 cmakefiles.append(os.path.join(path, filename))
635
636 return cmakefiles
637
Adam Langleyfd499932017-04-04 14:21:43 -0700638def OnlyFIPSFragments(path, dent, is_dir):
Matthew Braithwaite95511e92017-05-08 16:38:03 -0700639 return is_dir or (path.startswith(
640 os.path.join('src', 'crypto', 'fipsmodule', '')) and
641 NoTests(path, dent, is_dir))
Adam Langley9e1a6602015-05-05 17:47:53 -0700642
Adam Langleyfd499932017-04-04 14:21:43 -0700643def NoTestsNorFIPSFragments(path, dent, is_dir):
Adam Langley323f1eb2017-04-06 17:29:10 -0700644 return (NoTests(path, dent, is_dir) and
645 (is_dir or not OnlyFIPSFragments(path, dent, is_dir)))
Adam Langleyfd499932017-04-04 14:21:43 -0700646
647def NoTests(path, dent, is_dir):
Adam Langley9e1a6602015-05-05 17:47:53 -0700648 """Filter function that can be passed to FindCFiles in order to remove test
649 sources."""
650 if is_dir:
651 return dent != 'test'
David Benjamin96ee4a82017-07-09 23:46:47 -0400652 return 'test.' not in dent
Adam Langley9e1a6602015-05-05 17:47:53 -0700653
654
Adam Langleyfd499932017-04-04 14:21:43 -0700655def OnlyTests(path, dent, is_dir):
Adam Langley9e1a6602015-05-05 17:47:53 -0700656 """Filter function that can be passed to FindCFiles in order to remove
657 non-test sources."""
658 if is_dir:
David Benjamin26073832015-05-11 20:52:48 -0400659 return dent != 'test'
David Benjamin96ee4a82017-07-09 23:46:47 -0400660 return '_test.' in dent
Adam Langley9e1a6602015-05-05 17:47:53 -0700661
662
Adam Langleyfd499932017-04-04 14:21:43 -0700663def AllFiles(path, dent, is_dir):
David Benjamin26073832015-05-11 20:52:48 -0400664 """Filter function that can be passed to FindCFiles in order to include all
665 sources."""
666 return True
667
668
Adam Langleyfd499932017-04-04 14:21:43 -0700669def NoTestRunnerFiles(path, dent, is_dir):
Martin Kreichgauer8b487b72017-04-03 16:07:27 -0700670 """Filter function that can be passed to FindCFiles or FindHeaderFiles in
671 order to exclude test runner files."""
672 # NOTE(martinkr): This prevents .h/.cc files in src/ssl/test/runner, which
673 # are in their own subpackage, from being included in boringssl/BUILD files.
674 return not is_dir or dent != 'runner'
675
676
David Benjamin3ecd0a52017-05-19 15:26:18 -0400677def NotGTestSupport(path, dent, is_dir):
David Benjaminc3889632019-03-01 15:03:05 -0500678 return 'gtest' not in dent and 'abi_test' not in dent
David Benjamin96628432017-01-19 19:05:47 -0500679
680
Adam Langleyfd499932017-04-04 14:21:43 -0700681def SSLHeaderFiles(path, dent, is_dir):
Aaron Green0e150022018-10-16 12:05:29 -0700682 return dent in ['ssl.h', 'tls1.h', 'ssl23.h', 'ssl3.h', 'dtls1.h', 'srtp.h']
Adam Langley049ef412015-06-09 18:20:57 -0700683
684
Adam Langley9e1a6602015-05-05 17:47:53 -0700685def FindCFiles(directory, filter_func):
686 """Recurses through directory and returns a list of paths to all the C source
687 files that pass filter_func."""
688 cfiles = []
689
690 for (path, dirnames, filenames) in os.walk(directory):
691 for filename in filenames:
692 if not filename.endswith('.c') and not filename.endswith('.cc'):
693 continue
Adam Langleyfd499932017-04-04 14:21:43 -0700694 if not filter_func(path, filename, False):
Adam Langley9e1a6602015-05-05 17:47:53 -0700695 continue
696 cfiles.append(os.path.join(path, filename))
697
698 for (i, dirname) in enumerate(dirnames):
Adam Langleyfd499932017-04-04 14:21:43 -0700699 if not filter_func(path, dirname, True):
Adam Langley9e1a6602015-05-05 17:47:53 -0700700 del dirnames[i]
701
David Benjaminedd4c5f2020-08-19 14:46:17 -0400702 cfiles.sort()
Adam Langley9e1a6602015-05-05 17:47:53 -0700703 return cfiles
704
705
Adam Langley049ef412015-06-09 18:20:57 -0700706def FindHeaderFiles(directory, filter_func):
707 """Recurses through directory and returns a list of paths to all the header files that pass filter_func."""
708 hfiles = []
709
710 for (path, dirnames, filenames) in os.walk(directory):
711 for filename in filenames:
712 if not filename.endswith('.h'):
713 continue
Adam Langleyfd499932017-04-04 14:21:43 -0700714 if not filter_func(path, filename, False):
Adam Langley049ef412015-06-09 18:20:57 -0700715 continue
716 hfiles.append(os.path.join(path, filename))
717
Matt Braithwaitedfdd49c2016-06-13 17:06:48 -0700718 for (i, dirname) in enumerate(dirnames):
Adam Langleyfd499932017-04-04 14:21:43 -0700719 if not filter_func(path, dirname, True):
Matt Braithwaitedfdd49c2016-06-13 17:06:48 -0700720 del dirnames[i]
721
David Benjaminedd4c5f2020-08-19 14:46:17 -0400722 hfiles.sort()
Adam Langley049ef412015-06-09 18:20:57 -0700723 return hfiles
724
725
Adam Langley9e1a6602015-05-05 17:47:53 -0700726def ExtractPerlAsmFromCMakeFile(cmakefile):
727 """Parses the contents of the CMakeLists.txt file passed as an argument and
728 returns a list of all the perlasm() directives found in the file."""
729 perlasms = []
730 with open(cmakefile) as f:
731 for line in f:
732 line = line.strip()
733 if not line.startswith('perlasm('):
734 continue
735 if not line.endswith(')'):
736 raise ValueError('Bad perlasm line in %s' % cmakefile)
737 # Remove "perlasm(" from start and ")" from end
738 params = line[8:-1].split()
739 if len(params) < 2:
740 raise ValueError('Bad perlasm line in %s' % cmakefile)
741 perlasms.append({
742 'extra_args': params[2:],
743 'input': os.path.join(os.path.dirname(cmakefile), params[1]),
744 'output': os.path.join(os.path.dirname(cmakefile), params[0]),
745 })
746
747 return perlasms
748
749
750def ReadPerlAsmOperations():
751 """Returns a list of all perlasm() directives found in CMake config files in
752 src/."""
753 perlasms = []
754 cmakefiles = FindCMakeFiles('src')
755
756 for cmakefile in cmakefiles:
757 perlasms.extend(ExtractPerlAsmFromCMakeFile(cmakefile))
758
759 return perlasms
760
761
762def PerlAsm(output_filename, input_filename, perlasm_style, extra_args):
763 """Runs the a perlasm script and puts the output into output_filename."""
764 base_dir = os.path.dirname(output_filename)
765 if not os.path.isdir(base_dir):
766 os.makedirs(base_dir)
David Benjaminfdd8e9c2016-06-26 13:18:50 -0400767 subprocess.check_call(
768 ['perl', input_filename, perlasm_style] + extra_args + [output_filename])
Adam Langley9e1a6602015-05-05 17:47:53 -0700769
770
771def ArchForAsmFilename(filename):
772 """Returns the architectures that a given asm file should be compiled for
773 based on substrings in the filename."""
774
775 if 'x86_64' in filename or 'avx2' in filename:
776 return ['x86_64']
777 elif ('x86' in filename and 'x86_64' not in filename) or '586' in filename:
778 return ['x86']
779 elif 'armx' in filename:
780 return ['arm', 'aarch64']
781 elif 'armv8' in filename:
782 return ['aarch64']
783 elif 'arm' in filename:
784 return ['arm']
David Benjamin9f16ce12016-09-27 16:30:22 -0400785 elif 'ppc' in filename:
786 return ['ppc64le']
Adam Langley9e1a6602015-05-05 17:47:53 -0700787 else:
788 raise ValueError('Unknown arch for asm filename: ' + filename)
789
790
791def WriteAsmFiles(perlasms):
792 """Generates asm files from perlasm directives for each supported OS x
793 platform combination."""
794 asmfiles = {}
795
796 for osarch in OS_ARCH_COMBOS:
797 (osname, arch, perlasm_style, extra_args, asm_ext) = osarch
798 key = (osname, arch)
799 outDir = '%s-%s' % key
800
801 for perlasm in perlasms:
802 filename = os.path.basename(perlasm['input'])
803 output = perlasm['output']
804 if not output.startswith('src'):
805 raise ValueError('output missing src: %s' % output)
806 output = os.path.join(outDir, output[4:])
William Hessec618c402015-06-22 16:34:02 +0200807 if output.endswith('-armx.${ASM_EXT}'):
808 output = output.replace('-armx',
809 '-armx64' if arch == 'aarch64' else '-armx32')
Adam Langley9e1a6602015-05-05 17:47:53 -0700810 output = output.replace('${ASM_EXT}', asm_ext)
811
812 if arch in ArchForAsmFilename(filename):
813 PerlAsm(output, perlasm['input'], perlasm_style,
814 perlasm['extra_args'] + extra_args)
815 asmfiles.setdefault(key, []).append(output)
816
Yoshisato Yanagisawa56508162021-03-23 05:34:47 +0000817 for (key, non_perl_asm_files) in NON_PERL_FILES.items():
Adam Langley9e1a6602015-05-05 17:47:53 -0700818 asmfiles.setdefault(key, []).extend(non_perl_asm_files)
819
Yoshisato Yanagisawa56508162021-03-23 05:34:47 +0000820 for files in asmfiles.values():
David Benjaminedd4c5f2020-08-19 14:46:17 -0400821 files.sort()
822
Adam Langley9e1a6602015-05-05 17:47:53 -0700823 return asmfiles
824
825
David Benjamin3ecd0a52017-05-19 15:26:18 -0400826def ExtractVariablesFromCMakeFile(cmakefile):
827 """Parses the contents of the CMakeLists.txt file passed as an argument and
828 returns a dictionary of exported source lists."""
829 variables = {}
830 in_set_command = False
831 set_command = []
832 with open(cmakefile) as f:
833 for line in f:
834 if '#' in line:
835 line = line[:line.index('#')]
836 line = line.strip()
837
838 if not in_set_command:
839 if line.startswith('set('):
840 in_set_command = True
841 set_command = []
842 elif line == ')':
843 in_set_command = False
844 if not set_command:
845 raise ValueError('Empty set command')
846 variables[set_command[0]] = set_command[1:]
847 else:
848 set_command.extend([c for c in line.split(' ') if c])
849
850 if in_set_command:
851 raise ValueError('Unfinished set command')
852 return variables
853
854
Adam Langley049ef412015-06-09 18:20:57 -0700855def main(platforms):
David Benjamin3ecd0a52017-05-19 15:26:18 -0400856 cmake = ExtractVariablesFromCMakeFile(os.path.join('src', 'sources.cmake'))
Andres Erbsen5b280a82017-10-30 15:58:33 +0000857 crypto_c_files = (FindCFiles(os.path.join('src', 'crypto'), NoTestsNorFIPSFragments) +
Adam Langley7f028812019-10-18 14:48:11 -0700858 FindCFiles(os.path.join('src', 'third_party', 'fiat'), NoTestsNorFIPSFragments))
Adam Langleyfd499932017-04-04 14:21:43 -0700859 fips_fragments = FindCFiles(os.path.join('src', 'crypto', 'fipsmodule'), OnlyFIPSFragments)
Adam Langleyfeca9e52017-01-23 13:07:50 -0800860 ssl_source_files = FindCFiles(os.path.join('src', 'ssl'), NoTests)
David Benjamin38d01c62016-04-21 18:47:57 -0400861 tool_c_files = FindCFiles(os.path.join('src', 'tool'), NoTests)
Adam Langleyf11f2332016-06-30 11:56:19 -0700862 tool_h_files = FindHeaderFiles(os.path.join('src', 'tool'), AllFiles)
Adam Langley9e1a6602015-05-05 17:47:53 -0700863
Pete Bentley44544d92019-08-15 15:01:26 +0100864 # BCM shared library C files
865 bcm_crypto_c_files = [
866 os.path.join('src', 'crypto', 'fipsmodule', 'bcm.c')
867 ]
868
Adam Langley9e1a6602015-05-05 17:47:53 -0700869 # Generate err_data.c
870 with open('err_data.c', 'w+') as err_data:
871 subprocess.check_call(['go', 'run', 'err_data_generate.go'],
872 cwd=os.path.join('src', 'crypto', 'err'),
873 stdout=err_data)
874 crypto_c_files.append('err_data.c')
David Benjaminedd4c5f2020-08-19 14:46:17 -0400875 crypto_c_files.sort()
Adam Langley9e1a6602015-05-05 17:47:53 -0700876
David Benjamin38d01c62016-04-21 18:47:57 -0400877 test_support_c_files = FindCFiles(os.path.join('src', 'crypto', 'test'),
David Benjamin3ecd0a52017-05-19 15:26:18 -0400878 NotGTestSupport)
Matt Braithwaitedfdd49c2016-06-13 17:06:48 -0700879 test_support_h_files = (
880 FindHeaderFiles(os.path.join('src', 'crypto', 'test'), AllFiles) +
Martin Kreichgauer8b487b72017-04-03 16:07:27 -0700881 FindHeaderFiles(os.path.join('src', 'ssl', 'test'), NoTestRunnerFiles))
David Benjamin26073832015-05-11 20:52:48 -0400882
Adam Langley990a3232018-05-22 10:02:59 -0700883 crypto_test_files = []
884 if EMBED_TEST_DATA:
885 # Generate crypto_test_data.cc
886 with open('crypto_test_data.cc', 'w+') as out:
887 subprocess.check_call(
888 ['go', 'run', 'util/embed_test_data.go'] + cmake['CRYPTO_TEST_DATA'],
889 cwd='src',
890 stdout=out)
891 crypto_test_files += ['crypto_test_data.cc']
David Benjamin3ecd0a52017-05-19 15:26:18 -0400892
Adam Langley990a3232018-05-22 10:02:59 -0700893 crypto_test_files += FindCFiles(os.path.join('src', 'crypto'), OnlyTests)
David Benjamin96ee4a82017-07-09 23:46:47 -0400894 crypto_test_files += [
David Benjaminc3889632019-03-01 15:03:05 -0500895 'src/crypto/test/abi_test.cc',
David Benjamin3ecd0a52017-05-19 15:26:18 -0400896 'src/crypto/test/file_test_gtest.cc',
897 'src/crypto/test/gtest_main.cc',
898 ]
Adam Langley3e502c82019-10-16 09:56:38 -0700899 # urandom_test.cc is in a separate binary so that it can be test PRNG
900 # initialisation.
901 crypto_test_files = [
902 file for file in crypto_test_files
903 if not file.endswith('/urandom_test.cc')
904 ]
David Benjaminedd4c5f2020-08-19 14:46:17 -0400905 crypto_test_files.sort()
David Benjamin1d5a5702017-02-13 22:11:49 -0500906
907 ssl_test_files = FindCFiles(os.path.join('src', 'ssl'), OnlyTests)
Robert Sloanae1e0872019-03-01 16:01:30 -0800908 ssl_test_files += [
909 'src/crypto/test/abi_test.cc',
910 'src/crypto/test/gtest_main.cc',
911 ]
David Benjaminedd4c5f2020-08-19 14:46:17 -0400912 ssl_test_files.sort()
Adam Langley9e1a6602015-05-05 17:47:53 -0700913
Adam Langley3e502c82019-10-16 09:56:38 -0700914 urandom_test_files = [
915 'src/crypto/fipsmodule/rand/urandom_test.cc',
916 ]
917
David Benjamin38d01c62016-04-21 18:47:57 -0400918 fuzz_c_files = FindCFiles(os.path.join('src', 'fuzz'), NoTests)
919
David Benjaminedd4c5f2020-08-19 14:46:17 -0400920 ssl_h_files = FindHeaderFiles(os.path.join('src', 'include', 'openssl'),
921 SSLHeaderFiles)
Adam Langley049ef412015-06-09 18:20:57 -0700922
Adam Langleyfd499932017-04-04 14:21:43 -0700923 def NotSSLHeaderFiles(path, filename, is_dir):
924 return not SSLHeaderFiles(path, filename, is_dir)
David Benjaminedd4c5f2020-08-19 14:46:17 -0400925 crypto_h_files = FindHeaderFiles(os.path.join('src', 'include', 'openssl'),
926 NotSSLHeaderFiles)
Adam Langley049ef412015-06-09 18:20:57 -0700927
928 ssl_internal_h_files = FindHeaderFiles(os.path.join('src', 'ssl'), NoTests)
Andres Erbsen5b280a82017-10-30 15:58:33 +0000929 crypto_internal_h_files = (
930 FindHeaderFiles(os.path.join('src', 'crypto'), NoTests) +
Adam Langley7f028812019-10-18 14:48:11 -0700931 FindHeaderFiles(os.path.join('src', 'third_party', 'fiat'), NoTests))
Adam Langley049ef412015-06-09 18:20:57 -0700932
Adam Langley9e1a6602015-05-05 17:47:53 -0700933 files = {
Pete Bentley44544d92019-08-15 15:01:26 +0100934 'bcm_crypto': bcm_crypto_c_files,
Adam Langley9e1a6602015-05-05 17:47:53 -0700935 'crypto': crypto_c_files,
Adam Langley049ef412015-06-09 18:20:57 -0700936 'crypto_headers': crypto_h_files,
937 'crypto_internal_headers': crypto_internal_h_files,
David Benjaminedd4c5f2020-08-19 14:46:17 -0400938 'crypto_test': crypto_test_files,
Adam Langley990a3232018-05-22 10:02:59 -0700939 'crypto_test_data': sorted('src/' + x for x in cmake['CRYPTO_TEST_DATA']),
Adam Langleyfd499932017-04-04 14:21:43 -0700940 'fips_fragments': fips_fragments,
David Benjamin38d01c62016-04-21 18:47:57 -0400941 'fuzz': fuzz_c_files,
Adam Langleyfeca9e52017-01-23 13:07:50 -0800942 'ssl': ssl_source_files,
Adam Langley049ef412015-06-09 18:20:57 -0700943 'ssl_headers': ssl_h_files,
944 'ssl_internal_headers': ssl_internal_h_files,
David Benjaminedd4c5f2020-08-19 14:46:17 -0400945 'ssl_test': ssl_test_files,
David Benjamin38d01c62016-04-21 18:47:57 -0400946 'tool': tool_c_files,
Adam Langleyf11f2332016-06-30 11:56:19 -0700947 'tool_headers': tool_h_files,
David Benjaminc5aa8412016-07-29 17:41:58 -0400948 'test_support': test_support_c_files,
949 'test_support_headers': test_support_h_files,
David Benjaminedd4c5f2020-08-19 14:46:17 -0400950 'urandom_test': urandom_test_files,
Adam Langley9e1a6602015-05-05 17:47:53 -0700951 }
952
Yoshisato Yanagisawa56508162021-03-23 05:34:47 +0000953 asm_outputs = sorted(WriteAsmFiles(ReadPerlAsmOperations()).items())
Adam Langley9e1a6602015-05-05 17:47:53 -0700954
Adam Langley049ef412015-06-09 18:20:57 -0700955 for platform in platforms:
956 platform.WriteFiles(files, asm_outputs)
Adam Langley9e1a6602015-05-05 17:47:53 -0700957
958 return 0
959
David Benjamin8c0a6eb2020-07-16 14:45:51 -0400960ALL_PLATFORMS = {
961 'android': Android,
962 'android-cmake': AndroidCMake,
963 'bazel': Bazel,
964 'cmake': CMake,
965 'eureka': Eureka,
966 'gn': GN,
967 'gyp': GYP,
968 'json': JSON,
969}
Adam Langley9e1a6602015-05-05 17:47:53 -0700970
Adam Langley9e1a6602015-05-05 17:47:53 -0700971if __name__ == '__main__':
David Benjamin8c0a6eb2020-07-16 14:45:51 -0400972 parser = optparse.OptionParser(usage='Usage: %%prog [--prefix=<path>] [%s]' %
973 '|'.join(sorted(ALL_PLATFORMS.keys())))
Matt Braithwaite16695892016-06-09 09:34:11 -0700974 parser.add_option('--prefix', dest='prefix',
975 help='For Bazel, prepend argument to all source files')
Adam Langley990a3232018-05-22 10:02:59 -0700976 parser.add_option(
977 '--embed_test_data', type='choice', dest='embed_test_data',
978 action='store', default="true", choices=["true", "false"],
David Benjaminf014d602019-05-07 18:58:06 -0500979 help='For Bazel or GN, don\'t embed data files in crypto_test_data.cc')
Matt Braithwaite16695892016-06-09 09:34:11 -0700980 options, args = parser.parse_args(sys.argv[1:])
981 PREFIX = options.prefix
Adam Langley990a3232018-05-22 10:02:59 -0700982 EMBED_TEST_DATA = (options.embed_test_data == "true")
Matt Braithwaite16695892016-06-09 09:34:11 -0700983
984 if not args:
985 parser.print_help()
986 sys.exit(1)
Adam Langley9e1a6602015-05-05 17:47:53 -0700987
Adam Langley049ef412015-06-09 18:20:57 -0700988 platforms = []
Matt Braithwaite16695892016-06-09 09:34:11 -0700989 for s in args:
David Benjamin8c0a6eb2020-07-16 14:45:51 -0400990 platform = ALL_PLATFORMS.get(s)
991 if platform is None:
Matt Braithwaite16695892016-06-09 09:34:11 -0700992 parser.print_help()
993 sys.exit(1)
David Benjamin8c0a6eb2020-07-16 14:45:51 -0400994 platforms.append(platform())
Adam Langley9e1a6602015-05-05 17:47:53 -0700995
Adam Langley049ef412015-06-09 18:20:57 -0700996 sys.exit(main(platforms))