blob: 30105a6b396f8c20e1552092d88ff42a7f11634e [file] [log] [blame]
#!/usr/bin/env python
from __future__ import print_function
from os import path, listdir
import sh
from mkdocs import config
import yaml
# repos of products that are released together
mynewt_repos = ['mynewt-core', 'mynewt-newt', 'mynewt-newtmgr']
nimble_repo = 'mynewt-nimble'
revisioned_repos = [nimble_repo] + mynewt_repos[:]
dependent_repos = ['mynewt-documentation'] + revisioned_repos[:]
BSP_DIR = "hw/bsp"
BSP_ARCH_NAMES = {
'arc': 'ARC',
'cortex_m0': 'Cortex-M0',
'cortex_m3': 'Cortex-M3',
'cortex_m33': 'Cortex-M33',
'cortex_m4': 'Cortex-M4',
'cortex_m7': 'Cortex-M7',
'mips': 'MIPS',
'pic32': 'PIC32',
'rv32imac': 'RISC-V',
}
class BSP:
'''
Stores data for Mynewt BSPs
'''
def __init__(self, name, url, maker, arch):
self.name = name
self.url = url
self.maker = maker
self._arch = arch
def arch(self):
return BSP_ARCH_NAMES[self._arch]
def repr(self):
return "{}(name={}, url={}, maker={})".format(
self.__class__.__name__, self.name, self.url, self.maker)
def generate_supported_boards(filename, bsps):
with open(filename, 'w') as f:
f.write("<ul>\n")
for bsp in bsps:
f.write("<li>\n")
f.write("<a href=\"{}\"> {} </a> from {} ({})\n".format(bsp.url,
bsp.name,
bsp.maker,
bsp.arch()))
f.write("</li>\n")
f.write("</ul>\n")
def find_BSPs():
bsp_dir = path.join(cwd, '../mynewt-core', BSP_DIR)
if not path.isdir(bsp_dir):
raise Exception("The directory %s does not exist".format(bsp_dir))
bsps = []
for bsp in listdir(bsp_dir):
with open(path.join(bsp_dir, bsp, "bsp.yml"), 'r') as f:
data = yaml.full_load(f)
for k in ['bsp.name', 'bsp.url', 'bsp.maker', 'bsp.arch']:
# XXX might also skip bsp.arch that starts with 'sim'?
if k not in data:
print("{} is missing metadata".format(bsp))
break
else:
bsp = BSP(name=data['bsp.name'], url=data['bsp.url'],
maker=data['bsp.maker'], arch=data['bsp.arch'])
bsps.append(bsp)
return bsps
def build(cwd, site_dir):
cfg = config.load_config()
# sanity check - dependent_repos exist in '..'
for repo in dependent_repos:
d = path.join(cwd, '..', repo)
print('Verifying repo dependency in {}'.format(d))
if not path.isdir(d):
print("The directory %s does not exist".format(d))
return
# return all extra repos to master in case last run failed
for repo in revisioned_repos:
repo_dir = path.normpath(path.join(cwd, '..', repo))
sh.git('checkout', 'master', _cwd=repo_dir)
# sanity check - only one latest
latest = False
latest_version = None
for version in cfg['extra']['versions']:
if not latest and 'latest' in version and version['latest']:
print('Latest is {}'.format(version['label']))
latest = True
latest_version = version['label']
elif latest and 'latest' in version and version['latest']:
print('ERROR: More than one version is latest.')
print('Only one version can be latest: True.')
print('Check mkdocs.yml.')
return
print("Building site pages")
sh.rm('-rf', site_dir)
bsps = find_BSPs()
generate_supported_boards("custom-theme/supported-boards.html", bsps)
sh.mkdocs('build', '--clean', '--site-dir', site_dir)
for version in cfg['extra']['versions']:
print("Building doc pages for: {}".format(version['label']))
if 'sha' not in version:
sh.mkdocs('build', '--site-dir',
path.join(site_dir, version['dir']),
_cwd=path.join("versions", version['dir']))
else:
sha = version['sha']
for repo in mynewt_repos:
repo_dir = path.normpath(path.join(cwd, '..', repo))
sh.git('checkout', sha, _cwd=repo_dir)
sha = version['nimble_sha']
nimble_dir = path.normpath(path.join(cwd, '..', nimble_repo))
sh.git('checkout', sha, _cwd=nimble_dir)
repo_dir = path.normpath(path.join(cwd, '..',
'mynewt-documentation'))
sh.make('clean', _cwd=repo_dir)
sh.make('docs',
'O=-A cur_version={} -A latest_version={}'.format(
version['label'], latest_version), _cwd=repo_dir)
sh.mv(path.join(repo_dir, '_build', 'html'),
path.join(site_dir, version['dir']))
if 'latest' in version and version['latest']:
sh.ln('-s', version['dir'], 'latest', _cwd=site_dir)
if __name__ == '__main__':
cwd = path.dirname(path.abspath(__file__))
build(cwd, path.join(cwd, "site"))