awtk踩坑记录一:awtk-web build.py编译过程笔记
工作需求,接触了awtk, 要求把界面部署到web上,期间因为各种编译问题卡的半死,提了不少issue, 经过几天补课,把项目的编译结构给摸了一遍,做个记录,也希望能帮到有同样问题的朋友。
之前python只是略接触过,第一次见过正规项目用python编译,还尝试自己调试追踪过程,感觉也成长了不少。
测试方法:vscode下用python插件F5 debug, debug方式选择command line arguments
放编译build.py的方法以方便CV:
./emsdk_env
cd ../awtk-web
python build.py D:\AWStudioProjects\Workspace\AwtkApplication3\build.json all
build.py入口:
def run(app_root, config, action):prepare_app_target_dir(config)prepare_export_funcs(app_root, config)if action == 'all':build_app_assets(app_root, config)build_awtk_js(app_root, config, ' -g4 -gsource-map ')build_awtk_web_js(config)
...
1.build_app_assets:生成webroot映像,加载项目资源
- 从目标的build.json【本例目标名AwtkApplication3, python变量名config】中指定的路径copy资源到awtk-web的对应的
design
目录,project.json, data/app.html和data/index.html,。 - 调用
update_res.py
更新资源res目录
build.json
{"name": "AwtkApplication3","version": "1.0","assets": "res/assets","author": "AWTK Develop Team","copyright": "Guangzhou ZHIYUAN Electronics Co.,Ltd.","themes":["default"],"web": {"app_type": "c","assets": "design","sources": ["src/*.c","src/*/*.c"],"config": {"fontScale": "0.8","defaultFont": "sans"}}
}
build.py
#src_app_root='D:\\AWStudioProjects\\Workspace\\AwtkApplication3'
#config是目标项目的build.json对象
def build_app_assets(src_app_root, config):#生成对应项目在awtk-web/webroot的对应映像,并复制项目design文件夹到映像目录下copy_assets(src_app_root, config) #复制对应项目project.json到对应映像目录下copy_project_json(src_app_root, config) #复制awtk-web的html模版app.html及index.html到对应映像copy_data_file(config, 'app.html') copy_data_file(config, 'index.html')#更新对应映像的assets:为目标映像生成script文件夹和res文件夹以及assets_web.jsupdate_assets(config) #构建对应的romfs文件系统(如果有),一般不需要build_romfs(app_root, config);
#src = 'scripts'
#dst = 'D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\scripts'
def prepare_update_res(config):src = 'scripts'dst = join_path(config_get_app_target_dir(config), 'scripts')copy_folder(src, dst)#return: 'D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3'
def config_get_app_target_dir(config):return join_path(WEB_ROOT, config['name'])def update_assets(config):#复制awtk-web的scripts文件夹到目标项目的webroot映像下prepare_update_res(config)#获取目标项目的webroot映像目录config_get_app_target_dir(config)""" 运行update.res.py更新资源,相当于cd D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3本地系统python ./scripts/update_res.py res 本地系统python ./scripts/update_res.py json 本地系统python ./scripts/update_res.py web cd D:\\Devtools\\awtk-web
"""cwd = os.getcwd()app_target_dir = config_get_app_target_dir(config)os.chdir(app_target_dir)os.system('\"'+sys.executable+'\"' + ' scripts/update_res.py res')# 此步生成映像的assets_web.jsos.system('\"'+sys.executable+'\"' + ' scripts/update_res.py json')os.system('\"'+sys.executable+'\"' + ' scripts/update_res.py web')os.chdir(cwd)
2.build_awtk_js:为映像生成awtk.js,awtk_asm.js,awtk_asm.wasm
步骤一:将AWTK_SRC_DIR
下所有c库文件(awtk.getWebFiles()获取), awtk-web目录下符合正则src/c/*.c
的所有文件(web_files), gen/c/awtk_wrap.c
(如果目标项目是由js构成),以及项目build.json的sources属性指定的所有c/cpp源文件,加入文件列表all_files
,并用emscripten自带的emcc编译, 输出awtk.js和awtk_asm.js。
def build_awtk_js(src_app_root, config, flags):app_target_dir = config_get_app_target_dir(config)app_files = []#如果目标项目是js类型,将awtk-web的gen/c/awtk_wrap.c加入if(is_js_app(config)):app_files.append(join_path('./', 'gen/c/awtk_wrap.c'))#提取目标项目的所有c源文件加入到app_files列表供编译#源文件路径取自目标项目build.json的sources列表sources = config['sources']for f in sources:if f.endswith('.c') or f.endswith('.cpp'):app_files = app_files + glob.glob(f)#提取awtk-web的所有c源文件加入web_files列表供编译web_files = glob.glob('src/c/*.c')#awtk.getWebFiles()获取awtk目标下所有库文件依赖,包括tkc,base,widget等库#将所有编译文件加入列表files = awtk.getWebFiles() + web_files + app_filesall_files = []for f in files:all_files.append(os.path.normpath(os.path.abspath(f)))# 将目标项目的res加入编译器的include选项# includes_path = -ID:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\resincludes_path = ' -I' + join_path(app_target_dir, 'res') + ' 'if 'includes' in config:includes_files = config['includes']for f in includes_files:includes_path += ('-I ' + f + " ")# 生成编译flagCOMMON_FLAGS = ' ' + flags + ' 'if 'cflags' in config:COMMON_FLAGS = COMMON_FLAGS + ' ' + ' '.join(config['cflags'])if 'cxxflags' in config:COMMON_FLAGS = COMMON_FLAGS + ' ' + ' '.join(config['cxxflags'])COMMON_FLAGS = COMMON_FLAGS + ' -DSAFE_HEAP=1 -DASSERTIONS=1 -DSTACK_OVERFLOW_CHECK=1 'COMMON_FLAGS = COMMON_FLAGS + \' -s EXPORTED_RUNTIME_METHODS=@configs/export_runtime_funcs.json 'COMMON_FLAGS = COMMON_FLAGS + '-s ALLOW_MEMORY_GROWTH=1 -s USE_SDL=2'# 如果目标项目是js类型将附加的编译选项if(is_js_app(config)):COMMON_FLAGS = COMMON_FLAGS + ' -DAWTK_WEB_JS 'COMMON_FLAGS = COMMON_FLAGS + ' -s RESERVED_FUNCTION_POINTERS=1000 'COMMON_FLAGS = COMMON_FLAGS + ' -s EXPORTED_FUNCTIONS=@gen/export_all_funcs.json'COMMON_FLAGS = COMMON_FLAGS + ' -DWITH_DATA_READER_WRITER 'COMMON_FLAGS = COMMON_FLAGS + ' -DHAS_STD_MALLOC -DNDEBUG -DAWTK_WEB -Isrc/c 'COMMON_FLAGS = COMMON_FLAGS + ' -DWITH_WINDOW_ANIMATORS -DWITH_NANOVG_GPU '# COMMON_FLAGS = ' -g4 -gsource-map -DSAFE_HEAP=1 -DASSERTIONS=1 -DSTACK_OVERFLOW_CHECK=1 -s EXPORTED_RUNTIME_METHODS=@configs/export_runtime_funcs.json -s ALLOW_MEMORY_GROWTH=1 -s USE_SDL=2 -s EXPORTED_FUNCTIONS=@gen/export_all_funcs.json -DWITH_DATA_READER_WRITER -DHAS_STD_MALLOC -DNDEBUG -DAWTK_WEB -Isrc/c -DWITH_WINDOW_ANIMATORS -DWITH_NANOVG_GPU '#输出对应的js文件
#output=D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\js\\awtk.jsoutput = join_path(config_get_js_dir(config), "awtk.js")CPPFLAGS_JS = ' -o ' + output + ' -s WASM=0 ' + COMMON_FLAGS + includes_pathawtk.runArgsInFile('emcc -v ', CPPFLAGS_JS, all_files)
#output=D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\js\\awtk_asm.jsoutput = join_path(config_get_js_dir(config), "awtk_asm.js")CPPFLAGS_ASM = ' -o ' + output + COMMON_FLAGS + includes_pathawtk.runArgsInFile('emcc -v ', CPPFLAGS_ASM, all_files)
运行 awtk.runArgsInFile
之后系统将输出一大堆文件编译,总共三百多个文件,耐心等待,日志看着一大坨很乱:
-o D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\js\\awtk.js -s WASM=0 -g4 -gsource-map -DSAFE_HEAP=1 -DASSERTIONS=1 -DSTACK_OVERFLOW_CHECK=1 -s EXPORTED_RUNTIME_METHODS=@configs/export_runtime_funcs.json -s ALLOW_MEMORY_GROWTH=1 -s USE_SDL=2 -s EXPORTED_FUNCTIONS=@gen/export_all_funcs.json -DWITH_DATA_READER_WRITER -DHAS_STD_MALLOC -DNDEBUG -DAWTK_WEB -Isrc/c -DWITH_WINDOW_ANIMATORS -DWITH_NANOVG_GPU -ID:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\res -ID:\\Devtools\\awtk/3rd -ID:\\Devtools\\awtk -ID:\\Devtools\\awtk\\src -ID:\\Devtools\\awtk\\src/ext_widgets D:\\Devtools\\awtk\\src\\tkc\\action_darray_thread.c D:\\Devtools\\awtk\\src\\tkc\\action_queue.c D:\\Devtools\\awtk\\src\\tkc\\action_thread.c ...(省略awtk库的一堆c文件)
emcc: warning: please replace -g4 with -gsource-map [-Wdeprecated]
"D:/Devtools/emsdk/upstream/bin\clang.exe" -target wasm32-unknown-emscripten -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --sysroot=D:\Devtools\emsdk\upstream\emscripten\cache\sysroot -DEMSCRIPTEN -Werror=implicit-function-declaration -isystem D:\Devtools\emsdk\upstream\emscripten\cache\sysroot\include\SDL2 -Xclang -iwithsysroot/include\compat -v -g3 -g -DSAFE_HEAP=1 -DASSERTIONS=1 -DSTACK_OVERFLOW_CHECK=1 -DWITH_DATA_READER_WRITER -DHAS_STD_MALLOC -DNDEBUG -DAWTK_WEB -Isrc/c -DWITH_WINDOW_ANIMATORS -DWITH_NANOVG_GPU -ID:\Devtools\awtk-web\webroot\AwtkApplication3\res -ID:\Devtools\awtk/3rd -ID:\Devtools\awtk -ID:\Devtools\awtk\src -ID:\Devtools\awtk\src/ext_widgets D:\Devtools\awtk\src\tkc\action_darray_thread.c -c -o C:\Users\nihaoa\AppData\Local\Temp\emscripten_temp_256cz5b6\action_darray_thread_0.o
clang version 19.0.0git (https:/github.com/llvm/llvm-project 6c7805d5d186a6d1263f90b8033ad85e2d2633d7)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: D:\Devtools\emsdk\upstream\bin(in-process)"D:\\Devtools\\emsdk\\upstream\\bin\\clang.exe" -cc1 -triple wasm32-unknown-emscripten -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name action_darray_thread.c -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb "-fdebug-compilation-dir=D:\\Devtools\\awtk-web" -v "-fcoverage-compilation-dir=D:\\Devtools\\awtk-web" -resource-dir "D:\\Devtools\\emsdk\\upstream\\lib\\clang\\19" -isystem "D:\\Devtools\\emsdk\\upstream\\emscripten\\cache\\sysroot\\include\\SDL2" -D EMSCRIPTEN -D SAFE_HEAP=1 -D ASSERTIONS=1 -D STACK_OVERFLOW_CHECK=1 -D WITH_DATA_READER_WRITER -D HAS_STD_MALLOC -D NDEBUG -D AWTK_WEB -I src/c -D WITH_WINDOW_ANIMATORS -D WITH_NANOVG_GPU -I "D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\res" -I "D:\\Devtools\\awtk/3rd" -I "D:\\Devtools\\awtk" -I "D:\\Devtools\\awtk\\src" -I "D:\\Devtools\\awtk\\src/ext_widgets" -isysroot "D:\\Devtools\\emsdk\\upstream\\emscripten\\cache\\sysroot" -internal-isystem "D:\\Devtools\\emsdk\\upstream\\lib\\clang\\19\\include" -internal-isystem "D:\\Devtools\\emsdk\\upstream\\emscripten\\cache\\sysroot/include/wasm32-emscripten" -internal-isystem "D:\\Devtools\\emsdk\\upstream\\emscripten\\cache\\sysroot/include" -Werror=implicit-function-declaration -ferror-limit 19 -fmessage-length=230 -fvisibility=default -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fignore-exceptions -fcolor-diagnostics "-iwithsysroot/include\\compat" -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o "C:\\Users\\nihaoa\\AppData\\Local\\Temp\\emscripten_temp_256cz5b6\\action_darray_thread_0.o" -x c "D:\\Devtools\\awtk\\src\\tkc\\action_darray_thread.c"
clang -cc1 version 19.0.0git based upon LLVM 19.0.0git default target x86_64-pc-windows-msvc
ignoring nonexistent directory "D:\Devtools\emsdk\upstream\emscripten\cache\sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:src/cD:\Devtools\awtk-web\webroot\AwtkApplication3\resD:\Devtools\awtk/3rdD:\Devtools\awtkD:\Devtools\awtk\srcD:\Devtools\awtk\src/ext_widgetsD:\Devtools\emsdk\upstream\emscripten\cache\sysroot\include\SDL2D:\Devtools\emsdk\upstream\emscripten\cache\sysroot/include\compatD:\Devtools\emsdk\upstream\lib\clang\19\includeD:\Devtools\emsdk\upstream\emscripten\cache\sysroot/include
End of search list.
。。。(省略后面三百多个文件的编译)"D:/Devtools/emsdk/upstream/bin\clang.exe" -target wasm32-unknown-emscripten -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --sysroot=D:\Devtools\emsdk\upstream\emscripten\cache\sysroot -DEMSCRIPTEN -Werror=implicit-function-declaration -isystem D:\Devtools\emsdk\upstream\emscripten\cache\sysroot\include\SDL2 -Xclang -iwithsysroot/include\compat -v -g3 -g -DSAFE_HEAP=1 -DASSERTIONS=1 -DSTACK_OVERFLOW_CHECK=1 -DWITH_DATA_READER_WRITER -DHAS_STD_MALLOC -DNDEBUG -DAWTK_WEB -Isrc/c -DWITH_WINDOW_ANIMATORS -DWITH_NANOVG_GPU -ID:\Devtools\awtk-web\webroot\AwtkApplication3\res -ID:\Devtools\awtk/3rd -ID:\Devtools\awtk -ID:\Devtools\awtk\src -ID:\Devtools\awtk\src/ext_widgets D:\AWStudioProjects\Workspace\AwtkApplication3\src\main.c -c -o C:\Users\nihaoa\AppData\Local\Temp\emscripten_temp_vom058uh\main_313.o
clang version 19.0.0git (https:/github.com/llvm/llvm-project 6c7805d5d186a6d1263f90b8033ad85e2d2633d7)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: D:\Devtools\emsdk\upstream\bin(in-process)"D:\\Devtools\\emsdk\\upstream\\bin\\clang.exe" -cc1 -triple wasm32-unknown-emscripten -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name main.c -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb "-fdebug-compilation-dir=D:\\Devtools\\awtk-web" -v "-fcoverage-compilation-dir=D:\\Devtools\\awtk-web" -resource-dir "D:\\Devtools\\emsdk\\upstream\\lib\\clang\\19" -isystem "D:\\Devtools\\emsdk\\upstream\\emscripten\\cache\\sysroot\\include\\SDL2" -D EMSCRIPTEN -D SAFE_HEAP=1 -D ASSERTIONS=1 -D STACK_OVERFLOW_CHECK=1 -D WITH_DATA_READER_WRITER -D HAS_STD_MALLOC -D NDEBUG -D AWTK_WEB -I src/c -D WITH_WINDOW_ANIMATORS -D WITH_NANOVG_GPU -I "D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\res" -I "D:\\Devtools\\awtk/3rd" -I "D:\\Devtools\\awtk" -I "D:\\Devtools\\awtk\\src" -I "D:\\Devtools\\awtk\\src/ext_widgets" -isysroot "D:\\Devtools\\emsdk\\upstream\\emscripten\\cache\\sysroot" -internal-isystem "D:\\Devtools\\emsdk\\upstream\\lib\\clang\\19\\include" -internal-isystem "D:\\Devtools\\emsdk\\upstream\\emscripten\\cache\\sysroot/include/wasm32-emscripten" -internal-isystem "D:\\Devtools\\emsdk\\upstream\\emscripten\\cache\\sysroot/include" -Werror=implicit-function-declaration -ferror-limit 19 -fmessage-length=230 -fvisibility=default -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fignore-exceptions -fcolor-diagnostics "-iwithsysroot/include\\compat" -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o "C:\\Users\\nihaoa\\AppData\\Local\\Temp\\emscripten_temp_vom058uh\\main_313.o" -x c "D:\\AWStudioProjects\\Workspace\\AwtkApplication3\\src\\main.c"
clang -cc1 version 19.0.0git based upon LLVM 19.0.0git default target x86_64-pc-windows-msvc
ignoring nonexistent directory "D:\Devtools\emsdk\upstream\emscripten\cache\sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:src/cD:\Devtools\awtk-web\webroot\AwtkApplication3\resD:\Devtools\awtk/3rdD:\Devtools\awtkD:\Devtools\awtk\srcD:\Devtools\awtk\src/ext_widgetsD:\Devtools\emsdk\upstream\emscripten\cache\sysroot\include\SDL2D:\Devtools\emsdk\upstream\emscripten\cache\sysroot/include\compatD:\Devtools\emsdk\upstream\lib\clang\19\includeD:\Devtools\emsdk\upstream\emscripten\cache\sysroot/include
End of search list.
"D:/Devtools/emsdk/upstream/bin\clang.exe" --version
"D:/Devtools/emsdk/upstream/bin\wasm-ld.exe" @C:\Users\nihaoa\AppData\Local\Temp\emscripten_e9gcm659.rsp.utf-8
"D:\Devtools\emsdk\python\3.9.2-nuget_64bit\python.exe" -E D:\Devtools\emsdk\upstream\emscripten\tools\wasm-sourcemap.py D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm --dwarfdump=D:/Devtools/emsdk/upstream/bin\llvm-dwarfdump.exe -o D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm.map --basepath=D:\Devtools\awtk-web\webroot\AwtkApplication3\js"D:/Devtools/emsdk/upstream/bin\llvm-objcopy.exe" D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm --remove-section=.debug* --remove-section=producers"D:/Devtools/emsdk/upstream\bin\wasm-emscripten-finalize" -g --dyncalls-i64 --pass-arg=legalize-js-interface-exported-helpers --dwarf --output-source-map-url=awtk_asm.wasm.map D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm -o D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm --detect-features --input-source-map=D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm.map --output-source-map=D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm.map
emcc: warning: `main` is defined in the input files, but `_main` is not in `EXPORTED_FUNCTIONS`. Add it to this list if you want `main` to run. [-Wunused-main]"D:/Devtools/emsdk/node/16.20.0_64bit/bin/node.exe" D:\Devtools\emsdk\upstream\emscripten\src\compiler.mjs C:\Users\nihaoa\AppData\Local\Temp\tmpwpa968vp.json
awtk.runArgsInFile
源代码:
def getIncludes():return '-I' + AWTK_ROOT_DIR + '/3rd ' + '-I' + AWTK_ROOT_DIR + ' -I' + AWTK_SRC_DIR +' -I' + AWTK_SRC_DIR +'/ext_widgets';def writeArgs(filename, str):with open(filename, "w") as text_file:text_file.write(str);def runArgsInFile(cmd, flags, files):cmd_args = flags + ' ' + getIncludes() + ' ' + ' '.join(files) cmd_args = cmd_args.replace('\\', '\\\\');writeArgs("args.txt", cmd_args);print(cmd_args)os.system(cmd + ' @args.txt');
该步完成后会发现映像项目有一个js目录,多了3个文件:
PS D:\Devtools\awtk-web\webroot\AwtkApplication3\js> ls目录: D:\Devtools\awtk-web\webroot\AwtkApplication3\jsMode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/5/28 17:05 82504 awtk_asm.js
-a---- 2024/5/28 17:05 2226706 awtk_asm.wasm
-a---- 2024/5/28 17:05 684260 awtk_asm.wasm.map
是以下指令生成的:
"D:/Devtools/emsdk/upstream/bin\wasm-ld.exe" @C:\Users\nihaoa\AppData\Local\Temp\emscripten_e9gcm659.rsp.utf-8"D:\Devtools\emsdk\python\3.9.2-nuget_64bit\python.exe"
-E D:\Devtools\emsdk\upstream\emscripten\tools\wasm-sourcemap.py D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm --dwarfdump=D:/Devtools/emsdk/upstream/bin\llvm-dwarfdump.exe
-o D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm.map
--basepath=D:\Devtools\awtk-web\webroot\AwtkApplication3\js"D:/Devtools/emsdk/upstream/bin\llvm-objcopy.exe"
D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm
D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm
--remove-section=.debug*
--remove-section=producers"D:/Devtools/emsdk/upstream\bin\wasm-emscripten-finalize" -g --dyncalls-i64 --pass-arg=legalize-js-interface-exported-helpers --dwarf --output-source-map-url=awtk_asm.wasm.map D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm-o D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm --detect-features --input-source-map=D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm.map --output-source-map=D:\Devtools\awtk-web\webroot\AwtkApplication3\js\awtk_asm.wasm.mapemcc: warning: `main` is defined in the input files, but `_main` is not in `EXPORTED_FUNCTIONS`. Add it to this list if you want `main` to run. [-Wunused-main]"D:/Devtools/emsdk/node/16.20.0_64bit/bin/node.exe" D:\Devtools\emsdk\upstream\emscripten\src\compiler.mjs C:\Users\nihaoa\AppData\Local\Temp\tmpwpa968vp.json
3.build_awtk_web_js:为映像构建app.js和awtk_web.js
def build_awtk_web_js(config):# 生成目标项目webroot的app.js[本质是把原项目的源js文件所有内容暴力整合到一个js文件下]build_app_js(config)"""app_target_dir= 'D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3'assets_js= 'D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\assets_web.js'outfile = 'D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\js\\awtk_web.js'"""app_target_dir = config_get_app_target_dir(config)assets_js = join_path(app_target_dir, 'assets_web.js')outfile = join_path(config_get_js_dir(config), 'awtk_web.js')# 在awtk-web目录下生成app_config.js文件,与assets_web.js和下列js文件用于构建awtk_web.jsgen_app_config(config, 'gen/app_config.js')awtk_web_js_files = [assets_js,'src/js/browser.js','gen/app_config.js','src/js/webgl2d.js','src/js/image_cache.js','src/js/assets_manager.js','src/js/image_loader.js','src/js/input_method_web.js','src/js/utils.js','src/js/edit_element.js','src/js/vgcanvas_web.js','src/js/awtk_wrap.js','src/js/key_event.js','src/js/events_source.js','src/js/main_loop_web.js']merge_files(awtk_web_js_files, outfile)
def merge_files(srcs, dst):print(dst)with open(dst, 'w') as outfile:for fname in srcs:print(fname)with open(fname, encoding='utf-8-sig') as infile:outfile.write(infile.read())outfile.write("\n")def need_awtk_api_js(config):return is_js_app(config) and not is_reactjs(config)#将目标项目build.json下source选项指定的js文件合成一个新的app.js文件,放到webroot对应映像下
def build_app_js(config):app_files = []sources = config['sources']#output='D:\\Devtools\\awtk-web\\webroot\\AwtkApplication3\\js\\app.js'output = join_path(config_get_js_dir(config), 'app.js')#对于js类型项目须加入两个js文件if(need_awtk_api_js(config)):app_files.append('api/awtk_api_browser_prefix.js')app_files.append('api/awtk_api.js')#如果目标项目下有js文件,加入app_files列表for f in sources:if f.endswith('.js'):app_files = app_files + glob.glob(join_path(app_root, f))#app_files下所有js文件内容合并到app.jsmerge_files(app_files, output)print(app_files, output)
该步完成后映像项目下js目录将多出app.js和awtk_web.js两个文件:
PS D:\Devtools\awtk-web\webroot\AwtkApplication3\js> ls目录: D:\Devtools\awtk-web\webroot\AwtkApplication3\jsMode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/5/28 17:11 0 app.js
-a---- 2024/5/28 17:05 82504 awtk_asm.js
-a---- 2024/5/28 17:05 2226706 awtk_asm.wasm
-a---- 2024/5/28 17:05 684260 awtk_asm.wasm.map
-a---- 2024/5/28 17:11 140526 awtk_web.js
自此编译过程结束。
上面的例子是awtk c项目,如果是js项目,编译列表会略有变化,具体自己实验。
相关文章:

awtk踩坑记录一:awtk-web build.py编译过程笔记
工作需求,接触了awtk, 要求把界面部署到web上,期间因为各种编译问题卡的半死,提了不少issue, 经过几天补课,把项目的编译结构给摸了一遍,做个记录,也希望能帮到有同样问题的朋友。 之前python只是略接触过…...

docker容器中解决中文乱码
1. 找到dockerfile文件 2. 编辑Dockerfile 添加 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 3. 生成新的镜像文件 FROM java17_yinpeng:latest MAINTAINER YP <2064676101QQ.COM> ADD jiquan_online_chat.jar jiquan_online_chat #CM…...

Javascript 位运算符(,|,^,<<,>>,>>>)
文章目录 一、什么是位运算?二、如何使用1. 位与(AND):&用途(1)数据清零(2)判断奇偶 2. 位或(OR):|用途(1)向下取整 3…...

Golang项目代码组织架构实践
Golang在项目结构上没有强制性规范,虽然这给了开发者很大的自由度,但也需要自己沉淀一套可行的架构。本文介绍了一种项目布局,可以以此为参考设计适合自己的 Golang 项目组织模式。原文: Golang Project Layout Go 有很多强制的或是约定俗成的…...

网工内推 | 国企信息安全工程师,CISP认证优先
01 浙江省公众信息产业有限公司 🔷招聘岗位:安全运营工程师 🔷职责描述: 1. 负责公司内部安全运营平台及其子系统的安全事件管理、事件发现分析、应急响应和系统维护等; 2. 负责风险和漏洞管理,包括漏洞预…...

RAG 高级应用:基于 Nougat、HTML 转换与 GPT-4o 解析复杂 PDF 内嵌表格
一、前言 RAG(检索增强生成)应用最具挑战性的方面之一是如何处理复杂文档的内容,例如 PDF 文档中的图像和表格,因为这些内容不像传统文本那样容易解析和检索。前面我们有介绍过如何使用 LlamaIndex 提供的 LlamaParse 技术解析复…...

《TCP/IP网络编程》(第十二章)I/O复用(2)
下面是基于I/O复用的回声服务器端和客户端代码 1.Linux系统 服务器端代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // POSIX标准定义的通用函数,如close() #include <arpa/inet.h> //…...

AI企业需要“联盟营销”?一文带你探索AI企业营销新玩法!
为什么联盟营销对AI业务有较大优势 联盟营销在电商领域、saas领域与其他产品领域同样有效。在AI业务中,它有效的原因与其他领域大不相同。 高好奇心和试用率 AI领域是创新的热点。它吸引了一群渴望探索和尝试每一项新技术的人群。这种蓬勃的好奇心为聪明的AI企业提…...

你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解
目录 一、onMounted的前世今生 1.1、onMounted是什么 1.2、onMounted在vue2中的前身 1.2.1、vue2中的onMounted 1.2.2、Vue2与Vue3的onMounted对比 1.3、vue3中onMounted的用法 1.3.1、基础用法 1.3.2、顺序执行异步操作 1.3.3、并行执行多个异步操作 1.3.4、执行一次…...

JavaWeb基础(一)-IO操作
Java I/O工作机制: 注:简要笔记,示例代码可能较少,甚至没有。 1、Java 的 I/O 类库的基本架构。 Java 的 I/O 操作类在包 java.io 下,大概有将近80个类,这些类大概可以分为如下四组。 基于字节操作的…...

拼多多(PDD)社招一面原题
未成年游戏退费 5 月 28 日,中国互联网协会发布《未成年人网络游戏服务消费管理要求(征求意见稿)》团体标准。 该标准是游戏行业首个完整的消费管理规范,可用于未成年人游戏消费退费纠纷解决,也可为相关行政部门、司法…...

类中使用QtConcurrent::run
在QtConcurrent::run中调用类的成员函数时,你需要注意几个关键点: 对象生命周期:你需要确保在QtConcurrent::run调用的整个期间,类对象都是有效的。如果对象在成员函数执行期间被销毁,将会导致未定义行为。成员函数访…...

基于深度学习的中文情感分析系统python flask
基于python的毕业设计 基于深度学习的中文情感分析系统(flask)(源码说明文档演示) 毕业设计课程设计期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目…...

Mysql联合索引
对mysql联合索引的认识 文章目录 对mysql联合索引的认识最左原则匹配一、最左匹配的原理?二、实战 最左原则匹配 所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配ÿ…...

Linux基础指令用户管理003
继Linux基础指令002我们讲了如何设置用户密码以及修改用户信息,我们讲一下高级用户管理。 操作系统 CentOS Stream 9 高级用户管理 visudo 用于普通用户临时提升权限执行命令,如下图 [yylocalhost ~]$ cp -av /etc/passwd{,_bak} /etc/passwd ->…...

java图书电子商务网站的设计与实现源码(springboot+vue+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书电子商务网站的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 图书电子商…...

全球首个多语种手语视频生成模型诞生:SignLLM
近日,一项名为 SignLLM 的新型 AI 技术取得了突破性进展,或将彻底改变听障人士的沟通方式。作为全球首个多语种手语生成模型,SignLLM 能够将输入的文本或语音指令,实时转化为对应的手语手势视频,为打破语言障碍、促进信…...

初学C语言100题:经典例题节选(源码分享)
1.输出10000以内所有完数 完数的概念 一个正整数的所有因子(除了自身以外的约数)的和恰巧等于它本身 #include <stdio.h>int main() {int i 0;for (i 2; i < 10000; i)//生成1到10000之间的数{int j 0;int sum 0;//注意这里的sum每次循环结…...

C++设计模式之策略模式、迭代器模式、适配器模式、工厂模式、超级工厂模式、享元模式、代理模式
文章目录 一、介绍1.毫无价值的使用虚函数例子 二、策略模式1.策略模式2.多重策略与迭代器模式3.不要什么东西都塞一块 三、适配器模式1.跨接口的适配器2.跨接口的适配器 四、工厂模式1.工厂模式2.超级工厂模式3.RAII 自动管理内存4.工厂模式实战 五、享元模式1.享元模式2.代理…...

18 js时间对象
时间对象是一种复杂数据类型,用来存储时间 创建时间对象 内置构造函数创建 语法:var 时间名new Date() var datenew Date()console.log(date) //Wed May 29 2024 16:03:47 GMT0800 (中国标准时间) 创建指定日期 当参数为数字——>在格林威治的时间基…...

安卓赤拳配音v1.0.2Ai配音神器+百位主播音色
Ai配音神器 本人自用版本!超级稳定!百位主播音色 登陆即可用 链接:https://pan.baidu.com/s/1WVsrYZqLaPAriHMMLMdPBg?pwdz9ru 提取码:z9ru...

前端面试题日常练-day40 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 1. Bootstrap 的栅格系统是基于( )进行布局的。A. 像素 B. 百分比 C. 媒体查询 2. 在 Bootstrap 中,要创建一个按钮,可以使用( ÿ…...

UG NX二次开发(C#)-UFun函数-利用UFPart.Export导出模型中的对象并创建一个新的part
文章目录 1、前言2、UF_PART_export函数定义3、UF_PART_export_with_options函数定义4、代码1、前言 在UG NX 10.0二次开发中,需要用到将装配体中通过几何建模创建的对象独立创建一个part文件,所以查找了下UFun函数,即是UF_PART_export 和UF_PART_export_with_options两个函…...

SFOS2:组件介绍
一、前言 在sailfish os application的开发过程中,几乎是困难重重,因为我暂未找到具有完整性、指导性、易懂性的开发文档,特别是组件的使用,现决定将自己的探究结果记录下来。因此,这篇文章只会具有参考价值࿰…...

交换机的三层交换技术
现有pc1与pc2不在同一个网段之下,通过交换机相连接。 进人交换机1,创建两个vlan 10和vlan 20 ,进入串口2设置串口模式为access,并且设置默认vlan为10.进入串口3设置串口模式为access,并且设置默认vlan为20. 进入串口1…...

探秘URL的奥义:JavaScript中轻松获取页面参数值的N种姿势【含代码示例】
探秘URL的奥义:JavaScript中轻松获取页面参数值的N种姿势【含代码示例】 URL基础知识补给站基础案例:直接解析URL案例一:使用URLSearchParams案例二:传统字符串分割法 高级策略:动态与安全案例三:封装与模块…...

VSCode小技巧,忽略不想格式化的代码行
零.格式化工具文档 1 . Black Ignoring sections功能 2 . autopep8 disabling-line-by-line功能;;–line-range选项 3 . Prettier prettier-ignore功能(例:适用于JS的// prettier-ignore,适用于CSS的/* prettier-igno…...

揭秘网络编程:同步与异步IO模型的实战演练
摘要 在网络编程领域,同步(Synchronous)、异步(Asynchronous)、阻塞(Blocking)与非阻塞(Non-blocking)IO模型是核心概念。尽管这些概念在多篇文章中被广泛讨论,它们的抽象性使得彻底理解并非易事。本文旨在通过具体的实验案例,将这些抽象…...

在Visual Studio Code和Visual Studio 2022下配置Clang-Format,格式化成Google C++ Style
项目开发要求好的编写代码格式规范,常用的是根据Google C Style Guide 网上查了很多博文,都不太一样有的也跑不起来,通过尝试之后,自己可算折腾好了,整理一下过程 背景: 编译器主要有三部分:前…...

民国漫画杂志《时代漫画》第32期.PDF
时代漫画32.PDF: https://url03.ctfile.com/f/1779803-1248635561-0ae98a?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!...