15f9996aaSopenharmony_ci#!/usr/bin/env python
25f9996aaSopenharmony_ci# -*- coding: utf-8 -*-
35f9996aaSopenharmony_ci# Copyright (c) 2022 Huawei Device Co., Ltd.
45f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
55f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
65f9996aaSopenharmony_ci# You may obtain a copy of the License at
75f9996aaSopenharmony_ci#
85f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
95f9996aaSopenharmony_ci#
105f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
115f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
125f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
145f9996aaSopenharmony_ci# limitations under the License.
155f9996aaSopenharmony_ci
165f9996aaSopenharmony_ciimport argparse
175f9996aaSopenharmony_ciimport os
185f9996aaSopenharmony_ciimport sys
195f9996aaSopenharmony_ci
205f9996aaSopenharmony_cifrom util import build_utils
215f9996aaSopenharmony_ci
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_cidef parse_args(args):
245f9996aaSopenharmony_ci    parser = argparse.ArgumentParser()
255f9996aaSopenharmony_ci    build_utils.add_depfile_option(parser)
265f9996aaSopenharmony_ci
275f9996aaSopenharmony_ci    parser.add_argument('--clang-path', help='path to clang')
285f9996aaSopenharmony_ci    parser.add_argument('--include-dirs', nargs='+', help='path to header files')
295f9996aaSopenharmony_ci    parser.add_argument('--output-file', help='path to .o file')
305f9996aaSopenharmony_ci    parser.add_argument('--input-file', nargs='+', help='path to .c file')
315f9996aaSopenharmony_ci    parser.add_argument('--defines', nargs='+', help='clang defines')
325f9996aaSopenharmony_ci
335f9996aaSopenharmony_ci    options = parser.parse_args(args)
345f9996aaSopenharmony_ci    return options
355f9996aaSopenharmony_ci
365f9996aaSopenharmony_ci
375f9996aaSopenharmony_cidef bpf_compile(options, cmd: str):
385f9996aaSopenharmony_ci    my_env = None
395f9996aaSopenharmony_ci    for f in options.input_file:
405f9996aaSopenharmony_ci        cmd.extend(['-c', f])
415f9996aaSopenharmony_ci        cmd.extend(['-o', options.output_file])
425f9996aaSopenharmony_ci        build_utils.check_output(cmd, env=my_env)
435f9996aaSopenharmony_ci
445f9996aaSopenharmony_ci
455f9996aaSopenharmony_cidef main(args):
465f9996aaSopenharmony_ci    options = parse_args(args)
475f9996aaSopenharmony_ci    cmd = [options.clang_path]
485f9996aaSopenharmony_ci    cmd.extend(['-v', '-g', '-c', '-O2', '-target', 'bpf'])
495f9996aaSopenharmony_ci    for include_dir in options.include_dirs:
505f9996aaSopenharmony_ci        cmd.extend(['-I', include_dir])
515f9996aaSopenharmony_ci
525f9996aaSopenharmony_ci    if options.defines:
535f9996aaSopenharmony_ci        for define in options.defines:
545f9996aaSopenharmony_ci            cmd.extend(['-D', define])
555f9996aaSopenharmony_ci
565f9996aaSopenharmony_ci    outputs = [options.output_file]
575f9996aaSopenharmony_ci
585f9996aaSopenharmony_ci    build_utils.call_and_write_depfile_if_stale(
595f9996aaSopenharmony_ci        lambda: bpf_compile(options, cmd),
605f9996aaSopenharmony_ci        options,
615f9996aaSopenharmony_ci        depfile_deps=([options.clang_path]),
625f9996aaSopenharmony_ci        input_paths=(options.input_file + [options.clang_path]),
635f9996aaSopenharmony_ci        output_paths=(outputs),
645f9996aaSopenharmony_ci        input_strings=cmd,
655f9996aaSopenharmony_ci        force=False,
665f9996aaSopenharmony_ci        add_pydeps=False
675f9996aaSopenharmony_ci    )
685f9996aaSopenharmony_ci
695f9996aaSopenharmony_ci
705f9996aaSopenharmony_ciif __name__ == '__main__':
715f9996aaSopenharmony_ci    sys.exit(main(sys.argv[1:]))
72