LEFT | RIGHT |
1 Adblock Plus core | 1 Adblock Plus core |
2 ================= | 2 ================= |
3 | 3 |
4 This repository contains the generic Adblock Plus code that's shared between | 4 This repository contains the generic Adblock Plus code that's shared between |
5 platforms. This repository is not designed to be used directly, but instead to | 5 platforms. This repository is not designed to be used directly, but instead to |
6 serve as a dependency for `adblockplus`, `adblockpluschrome` and | 6 serve as a dependency for `adblockplus`, `adblockpluschrome` and |
7 `libadblockplus`. | 7 `libadblockplus`. |
8 | 8 |
9 Compiling C++ code | 9 Compiling C++ code |
10 ------------------ | 10 ------------------ |
11 | 11 |
12 ### Purpose | 12 ### Purpose |
13 | 13 |
14 In order to improve performance and memory usage, some of the code (located | 14 In order to improve performance and memory usage, some of the code (located |
15 inside the `compiled` directory) is written in C++ and compiled to JavaScript | 15 inside the `compiled` directory) is written in C++ and compiled to JavaScript |
16 via Empscripten. | 16 via Empscripten. |
17 | 17 |
18 ### Requirements | 18 ### Requirements |
19 | 19 |
20 * [Emscripten 1.37.3](https://github.com/kripken/emscripten) | 20 * [Emscripten 1.37.3](https://github.com/kripken/emscripten) |
21 * [Python 2.7](https://www.python.org) | 21 * [Python 2.7](https://www.python.org) |
| 22 * [meson 0.40.0+](https://www.mesonbuild.com) |
| 23 * [ninja](https://www.ninja-build.org) |
| 24 |
| 25 Make sure that meson and ninja are in your PATH. |
22 | 26 |
23 ### Running Emscripten | 27 ### Running Emscripten |
24 | 28 |
25 After installing and configuring Emscripten you can run the following commands: | 29 After installing and configuring Emscripten you can setup the build |
| 30 with the following commands: |
26 | 31 |
27 mkdir build | |
28 meson build | 32 meson build |
29 ninja | |
30 | 33 |
31 This will produce a `build/compiled.js` exporting the classes defined | 34 By default it will create a debug build. Pass `--buildtype release` to |
32 in C++ code. | 35 create a release build. |
| 36 |
| 37 Then to build just do: |
| 38 |
| 39 ninja -C build |
| 40 |
| 41 This will regenerate the build files as needed. |
| 42 |
| 43 This will produce a `lib/compiled.js` exporting the classes defined in C++ code. |
33 | 44 |
34 ### Technical details | 45 ### Technical details |
35 | 46 |
36 Compilation is currently a two-step process. In the bindings generation step, | 47 Compilation is currently a two-step process. In the bindings generation step, |
37 the source files are compiled into `compiled/bindings.cpp.js` with the | 48 the source files are compiled into `compiled/bindings.cpp.js` with the |
38 `PRINT_BINDINGS` symbol defined. This application is then executed via Node.js | 49 `PRINT_BINDINGS` symbol defined. This application is then executed via Node.js |
39 and will print JavaScript wrappers for the C++ classes to | 50 and will print JavaScript wrappers for the C++ classes to |
40 `build/bindings.js` according to definitions within the `EMSCRIPTEN_BINDINGS` | 51 `build/bindings.js` according to definitions within the `EMSCRIPTEN_BINDINGS` |
41 macro in `compiled/bindings.cpp`. | 52 macro in `compiled/bindings.cpp`. |
42 | 53 |
43 In the actual compilation step the source files are compiled into | 54 In the actual compilation step the source files are compiled into |
44 `build/compiled.js` without the `PRINT_BINDINGS` symbol, so that the | 55 `lib/compiled.js` without the `PRINT_BINDINGS` symbol, so that the |
45 `EMSCRIPTEN_BINDINGS` macro ignores its contents and merely emits some generic | 56 `EMSCRIPTEN_BINDINGS` macro ignores its contents and merely emits some generic |
46 functions necessary for the JavaScript bindings to work. The previously | 57 functions necessary for the JavaScript bindings to work. The previously |
47 generated `compiled/bindings.js` file is added to the end of Emscripten output. | 58 generated `compiled/bindings.js` file is added to the end of Emscripten output. |
48 | 59 |
49 The binding generation approach is heavily inspired by | 60 The binding generation approach is heavily inspired by |
50 [embind](http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_an
d_javascript/embind.html). | 61 [embind](http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_an
d_javascript/embind.html). |
51 However, embind doesn't use a separate build step to produce the bindings, the | 62 However, embind doesn't use a separate build step to produce the bindings, the |
52 bindings are rather generated dynamically at run time. As a side-effect, it | 63 bindings are rather generated dynamically at run time. As a side-effect, it |
53 increases the build size considerably and also imposes a significant performance | 64 increases the build size considerably and also imposes a significant performance |
54 penalty. Also, generating JavaScript code dynamically is discouraged for browser | 65 penalty. Also, generating JavaScript code dynamically is discouraged for browser |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 Linting | 99 Linting |
89 ------- | 100 ------- |
90 | 101 |
91 You can lint the code using [ESLint](http://eslint.org). | 102 You can lint the code using [ESLint](http://eslint.org). |
92 | 103 |
93 eslint *.js chrome lib test | 104 eslint *.js chrome lib test |
94 | 105 |
95 You will need to set up ESLint and our configuration first, see | 106 You will need to set up ESLint and our configuration first, see |
96 [eslint-config-eyeo](https://hg.adblockplus.org/codingtools/file/tip/eslint-conf
ig-eyeo) | 107 [eslint-config-eyeo](https://hg.adblockplus.org/codingtools/file/tip/eslint-conf
ig-eyeo) |
97 for more information. | 108 for more information. |
LEFT | RIGHT |