Browse Source

Full Meson support (#1033)

* Full Meson support
cpp-httplib can be now built with Meson even in compiled library mode.

The library is built with LTO, supports OpenSSL, zlib and Brotli,
and the build system also generates a pkg-config file when needed.

Compared to the CMake file this one is quite small (more than five times
smaller!), and maintaining it won't be an issue :)

* meson: automatic versioning
Andrea Pappacoda 4 years ago
parent
commit
e20ecd2574
2 changed files with 111 additions and 2 deletions
  1. 103 2
      meson.build
  2. 8 0
      meson_options.txt

+ 103 - 2
meson.build

@@ -1,6 +1,107 @@
-project('cpp-httplib', 'cpp', license: 'MIT')
+# SPDX-FileCopyrightText: 2021 Andrea Pappacoda
+#
+# SPDX-License-Identifier: MIT
 
-cpp_httplib_dep = declare_dependency(include_directories: include_directories('.'))
+project(
+  'cpp-httplib',
+  'cpp',
+  license: 'MIT',
+  default_options: [
+    'buildtype=release',
+    'b_ndebug=if-release',
+    'b_lto=true',
+    'warning_level=3'
+  ],
+  meson_version: '>=0.47.0'
+)
+
+# Check just in case downstream decides to edit the source
+# and add a project version
+version = meson.project_version()
+if version == 'undefined'
+  git = find_program('git', required: false)
+  if git.found()
+    result = run_command(git, 'describe', '--tags', '--abbrev=0')
+    if result.returncode() == 0
+      version = result.stdout().strip('v\n')
+    endif
+  endif
+endif
+
+python = import('python').find_installation('python3')
+# If version is still undefined it means that the git method failed
+if version == 'undefined'
+  # Meson doesn't have regular expressions, but since it is implemented
+  # in python we can be sure we can use it to parse the file manually
+  version = run_command(
+      python, '-c', 'import re; raw_version = re.search("User\-Agent.*cpp\-httplib/([0-9]+\.?)+", open("httplib.h").read()).group(0); print(re.search("([0-9]+\\.?)+", raw_version).group(0))'
+  ).stdout().strip()
+endif
+
+message('cpp-httplib version ' + version)
+
+deps = [dependency('threads')]
+args = []
+
+openssl_dep = dependency('openssl', version: ['>=1.1.1', '<1.1.2'], required: get_option('cpp-httplib_openssl'))
+if openssl_dep.found()
+  deps += openssl_dep
+  args += '-DCPPHTTPLIB_OPENSSL_SUPPORT'
+endif
+
+zlib_dep = dependency('zlib', required: get_option('cpp-httplib_zlib'))
+if zlib_dep.found()
+  deps += zlib_dep
+  args += '-DCPPHTTPLIB_ZLIB_SUPPORT'
+endif
+
+brotli_deps = [dependency('libbrotlicommon', required: get_option('cpp-httplib_brotli'))]
+brotli_deps += dependency('libbrotlidec',    required: get_option('cpp-httplib_brotli'))
+brotli_deps += dependency('libbrotlienc',    required: get_option('cpp-httplib_brotli'))
+
+brotli_found_all = true
+foreach brotli_dep : brotli_deps
+  if not brotli_dep.found()
+    brotli_found_all = false
+  endif
+endforeach
+
+if brotli_found_all
+  deps += brotli_deps
+  args += '-DCPPHTTPLIB_BROTLI_SUPPORT'
+endif
+
+cpp_httplib_dep = dependency('', required : false)
+
+if get_option('cpp-httplib_compile')
+  httplib_ch = custom_target(
+    'split',
+    input: 'httplib.h',
+    output: ['httplib.cc', 'httplib.h'],
+    command: [python, files('split.py'), '--out', meson.current_build_dir()],
+    install: true,
+    install_dir: [false, get_option('includedir')]
+  )
+  lib = library(
+    'cpp-httplib',
+    sources: httplib_ch,
+    dependencies: deps,
+    cpp_args: args,
+    version: version,
+    install: true
+  )
+  cpp_httplib_dep = declare_dependency(link_with: lib, sources: httplib_ch[1])
+
+  import('pkgconfig').generate(
+    lib,
+    description: 'A C++ HTTP/HTTPS server and client library',
+    url: 'https://github.com/yhirose/cpp-httplib',
+    version: version
+  )
+else
+  install_headers('httplib.h')
+  cpp_httplib_dep = declare_dependency(include_directories: include_directories('.'), dependencies: deps)
+endif
 
 if meson.version().version_compare('>=0.54.0')
   meson.override_dependency('cpp-httplib', cpp_httplib_dep)

+ 8 - 0
meson_options.txt

@@ -0,0 +1,8 @@
+# SPDX-FileCopyrightText: 2021 Andrea Pappacoda
+#
+# SPDX-License-Identifier: MIT
+
+option('cpp-httplib_openssl',    type: 'feature', value: 'auto', description: 'Enable OpenSSL support')
+option('cpp-httplib_zlib',       type: 'feature', value: 'auto', description: 'Enable zlib support')
+option('cpp-httplib_brotli',     type: 'feature', value: 'auto', description: 'Enable Brotli support')
+option('cpp-httplib_compile',    type: 'boolean', value: false,  description: 'Split the header into a compilable header & source file (requires Python 3)')