Support building open5gs

Change-Id: Id145443ff53f13740167e9dde6417b7e915b8399
diff --git a/all.buildsystems b/all.buildsystems
new file mode 100644
index 0000000..fc1784b
--- /dev/null
+++ b/all.buildsystems
@@ -0,0 +1,3 @@
+# Projects with buildsystems other than autotools
+# project	buildsystem
+open5gs		meson
diff --git a/all.deps b/all.deps
index 4769d02..7857f16 100644
--- a/all.deps
+++ b/all.deps
@@ -36,6 +36,8 @@
 osmo-e1d	libosmocore
 osmo-remsim	simtrace2_host libosmo-netif
 
+open5gs
+
 # can only clone these
 docker-playground
 osmo-ttcn3-hacks
diff --git a/all.urls b/all.urls
index 27aaf6e..dfc8ae7 100644
--- a/all.urls
+++ b/all.urls
@@ -2,3 +2,4 @@
 # project	url
 libnftnl	https://git.netfilter.org/libnftnl/
 nftables	https://git.netfilter.org/nftables/
+open5gs		https://github.com/open5gs/open5gs
diff --git a/gen_makefile.py b/gen_makefile.py
index 82ebef0..d306364 100755
--- a/gen_makefile.py
+++ b/gen_makefile.py
@@ -54,6 +54,7 @@
 topdir = os.path.dirname(os.path.realpath(__file__))
 all_deps_file = os.path.join(topdir, "all.deps")
 all_urls_file = os.path.join(topdir, "all.urls")
+all_buildsystems_file = os.path.join(topdir, "all.buildsystems")
 parser = argparse.ArgumentParser(epilog=__doc__, formatter_class=argparse.RawTextHelpFormatter)
 
 parser.add_argument('configure_opts_files',
@@ -152,8 +153,8 @@
     l.append((tokens[0], tokens[1:]))
   return l
 
-def read_projects_urls(path):
-  'Read urls config and return dict {project_name: url, …}.'
+def read_projects_dict(path):
+  'Read urls/buildsystems config and return dict {project_name: url, …}.'
   ret = {}
   for line in open(path):
     line = line.strip()
@@ -215,7 +216,9 @@
   '''
 
 def gen_makefile_autoconf(proj, src_proj, distclean_cond):
-  return f'''
+  buildsystem = projects_buildsystems.get(proj, "autotools")
+  if buildsystem == "autotools":
+    return f'''
 .make.{proj}.autoconf: .make.{proj}.clone {src_proj}/configure.ac
 	if {distclean_cond}; then $(MAKE) {proj}-distclean; fi
 	@echo -e "\\n\\n\\n===== $@\\n"
@@ -223,11 +226,18 @@
 	cd {src_proj}; autoreconf -fi
 	sync
 	touch $@
-  '''
+    '''
+  elif buildsystem == "meson":
+    return ""
+  else:
+    assert False, f"unknown buildsystem: {buildsystem}"
+
 
 def gen_makefile_configure(proj, deps_installed, distclean_cond, build_proj,
                            cflags, docker_cmd, build_to_src, configure_opts):
-  return f'''
+  buildsystem = projects_buildsystems.get(proj, "autotools")
+  if buildsystem == "autotools":
+    return f'''
 .make.{proj}.configure: .make.{proj}.autoconf {deps_installed} $({proj}_configure_files)
 	if {distclean_cond}; then $(MAKE) {proj}-distclean .make.{proj}.autoconf; fi
 	@echo -e "\\n\\n\\n===== $@\\n"
@@ -237,29 +247,74 @@
 	cd {build_proj}; {cflags}{docker_cmd}{build_to_src}/configure {configure_opts}
 	sync
 	touch $@
-  '''
+    '''
+  elif buildsystem == "meson":
+    return f'''
+.make.{proj}.configure: .make.{proj}.clone {deps_installed} $({proj}_configure_files)
+	@echo -e "\\n\\n\\n===== $@\\n"
+	-chmod -R ug+w {build_proj}
+	-rm -rf {build_proj}
+	mkdir -p {build_proj}
+	cd {build_proj}; {cflags}{docker_cmd}meson {build_to_src} .
+	sync
+	touch $@
+    '''
+  else:
+    assert False, f"unknown buildsystem: {buildsystem}"
 
 def gen_makefile_build(proj, distclean_cond, build_proj, docker_cmd, jobs,
                        check):
-  return f'''
+  buildsystem = projects_buildsystems.get(proj, "autotools")
+
+  if buildsystem == "autotools":
+    return f'''
 .make.{proj}.build: .make.{proj}.configure $({proj}_files)
 	if {distclean_cond}; then $(MAKE) {proj}-distclean .make.{proj}.configure; fi
 	@echo -e "\\n\\n\\n===== $@\\n"
 	{docker_cmd}$(MAKE) -C {build_proj} -j {jobs} {check}
 	sync
 	touch $@
-  '''
+    '''
+  elif buildsystem == "meson":
+    target = "test" if check else "compile"
+    test_line = ""
+    # TODO: currently tests don't pass in this env
+    # if check:
+    #   test_line = f"{docker_cmd}meson test -C {build_proj} -v"
+    return f'''
+.make.{proj}.build: .make.{proj}.configure $({proj}_files)
+	@echo -e "\\n\\n\\n===== $@\\n"
+	{docker_cmd}meson compile -C {build_proj} -j {jobs}
+	{test_line}
+	sync
+	touch $@
+    '''
+  else:
+    assert False, f"unknown buildsystem: {buildsystem}"
 
 def gen_makefile_install(proj, docker_cmd, sudo_make_install, build_proj,
                          no_ldconfig, sudo_ldconfig):
-  return f'''
+  buildsystem = projects_buildsystems.get(proj, "autotools")
+  if buildsystem == "autotools":
+    return f'''
 .make.{proj}.install: .make.{proj}.build
 	@echo -e "\\n\\n\\n===== $@\\n"
 	{docker_cmd}{sudo_make_install}$(MAKE) -C {build_proj} install
 	{no_ldconfig}{sudo_ldconfig}ldconfig
 	sync
 	touch $@
-  '''
+    '''
+  elif buildsystem == "meson":
+    return f'''
+.make.{proj}.install: .make.{proj}.build
+	@echo -e "\\n\\n\\n===== $@\\n"
+	{docker_cmd}{sudo_make_install}ninja -C {build_proj} install
+	{no_ldconfig}{sudo_ldconfig}ldconfig
+	sync
+	touch $@
+    '''
+  else:
+    assert False, f"unknown buildsystem: {buildsystem}"
 
 def gen_makefile_reinstall(proj, deps_reinstall, sudo_make_install,
                            build_proj):
@@ -372,7 +427,8 @@
 
 
 projects_deps = read_projects_deps(all_deps_file)
-projects_urls = read_projects_urls(all_urls_file)
+projects_urls = read_projects_dict(all_urls_file)
+projects_buildsystems = read_projects_dict(all_buildsystems_file)
 configure_opts = listdict()
 configure_opts_files = sorted(args.configure_opts_files or [])
 for configure_opts_file in configure_opts_files: