Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

期望platforms和rules可以從指定目錄尋找 #260

Closed
orzuk-lmj opened this issue Nov 16, 2018 · 19 comments
Closed

期望platforms和rules可以從指定目錄尋找 #260

orzuk-lmj opened this issue Nov 16, 2018 · 19 comments

Comments

@orzuk-lmj
Copy link
Contributor

orzuk-lmj commented Nov 16, 2018

類似於 add_moduledirs 的功能,讓多個專案可以共用同樣的模組。
客製特定的platforms和rules,如果可以明確指定專案外的資料夾,將會讓大型專案的切分和管理更方便。
另外,目前有 add_plugindirs 貌似應該適合使用在 task ,那麼 platforms 和 rules 也可以放在plugin嗎?

@waruqi
Copy link
Member

waruqi commented Nov 16, 2018

add_plugindirs 仅用于加载task,不过 task/rules 目前是支持 直接在工程xmake.lua 里面直接定义,所以通过 includes 接口在 xmake.lua里面包含进来就行了。。

而includes和add_plugindirs区别就是,includes指定单个或者多个插件xmake.lua,而add_plugindirs是指定整个插件目录,里面可以自动加载所有包含的插件。。

platforms 目前可以在 工程 .xmake/plaforms 以及 ~/.xmake/platforms下的也能被找到,不过是否也需要在工程xmake.lua中 直接支持,我还得考虑下。。

@orzuk-lmj
Copy link
Contributor Author

orzuk-lmj commented Nov 19, 2018

如果可以明確指定platforms目錄,將使得專案管理擁有非常大的便利性。這如同cmake可以明確指定要使用的toolchains一樣。

如果放在家目錄中~/.xmake/platforms (win10會放在C:\Users\UserName\AppData\Roaming\.xmake),不得不說用來作為臨時測試用途還算好用,但放在這裡就難以用版本控制軟體去維護它。硬要把platforms當作git目錄也不是不行,但就是不容易分割內容,且至少得維護多個git repository。

基於一些公司的合約協議 (例如sony ps4、微軟 xbox1、任天堂 switch),常常會有需要保密的輔助工具庫,它們需要被編譯,但在代碼發布的時候必須被隔離,且這些庫一旦數量多了,若個自都得維護自己的platform真的會顯得十分麻煩。

@waruqi
Copy link
Member

waruqi commented Nov 19, 2018

ok, 这个我可以想办法支持下。。

@waruqi waruqi added this to the v2.2.3 milestone Nov 19, 2018
@waruqi
Copy link
Member

waruqi commented Nov 20, 2018

近期打算先发个版本,当前版本主要还是以改进包管理为主,新特性挪到下个版本实现。。

@waruqi waruqi modified the milestones: v2.2.3, v2.2.4 Nov 20, 2018
@waruqi
Copy link
Member

waruqi commented Dec 4, 2018

关于平台自定义,如果不是特别复杂的需求,我更推荐用户直接在xmake.lua通过is_plat("xxx")和set_config来配置,set_config是可以设置一切xmake config中配置的参数默认值的,例如:

if is_plat("xxx") then
    set_config("cc", "xxx-xxx-gcc")
    set_config("sdk", "/xxx/xxx")
    add_defines("IS_PLAT_XXX")
end

然后运行配置:xmake f -p xxx 就行了,用户是可以传递自定义平台名的。。

或者我们也可以通过自定义选项来扩展平台:

option("myplat")
    set_default("xxx")
    set_showmenu(true)
    set_description("xxxxx")

if is_config("myplat", "xxx") then
    -- ..
end

然后运行配置:xmake f --myplat=xxx去扩展,当然也可以把这些平台相关处理,通过includes接口,分离到不同的平台子目录下去维护,保证xmake.lua整体清晰性。。

如果必须要在内置的平台上进行扩展,设置自定义平台文件,当然也是可以的,这块等我这边手头上其他特性的一些细节工作处理完后,会尝试开始支持下,可能还需要点时间,请耐性等待。。

@orzuk-lmj
Copy link
Contributor Author

orzuk-lmj commented Dec 5, 2018

-- 第一種方法:在私有  xmake.lua 中
if is_plat("windows") then
    set_config("vs_sdkver", "10.0.10586.0")

第二種方法:运行配置 xmake f --vs_sdkver=10.0.10586.0去扩展

關於上面的這兩種設置方法,我遇到了一些執行順序問題,例如說在platform/windows/check.lua第42行,這個位置如果想要取得 config.get("vs_sdkver") ,用上述兩種方法會有不一樣的結果,第一種方法取不到正確值,第二種才可以保證設置有效。

