279 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
<!--
 | 
						|
 | 
						|
@license Apache-2.0
 | 
						|
 | 
						|
Copyright (c) 2018 The Stdlib Authors.
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
-->
 | 
						|
 | 
						|
# Manifest
 | 
						|
 | 
						|
> Load a manifest for compiling source files.
 | 
						|
 | 
						|
<!-- Section to include introductory text. Make sure to keep an empty line after the intro `section` element and another before the `/section` close. -->
 | 
						|
 | 
						|
<section class="intro">
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.intro -->
 | 
						|
 | 
						|
<!-- Package usage documentation. -->
 | 
						|
 | 
						|
<section class="usage">
 | 
						|
 | 
						|
## Usage
 | 
						|
 | 
						|
```javascript
 | 
						|
var manifest = require( '@stdlib/utils/library-manifest' );
 | 
						|
```
 | 
						|
 | 
						|
#### manifest( filepath, conditions\[, options] )
 | 
						|
 | 
						|
Loads a manifest for compiling source files.
 | 
						|
 | 
						|
```javascript
 | 
						|
var conditions = {
 | 
						|
    'os': 'linux'
 | 
						|
};
 | 
						|
 | 
						|
var conf = manifest( './examples/manifest.json', conditions );
 | 
						|
// returns <Object>
 | 
						|
```
 | 
						|
 | 
						|
The function accepts the following `options`:
 | 
						|
 | 
						|
-   **basedir**: base directory from which to search for dependencies. Default: current working directory.
 | 
						|
-   **paths**: path convention. Must be either `'win32'`, `'mixed'`, or `'posix'`. Default: based on host platform.
 | 
						|
 | 
						|
The default search directory is the current working directory of the calling process. To specify an alternative search directory, set the `basedir` option.
 | 
						|
 | 
						|
```javascript
 | 
						|
var conditions = {
 | 
						|
    'os': 'linux'
 | 
						|
};
 | 
						|
 | 
						|
var opts = {
 | 
						|
    'basedir': __dirname
 | 
						|
};
 | 
						|
 | 
						|
var conf = manifest( './examples/manifest.json', conditions, opts );
 | 
						|
// returns <Object>
 | 
						|
```
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.usage -->
 | 
						|
 | 
						|
<!-- Package usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->
 | 
						|
 | 
						|
<section class="notes">
 | 
						|
 | 
						|
## Notes
 | 
						|
 | 
						|
-   A _manifest_ is a [JSON][json] file having the following fields:
 | 
						|
 | 
						|
    -   **options**: an `object` containing key-value pairs. Each key corresponds to a field in **confs** and may be used to conditionally select a configuration. Each value corresponds to the key's default value. The value for each field in a provided `conditions` object which has a corresponding field in **options** overrides the default value.
 | 
						|
 | 
						|
        Option keys are akin to primary keys in relational databases, in the sense that they should be used to uniquely identify a particular configuration. While individual key values may be shared across configurations, each configuration should have a unique combination of key values. Furthermore, default option values considered as a unique set should identify one and only one default configuration.
 | 
						|
 | 
						|
    -   **fields**: an object `array` where each `object` has the following fields:
 | 
						|
 | 
						|
        -   **field**: key name corresponding to a field in **confs**.
 | 
						|
        -   **resolve**: `boolean` indicating whether to resolve field values as file paths. If `true`, all field values are resolved relative to the manifest file.
 | 
						|
        -   **relative**: `boolean` indicating whether to resolve field values as relative file paths. This field is **only** considered when a manifest is a root manifest. If `true`, all field values, including those originating from dependencies, are resolved as relative file paths relative the root manifest.
 | 
						|
 | 
						|
    -   **confs**: an object `array` where each `object` corresponds to a manifest configuration. Each `object` has the following fields:
 | 
						|
 | 
						|
        -   **src**: `array` of source files.
 | 
						|
        -   **include**: `array` of include directories.
 | 
						|
        -   **libraries**: `array` of linked library dependencies.
 | 
						|
        -   **libpath**: `array` of linked library paths.
 | 
						|
        -   **dependencies**: `array` of package dependencies containing source files.
 | 
						|
 | 
						|
    An example _manifest_:
 | 
						|
 | 
						|
    ```text
 | 
						|
    {
 | 
						|
      "options": {
 | 
						|
        "os": "linux"
 | 
						|
      },
 | 
						|
      "fields": [
 | 
						|
        {
 | 
						|
          "field": "src",
 | 
						|
          "resolve": true,
 | 
						|
          "relative": true
 | 
						|
        },
 | 
						|
        {
 | 
						|
          "field": "include",
 | 
						|
          "resolve": true,
 | 
						|
          "relative": false
 | 
						|
        },
 | 
						|
        {
 | 
						|
          "field": "libraries",
 | 
						|
          "resolve": false,
 | 
						|
          "relative": false
 | 
						|
        },
 | 
						|
        {
 | 
						|
          "field": "libpath",
 | 
						|
          "resolve": true,
 | 
						|
          "relative": false
 | 
						|
        }
 | 
						|
      ],
 | 
						|
      "confs": [
 | 
						|
        {
 | 
						|
          "os": "linux",
 | 
						|
          "src": [
 | 
						|
            "./src/foo_linux.f",
 | 
						|
            "./src/foo_linux.c"
 | 
						|
          ],
 | 
						|
          "include": [
 | 
						|
            "./include"
 | 
						|
          ],
 | 
						|
          "libraries": [],
 | 
						|
          "libpath": [],
 | 
						|
          "dependencies": [
 | 
						|
            "@stdlib/blas/base/daxpy",
 | 
						|
            "@stdlib/blas/base/dasum",
 | 
						|
            "@stdlib/blas/base/dcopy"
 | 
						|
          ]
 | 
						|
        }
 | 
						|
      ]
 | 
						|
    }   
 | 
						|
    ```
 | 
						|
 | 
						|
