| Index: README.CMAKE.md | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/README.CMAKE.md | 
| @@ -0,0 +1,113 @@ | 
| +Experimental CMake build for adblockpluscore | 
| +============================================ | 
| + | 
| +This files describes an experimental build using CMake. For the duration of | 
| +this experiment, this file will describe the build independently, leaving the | 
| +existing README.md intact. | 
| + | 
| +Requirements | 
| +------------ | 
| + | 
| +* [CMake](https://cmake.org). The Emscripten toolchain file requires version | 
| +3.4.3 or newer. | 
| +* [Emscripten 1.37](https://kripken.github.io/emscripten-site/) | 
| + | 
| +Configuring CMake | 
| +----------------- | 
| + | 
| +CMake uses a cache to hold configuration information that is not an ordinary | 
| +part of the write-build-test cycle. Thus the first invocation of CMake requires | 
| +extra configuration parameters. Subsequent invocations do not require these. | 
| +We require two such kinds of configuration data: | 
| +* Generator for build system | 
| +* Emscriptem tool chain | 
| + | 
| +### Build system generator | 
| + | 
| +CMake is a cross-platform build system generator. It has the capability of | 
| +generating project files for a number of build systems, including those that | 
| +are an integral part of an IDE. Specifically, these include makefiles in | 
| +several variants, ninja, Eclipse, Visual Studio, and XCode. | 
| + | 
| +To set up the cache with a generator, use the `-G` option on the CMake command | 
| +line. The quickest way to find the exact text to use as the argument to this | 
| +option is run CMake with the `--help` option`. Further information is available | 
| +in the CMake documentation; see cmake-generators(7). | 
| + | 
| +### Emscripten | 
| + | 
| +CMake treats Emscripten as a cross-compiler. CMake can auto-detect native | 
| +compilers but requires pre-configuration for cross-compilers. Emscripten | 
| +provides a CMake toolchain file for this purpose. The location of this file is | 
| +what CMake ultimately needs. | 
| + | 
| +The most direct way to specify the path to the toolchain file is to define a | 
| +cache variable directly on the CMake command line. The toolchain file is | 
| +buried within the Emscripten installation. The name of the cache variable and | 
| +the specific location of the file are visible within the following command | 
| +line fragment: | 
| + | 
| +``` | 
| +    cmake -DCMAKE_TOOLCHAIN_FILE=<EmscriptenRoot>/cmake/Modules/Platform/Emscripten.cmake [...] | 
| +``` | 
| + | 
| +Note that the `<EmscriptenRoot>` about is _not_ the root of the Emscripten | 
| +SDK. Within the SDK, the location is `<SdkRoot>/emscripten/<version>` | 
| + | 
| +This toolchain file assumes that it's running within an Emscripten shell with | 
| +all paths and environment variables set up. CMake will appear to configure | 
| +correctly outside this, but will not find executables, etc. | 
| + | 
| + | 
| +Notes | 
| +----- | 
| + | 
| +### Setting up Emscripten under Cygwin. | 
| + | 
| +tl;dr version: Don't. | 
| + | 
| +It's a known issue that the Emscripten tool chain as distributed does not work | 
| +under Cygwin. The core of the issue is that Emscripten uses a number of native | 
| +Windows executables and the transition from Cygwin path names to Windows path | 
| +names doesn't work correctly. | 
| + | 
| +https://github.com/kripken/emscripten/issues/3947 | 
| + | 
| +Once the command `emcc -v` runs correctly, CMake will be able to set up the | 
| +Emscripten tool chain. Even then, there will still be errors in other ways. | 
| + | 
| + | 
| +Work-in-Progress Notes | 
| +---------------------- | 
| + | 
| +There are a number of known deficiencies. | 
| + | 
| +### Configurations | 
| + | 
| +The compile script has two options `--debug` and `--trace`. The current CMake | 
| +file has debug on and trace off. The right way to do with is with CMake | 
| +configurations: "Release", "ReleaseTrace", "Debug", "DebugTrace". | 
| + | 
| +### Building bindings | 
| + | 
| +As of the present version, the step to run the bindings generator always runs | 
| +whether it needs to or not. This deficiency arises because the obvious way to do | 
| +this in CMake uses phony make targets that have this behavior. | 
| + | 
| +### Other targets | 
| + | 
| +There are no targets for testing or documentation. | 
| + | 
| +### Location of generated files | 
| + | 
| +The generated files are built in the root directory at present. This works fine | 
| +for an out-of-source build with CMake. It might work less fine in the long term | 
| +for an in-source build, but it has been expedient to date to put these files | 
| +in different locations from the `compile` script to make "before" vs. "after" | 
| +comparisons more quickly. Here's a list of these changes. | 
| + | 
| +* `compiled/bindings.cpp.js` --> `binding-generator.js` | 
| +* `compiled/bindings.js` --> `bindings.js` | 
| +* `lib/compiled.js` --> `compiled.js` | 
| +* `lib/compiled.js.symbols` --> `compiled.js.symbols` | 
| + | 
|  |