– 由于awtk官方并没有提供cmake的相关编译实现,都是用的scons,个人觉得不如cmake简单好用,不是所有东西全都套上python
- 这里给出可以完成交叉编译的CMakeLists.txt,另外给出python拷贝源码的脚本,作用是把awtk乱七八糟的目录,统一拷贝到指定的目录,方便编译
project(awtk_gui)
set(toolchain_dir /opt/toolchain/arm-openwrt-linux-uclibcgnueabi/toolchain-arm_cortex-a5+neon_gcc-4.8-linaro_uClibc-0.9.33.2_eabi)
#Forces out of source builds just in case.
MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}" insource)
GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${PARENTDIR}" insourcesubdir)
IF(insource OR insourcesubdir)
MESSAGE(FATAL_ERROR "${MSG}")
ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build.")
macro(FIND_INCLUDE_DIR result curdir) #定义函数,2个参数:存放结果result;指定路径curdir;
file(GLOB_RECURSE children "${curdir}/*.hpp" "${curdir}/*.h" ) #遍历获取{curdir}中*.hpp和*.h文件列表
message(STATUS "children= ${children}") #打印*.hpp和*.h的文件列表
set(dirlist "") #定义dirlist中间变量,并初始化
foreach(child ${children}) #for循环
string(REGEX REPLACE "(.*)/.*" "\\1" LIB_NAME ${child}) #字符串替换,用/前的字符替换/*h
if(IS_DIRECTORY ${LIB_NAME}) #判断是否为路径
if(dirlist MATCHES ${LIB_NAME})#判断dirlist是否含有${LIB_NAME}
else()
MESSAGE(STATUS "current platform: Linux ")
LIST(APPEND dirlist ${LIB_NAME}) #将合法的路径加入dirlist变量中
endif()
endif() #结束判断
endforeach() #结束for循环
set(${result} ${dirlist}) #dirlist结果放入result变量中
endmacro()
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX $(PWD)/install)
endif()
# for cross compiling toolchain
#set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_SYSTEM_PROCESSOR arm)
#set(tools ${toolchain_dir})
set(CMAKE_C_COMPILER ${tools}/bin/arm-openwrt-linux-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-openwrt-linux-g++)
add_definitions(-Os -Wall -I.. -DSTAGING_DIR -DAPP_NAME=${PROJECT_NAME}
-DLINUX
-DWITH_SOCKET=1
-DHAS_PTHREAD=1
-DHAS_STDIO=1
-DHAS_STD_MALLOC=1
-DWITH_BITMAP_RGB565=1
-DHAS_GET_TIME_US64
)
link_directories(${CMAKE_SOURCE_DIR}/lib)
file(GLOB_RECURSE third_agge_list "awtk/3rd/agge/agge/*.cpp")
file(GLOB_RECURSE third_gpinyin_list "awtk/3rd/gpinyin/src/*.cpp")
file(GLOB_RECURSE third_unibreak_list "awtk/3rd/libunibreak/*.c")
file(GLOB_RECURSE third_nanovg_agg_list "awtk/3rd/nanovg/agge/*.cpp")
file(GLOB_RECURSE third_nanovg_base_list "awtk/3rd/nanovg/base/*.c")
file(GLOB_RECURSE awtk_tkc_list "awtk/src/tkc/*.c")
file(GLOB_RECURSE awtk_base_list "awtk/src/base/*.c")
file(GLOB_RECURSE awtk_widgets_list "awtk/src/widgets/*.c")
file(GLOB_RECURSE awtk_xml_list "awtk/src/xml/*.c")
file(GLOB_RECURSE awtk_uiloader_list "awtk/src/uiloader/*.c")
file(GLOB_RECURSE awtk_vgcanvas_list "awtk/src/vgcanvas/*.c")
file(GLOB_RECURSE awtk_blend_list "awtk/src/blend/*.c")
file(GLOB_RECURSE awtk_lcd_list "awtk/src/lcd/*.c")
file(GLOB_RECURSE awtk_ext_widgets_list "awtk/src/ext_widgets/*.c" EXCLUDE "serial_widget/*")
file(GLOB_RECURSE awtk_font_loader_list "awtk/src/font_loader/*.c")
file(GLOB_RECURSE awtk_image_loader_list "awtk/src/image_loader/*.c")
file(GLOB_RECURSE awtk_input_engines_list "awtk/src/input_engines/*.cpp")
file(GLOB_RECURSE awtk_widget_animators_list "awtk/src/widget_animators/*.c")
file(GLOB_RECURSE awtk_platforms_list "awtk/src/platforms/pc/*.c")
add_library(${PROJECT_NAME}
awtk/src/awtk_global.c
${awtk_tkc_list}
${awtk_base_list}
${awtk_widgets_list}
${awtk_xml_list}
${awtk_uiloader_list}
${awtk_vgcanvas_list}
${awtk_blend_list}
${awtk_ext_widgets_list}
${awtk_font_loader_list}
${awtk_image_loader_list}
${awtk_input_engines_list}
awtk/src/input_methods/input_method_creator.c
${awtk_lcd_list}
awtk/src/main_loop/main_loop_simple.c
awtk/src/native_window/native_window_raw.c
awtk/src/window_manager/window_manager_default.c
awtk/src/graphic_buffer/graphic_buffer_default.c
${awtk_widget_animators_list}
${awtk_platforms_list}
${third_agge_list}
${third_gpinyin_list}
${third_unibreak_list}
${third_nanovg_agg_list}
${third_nanovg_base_list}
)
#message(STATUS "INCLUDE_DIR_LIST = ${agg_list}")
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_SOURCE_DIR}/awtk/src
${CMAKE_SOURCE_DIR}/awtk/src/fscript_ext
${CMAKE_SOURCE_DIR}/awtk/src/ext_widgets
${CMAKE_SOURCE_DIR}/awtk/src/ext_widgets/vpage
${CMAKE_SOURCE_DIR}/awtk/3rd/agge
${CMAKE_SOURCE_DIR}/awtk/3rd/nanovg
${CMAKE_SOURCE_DIR}/awtk/3rd/nanovg/agge
${CMAKE_SOURCE_DIR}/awtk/3rd/nanovg/base
${CMAKE_SOURCE_DIR}/awtk/3rd/gpinyin/include
${CMAKE_SOURCE_DIR}/awtk/3rd/libunibreak
${CMAKE_SOURCE_DIR}/awtk/3rd
${CMAKE_SOURCE_DIR}/awtk/3rd/stb
${CMAKE_SOURCE_DIR}/awtk/3rd/sokol
${CMAKE_SOURCE_DIR}/awtk/src/platforms/pc
)
target_link_libraries(${PROJECT_NAME} pthread rt)
#!/usr/bin/python
import os
import glob
import copy
import shutil
import fnmatch
import platform
# XXX: make sure no no ascii chars in the path name.
AWTK_ROOT_DIR = '../awtk';
PORT_ROOT_DIR = os.getcwd();
DST_ROOT_DIR = './output';
VGCANVAS='NANOVG'
#VGCANVAS='CAIRO'
NANOVG_BACKEND='AGGE'
#NANOVG_BACKEND='AGG'
def joinPath(root, subdir):
return os.path.normpath(os.path.join(root, subdir))
def copyFile(src_root_dir, src, dst_root_dir, dst):
s = joinPath(src_root_dir, src)
d = joinPath(dst_root_dir, dst)

本文提供了一种使用CMake替代scons进行AWTK跨平台GUI库编译的方法,包括详细的CMakeLists.txt配置示例,以及用于整理源码目录的Python脚本,便于开发者进行交叉编译。
最低0.47元/天 解锁文章
268





