BUILD.gn 10.8 KB
Newer Older
M
mamingshuai 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# 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")
31 32 33

declare_args() {
  tee_enable = false
C
Caoruihong 已提交
34
  liteos_name = "OHOS_Image"
35
  liteos_skip_make = false
36 37
}

C
Caoruihong 已提交
38 39 40
cmd = "if [ -f $device_path/BUILD.gn ]; then echo true; else echo false; fi"
HAVE_DEVICE_SDK = exec_script("//build/lite/run_shell_cmd.py", [ cmd ], "value")

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
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
67
f = "$product_path/kernel_configs/${ohos_build_type}${tee}.config"
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
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",
            [
              "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",
C
Caoruihong 已提交
87
            ], "", [ liteos_config_file ])
88 89

import("liteos.gni")
M
mamingshuai 已提交
90

91 92 93 94
assert(ARCH != "", "ARCH not set!")
assert(ARCH == arch, "ARCH not match! details: $ARCH != $arch")
assert(tee_enable == defined(LOSCFG_TEE_ENABLE), "TEE switch not match!")

M
mamingshuai 已提交
95 96 97
generate_notice_file("kernel_notice_file") {
  module_name = "kernel"
  module_source_dir_list = [
98 99 100 101 102 103 104 105
    "$LITEOSTHIRDPARTY/FreeBSD",
    "$LITEOSTHIRDPARTY/musl",
    "$LITEOSTHIRDPARTY/zlib",
    "$LITEOSTHIRDPARTY/FatFs",
    "$LITEOSTHIRDPARTY/Linux_Kernel",
    "$LITEOSTHIRDPARTY/lwip",
    "$LITEOSTHIRDPARTY/NuttX",
    "$LITEOSTHIRDPARTY/mtd-utils",
M
mamingshuai 已提交
106 107 108
  ]
}

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
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
C
Caoruihong 已提交
133 134 135 136 137 138 139 140 141 142 143 144 145
  if (defined(LOSCFG_ARCH_ARM_AARCH32)) {
    if (!defined(LOSCFG_COMPILER_CLANG_LLVM)) {
      cflags += ["-mthumb-interwork"]
    }
  }
  if (defined(LOSCFG_THUMB)) {
    cflags += [ "-mthumb" ]
    if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
      cflags += [ "-mimplicit-it=thumb" ]
    } else {
      cflags += [ "-Wa,-mimplicit-it=thumb" ]
    }
  }
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
}

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" ]
  }
}

C
Caoruihong 已提交
161
config("stdinc_config") {
162
  std_include = exec_script("//build/lite/run_shell_cmd.py", [ "$cc -print-file-name=include" ], "trim string")
163 164 165 166
  cflags = [
    "-isystem",
    std_include,
  ]
C
Caoruihong 已提交
167
  cflags += [ "-nostdinc" ]
168
  asmflags = cflags
169 170
}

C
Caoruihong 已提交
171 172 173 174 175 176 177 178 179 180 181 182 183 184
config("ssp_config") {
  cflags = []
  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" ]
C
Caoruihong 已提交
185
  }
C
Caoruihong 已提交
186
  asmflags = cflags
187 188
}

C
Caoruihong 已提交
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
config("optimize_config") {
  cflags = []
  if (defined(LOSCFG_COMPILE_DEBUG)) {
    cflags += [
      "-g",
      "-gdwarf-2",
    ]
    optimization_cflag = "-O0"
  }
  if (defined(LOSCFG_COMPILE_OPTIMIZE)) {
    optimization_cflag = "-O2"
  }
  if (defined(LOSCFG_COMPILE_OPTIMIZE_SIZE)) {
    if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
      optimization_cflag = "-Oz"
    } else {
      optimization_cflag = "-Os"
    }
207 208 209 210 211 212 213
  }
  if (defined(LOSCFG_COMPILE_LTO)) {
    if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
      cflags += [ "-flto=thin" ]
    } else {
      cflags += [ "-flto" ]
    }
C
Caoruihong 已提交
214 215 216
  }
  cflags += [ optimization_cflag ]
  asmflags = cflags
217 218
}

C
Caoruihong 已提交
219
config("kconfig_config") {
220 221 222 223
  cflags = [
    "-imacros",
    "$LITEOS_MENUCONFIG_H",
  ]
C
Caoruihong 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237
  asmflags = cflags
}

config("warn_config") {
  cflags = [
    "-Wall",
    "-Werror",
    "-Wpointer-arith",
    "-Wstrict-prototypes",
    "-Winvalid-pch",
    "-Wno-address-of-packed-member",
  ]
  asmflags = cflags
}
238

C
Caoruihong 已提交
239 240 241 242 243 244
config("dialect_config") {
  cflags_c = [ "-std=c99" ]
  cflags_cc = [ "-std=c++11" ]
}

