xmake中add_files的使用

2016-02-04 ruki 更多博文 » 博客 » GitHub »

xmake 模式匹配

原文链接 https://waruqi.github.io/2016/02/04/project-add-files.cn/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


如果你看了工程描述入门,那么是否觉得通过 add_files 添加源文件相当的方便?

目前它可以支持.c/.cpp/.s/.S/.m/.mm/.o/.obj/.a/.lib这些后缀的源代码和库文件,其中通配符表示匹配当前目录下文件,而*则匹配多级目录下的文件。

例如:

    add_files("src/test_*.c")
    add_files("src/xxx/**.cpp")
    add_files("src/asm/*.S", "src/objc/**/hello.m")

add_files的使用其实是相当灵活方便的,其匹配模式我借鉴了premake的风格,但是又对其进行了改善和增强。

使得不仅可以匹配文件,还有可以在添加文件同时,过滤排除指定模式的一批文件。。

例如:

    -- 递归添加src下的所有c文件,但是不包括src/impl/下的所有c文件
    add_files("src/**.c|impl/*.c")

    -- 添加src下的所有cpp文件,但是不包括src/test.cpp、src/hello.cpp以及src下所有带xx_前缀的cpp文件
    add_files("src/*.cpp|test.cpp|hello.cpp|xx_*.cpp")

其中分隔符之后的都是需要排除的文件,这些文件也同样支持匹配模式,并且可以同时添加多个过滤模式,只要中间用竖线分割就行了。。

注: 为了使得描述上更加的精简, 分隔符之后的过滤描述都是基于起一个模式:src/*.cpp 中 *之前的目录为基础的。

所以上面的例子后面过滤的都是在src下的文件,这个是要注意的。。

下面来看个TBOX的xmake.lua中add_files的例子:

    add_files("*.c") 
    add_files("asio/aioo.c") 
    add_files("asio/aiop.c") 
    add_files("math/**.c") 

    -- 这里过滤了libc/string/impl/**.c
    add_files("libc/**.c|string/impl/**.c") 

    add_files("utils/*.c|option.c") 
    add_files("prefix/**.c") 
    add_files("memory/**.c") 
    add_files("string/**.c") 

    -- 这里过滤了stream/**/charset.c,stream/**/zip.c,stream/**async_**.c,stream/transfer_pool.c
    add_files("stream/**.c|**/charset.c|**/zip.c|**async_**.c|transfer_pool.c") 

    -- 这里过滤了network/impl/ssl下的所有c文件
    add_files("network/**.c|impl/ssl/*.c") 

    add_files("algorithm/**.c") 
    add_files("container/**.c") 
    add_files("libm/libm.c") 
    add_files("libm/idivi8.c") 
    add_files("libm/ilog2i.c") 
    add_files("libm/isqrti.c") 
    add_files("libm/isqrti64.c") 
    add_files("libm/idivi8.c") 
    add_files("platform/*.c|aicp.c")

    -- 如果当前架构是arm,则添加arm相关的asm优化代码
    if is_arch("arm.*") then
        add_files("utils/impl/crc_arm.S")
    end

    -- 如果当前启用了charset模块,那么添加对应的c文件(这里的文件在上面是被过滤掉的)
    -- options接口后续会详解
    if options("charset") then 
        add_files("charset/**.c")
        add_files("stream/impl/filter/charset.c")
    end

添加文件的时候支持过滤一些文件的一个好处就是,可以为后续根据不同开关逻辑添加文件提供基础。

尤其需要提一下的是,xmake还支持直接添加.o/obj/.a/.lib的对象文件和库文件到目标中

这个跟add_links是有区别的,links是链接库中的代码,而这个是直接将静态库中的对象文件合并到目标程序中。。

这个的详细介绍,可参看高级特性之合并静态库