make-packaging-target.py 6.62 KB
Newer Older
aviau's avatar
aviau committed
1 2
#!/usr/bin/env python3
#
3
# Copyright (C) 2016-2017 Savoir-faire Linux Inc.
aviau's avatar
aviau committed
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
#
# Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
#
# This program 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 program 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 program.  If not, see <http://www.gnu.org/licenses/>.
#
# Creates packaging targets for a distribution and architecture.
# This helps reduce the lenght of the top Makefile.
#

import argparse

target_template = """\
##
## Distro: %(distribution)s
##

31 32 33 34 35 36 37 38 39
# We don't simply use ring-packaging-distro as the docker image name because
# we want to be able to build multiple versions of the same distro at the
# same time and it could result in race conditions on the machine as we would
# overwrite the docker image of other builds.
#
# This does not impact caching as the docker daemon does not care about the image
# names, just about the contents of the Dockerfile.
PACKAGE_%(distribution)s_DOCKER_IMAGE_NAME:=ring-packaging-%(distribution)s$(RING_PACKAGING_IMAGE_SUFFIX)
PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE:=.docker-image-$(PACKAGE_%(distribution)s_DOCKER_IMAGE_NAME)
40
DOCKER_EXTRA_ARGS =
41

42
PACKAGE_%(distribution)s_DOCKER_RUN_COMMAND = docker run \\
aviau's avatar
aviau committed
43 44 45 46 47 48
    --rm \\
    -e RELEASE_VERSION=$(RELEASE_VERSION) \\
    -e RELEASE_TARBALL_FILENAME=$(RELEASE_TARBALL_FILENAME) \\
    -e DEBIAN_VERSION=$(DEBIAN_VERSION) \\
    -e DEBIAN_PACKAGING_OVERRIDE=%(debian_packaging_override)s \\
    -e CURRENT_UID=$(CURRENT_UID) \\
aviau's avatar
aviau committed
49
    -e DISTRIBUTION=%(distribution)s \\
aviau's avatar
aviau committed
50 51
    -v $(CURDIR):/opt/ring-project-ro:ro \\
    -v $(CURDIR)/packages/%(distribution)s:/opt/output \\
52 53
    -t $(DOCKER_EXTRA_ARGS) \\
    $(PACKAGE_%(distribution)s_DOCKER_IMAGE_NAME)
aviau's avatar
aviau committed
54

55
$(PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE): docker/Dockerfile_%(distribution)s
aviau's avatar
aviau committed
56
	docker build \\
57
        -t $(PACKAGE_%(distribution)s_DOCKER_IMAGE_NAME) \\
aviau's avatar
aviau committed
58 59
        -f docker/Dockerfile_%(distribution)s \\
        $(CURDIR)
60
	touch $(PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE)
aviau's avatar
aviau committed
61 62 63 64

packages/%(distribution)s:
	mkdir -p packages/%(distribution)s

aviau's avatar
aviau committed
65
packages/%(distribution)s/%(output_file)s: $(RELEASE_TARBALL_FILENAME) packages/%(distribution)s $(PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE)
aviau's avatar
aviau committed
66 67 68 69
	$(PACKAGE_%(distribution)s_DOCKER_RUN_COMMAND)
	touch packages/%(distribution)s/*

.PHONY: package-%(distribution)s
aviau's avatar
aviau committed
70
package-%(distribution)s: packages/%(distribution)s/%(output_file)s
aviau's avatar
aviau committed
71 72

.PHONY: package-%(distribution)s-interactive
73
package-%(distribution)s-interactive: DOCKER_EXTRA_ARGS = -i
74
package-%(distribution)s-interactive: $(RELEASE_TARBALL_FILENAME) packages/%(distribution)s $(PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE)
aviau's avatar
aviau committed
75 76 77 78
	$(PACKAGE_%(distribution)s_DOCKER_RUN_COMMAND) bash
"""


aviau's avatar
aviau committed
79
def generate_target(distribution, debian_packaging_override, output_file):
aviau's avatar
aviau committed
80 81 82
    return target_template % {
        "distribution": distribution,
        "debian_packaging_override": debian_packaging_override,
aviau's avatar
aviau committed
83
        "output_file": output_file,
aviau's avatar
aviau committed
84 85 86 87 88 89 90 91 92 93 94 95
    }