config("misc_config") {
245
  defines = [ "__LITEOS__" ]
246 247 248
  if (!defined(LOSCFG_DEBUG_VERSION)) {
    defines += [ "NDEBUG" ]
  }
249

C
Caoruihong 已提交
250
  cflags = [
251 252 253 254 255 256 257 258 259 260 261
    "-fno-pic",
    "-fno-builtin",
    "-fms-extensions",
    "-fno-strict-aliasing",
    "-fno-common",
    "-fsigned-char",
    "-ffunction-sections",
    "-fdata-sections",
    "-fno-exceptions",
    "-fno-omit-frame-pointer",
    "-fno-short-enums",
C
Caoruihong 已提交
262
    "-mno-unaligned-access",
263 264 265 266
  ]

  if (!defined(LOSCFG_COMPILER_CLANG_LLVM)) {
    cflags += [ "-fno-aggressive-loop-optimizations" ]
M
mamingshuai 已提交
267
  }
268 269 270 271

  asmflags = cflags
}

272 273 274
config("los_config") {
  configs = [
    ":arch_config",
C
Caoruihong 已提交
275 276 277 278 279 280 281
    ":kconfig_config",
    ":stdinc_config",
    ":dialect_config",
    ":optimize_config",
    ":ssp_config",
    ":warn_config",
    ":misc_config",
282 283 284
  ]
}

C
Caoruihong 已提交
285
executable("liteos") {
286
  configs = [] # clear default configs
287
  configs += [ ":arch_config" ]
C
Caoruihong 已提交
288
  configs += [ ":public" ]
289 290 291

  ldflags = [
    "-static",
C
Caoruihong 已提交
292
    "-nostdlib",
293
    "-Wl,--gc-sections",
C
Caoruihong 已提交
294
    "-Wl,-Map=$liteos_name.map",
295 296 297 298 299 300
    "-Wl,--no-eh-frame-hdr",
  ]

  libgcc = exec_script("//build/lite/run_shell_cmd.py", [ "$cc -print-libgcc-file-name" ], "trim string")
  libs = [ libgcc ]
  if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
301
    ldflags += [ "-Wl,-T" + rebase_path("tools/build/liteos_llvm.ld", root_build_dir) ]
C
Caoruihong 已提交
302
    inputs = [ "tools/build/liteos_llvm.ld" ]
303
  } else {
304
    ldflags += [ "-Wl,-T" + rebase_path("tools/build/liteos.ld", root_build_dir) ]
C
Caoruihong 已提交
305
    ldflags += [ "-Wl,-nostartfiles" ]
C
Caoruihong 已提交
306
    inputs = [ "tools/build/liteos.ld" ]
307 308
  }

C
Caoruihong 已提交
309 310
  inputs += [ "$root_out_dir/board.ld" ]

311 312
  output_dir = target_out_dir

313
  deps = [
314
    "platform:copy_board.ld",
315 316 317 318
    ":modules",
  ]
}

C
Caoruihong 已提交
319 320
copy("copy_liteos") {
  deps = [ ":liteos" ]
321 322
  sources = [ "$target_out_dir/unstripped/bin/liteos" ]
  outputs = [ "$root_out_dir/$liteos_name" ]
C
Caoruihong 已提交
323 324 325 326 327
}

build_ext_component("build_kernel_image") {
  deps = [ ":copy_liteos" ]
  exec_path = rebase_path(root_out_dir)
328 329 330 331

  objcopy = "${compile_prefix}objcopy$toolchain_cmd_suffix"
  objdump = "${compile_prefix}objdump$toolchain_cmd_suffix"

C
Caoruihong 已提交
332 333 334
  command = "$objcopy -O binary $liteos_name $liteos_name.bin"
  command += " && sh -c '$objdump -t $liteos_name | sort >$liteos_name.sym.sorted'"
  command += " && sh -c '$objdump -d $liteos_name >$liteos_name.asm'"
335 336
}

C
Caoruihong 已提交
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
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",
  ]

  configs += [
    "$HDFTOPDIR:public",
    "//drivers/liteos:public",
  ]

  if (HAVE_DEVICE_SDK) {
    configs += [ "$device_path:public" ]
  }
}

362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
group("modules") {
  deps = [
    "arch",
    "bsd",
    "compat",
    "drivers",
    "fs",
    "kernel",
    "lib",
    "net",
    "platform",
    "security",
    "shell",
    "syscall",
  ]
C
Caoruihong 已提交
377 378

  deps += [
C
Caoruihong 已提交
379
    HDFTOPDIR,
C
Caoruihong 已提交
380 381 382 383 384 385
    "//drivers/liteos",
  ]

  if (HAVE_DEVICE_SDK) {
    deps += [ device_path ]
  }
386 387 388 389 390 391 392 393 394 395 396
}

group("apps") {
  deps = [ "apps" ]
}

group("tests") {
  deps = [ "testsuites" ]
}

group("kernel") {
C
Caoruihong 已提交
397
  deps = [ ":build_kernel_image" ]
398 399 400 401 402 403 404 405
}

group("liteos_a") {
  deps = [
    ":apps",
    ":kernel",
    ":tests",
  ]
M
mamingshuai 已提交
406 407 408 409
}

build_ext_component("make") {
  exec_path = rebase_path(".", root_build_dir)
410
  outdir = rebase_path("$target_out_dir/${target_name}_out")
411 412
  sysroot_path = rebase_path(ohos_current_sysroot)
  arch_cflags = string_join(" ", target_arch_cflags)
413 414 415 416 417 418 419
  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\" \"$compile_prefix\""
  if (liteos_skip_make) {
    print("build_ext_component \"$target_name\" skipped:", command)
    command = "true"
  }
M
mamingshuai 已提交
420
}