cppdep
performs dependency analyses
among components/packages/package groups of a large C/C++ project.
This is a rewrite of dep_utils(adep/cdep/ldep)
,
which is provided by John Lakos' book
"Large-Scale C++ Software Design", Addison Wesley (1996).
- Rewrite in Python, unifying
adep/cdep/ldep
into one tool - Single configuration file (
yaml
file) - No file alias support for the archaic file-name length limitations
- An extended notion of Component (header- or source-only)
- Support for multiple packages and package groups
- Support for exporting final dependency graph to Graphviz dot format
- Indirect extern declarations of global variables or functions instead of including the proper component header with the declarations.
- Embedded dynamic dependencies, such as dynamic loading and configurable internal services.
- Preprocessing or macro expansion is not performed. Dependency inclusion via preprocessor meta-programming is not handled.
- Dependency exclusion with C style multi-line comments or macros is not respected.
The dependencies can be installed with pip
.
$ sudo pip install networkx pydotplus PyYAML PyKwalify
The latest stable release from PyPi:
$ sudo pip install cppdep
Create a configuration file
that describes the project for analysis.
config_example.yml
and config_schema.yml
are given for guidance.
In the root directory of the project with the configuration file, run the following command to generate dependency analysis reports and graphs.
$ cppdep -c /path/to/config/file
To view the generated graph dot files without converting to other formats.
$ xdot graph.dot
Here's how to convert a Graphviz dot file to PDF format.
$ dot -Tpdf graph1.dot -o graph1.pdf
Apply -O
flag to automatically generate output file names from the input file names.
$ dot -T pdf graph1.dot -O # The output file is graph1.dot.pdf
To run dot
on files in directories and sub-directories recursively.
$ find -type f -name "*.dot" directory_path | xargs dot -Tpdf -O
To create output file names without .dot
in the name.
$ find -type f -name "*.dot" directory_path -exec sh -c 'dot -Tpdf "${0}" -o "${0%.*}.pdf"' {} \;
- The last known location of John Lakos'
dep_utils
source code: http://www-numi.fnal.gov/computing/d120/releases/R2.2/Dependency/ - Experimental packaging of
dep_utils
source code: https://sourceforge.net/projects/introspector/files/lsc-large-scale-c/first-release/ - Nmdepend, a lightweight 'link-time' dependency analyzer for C++ using object files and libraries instead of source-code as input.
- John Lakos for inventing the analysis and providing
dep_utils
. - Zhichang Yu for rewriting
dep_utils
into Python.