def run_generate(parsed_args):
    print(generate_target(parsed_args.distribution,
                          parsed_args.debian_packaging_override))


def run_generate_all(parsed_args):
    targets = [
        # Debian
        {
aviau's avatar
aviau committed
96
            "distribution": "debian_9",
aviau's avatar
aviau committed
97
            "debian_packaging_override": "",
aviau's avatar
aviau committed
98
            "output_file": "$(DEBIAN_DSC_FILENAME)",
aviau's avatar
aviau committed
99 100
        },
        {
aviau's avatar
aviau committed
101
            "distribution": "debian_9_i386",
aviau's avatar
aviau committed
102
            "debian_packaging_override": "",
aviau's avatar
aviau committed
103
            "output_file": "$(DEBIAN_DSC_FILENAME)",
aviau's avatar
aviau committed
104 105 106
        },
        # Ubuntu
        {
aviau's avatar
aviau committed
107
            "distribution": "ubuntu_16.04",
aviau's avatar
aviau committed
108
            "debian_packaging_override": "",
aviau's avatar
aviau committed
109
            "output_file": "$(DEBIAN_DSC_FILENAME)",
aviau's avatar
aviau committed
110 111
        },
        {
aviau's avatar
aviau committed
112
            "distribution": "ubuntu_16.04_i386",
aviau's avatar
aviau committed
113
            "debian_packaging_override": "",
aviau's avatar
aviau committed
114 115 116
            "output_file": "$(DEBIAN_DSC_FILENAME)",
        },
        {
117
            "distribution": "ubuntu_17.10",
118 119 120 121
            "debian_packaging_override": "",
            "output_file": "$(DEBIAN_DSC_FILENAME)",
        },
        {
122
            "distribution": "ubuntu_17.10_i386",
123 124 125
            "debian_packaging_override": "",
            "output_file": "$(DEBIAN_DSC_FILENAME)",
        },
126
        {
127
            "distribution": "ubuntu_18.04",
128 129 130 131
            "debian_packaging_override": "",
            "output_file": "$(DEBIAN_DSC_FILENAME)",
        },
        {
132
            "distribution": "ubuntu_18.04_i386",
133 134 135
            "debian_packaging_override": "",
            "output_file": "$(DEBIAN_DSC_FILENAME)",
        },
aviau's avatar
aviau committed
136
        # Fedora
137 138 139 140 141 142 143 144 145 146
        {
            "distribution": "fedora_26",
            "debian_packaging_override": "",
            "output_file": ".packages-built",
        },
        {
            "distribution": "fedora_26_i386",
            "debian_packaging_override": "",
            "output_file": ".packages-built",
        },
Guillaume Roguez's avatar
Guillaume Roguez committed
147 148 149 150 151 152 153 154 155 156
        {
            "distribution": "fedora_27",
            "debian_packaging_override": "",
            "output_file": ".packages-built",
        },
        {
            "distribution": "fedora_27_i386",
            "debian_packaging_override": "",
            "output_file": ".packages-built",
        },
Stefan Langenmaier's avatar
Stefan Langenmaier committed
157 158 159 160 161 162
        # Gentoo
        {
            "distribution": "gentoo",
            "debian_packaging_override": "",
            "output_file": ".packages-built",
        },
aviau's avatar
aviau committed
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

    ]

    for target in targets:
        print(generate_target(**target))


def parse_args():
    ap = argparse.ArgumentParser(
        description="Packaging targets generation tool"
    )

    ga = ap.add_mutually_exclusive_group(required=True)

    # Action arguments
    ga.add_argument('--generate',
                    action='store_true',
                    help='Generate a single packaging target')
    ga.add_argument('--generate-all',
                    action='store_true',
                    help='Generates all packaging targets')

    # Parameters
    ap.add_argument('--distribution')
    ap.add_argument('--architecture')
    ap.add_argument('--debian_packaging_override', default='')
aviau's avatar
aviau committed
189
    ap.add_argument('--output_file')
aviau's avatar
aviau committed
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205

    parsed_args = ap.parse_args()

    return parsed_args


def main():
    parsed_args = parse_args()

    if parsed_args.generate:
        run_generate(parsed_args)
    elif parsed_args.generate_all:
        run_generate_all(parsed_args)

if __name__ == "__main__":
    main()