Open ufbycd opened 3 years ago
谢谢。引用自定义控件好弄吗。
谢谢。引用自定义控件好弄吗。
引用自定义控件?没明白
比如引用table view控件:https://github.com/zlgopen/awtk-widget-table-view
好弄,控件里的SConstruct
脚本里的SConscript
调用改成这样即可:
helper.SConscript(SConscriptFiles)
构建时APP跟控件都要有相同的BUILD_DIR
参数,如:
scons LINUX_FB=true BUILD_DIR=arm
生成的库和头文件在不同的目录,CPPPATH/LIBPATH如何设置呢
在app_helper_base.py
的里处理
class AppHelperBase
的__init__
函数修改:
- self.APP_BIN_DIR = os.path.join(APP_ROOT, 'bin')
- self.APP_LIB_DIR = os.path.join(APP_ROOT, 'lib')
+ self.BUILD_DIR = ARGUMENTS.get('BUILD_DIR', '')
+ self.BIN_DIR = os.path.join(self.BUILD_DIR, 'bin')
+ self.LIB_DIR = os.path.join(self.BUILD_DIR, 'lib')
+ self.APP_BIN_DIR = os.path.join(APP_ROOT, self.BIN_DIR)
+ self.APP_LIB_DIR = os.path.join(APP_ROOT, self.LIB_DIR)
call
函数修改:
@@ -506,8 +523,8 @@
LIBPATH = LIBPATH + [join_path(iter['root'], f)]
else:
if self.isBuildShared():
- LIBPATH += [join_path(iter['root'], 'bin')]
- LIBPATH += [join_path(iter['root'], 'lib')]
+ LIBPATH += [join_path(iter['root'], self.BIN_DIR)]
+ LIBPATH += [join_path(iter['root'], self.LIB_DIR)]
LIBS = self.APP_LIBS + LIBS
发现一个问题:在修改awtk的src文件夹内的部分源码后构建系统没有重新生成awtk库(libawtk.so);需要在修改源码后先构建一次,再手动删除bin/libawtk.so,然后再次构建才能生成跟所修改的源码对应的库文件。
大侠没遇到这个问题么?
看了代码,原来是因为要用--whole-archive
链接选项而没有将依赖库写到LIBS
变量里;于是scons
就不能根据LIBS
来自动添加依赖关系。
在网上找到这种解决办法,修改如下:
From fc567554b22d2d75582f8981b86a6e25403bcc37 Mon Sep 17 00:00:00 2001
From: ChenShiSheng <chenshisheng@reliachina.com>
Date: Tue, 22 Jun 2021 16:45:32 +0800
Subject: [PATCH] add the dependency of awtk library
---
awtk_config.py | 3 ++-
src/SConscript | 2 ++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/awtk_config.py b/awtk_config.py
index c1bb853c4..dcb90da94 100644
--- a/awtk_config.py
+++ b/awtk_config.py
@@ -201,8 +201,9 @@ elif OS_NAME == 'Linux':
OS_FLAGS = OS_FLAGS + ' -DWITH_64BIT_CPU '
OS_LINKFLAGS=' -Wl,-rpath=./bin -Wl,-rpath=./ '
- AWTK_DLL_DEPS_LIBS = NANOVG_BACKEND_LIBS + ['SDL2', 'glad'] + OS_LIBS
+ AWTK_DLL_DEPS_LIBS = AWTK_STATIC_LIBS + NANOVG_BACKEND_LIBS + ['SDL2', 'glad'] + OS_LIBS
OS_WHOLE_ARCHIVE =' -Wl,--whole-archive -lawtk_global -lextwidgets -lwidgets -lbase -lgpinyin -lstreams -lconf_io -lhal -lcsv -lubjson -lcompressors -lfribidi -lmbedtls -lminiz -ltkc_static -llinebreak -Wl,--no-whole-archive'
+ OS_WHOLE_ARCHIVE += ' -Wl,--allow-multiple-definition '
elif OS_NAME == 'Windows':
if not os.path.exists(os.path.abspath(TK_BIN_DIR)) :
diff --git a/src/SConscript b/src/SConscript
index f5bfe11be..d3908ae15 100644
--- a/src/SConscript
+++ b/src/SConscript
@@ -110,6 +110,7 @@ OS_NAME = platform.system()
TKC_LINKFLAGS = env['LINKFLAGS'];
TKC_STATIC_LIBS = ['conf_io', 'hal', 'csv', 'ubjson', 'streams', 'tkc_static', 'compressors', 'mbedtls', 'miniz']
TKC_LINK_ALL=' -Wl,--whole-archive -lstreams -lconf_io -lhal -lcsv -lubjson -ltkc_static -lcompressors -lmbedtls -lminiz -Wl,--no-whole-archive'
+TKC_LINK_ALL += ' -Wl,--allow-multiple-definition '
if OS_NAME == 'Windows':
if TOOLS_NAME == '' :
@@ -122,6 +123,7 @@ elif OS_NAME == 'Darwin':
TKC_DEPS_LIBS= TKC_STATIC_LIBS
TKC_LINKFLAGS +=' -all_load '
elif OS_NAME == 'Linux':
+ TKC_DEPS_LIBS = TKC_STATIC_LIBS
TKC_LINKFLAGS += TKC_LINK_ALL
env.SharedLibrary(os.path.join(BIN_DIR, 'tkc'), [], LIBS=TKC_DEPS_LIBS, LINKFLAGS=TKC_LINKFLAGS);
--
2.32.0
不加-Wl,--allow-multiple-definition
链接选项,似乎也没问题,-l
指定的依赖库出现重复应该没有问题。
所以重要还是要把依赖库写到LIBS
变量里,让scons
自动添加依赖关系。
scons
内置的Copy Factory
来复制awtk
里的gtest-all.cc
文件到APP源码内,参见这里;Copy Factory
来复制库文件,这样就不会每次甚至在clean
时都复制文件了,awtk_config.py
:def copySharedLib(src, dst, name): if OS_NAME == 'Darwin': lib_name = 'lib'+name+'.dylib' elif OS_NAME == 'Linux': lib_name = 'lib'+name+'.so' elif OS_NAME == 'Windows': lib_name = 'lib'+name+'.dll' else: print('not support ' + OS_NAME) return