恩。。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目录下即可:
  1. /*
  2. Solution settings
  3. */
  4. Solution.name           = "nixy"
  5. Solution.project_path   = "../"
  6. Solution.include_path   = "'nixycore'"
  7. Solution.tmp_path       = "!tmp/$(Configuration)/$(CC)"
  8. Solution.out_path       = "!bin/$(Configuration)/$(CC)"
  9. if (Make.PLAT == "win")
  10. {
  11. Solution.CFLAGS = "-pipe -frtti -Wall -Wextra -fexceptions -march=nocona"
  12. Solution.LFLAGS = "-Wl,-s -Wl,-subsystem,console -mthreads"
  13. }
  14. else
  15. {
  16. Solution.CFLAGS = "-pipe -frtti -Wall -Wextra -fexceptions -march=nocona"
  17. Solution.LFLAGS = "-Wl,-s"
  18. }
  19. /*
  20. Projects settings
  21. */
  22. /* project nixycore */
  23. {
  24. var prj = Projects.create("nixycore")
  25. prj.type = "lib"
  26. prj.heads = "\
  27. 'nixycore/al/typemanip/nx_friend_class.hxx' \
  28. /* 中间省略若干行 */
  29. 'nixycore/thread/threadmodel.h' \
  30. 'nixycore/thread/thread.h'"
  31. if (Make.PLAT == "win")
  32. {
  33. prj.sources =
  34. 'nixycore/al/thread/tlsptr_win.cpp'
  35. }
  36. }
  37. /* project test */
  38. {
  39. var prj = Projects.create("codecheck")
  40. prj.type = "console"
  41. if (Make.PLAT == "linux")
  42. {
  43. prj.libs = "-lpthread -lrt"
  44. }
  45. else if (Make.PLAT == "win")
  46. {
  47. prj.depends = 'nixycore'
  48. }
  49. prj.heads = "\
  50. 'codecheck/test_head.h' \
  51. 'codecheck/test_preprocessor.h' \
  52. 'codecheck/test_typemanip.h' \
  53. 'codecheck/test_algorithm.h' \
  54. 'codecheck/test_utility.h' \
  55. 'codecheck/test_time.h' \
  56. 'codecheck/test_delegate.h' \
  57. 'codecheck/test_finalizer.h' \
  58. 'codecheck/test_thread.h' \
  59. 'codecheck/test_memory.h'"
  60. prj.sources = "\
  61. 'codecheck/main.cpp' \
  62. 'codecheck/dummy.cpp'"
  63. }
 

上面这个脚本就是目前我构建时使用的脚本。

 
Solution对象 是整个工程对象;
Projects对象 是工程下的项目集合;
$(Configuration) 会根据编译的选择自动替换为debug或release;
$(CC) 表示当前编译器的名字,在nixyx运行时会列出当前选择的编译器。
 
脚本功能基本就是上面这些,当运行nixyx的时候,在控制台界面上会显示出如下文字:
  1. Script File: build.js
  2. Target Plat: win
  3. Target CC: vc11
  4. 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

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

  1. 【vue】创建一个vue前端项目,编译,发布

    npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的合并和打包. vue-cli: 用户生成Vue工 ...

  2. 团队项目·冰球模拟器——cmake 自动化构建系统的配置文件的编写

    1 前言 考虑到命令行界面下编译程序并不如在 IDE 那么直观,再考虑到各位队友对 Linux 并不熟悉,如何大幅度地减轻整个项目的开发复杂度就是一个很重要的问题. 在 Linux 下有个很古老但很有 ...

  3. 《maven实战》笔记(2)----一个简单maven项目的搭建,测试和打包

    参照<maven实战>在本地创建对应的基本项目helloworld,在本地完成后项目结构如下: 可以看到maven项目的骨架:src/main/java(javaz主代码)src/test ...

  4. 如何快速搭建一个 Node.JS 项目并进入开发?

    了解:如何快速搭建一个项目并进入开发? 在此不概述 Node.JS 的历史以及发展过程. 因为之前接触过通过 Java 开发语言,所以明确地知道一个服务器所需的文件,以及一个服务器所需要的操作. 那么 ...

  5. 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)

    最近在使用之前自己编写的批处理给.NET Core项目打包时出问题了,发现之前的脚本根本不适用了,折腾了半天,总算解决了.因此在这里分享下经验,并且奉上整理好的脚本. Nuget包这里就不多介绍了,需 ...

  6. 【Android Developers Training】 1. 创建一个Android项目工程

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  8. 项目工程的包package与文件夹的关系

    项目工程的包package与文件夹的关系: 1. 包名与文件夹是分层关系,包名只是一个字符串而已,包名.对应的是层级的文件夹. 如,com.Immoc.Access包,只是一个字符串.但他对应的win ...

  9. 一个C++引用库的头文件预编译陷阱

    写在前面 老胡最近在工作中,有个场景需要使用一个第三方库,引用头文件,链接库,编译运行,一切都很正常,但是接下来就遇到了一个很诡异的问题,调用该库的中的一个对象方法为对象修改属性的时候,会影响到对象的 ...

随机推荐

  1. 【Django入坑之路】Form组件

    1:From组件的简单使用 1创建From: #导入模块 from django import forms from django.forms import fields, widgets # 导入自 ...

  2. 在oracle中操作数据——使用特点的格式插入日期 sql函数的使用——日期函数

    日期函数用于处理date类型的数据,默认情况下的日期格式是dd-mm-yy即12-7月-78 (1)sysdate:该函数返回系统时间 (2)add_months(d,n) (3)last_day(d ...

  3. C/S和B/S交互 2016-03-19 11:27 1275人阅读 评论(30) 收藏

    最近一直在做C/S的项目,每天都超忙,抽个时间写篇博客,之前一直做C/S项目就是各种窗体,各种控件,拖来拖去,然后点进去写方法,做BS的时候呢,因为一直使用的是mvc,所以就是经常手写代码,或者拖引用 ...

  4. HDU_2035:人见人爱A^B

    Problem Description 求A^B的最后三位数表示的整数. 说明:A^B的含义是“A的B次方”   Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1< ...

  5. android 数据存储----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...

  6. Java练习 SDUT-1188_各位数字之和排序

    C语言实验--各位数字之和排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定n个正整数,根据各位数字之和从小到大 ...

  7. Flask学习之三 web表单

    本部分Miguel Grinberg教程的翻译地址:http://www.pythondoc.com/flask-mega-tutorial/webforms.html 开源中国的:http://ww ...

  8. HZOJ 模板(ac)

    调了一天,恶心死我了……作者的题解水的一b…… 测试点1-6: 暴力修改查询即可,期望得分30. 测试点7-14: k=1e5,相当于没有限制,那么对于树上每个点建权值线段树,线段树合并即可. 期望的 ...

  9. Getting started with the basics of programming exercises_5

    1.编写函数,把由十六进制数字组成的字符串转换为对应的整型值 编写函数htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值.字符串中允许包含的数字包括:0~9 ...

  10. JAVA之NIO按行读写大文件,完美解决中文乱码问题

    ;//一次读取的字节长度 File fin = new File("D:\\test\\20160622_627975.txt");//读取的文件 File fout = new  ...