• nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)


    恩。。nixyx确实算不上是一个构建系统。

    所谓构建系统,比如GNU的Autotools,那是一套很完整的构建体系,包括了程序的配置,编译和安装三大部分。

    类似的软件还有:google的gyp腾讯的Blade等。
    它们最大的好处在于,可以不考虑平台之间的差别,使用统一的配置文件和命令,做到跨平台部署。

    它们往往还支持很多很高端的功能,比如集成自动测试,代码检查(Blade)。。

    可是我暂时不需要这些复杂的功能。
    我正在编写的nixy库是一个跨平台/编译器的C++库,它非常小,没必要使用大型的(或者说有学习成本和使用成本的)构建系统。目前的所谓构建,也只是编译一下测试代码。
    而跨平台的编译确实又是一个很搞人的事情,windows下最起码得支持各种Visual C++版本,还有mingw也得考虑进来;Linux下相对单纯些,写一个makefile基本一劳永逸了。。但arm下的linux,makefile又会有些区别。
    这么多的项目工程文件(包括各种不同的makefile),随着项目的长大管理复杂度直线上升=.=

    我的需求:
    一个可以根据配置文件(js,简单易用,基本无学习成本)生成各种平台/编译器下的项目工程/编译文件的工具。

    所以就花了两天折腾出来了一个很小的“构建系统”。。其实不算吧,应该叫“项目工程/编译文件生成器”才对。

    1. nixyx解决的问题

    • 根据脚本文件自动生成项目工程/编译文件。目前支持:linux/win下的makefile、Visual Studio的sln(Format Version 9.00 以上)
    • 脚本可以使用ini和js,其中ini不支持条件判断和循环(当然了,这货只是个ini),仅用于最简单的情况

    恩,就这些了,我暂时只需要它帮我生成项目文件。

    2. nixyx的使用方法

    先来看一段简单的js脚本,文件名为build.js,放在nixyx目录下即可:
    [javascript] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /* 
    2.     Solution settings 
    3. */  
    4.    
    5. Solution.name           = "nixy"  
    6. Solution.project_path   = "../"  
    7. Solution.include_path   = "'nixycore'"  
    8. Solution.tmp_path       = "!tmp/$(Configuration)/$(CC)"  
    9. Solution.out_path       = "!bin/$(Configuration)/$(CC)"  
    10.    
    11. if (Make.PLAT == "win")  
    12. {  
    13.     Solution.CFLAGS = "-pipe -frtti -Wall -Wextra -fexceptions -march=nocona"  
    14.     Solution.LFLAGS = "-Wl,-s -Wl,-subsystem,console -mthreads"  
    15. }  
    16. else  
    17. {  
    18.     Solution.CFLAGS = "-pipe -frtti -Wall -Wextra -fexceptions -march=nocona"  
    19.     Solution.LFLAGS = "-Wl,-s"  
    20. }  
    21.    
    22. /* 
    23.     Projects settings 
    24. */  
    25.    
    26. /* project nixycore */  
    27. {  
    28.     var prj = Projects.create("nixycore")  
    29.     prj.type = "lib"  
    30.     prj.heads = "  
    31.         'nixycore/al/typemanip/nx_friend_class.hxx'   
    32.         /* 中间省略若干行 */  
    33.         'nixycore/thread/threadmodel.h'   
    34.         'nixycore/thread/thread.h'"  
    35.     if (Make.PLAT == "win")  
    36.     {  
    37.         prj.sources =  
    38.         'nixycore/al/thread/tlsptr_win.cpp'  
    39.     }  
    40. }  
    41. /* project test */  
    42. {  
    43.     var prj = Projects.create("codecheck")  
    44.     prj.type = "console"  
    45.     if (Make.PLAT == "linux")  
    46.     {  
    47.         prj.libs = "-lpthread -lrt"  
    48.     }  
    49.     else if (Make.PLAT == "win")  
    50.     {  
    51.         prj.depends = 'nixycore'  
    52.     }  
    53.     prj.heads = "  
    54.         'codecheck/test_head.h'   
    55.         'codecheck/test_preprocessor.h'   
    56.         'codecheck/test_typemanip.h'   
    57.         'codecheck/test_algorithm.h'   
    58.         'codecheck/test_utility.h'   
    59.         'codecheck/test_time.h'   
    60.         'codecheck/test_delegate.h'   
    61.         'codecheck/test_finalizer.h'   
    62.         'codecheck/test_thread.h'   
    63.         'codecheck/test_memory.h'"  
    64.     prj.sources = "  
    65.         'codecheck/main.cpp'   
    66.         'codecheck/dummy.cpp'"  
    67. }  
     
    上面这个脚本就是目前我构建时使用的脚本。
     
    Solution对象 是整个工程对象;
    Projects对象 是工程下的项目集合;
    $(Configuration) 会根据编译的选择自动替换为debug或release;
    $(CC) 表示当前编译器的名字,在nixyx运行时会列出当前选择的编译器。
     
    脚本功能基本就是上面这些,当运行nixyx的时候,在控制台界面上会显示出如下文字:
    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. Script File: build.js  
    2. Target Plat: win  
    3. Target CC: vc11  
    4.   
    5. OK to start it ? (y/n/f/p/c)  

    y/n/f/p/c 的含义是:
    y:yes,开始生成相关平台的工程文件
    n:no,以空格为分隔,一次性输入所有可选配置(配置脚本的完整文件路径 操作系统 编译器)
    f:file,键入f之后nixyx会提示重新输入文件的完整路径(当然,支持相对路径的文件)
    p:platform,即目标平台。目前支持win(包括win32/win64/wince)和linux
    c:compiler,即编译器。目前支持的有:vc8-11(即vs2005-2012)、gcc
     
    以上,功能很简单。

    3. nixyx下载和编译

    exe:http://nixy.googlecode.com/svn/trunk/build/
    如果想要编译的话,代码在这里:http://nixy.googlecode.com/svn/trunk/nixyx/
    因为目前nixyx是使用Qt 5.1.1编写的,所以编译的话需要先安装Qt。。
    这个稍微有点麻烦,不过Qt本身就是跨平台的,保证了nixyx可以在多个平台上编译。


    更多内容请访问:http://darkc.at

     
    http://blog.csdn.net/markl22222/article/details/17040771
  • 相关阅读:
    jenkins构建完成后,执行的命令行的东西也会自动结束的解决办法
    解决ansible上传速度慢的问题
    uniq的坑坑
    tomcat问题
    R语言入门:对于boxplot()箱型图的直观理解
    R语言入门:条形图barplot()的绘制
    R语言入门:数据框的创建和访问
    Python当中的命令行参数sys.argv[]的使用方法
    R语言清除单个变量和全部变量
    linux下添加环境变量
  • 原文地址:https://www.cnblogs.com/findumars/p/6376063.html
Copyright © 2020-2023  润新知