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

  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的时候,在控制台界面上会显示出如下文字:

[plain] view plain copy

  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

时间: 2024-12-22 14:48:59

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

j2ee项目无法编译文件到classes下

原因: WebRoot目录下xml文件classes文件是以前写的版本 src下面的xml文件和bin下面的classes是最近修改的版本. src下面的xml文件和bin下面的classes 不能更新到WebRoot目录下 说错了,MyEclipse应该把自动编译的class文件放到WEB-INF下的classess目录下,但是却在项目的根目录下建立了个bin目录,把class文件都放那里面了 解决方法: project->properties->java build path->so

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

[一]mac检查是否安装node.js nvm --version =>0.33.9 node -v =>v10.7.0 [二]安装vue-cli cnpm install --global vue-cli [三]创建一个vue项目.基于 # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project # 这里需要进行一些配置,默认回车即可 原文地址:https://www.cnblogs.com/shangxiaofei/p/9429512.htm

从VS项目工程文件到项目代码的编排

一个解决方案sln包含多个项目工程,每一个项目工程都会有一个vcxproj的工程文件,编译的时候,总是从项目文件所在的目录为当前目录,开始编译代码的.头文件的引入和lib文件的链接,都可以通过绝对路径和相对路径,这两种方式进行操作.如果是相对路径,肯定是从当前工程目录作为标准,然后采用.\这两种符号,进行相对路径的确定. 相对于将所有的代码放在一个目录,不如按照不同的模块将代码放在不同的文件夹中,例如 asio 网络库 util 实用库 restful 接口 为了能够正确的引入不同文件夹下的头文

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

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

iOS项目工程添加.a文件遇到的Dsymutil Error

将.a文件加入工程,很多教程讲的都是: 右键选择Add->Existing Files…,选择.a文件和相应的.h头文件.或者将这两个文件拖入XCode工程目录结构中,在弹出的界面中勾选Copy items into destination group's folder(if needed), 并确保Add To Targets勾选相应的target. 但实际上却没有那么顺利.添加过几次.a文件都遇到了麻烦,今天再次遇到—— ld: warning: directory not found fo

【Note2】用keil对工程编译时,工程中已经包含的文件会报错:cannot open source input file usb_conf.h No such file or directory

错误举例: ..\..\Libraries\STM32_USB-FS-Device_Driver\inc\usb_type.h(21): error:  #5: cannot open source input file "usb_conf.h": No such file or directory 这是因为没有设置 STM32 固件库的目录, 编译器就默认到 "Keil"根目录下的某某目录找去了.如果现在编译程序,会报错的 解决方法:引用固件库文件所在的目录需要在

C#winform项目添加引用编译文件

打开opencv(Emgu for windows)样例,发现有带引用图标的文件 以前还真没见过这种用法,研究了一下: 1.项目版本信息文件内容及添加: 通过修改项目目录下的csproj(c sharp project)文件添加项目版本信息 另一种写法: 2.密钥文件的添加: 方法一:通过修改项目属性添加 方法二:通过修改项目目录下的csproj(c sharp project)文件添加 C#winform项目添加引用编译文件,布布扣,bubuko.com

创建Pch预编译文件

在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件共享和访问.是一个预编译文件. 首先说一下pch的作用: 1.存放一些全局的宏(整个项目中都用得上的宏) 2.用来包含一些全部的头文件(整个项目中都用得上的头文件) 3.能自动打开或者关闭日志输出功能 虽然用了很久的Xcode6但是项目是xcode5之前创建好的,所以一开始并没有发现缺少了这个pch

问题处理:找不到Pch预编译文件?

提醒:Xcode6之后就不再自动创建Pch预编译文件 在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件共享和访问.是一个预编译文件. 首先说一下pch的作用: 1.存放一些全局的宏(整个项目中都用得上的宏) 2.用来包含一些全部的头文件(整个项目中都用得上的头文件) 3.能自动打开或者关闭日志输出功能 猜测原因: 虽然用了很久的Xcode6但是项