xref: /build/lite/ndk/ndk.gni (revision 5f9996aa)
15f9996aaSopenharmony_ci# Copyright (c) 2020 Huawei Device Co., Ltd.
25f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
35f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
45f9996aaSopenharmony_ci# You may obtain a copy of the License at
55f9996aaSopenharmony_ci#
65f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
75f9996aaSopenharmony_ci#
85f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
95f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
105f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
125f9996aaSopenharmony_ci# limitations under the License.
135f9996aaSopenharmony_ci
145f9996aaSopenharmony_ci# Description: Native Development Kit Template
155f9996aaSopenharmony_ci
165f9996aaSopenharmony_cideclare_args() {
175f9996aaSopenharmony_ci  ohos_build_ndk = false
185f9996aaSopenharmony_ci  ohos_build_ndk_target_host = "linux-x86_64"
195f9996aaSopenharmony_ci  ohos_build_ndk_version = "1.0.0"
205f9996aaSopenharmony_ci}
215f9996aaSopenharmony_ci
225f9996aaSopenharmony_cindk_out_dir = "$root_out_dir/ndk"
235f9996aaSopenharmony_ci
245f9996aaSopenharmony_cindk_headers_out_dir = "$ndk_out_dir/sysroot/usr/include"
255f9996aaSopenharmony_cindk_libraries_out_dir = "$ndk_out_dir/sysroot/usr/lib"
265f9996aaSopenharmony_cindk_docs_out_dir = "$ndk_out_dir/docs"
275f9996aaSopenharmony_ci
285f9996aaSopenharmony_ciwindows_system = "windows-x86_64"
295f9996aaSopenharmony_cilinux_system = "linux-x86_64"
305f9996aaSopenharmony_ci
315f9996aaSopenharmony_cindk_toolchain = "gcc"
325f9996aaSopenharmony_ciif (ohos_build_compiler == "clang") {
335f9996aaSopenharmony_ci  ndk_toolchain = "llvm"
345f9996aaSopenharmony_ci}
355f9996aaSopenharmony_cindk_windows_specific_out_dir = "${ndk_out_dir}/$ndk_toolchain"
365f9996aaSopenharmony_cindk_linux_specific_out_dir = "${ndk_out_dir}/$ndk_toolchain"
375f9996aaSopenharmony_ci
385f9996aaSopenharmony_cindk_windows_toolchains_out_dir = "${ndk_windows_specific_out_dir}"
395f9996aaSopenharmony_cindk_windows_tools_out_dir = "${ndk_out_dir}/$windows_system/tools"
405f9996aaSopenharmony_ci
415f9996aaSopenharmony_cindk_linux_toolchains_out_dir = "${ndk_linux_specific_out_dir}"
425f9996aaSopenharmony_cindk_linux_tools_out_dir = "${ndk_out_dir}/$linux_system/tools"
435f9996aaSopenharmony_ci
445f9996aaSopenharmony_citemplate("copy_files") {
455f9996aaSopenharmony_ci  assert(defined(invoker.src) && defined(invoker.dest_dir),
465f9996aaSopenharmony_ci         "sources and dest_dir are necessary")
475f9996aaSopenharmony_ci  if (defined(invoker.src_type)) {
485f9996aaSopenharmony_ci    src_type = invoker.src_type
495f9996aaSopenharmony_ci  } else {
505f9996aaSopenharmony_ci    src_type = "dir"
515f9996aaSopenharmony_ci  }
525f9996aaSopenharmony_ci  _deps = []
535f9996aaSopenharmony_ci  if (defined(invoker.deps)) {
545f9996aaSopenharmony_ci    _deps += invoker.deps
555f9996aaSopenharmony_ci  }
565f9996aaSopenharmony_ci  src = invoker.src
575f9996aaSopenharmony_ci  dst = invoker.dest_dir
585f9996aaSopenharmony_ci  action("$target_name$src") {
595f9996aaSopenharmony_ci    deps = _deps
605f9996aaSopenharmony_ci    script = "//build/lite/copy_files.py"
615f9996aaSopenharmony_ci    args = [
625f9996aaSopenharmony_ci      "--src_type",
635f9996aaSopenharmony_ci      src_type,
645f9996aaSopenharmony_ci      "--src",
655f9996aaSopenharmony_ci      rebase_path("$src"),
665f9996aaSopenharmony_ci      "--dest_dir",
675f9996aaSopenharmony_ci      rebase_path("$dst"),
685f9996aaSopenharmony_ci    ]
695f9996aaSopenharmony_ci    outputs = [ "$target_gen_dir/${target_name}_copy_files.log" ]
705f9996aaSopenharmony_ci  }
715f9996aaSopenharmony_ci}
725f9996aaSopenharmony_ci
735f9996aaSopenharmony_ci# Generate NDK library.
745f9996aaSopenharmony_citemplate("ndk_lib") {
755f9996aaSopenharmony_ci  _deps = []
765f9996aaSopenharmony_ci  if (defined(invoker.deps)) {
775f9996aaSopenharmony_ci    _deps += invoker.deps
785f9996aaSopenharmony_ci  }
795f9996aaSopenharmony_ci
805f9996aaSopenharmony_ci  _head_files = []
815f9996aaSopenharmony_ci  if (defined(invoker.head_files)) {
825f9996aaSopenharmony_ci    _head_files = invoker.head_files
835f9996aaSopenharmony_ci  }
845f9996aaSopenharmony_ci  if (defined(invoker.lib_extension)) {
855f9996aaSopenharmony_ci    _extension = invoker.lib_extension
865f9996aaSopenharmony_ci  } else {
875f9996aaSopenharmony_ci    _extension = ".a"
885f9996aaSopenharmony_ci  }
895f9996aaSopenharmony_ci  assert(_extension != "")
905f9996aaSopenharmony_ci
915f9996aaSopenharmony_ci  group(target_name) {
925f9996aaSopenharmony_ci    deps = _deps
935f9996aaSopenharmony_ci  }
945f9996aaSopenharmony_ci
955f9996aaSopenharmony_ci  if (ohos_build_ndk) {
965f9996aaSopenharmony_ci    foreach(src_deps, _deps) {
975f9996aaSopenharmony_ci      lib_name = get_label_info(src_deps, "name")
985f9996aaSopenharmony_ci      copy_files("$target_name" + "_copy") {
995f9996aaSopenharmony_ci        deps = _deps
1005f9996aaSopenharmony_ci        src_type = "file"
1015f9996aaSopenharmony_ci        if (_extension == ".a") {
1025f9996aaSopenharmony_ci          src = "$root_out_dir/libs/lib$lib_name$_extension"
1035f9996aaSopenharmony_ci        } else {
1045f9996aaSopenharmony_ci          src = "$root_out_dir/lib$lib_name$_extension"
1055f9996aaSopenharmony_ci        }
1065f9996aaSopenharmony_ci        dest_dir = "$ndk_libraries_out_dir"
1075f9996aaSopenharmony_ci      }
1085f9996aaSopenharmony_ci    }
1095f9996aaSopenharmony_ci    foreach(src_dir, _head_files) {
1105f9996aaSopenharmony_ci      copy_files(target_name) {
1115f9996aaSopenharmony_ci        src = src_dir
1125f9996aaSopenharmony_ci        dest_dir = "$ndk_headers_out_dir"
1135f9996aaSopenharmony_ci      }
1145f9996aaSopenharmony_ci    }
1155f9996aaSopenharmony_ci  }
1165f9996aaSopenharmony_ci}
1175f9996aaSopenharmony_ci
1185f9996aaSopenharmony_ci# Specify ndk toolchains
1195f9996aaSopenharmony_ci#
1205f9996aaSopenharmony_ci# Input variables:
1215f9996aaSopenharmony_ci#   dest_dir: Copy destination where sources are copied to.
1225f9996aaSopenharmony_ci#   src_dir: Copy Source directories.
1235f9996aaSopenharmony_ci#   src_type: file or path
1245f9996aaSopenharmony_ci#
1255f9996aaSopenharmony_citemplate("ndk_toolchains") {
1265f9996aaSopenharmony_ci  assert(defined(invoker.src_dir) && defined(invoker.dest_dir),
1275f9996aaSopenharmony_ci         "sources and dest_dir are necessary")
1285f9996aaSopenharmony_ci
1295f9996aaSopenharmony_ci  if (ohos_build_ndk) {
1305f9996aaSopenharmony_ci    group(target_name) {
1315f9996aaSopenharmony_ci    }
1325f9996aaSopenharmony_ci    indexSrc = 0
1335f9996aaSopenharmony_ci    indexDst = 0
1345f9996aaSopenharmony_ci    foreach(src_dir, invoker.src_dir) {
1355f9996aaSopenharmony_ci      indexDst = 0
1365f9996aaSopenharmony_ci      foreach(dst, invoker.dest_dir) {
1375f9996aaSopenharmony_ci        if (indexDst == indexSrc) {
1385f9996aaSopenharmony_ci          copy_files("$src_dir") {
1395f9996aaSopenharmony_ci            if (defined(invoker.src_type)) {
1405f9996aaSopenharmony_ci              src_type = invoker.src_type
1415f9996aaSopenharmony_ci            } else {
1425f9996aaSopenharmony_ci              src_type = "dir"
1435f9996aaSopenharmony_ci            }
1445f9996aaSopenharmony_ci            src = src_dir
1455f9996aaSopenharmony_ci            dest_dir = dst
1465f9996aaSopenharmony_ci          }
1475f9996aaSopenharmony_ci        }
1485f9996aaSopenharmony_ci        indexDst = indexDst + 1
1495f9996aaSopenharmony_ci      }
1505f9996aaSopenharmony_ci      indexSrc = indexSrc + 1
1515f9996aaSopenharmony_ci    }
1525f9996aaSopenharmony_ci  }
1535f9996aaSopenharmony_ci}
154