-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a kconfig module to allow meson to integrate with existing projects that use kconfig.
- Loading branch information
Showing
13 changed files
with
177 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
--- | ||
short-description: Kconfig module | ||
authors: | ||
- name: Mark Schulte, Paolo Bonzini | ||
years: [2017, 2019] | ||
has-copyright: false | ||
... | ||
|
||
# Kconfig module | ||
|
||
This module parses Kconfig output files to allow use of kconfig | ||
configurations in meson projects. | ||
|
||
**Note**: this does not provide kconfig frontend tooling to generate a | ||
configuration. You still need something such as kconfig frontends (see | ||
link below) to parse your Kconfig files, and then (after you've | ||
choosen the configuration options), output a ".config" file. | ||
|
||
[kconfig-frontends]: http://ymorin.is-a-geek.org/projects/kconfig-frontends | ||
|
||
## Usage | ||
|
||
To use this module, just do: **`kconfig = import('unstable-kconfig')`**. | ||
The following functions will then be available as methods on the object | ||
with the name `kconfig`. You can, of course, replace the name | ||
`kconfig` with anything else. | ||
|
||
### kconfig.load() | ||
|
||
This function loads an output file, usually ".config", (the file path | ||
must be specified as the first and only argument) to load a configuration | ||
from. The configuration is returned as a dictionary object. | ||
|
||
Note that `kconfig.load()` makes no attempt at parsing the values in the | ||
file. Therefore, true boolean values will be represented as the string "y" | ||
and integer values will have to be converted with `.to_int()`. | ||
|
||
* The first (and only) argument is the path to the configuration file to | ||
load (usually ".config"). | ||
|
||
**Returns**: a [dictionary object](Reference-manual.md#dictionary-object). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -45,6 +45,7 @@ index.md | |
Simd-module.md | ||
Windows-module.md | ||
Cuda-module.md | ||
Kconfig-module.md | ||
Java.md | ||
Vala.md | ||
D.md | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
# Copyright 2017, 2019 The Meson development team | ||
|
||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
|
||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
|
||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
from . import ExtensionModule | ||
|
||
from .. import mesonlib | ||
from ..mesonlib import typeslistify | ||
from ..interpreterbase import FeatureNew, noKwargs | ||
from ..interpreter import InvalidCode | ||
|
||
import os | ||
|
||
class KconfigModule(ExtensionModule): | ||
|
||
@FeatureNew('Kconfig Module', '0.50.0') | ||
def __init__(self, *args, **kwargs): | ||
super().__init__(*args, **kwargs) | ||
self.snippets.add('load') | ||
|
||
def _load_file(self, path_to_config): | ||
result = dict() | ||
try: | ||
with open(path_to_config) as f: | ||
for line in f: | ||
if '#' in line: | ||
comment_idx = line.index('#') | ||
line = line[:comment_idx] | ||
line = line.strip() | ||
try: | ||
name, val = line.split('=', 1) | ||
except ValueError: | ||
continue | ||
result[name.strip()] = val.strip() | ||
except IOError as e: | ||
raise mesonlib.MesonException('Failed to load {}: {}'.format(path_to_config, e)) | ||
|
||
return result | ||
|
||
@noKwargs | ||
def load(self, interpreter, state, args, kwargs): | ||
sources = typeslistify(args, (str, mesonlib.File)) | ||
if len(sources) != 1: | ||
raise InvalidCode('load takes only one file input.') | ||
|
||
s = sources[0] | ||
if isinstance(s, mesonlib.File): | ||
# kconfig input is processed at "meson setup" time, not during | ||
# the build, so it cannot reside in the build directory. | ||
if s.is_built: | ||
raise InvalidCode('kconfig input must be a source file.') | ||
s = s.relative_name() | ||
|
||
s = os.path.join(interpreter.environment.source_dir, s) | ||
if s not in interpreter.build_def_files: | ||
interpreter.build_def_files.append(s) | ||
|
||
return self._load_file(s) | ||
|
||
|
||
def initialize(*args, **kwargs): | ||
return KconfigModule(*args, **kwargs) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
CONFIG_VAL1=y | ||
# CONFIG_VAL2 is not set | ||
CONFIG_VAL_VAL=4 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
project('kconfig basic test') | ||
|
||
k = import('unstable-kconfig') | ||
conf = k.load('.config') | ||
|
||
if not conf.has_key('CONFIG_VAL1') | ||
error('Expected CONFIG_VAL1 to be set, but it wasn\'t') | ||
endif | ||
|
||
if conf.has_key('CONFIG_VAL2') | ||
error('Expected CONFIG_VAL2 not be set, but it was') | ||
endif | ||
|
||
if conf.get('CONFIG_VAL_VAL').to_int() != 4 | ||
error('Expected CONFIG_VAL_VAL to be 4') | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
CONFIG_IS_SET=y | ||
# CONFIG_NOT_IS_SET is not set |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
|
||
k = import('unstable-kconfig') | ||
|
||
conf = k.load(meson.source_root() / '.config') | ||
|
||
if not conf.has_key('CONFIG_IS_SET') | ||
error('Expected CONFIG_IS_SET to be set, but it wasn\'t') | ||
endif | ||
|
||
if conf.has_key('CONFIG_NOT_IS_SET') | ||
error('Expected CONFIG_NOT_IS_SET not be set, but it was') | ||
endif | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
project('kconfig subdir test') | ||
|
||
# Test into sub directory | ||
subdir('dir') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
CONFIG_IS_SET=y | ||
# CONFIG_NOT_IS_SET is not set |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
|
||
k = import('unstable-kconfig') | ||
|
||
conf = k.load(files('config')) | ||
|
||
if not conf.has_key('CONFIG_IS_SET') | ||
error('Expected CONFIG_IS_SET to be set, but it wasn\'t') | ||
endif | ||
|
||
if conf.has_key('CONFIG_NOT_IS_SET') | ||
error('Expected CONFIG_NOT_IS_SET not be set, but it was') | ||
endif | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
project('kconfig subdir test') | ||
|
||
# Test into sub directory | ||
subdir('dir') |