# 利用 app_helper 编写 SConstruct

AWTK 项目中有 SConstruct 文件,该文件是 Scons 的编译脚本。当开发者需要在程序中使用依赖库或者进行自定义预处理时,需要遵循 Python 语法编写 SConstruct 文件,这是一件繁琐的事情。

为简化 SConstruct 的编写,AWTK 把一些公共功能提取到 awtk/scripts/app_helper_base.py 中,并且在项目目录下的 scripts/app_helper.py 中导入 app_helper_base.py,让开发者可直接在项目的 SConstruct 文件中调用这些函数。

# 1 相关函数

app_helper.py 提供了下表中的函数,具体用法请参考 awtk/docs/app_helper_usage.md。

函数名称 说明
add_deps 增加依赖的第三方库
add_libs 增加依赖的库
set_dll_def 设置动态库的 def 文件名
add_cpppath 增加头文件搜索路径
add_libpath 增加库的搜索路径
add_cxxflags 增加C++预处理参数
add_ccflags 增加C 预处理参数
add_linkflags 增加链接参数
add_platform_libs 增加特定平台的需要的库
add_platform_cpppath 增加特定平台的需要的头文件搜索路径
add_platform_libpath 增加特定平台的需要的库搜索路径
add_platform_ccflags 增加特定平台的需要的C 预处理参数
add_platform_cxxflags 增加特定平台的需要的C++预处理参数
add_platform_linkflags 增加特定平台的需要的链接参数

上表中的函数实现在 awtk/scripts/app_helper_base.py 中。

# 2 示例

使用 app_helper.py 首先需要在SConstruct中导入它,然后调用 Helper 函数得到helper对象,最后使用 helper 对象调用上一节的函数。

例如,在项目中使用 SQLite 软件库(SQL数据库引擎),静态链接库以及头文件的目录结构如下:

项目目录/
    |-- 3rd/sqlite3/sqlite3.h
    |-- lib/sqlite3.lib

在项目目录下的 SConstruct 文件中调用 add_libs() 函数增加 sqlite3.lib 依赖库,并且调用 add_cpppath() 函数增加该依赖库头文件的搜索路径,代码如下:

import os
import scripts.app_helper as app

helper = app.Helper(ARGUMENTS);
helper.add_libs(['sqlite3']).add_cpppath([os.path.join(helper.APP_ROOT, '3rd')]).call(DefaultEnvironment)

SConscript(['src/SConscript', '3rd/sqlite3/SConscript'])

需要注意的是:

  1. 本示例中将静态链接库 sqlite3.lib 放在项目目录的 lib 文件夹下,AWTK 默认将该路径添加到库的搜索路径中。如果开发者将静态链接库放在其他路径,则还需要调用 add_libpath() 函数将该路径添加到库的搜索路径中。
  2. helper 支持链式调用,call 函数需要放到最后。

# 3 特殊函数

调用 app_helper.py 提供的函数,通常只需要传入文件或目录对应的路径,但有个别函数的还需要传入其他参数,包括 add_deps 和 add_platform_ 开头的所有函数,下面举例说明。

(1)add_deps() 函数原型如下:

def add_deps(self, DEPENDS_LIBS):

调用 add_deps() 函数增加依赖的第三方库,代码如下:

DEPENDS_LIBS = [
{
  "root" : '../awtk-restful-httpd',
  'shared_libs': ['httpd'],
  'static_libs': []
}
]
helper.add_deps(DEPENDS_LIBS)

"root"为第三方库的路径,支持相对路径和绝对路径;"shared_libs"为动态链接库;"static_libs"为静态链接库。

(2)add_platform_libs() 函数原型如下:

def add_platform_libs(self, plat, PLATFORM_LIBS)

调用 add_platform_libs() 函数增加 Windows 平台下的 ws2_32.lib 库,代码如下:

helper.add_platform_libs('Windows', ['ws2_32'])

plat参数为特定平台,取值如下:Windows、Linux 和 Darwin,分别表示 Windows 平台、Linux 平台和 macOS 平台。PLATFORM_LIBS 参数为库的名称。其他 add_platform_ 开头的函数用法也类似。

  1. awtk-hello (opens new window)
  2. awtk-mvvm-c-hello (opens new window)
  3. awtk-widget-table-view (opens new window)