391 lines
9.2 KiB
Meson
391 lines
9.2 KiB
Meson
|
project(
|
||
|
'openssl',
|
||
|
'c',
|
||
|
version: '3.0.8',
|
||
|
license : 'Apache-2.0',
|
||
|
meson_version: '>= 0.55',
|
||
|
default_options: [
|
||
|
'warning_level=1',
|
||
|
],
|
||
|
)
|
||
|
|
||
|
# Make sure to generate configs in case they are not already
|
||
|
fs = import('fs')
|
||
|
if not fs.exists('generated-config')
|
||
|
message('Generating OpenSSL configs...')
|
||
|
|
||
|
if host_machine.system() != 'linux'
|
||
|
error('Generator only works on Linux, other platforms are not supported')
|
||
|
endif
|
||
|
|
||
|
bash = find_program('bash')
|
||
|
run_command(
|
||
|
bash,
|
||
|
'generator.sh',
|
||
|
check: true,
|
||
|
env: ['OPENSSL_VERSION=' + meson.project_version()],
|
||
|
)
|
||
|
endif
|
||
|
|
||
|
include_directories = [
|
||
|
'include',
|
||
|
'crypto',
|
||
|
'crypto/modes',
|
||
|
'crypto/ec/curve448',
|
||
|
'crypto/ec/curve448/arch_32',
|
||
|
'providers/common/include',
|
||
|
'providers/implementations/include',
|
||
|
]
|
||
|
|
||
|
compiler = meson.get_compiler('c')
|
||
|
|
||
|
dependencies = [
|
||
|
# TODO: Make this optionally added once we have threading configurable via options
|
||
|
dependency('threads'),
|
||
|
]
|
||
|
defines = [
|
||
|
# Compile out hardware engines. Most are stubs that dynamically load
|
||
|
# the real driver but that poses a security liability when an attacker
|
||
|
# is able to create a malicious DLL in one of the default search paths.
|
||
|
'OPENSSL_NO_HW',
|
||
|
]
|
||
|
c_args = []
|
||
|
|
||
|
asm_opt = get_option('asm')
|
||
|
|
||
|
if asm_opt.disabled()
|
||
|
gas_or_nasm = false
|
||
|
else
|
||
|
gas_or_nasm = (
|
||
|
find_program('as', required: false).found() or
|
||
|
find_program('nasm', required: false).found()
|
||
|
)
|
||
|
endif
|
||
|
|
||
|
is_bsd = host_machine.system() in ['dragonfly', 'freebsd', 'netbsd', 'openbsd']
|
||
|
is_darwin = host_machine.system() == 'darwin'
|
||
|
is_linux = host_machine.system() in ['linux', 'android']
|
||
|
is_sunos = host_machine.system() == 'sunos'
|
||
|
is_windows = host_machine.system() == 'windows'
|
||
|
|
||
|
is_x86 = host_machine.cpu_family() == 'x86'
|
||
|
is_x86_64 = host_machine.cpu_family() == 'x86_64'
|
||
|
is_aarch64 = host_machine.cpu_family() == 'aarch64'
|
||
|
is_mips64 = host_machine.cpu_family() == 'mips64'
|
||
|
is_s390x = host_machine.cpu_family() == 's390x'
|
||
|
is_arm = host_machine.cpu_family() == 'arm'
|
||
|
is_ppc64 = host_machine.cpu_family() == 'ppc64'
|
||
|
is_riskv64 = host_machine.cpu_family() == 'riscv64'
|
||
|
|
||
|
if gas_or_nasm
|
||
|
asm = 'asm'
|
||
|
|
||
|
if is_bsd
|
||
|
if is_x86
|
||
|
arch_subdir = 'BSD-x86'
|
||
|
elif is_x86_64
|
||
|
arch_subdir = 'BSD-x86_64'
|
||
|
else
|
||
|
asm = 'no-asm'
|
||
|
endif
|
||
|
elif is_darwin
|
||
|
if is_aarch64
|
||
|
arch_subdir = 'darwin64-arm64-cc'
|
||
|
elif is_x86_64
|
||
|
arch_subdir = 'darwin64-x86_64-cc'
|
||
|
elif is_x86
|
||
|
arch_subdir = 'darwin-i386-cc'
|
||
|
else
|
||
|
asm = 'no-asm'
|
||
|
endif
|
||
|
elif is_linux
|
||
|
if is_mips64
|
||
|
arch_subdir = 'linux64-mips64'
|
||
|
elif is_s390x
|
||
|
arch_subdir = 'linux64-s390x'
|
||
|
elif is_aarch64
|
||
|
arch_subdir = 'linux-aarch64'
|
||
|
elif is_arm
|
||
|
arch_subdir = 'linux-armv4'
|
||
|
elif is_ppc64
|
||
|
arch_subdir = 'linux-ppc64le'
|
||
|
elif is_x86
|
||
|
arch_subdir = 'linux-elf'
|
||
|
elif is_x86_64
|
||
|
arch_subdir = 'linux-x86_64'
|
||
|
else
|
||
|
asm = 'no-asm'
|
||
|
endif
|
||
|
elif is_sunos
|
||
|
if is_x86_64
|
||
|
arch_subdir = 'solaris64-x86_64-gcc'
|
||
|
elif is_x86
|
||
|
arch_subdir = 'solaris-x86-gcc'
|
||
|
else
|
||
|
asm = 'no-asm'
|
||
|
endif
|
||
|
elif is_windows
|
||
|
if is_x86
|
||
|
warning('x86 + windows combo does not support ASM yet, please contribute')
|
||
|
asm = 'no-asm'
|
||
|
# TODO: Port this for Windows and uncomment
|
||
|
# arch_subdir = 'VC-WIN32'
|
||
|
# asm = 'asm'
|
||
|
#'rules': [
|
||
|
# {
|
||
|
# 'rule_name': 'Assemble',
|
||
|
# 'extension': 'asm',
|
||
|
# 'inputs': [],
|
||
|
# 'outputs': [
|
||
|
# '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).obj',
|
||
|
# ],
|
||
|
# 'action': [
|
||
|
# 'nasm.exe',
|
||
|
# '-f win32',
|
||
|
# '-o', '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).obj',
|
||
|
# '<(RULE_INPUT_PATH)',
|
||
|
# ],
|
||
|
# }
|
||
|
#],
|
||
|
elif is_x86_64
|
||
|
warning('x86_64 + windows combo does not support ASM yet, please contribute')
|
||
|
asm = 'no-asm'
|
||
|
# TODO: Port this for Windows and uncomment
|
||
|
# arch_subdir = 'VC-WIN64A'
|
||
|
# asm = 'asm'
|
||
|
#'rules': [
|
||
|
# {
|
||
|
# 'rule_name': 'Assemble',
|
||
|
# 'extension': 'asm',
|
||
|
# 'inputs': [],
|
||
|
# 'outputs': [
|
||
|
# '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).obj',
|
||
|
# ],
|
||
|
# 'action': [
|
||
|
# 'nasm.exe',
|
||
|
# '-f win64',
|
||
|
# '-DNEAR',
|
||
|
# '-Ox',
|
||
|
# '-g',
|
||
|
# '-o', '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).obj',
|
||
|
# '<(RULE_INPUT_PATH)',
|
||
|
# ],
|
||
|
# }
|
||
|
#],
|
||
|
else
|
||
|
asm = 'no-asm'
|
||
|
endif
|
||
|
else
|
||
|
asm = 'no-asm'
|
||
|
endif
|
||
|
elif asm_opt.enabled()
|
||
|
error('Neither GNU Assembler nor Netwide Assembler were found, cannot use use "asm=enabled" option')
|
||
|
else
|
||
|
asm = 'no-asm'
|
||
|
endif
|
||
|
|
||
|
if asm == 'no-asm'
|
||
|
defines += ['OPENSSL_NO_ASM']
|
||
|
error_message = 'Unsupported arch+OS combo: ' + host_machine.cpu_family() + ' + ' + host_machine.system()
|
||
|
|
||
|
if is_bsd
|
||
|
if is_x86
|
||
|
arch_subdir = 'BSD-x86'
|
||
|
elif is_x86_64
|
||
|
arch_subdir = 'BSD-x86_64'
|
||
|
else
|
||
|
error(error_message)
|
||
|
endif
|
||
|
elif is_darwin
|
||
|
if is_aarch64
|
||
|
arch_subdir = 'darwin64-arm64-cc'
|
||
|
elif is_x86_64
|
||
|
arch_subdir = 'darwin64-x86_64-cc'
|
||
|
elif is_x86
|
||
|
arch_subdir = 'darwin-i386-cc'
|
||
|
else
|
||
|
error(error_message)
|
||
|
endif
|
||
|
elif is_linux
|
||
|
if is_mips64
|
||
|
arch_subdir = 'linux64-mips64'
|
||
|
elif is_riskv64
|
||
|
arch_subdir = 'linux64-riscv64'
|
||
|
elif is_s390x
|
||
|
arch_subdir = 'linux64-s390x'
|
||
|
elif is_aarch64
|
||
|
arch_subdir = 'linux-aarch64'
|
||
|
elif is_arm
|
||
|
arch_subdir = 'linux-armv4'
|
||
|
elif is_ppc64
|
||
|
arch_subdir = 'linux-ppc64le'
|
||
|
elif is_x86
|
||
|
arch_subdir = 'linux-elf'
|
||
|
elif is_x86_64
|
||
|
arch_subdir = 'linux-x86_64'
|
||
|
else
|
||
|
error(error_message)
|
||
|
endif
|
||
|
elif is_sunos
|
||
|
if is_x86_64
|
||
|
arch_subdir = 'solaris64-x86_64-gcc'
|
||
|
elif is_x86
|
||
|
arch_subdir = 'solaris-x86-gcc'
|
||
|
else
|
||
|
error(error_message)
|
||
|
endif
|
||
|
elif is_windows
|
||
|
if is_x86
|
||
|
arch_subdir = 'VC-WIN32'
|
||
|
elif is_aarch64
|
||
|
arch_subdir = 'VC-WIN64-ARM'
|
||
|
elif is_x86_64
|
||
|
arch_subdir = 'VC-WIN64A'
|
||
|
else
|
||
|
error(error_message)
|
||
|
endif
|
||
|
else
|
||
|
error(error_message)
|
||
|
endif
|
||
|
|
||
|
message('OpenSSL is configured without ASM support')
|
||
|
else
|
||
|
message('OpenSSL is configured with ASM support')
|
||
|
endif
|
||
|
|
||
|
subdir('generated-config/archs' / arch_subdir / asm)
|
||
|
|
||
|
# Build options specific to OS, engines are disabled on purpose for the same reasons as `OPENSSL_NO_HW` above
|
||
|
if is_windows
|
||
|
defines += [
|
||
|
## default of Win. See INSTALL in openssl repo.
|
||
|
'OPENSSLDIR="C:\\Program Files\\Common Files\\SSL"',
|
||
|
'ENGINESDIR="NUL"',
|
||
|
'MODULESDIR="NUL"',
|
||
|
'OPENSSL_SYS_WIN32', 'WIN32_LEAN_AND_MEAN', 'L_ENDIAN',
|
||
|
'_CRT_SECURE_NO_DEPRECATE', 'UNICODE', '_UNICODE',
|
||
|
]
|
||
|
if compiler.get_id() == 'msvc'
|
||
|
c_args += [
|
||
|
'-wd4090', '-Gs0', '-GF', '-Gy', '-nologo',
|
||
|
]
|
||
|
endif
|
||
|
elif is_darwin
|
||
|
defines += [
|
||
|
'OPENSSLDIR="/System/Library/OpenSSL/"',
|
||
|
'ENGINESDIR="/dev/null"',
|
||
|
'MODULESDIR="/dev/null"',
|
||
|
]
|
||
|
c_args += [
|
||
|
'-Wno-missing-field-initializers',
|
||
|
]
|
||
|
elif is_sunos
|
||
|
defines += [
|
||
|
'OPENSSLDIR="/etc/ssl"',
|
||
|
'ENGINESDIR="/dev/null"',
|
||
|
'MODULESDIR="/dev/null"',
|
||
|
'__EXTENSIONS__'
|
||
|
]
|
||
|
else
|
||
|
# Linux and others
|
||
|
defines += [
|
||
|
'OPENSSLDIR="/etc/ssl"',
|
||
|
'ENGINESDIR="/dev/null"',
|
||
|
'MODULESDIR="/dev/null"',
|
||
|
]
|
||
|
c_args += [
|
||
|
'-Wno-missing-field-initializers',
|
||
|
]
|
||
|
if compiler.get_id() != 'clang'
|
||
|
c_args += [
|
||
|
'-Wno-old-style-declaration',
|
||
|
]
|
||
|
endif
|
||
|
endif
|
||
|
|
||
|
foreach library: openssl_libraries
|
||
|
# MSVC fails with "ERROR: C static library 'ws2_32' not found" when `static` is specified at all
|
||
|
if compiler.get_id() == 'msvc'
|
||
|
dependencies += [
|
||
|
compiler.find_library(library),
|
||
|
]
|
||
|
else
|
||
|
dependencies += [
|
||
|
compiler.find_library(
|
||
|
library,
|
||
|
static: get_option('default_library') == 'static',
|
||
|
),
|
||
|
]
|
||
|
endif
|
||
|
endforeach
|
||
|
|
||
|
# We may need to add some defines for static builds
|
||
|
if get_option('default_library') == 'static'
|
||
|
defines += [
|
||
|
'OSSL_CRYPTO_DSO_CONF_H',
|
||
|
'DSO_NONE',
|
||
|
'DSO_EXTENSION=".so"',
|
||
|
'OPENSSL_NO_DSO',
|
||
|
]
|
||
|
endif
|
||
|
|
||
|
foreach define : defines + openssl_defines
|
||
|
c_args += ['-D' + define]
|
||
|
endforeach
|
||
|
|
||
|
c_args += openssl_cflags
|
||
|
|
||
|
include_directories += openssl_include_directories
|
||
|
|
||
|
libcrypto_lib = library(
|
||
|
'crypto',
|
||
|
dependencies: dependencies,
|
||
|
sources: libcrypto_sources,
|
||
|
include_directories: include_directories,
|
||
|
c_args: c_args,
|
||
|
vs_module_defs: 'crypto.def',
|
||
|
install: true,
|
||
|
)
|
||
|
|
||
|
libcrypto_dep = declare_dependency(
|
||
|
include_directories: include_directories,
|
||
|
dependencies: dependencies,
|
||
|
link_with: libcrypto_lib,
|
||
|
)
|
||
|
|
||
|
libssl_lib = library(
|
||
|
'ssl',
|
||
|
dependencies: dependencies + [libcrypto_dep],
|
||
|
sources: libssl_sources,
|
||
|
include_directories: include_directories,
|
||
|
c_args: c_args,
|
||
|
vs_module_defs: 'ssl.def',
|
||
|
install: true,
|
||
|
)
|
||
|
|
||
|
libssl_dep = declare_dependency(
|
||
|
include_directories: include_directories,
|
||
|
dependencies: dependencies + [libcrypto_dep],
|
||
|
link_with: libssl_lib,
|
||
|
)
|
||
|
|
||
|
openssl_dep = declare_dependency(
|
||
|
dependencies: [libcrypto_dep, libssl_dep],
|
||
|
)
|
||
|
|
||
|
openssl_cli_directories = include_directories + [
|
||
|
'apps/include'
|
||
|
]
|
||
|
|
||
|
cli_opt = get_option('build_cli')
|
||
|
|
||
|
openssl_cli = executable(
|
||
|
'openssl',
|
||
|
build_by_default: cli_opt,
|
||
|
dependencies: dependencies + [openssl_dep],
|
||
|
sources: openssl_cli_sources,
|
||
|
include_directories: openssl_cli_directories,
|
||
|
c_args: c_args,
|
||
|
install: cli_opt,
|
||
|
)
|