2020-09-06 16:17:16 +08:00
|
|
|
|
# 利用 app_helper 编写 SConstruct
|
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
AWTK 项目中有 SConstruct 文件,该文件是 Scons 的编译脚本。当开发者需要在程序中使用依赖库或者进行自定义预处理时,需要遵循 Python 语法编写 SConstruct 文件,这是一件繁琐的事情。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
为简化 SConstruct 的编写,AWTK 把一些公共功能提取到 awtk/scripts/app_helper_base.py 中,并且在项目目录下的 scripts/app_helper.py 中导入 app_helper_base.py,让开发者可直接在项目的 SConstruct 文件中调用这些函数。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
## 1 相关函数
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
app_helper.py 提供了下表中的函数,具体用法请参考 awtk/docs/app_helper_usage.md。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
| 函数名称 | 说明 |
|
|
|
|
|
| ---------------------- | ---------------------------------- |
|
|
|
|
|
| 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 | 增加特定平台的需要的链接参数 |
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
> 上表中的函数实现在 awtk/scripts/app_helper_base.py 中。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
## 2 示例
|
2021-02-24 17:43:01 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
使用 app_helper.py 首先需要在SConstruct中导入它,然后调用 Helper 函数得到helper对象,最后使用 helper 对象调用上一节的函数。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
例如,在项目中使用 SQLite 软件库(SQL数据库引擎),静态链接库以及头文件的目录结构如下:
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
```bash
|
|
|
|
|
项目目录/
|
|
|
|
|
|-- 3rd/sqlite3/sqlite3.h
|
|
|
|
|
|-- lib/sqlite3.lib
|
2020-09-06 16:17:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
在项目目录下的 SConstruct 文件中调用 add_libs() 函数增加 sqlite3.lib 依赖库,并且调用 add_cpppath() 函数增加该依赖库头文件的搜索路径,代码如下:
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
```python
|
|
|
|
|
import os
|
|
|
|
|
import scripts.app_helper as app
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
helper = app.Helper(ARGUMENTS);
|
|
|
|
|
helper.add_libs(['sqlite3']).add_cpppath([os.path.join(helper.APP_ROOT, '3rd')]).call(DefaultEnvironment)
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
SConscript(['src/SConscript', '3rd/sqlite3/SConscript'])
|
2020-09-06 16:17:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
需要注意的是:
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
1. 本示例中将静态链接库 sqlite3.lib 放在项目目录的 lib 文件夹下,AWTK 默认将该路径添加到库的搜索路径中。如果开发者将静态链接库放在其他路径,则还需要调用 add_libpath() 函数将该路径添加到库的搜索路径中。
|
|
|
|
|
2. helper 支持链式调用,call 函数需要放到最后。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
## 3 特殊函数
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
调用 app_helper.py 提供的函数,通常只需要传入文件或目录对应的路径,但有个别函数的还需要传入其他参数,包括 add_deps 和 add_platform_ 开头的所有函数,下面举例说明。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
(1)add_deps() 函数原型如下:
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
```python
|
|
|
|
|
def add_deps(self, DEPENDS_LIBS):
|
2020-09-06 16:17:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
调用 add_deps() 函数增加依赖的第三方库,代码如下:
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
```python
|
|
|
|
|
DEPENDS_LIBS = [
|
|
|
|
|
{
|
|
|
|
|
"root" : '../awtk-restful-httpd',
|
|
|
|
|
'shared_libs': ['httpd'],
|
|
|
|
|
'static_libs': []
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
helper.add_deps(DEPENDS_LIBS)
|
|
|
|
|
```
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
"root"为第三方库的路径,支持相对路径和绝对路径;"shared_libs"为动态链接库;"static_libs"为静态链接库。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
(2)add_platform_libs() 函数原型如下:
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
```python
|
|
|
|
|
def add_platform_libs(self, plat, PLATFORM_LIBS)
|
2020-09-06 16:17:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
调用 add_platform_libs() 函数增加 Windows 平台下的 ws2_32.lib 库,代码如下:
|
2021-02-24 17:43:01 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
```python
|
|
|
|
|
helper.add_platform_libs('Windows', ['ws2_32'])
|
|
|
|
|
```
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
plat参数为特定平台,取值如下:Windows、Linux 和 Darwin,分别表示 Windows 平台、Linux 平台和 macOS 平台。PLATFORM_LIBS 参数为库的名称。其他 add_platform_ 开头的函数用法也类似。
|
2020-09-06 16:17:16 +08:00
|
|
|
|
|
2022-11-29 17:57:20 +08:00
|
|
|
|
> 1. [awtk-hello](https://github.com/zlgopen/awtk-hello/blob/master/SConstruct)
|
|
|
|
|
> 2. [awtk-mvvm-c-hello](https://github.com/zlgopen/awtk-mvvm-c-hello/blob/master/SConstruct)
|
|
|
|
|
> 3. [awtk-widget-table-view](https://github.com/zlgopen/awtk-widget-table-view/blob/master/SConstruct)
|