This reduces the scope of the demo to just building and installing a single .so, but it makes the demo actually build that single .so. Next up, writing some unit tests and fleshing out functionality. Test: see the README Change-Id: I560904b786fbf69d3a83dbb08d496dba5a3192ca
111 lines
4.2 KiB
Python
Executable File
111 lines
4.2 KiB
Python
Executable File
#!/usr/bin/python3
|
|
#
|
|
# Copyright (C) 2022 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import os
|
|
import sys
|
|
import textwrap
|
|
|
|
sys.dont_write_bytecode = True
|
|
import common
|
|
|
|
def mkdirs(path):
|
|
try:
|
|
os.makedirs(path)
|
|
except FileExistsError:
|
|
pass
|
|
|
|
|
|
class InnerBuildSoong(common.Commands):
|
|
def describe(self, args):
|
|
mkdirs(args.out_dir)
|
|
|
|
with open(os.path.join(args.out_dir, "tree_info.json"), "w") as f:
|
|
f.write(textwrap.dedent("""\
|
|
{
|
|
"requires_ninja": true,
|
|
"orchestrator_protocol_version": 1
|
|
}"""))
|
|
|
|
def export_api_contributions(self, args):
|
|
contributions_dir = os.path.join(args.out_dir, "api_contributions")
|
|
mkdirs(contributions_dir)
|
|
|
|
if "system" in args.api_domain:
|
|
with open(os.path.join(contributions_dir, "api_a-1.json"), "w") as f:
|
|
# 'name: android' is android.jar
|
|
f.write(textwrap.dedent("""\
|
|
{
|
|
"name": "api_a",
|
|
"version": 1,
|
|
"api_domain": "system",
|
|
"cc_libraries": [
|
|
{
|
|
"name": "libhello1",
|
|
"headers": [
|
|
{
|
|
"root": "build/build/make/orchestrator/test_workspace/inner_tree_1",
|
|
"files": [
|
|
"hello1.h"
|
|
]
|
|
}
|
|
],
|
|
"api": [
|
|
"build/build/make/orchestrator/test_workspace/inner_tree_1/libhello1"
|
|
]
|
|
}
|
|
]
|
|
}"""))
|
|
|
|
def analyze(self, args):
|
|
if "system" in args.api_domain:
|
|
# Nothing to export in this demo
|
|
# Write a fake inner_tree.ninja; what the inner tree would have generated
|
|
with open(os.path.join(args.out_dir, "inner_tree.ninja"), "w") as f:
|
|
# TODO: Note that this uses paths relative to the workspace not the iner tree
|
|
# for demo purposes until we get the ninja chdir change in.
|
|
f.write(textwrap.dedent("""\
|
|
rule compile_c
|
|
command = mkdir -p ${out_dir} && g++ -c ${cflags} -o ${out} ${in}
|
|
rule link_so
|
|
command = mkdir -p ${out_dir} && gcc -shared -o ${out} ${in}
|
|
build %(OUT_DIR)s/libhello1/hello1.o: compile_c build/build/make/orchestrator/test_workspace/inner_tree_1/libhello1/hello1.c
|
|
out_dir = %(OUT_DIR)s/libhello1
|
|
cflags = -Ibuild/build/make/orchestrator/test_workspace/inner_tree_1/libhello1/include
|
|
build %(OUT_DIR)s/libhello1/libhello1.so: link_so %(OUT_DIR)s/libhello1/hello1.o
|
|
out_dir = %(OUT_DIR)s/libhello1
|
|
build system: phony %(OUT_DIR)s/libhello1/libhello1.so
|
|
""" % { "OUT_DIR": args.out_dir }))
|
|
with open(os.path.join(args.out_dir, "build_targets.json"), "w") as f:
|
|
f.write(textwrap.dedent("""\
|
|
{
|
|
"staging": [
|
|
{
|
|
"dest": "staging/system/lib/libhello1.so",
|
|
"obj": "libhello1/libhello1.so"
|
|
}
|
|
]
|
|
}""" % { "OUT_DIR": args.out_dir }))
|
|
|
|
def main(argv):
|
|
return InnerBuildSoong().Run(argv)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main(sys.argv))
|
|
|
|
|
|
# vim: sts=4:ts=4:sw=4
|