# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. # Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this list of # conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, this list # of conditions and the following disclaimer in the documentation and/or other materials # provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors may be used # to endorse or promote products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import("//build/lite/config/component/lite_component.gni") declare_args() { tee_enable = false } LITEOS_MENUCONFIG_H = rebase_path("$root_out_dir/config.h") tee = "" if (tee_enable) { tee = "_tee" } productName = get_path_info(product_path, "file") config_file = "${productName}_release.config" if (ohos_build_compiler == "clang") { if (ohos_build_type == "debug") { config_file = "debug/${productName}_${ohos_build_compiler}${tee}.config" } else { config_file = "${productName}_${ohos_build_compiler}_release${tee}.config" } } else if (ohos_build_compiler == "gcc") { if (ohos_build_type == "debug") { config_file = "${productName}_debug_shell${tee}.config" } else { config_file = "${productName}_release${tee}.config" } } liteos_config_file = rebase_path("tools/build/config/$config_file") # we prefer use product specified config file f = "$product_path/config/${ohos_build_type}${tee}.config" if (exec_script("//build/lite/run_shell_cmd.py", [ "if [ -f $f ]; then echo true; else echo false; fi" ], "value")) { liteos_config_file = f } print("liteos_config_file:", liteos_config_file) exec_script("//build/lite/run_shell_cmd.py", [ "which genconfig || pip install --user kconfiglib" ]) exec_script("//build/lite/run_shell_cmd.py", [ "env" + " CONFIG_=LOSCFG_" + " KCONFIG_CONFIG_HEADER='y=true'" + " KCONFIG_CONFIG=$liteos_config_file" + " DEVICE_PATH=$device_path" + " srctree=" + rebase_path(".") + " genconfig" + " --header-path $LITEOS_MENUCONFIG_H" + " --file-list kconfig_files.txt" + " --env-list kconfig_env.txt" + " --config-out config.gni", ]) import("liteos.gni") generate_notice_file("kernel_notice_file") { module_name = "kernel" module_source_dir_list = [ "$LITEOSTHIRDPARTY/FreeBSD", "$LITEOSTHIRDPARTY/musl", "$LITEOSTHIRDPARTY/zlib", "$LITEOSTHIRDPARTY/FatFs", "$LITEOSTHIRDPARTY/Linux_Kernel", "$LITEOSTHIRDPARTY/lwip", "$LITEOSTHIRDPARTY/NuttX", "$LITEOSTHIRDPARTY/mtd-utils", ] } liteos_arch_cflags = [] if (defined(LOSCFG_ARCH_ARM)) { mcpu = LOSCFG_ARCH_CPU if (defined(LOSCFG_ARCH_ARM_AARCH64) && defined(LOSCFG_ARCH_FPU_DISABLE)) { mcpu += "+nofp" } liteos_arch_cflags += [ "-mcpu=$mcpu" ] if (defined(LOSCFG_ARCH_ARM_AARCH32)) { liteos_arch_cflags += [ "-mfloat-abi=softfp", "-mfpu=$LOSCFG_ARCH_FPU", ] } } cc = "$ohos_current_cc_command " + string_join(" ", liteos_arch_cflags) if (ohos_build_compiler == "clang") { cc += " --target=$target_triple" } config("arch_config") { cflags = liteos_arch_cflags asmflags = cflags ldflags = cflags } config("as_objs_libc_flags") { defines = [ "__ASSEMBLY__" ] # linux style macros if (defined(LOSCFG_ARCH_ARM_V7A) || defined(LOSCFG_ARCH_ARM_V7R) || defined(LOSCFG_ARCH_ARM_V7M)) { defines += [ "__LINUX_ARM_ARCH__=7" ] } else if (defined(LOSCFG_ARCH_ARM_V8A) || defined(LOSCFG_ARCH_ARM_V8R) || defined(LOSCFG_ARCH_ARM_V8M)) { defines += [ "__LINUX_ARM_ARCH__=8" ] } } config("std_include") { std_include = exec_script("//build/lite/run_shell_cmd.py", [ "$cc -print-file-name=include" ], "trim string") include_dirs = [ std_include ] } config("public") { configs = [ "arch:public", "platform:public", "kernel:public", "compat:public", "bsd:public", "fs:public", "drivers:public", "security:public", "net:public", "shell:public", "lib:public", ":std_include", ] } config("los_nostdinc") { cflags = [ "-nostdinc" ] } config("los_nostdlib") { ldflags = [ "-nostdlib" ] } config("los_common") { cflags = [ "-imacros", "$LITEOS_MENUCONFIG_H", ] defines = [ "__LITEOS__" ] cflags_c = [ "-std=c99" ] cflags += [ "-fno-pic", "-fno-builtin", "-Wall", "-Werror", "-fms-extensions", "-Wno-address-of-packed-member", "-fno-strict-aliasing", "-fno-common", "-fsigned-char", "-Wpointer-arith", "-Wstrict-prototypes", "-Winvalid-pch", "-ffunction-sections", "-fdata-sections", "-fno-exceptions", "-fno-omit-frame-pointer", "-fno-short-enums", ] if (defined(LOSCFG_QUICK_START)) { cflags -= [ "-Werror" ] } if (defined(LOSCFG_COMPILE_DEBUG)) { cflags += [ "-O0", "-g", "-gdwarf-2", ] } else { if (defined(LOSCFG_COMPILER_CLANG_LLVM)) { cflags += [ "-Oz", "-flto", ] } else { cflags += [ "-O2" ] } } if (defined(LOSCFG_CC_STACKPROTECTOR_ALL)) { cflags += [ "-fstack-protector-all" ] } else if (defined(LOSCFG_CC_STACKPROTECTOR_STRONG)) { cflags += [ "-fstack-protector-strong" ] } else if (defined(LOSCFG_CC_STACKPROTECTOR)) { cflags += [ "-fstack-protector", "--param", "ssp-buffer-size=4", ] } else { cflags += [ "-fno-stack-protector" ] } if (!defined(LOSCFG_COMPILER_CLANG_LLVM)) { cflags += [ "-fno-aggressive-loop-optimizations" ] if (!defined(LOSCFG_ARCH_ARM_AARCH64)) { cflags += [ "-mno-unaligned-access", "-mthumb-interwork", ] } } if (defined(LOSCFG_THUMB)) { cflags += [ "-mthumb", "-Wa,-mimplicit-it=thumb", ] } asmflags = cflags } config("los_config") { configs = [ ":los_common", ":arch_config", ":los_nostdinc", ":los_nostdlib", ] } liteos_name = "liteos2" liteos_out = rebase_path("$target_out_dir/$liteos_name") executable(liteos_name) { configs = [] # clear default configs configs += [ ":los_config" ] ldflags = [ "-static", "-Wl,--gc-sections", "-Wl,-Map=" + rebase_path("$liteos_out.map"), "-Wl,--no-eh-frame-hdr", "-Wl,--whole-archive", ] libgcc = exec_script("//build/lite/run_shell_cmd.py", [ "$cc -print-libgcc-file-name" ], "trim string") libs = [ libgcc ] if (defined(LOSCFG_COMPILER_CLANG_LLVM)) { ldflags += [ "-Wl,-T" + rebase_path("tools/build/liteos_llvm.ld", root_build_dir) ] } else { ldflags += [ "-Wl,-T" + rebase_path("tools/build/liteos.ld", root_build_dir) ] ldflags += [ "-nostartfiles" ] } output_dir = target_out_dir deps = [ ":modules", ] } build_ext_component("build_liteos_bin") { deps = [ ":$liteos_name" ] exec_path = rebase_path(target_out_dir) objcopy = "${compile_prefix}objcopy$toolchain_cmd_suffix" objdump = "${compile_prefix}objdump$toolchain_cmd_suffix" liteos = rebase_path("$target_out_dir/unstripped/bin/$liteos_name") command = "$objcopy -O binary $liteos $liteos_out.bin" command += " && sh -c '$objdump -t $liteos | sort >$liteos_out.sym.sorted'" command += " && sh -c '$objdump -d $liteos >$liteos_out.asm'" } group("modules") { deps = [ "arch", "bsd", "compat", "drivers", "fs", "kernel", "lib", "net", "platform", "security", "shell", "syscall", ] } group("apps") { deps = [ "apps" ] } group("tests") { deps = [ "testsuites" ] } group("kernel") { deps = [ ":make", ":tests", ] } group("liteos_a") { deps = [ ":apps", ":kernel", ":tests", ] } build_ext_component("make") { exec_path = rebase_path(".", root_build_dir) outdir = rebase_path(get_path_info(".", "out_dir")) sysroot_path = rebase_path(ohos_current_sysroot) arch_cflags = string_join(" ", target_arch_cflags) command = "./build.sh ${board_name} ${ohos_build_compiler} ${root_build_dir} ${ohos_build_type} \"${tee_enable}\"" command += " \"${device_company}\" \"${product_path}\" $outdir \"${ohos_version}\" ${sysroot_path} \"${arch_cflags}\"" command += " \"${device_path}\"" }