Bazel、Soong、GN构建规则对比

规则 bazel android.bp gn openharmony高级模板
可执行文件 cc_binary cc_binary executable ohos_executable
静态库 cc_library(linkstatic=1) cc_library_static static_library ohos_static_library
动态库 cc_shared_library cc_library_shared shared_library ohos_shared_library
目标名 name name target_name
依赖 deps shared_libs、static_libs deps
源码文件 srcs src sources
编译选项 copts cflags, cppflags cflags, ccflags
宏定义 defines cflags = [ "-DXXX" ] defines
头文件路径 includes include_dirs include_dirs
链接选项 linkopts ldflags ldflags

构建示例

源码文件为main.cpp,动态库和静态库的源码文件为lib.cpp, 使用下面文件,将分别生成一个可执行文件hello_world,一个动态库libhello.so和一个静态库libhello.a。

Bazel:

在项目的根目录下创建一个名为BUILD的文件,内容如下:

cc_library(
    name = "hello_lib",
    srcs = ["lib.cpp"],
    hdrs = ["lib.h"],
    linkstatic=1
)
cc_shared_library(
    name = "hello_shlib",
    srcs = ["lib.cpp"],
    hdrs = ["lib.h"],
)
cc_binary(
    name = "hello_world",
    srcs = ["main.cpp"],
    deps = [":hello_lib"":hello_shlib"],
)

Android.bp:

创建一个名为Android.bp的文件,内容如下:

cc_library_shared {
    name: "libhello",
    srcs: ["lib.cpp"],
}

cc_library_static {
    name: "libhello_static",
    srcs: ["lib.cpp"],
}

cc_binary {
    name: "hello_world",
    srcs: ["main.cpp"],
    shared_libs: ["libhello"],
    static_libs: ["libhello_static"],
}

Android.mk:

创建一个名为Android.mk的文件,内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libhello
LOCAL_SRC_FILES := lib.cpp

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := libhello_static
LOCAL_SRC_FILES := lib.cpp

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello_world
LOCAL_SRC_FILES := main.cpp
LOCAL_SHARED_LIBRARIES := libhello
LOCAL_STATIC_LIBRARIES := libhello_static

include $(BUILD_EXECUTABLE)

GN:

创建一个名为BUILD.gn的文件,内容如下:

shared_library("libhello") {
  sources = [ "lib.cpp" ]
}

static_library("libhello_static") {
  sources = [ "lib.cpp" ]
}

executable("hello_world") {
  sources = [ "main.cpp" ]
  deps = [ ":libhello", ":libhello_static" ]
}