Closed wpchom closed 2 years ago
-- 取cachedir与installdir的相对路径,即下载的源码位置 local srcpath = path.relative(".", package:installdir()) -- 不做cachedir到installdir的copy,添加原始include路径 package:add("includedirs", path.join(srcpath, "Drivers", "CMSIS", "Device", "ST", "STM32F4xx", "Include")) package:add("includedirs", path.join(srcpath, "Drivers", "STM32F4xx_HAL_Driver", "Inc"))
cachedir 是会被清的,直接指向过去,有可能过段时间 你就编译链接不过了。。
package("stm32cube_f4")默认下载package:cachedir()在~/.xmake/cache下,默认安装package:installdir()在~/.xmake/package下,import("package/tools/xmake.lua").install(package, configs)在package:cachedir()下执行xmake,生成后的产物(.a/.h)会被copy到package:installdir()下的lib/include;但是对于实际项目里projA/projB共同依赖package("stm32cube_f4"),但其配置文件(stm32f4xx_hal_conf.h)不同,生成的.a不能混用,尽管plat/arch都相同。
不过的 configs ,会生成不同的 buildhash 子目录,互不冲突,是可以共用的。。
需要生成不同的 stm32f4xx_hal_conf.h,那就加个 config 一一对应不同的配置项。。
参考相同包的,不同子配置共用,有demo
通过 ~xxx
标识为不同包副本,用 alias 引用
为了分离不同项目生成的.a,将add_requireconfs("*", {external = false, configs = {installdir = path.join(os.projectdir(), "build")}})将installdir调整至各自projX的build目录下,同时buildir也调整至package:installdir()中;因为引入给package的配置文件(stm32f4xx_hal_conf.h)、芯片宏定义与proj强相关,将所有编译的中间产物(.o/.d)和最终产物(.a)都放在projX/build下相对合理。
尽量不要乱搞,按 xmake 规范走。
按上面这个做法似乎不太符合xmake的设计理念,add_requires("stm32cube_f4", {configs ={...}})中的configs发生改变时,如果installdir内的.a存在,不会发生重编译
加 ~label
是否有理想情况:源码包引入(无侵入修改),单次下载,多项目(传递配置)复用,在执行构建的项目的buildir下构建生成,include到源码路径,link到buildir下的.a?
没必要这么搞,原本就是用 cachedir 保证源码单次下载,多次编译安装不同 configs 集成
因为package希望限制侵入式修改,也减少headerfiles的复制,package:add("includedirs", "...")时能直接include在源码路径,但这类接口好像没法识别绝对路径,都会用相对路径来引入?
只需要配置相对路径,每个 package installdir 就是一个相对独立沙盒环境,不要指向到其他地方,否则容易出问题
对于headeronly的package("cmsis"),没有port/xmake.lua,被package("stm32cube_f4")依赖(能正常include到cmsis),但主project仅add_requires("stm32cube_f4")的话,无法include到依赖("stm32cube_f4")的依赖("cmsis"),package:add("includedirs", ...)的选项好像是没法继承依赖?
可以继承,我这 ok
你在什么场景下需要该功能?
在通用平台(如Windows/Linux,x86/arm)下,xmake的包管理还是很舒服的;在非通用平台(cortex-m)下,需要源码引入差异化构建就有点别扭。
一个真实项目情况:
参考xrepo/cross/下的一些package写法,项目相关的package文件如下:
package/s/stm32cube_f4/xmake.lua
package/s/stm32cube_f4/port/xmake.lua
option("lldrv") set_showmenu(true) set_default(false) option_end()
add_requires("cmsis") target("stm32f4xx_hal_driver") set_kind("$(kind)")
target_end()
target("stm32cube_f4") set_kind("phony")
target_end()
package("cmsis") set_description("CMSIS Version 5")
package_end()