Add meson
Tested: Built and verified that unit test passes
Signed-off-by: Brandon Kim <brandonkim@google.com>
Change-Id: I37a4e99f725f771b3f0861e0e724f2e4c66d1adf
diff --git a/.gitignore b/.gitignore
index 65cf1e9..d2762e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,3 +51,7 @@
ipmiblob.pc
# Output binaries
+### Meson ###
+# build directory
+build*/*
+
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..f2e6dcc
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,16 @@
+project(
+ 'ipmiblob',
+ 'cpp',
+ version: '0.1',
+ meson_version: '>=0.61.3',
+ default_options: [
+ 'cpp_std=c++20',
+ 'werror=true',
+ 'warning_level=3',
+ 'tests=' + (meson.is_subproject() ? 'disabled' : 'auto'),
+ ])
+
+subdir('src')
+if not get_option('tests').disabled()
+ subdir('test')
+endif
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000..0fc2767
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1 @@
+option('tests', type: 'feature', description: 'Build tests')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 0000000..52f6733
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,45 @@
+ipmiblob_incs = include_directories('.')
+
+install_headers(
+ 'ipmiblob/crc.hpp',
+ 'ipmiblob/blob_errors.hpp',
+ 'ipmiblob/blob_interface.hpp',
+ 'ipmiblob/blob_handler.hpp',
+ 'ipmiblob/ipmi_interface.hpp',
+ 'ipmiblob/ipmi_handler.hpp',
+ subdir: 'ipmiblob')
+
+install_headers(
+ 'ipmiblob/internal/sys.hpp',
+ 'ipmiblob/internal/sys_interface.hpp',
+ subdir: 'ipmiblob/internal')
+
+install_headers(
+ 'ipmiblob/test/blob_interface_mock.hpp',
+ 'ipmiblob/test/crc_mock.hpp',
+ 'ipmiblob/test/ipmi_interface_mock.hpp',
+ subdir: 'ipmiblob/test')
+
+ipmiblob_lib = library(
+ 'ipmiblob',
+ 'ipmiblob/blob_handler.cpp',
+ 'ipmiblob/crc.cpp',
+ 'ipmiblob/ipmi_handler.cpp',
+ 'ipmiblob/internal/sys.cpp',
+ include_directories : ipmiblob_incs,
+ implicit_include_directories: false,
+ version: meson.project_version(),
+ install: true,
+ install_dir: get_option('libdir')
+)
+
+ipmiblob = declare_dependency(
+ include_directories: ipmiblob_incs,
+ link_with: ipmiblob_lib
+)
+
+import('pkgconfig').generate(
+ ipmiblob_lib,
+ name: 'ipmiblob',
+ version: meson.project_version(),
+ description: 'ipmiblob')
diff --git a/test/meson.build b/test/meson.build
new file mode 100644
index 0000000..185946a
--- /dev/null
+++ b/test/meson.build
@@ -0,0 +1,31 @@
+gtest = dependency('gtest', main: true, disabler: true, required: get_option('tests'))
+gmock = dependency('gmock', disabler: true, required: get_option('tests'))
+
+if not gtest.found() or not gmock.found()
+ gtest_proj = import('cmake').subproject('googletest', required: false)
+ if gtest_proj.found()
+ gtest = declare_dependency(
+ dependencies: [
+ gtest_proj.dependency('gtest'),
+ gtest_proj.dependency('gtest_main'),
+ ])
+ gmock = gtest_proj.dependency('gmock')
+ else
+ assert(not get_option('tests').enabled(), 'Googletest is required')
+ endif
+endif
+
+gtests = [
+ 'crc',
+ 'tools_blob',
+ 'tools_ipmi_error',
+ 'tools_ipmi',
+]
+
+foreach t : gtests
+ test(t, executable(t.underscorify(), t + '_unittest.cpp',
+ build_by_default: false,
+ implicit_include_directories: false,
+ dependencies: [ipmiblob, gtest, gmock]))
+endforeach
+