blob: e03358b31c623bddef47180dfd7bf8ba5d0b37be [file] [log] [blame]
Tim Duesterhus288c0772020-07-28 23:00:35 +02001# Copyright 2019 Ilya Shipitsin <chipitsine@gmail.com>
2# Copyright 2020 Tim Duesterhus <tim@bastelstu.be>
3#
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License
6# as published by the Free Software Foundation; either version
7# 2 of the License, or (at your option) any later version.
8
9import json
Tim Duesterhus8d173e12020-11-20 00:16:00 +010010import sys
Ilya Shipitsinbfdc6842022-05-13 21:59:38 +050011import urllib.request
12import re
Tim Duesterhus04ca2342022-10-14 19:46:06 +020013from os import environ
Tim Duesterhus8d173e12020-11-20 00:16:00 +010014
15if len(sys.argv) == 2:
16 build_type = sys.argv[1]
17else:
18 print("Usage: {} <build_type>".format(sys.argv[0]), file=sys.stderr)
19 sys.exit(1)
20
21print("Generating matrix for type '{}'.".format(build_type))
Tim Duesterhus288c0772020-07-28 23:00:35 +020022
23
24def clean_os(os):
25 if os == "ubuntu-latest":
26 return "Ubuntu"
27 elif os == "macos-latest":
28 return "macOS"
29 return os.replace("-latest", "")
30
31
32def clean_ssl(ssl):
33 return ssl.replace("_VERSION", "").lower()
34
Ilya Shipitsin3add74a2022-05-20 23:02:38 +050035def determine_latest_openssl(ssl):
36 openssl_tags = urllib.request.urlopen("https://api.github.com/repos/openssl/openssl/tags")
37 tags = json.loads(openssl_tags.read().decode('utf-8'))
38 latest_tag = ''
39 for tag in tags:
40 name = tag['name']
41 if "openssl-" in name:
42 if name > latest_tag:
43 latest_tag = name
Ilya Shipitsin2fb578c2022-10-11 12:10:57 +050044 return "OPENSSL_VERSION={}".format(latest_tag[8:])
Ilya Shipitsin3add74a2022-05-20 23:02:38 +050045
Ilya Shipitsinbfdc6842022-05-13 21:59:38 +050046def determine_latest_libressl(ssl):
Ilia Shipitsin418c10c2023-04-26 12:12:54 +020047 libressl_download_list = urllib.request.urlopen(
48 "https://cdn.openbsd.org/pub/OpenBSD/LibreSSL/"
49 )
Ilya Shipitsinbfdc6842022-05-13 21:59:38 +050050 for line in libressl_download_list.readlines():
51 decoded_line = line.decode("utf-8")
52 if "libressl-" in decoded_line and ".tar.gz.asc" in decoded_line:
53 l = re.split("libressl-|.tar.gz.asc", decoded_line)[1]
Ilya Shipitsin2fb578c2022-10-11 12:10:57 +050054 return "LIBRESSL_VERSION={}".format(l)
Tim Duesterhus288c0772020-07-28 23:00:35 +020055
56def clean_compression(compression):
57 return compression.replace("USE_", "").lower()
58
59
60def get_asan_flags(cc):
Ilya Shipitsin9cd47242022-07-02 10:30:28 +050061 return [
62 "USE_OBSOLETE_LINKER=1",
63 'DEBUG_CFLAGS="-g -fsanitize=address"',
64 'LDFLAGS="-fsanitize=address"',
65 'CPU_CFLAGS.generic="-O1"',
66 ]
Tim Duesterhus288c0772020-07-28 23:00:35 +020067
Tim Duesterhus288c0772020-07-28 23:00:35 +020068
69matrix = []
70
71# Ubuntu
72
William Lallemand04091572022-12-09 15:55:18 +010073os = "ubuntu-20.04"
Tim Duesterhus288c0772020-07-28 23:00:35 +020074TARGET = "linux-glibc"
75for CC in ["gcc", "clang"]:
76 matrix.append(
77 {
78 "name": "{}, {}, no features".format(clean_os(os), CC),
79 "os": os,
80 "TARGET": TARGET,
81 "CC": CC,
82 "FLAGS": [],
83 }
84 )
85
86 matrix.append(
87 {
88 "name": "{}, {}, all features".format(clean_os(os), CC),
89 "os": os,
90 "TARGET": TARGET,
91 "CC": CC,
92 "FLAGS": [
93 "USE_ZLIB=1",
Ilya Shipitsin73c3ed92021-05-18 09:46:43 +000094 "USE_OT=1",
Ilya Shipitsinef86b472022-01-13 11:36:28 +050095 "OT_INC=${HOME}/opt-ot/include",
96 "OT_LIB=${HOME}/opt-ot/lib",
Ilya Shipitsin73c3ed92021-05-18 09:46:43 +000097 "OT_RUNPATH=1",
Tim Duesterhus288c0772020-07-28 23:00:35 +020098 "USE_PCRE=1",
99 "USE_PCRE_JIT=1",
100 "USE_LUA=1",
101 "USE_OPENSSL=1",
102 "USE_SYSTEMD=1",
103 "USE_WURFL=1",
Willy Tarreau57610c62021-04-02 16:39:44 +0200104 "WURFL_INC=addons/wurfl/dummy",
105 "WURFL_LIB=addons/wurfl/dummy",
Tim Duesterhus288c0772020-07-28 23:00:35 +0200106 "USE_DEVICEATLAS=1",
Willy Tarreauf8d9ec52021-04-02 16:19:39 +0200107 "DEVICEATLAS_SRC=addons/deviceatlas/dummy",
Willy Tarreau3dfadc72021-04-02 15:35:19 +0200108 "USE_PROMEX=1",
Ilya Shipitsinb34aee82020-11-26 20:59:42 +0500109 "USE_51DEGREES=1",
Willy Tarreau977209d2021-04-02 16:12:32 +0200110 "51DEGREES_SRC=addons/51degrees/dummy/pattern",
Tim Duesterhus288c0772020-07-28 23:00:35 +0200111 ],
112 }
113 )
114
115 for compression in ["USE_SLZ=1", "USE_ZLIB=1"]:
116 matrix.append(
117 {
118 "name": "{}, {}, gz={}".format(
119 clean_os(os), CC, clean_compression(compression)
120 ),
121 "os": os,
122 "TARGET": TARGET,
123 "CC": CC,
124 "FLAGS": [compression],
125 }
126 )
127
128 for ssl in [
129 "stock",
130 "OPENSSL_VERSION=1.0.2u",
Christopher Faulet463c8072022-12-06 11:33:29 +0100131 "OPENSSL_VERSION=3.0.2",
Christopher Faulet83830e92022-12-06 11:25:06 +0100132 "LIBRESSL_VERSION=3.5.3",
Willy Tarreau61cda6d2021-09-02 17:32:43 +0200133# "BORINGSSL=yes",
Tim Duesterhus288c0772020-07-28 23:00:35 +0200134 ]:
135 flags = ["USE_OPENSSL=1"]
Ilya Shipitsin714f28c2021-05-09 21:27:28 +0500136 if ssl == "BORINGSSL=yes":
137 flags.append("USE_QUIC=1")
Ilya Shipitsin9c872552021-12-25 14:01:52 +0500138 if "OPENSSL_VERSION=3.0." in ssl:
William Lallemandd8580d92021-06-07 15:27:57 +0200139 flags.append('DEBUG_CFLAGS="-g -Wno-deprecated-declarations"')
Tim Duesterhus288c0772020-07-28 23:00:35 +0200140 if ssl != "stock":
141 flags.append("SSL_LIB=${HOME}/opt/lib")
142 flags.append("SSL_INC=${HOME}/opt/include")
Ilya Shipitsinbfdc6842022-05-13 21:59:38 +0500143 if "LIBRESSL" in ssl and "latest" in ssl:
144 ssl = determine_latest_libressl(ssl)
Ilya Shipitsin3add74a2022-05-20 23:02:38 +0500145 if "OPENSSL" in ssl and "latest" in ssl:
146 ssl = determine_latest_openssl(ssl)
147
Tim Duesterhus288c0772020-07-28 23:00:35 +0200148 matrix.append(
149 {
150 "name": "{}, {}, ssl={}".format(clean_os(os), CC, clean_ssl(ssl)),
151 "os": os,
152 "TARGET": TARGET,
153 "CC": CC,
154 "ssl": ssl,
155 "FLAGS": flags,
156 }
157 )
158
159# ASAN
160
William Lallemand04091572022-12-09 15:55:18 +0100161os = "ubuntu-20.04"
Tim Duesterhus288c0772020-07-28 23:00:35 +0200162TARGET = "linux-glibc"
Ilya Shipitsin9cd47242022-07-02 10:30:28 +0500163for CC in ["gcc","clang"]:
164 matrix.append(
165 {
166 "name": "{}, {}, ASAN, all features".format(clean_os(os), CC),
167 "os": os,
168 "TARGET": TARGET,
169 "CC": CC,
170 "FLAGS": get_asan_flags(CC)
171 + [
172 "USE_ZLIB=1",
173 "USE_OT=1",
174 "OT_INC=${HOME}/opt-ot/include",
175 "OT_LIB=${HOME}/opt-ot/lib",
176 "OT_RUNPATH=1",
177 "USE_PCRE=1",
178 "USE_PCRE_JIT=1",
179 "USE_LUA=1",
180 "USE_OPENSSL=1",
181 "USE_SYSTEMD=1",
182 "USE_WURFL=1",
183 "WURFL_INC=addons/wurfl/dummy",
184 "WURFL_LIB=addons/wurfl/dummy",
185 "USE_DEVICEATLAS=1",
186 "DEVICEATLAS_SRC=addons/deviceatlas/dummy",
187 "USE_PROMEX=1",
188 "USE_51DEGREES=1",
189 "51DEGREES_SRC=addons/51degrees/dummy/pattern",
190 ],
191 }
192 )
Tim Duesterhus288c0772020-07-28 23:00:35 +0200193
194# macOS
195
196os = "macos-latest"
197TARGET = "osx"
198for CC in ["clang"]:
199 matrix.append(
200 {
201 "name": "{}, {}, no features".format(clean_os(os), CC),
202 "os": os,
203 "TARGET": TARGET,
204 "CC": CC,
205 "FLAGS": [],
206 }
207 )
208
209# Print matrix
210
211print(json.dumps(matrix, indent=4, sort_keys=True))
212
Tim Duesterhus04ca2342022-10-14 19:46:06 +0200213if environ.get('GITHUB_OUTPUT') is not None:
214 with open(environ.get('GITHUB_OUTPUT'), 'a') as f:
215 print("matrix={}".format(json.dumps({"include": matrix})), file=f)