1# parameter-framework 2 3[![Build Status](https://travis-ci.org/01org/parameter-framework.svg?branch=master)](https://travis-ci.org/01org/parameter-framework) 4[![Windows Build Status](https://ci.appveyor.com/api/projects/status/ga24jp8tet0qimbu/branch/master)](https://ci.appveyor.com/project/parameter-framework/parameter-framework) 5[![Coverage Status](https://codecov.io/github/01org/parameter-framework/coverage.svg?branch=master)](https://codecov.io/github/01org/parameter-framework?branch=master) 6 7## Introduction 8 9The parameter-framework is a plugin-based and rule-based framework for handling 10parameters. This means that you can: 11 121. Describe your system's structure and its parameters (in XML) - aka. **What**; 132. Write (in C++) or reuse a backend (aka. plugin) for accessing the parameters 14that you just described - aka. **How**; 153. Define (in XML or in a domain-specific-language) conditions/rules upon which 16a given parameter must take a given value - aka. **When**. 17 18![What, How, When](https://01org.github.io/parameter-framework/hosting/what-how-when.png) 19 20### Usage examples 21 22#### Alsa controls on embedded platforms 23 24The parameter-framework can be used to set the value of alsa controls 25(switches, volumes, etc.) on smartphones/tablets based on parameter-framework 26rules (in this example, they transcribe use-cases). For accessing parameters 27(i.e. alsa controls), you may use the 28[alsa plugin](https://github.com/01org/parameter-framework-plugins-alsa). 29 30#### Parameters in files 31 32The [filesystem plugin](https://github.com/01org/parameter-framework-plugins-filesystem) 33can be used to write parameters in files. This is particularly useful for 34files in `/sys` managing GPIOs. 35 36### More details 37 38The parameter-framework's core comes in the form of a shared library. Its 39client has to provide: 40 41- configuration files describing the structure of the system to be managed by 42 the parameter-framework and what plugins it must use to read/write into each 43 subsystem; 44- a list of criteria (representing the state of the client) and their possible 45 values; 46- configuration files describing the value that each part of the system (aka 47 parameter) must take - this is done by writing rules based on the criteria 48 described above. 49 50At runtime, the most usual communication between the client and the 51parameter-framework are: 52 531. The update of *criteria* (that are used in the rules introduced above) and 542. Update all relevant parameters according to the new criteria values. The 55 parameter-framework uses the appropriate backend for writing the values in 56 each underlying subsystem. 57 58The parameter-framework comes with several tools, including a command-line 59interface: `remote-process`. 60 61## Going further 62 63See [the wiki on github](https://github.com/01org/parameter-framework/wiki). 64 65## Compiling 66 67**You may take a look at `.travis.yml` and `appveyor.yml` for examples on how we 68build the Parameter Framework in the CI.** It will probably help if you have 69troubles building the Parameter Framework even after reading the following 70sections: 71 72### Dependencies 73 74In order to compile you'll need, at the very least: 75 76- CMake (v3.2.2 or later) (v3.3.0 or later on Windows); 77- A C/C++ compiler supporting C++11; 78- libxml2 headers and libraries (Provided by the `libxml2-dev` on debian-based 79distributions); 80 81If you want to use the remote command interface (`NETWORKING=ON` by default), 82you'll also need: 83 84- Standalone ASIO (1.10.6 or later) (Provided by `libasio-dev` on debian-based 85distributions) ASIO is C++ header-only ASynchronous-IO library. 86 87If you want to compile the *Python bindings* (`PYTHON_BINDINGS=ON` by default), 88you'll also need: 89 90- SWIG 2.0 (A binding generator); 91- Python2.7 development environment (Provided by `python2.7-dev` on debian-based 92distributions) 93 94If you want to *compile and run the tests* (`BUILD_TESTING=ON` by default), 95you'll also need: 96 97- Catch (Provided by `catch` on debian-based distributions). Catch is a 98single-header test framework - as such you may also download it directly 99[here](https://raw.githubusercontent.com/philsquared/Catch/master/single_include/catch.hpp); 100- Python2.7 (Provided by `python2.7` on debian-based distribution - it is 101preinstalled on most distributions). 102 103If you want to *build the code documentation* (`DOXYGEN=OFF` by default), you'll 104need `doxygen` and `graphviz`. This doc is already available to you - see the 105wiki. 106 107**To list all available configuration options, try** `cmake -L` (you may also 108filter-out lines starting with `CMAKE_`). 109 110### How-To 111 112If you are already familiar with CMake, you know what to do. 113 114Run `cmake .` then `make`. You may then install libraries, headers and 115binaries with `make install`. By default, they are installed under 116`/usr/local` on unix OSes; if you want to install them under a custom 117directory, you may do so by passing it to the `cmake .` command; e.g. 118 119 # Always use absolute paths in CMake "-D" options: you don't know where 120 # relative paths will be evaluated from. 121 cmake -DCMAKE_INSTALL_PREFIX=/path/to/custom/install . 122 123If you want to provide your own dependencies (e.g. your own version of 124libxml2), you should pass the base paths as the `CMAKE_PREFIX_PATH` variable, 125e.g.: 126 127 cmake -DCMAKE_PREFIX_PATH='/path/to/dependency1/;/path/to/dependency2/' 128 129For more information on how to use `CMAKE_PREFIX_PATH`, see CMake's 130documentation. 131 132Also, CMake can build a project out-of-tree, which is the recommended method: 133 134 mkdir /path/to/build/directory 135 cd /path/to/build/directory 136 cmake /path/to/sources/of/parameter-framework 137 make 138 139After a build you may want to run the parameter-framework tests with 140`make test` or `ctest`. 141 142### Compiling on Windows 143 144The only supported compiler on Windows in Visual Studio 14 2015. The 2013 145version does not support some C++11 features. When running CMake's 146configuration step (the first call to CMake) you must specify the build system 147you want to use, i.e. `-G Visual Studio 14 2015 Win64`. Again, you may refer to 148`appveyor.yml`. 149 150If you don't already have libxml2 headers/libraries and don't want to build them 151by yourself, we have a precompiled version for x86-64. *These are provided for 152reference and as a convenience for development purpose only; when making a 153final product, you should recompile the latest libxml2 release yourself.* 154 155Compiled with Visual Studio 12 2013: 156- [in debug configuration](https://01.org/sites/default/files/libxml2-x86_64-debug-3eaedba1b64180668fdab7ad2eba549586017bf3.zip) 157- [in release configuration](https://01.org/sites/default/files/libxml2-x86_64-3eaedba1b64180668fdab7ad2eba549586017bf3.zip) 158 159We have mirrored ASIO 1.10.6 [here](https://01.org/sites/default/files/asio-1.10.6.tar.gz). 160 161Once you have downloaded and uncompressed these two dependencies, add the 162following two entries to `CMAKE_PREFIX_PATH`: 163 164 /path/to/libxml2-x86_64/ 165 /path/to/asio-1.10.6/ 166