-   The function recursively walks the manifest dependency tree to resolve **all** source files, libraries, library paths, and include directories.
 | 
						|
 | 
						|
-   An input `filepath` may be either a relative or absolute file path. If provided a relative file path, a manifest is resolved relative to the base search directory.
 | 
						|
 | 
						|
-   If a `conditions` object contains fields which do not correspond to manifest options, those fields are ignored (i.e., the "extra" fields have no effect when filtering manifest configurations). This allows providing a `conditions` object containing fields which only apply to certain subsets of manifest dependencies.
 | 
						|
 | 
						|
-   If no fields in a `conditions` object have corresponding fields in a manifest's options, the function returns a manifest's default configuration.
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.notes -->
 | 
						|
 | 
						|
<!-- Package usage examples. -->
 | 
						|
 | 
						|
<section class="examples">
 | 
						|
 | 
						|
## Examples
 | 
						|
 | 
						|
<!-- eslint no-undef: "error" -->
 | 
						|
 | 
						|
```javascript
 | 
						|
var join = require( 'path' ).join;
 | 
						|
var manifest = require( '@stdlib/utils/library-manifest' );
 | 
						|
 | 
						|
// Resolve the absolute path of the manifest JSON file:
 | 
						|
var fpath = join( __dirname, 'examples', 'manifest.json' );
 | 
						|
 | 
						|
// Specify conditions for determining which configuration to load:
 | 
						|
var conditions = {
 | 
						|
    'os': 'mac'
 | 
						|
};
 | 
						|
 | 
						|
// Specify options:
 | 
						|
var opts = {
 | 
						|
    'basedir': __dirname
 | 
						|
};
 | 
						|
 | 
						|
// Load a manifest configuration:
 | 
						|
var conf = manifest( fpath, conditions, opts );
 | 
						|
console.dir( conf );
 | 
						|
```
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.examples -->
 | 
						|
 | 
						|
<!-- Section for describing a command-line interface. -->
 | 
						|
 | 
						|
* * *
 | 
						|
 | 
						|
<section class="cli">
 | 
						|
 | 
						|
## CLI
 | 
						|
 | 
						|
<!-- CLI usage documentation. -->
 | 
						|
 | 
						|
<section class="usage">
 | 
						|
 | 
						|
### Usage
 | 
						|
 | 
						|
```text
 | 
						|
Usage: library-manifest [options] <filepath> [-- --<condition>=value ...]
 | 
						|
 | 
						|
Options:
 | 
						|
 | 
						|
  -h,    --help                Print this message.
 | 
						|
  -V,    --version             Print the package version.
 | 
						|
         --dir basedir         Base search directory.
 | 
						|
         --paths convention    Path convention.
 | 
						|
```
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.usage -->
 | 
						|
 | 
						|
<!-- CLI usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->
 | 
						|
 | 
						|
<section class="notes">
 | 
						|
 | 
						|
### Notes
 | 
						|
 | 
						|
-   Use command-line flags to specify conditions by placing them after a `--` separator.
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.notes -->
 | 
						|
 | 
						|
<!-- CLI usage examples. -->
 | 
						|
 | 
						|
<section class="examples">
 | 
						|
 | 
						|
### Examples
 | 
						|
 | 
						|
```bash
 | 
						|
$ library-manifest ./examples/manifest.json -- --os mac
 | 
						|
```
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.examples -->
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.cli -->
 | 
						|
 | 
						|
<!-- Section to include cited references. If references are included, add a horizontal rule *before* the section. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->
 | 
						|
 | 
						|
<section class="references">
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.references -->
 | 
						|
 | 
						|
<!-- Section for all links. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->
 | 
						|
 | 
						|
<section class="links">
 | 
						|
 | 
						|
[json]: http://www.json.org/
 | 
						|
 | 
						|
</section>
 | 
						|
 | 
						|
<!-- /.links -->
 |