diff --git a/util/generate_build_files.py b/util/generate_build_files.py
index 6bd3abc..af02ed0 100644
--- a/util/generate_build_files.py
+++ b/util/generate_build_files.py
@@ -1,3 +1,5 @@
+# coding=utf8
+
 # Copyright (c) 2015, Google Inc.
 #
 # Permission to use, copy, modify, and/or distribute this software for any
@@ -413,6 +415,177 @@
 
       gypi.write('  }\n}\n')
 
+class CMake(object):
+
+  def __init__(self):
+    self.header = \
+R'''# Copyright (c) 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This file is created by generate_build_files.py. Do not edit manually.
+
+cmake_minimum_required(VERSION 3.0)
+
+project(BoringSSL LANGUAGES C CXX)
+
+if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+  set(CLANG 1)
+endif()
+
+if(CMAKE_COMPILER_IS_GNUCXX OR CLANG)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti")
+  if(APPLE)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
+  endif()
+
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fno-common")
+  if((CMAKE_C_COMPILER_VERSION VERSION_GREATER "4.8.99") OR CLANG)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
+  else()
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
+  endif()
+endif()
+
+# pthread_rwlock_t requires a feature flag.
+if(NOT WIN32)
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE=700")
+endif()
+
+if(WIN32)
+  add_definitions(-D_HAS_EXCEPTIONS=0)
+  add_definitions(-DWIN32_LEAN_AND_MEAN)
+  add_definitions(-DNOMINMAX)
+  # Allow use of fopen.
+  add_definitions(-D_CRT_SECURE_NO_WARNINGS)
+  # VS 2017 and higher supports STL-only warning suppressions.
+  # A bug in CMake < 3.13.0 may cause the space in this value to
+  # cause issues when building with NASM. In that case, update CMake.
+  add_definitions("-D_STL_EXTRA_DISABLED_WARNINGS=4774 4987")
+endif()
+
+add_definitions(-DBORINGSSL_IMPLEMENTATION)
+
+if(OPENSSL_NO_ASM)
+  add_definitions(-DOPENSSL_NO_ASM)
+  set(ARCH "generic")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
+  set(ARCH "x86_64")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "amd64")
+  set(ARCH "x86_64")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
+  # cmake reports AMD64 on Windows, but we might be building for 32-bit.
+  if(CMAKE_CL_64)
+    set(ARCH "x86_64")
+  else()
+    set(ARCH "x86")
+  endif()
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86")
+  set(ARCH "x86")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386")
+  set(ARCH "x86")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
+  set(ARCH "x86")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
+  set(ARCH "aarch64")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")
+  set(ARCH "aarch64")
+# Apple A12 Bionic chipset which is added in iPhone XS/XS Max/XR uses arm64e architecture.
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64e")
+  set(ARCH "aarch64")
+elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm*")
+  set(ARCH "arm")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "mips")
+  # Just to avoid the “unknown processor” error.
+  set(ARCH "generic")
+elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64le")
+  set(ARCH "ppc64le")
+else()
+  message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR})
+endif()
+
+if(NOT OPENSSL_NO_ASM)
+  if(UNIX)
+    enable_language(ASM)
+
+    # Clang's integerated assembler does not support debug symbols.
+    if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang")
+      set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g")
+    endif()
+
+    # CMake does not add -isysroot and -arch flags to assembly.
+    if(APPLE)
+      if(CMAKE_OSX_SYSROOT)
+        set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"")
+      endif()
+      foreach(arch ${CMAKE_OSX_ARCHITECTURES})
+        set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}")
+      endforeach()
+    endif()
+  else()
+    set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -gcv8")
+    enable_language(ASM_NASM)
+  endif()
+endif()
+
+include_directories(src/include)
+
+'''
+
+  def PrintLibrary(self, out, name, files):
+    out.write('add_library(\n')
+    out.write('  %s\n\n' % name)
+
+    for f in sorted(files):
+      out.write('  %s\n' % PathOf(f))
+
+    out.write(')\n\n')
+
+  def PrintExe(self, out, name, files, libs):
+    out.write('add_executable(\n')
+    out.write('  %s\n\n' % name)
+
+    for f in sorted(files):
+      out.write('  %s\n' % PathOf(f))
+
+    out.write(')\n\n')
+    out.write('target_link_libraries(%s %s)\n\n' % (name, ' '.join(libs)))
+
+  def PrintSection(self, out, name, files):
+    out.write('set(\n')
+    out.write('  %s\n\n' % name)
+    for f in sorted(files):
+      out.write('  %s\n' % PathOf(f))
+    out.write(')\n\n')
+
+  def WriteFiles(self, files, asm_outputs):
+    with open('CMakeLists.txt', 'w+') as cmake:
+      cmake.write(self.header)
+
+      for ((osname, arch), asm_files) in asm_outputs:
+        self.PrintSection(cmake, 'CRYPTO_%s_%s_SOURCES' % (osname, arch),
+            asm_files)
+
+      cmake.write(
+R'''if(APPLE AND ${ARCH} STREQUAL "aarch64")
+  set(CRYPTO_ARCH_SOURCES ${CRYPTO_ios_aarch64_SOURCES})
+elseif(APPLE AND ${ARCH} STREQUAL "arm")
+  set(CRYPTO_ARCH_SOURCES ${CRYPTO_ios_arm_SOURCES})
+elseif(APPLE)
+  set(CRYPTO_ARCH_SOURCES ${CRYPTO_mac_${ARCH}_SOURCES})
+elseif(UNIX)
+  set(CRYPTO_ARCH_SOURCES ${CRYPTO_linux_${ARCH}_SOURCES})
+elseif(WIN32)
+  set(CRYPTO_ARCH_SOURCES ${CRYPTO_win_${ARCH}_SOURCES})
+endif()
+
+''')
+
+      self.PrintLibrary(cmake, 'crypto',
+          files['crypto'] + ['${CRYPTO_ARCH_SOURCES}'])
+      self.PrintLibrary(cmake, 'ssl', files['ssl'])
+      self.PrintExe(cmake, 'bssl', files['tool'],
+          ['ssl', 'crypto', '-lpthread'])
 
 def FindCMakeFiles(directory):
   """Returns list of all CMakeLists.txt files recursively in directory."""
@@ -781,6 +954,8 @@
       platforms.append(GN())
     elif s == 'gyp':
       platforms.append(GYP())
+    elif s == 'cmake':
+      platforms.append(CMake())
     else:
       parser.print_help()
       sys.exit(1)
