aboutsummaryrefslogtreecommitdiff
path: root/cbc/cli/build.py
blob: ad0151ac9beebae8374dc2e0b180a85f835c5f54 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/env python
import argparse
import os
import traceback
import conda_build.metadata
import cbc
from cbc.exceptions import CondaBuildError

def main():
    no_upload = ''
    use_local = ''

    parser = argparse.ArgumentParser()
    parser.add_argument('--force-rebuild',
                        action='store_true',
                        help='Do not stop if package already installed')
    parser.add_argument('--no-build',
                        action='store_true',
                        help='Generate metadata from cbc configuration (useful for manual building)')
    parser.add_argument('--no-upload',
                        action='store_true',
                        help='Do not upload to anaconda.org (aka. binstar)')
    parser.add_argument('--use-local',
                        action='store_true',
                        help='Install built package from [...]/conda-bld/pkgs repository')
    parser.add_argument('cbcfile',
                        nargs='+',
                        help='CBC metadata')
    args = parser.parse_args()

    # Initialize cbc internal environment
    env = cbc.environment.Environment()

    # Convert cbcfile paths to absolute paths
    args.cbcfile = [ os.path.abspath(x) for x in args.cbcfile ]

    # Verify we have a file that exists
    for cbcfile in args.cbcfile:
        if not os.path.exists(cbcfile):
            print('{} does not exist.'.format(cbcfile))
            exit(1)
        elif not os.path.isfile(cbcfile):
            print('{} is not a file.'.format(cbcfile))
            exit(1)

    if args.no_upload:
        no_upload = '--no-binstar-upload'

    if args.use_local:
        use_local = '--use-local'

    print('CBC_HOME is {0}'.format(env.cbchome))
    # Perform build(s)
    for cbcfile in args.cbcfile:
        print('Using cbc build configuration: {0}'.format(cbcfile))
        # Ensure the working directory remains the same throughout.
        os.chdir(env.pwd)

        metadata = cbc.meta.MetaData(cbcfile, env)
        metadata.env.mkpkgdir(metadata.local['package']['name'])
        metadata.render_scripts()
        metadata.copy_patches()

        print('Scripts written to {0}'.format(metadata.env.pkgdir))

        if args.no_build:
            continue

        print('Generating Conda metadata...')
        conda_metadata = conda_build.metadata.MetaData(env.pkgdir)

        if not args.force_rebuild:
            if cbc.utils.conda_search(conda_metadata) == conda_metadata.dist():
                print('{0} matches an installed package; increment the build number to rebuild or use --force-rebuild.'.format(conda_metadata.dist()))
                continue

        conda_builder_args = [no_upload, use_local]
        try:
            print('Initializing Conda build...')
            built = cbc.utils.conda_builder(metadata, conda_builder_args)
            if not built:
                print('Failure occurred building: {0}'.format(conda_metadata.dist()))
                continue
        except CondaBuildError as cbe:
            print(traceback.format_exc())
            continue

        print('Installing Conda package...')
        package_exists = cbc.utils.conda_search(conda_metadata)

        if not package_exists:
            cbc.utils.conda_install(conda_metadata.name())
        elif package_exists:
            if args.force_rebuild:
                cbc.utils.conda_reinstall(conda_metadata.name())

        print('')


if __name__ == '__main__':
    main()