summaryrefslogtreecommitdiffstats
path: root/ansible/library/my_make.py
blob: 35240851cb4e6932abefefed705aaf983edcdf93 (plain)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/python
# -*- coding: utf-8 -*-

# (c) 2015, Linus Unnebäck <linus@folkdatorn.se>
#
# This file is part of Ansible
#
# This module is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this software.  If not, see <http://www.gnu.org/licenses/>.

from __future__ import absolute_import
DOCUMENTATION = '''
---
module: my_make
short_description: Run targets in a Makefile
requirements: [ make ]
version_added: "2.1"
author: Linus Unnebäck (@LinusU) <linus@folkdatorn.se>
description:
  - Run targets in a Makefile.
options:
  target:
    description:
      - The target to run
    required: false
    default: none
  params:
    description:
      - Any extra parameters to pass to make
    required: false
    default: none
  extra_args:
    description:
      - Any extra options to pass to make
    required: false
    default: none
  chdir:
    description:
      - cd into this directory before running make
    required: true
'''

EXAMPLES = '''
# Build the default target
- make: chdir=/home/ubuntu/cool-project

# Run `install` target as root
- make: chdir=/home/ubuntu/cool-project target=install
  become: yes

# Pass in extra arguments to build
- make:
    chdir: /home/ubuntu/cool-project
    target: all
    params:
      NUM_THREADS: 4
      BACKEND: lapack
'''

# TODO: Disabled the RETURN as it was breaking docs building. Someone needs to
# fix this
RETURN = '''# '''


def format_params(params):
    return [k + '=' + str(v) for k, v in params.items()]


def push_arguments(cmd, args):
    if args['extra_args'] is not None:
        cmd.extend(shlex.split(args['extra_args']))
    if args['target'] is not None:
        cmd.append(args['target'])
    if args['params'] is not None:
        cmd.extend(format_params(args['params']))
    return cmd


def check_changed(make_path, module, args):
    cmd = push_arguments([make_path, '--question'], args)
    rc, _, __ = module.run_command(cmd, check_rc=False, cwd=args['chdir'])
    return rc != 0


def run_make(make_path, module, args):
    cmd = push_arguments([make_path], args)
    module.run_command(cmd, check_rc=True, cwd=args['chdir'])


def main():
    module = AnsibleModule(
        supports_check_mode=True,
        argument_spec=dict(
            target=dict(required=False, default=None, type='str'),
            params=dict(required=False, default=None, type='dict'),
            extra_args=dict(required=False, default=None, type='str'),
            chdir=dict(required=True, default=None, type='str'),
        ),
    )
    args = dict(
        changed=False,
        failed=False,
        target=module.params['target'],
        params=module.params['params'],
        extra_args=module.params['extra_args'],
        chdir=module.params['chdir'],
    )
    make_path = module.get_bin_path('make', True)

    # Check if target is up to date
    args['changed'] = check_changed(make_path, module, args)

    # Check only; don't modify
    if module.check_mode:
        module.exit_json(changed=args['changed'])

    # Target is already up to date
    if not args['changed']:
        module.exit_json(**args)

    run_make(make_path, module, args)
    module.exit_json(**args)

from ansible.module_utils.basic import *

if __name__ == '__main__':
    main()