bake-toolkit 2.19.2 → 2.20.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/documentation/_build/html/_images/dot.png +0 -0
- data/documentation/_build/html/_images/dotP.png +0 -0
- data/documentation/_build/html/_images/dotPC.png +0 -0
- data/documentation/_build/html/_sources/changelog.txt +12 -0
- data/documentation/_build/html/_sources/concepts/concepts.txt +2 -0
- data/documentation/_build/html/_sources/concepts/inject.txt +65 -0
- data/documentation/_build/html/_sources/concepts/prebuild.txt +56 -0
- data/documentation/_build/html/_sources/index.txt +1 -1
- data/documentation/_build/html/_sources/syntax/auto_adjustment.txt +43 -0
- data/documentation/_build/html/_sources/syntax/syntax.txt +1 -1
- data/documentation/_build/html/_sources/syntax/variable_substitutions.txt +41 -68
- data/documentation/_build/html/_sources/tips_and_tricks/dot.txt +34 -0
- data/documentation/_build/html/_sources/tips_and_tricks/tips_and_tricks.txt +1 -1
- data/documentation/_build/html/_static/dot.png +0 -0
- data/documentation/_build/html/_static/dotP.png +0 -0
- data/documentation/_build/html/_static/dotPC.png +0 -0
- data/documentation/_build/html/_static/syntax.html +20 -0
- data/documentation/_build/html/changelog.html +17 -3
- data/documentation/_build/html/commandline/commandline.html +3 -3
- data/documentation/_build/html/concepts/build_hierarchy.html +3 -3
- data/documentation/_build/html/concepts/concepts.html +13 -3
- data/documentation/_build/html/concepts/inject.html +217 -0
- data/documentation/_build/html/concepts/link_order.html +3 -3
- data/documentation/_build/html/concepts/prebuild.html +205 -0
- data/documentation/_build/html/concepts/the_main_project.html +3 -3
- data/documentation/_build/html/concepts/the_project_meta_file.html +3 -3
- data/documentation/_build/html/genindex.html +3 -3
- data/documentation/_build/html/ide/eclipse/eclipse.html +3 -3
- data/documentation/_build/html/ide/eclipse/how_to_convert_existing_cdt_workspace.html +3 -3
- data/documentation/_build/html/ide/eclipse/how_to_create_a_new_project_in_eclipse.html +3 -3
- data/documentation/_build/html/ide/eclipse/how_to_create_a_workspace_in_eclipse.html +3 -3
- data/documentation/_build/html/ide/eclipse/how_to_debug_in_eclipse.html +3 -3
- data/documentation/_build/html/ide/eclipse/how_to_install_eclipse_plugin.html +3 -3
- data/documentation/_build/html/ide/eclipse/how_to_use_bake_in_eclipse.html +3 -3
- data/documentation/_build/html/ide/ide_integrations.html +3 -3
- data/documentation/_build/html/ide/vs/how_to_create_vs_projects.html +3 -3
- data/documentation/_build/html/ide/vs/how_to_debug_in_vs.html +3 -3
- data/documentation/_build/html/ide/vs/how_to_used_bake_in_vs.html +3 -3
- data/documentation/_build/html/ide/vs/vs.html +3 -3
- data/documentation/_build/html/ide/vs/vs_install.html +3 -3
- data/documentation/_build/html/index.html +10 -7
- data/documentation/_build/html/install/install_bake.html +3 -3
- data/documentation/_build/html/internal.html +3 -3
- data/documentation/_build/html/known_issues.html +3 -3
- data/documentation/_build/html/license.html +3 -3
- data/documentation/_build/html/performance/performance.html +5 -5
- data/documentation/_build/html/quickstart/quickstart.html +3 -3
- data/documentation/_build/html/search.html +3 -3
- data/documentation/_build/html/searchindex.js +1 -1
- data/documentation/_build/html/syntax/adapt_configs.html +3 -3
- data/documentation/_build/html/syntax/auto_adjustment.html +190 -0
- data/documentation/_build/html/syntax/derive_configs.html +3 -3
- data/documentation/_build/html/syntax/project_meta_syntax.html +23 -3
- data/documentation/_build/html/syntax/syntax.html +11 -7
- data/documentation/_build/html/syntax/variable_substitutions.html +54 -67
- data/documentation/_build/html/tips_and_tricks/{bundle.html → dot.html} +25 -19
- data/documentation/_build/html/tips_and_tricks/how_to_use_bake_with_cygwin.html +3 -3
- data/documentation/_build/html/tips_and_tricks/static_code_analysis.html +3 -3
- data/documentation/_build/html/tips_and_tricks/the_bakery.html +3 -3
- data/documentation/_build/html/tips_and_tricks/the_clang.html +5 -5
- data/documentation/_build/html/tips_and_tricks/tips_and_tricks.html +4 -4
- data/documentation/_build/html/why_bake/why_bake.html +5 -5
- data/lib/adapt/config/loader.rb +37 -35
- data/lib/bake/config/checks.rb +19 -11
- data/lib/bake/config/loader.rb +67 -60
- data/lib/bake/model/metamodel.rb +56 -30
- data/lib/bake/options/options.rb +37 -3
- data/lib/bake/options/usage.rb +12 -3
- data/lib/bake/subst.rb +5 -2
- data/lib/blocks/block.rb +27 -6
- data/lib/blocks/blockBase.rb +2 -17
- data/lib/blocks/compile.rb +91 -91
- data/lib/blocks/executable.rb +41 -41
- data/lib/common/version.rb +1 -1
- data/lib/tocxx.rb +212 -55
- metadata +16 -4
- data/documentation/_build/html/_sources/tips_and_tricks/bundle.txt +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d9abca5ad68f7e5e78b4043e8a3d979dc662a73
|
4
|
+
data.tar.gz: c2666bd053263bbf16e86e5609541d08191ac566
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef84a235c5295a12547daa67a456456db09f2fcb6a7e5a39b553fd0c2b9e7df9248e1eac11d407b2ab6fb50cce8d2f4d5ceb29d5a86e72b5daa24604f99177b7
|
7
|
+
data.tar.gz: 9fc8c950e6adc304fc009346d3fff588939c5dc68c1ea89133df3522c2283cb8f28dd8a47c66e8a16a69872dfc65a64dbe65bb4d1e39d235b87f2ad003d80c02
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,6 +1,18 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
September 5, 2016 - bake-toolkit 2.20.1
|
5
|
+
* Added: inject feature for dependencies
|
6
|
+
* Added: option to generate a dot graph file
|
7
|
+
* Added: *prebuild* feature for distribution builds
|
8
|
+
* Added: commandline option *--build_* to enable the old outputdir behaviour: *build_* instead of *build/*
|
9
|
+
* Added: printing out more information when loading Project.metas in verbosity level 3
|
10
|
+
* Changed: circular dependency warning moved from verbosity level 1 to 3
|
11
|
+
* Added: ToolchainName is now a predefined variable for Project.meta
|
12
|
+
* Added: --compile-only option (which is equal to the workaround -f ".")
|
13
|
+
* Bugfix: --adapt commandline option accepts absolute paths now
|
14
|
+
* Changed: removed the *bundle* feature
|
15
|
+
|
4
16
|
August 12, 2016 - bake-toolkit 2.19.2
|
5
17
|
* Bugfix: fixed TI linker error parser
|
6
18
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
Injection and inheritance of IncludeDir and Dependency
|
2
|
+
******************************************************
|
3
|
+
|
4
|
+
It is possible to inject and inherit "includes" and inject "dependencies".
|
5
|
+
|
6
|
+
Inherit IncludeDir
|
7
|
+
==================
|
8
|
+
|
9
|
+
.. code-block:: console
|
10
|
+
|
11
|
+
IncludeDir include, inherit: true
|
12
|
+
|
13
|
+
This is typically used to make include directories available to upper levels, e.g.:
|
14
|
+
|
15
|
+
|
16
|
+
.. code-block:: console
|
17
|
+
|
18
|
+
# in MyLib/Project.meta
|
19
|
+
LibraryConfig Lib {
|
20
|
+
...
|
21
|
+
IncludeDir include, inherit: true
|
22
|
+
}
|
23
|
+
|
24
|
+
# in main/Project.meta
|
25
|
+
ExecutableConfig Debug {
|
26
|
+
...
|
27
|
+
Dependency MyLib, config: Lib
|
28
|
+
# IncludeDir "MyLib/include" - not needed because this IncludeDir is inherited
|
29
|
+
}
|
30
|
+
|
31
|
+
Inject IncludeDir
|
32
|
+
=================
|
33
|
+
|
34
|
+
.. code-block:: console
|
35
|
+
|
36
|
+
IncludeDir "mock/include", inject: front
|
37
|
+
|
38
|
+
"front" is used for mocking IncludeDirs, e.g. if a library shall include a mocked class instead of the original one in UnitTest context.
|
39
|
+
|
40
|
+
.. code-block:: console
|
41
|
+
|
42
|
+
IncludeDir include, inject: back
|
43
|
+
|
44
|
+
"back" is used if the lower levels do not know by themselves what to include. So this has to be configured from the outside, typically in the main project.
|
45
|
+
|
46
|
+
Inject Dependency
|
47
|
+
=================
|
48
|
+
|
49
|
+
.. code-block:: console
|
50
|
+
|
51
|
+
Dependency MyLib, inject: front # or back
|
52
|
+
|
53
|
+
This is used if a component cannot have this dependency hard coded, because it shall not know the concrete implementation or the dependency is only used for unittesting.
|
54
|
+
|
55
|
+
Example:
|
56
|
+
|
57
|
+
.. code-block:: console
|
58
|
+
|
59
|
+
ExecutableConfig UnitTest {
|
60
|
+
...
|
61
|
+
Dependency config: Lib
|
62
|
+
Dependency googleTest, inject: front
|
63
|
+
}
|
64
|
+
|
65
|
+
In this example the config Lib depends on googleTest. If googleTest inherits an IncludeDir, this would be known by Lib.
|
@@ -0,0 +1,56 @@
|
|
1
|
+
Prebuild configurations for distributions
|
2
|
+
*****************************************
|
3
|
+
|
4
|
+
This is a useful feature if you want to make a part of workspace available for third party without changing the configuration.
|
5
|
+
|
6
|
+
There are two major use cases:
|
7
|
+
|
8
|
+
- Only a few projects shall be closed source (e.g. to hide some algorithms)
|
9
|
+
- Only a few projects shall be open source (e.g. if a supplier has integrate a library)
|
10
|
+
|
11
|
+
Both is possible with bake, but the current UI is optimized for the latter one.
|
12
|
+
|
13
|
+
Add in the Project.meta the following code:
|
14
|
+
|
15
|
+
.. code-block:: console
|
16
|
+
|
17
|
+
Prebuild {
|
18
|
+
Except main, config: Debug
|
19
|
+
Except newLib, config: Debug
|
20
|
+
Except setup, config: Release
|
21
|
+
}
|
22
|
+
|
23
|
+
It is possible to specify the Prebuild tags in all configurations, not only in the main configuration. Logically they will be merged.
|
24
|
+
|
25
|
+
In the example above, no configurations will be built - except those three. The prebuild output is used directly.
|
26
|
+
|
27
|
+
To reference a configuration of the same project, omit the project name, e.g.:
|
28
|
+
|
29
|
+
.. code-block:: console
|
30
|
+
|
31
|
+
Except config: Base
|
32
|
+
|
33
|
+
To reference all configuration of a project, omit the config name, e.g.:
|
34
|
+
|
35
|
+
.. code-block:: console
|
36
|
+
|
37
|
+
Except newLib
|
38
|
+
|
39
|
+
|
40
|
+
This prebuild behaviour must be explicitly turned on by using the following the command line argument:
|
41
|
+
|
42
|
+
.. code-block:: console
|
43
|
+
|
44
|
+
--prebuild
|
45
|
+
|
46
|
+
|
47
|
+
Typical workflow
|
48
|
+
----------------
|
49
|
+
|
50
|
+
1. Compiling the workspace completely without prebuild feature.
|
51
|
+
2. Executing a distribution script which copies all relevant files to a distribution directory.
|
52
|
+
Make sure to add all header files of prebuild libraries if they are needed for other non-prebuild libraries.
|
53
|
+
You may use the dependency files in the output directory for that script.
|
54
|
+
3. In the distribution folder use "--prebuild" when compiling the workspace.
|
55
|
+
|
56
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
Auto-adjustment of paths to existing projects
|
2
|
+
=============================================
|
3
|
+
|
4
|
+
If paths to other projects are needed, e.g. to "bootloaderUpdater", don't write a hard coded relative path like this:
|
5
|
+
|
6
|
+
.. code-block:: text
|
7
|
+
|
8
|
+
CommandLine "../bootloaderUpdater/tools/PrimaryBootloader2Include.exe
|
9
|
+
|
10
|
+
If paths to other projects are needed, e.g. to "bootloaderUpdater" just reference it starting from the project folder.
|
11
|
+
|
12
|
+
Example:
|
13
|
+
|
14
|
+
.. code-block:: text
|
15
|
+
|
16
|
+
CommandLine "bootloaderUpdater/tools/PrimaryBootloader2Include.exe
|
17
|
+
|
18
|
+
or:
|
19
|
+
|
20
|
+
.. code-block:: text
|
21
|
+
|
22
|
+
IncludeDir "myProjectName/bootloaderUpdater/whatever"
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
bake recognizes that the first part of the path is a valid project name and calculates the relative path to the project automatically.
|
27
|
+
If you have the special case that the referenced project is contained in an other workspace root, you can use the
|
28
|
+
`-w` parameter or you define a `roots.bake`.
|
29
|
+
|
30
|
+
.. note::
|
31
|
+
|
32
|
+
The path auto adjustment is applied for the following elements:
|
33
|
+
|
34
|
+
* IncludeDir
|
35
|
+
|
36
|
+
* ExternalLibrary
|
37
|
+
|
38
|
+
* ExternalLibrarySearchPath
|
39
|
+
|
40
|
+
* UserLibrary
|
41
|
+
|
42
|
+
* CommandLine
|
43
|
+
|
@@ -1,18 +1,28 @@
|
|
1
1
|
Variables in Project.meta
|
2
2
|
=========================
|
3
|
-
bake allows you to use
|
4
|
-
|
3
|
+
bake allows you to use
|
4
|
+
|
5
|
+
- user defined
|
6
|
+
- predefined
|
7
|
+
- environment
|
8
|
+
|
9
|
+
variables in your Project.meta file (in this priority). If a variable is not found, it will be evaluated to an empty string.
|
10
|
+
|
11
|
+
Using variables
|
12
|
+
***************
|
13
|
+
|
14
|
+
Variables can be used using the following syntax:
|
5
15
|
|
6
16
|
.. code-block:: console
|
7
17
|
|
8
|
-
$(
|
18
|
+
$(ABC)
|
9
19
|
|
10
|
-
The variable
|
20
|
+
The variable ABC will be substituted by its value, therefore a real life usage would look
|
11
21
|
something like this:
|
12
22
|
|
13
23
|
.. code-block:: console
|
14
24
|
|
15
|
-
IncludeDir "$(
|
25
|
+
IncludeDir "$(ABC)"
|
16
26
|
|
17
27
|
User defined variables
|
18
28
|
**********************
|
@@ -30,10 +40,12 @@ There are two ways to create user defined variables.
|
|
30
40
|
.. code-block:: console
|
31
41
|
|
32
42
|
Set MyVar, value: "Hello world!"
|
43
|
+
Set MyVar, cmd: "ruby calcVar.rb"
|
33
44
|
|
45
|
+
In the latter one the variable is set to the output of the command.
|
34
46
|
|
35
|
-
|
36
|
-
|
47
|
+
Predefined bake environment variables
|
48
|
+
*************************************
|
37
49
|
|
38
50
|
======================================== =============================================== ========================================
|
39
51
|
Variable Description Example
|
@@ -82,6 +94,8 @@ Variable Description
|
|
82
94
|
*$(LinkerPath)* Evaluates to the base path of the /usr/bin
|
83
95
|
linker
|
84
96
|
|
97
|
+
*$(ToolchainName)* Names of the used DefaultToolchain GCC
|
98
|
+
|
85
99
|
*$(/)* Evalutes to the directory path seperator of Windows: \\, Other: /
|
86
100
|
the current platform
|
87
101
|
|
@@ -89,33 +103,10 @@ Variable Description
|
|
89
103
|
of the current platform
|
90
104
|
======================================== =============================================== ========================================
|
91
105
|
|
92
|
-
|
93
|
-
|
94
|
-
It is also possible to retrieve arbitrary an *environment variable* using the following syntax:
|
95
|
-
|
96
|
-
.. code-block:: console
|
97
|
-
|
98
|
-
$(EnvironmentVariable)
|
99
|
-
|
100
|
-
Evaluates to the Environment with the specified name, if the specified environment variable does not exists
|
101
|
-
it will be substituted by an empty string.
|
102
|
-
|
103
|
-
.. note::
|
104
|
-
|
105
|
-
Equal variables in the main config
|
106
|
-
|
107
|
-
======================================== ========================================
|
108
|
-
Variable Is equal to
|
109
|
-
======================================== ========================================
|
110
|
-
$(MainConfigName) $(ConfigName)
|
111
|
-
|
112
|
-
$(MainProjectName) $(ProjectName)
|
113
|
-
======================================== ========================================
|
114
|
-
|
115
|
-
.. warning::
|
116
|
-
|
117
|
-
Variables in Dependency definitions are not allowed!
|
106
|
+
Environment variables
|
107
|
+
*********************
|
118
108
|
|
109
|
+
Usually used if system dependent stuff is needed like path to a specific tool etc.
|
119
110
|
|
120
111
|
Nested variables
|
121
112
|
****************
|
@@ -125,51 +116,33 @@ Example:
|
|
125
116
|
|
126
117
|
.. code-block:: console
|
127
118
|
|
128
|
-
$(OutputDir,$(TheProject),$(TheConfig))
|
129
119
|
$(ABC$(DEF)GH)
|
130
120
|
|
131
121
|
|
132
|
-
|
133
|
-
|
134
|
-
.. warning::
|
135
|
-
|
136
|
-
If paths to other projects are needed, e.g. to "bootloaderUpdater", don't write a hard coded relative path like this:
|
137
|
-
|
138
|
-
.. code-block:: text
|
139
|
-
|
140
|
-
CommandLine "../bootloaderUpdater/tools/PrimaryBootloader2Include.exe
|
141
|
-
|
142
|
-
If paths to other projects are needed, e.g. to "bootloaderUpdater" just reference it starting from the project folder.
|
143
|
-
|
144
|
-
Example:
|
145
|
-
|
146
|
-
.. code-block:: text
|
122
|
+
Complex variables
|
123
|
+
*****************
|
147
124
|
|
148
|
-
|
125
|
+
bake supports one complex variable:
|
149
126
|
|
150
|
-
|
151
|
-
|
152
|
-
.. code-block:: text
|
153
|
-
|
154
|
-
IncludeDir "myProjectName/bootloaderUpdater/whatever"
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
bake recognizes that the first part of the path is a valid project name and calculates the relative path to the project automatically.
|
159
|
-
If you have the special case that the referenced project is contained in an other workspace root, you can use the
|
160
|
-
`-w` parameter or you define a `roots.bake`.
|
127
|
+
.. code-block:: console
|
161
128
|
|
162
|
-
|
129
|
+
$(OutputDir,$(TheProject),$(TheConfig))
|
163
130
|
|
164
|
-
|
131
|
+
This will evaluate to the output directory of a specific configuration.
|
165
132
|
|
166
|
-
|
133
|
+
Notes and warnings
|
134
|
+
******************
|
167
135
|
|
168
|
-
|
136
|
+
Equal variables in the main config:
|
169
137
|
|
170
|
-
|
138
|
+
======================================== ========================================
|
139
|
+
Variable Is equal to
|
140
|
+
======================================== ========================================
|
141
|
+
$(MainConfigName) $(ConfigName)
|
171
142
|
|
172
|
-
|
143
|
+
$(MainProjectName) $(ProjectName)
|
144
|
+
======================================== ========================================
|
173
145
|
|
174
|
-
|
146
|
+
.. warning::
|
175
147
|
|
148
|
+
Variables in Dependency definitions are not allowed!
|
@@ -0,0 +1,34 @@
|
|
1
|
+
Generating dot graphs
|
2
|
+
*********************
|
3
|
+
|
4
|
+
In larger workspaces it's often hard to understand the dependency structure. With bake you can generate a dot file (see http://www.graphviz.org):
|
5
|
+
|
6
|
+
.. code-block:: console
|
7
|
+
|
8
|
+
bake ... --dot <dot filename>
|
9
|
+
|
10
|
+
The dot file is a text file with all dependencies included. It is easy to render an image, e.g. with
|
11
|
+
|
12
|
+
.. code-block:: console
|
13
|
+
|
14
|
+
tred <dot filename> | dot -Tpng -o <png image filename>
|
15
|
+
|
16
|
+
.. image:: ../_static/dot.png
|
17
|
+
|
18
|
+
- Projects are rectangles
|
19
|
+
- Configs are ellipses
|
20
|
+
- CustomConfigs are red
|
21
|
+
- ExecutableConfigs are green
|
22
|
+
- LibraryConfigs are cyan
|
23
|
+
|
24
|
+
It's possible to generate only a part of the whole graph with -p (same as for building only a part of the code). e.g.:
|
25
|
+
|
26
|
+
.. code-block:: console
|
27
|
+
|
28
|
+
bake ... --dot <dot filename> -p lib2
|
29
|
+
bake ... --dot <dot filename> -p lib2,testa
|
30
|
+
|
31
|
+
Which results in:
|
32
|
+
|
33
|
+
.. image:: ../_static/dotP.png
|
34
|
+
.. image:: ../_static/dotPC.png
|
Binary file
|
Binary file
|
Binary file
|
@@ -143,7 +143,12 @@ z-index: 100;
|
|
143
143
|
}<br>
|
144
144
|
<span class="help" onMouseover="showLintPolicy()" onMouseout="notip()">LintPolicy</span> <policy><br>
|
145
145
|
<span class="help" onMouseover="showDocu()" onMouseout="notip()">Docu</span> <cmdLine><br>
|
146
|
+
}<br>
|
147
|
+
<span class="help" onMouseover="showPrebuild()" onMouseout="notip()">Prebuild</span> {<br>
|
148
|
+
<span class="help" onMouseover="showExcept()" onMouseout="notip()">Except</span> <project>,
|
149
|
+
<span class="help" onMouseover="showExceptConfig()" onMouseout="notip()">config</span>: <name><br>
|
146
150
|
}<br></span><br>
|
151
|
+
|
147
152
|
</span>
|
148
153
|
|
149
154
|
<span id="libExe_part"><span class="show" style="background-color:#EEEEEE;">
|
@@ -543,6 +548,21 @@ function flagExample() {
|
|
543
548
|
" An inherited flag string \"-abc -g3 -xy\" will end up in \"-abc -xy\"."
|
544
549
|
}
|
545
550
|
|
551
|
+
function showPrebuild() {
|
552
|
+
str = 'If defined, all configs of the workspace will be skipped per default. Must be actived by the commandline option "--prebuild"'
|
553
|
+
ddrivetip("Prebuild", "No","0..1","No project/config is skipped",str)
|
554
|
+
}
|
555
|
+
|
556
|
+
function showExcept() {
|
557
|
+
str = 'Defines a project which shall not be skipped. If project name is omitted, the current project is used.'
|
558
|
+
ddrivetip("Except", "No","0..n","Every project is skipped",str)
|
559
|
+
}
|
560
|
+
|
561
|
+
function showExceptConfig() {
|
562
|
+
str = 'Defines a config which shall not be skipped. If omitted, all configs of the apprpriate project are not skipped.'
|
563
|
+
ddrivetip("Toolchain", "No","0..1","Every config is skipped",str)
|
564
|
+
}
|
565
|
+
|
546
566
|
|
547
567
|
function showToolchainProject() {
|
548
568
|
str = 'Toolchain adaptions for a project.'
|