GithubHelp home page GithubHelp logo

sensiblecodeio / pdf2msgpack Goto Github PK

View Code? Open in Web Editor NEW
11.0 3.0 1.0 1.44 MB

Efficiently export PDF content in an easily machine readable format

License: GNU General Public License v2.0

Makefile 0.49% Python 3.16% C 10.51% C++ 37.41% Shell 0.45% Ruby 0.72% Go 42.98% Dockerfile 4.29%
pdf msgpack poppler

pdf2msgpack's Introduction

About

pdf2msgpack is designed to efficiently dump information from a PDF in a portable format which is easy to consume without heavyweight PDF libraries.

At the moment it dumps glyphs (a rectangle and text) and path information.

pdf2msgpack is Alpha Software

pdf2msgpack is used internally at The Sensible Code company. It's still quite young and the output might change significantly.

Installation

To configure and build, run:

./waf configure
./waf build

There is an accompanying docker file which enables building a static binary.

To build the static binary, just ensure submodules are checked out and invoke make.

git submodule update --init
make

Running

./pdf2msgpack <pdf-file>

Output

pdf2msgpack writes its output to msgpack, which is a convenient, fast serialization format with libraries available in many languages.

Here is a description of the wire format.

At the top level the document is not a list but consecutive objects written to the stream.

document (consecutive objects): <wire version : int> <metadata> <page>...

metadata (dict): {
  "Pages": int,
  "FileName": str,
  "XFA": dict,
  "EmbeddedFiles": [<embedfile>...],
  "FontInfo": [<fontinfo : dict>...],
  (other string fields supplied in PDF),
}

page (dict): {
  "Size": [<width : int>, <height : int>],
  "Glyphs": [<glyph>...],
  "Paths": [<pathitem>...],
  "Bitmap": [ [<width : int>, <height : int>], <pixeldata : uint8> ]
}

embedfile (list):
  [ <name : str>, <description : str>, <mime-type : str>,
    <created-date : str>, <modified-date : str>, <content : bin>]

pathitem (list): [<type : (EO_FILL|STROKE|FILL|SET_STROKE_COLOR|
                           SET_STROKE_WIDTH|SET_FILL_COLOR)>,
                  [<pathdata>...]]

pathdata (list): depending on pathitem type
  EO_FILL, FILL, STROKE: pathcoord
  SET_FILL_COLOR: [<r : uint8>, <g : uint8>, <b : uint8>]
  SET_STROKE_WIDTH: <width : float>

pathcoord (2 list or 6 list):
  point: [<x : float>, <y : float>]
  quadratic curve: [<a : float>, <b : float>, <c : float>, <d : float>, <e : float>, <f : float>]

fontinfo (dict): {<Name> <Type> <Encoding> <Embedded> <Subset> <ToUnicode>}

Options

Some of the options affect the wire format generated by the command.

  • --meta-only: changes document to skip generation of page objects.
  • --bitmap: generate grayscale bitmap in page object (otherwise absent)
  • --xfa: generate XML Forms Architecture (XFA) data in metadata object (otherwise nil)
  • --embedded-files: generate embedded files in metadata object (otherwise nil)

Licence

pdf2msgpack is licensed under the GPLv2.

pdf2msgpack's People

Contributors

apotry avatar dependabot[bot] avatar djui avatar pwaller avatar stevenmaude avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

cophy08

pdf2msgpack's Issues

Tidy the Go directory

  • Maybe move into cmd/ and pkg/
  • Add go.mod and go.sum
  • Test the Go code compiles in build Action.

Tidy up poppler submodule

  • Rename directory to reflect repository location; the Dependabot updates are confusing because they refer to the directory path (which is outdated and not the sensiblecodeio fork)
  • Switch branch to the one in use

Remove use of GooList

GooList was removed in poppler-0.76.0.

Blocks upgrading Poppler beyond poppler-0.75.0.

We should use std::vector instead.

See relevant Poppler merge requests: 1 and 2.

Rare non-determinism bug

Not fully investigated, but it seems that you can occasionally get differences in the fifth of the six path values in a tuple, when the path type is FILL.

Sometimes the differences are very, very small floating point differences in values; sometimes a near-zero float turns into a much larger value.

Relevant source file is likely: https://github.com/sensiblecodeio/pdf2msgpack/blob/4e186760a362fbde84e507606e030a4b6ab63670/src/DumpPathsAsMsgPackDev.h

It could also be a Poppler bug, but, from limited searching, I've not found anything in their issue tracker that suggests this.

