aboutsummaryrefslogtreecommitdiff
path: root/cbcbuild.py
blob: 5b0264779d42a6aca57f3f72f77081c97409fc79 (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
#!/usr/bin/env python
import argparse
import os
import sys
import cbc
import conda_build.metadata


#os.environ['CBC_HOME'] = os.path.abspath(os.path.join(os.path.dirname(cbc.__file__), 'tests/data/build'))
#sys.argv.append('--force-rebuild')
#sys.argv.append('tests/data/aprio.ini')

if __name__ == '__main__':
    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('cbcfile',
                        nargs='+', 
                        help='CBC metadata')
    args = parser.parse_args()
    
    # Initialize 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)
    
    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.name()) == conda_metadata.dist():
                print('{0} metadata matches an installed package; increment the build number to rebuild or use --force-rebuild.'.format(conda_metadata.dist()))
                continue
        
        conda_builder_args = {'get_src': True, 'verbose': False}
        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 cbc.exceptions.CondaBuildError as cbe:
            print(cbe)
            continue
        
        print('Installing Conda package...')
        package_exists = cbc.utils.conda_search(conda_metadata.name())

        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('')