# XmakeEnv **Repository Path**: David-EmDevTools/XmakeEnv ## Basic Information - **Project Name**: XmakeEnv - **Description**: XmakeEnv是基于xmake工具构建Linux应用程序、RT-Thread动态模块和RT-Smart用户态应用程序和动态库文件,包含有相关xmake脚本、链接脚本和相关架构RT-Smart的sdk静态库。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-12 - **Last Updated**: 2024-07-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # XmakeEnv ## 一、简介 XmakeEnv是基于xmake工具构建Linux应用程序、RT-Thread动态模块和RT-Smart用户态应用程序和动态库文件,包含有相关xmake脚本、链接脚本和相关架构RT-Smart的sdk静态库。 ## 二、系统和工具介绍 ### 1. Linux Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年第一次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、oracle linux等。 ### 2. RT-Thread RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。详细信息请见 [RT-Thread 简介]([RT-Thread 简介](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README)) ### 3. RT-Thread-Smart RT-Thread Smart(以下简称 Smart) 是基于 RT-Thread 操作系统上的混合操作系统,简称为 rt-smart,它把应用从内核中独立出来,形成独立的用户态应用程序,并具备独立的地址空间(32 位系统上是 4G 的独立地址空间)。详细信息请见 [smart简介](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-smart/introduction/rt-smart-intro/rt-smart-intro) ### 4. xmake xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。详细信息请见 [介绍 - xmake](https://xmake.io/#/zh-cn/about/introduction) ## 三、工具使用 设置交叉编译前需要提前配置交叉编译工具到环境变量 ### 1. 编译Linux应用程序 ```shell # 进入相关应用程序 $ cd app # 配置相关架构交叉编译工具(arm架构为例) $ xmake f -p cross -a arm --toolchain=arm-linux-gnueabihf # 编译(-v选项可以查看交叉编译工具是否设置成功,可不添加-v选项) $ xmake -v -j8 checking for arm-none-linux-gnueabihf-gcc ... ok checking for the c compiler (cc) ... arm-none-linux-gnueabihf-gcc checking for arm-none-linux-gnueabihf-gcc ... ok checking for flags (-fPIC) ... ok checking for arm-none-linux-gnueabihf-g++ ... ok checking for the c++ compiler (cxx) ... arm-none-linux-gnueabihf-g++ ... [100%]: build ok, spent 2.656s # 将程序安装到xxx目录下 $ xmake i --installdir=xxx ``` xmake.lua脚本格式: ```lua add_rules("mode.debug", "mode.release") -- 添加需要的依赖包xxx -- add_requires("xxx") target("xxx") do -- 生成相关map文件 -- add_rules("target.map") -- 添加头文件搜索目录 add_includedirs("./") -- 编译c源文件 add_files("*.c") -- 编译cpp源文件 add_files("*.cpp") -- 添加xxx包依赖 -- add_packages("xxx") end target_end() ``` ### 2. 编译RT-Thread动态模块 ```shell # 进入相关应用程序 $ cd app # 配置相关架构交叉编译工具(arm架构为例) $ xmake f -p cross -a arm --toolchain=arm-rtthread-none-eabi # 编译(-v选项可以查看交叉编译工具是否设置成功,可不添加-v选项) $ xmake -v -j8 checking for arm-none-eabi-gcc ... ok checking for the c compiler (cc) ... arm-none-eabi-gcc checking for arm-none-eabi-gcc ... ok checking for flags (-fPIC) ... ok checking for flags (-O0) ... ok checking for arm-none-eabi-g++ ... ok checking for the c++ compiler (cxx) ... arm-none-eabi-g++ ... [100%]: build ok, spent 2.656s # 将程序安装到xxx目录下 $ xmake i --installdir=xxx ``` xmake.lua脚本格式: ```lua -- 动态模块只支持debug模式,release模式会导致崩溃 add_rules("mode.debug") -- 添加需要的依赖包xxx -- add_requires("xxx") target("xxx") do -- 编译RT-Thread动态模块,生成动态模块 add_rules("rtthread.mo") -- 使用add_rules("rtthread.mo")时,使用set_extension(".mo"),可以忽略 -- set_extension(".mo") -- 生成相关map文件 -- add_rules("target.map") -- 添加头文件搜索目录 add_includedirs("./") -- 编译c源文件 add_files("*.c") -- 编译cpp源文件 add_files("*.cpp") -- 添加xxx包依赖 -- add_packages("xxx") end target_end() ``` ### 3. 编译RT-Smart应用程序 ```shell # 进入相关应用程序 $ cd app # 配置相关架构交叉编译工具(arm架构为例) $ xmake f -p cross -a arm --toolchain=arm-smart-musleabi # 编译(-v选项可以查看交叉编译工具是否设置成功,可不添加-v选项) $ xmake -v -j8 checking for arm-linux-musleabi-gcc ... ok checking for the c compiler (cc) ... arm-linux-musleabi-gcc checking for arm-linux-musleabi-gcc ... ok checking for flags (-fPIC) ... ok checking for flags (-O3) ... ok checking for flags (-DNDEBUG) ... ok checking for arm-linux-musleabi-g++ ... ok checking for the c++ compiler (cxx) ... arm-linux-musleabi-g++ ... [100%]: build ok, spent 2.656s # 将程序安装到xxx目录下 $ xmake i --installdir=xxx ``` xmake.lua脚本格式: ```lua add_rules("mode.debug", "mode.release") -- 添加需要的依赖包xxx -- add_requires("xxx") target("xxx") do -- 编译RT-Smart应用程序,链接脚本为link.lds,链接RT-Thread的sdk静态库,编译选项增加-lthread等相关选项,生成可执行程序 add_rules("rtsmart.elf") -- 使用add_rules("rtsmart.elf")时,使用set_extension(".elf"),可以忽略 set_extension(".elf") -- 编译RT-Smart动态库文件,链接脚本为link.so.lds,链接RT-Thread的sdk静态库,编译选项增加-lthread等相关选项,生成动态库 -- add_rules("rtsmart.so") -- 使用add_rules("rtsmart.so")时,使用set_extension(".so"),可以忽略 -- set_extension(".so") -- 生成相关map文件 -- add_rules("target.map") -- 添加头文件搜索目录 add_includedirs("./") -- 编译c源文件 add_files("*.c") -- 编译cpp源文件 add_files("*.cpp") -- 添加xxx包依赖 -- add_packages("xxx") end target_end() ``` ## 3. 组合模式 ```shell # 进入相关应用程序 $ cd app # 配置相关架构交叉编译工具(arm架构为例),配置目标系统为linux(需要结合特定的xmake.lua脚本格式,参考下面xmake.lua脚本格式) $ xmake f -p cross -a arm --target_os=linux # 配置相关架构交叉编译工具(arm架构为例),配置目标系统为rt-thread(需要结合特定的xmake.lua脚本格式,参考下面xmake.lua脚本格式) # $ xmake f -p cross -a arm --target_os=rt-thread # 配置相关架构交叉编译工具(arm架构为例),配置目标系统为rt-smart(需要结合特定的xmake.lua脚本格式,参考下面xmake.lua脚本格式)) # $ xmake f -p cross -a arm --target_os=rt-smart # 编译(-v选项可以查看交叉编译工具是否设置成功,可不添加-v选项) $ xmake -v -j8 checking for arm-none-linux-gnueabihf-gcc ... ok checking for the c compiler (cc) ... arm-none-linux-gnueabihf-gcc checking for arm-none-linux-gnueabihf-gcc ... ok checking for flags (-fPIC) ... ok checking for flags (-O3) ... ok checking for flags (-DNDEBUG) ... ok checking for arm-none-linux-gnueabihf-g++ ... ok checking for the c++ compiler (cxx) ... arm-none-linux-gnueabihf-g++ ... [100%]: build ok, spent 2.656s # 将程序安装到xxx目录下 $ xmake i --installdir=xxx ``` xmake.lua脚本格式: ```lua target("hello") do if is_config("target_os", "linux") then set_toolchains("arm-linux-gnueabihf") add_rules("mode.debug", "mode.release") elseif is_config("target_os", "rt-smart") then set_toolchains("arm-smart-musleabi") add_rules("mode.debug", "mode.release") add_rules("rtsmart.elf") set_extension(".elf") elseif is_config("target_os", "rt-thread") then set_toolchains("arm-rtthread-none-eabi") -- 动态模块只支持debug模式,release模式会导致崩溃 add_rules("mode.debug") add_rules("rtthread.mo") set_extension(".mo") end add_files("*.c") end target_end() ```