blob: 3b63c50deb9629613c1bb4407c881f73244908a2 [file]
# Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
cmake_minimum_required(VERSION 3.14.0)
project(bssl_dart LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(BORINGSSL_ROOT ../third_party/boringssl/)
include(../third_party/boringssl/sources.cmake)
# Symbol prefixing: all BoringSSL symbols become bssl_dart_<symbol>
add_definitions(-DBORINGSSL_PREFIX=bssl_dart)
# Keep BoringSSL free of C++ runtime symbols (such as operator delete from
# virtual destructors), since CMake links the library with the C compiler
# driver.
add_definitions(-DBORINGSSL_TEMPORARY_NO_CXX_RUNTIME)
# Architecture and platform detection.
#
# CMAKE_SYSTEM_PROCESSOR is the host's when CMAKE_OSX_ARCHITECTURES selects
# another architecture on macOS, so use the requested architecture instead.
set(BSSL_DART_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}")
if(APPLE AND CMAKE_OSX_ARCHITECTURES)
list(LENGTH CMAKE_OSX_ARCHITECTURES BSSL_DART_ARCHITECTURE_COUNT)
if(BSSL_DART_ARCHITECTURE_COUNT EQUAL 1)
set(BSSL_DART_PROCESSOR "${CMAKE_OSX_ARCHITECTURES}")
else()
# The assembly is per architecture, so universal builds use the C code.
set(BSSL_DART_PROCESSOR "universal")
endif()
endif()
string(TOLOWER "${BSSL_DART_PROCESSOR}" BSSL_DART_PROCESSOR)
if("${BSSL_DART_PROCESSOR}" STREQUAL "x86_64" OR "${BSSL_DART_PROCESSOR}" STREQUAL "amd64")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(ARCH "x86_64")
else()
set(ARCH "x86")
endif()
elseif("${BSSL_DART_PROCESSOR}" STREQUAL "x86" OR "${BSSL_DART_PROCESSOR}" STREQUAL "i386" OR "${BSSL_DART_PROCESSOR}" STREQUAL "i686")
set(ARCH "x86")
elseif("${BSSL_DART_PROCESSOR}" STREQUAL "aarch64" OR "${BSSL_DART_PROCESSOR}" STREQUAL "arm64" OR "${BSSL_DART_PROCESSOR}" STREQUAL "arm64e")
set(ARCH "aarch64")
elseif("${BSSL_DART_PROCESSOR}" MATCHES "^arm*")
set(ARCH "arm")
elseif("${BSSL_DART_PROCESSOR}" STREQUAL "ppc64le")
set(ARCH "ppc64le")
else()
set(ARCH "generic")
endif()
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
set(PLATFORM "win")
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR ${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
set(PLATFORM "apple")
else()
set(PLATFORM "linux")
endif()
if(MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND "${ARCH}" STREQUAL "aarch64")
# BoringSSL's Windows AArch64 assembly is gas syntax for clang-cl.
unset(crypto_sources_win_aarch64)
endif()
if(NOT DEFINED crypto_sources_${PLATFORM}_${ARCH})
add_definitions(-DOPENSSL_NO_ASM)
set(crypto_sources_${PLATFORM}_${ARCH})
elseif(WIN32)
enable_language(ASM_NASM)
set(OPENSSL_NASM TRUE)
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -gcv8")
else()
if(NOT DEFINED CMAKE_ASM_COMPILER AND DEFINED CMAKE_C_COMPILER)
set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}")
endif()
enable_language(ASM)
endif()
if(MSVC)
set(MSVC_DISABLED_WARNINGS_STR " -wd4100 -wd4127 -wd4132 -wd4244 -wd4267 -wd4706 -wd4141 -wd4201")
# BoringSSL doesn't use RTTI (-GR-).
set(CMAKE_C_FLAGS "-utf-8 -W4 -WX ${MSVC_DISABLED_WARNINGS_STR}")
set(CMAKE_CXX_FLAGS "-utf-8 -W4 -WX -GR- ${MSVC_DISABLED_WARNINGS_STR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}>)
else()
# BoringSSL doesn't need the C++ runtime (see BORINGSSL_ALLOW_CXX_RUNTIME
# upstream), so the library doesn't depend on it. Also clear CMake's implicit
# C++ link libraries so CMake does not pass -lc++ (e.g. libc++_shared.so on
# Android) or -lstdc++ when linking CXX object files with LINKER_LANGUAGE C.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
endif()
if(WIN32)
set(CMAKE_GENERATOR_CC cl)
add_definitions(-D_HAS_EXCEPTIONS=0)
add_definitions(-DWIN32_LEAN_AND_MEAN)
add_definitions(-DNOMINMAX)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
add_definitions(-DBORINGSSL_UNSAFE_DETERMINISTIC_MODE=0)
endif()
# The sources are compiled in an object library, so that LINKER_LANGUAGE C
# below only affects linking. On a target with the sources, the Visual Studio
# generator would compile them without CMAKE_CXX_STANDARD.
add_library(
bssl_dart_objects
OBJECT
${crypto_sources}
${crypto_sources_${PLATFORM}_${ARCH}}
)
target_include_directories(
bssl_dart_objects
PUBLIC
../third_party/boringssl/src/include/
PRIVATE
../third_party/boringssl/src/gen/
)
set_target_properties(
bssl_dart_objects
PROPERTIES
POSITION_INDEPENDENT_CODE ON
C_VISIBILITY_PRESET default
VISIBILITY_INLINES_HIDDEN 0
)
add_library(bssl_dart SHARED $<TARGET_OBJECTS:bssl_dart_objects>)
set_target_properties(
bssl_dart
PROPERTIES
LINKER_LANGUAGE C
WINDOWS_EXPORT_ALL_SYMBOLS TRUE
)
install(
TARGETS bssl_dart
RUNTIME DESTINATION .
LIBRARY DESTINATION .
ARCHIVE DESTINATION .
)