想請問有沒有方法,在xmake命令執行後腳本的大多數位置都能取得 set_config 設置的資料? 因為config.get() 在這種狀況下無法保證必定取得 XXX 的值。

@waruqi
Copy link
Member

waruqi commented Dec 5, 2018

关于set_config在 xmake.lua中的设置,目前实现上确实会存在这个问题 这个我之后改进下实现

@waruqi
Copy link
Member

waruqi commented Dec 6, 2018

set_config 我改进过了,你再更新下 https://github.com/tboox/xmake/releases/download/v2.2.3/xmake-v2.2.4-dev.exe 包试试,或者更新下dev分支代码。

关于set_platformdirs的设置,我后两天在尝试支持下。

@orzuk-lmj
Copy link
Contributor Author

orzuk-lmj commented Dec 7, 2018

更新了最新的 dev 分支,然後在使用 rule 的過程中,發現 config.set("vs_sdkver", "10.0.10586.0") 不起作用。vs project 產生過程讀取到的值是錯的。

-- FILE: common.lua
rule("common")
    on_load(function (target)
        import("core.project.config")
        if is_plat("windows") then
            -- win10 sdk version
            config.set("vs_sdkver", "10.0.10586.0")
        end
    end)


-- FILE: xmake.lua
includes("common.lua")
target("GTestApp")
    add_rules("common")
    ...
    ...

順便回報一下試驗結果,在xmake描述域底下,set_config 設置的值可以讓 vs project 產生過程中正確讀取,目前有問題的是設置在 rule 作用域的時候。

@waruqi
Copy link
Member

waruqi commented Dec 7, 2018

更新了最新的 dev 分支,然後在使用 rule 的過程中,發現 config.set("vs_sdkver", "10.0.10586.0") 不起作用。vs project 產生過程讀取到的值是錯的。

这个问题迁移到:#279

@orzuk-lmj
Copy link
Contributor Author

orzuk-lmj commented Dec 7, 2018

  • includes 有支援内置变量转义的可能性嗎?
    多專案管理的時候,因為編譯架構通常只由非常少數的人建構,只要目錄結構深度不同時,維護起來會變得很麻煩,不熟的小朋友們一不小心就會搞混。
includes("../../../extra/rules/common.lua")
includes("../../extra/rules/common.lua")
includes("../../../../../extra/rules/common.lua")

因此試驗了一個看似方便的方法,但暫時行不通,想請問運行細節。

-- 同深度的目錄,執行xmake前先用相同的 bat 腳本設置環境變量,然後傳入 --extra_dir=XXXXX
set XXXXX=../../extra
xmake f --extra_dir=%XXXXX%   .........

-- xmake.lua 在開始的地方用 option 來設定內置變量。
option("extra_dir")
    set_default("$(programdir)/../extra")
    set_showmenu(true)
option_end()

-- 維護的時候一律都從 $(extra_dir) 開始寫路徑
includes("$(extra_dir)/rules/common.lua")
-- 甚至直接使用外部環境變量
includes("$(env XXXXX)/rules/common.lua")

貌似在 function interpreter:api_builtin_includes(...) 這裡是不能直接用 vformat 轉譯。

  • 經過 includes 載入後的幾個描述域內容不起作用
set_warnings("all", "error")
set_languages("c99", "cxx11")

@waruqi
Copy link
Member

waruqi commented Dec 7, 2018

includes 有支援内置变量转义的可能性嗎?

这个跟当前issues无关,尽量新开个issues来维护,混在一起不好跟踪维护,我不太好持续跟进,经常会忘记掉。

#278

@waruqi
Copy link
Member

waruqi commented Dec 8, 2018

我想了下关于add_platformdirs的问题,目前暂时不打算提供这个接口,主要考虑到以下原因:

  1. 目前内部的platform描述和逻辑处理,太过于私有化,还没有开放对用户友好稳定的描述api,因此无法进行通用化设置,这个时候开放set_platformdirs去让用户定制自己的平台, 后续xmake版本更新后,如果私有api变动,很容易导致用户的自定义平台失效

  2. 目前xmake.lua中提供的is_plat, option,set_config等接口基本上已经可以满足大部分用的平台自定义处理,我们可以通过includes将自己的平台设置按目录隔离:

-- 相当于set_platformdirs,包含platforms目录下所有平台设置,例如:freebsd.lua, ...
includes("platforms/*.lua")