Observed with pdf2msgpack 0.7.0. This has also made checking the output differences for a later release more tricky.

Allow compilation on OSX/macOS

Current was output:

$ ./waf configure
Setting top to                           : ./pdf2msgpack
Setting out to                           : ./pdf2msgpack/build
Checking for 'clang++' (C++ compiler)    : /usr/bin/clang++
Checking for compiler flags --std=c++14  : yes
Building dynamic binaries                : yes
Checking for program 'pkg-config'        : /usr/local/bin/pkg-config
Checking for 'poppler'                   : yes
Checking linux-headers & seccomp support : not found
The configuration failed
(complete log in ./pdf2msgpack/build/config.log)

As discussed, making the seccomp support OS/platform dependant would be a good step forward.

Review uses of `reinterpret_cast`

These are present in the code when working with words, and not entirely sure what the reasoning behind them is. Poppler's own code doesn't seem to use them.

Curve points get included as standard points

This was noticed following the fix in #213.

Issue is in this code:

while (j < m) {
// Consider removing the bounds end check: j < m - 2
// This should not be necessary with the j += 2 increment,
// but is an extra safeguard to ensure we do not end up accessing
// the uninitialised part of arrays.
// If the number of points, m, is, say, 10,
// we need to stop at point 8 to ensure we don't exceed point 10
// because we access the second value beyond 8.
// This actually corresponds to j = 7 as j is 0-indexed,
// that is, j must be less than m - 2.
if (subpath->getCurve(j) && (j < m - 2)) {
auto a = transform.mul(subpath->getX(j + 0), subpath->getY(j + 0)),
b = transform.mul(subpath->getX(j + 1), subpath->getY(j + 1)),
c = transform.mul(subpath->getX(j + 2), subpath->getY(j + 2));
path_points.push_back(PathPoint(a.x, a.y, b.x, b.y, c.x, c.y));
// Consider replacing this with j += 3 in future.
// See the associated commit message or #154 for a full explanation.
// Poppler's own code iterates using j += 3 for subpath curves.
//
// This is a hack to keep the behaviour of pdf2msgpack close to what it was,
// but with reproducible output.
// The current result is that the first point of the curve gets acted on as previously,
// the second point of the curve no longer incorrectly adds another curve point,
// but the final point does get included as a standalone point
// (the final point also gets handled by the else block below).
// Including the final point as a standalone point may not be strictly correct,
// but more closely retains the previous behaviour.
j += 2;
} else {
auto x = subpath->getX(j), y = subpath->getY(j);
auto t = transform.mul(x, y);
path_points.push_back(PathPoint(t.x, t.y));
++j;
}
}

Poppler represents subpath curves as three points; two that have curve=true and the final one that has curve=false. The current loop increment we use has j += 2 which skips to the final curve point. This curve point has curve=false and then skips to the else in the loop, so gets included as a standard point, as well as being included as a curve point.

This behaviour was left as is for now, to retain the existing behaviour, while fixing the incorrect values for curves.

Probably what is wanted is to restore the j += 3 behaviour removed in #10.

Unable to upgrade build process to Waf 2.x

With Waf 2.0, Python 2.7 in Alpine 3.11 we get the failure below. (Waf 1.9.15, Python 2.7 works fine.)

Maybe bisect Waf commits to figure out where it broke our build? Might suggest a fix.

 => [stage-1 13/14] RUN --mount=type=cache,src=/tmp/ccache,target=/tmp/ccache,id=ccache,from=cachebase         ./waf configure --static --release || {   3.8s
 => ERROR [stage-1 14/14] RUN --mount=type=cache,src=/tmp/ccache,target=/tmp/ccache,id=ccache,from=cachebase         ./waf build                         2.2s 
------                                                                                                                                                        
 > [stage-1 14/14] RUN --mount=type=cache,src=/tmp/ccache,target=/tmp/ccache,id=ccache,from=cachebase         ./waf build:                                    
#21 0.854 Waf: Entering directory `/src/build'                                                                                                                
#21 0.880 [0/3] Compiling src/syscall-reporter.cpp                                                                                                            
#21 1.508 [1/3] Compiling src/main.cpp                                                                                                                        
#21 1.549 [2/3] Linking build/pdf2msgpack                                                                                                                     
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: warning: relocation against `globalParams' in read-only section `.text.startup'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `std::default_delete<PDFDoc>::operator()(PDFDoc*) const':
#21 2.012 /usr/include/c++/9.2.0/bits/unique_ptr.h:81: undefined reference to `PDFDoc::~PDFDoc()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Catalog::numEmbeddedFiles()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Catalog.h:178: undefined reference to `Catalog::getEmbeddedFileNameTree()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Catalog.h:178: undefined reference to `Catalog::getEmbeddedFileNameTree()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_meta_embedded_files(Catalog*)':
#21 2.012 /src/build/../src/main.cpp:245: undefined reference to `Catalog::embeddedFile(int)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:246: undefined reference to `FileSpec::getEmbeddedFile()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Catalog::numEmbeddedFiles()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Catalog.h:178: undefined reference to `Catalog::getEmbeddedFileNameTree()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::isString() const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:215: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `render_annotations(std::unique_ptr<Gfx, std::default_delete<Gfx> >&, Annots*)':
#21 2.012 /src/build/../src/main.cpp:312: undefined reference to `Gfx::saveState()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `std::_MakeUniq<TextOutputDev>::__single_object std::make_unique<TextOutputDev, decltype(nullptr), bool, int, bool, bool>(decltype(nullptr)&&, bool&&, int&&, bool&&, bool&&)':
#21 2.012 /usr/include/c++/9.2.0/bits/unique_ptr.h:849: undefined reference to `TextOutputDev::TextOutputDev(char const*, bool, double, bool, bool)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `page_to_text_page(Page*)':
#21 2.012 /src/build/../src/main.cpp:331: undefined reference to `Page::createGfx(OutputDev*, double, double, int, bool, bool, int, int, int, int, bool, bool (*)(void*), void*, XRef*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:333: undefined reference to `Gfx::saveState()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:334: undefined reference to `Page::display(Gfx*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:335: undefined reference to `Gfx::restoreState()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:339: undefined reference to `Page::getAnnots(XRef*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:343: undefined reference to `TextOutputDev::takeText()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `std::default_delete<Gfx>::operator()(Gfx*) const':
#21 2.012 /usr/include/c++/9.2.0/bits/unique_ptr.h:81: undefined reference to `Gfx::~Gfx()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `GlobalParams::getOverprintPreview()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/GlobalParams.h:138: undefined reference to `globalParams'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `std::_MakeUniq<SplashOutputDev>::__single_object std::make_unique<SplashOutputDev, SplashColorMode&, int, bool, unsigned char (&) [4], bool, SplashThinLineMode>(SplashColorMode&, int&&, bool&&, unsigned char (&) [4], bool&&, SplashThinLineMode&&)':
#21 2.012 /usr/include/c++/9.2.0/bits/unique_ptr.h:849: undefined reference to `SplashOutputDev::SplashOutputDev(SplashColorMode, int, bool, unsigned char*, bool, SplashThinLineMode, bool)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_page_bitmap(Page*)':
#21 2.012 /src/build/../src/main.cpp:460: undefined reference to `SplashOutputDev::setVectorAntialias(bool)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:461: undefined reference to `SplashOutputDev::startDoc(PDFDoc*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:463: undefined reference to `Page::display(OutputDev*, double, double, int, bool, bool, bool, bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `DumpPathsAsMsgPackDev::DumpPathsAsMsgPackDev()':
#21 2.012 /src/build/../src/DumpPathsAsMsgPackDev.h:86: undefined reference to `OutputDev::OutputDev()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_page_paths(Page*)':
#21 2.012 /src/build/../src/main.cpp:435: undefined reference to `Page::createGfx(OutputDev*, double, double, int, bool, bool, int, int, int, int, bool, bool (*)(void*), void*, XRef*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:437: undefined reference to `Page::display(Gfx*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `std::default_delete<Gfx>::operator()(Gfx*) const':
#21 2.012 /usr/include/c++/9.2.0/bits/unique_ptr.h:81: undefined reference to `Gfx::~Gfx()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `fmt(Object const&, UnicodeMap*)':
#21 2.012 /src/build/../src/main.cpp:144: undefined reference to `TextStringToUCS4(GooString const*, unsigned int**)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:150: undefined reference to `UnicodeMap::mapUnicode(unsigned int, char*, int)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::isString() const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:215: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::dictLookup(char const*, int) const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:369: undefined reference to `Dict::lookup(char const*, int) const'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::arrayGet(int, int) const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:339: undefined reference to `Array::get(int, int) const'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:339: undefined reference to `Array::get(int, int) const'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::~Object()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::arrayGetLength() const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:330: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::~Object()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::arrayGetLength() const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:330: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::~Object()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::dictLookup(char const*, int) const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:369: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::isString() const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:215: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::arrayGet(int, int) const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:339: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::isString() const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:215: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:215: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:/src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:215: more undefined references to `error(ErrorCategory, long long, char const*, ...)' follow
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `open_file(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
#21 2.012 /src/build/../src/main.cpp:521: undefined reference to `GooFile::open(GooString const*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:527: undefined reference to `GooFile::size() const'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:527: undefined reference to `FileStream::FileStream(GooFile*, long long, bool, long long, Object&&)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::~Object()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_font_info(PDFDoc*)':
#21 2.012 /src/build/../src/main.cpp:163: undefined reference to `FontInfoScanner::FontInfoScanner(PDFDoc*, int)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:164: undefined reference to `PDFDoc::getNumPages()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:164: undefined reference to `FontInfoScanner::scan(int)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:163: undefined reference to `FontInfoScanner::~FontInfoScanner()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_glyphs(GooList**, int)':
#21 2.012 /src/build/../src/main.cpp:374: undefined reference to `TextWord::getCharBBox(int, double*, double*, double*, double*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_page_glyphs(Page*)':
#21 2.012 /src/build/../src/main.cpp:420: undefined reference to `TextPage::getSelectionWords(PDFRectangle*, SelectionStyle, int*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_document(PDFDoc*, Options const&)':
#21 2.012 /src/build/../src/main.cpp:515: undefined reference to `PDFDoc::getPage(int)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `PDFDoc::getDocInfo()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/PDFDoc.h:266: undefined reference to `XRef::getDocInfo()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Dict::getVal(int) const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Dict.h:84: undefined reference to `Object::fetch(XRef*, int) const'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::~Object()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_document_meta(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, PDFDoc*, UnicodeMap*, Options const&)':
#21 2.012 /src/build/../src/main.cpp:280: undefined reference to `PDFDoc::getNumPages()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:290: undefined reference to `Catalog::getFormType()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::~Object()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::isDict() const':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:219: undefined reference to `error(ErrorCategory, long long, char const*, ...)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `TextPageDecRef(TextPage*)':
#21 2.012 /src/build/../src/main.cpp:309: undefined reference to `TextPage::decRefCnt()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `render_annotations(std::unique_ptr<Gfx, std::default_delete<Gfx> >&, Annots*)':
#21 2.012 /src/build/../src/main.cpp:319: undefined reference to `Gfx::restoreState()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `DumpPathsAsMsgPackDev::~DumpPathsAsMsgPackDev()':
#21 2.012 /src/build/../src/DumpPathsAsMsgPackDev.h:84: undefined reference to `OutputDev::~OutputDev()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `DumpPathsAsMsgPackDev::~DumpPathsAsMsgPackDev()':
#21 2.012 /src/build/../src/DumpPathsAsMsgPackDev.h:84: undefined reference to `OutputDev::~OutputDev()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `std::default_delete<Gfx>::operator()(Gfx*) const':
#21 2.012 /usr/include/c++/9.2.0/bits/unique_ptr.h:81: undefined reference to `Gfx::~Gfx()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /usr/include/c++/9.2.0/bits/unique_ptr.h:81: undefined reference to `Gfx::~Gfx()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `DumpPathsAsMsgPackDev::DumpPathsAsMsgPackDev()':
#21 2.012 /src/build/../src/DumpPathsAsMsgPackDev.h:86: undefined reference to `OutputDev::~OutputDev()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::~Object()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `dump_font_info(PDFDoc*)':
#21 2.012 /src/build/../src/main.cpp:163: undefined reference to `FontInfoScanner::~FontInfoScanner()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `Object::~Object()':
#21 2.012 /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../vendor/anongit.freedesktop.org/git/poppler/poppler.git/build/install/include/poppler/Object.h:153: undefined reference to `Object::free()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o: in function `main':
#21 2.012 /src/build/../src/main.cpp:627: undefined reference to `globalParams'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:632: undefined reference to `globalParams'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:632: undefined reference to `GlobalParams::getTextEncoding()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:636: undefined reference to `PDFDoc::PDFDoc(BaseStream*, GooString const*, GooString const*, void*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:649: undefined reference to `PDFDoc::getNumPages()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:650: undefined reference to `PDFDoc::getNumPages()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:651: undefined reference to `PDFDoc::getNumPages()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:655: undefined reference to `PDFDoc::getNumPages()'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:628: undefined reference to `GlobalParams::GlobalParams(char const*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /src/build/../src/main.cpp:628: undefined reference to `globalParams'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTI21DumpPathsAsMsgPackDev[_ZTI21DumpPathsAsMsgPackDev]+0x10): undefined reference to `typeinfo for OutputDev'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x70): undefined reference to `OutputDev::setDefaultCTM(double const*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x98): undefined reference to `OutputDev::cvtDevToUser(double, double, double*, double*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0xa0): undefined reference to `OutputDev::cvtUserToDev(double, double, int*, int*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0xb8): undefined reference to `OutputDev::updateAll(GfxState*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x278): undefined reference to `OutputDev::beginType3Char(GfxState*, double, double, double, double, unsigned int, unsigned int*, int)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2b0): undefined reference to `OutputDev::drawImageMask(GfxState*, Object*, Stream*, int, int, bool, bool, bool)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2b8): undefined reference to `OutputDev::setSoftMaskFromImageMask(GfxState*, Object*, Stream*, int, int, bool, bool, double*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2c0): undefined reference to `OutputDev::unsetSoftMaskFromImageMask(GfxState*, double*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2c8): undefined reference to `OutputDev::drawImage(GfxState*, Object*, Stream*, int, int, GfxImageColorMap*, bool, int*, bool)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2d0): undefined reference to `OutputDev::drawMaskedImage(GfxState*, Object*, Stream*, int, int, GfxImageColorMap*, bool, Stream*, int, int, bool, bool)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2d8): undefined reference to `OutputDev::drawSoftMaskedImage(GfxState*, Object*, Stream*, int, int, GfxImageColorMap*, bool, Stream*, int, int, GfxImageColorMap*, bool)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2e0): undefined reference to `OutputDev::endMarkedContent(GfxState*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2e8): undefined reference to `OutputDev::beginMarkedContent(char const*, Dict*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2f0): undefined reference to `OutputDev::markPoint(char const*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x2f8): undefined reference to `OutputDev::markPoint(char const*, Dict*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x300): undefined reference to `OutputDev::opiBegin(GfxState*, Dict*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: src/main.cpp.1.o:(.data.rel.ro._ZTV21DumpPathsAsMsgPackDev[_ZTV21DumpPathsAsMsgPackDev]+0x308): undefined reference to `OutputDev::opiEnd(GfxState*, Dict*)'
#21 2.012 /usr/lib/gcc/x86_64-alpine-linux-musl/9.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: read-only segment has dynamic relocations
#21 2.012 collect2: error: ld returned 1 exit status
#21 2.012 
#21 2.022 Waf: Leaving directory `/src/build'
#21 2.022 Build failed
#21 2.022  -> task in 'pdf2msgpack' failed with exit status 1 (run with -v to display more information)

Review use of msgpack-cpp floats/doubles workaround

This was introduced in #146 to retain the behaviour of msgpack-cpp v4.1.1 where floats and doubles never get converted to ints. This allows us to upgrade to the latest msgpack-cpp and closes #142.

The code seems seldom touched, so this might be a reasonably sustainable workaround for now. It will need reviewing on the next msgpack-cpp upgrade, and become problematic if the code upstream starts to diverge more.

A better workaround might be one of:

  • override the way floats and doubles get packed by msgpack-cpp
  • rework any downstream code that handles the output of pdf2msgpack to cope with the possibility of ints

Make it easy to run `clang-tidy` and `clang-format` inside Docker

The build happens in Docker, so we should run these tools inside Docker for simplicity. It would be useful to catch issues introduced when updating the code to be able to use newer versions of Poppler.

Manual steps to run clang-tidy:

  1. Copy the clang_compilation_database.py from the Waf source to the root of this repository. link to master version 1
  2. In the Dockerfile, add clang16-extra-tools to the list of Alpine packages to be installed.
  3. In the Dockerfile, add the clang_compilation_database.py to the Dockerfile COPY.
  4. Build the image.
  5. Run a container from the image: docker run -ti --entrypoint /bin/sh <IMAGE_ID>
  6. $ cp ./build/compile_commands.json . && cd ..
  7. $ clang-tidy -p compile_commands.json src/*.cpp src/*.h

TODO:

  • how to ignore specific files? (syscall-reporter.cpp)
  • fix actual issues that clang-tidy flags
  • which version of clang are we using already?
  • rebuild waf adding the clang_compilation_database tool

Footnotes

  1. Version at time of writing in case the master link breaks; โ†ฉ

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.