libabigail
Loading...
Searching...
No Matches
abg-tools-utils.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2// -*- Mode: C++ -*-
3//
4// Copyright (C) 2013-2026 Red Hat, Inc.
5
6///@file
7
8#ifndef __ABG_TOOLS_UTILS_H
9#define __ABG_TOOLS_UTILS_H
10
11#include <iostream>
12#include <istream>
13#include <memory>
14#include <ostream>
15#include <set>
16#include <string>
17#include "abg-suppression.h"
19
20namespace abigail
21{
22
23namespace tools_utils
24{
25
26using std::ostream;
27using std::istream;
28using std::ifstream;
29using std::string;
30using std::set;
31using std::shared_ptr;
32
33void initialize();
34const char* get_system_libdir();
39
40bool file_exists(const string&);
41bool is_regular_file(const string&);
42bool file_has_dwarf_debug_info(const string& elf_file_path,
43 const vector<string>& debug_info_root_paths);
44bool file_has_ctf_debug_info(const string& elf_file_path,
45 const vector<string>& debug_info_root_paths);
46bool file_has_btf_debug_info(const string& elf_file_path,
47 const vector<string>& debug_info_root_paths);
48bool is_dir(const string&);
49bool dir_exists(const string&);
50bool dir_is_empty(const string &);
51bool decl_names_equal(const string&, const string&);
52bool maybe_get_symlink_target_file_path(const string& file_path,
53 string& target_path);
54bool base_name(string const& path,
55 string& file_name);
56bool dir_name(string const &path,
57 string& path_dir_name,
58 bool keep_separator_at_end=false);
59void real_path(const string&path, string& realpath);
60bool ensure_dir_path_created(const string&);
61bool ensure_parent_dir_created(const string&);
62ostream& emit_prefix(const string& prog_name, ostream& out);
63bool check_file(const string& path, ostream& out, const string& prog_name = "");
64bool check_dir(const string& path, ostream& out, const string& prog_name="");
65bool string_ends_with(const string&, const string&);
66bool string_begins_with(const string&, const string&);
67bool string_is_ascii(const string&);
68bool string_is_ascii_identifier(const string&);
69bool split_string(const string&, const string&, vector<string>&);
70bool string_suffix(const string&, const string&, string&);
71bool string_prefix(const string&, const string&, string&);
72bool sorted_strings_common_prefix(vector<string>&, string&);
75bool execute_command_and_get_output(const string&, vector<string>&);
76void get_comma_separated_args_of_option(const string& input_str,
77 const string& option,
78 vector<string>& arguments);
79bool get_dsos_provided_by_rpm(const string& rpm_path,
80 set<string>& provided_dsos);
81string trim_white_space(const string&);
82bool remove_white_spaces(string&);
83bool normalize_litterals(string&);
84string trim_leading_string(const string& from, const string& to_trim);
85void convert_char_stars_to_char_star_stars(const vector<char*>&,
86 vector<char**>&);
87
89gen_suppr_spec_from_headers(const string& hdrs_root_dir);
90
92gen_suppr_spec_from_headers(const string& hdrs_root_dir,
93 const vector<string>& hdr_files);
94
96gen_suppr_spec_from_headers(const vector<string>& headers_root_dirs,
97 const vector<string>& header_files);
98
101 (const vector<string>& abi_whitelist_paths);
102
103bool
104get_file_path_dirs_under_dir(const string& root_dir, vector<string>& dirs);
105
106bool
107get_vmlinux_path_from_kernel_dist(const string& from,
108 string& vmlinux_path);
109
110bool
111get_binary_paths_from_kernel_dist(const string& dist_root,
112 const string& debug_info_root_path,
113 string& vmlinux_path,
114 vector<string>& module_paths);
115
116bool
117get_binary_paths_from_kernel_dist(const string& dist_root,
118 string& vmlinux_path,
119 vector<string>& module_paths);
120
121bool
122get_file_path_dirs_under_dir(const string& root, vector<string>& dirs);
123
124string
126
127string
129
130void
132
133void
135
136bool
137find_file_under_dir(const string& root_dir,
138 const string& file_path_to_look_for,
139 string& result);
140
141bool
142find_file_under_dirs(const vector<string>& root_dirs,
143 const string& file_path_to_look_for,
144 string& result);
145
146bool
147get_dependencies(const corpus&, const vector<string>&, set<string>&);
148
149void
150add_binaries_into_corpus_group(const fe_iface_sptr& reader,
151 const vector<string>& binaries,
152 const vector<string>& deps_dirs,
153 corpus_group& group);
154
155void
156add_dependencies_into_corpus_group(const fe_iface_sptr& reader,
157 const corpus& korpus,
158 const vector<string>& deps_dirs,
159 corpus_group& group);
160
161corpus_group_sptr
162stick_corpus_and_binaries_into_corpus_group(const fe_iface_sptr& reader,
163 const corpus_sptr& korpus,
164 const vector<string>& binaries,
165 const vector<string>& deps_dirs);
166
167corpus_group_sptr
168stick_corpus_and_dependencies_into_corpus_group(const fe_iface_sptr& reader,
169 const corpus_sptr& korpus,
170 const vector<string>& deps_dirs);
171
172
173class temp_file;
174
175/// Convenience typedef for a shared_ptr to @ref temp_file.
176typedef shared_ptr<temp_file> temp_file_sptr;
177
178/// A temporary file.
179///
180/// This is a helper file around the mkstemp API.
181///
182/// Once the temporary file is created, users can interact with it
183/// using an fstream. They can also get the path to the newly
184/// created temporary file.
185///
186/// When the instance of @ref temp_file is destroyed, the underlying
187/// resources are de-allocated, the underlying temporary file is
188/// closed and removed.
190{
191 struct priv;
192 std::unique_ptr<priv> priv_;
193
194 temp_file();
195
196public:
197
198 bool
199 is_good() const;
200
201 const char*
202 get_path() const;
203
204 std::fstream&
205 get_stream();
206
207 static temp_file_sptr
208 create();
209}; // end class temp_file
210
211size_t
213
214string
216
217/// The different types of files understood the bi* suite of tools.
219{
220 /// A file type we don't know about.
222 /// The native xml file format representing a translation unit.
224 /// An elf file. Read this kind of file should yield an
225 /// abigail::corpus type.
227 /// An archive (AR) file.
229 // A native abixml file format representing a corpus of one or
230 // several translation units.
231 FILE_TYPE_XML_CORPUS,
232 // A native abixml file format representing a corpus group of one or
233 // several corpora.
234 FILE_TYPE_XML_CORPUS_GROUP,
235 /// An RPM (.rpm) binary file
237 /// An SRPM (.src.rpm) file
239 /// A DEB (.deb) binary file
241 /// A plain directory
243 /// A tar archive. The archive can be compressed with the popular
244 /// compression schemes recognized by GNU tar.
246
247 // All non-tared compression scheme go under here. When one of
248 // these is returned, the goal is to look into the uncompressed
249 // stream to get what format has been compressed, then return an
250 // enumerator for that compressed format instead.
251 //
252 // Please note that each time a new enumerator is added here, one
253 // needs to add a corresponding enumerator to the @ref
254 // compression_kind enum in abg-tools-utils.cc and update the
255 // is_compressed_file_type and get_compressed_streambuf functions
256 // accordingly.
257
258 /// The XZ (lzma) compresson scheme.
259
262
263/// Exit status for abidiff and abicompat tools.
264///
265/// It's actually a bit mask. The value of each enumerator is a power
266/// of two.
268{
269 /// This is for when the compared ABIs are equal.
270 ///
271 /// Its numerical value is 0.
273
274 /// This bit is set if there is an application error.
275 ///
276 /// Its numerical value is 1.
278
279 /// This bit is set if the tool is invoked in an non appropriate
280 /// manner.
281 ///
282 /// Its numerical value is 2.
284
285 /// This bit is set if the ABIs being compared are different.
286 ///
287 /// Its numerical value is 4.
289
290 /// This bit is set if the ABIs being compared are different *and*
291 /// are incompatible.
292 ///
293 /// Its numerical value is 8.
296
299
302
305
306bool
308
309bool
311
312bool
314
315/// A type used to time various part of the libabigail system.
316class timer
317{
318 struct priv;
319 std::unique_ptr<priv> priv_;
320
321public:
322 enum kind
323 {
324 /// Default timer kind.
326 /// This kind of timer starts upon instantiation.
328 };
329
331 bool start();
332 bool stop();
333 time_t value_in_seconds() const;
334 bool value(time_t& hours,
335 time_t& minutes,
336 time_t& seconds,
337 time_t& milliseconds) const;
338 string value_as_string() const;
339 ~timer();
340}; //end class timer
341
342ostream& operator<<(ostream&, const timer&);
343
344ostream&
345operator<<(ostream& output, file_type r);
346
347file_type guess_file_type(istream& in);
348
349file_type guess_file_type(const string& file_path,
350 bool look_through_compression = true);
351
352bool
353get_rpm_name(const string& str, string& name);
354
355bool
356get_rpm_arch(const string& str, string& arch);
357
358bool
359get_deb_name(const string& str, string& name);
360
361bool
362file_is_kernel_package(const string& file_path,
364
365bool
366rpm_contains_file(const string& rpm_path,
367 const string& file_name);
368
369bool
370file_is_kernel_debuginfo_package(const string& file_path,
372
373std::shared_ptr<char>
374make_path_absolute(const char*p);
375
376string
377make_path_absolute(const string& p);
378
379corpus_group_sptr
381 const string debug_info_root,
382 const string& vmlinux_path,
383 vector<string>& suppr_paths,
384 vector<string>& kabi_wl_paths,
386 bool verbose,
387 environment& env,
388 const fe_iface::options_type& options,
389 corpus::origin requested_fe_kind = corpus::DWARF_ORIGIN);
390
391corpus_group_sptr
393 const string debug_info_root,
394 const string& vmlinux_path,
395 vector<string>& suppr_paths,
396 vector<string>& kabi_wl_paths,
398 bool verbose,
399 environment& env,
400 corpus::origin requested_fe_kind = corpus::DWARF_ORIGIN);
401
402elf_based_reader_sptr
403create_best_elf_based_reader(const string& elf_file_path,
404 const vector<string>& debug_info_root_paths,
405 environment& env,
406 corpus::origin requested_debug_info_kind,
407 const abigail::fe_iface::options_type& options);
408
409elf_based_reader_sptr
410create_best_elf_based_reader(const string& elf_file_path,
411 const vector<string>& debug_info_root_paths,
412 environment& env,
413 corpus::origin requested_debug_info_kind);
414
415/// This is a custom std::streambuf that knows how to decompress an
416/// input stream that was compressed using xz.
417///
418/// The code was inspired by the example in the source code of the xz
419/// project at
420/// https://github.com/tukaani-project/xz/blob/master/doc/examples/02_decompress.c.
421///
422/// here is an example of how a user code would use this custom
423/// streambuf to decode an xz'ed file and emit its content to stdout.
424///
425/// ifstream input_file("/path/to/a/compressed/file.xz", ifstream::binary);
426/// xz_decompressor_type xzed_streambuf(input_file);
427/// istream input_stream(&xzed_streambuf);
428///
429/// const size_t BUFFER_SIZE = 1024 * 4;
430/// vector<char> decompressed_data(BUFFER_SIZE);
431/// input_stream.read(decompressed_data.data(), BUFFER_SIZE);
432/// size_t nb_bytes_read = input_stream.gcount();
433/// while (nb_bytes_read && !input_stream.bad())
434/// {
435/// for (auto c : decompressed_data)
436/// std::out << c;
437/// input_stream.read(decompressed_data.data(), BUFFER_SIZE);
438/// nb_bytes_read = input_stream.gcount();
439/// }
440/// input_file.close();
441///
442/// Voila.
443class xz_decompressor_type : public std::streambuf
444{
445 struct priv;
446
447 std::unique_ptr<priv> priv_;
448
449 public:
450 xz_decompressor_type(std::istream& xz_istream);
451
453
454 protected:
455
456 int_type
457 underflow() override;
458}; // end class xz_decompressor_type.
459
460}// end namespace tools_utils
461
462/// A macro that expands to aborting the program when executed.
463///
464/// Before aborting, the macro emits informatin about the source
465/// location where it was expanded.
466#define ABG_ASSERT_NOT_REACHED \
467 do { \
468 std::cerr << "in " << __FUNCTION__ \
469 << " at: " << __FILE__ << ":" << __LINE__ \
470 << ": execution should not have reached this point!\n"; \
471 abort(); \
472 } while (false)
473}//end namespace abigail
474
475#endif //__ABG_TOOLS_UTILS_H
This file contains the declarations for an elf-based. DWARF and CTF readers can inherit this one.
origin
This abstracts where the corpus comes from. That is, either it has been read from the native xml form...
Definition abg-corpus.h:121
This is an abstraction of the set of resources necessary to manage several aspects of the internal re...
Definition abg-ir.h:216
std::fstream & get_stream()
Get the fstream to the temporary file.
bool is_good() const
Test if the temporary file has been created and is usable.
static temp_file_sptr create()
Create the temporary file and return it if it's usable.
const char * get_path() const
Return the path to the temporary file.
A type used to time various part of the libabigail system.
~timer()
Destructor of the timer type.
string value_as_string() const
Get the elapsed time as a human-readable string.
time_t value_in_seconds() const
Get the elapsed time in seconds.
bool stop()
Stop the timer.
bool start()
Start the timer.
@ START_ON_INSTANTIATION_TIMER_KIND
This kind of timer starts upon instantiation.
@ DEFAULT_TIMER_KIND
Default timer kind.
bool value(time_t &hours, time_t &minutes, time_t &seconds, time_t &milliseconds) const
Get the elapsed time in hour:minutes:seconds:milliseconds.
This is a custom std::streambuf that knows how to decompress an input stream that was compressed usin...
~xz_decompressor_type()
Destructor of the xz_decompressor_type class.
int_type underflow() override
The implementation of the virtual protected std:streambuf::underflow method. This method is invoked b...
vector< suppression_sptr > suppressions_type
Convenience typedef for a vector of suppression_sptr.
Definition abg-fwd.h:1734
shared_ptr< type_suppression > type_suppression_sptr
Convenience typedef for a shared pointer to type_suppression.
bool check_file(const string &path, ostream &out, const string &prog_name)
Check if a given path exists and is readable.
bool rpm_contains_file(const string &rpm_path, const string &file_name)
Test if an RPM package contains a given file.
string get_default_system_suppression_file_path()
Get the path to the default system suppression file.
type_suppression_sptr gen_suppr_spec_from_headers(const vector< string > &headers_root_dirs, const vector< string > &header_files)
Generate a type suppression specification that suppresses ABI changes for types defined in source fil...
bool split_string(const string &input_string, const string &delims, vector< string > &result)
Split a given string into substrings, given some delimiters.
bool string_ends_with(const string &str, const string &suffix)
Test if a given string ends with a particular suffix.
bool find_file_under_dir(const string &root_dir, const string &file_path_to_look_for, string &result)
Find a given file under a root directory and return its absolute path.
bool string_is_ascii(const string &str)
Test if a string is made of ascii characters.
ostream & emit_prefix(const string &prog_name, ostream &out)
Emit a prefix made of the name of the program which is emitting a message to an output stream.
bool dir_name(string const &path, string &dir_name, bool keep_separator_at_end)
Return the directory part of a file path.
bool base_name(string const &path, string &file_name)
Return the file name part of a file part.
shared_ptr< temp_file > temp_file_sptr
Convenience typedef for a shared_ptr to temp_file.
bool get_vmlinux_path_from_kernel_dist(const string &from, string &vmlinux_path)
Get the path of the vmlinux binary under the given directory, that must have been generated either fr...
bool normalize_litterals(string &str)
Normalize the numerical litteral in a string.
bool remove_white_spaces(string &str)
Remove white spaces from a string.
void initialize()
This function needs to be called before any libabigail function.
void load_default_user_suppressions(suppr::suppressions_type &supprs)
Load the default user suppression specification file and populate a vector of suppression_sptr with i...
const char * get_anonymous_subrange_internal_name_prefix()
Getter of the prefix for the name of anonymous range.
bool get_file_path_dirs_under_dir(const string &root_dir, vector< string > &dirs)
Get all the sub-directories (which contain a regular file) of a given directory.
const char * get_anonymous_enum_internal_name_prefix()
Getter of the prefix for the name of anonymous enums.
std::shared_ptr< char > make_path_absolute(const char *p)
Return a copy of the path given in argument, turning it into an absolute path by prefixing it with th...
const char * get_anonymous_struct_internal_name_prefix()
Getter of the prefix for the name of anonymous structs.
string trim_white_space(const string &str)
Remove spaces at the beginning and at the end of a given string.
corpus_group_sptr stick_corpus_and_binaries_into_corpus_group(const fe_iface_sptr &reader, const corpus_sptr &korpus, const vector< string > &binaries, const vector< string > &bins_dirs)
Create a corpus group made of a given korpus and a set of binaries found in a set of directories.
bool check_dir(const string &path, ostream &out, const string &prog_name)
Check if a given path exists, is readable and is a directory.
const char * get_anonymous_union_internal_name_prefix()
Getter of the prefix for the name of anonymous unions.
bool string_begins_with(const string &str, const string &prefix)
Test if a given string begins with a particular prefix.
bool abidiff_status_has_incompatible_abi_change(abidiff_status s)
Test if an instance of.
const char * get_system_libdir()
Get the value of $libdir variable of the autotools build system. This is where shared libraries are u...
bool get_binary_paths_from_kernel_dist(const string &dist_root, const string &debug_info_root_path, string &vmlinux_path, vector< string > &module_paths)
Get the paths of the vmlinux and kernel module binaries under given directory.
bool get_dependencies(const corpus &korpus, const vector< string > &deps_dirs, set< string > &dependencies)
Get the dependencies of an ABI corpus, which are found in a set of directories. Note that the depende...
bool get_dsos_provided_by_rpm(const string &rpm_path, set< string > &provided_dsos)
Get the SONAMEs of the DSOs advertised as being "provided" by a given RPM. That set can be considered...
bool ensure_dir_path_created(const string &dir_path)
Ensures #dir_path is a directory and is created. If #dir_path is not created, this function creates i...
bool get_rpm_name(const string &str, string &name)
Get the package name of an rpm package.
bool execute_command_and_get_output(const string &cmd, vector< string > &lines)
Execute a shell command and returns its output.
abidiff_status & operator|=(abidiff_status &l, abidiff_status r)
The |= operator.
bool is_dir(const string &path)
Tests if a given path is a directory or a symbolic link to a directory.
suppressions_type gen_suppr_spec_from_kernel_abi_whitelists(const std::vector< std::string > &abi_whitelist_paths)
Generate a suppression specification from kernel abi whitelist files.
bool find_file_under_dirs(const vector< string > &root_dirs, const string &file_path_to_look_for, string &result)
Find a given file possibly under a set of directories and return its absolute path.
bool dir_exists(const string &path)
Test that a given directory exists.
bool string_is_ascii_identifier(const string &str)
Test if a string is made of ascii characters which are identifiers acceptable in C or C++ programs.
ostream & operator<<(ostream &o, const timer &t)
Streaming operator for the timer type.
bool file_is_kernel_package(const string &file_path, file_type file_type)
Tests if a given file name designates a kernel package.
abidiff_status operator|(abidiff_status l, abidiff_status r)
The bitwise 'OR' operator for abidiff_status bit masks.
bool file_has_dwarf_debug_info(const string &elf_file_path, const vector< string > &debug_info_root_paths)
Test if an ELF file has DWARF debug info.
string get_library_version_string()
Return the version string of the library.
bool dir_is_empty(const string &path)
Test if a given directory exists and is empty.
bool abidiff_status_has_abi_change(abidiff_status s)
Test if an instance of.
bool abidiff_status_has_error(abidiff_status s)
Test if an instance of.
bool get_deb_name(const string &str, string &name)
Get the package name of a .deb package.
elf_based_reader_sptr create_best_elf_based_reader(const string &elf_file_path, const vector< string > &debug_info_root_paths, environment &env, corpus::origin requested_fe_kind, const abigail::fe_iface::options_type &options)
Create the best elf based reader (or front-end), given an ELF file.
bool maybe_get_symlink_target_file_path(const string &file_path, string &target_path)
If a given file is a symbolic link, get the canonicalized absolute path to the target file.
abidiff_status
Exit status for abidiff and abicompat tools.
@ ABIDIFF_ABI_INCOMPATIBLE_CHANGE
This bit is set if the ABIs being compared are different *and* are incompatible.
@ ABIDIFF_ABI_CHANGE
This bit is set if the ABIs being compared are different.
@ ABIDIFF_USAGE_ERROR
This bit is set if the tool is invoked in an non appropriate manner.
@ ABIDIFF_ERROR
This bit is set if there is an application error.
@ ABIDIFF_OK
This is for when the compared ABIs are equal.
bool is_regular_file(const string &path)
Test if path is a path to a regular file or a symbolic link to a regular file.
bool file_has_ctf_debug_info(const string &elf_file_path, const vector< string > &debug_info_root_paths)
Test if an ELF file has CTF debug info.
bool file_has_btf_debug_info(const string &elf_file_path, const vector< string > &debug_info_root_paths)
Test if an ELF file has BTFG debug info.
bool file_exists(const string &path)
Tests whether a path exists;.
file_type
The different types of files understood the bi* suite of tools.
@ FILE_TYPE_RPM
An RPM (.rpm) binary file.
@ FILE_TYPE_NATIVE_BI
The native xml file format representing a translation unit.
@ FILE_TYPE_XZ
The XZ (lzma) compresson scheme.
@ FILE_TYPE_ELF
An elf file. Read this kind of file should yield an abigail::corpus type.
@ FILE_TYPE_DEB
A DEB (.deb) binary file.
@ FILE_TYPE_UNKNOWN
A file type we don't know about.
@ FILE_TYPE_TAR
A tar archive. The archive can be compressed with the popular compression schemes recognized by GNU t...
@ FILE_TYPE_DIR
A plain directory.
@ FILE_TYPE_AR
An archive (AR) file.
@ FILE_TYPE_SRPM
An SRPM (.src.rpm) file.
bool string_prefix(const string &input_string, const string &suffix, string &prefix)
Get the prefix of a string, given a suffix to consider.
bool string_suffix(const string &input_string, const string &prefix, string &suffix)
Get the suffix of a string, given a prefix to consider.
void add_binaries_into_corpus_group(const fe_iface_sptr &reader, const vector< string > &binaries, const vector< string > &deps_dirs, corpus_group &group)
For each binary of a vector of binaries, if the binary is present in at least one of the directories ...
bool ensure_parent_dir_created(const string &path)
Ensures that the parent directory of #path is created.
void convert_char_stars_to_char_star_stars(const vector< char * > &char_stars, vector< char ** > &char_star_stars)
Convert a vector<char*> into a vector<char**>.
corpus_group_sptr build_corpus_group_from_kernel_dist_under(const string &root, const string debug_info_root, const string &vmlinux_path, vector< string > &suppr_paths, vector< string > &kabi_wl_paths, suppressions_type &supprs, bool verbose, environment &env, const fe_iface::options_type &options, corpus::origin requested_fe_kind)
Walk a given directory and build an instance of corpus_group from the vmlinux kernel binary and the l...
bool sorted_strings_common_prefix(vector< string > &input_strings, string &prefix)
Find the prefix common to a *SORTED* vector of strings.
void get_comma_separated_args_of_option(const string &input_str, const string &option, vector< string > &arguments)
Get a vector of arguments from a string containing a comma-separated list of those arguments.
void real_path(const string &path, string &result)
Return the real path of a given path.
abidiff_status operator&(abidiff_status l, abidiff_status r)
The bitwise 'AND' operator for abidiff_status bit masks.
void add_dependencies_into_corpus_group(const fe_iface_sptr &reader, const corpus &korpus, const vector< string > &deps_dirs, corpus_group &group)
For each dependency of a given corpus, if it is present in at least one of the directories listed in ...
bool file_is_kernel_debuginfo_package(const string &file_name, file_type file_type)
Tests if a given file name designates a kernel debuginfo package.
void load_default_system_suppressions(suppr::suppressions_type &supprs)
Load the default system suppression specification file and populate a vector of suppression_sptr with...
string get_abixml_version_string()
Return the version string for the ABIXML format.
string get_random_number_as_string()
Get a pseudo random number as string.
bool decl_names_equal(const string &l, const string &r)
Compare two fully qualified decl names by taking into account that they might have compontents that a...
bool get_rpm_arch(const string &str, string &arch)
Get the architecture string from the NVR of an rpm.
string get_default_user_suppression_file_path()
Get the path to the default user suppression file.
string trim_leading_string(const string &from, const string &to_trim)
Remove a string of pattern in front of a given string.
corpus_group_sptr stick_corpus_and_dependencies_into_corpus_group(const fe_iface_sptr &reader, const corpus_sptr &korpus, const vector< string > &deps_dirs)
Create a corpus group made of a given korpus and the subset of its dependencies that can be found fou...
size_t get_random_number()
Get a pseudo random number.
Toplevel namespace for libabigail.
The generic options that control the behaviour of all Front-End interfaces.