vxSDK/vxsdk/cli/build/__init__.py

157 lines
5.4 KiB
Python

"""vxsdk-build modules
This module provides package abstraction and build core function for the Vhex
Operating system project.
"""
from core.logger import log
from cli.build.default import build_default_cli
from cli.build.doctor import build_doctor_cli
__all__ = [
'__VXSDK_MODULE_META__',
'cli_validate',
'cli_parse',
]
__VXSDK_MODULE_META__ = (
['build'],
"Build a project",
r"""vxsdk-build
Build System Abstraction
USAGE:
vxsdk build(-<platform>) [OPTIONS]
DESCRIPTION:
Compile Vhex project.
NOTES:
The Vex build system is extremely powerful and polyvalent. It allows the
user to totally ignore the build part and the dependencies management.
All Vhex projects use a <.vxsdk.toml> file wich should be stored at the root
of the project directory (you cam generate a project template using the
`vxsdk project new <project>`). This file uses the TOML language to control
the build step of a project.
```
# Default meta-data information for the pacakge manager.
[project]
name = 'myaddin' # required
version = '1.0.0' # required
type = 'addin' # optional ('addin' or 'app')
description = ''' # optional
An old-school demo-scene !
Written by Yatis :)
'''
# Dependencies information for the build manager. (optional)
#
# The version can target <tag> or branch name.
#
# Note that you can use a powerfull operations for managing version of
# dependencies if the 'version' is detected to respect the correct
# semantic versioning like caret (^), tilde (~) and wildcard (*):
#
# Caret requirements (^)
# ^1.2.3 := >=1.2.3, <2.0.0
# ^1.2 := >=1.2.0, <2.0.0
# ^1 := >=1.0.0, <2.0.0
# ^0.2.3 := >=0.2.3, <0.3.0
# ^0.2 := >=0.2.0, <0.3.0
# ^0.0.3 := >=0.0.3, <0.0.4
# ^0.0 := >=0.0.0, <0.1.0
# ^0 := >=0.0.0, <1.0.0
#
# Tilde requirements (~)
# ~1.2.3 := >=1.2.3, <1.3.0
# ~1.2 := >=1.2.0, <1.3.0
# ~1 := >=1.0.0, <2.0.0
#
# Wildcard requirements (*)
# * := >=0.0.0
# 1.* := >=1.0.0, <2.0.0
# 1.2.* := >=1.2.0, <1.3.0
#
# Note that it's possible that a package can have two same versions (one
# for branch name and another for a tag), by default, the tag is always
# selected, but here the display information will explicitly describe if
# the version is a tag and / or a branch.
[dependencies]
vxkernel = 'master' # recommanded
sh-elf-vhex = 'master' # recommanded
custom-lib = '^1.5' # exemple of carret (^) operation
# Manual build indication (option)
#
# Note that if this section is specified then only this build indication
# will be executed, no default step will be used
#
# All building steop are, in order:
# > configure
# > build
# > install
# And during all of theses building step, the vxSDk setup some
# environment variable:
# > VXSDK_PKG_NAME - project name
# > VXSDK_PKG_VERSION - project version
# > VXSDK_PREFIX_BUILD - project build prefix (for object files)
# > VXSDK_PREFIX_INSTALL - project installation prefix
# > VXSDK_PREFIX_LIB - prefix for all stored librairy
# > VXSDK_CFLAGS_INCLUDE - Include flags for GCC
# > VXSDK_CFLAGS_LINK - Linker flags for GCC
# > VXSDK_ASSETS_SRC - Assets sources file directory
# > VXSDK_ASSETS_BUILD - Assets build directory (for object)
[build]
configure = 'mkdir -p build && cd build && ../configure --verbose'
build = 'cd build && make'
# Dependencies Hook (optional)
#
# You need to create a section wich is named like [extra.<package_name>]
# and you can "hook" some step of particular dependencies (here
# vxkernel for exemple).
#
# A hook is simply additional string that will be send to the
# appropriate step of the build.
[extra.vxkernel]
configure = '--static --verbose'
```
Above is a exemple of a defaut project configuration file that can be used
for a new project.
OPTIONS:
-v, --verbose Disable threading and display log information
-r, --rebuild Force rebuild the project
-u, --update Update dependencies
--extra-conf [ARG]... Add extra configuration flags
--extra-build [ARG]... Add extra build flags
ACTIONS:
doctor Display all information about one package
"""
)
#---
# Public
#---
def cli_validate(name):
""" validate the module name """
return name.find('build') == 0
def cli_parse(argv):
""" Build subcommand entry """
if len(argv) > 2:
if '--help' in argv or '-h' in argv:
log.user(__VXSDK_MODULE_META__[2])
return 0
if argv[1] == 'doctor':
return build_doctor_cli(argv[2:])
return build_default_cli(argv)