Skip to content

Commit

Permalink
libdwarf: new wrap
Browse files Browse the repository at this point in the history
Signed-off-by: Julia DeMille <[email protected]>
  • Loading branch information
judemille committed Mar 21, 2024
1 parent 465ffd3 commit 1e5c756
Show file tree
Hide file tree
Showing 8 changed files with 610 additions and 0 deletions.
8 changes: 8 additions & 0 deletions ci_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,14 @@
"libpciaccess-dev"
]
},
"libdwarf": {
"_comment": "- provides both dwarfgen and libdwarfp",
"build_options": [
"libdwarf:dwarfgen=true"
],
"_comment": "- tests are broken on meson, will make a PR to fix -- @judemille",
"skip_tests": "true"
},
"libffi": {
"_comment": "libffi has too many unit tests and it exceed command line limit to rebuild test targets",
"test_options": [
Expand Down
13 changes: 13 additions & 0 deletions releases.json
Original file line number Diff line number Diff line change
Expand Up @@ -1456,6 +1456,19 @@
"2.4.110-1"
]
},
"libdwarf": {
"dependency_names": [
"libdwarf",
"libdwarfp"
],
"program_names": [
"dwarfdump",
"dwarfgen"
],
"versions": [
"0.9.1-1"
]
},
"libebml": {
"dependency_names": [
"libebml"
Expand Down
10 changes: 10 additions & 0 deletions subprojects/libdwarf.wrap
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[wrap-file]
directory = libdwarf-0.9.1
source_url = https://www.prevanders.net/libdwarf-0.9.1.tar.xz
source_filename = libdwarf-0.9.1.tar.xz
source_hash = 877e81b189edbb075e3e086f6593457d8353d4df09b02e69f3c0c8aa19b51bf4
patch_directory = libdwarf

[provide]
dependency_names = libdwarf, libdwarfp
program_names = dwarfdump, dwarfgen
270 changes: 270 additions & 0 deletions subprojects/packagefiles/libdwarf/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
project('libdwarf', ['c','cpp'],
version: '0.9.1',
default_options : ['buildtype=debugoptimized',
'warning_level=3', 'werror=true'],
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_ldflags = []

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'
]
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

#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

# sys/stat.h is for dwarfgen.
header_checks = [
'fcntl.h',
'inttypes.h',
'malloc.h',
'stdint.h',
'sys/stat.h',
]

if sys_windows == false
header_checks += 'unistd.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('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

# 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')
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', '${prefix}/@0@'.format(get_option('libdir')))
pkgconf.set('includedir', '${prefix}/@0@'.format(get_option('includedir')))
pkgconf.set('pkgincludedir', '${prefix}/@0@'.format(get_option('includedir')) + '/libdwarf')
pkgconf.set('VMAJ', v_maj)
pkgconf.set('PACKAGE_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({'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',
}, section: 'Compilation')
75 changes: 75 additions & 0 deletions subprojects/packagefiles/libdwarf/src/bin/dwarfdump/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@

dwarfdump_src = [
'dd_addrmap.c',
'dd_attr_form.c',
'dd_canonical_append.c',
'dd_checkutil.c',
'dd_command_options.c',
'dd_common.c',
'dd_compiler_info.c',
'dd_regex.c',
'dd_safe_strcpy.c',
'dwarfdump.c',
'dd_tsearchbal.c',
'dd_dwconf.c',
'dd_getopt.c',
'dd_esb.c',
'dd_glflags.c',
'dd_helpertree.c',
'dd_macrocheck.c',
'dd_makename.c',
'dd_naming.c',
'dd_opscounttab.c',
'print_abbrevs.c',
'print_aranges.c',
'print_debugfission.c',
'print_die.c',
'print_debug_addr.c',
'print_debug_gnu.c',
'print_debug_names.c',
'print_debug_sup.c',
'print_frames.c',
'print_gdbindex.c',
'print_hipc_lopc_attr.c',
'print_lines.c',
'print_llex_codes.c',
'print_origloclist_codes.c',
'print_loclists.c',
'print_loclists_codes.c',
'print_macinfo.c',
'print_macro.c',
'print_pubnames.c',
'print_ranges.c',
'print_rnglists.c',
'print_section_groups.c',
'print_sections.c',
'print_str_offsets.c',
'print_strings.c',
'print_tag_attributes_usage.c',
'dd_sanitized.c',
'dd_strstrnocase.c',
'dd_true_section_name.c',
'dd_uri.c',
'dd_utf8.c'
]

pkgdwarfdump = join_paths(dir_data, 'dwarfdump')
dwarfdump_args = [ '-DCONFPREFIX=' + pkgdwarfdump ]

if (lib_type == 'static')
dwarfdump_args += ['-DLIBDWARF_STATIC']
endif

dwarfdump_exe = executable('dwarfdump', dwarfdump_src,
c_args : [ dev_cflags, libdwarf_args, dwarfdump_args ],
link_args : dwarf_link_args ,
dependencies : libdwarf,
include_directories : config_dir,
install : true
)

meson.override_find_program('dwarfdump', dwarfdump_exe)

install_data('dwarfdump.conf',
install_dir : pkgdwarfdump
)
Loading

0 comments on commit 1e5c756

Please sign in to comment.