然后在平台目录下指定平台,例如freebsd.lua设置中,进行针对性的设置:

if is_plat("freebsd") then
    add_cflags("xxx")
    add_linkdirs("ssss")
    add_syslinks("ddd")
    set_config("cc", "arm-xxx-gcc")
end

如果要支持命令菜单中的平台参数提示,以及相关工具链环境的检测,可以通过定义option来实现:

option("freebsd")
    set_showmenu(true)
    set_description("The fressbsd platform")

    -- 这个freebsd平台选项内置的一些flags和其他设置
    add_links("pthread")
    add_defines("XXX")
    add_includedirs("/tmp/")

    -- 如果要检测或者设置编译工具,可以在option检测前,做一些自己的逻辑处理
    before_check(function (option)
        import("core.project.config")
        config.set("cc", "gcc")
    end)

-- 关联freebsd选项到test target,如果此平台选项被启用,相关的设置defines, flags都会应用到 test target
target("test")
    add_options("freebsd")

这个时候我们就可以在命令行上切换此平台了:

$ xmake f --freebsd=y

如果我们想更加通用点,可以在一个选项里面区分不同平台,进行相关设置:

option("myplat")
    set_showmenu(true)
    set_description("My platform")
    before_check(function (option)
        import("core.project.config")
        config.set("cc", "gcc")
        if option:value() == "freebsd" then
            option:add("syslinks", "pthread")
            option:add("defines", "XXX")
            option:add("includedirs", "/tmp")
        end
    end)

target("test")
    add_options("myplat")

然后:

$ xmake f --myplat=freebsd
  1. 关于内部platforms目录下的平台设置比较私有问题,我后期还会不断改进,实现更加通用化的设置,与在xmake.lua中的用户平台设置保持一致、通用(也许会将内部的platforms定义也完全使用类似option的方式进行规范化定义),所以platforms下的实现可能还会大改和重构,如果重构完,会直接暴露platform域接口来替代option,在xmake.lua中让用户自己定义

鉴于以上原因,我不打算提供add_platformdirs了,即使后期改进完,也只需要通过includes加载指定平台目录下的设置就行了。

@waruqi
Copy link
Member

waruqi commented Dec 8, 2018

像platform/plugin (task)这些都是描述域的定义,都是可以在xmake.lua中进行includes来加载的,所以像add_plugindirs我觉得必要性也不是很大,后面我也会打算逐步弃用,尽量复用通用的includes接口。

只有add_moduledirs是必须的,因为模块脚本不能再xmake.lua中的描述域中通过includes加载,只能在脚本域中通过import来加载。

@waruqi waruqi mentioned this issue Dec 8, 2018
15 tasks
@waruqi
Copy link
Member

waruqi commented Dec 8, 2018

对于platform的改进,还需要思考下,可能得花点时间,我开了个新issues用来跟进,#280

@waruqi
Copy link
Member

waruqi commented Dec 30, 2018

我已经支持通过add_platformdirs来添加用户平台目录去自定义编译platform了,你可以试更新下dev版本试试。

add_platformdirs("platforms")

platform我已经重构过了,提供更加开放通用的自定义扩展接口,目前还没写相关文档,可以直接参考源码目录下,内置platform的定义,进行参考,相关platform改进api支持,也可以看下:#280

需要注意的是,这次对platform的改动比较大,建议更新后,进行全平台测试验证下已有平台的构建是否受到影响(我这边初步测试没啥问题)。

@waruqi waruqi added the done label Dec 30, 2018
@orzuk-lmj
Copy link
Contributor Author

orzuk-lmj commented Jan 2, 2019

感謝更新,在數個平台測試下,當前已經存在的 xmake 腳本都可以正常運作。

  • win / mingw
  • linux (manjaro18 / centos7 / ubuntu18)
  • ndk (r15c / r18b) + (armv7a / arm64-v8a)

測試用的移植專案有:

  • nvidia physx4 (latest from git)
  • bullet (latest from git)
  • box2d (latest from git)
  • mbedtls 2.14
  • lz4 (latest from git)
  • tinyexr (latest from git)

私有平台的API測試,我回頭多做些完整測試再給回饋

@waruqi
Copy link
Member

waruqi commented Jan 2, 2019

收到,多谢

@waruqi
Copy link
Member

waruqi commented Jan 3, 2019

此处先close了,如果后续测试有问题,可新开issues或者reopen it

@waruqi waruqi closed this as completed Jan 3, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants