Files
libdwarf-code/meson.build
David Anderson c64505d4d8 We use meson to build for regression testing
so we add a new option regressiontesting
for build time control (needed for Msys2 builds)
	modified:   meson.build
Looks for option regressiontesting so
we can have the build for regression testing
do as we require (Msys2)
	modified:   meson_options.txt
2025-08-27 16:16:37 -07:00

339 lines
8.8 KiB
Meson

project('libdwarf', ['c','cpp'],
version: '2.2.0',
default_options : [
'buildtype=debugoptimized',
'warning_level=3',
],
meson_version : '>=0.54'
)
# version 0.56 is the first version with project_source_root and
# project_build_root. We use meson.current_source_dir() and
# meson.current_build_dir() (and read these before
# meson knows of other directories) to avoid meson.build_root()
# meson.source_root() and avoid requring 0.56. Ubuntu 20.04,
# for example, uses meson 0.53.
# meson file system module
fs = import('fs')
v_arr = meson.project_version().split('.')
v_maj = v_arr[0]
v_min = v_arr[1]
v_mic = v_arr[2]
lib_type = get_option('default_library')
# install paths
dir_prefix = get_option('prefix')
dir_include = join_paths(dir_prefix, get_option('includedir'))
dir_pkginclude = join_paths(dir_include, meson.project_name())
dir_bin = join_paths(dir_prefix, get_option('bindir'))
dir_lib = join_paths(dir_prefix, get_option('libdir'))
dir_data = join_paths(dir_prefix, get_option('datadir'))
dir_pkgdata = join_paths(dir_data, meson.project_name())
dir_locale = join_paths(dir_prefix, get_option('localedir'))
# host
windows = import('windows')
host_os = host_machine.system()
windows = ['windows', 'cygwin']
#bsd for meson 0.46 and 0.47
bsd = ['bsd', 'freebsd', 'dragonfly', 'netbsd', 'openbsd']
linux = ['linux']
osx = ['darwin']
sun = ['sunos']
sys_linux = linux.contains(host_machine.system())
sys_bsd = bsd.contains(host_machine.system())
sys_windows = windows.contains(host_machine.system())
sys_osx = osx.contains(host_machine.system())
sys_sun = sun.contains(host_machine.system())
# compiler
cc = meson.get_compiler('c')
cpp = meson.get_compiler('cpp')
dev_cflags = []
dev_cppflags = []
dev_cppflags_onlylibdwarf = []
dev_ldflags = []
# -D_GNU_SOURCE is needed as otherwise
# certain gcc options (such as -std=c99 )
# will prevent building because strdup()
# in string.h will be invisible.
dev_cflags_try = [
'-Wpointer-arith',
'-Wmissing-declarations',
'-Wstrict-prototypes',
'-Wcomment',
'-Wformat',
'-Wuninitialized',
'-Wshadow',
'-Wno-long-long',
'-Wfloat-compare',
'-Wsign-compare',
'-Wno-missing-field-initializers',
'-fno-omit-frame-pointer',
'-D_GNU_SOURCE'
]
sanitize_flags_try = [
'-fsanitize=address',
'-fsanitize=leak',
'-fsanitize=undefined'
]
if sys_windows
if cc.get_id() != 'msvc'
dev_cflags_try += '-Wno-pedantic-ms-format'
endif
else
dev_cflags_try += '-fvisibility=hidden'
endif
foreach cf: dev_cflags_try
if cc.has_argument(cf)
dev_cflags += cf
endif
if get_option('dwarfgen') == true
if cpp.has_argument(cf)
dev_cppflags += cf
endif
endif
endforeach
dev_speciallibdwarfmalloc = get_option('libdwarfspecialmalloc')
if dev_speciallibdwarfmalloc
dev_cppflags_onlylibdwarf += '-DLIBDWARF_MALLOC'
endif
#if fs.isdir('/usr/local/include')
# dev_cflags += '-I/usr/local/include'
#endif
#if fs.isdir('/opt/local/include')
# dev_cflags += '-I/opt/local/include'
#endif
dwarf_link_args = []
dev_sanitize = get_option('sanitize')
if dev_sanitize
foreach cf: sanitize_flags_try
if cc.has_argument(cf)
dev_cflags += cf
dwarf_link_args += cf
endif
endforeach
endif
dev_decompression = get_option('decompression')
libdwarf_args = [ '-D__USE_MINGW_ANSI_STDIO=0' ]
if cc.get_id() == 'msvc'
libdwarf_args += [ '-D_CRT_NONSTDC_NO_WARNINGS']
endif
config_dir = [include_directories('.')]
# configuration
# For msys2 regressiontesting, and only that.
dev_regressiontesting = get_option('regressiontesting')
if dev_regressiontesting
dev_cflags += ['-DDWREGRESSIONTEMP']
endif
buildmmap = get_option('buildmmap')
mmapresult = false
# sys/stat.h is for dwarfgen.
# sys/mman.h is for mmap() and sysconf()
header_checks = [
'unistd.h',
'sys/types.h',
'malloc.h',
'stdint.h',
'inttypes.h',
'stddef.h',
'fcntl.h',
'sys/stat.h',
'stdafx.h',
]
if sys_windows == false
header_checks += 'unistd.h'
endif
if buildmmap == true
header_checks += 'sys/mman.h'
endif
config_h = configuration_data()
config_h.set_quoted('PACKAGE_NAME', meson.project_name())
config_h.set_quoted('PACKAGE_VERSION', meson.project_version())
config_h.set_quoted('PROJECT_VERSION', meson.project_version())
config_h.set_quoted('PACKAGE_BIN_DIR', dir_bin)
config_h.set_quoted('PACKAGE_LIB_DIR', dir_lib)
config_h.set_quoted('PACKAGE_DATA_DIR', dir_data)
config_h.set_quoted('LOCALEDIR', dir_locale)
if host_machine.endian() == 'big'
config_h.set10('WORDS_BIGENDIAN', true)
endif
if cc.has_function_attribute('unused') == true
config_h.set10('HAVE_UNUSED_ATTRIBUTE', true)
endif
if cc.has_function('setlocale') == true
if cc.has_function('nl_langinfo') == true
config_h.set10('HAVE_UTF8', true)
endif
endif
foreach header : header_checks
if cc.has_header(header)
config_h.set10('HAVE_'+header.underscorify().to_upper(), true)
endif
endforeach
foreach t : [ 'uint64_t', 'uintptr_t', 'intptr_t' ]
if not cc.has_type(t, prefix: '#include <stdint.h>')
error('Sanity check failed: type @0@ not provided via stdint.h'.format(t))
endif
endforeach
code = '''
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
int main()
{
long pagesize = sysconf(_SC_PAGESIZE);
int fd = 4;
mmap(0, 100,PROT_READ|PROT_WRITE,MAP_PRIVATE,
fd,100);
munmap((void *)100,100);
return 0;
}'''
### or use compiler.links?
if get_option('buildmmap') == true
mmapresult = cc.compiles(code,name: 'mmap check')
if mmapresult
config_h.set10('HAVE_FULL_MMAP',true)
endif
endif
# Do this early so we have the base source and build directory names
# for this and test/meson.build
project_source_base_root = meson.current_source_dir()
project_build_base_root = meson.current_build_dir()
subdir('src/lib/libdwarf')
subdir('src/bin/dwarfdump')
have_libdwarfp = false
if get_option('dwarfgen') == true
subdir('src/lib/libdwarfp')
subdir('src/bin/dwarfgen')
have_libdwarfp = true
endif
subdir('src/bin/attr_form')
subdir('src/bin/buildopstab')
subdir('src/bin/builduritable')
subdir('src/bin/gennames')
subdir('src/bin/tag_attr')
subdir('src/bin/tag_tree')
if get_option('dwarfexample') == true
subdir('src/bin/dwarfexample')
endif
subdir('doc')
configure_file(
input: 'src/bin/dwarfdump/dwarfdump.conf',
output: 'dwarfdump.conf',
copy: true
)
subdir('test')
# Use config_h after all subdirs have set values
#configure_file(output : 'config.h', configuration : config_h)
# pkg-config files
pkgconf = configuration_data()
pkgconf.set('prefix', get_option('prefix'))
pkgconf.set('exec_prefix', '${prefix}')
pkgconf.set('libdir', join_paths('${prefix}','@0@'.format(get_option('libdir'))))
pkgconf.set('includedir', join_paths('${prefix}','@0@'.format(get_option('includedir'))))
pkgconf.set('pkgincludedir', join_paths('${prefix}','@0@'.format(get_option('includedir')),'/libdwarf'))
pkgconf.set('VMAJ', v_maj)
pkgconf.set('PACKAGE_VERSION', meson.project_version())
pkgconf.set('PROJECT_VERSION', meson.project_version())
if dev_decompression
pkgconf.set('requirements_libdwarf_pc', 'zlib')
pkgconf.set('requirements_libdwarf_pc', 'libzstd')
endif
pkgconf.set('requirements_libdwarf_libs', '')
pkg_install_dir = '@0@/pkgconfig'.format(get_option('libdir'))
configure_file(
input : join_paths(project_source_base_root, 'libdwarf.pc.in'),
output : 'libdwarf.pc',
configuration : pkgconf,
install_dir : pkg_install_dir
)
# output
# Use config_h after all subdirs have set values
configure_file(output : 'config.h', configuration : config_h)
libdwarf_output = ('always')
if dev_decompression
libdwarf_output = 'always (zlib: ' + (zlib_deps.found() ? 'yes' : 'no') + ')'
libdwarf_output += ' always (libzstd: ' + (libzstd_deps.found() ? 'yes' : 'no') + ')'
endif
libdwarfp_output = (have_libdwarfp ? 'yes' : 'no')
summary({'OS': host_os,
'BuildOS-BigEndian': host_machine.endian() == 'big' ? 'yes' : 'no',
'libdwarf': libdwarf_output,
'dwarfdump': 'always',
'libdwarfp': libdwarfp_output,
'dwarfgen': have_libdwarfp ? 'yes' : 'no',
'dwarfexample': get_option('dwarfexample') ? 'yes' : 'no',
'documentation': have_doc,
}, section: 'Configuration Options Summary:')
summary({'zlib': (zlib_deps.found() ? 'yes' : 'no'),
'libzstd': (libzstd_deps.found() ? 'yes' : 'no'),
}, section: 'Referenced Libraries:')
summary({'mmap available': (mmapresult ? 'yes' : 'no'),
}, section: 'Optional Features:')
summary({'prefix': dir_prefix,
'bindir': dir_bin,
'libdir': dir_lib,
'incdir': dir_include,
'pkgincdir': dir_pkginclude,
'datadir': dir_data,
'pkgdatadir': dir_pkgdata,
}, section: 'Directories:')
summary({'compilation': 'ninja',
'installation': 'ninja install',
'Cflags': dev_cflags,
}, section: 'Compilation')