前面有一篇Say bye to CMake and Makefile我开始用自己编写的newlisp脚本替代CMake,今天对前面的进行改进。

改进部分是:

1. newlisp armory模块的引入和初始化 部分可以重用

2. 将头文件所在目录,cpp或者cc文件所在目录以及依赖库名称等 作为配置单独抽出来,可以根据不同的项目进行配置

现在看改过后的代码:

rebuild.lsp是主要执行脚本

#!/usr/bin/newlisp 

;; init
(load "/opt/armory_config.lsp")
(load "build_config.lsp") ;; clean view/*.cpp files generated from cppcms_tmpl_cc
(set 'view-dir "../codes/main/src/view")
(if (directory? view-dir)
(file:clean-folder view-dir)
(make-dir view-dir)) (set 'tmpl-dir "../codes/main/template") ;; generate .cc files in view folder
(load "tmpl.lsp")
(tmpl-to-cc tmpl-dir view-dir) ;; compile all c++ files to .o file in ./o folder
(load "g++.lsp")
(compile include-paths src-paths o-dir) ;; link all .o files
(dynamic-link o-dir bin-dir binary-name libs) (exit)

依赖的/opt/armory_config.lsp用来配置newlisp_armory模块:

(env "NEWLISP_ARMORY_HOME" "/home/dean/github/newlisp_armory")
(set 'armory-folder (env "NEWLISP_ARMORY_HOME"))
(println (append "newlisp armory home folder: " armory-folder))
(load (append armory-folder "/codes/file/file.lsp"))
(file:init)

现在有了一个新的build_config.lsp文件,用来专门做配置:

(set 'include-paths
(list "../codes/main/include"
"../codes/main/src/../../loki-0.1.7/include")) (set 'src-paths
(list "../codes/main/src"
"../codes/main/src/bean"
"../codes/main/src/controller"
"../codes/main/src/helper"
"../codes/main/src/module"
"../codes/main/src/service"
"../codes/main/src/view"
))
(set 'libs
(list "pthread"
"cppcms"
"mongoclient"
"booster"
"loki"
"cryptopp"
"boost_system"
"boost_thread"
"boost_filesystem"
)) (set 'o-dir "./o")
(set 'bin-dir "bin")
(set 'binary-name "sports_lottery_d")

上面配置了5项,不包含cppcms的部分,cppcms的tmpl文件编译还没有抽出来,仍然在rebuild.lsp脚本文件中。不过对于其他不用CppCMS的GCC编译来讲,直接删除即可。

g++.lsp文件不变。

;; @syntax (compile include-dirs src-dirs o-dir)
;; @parameter include-dir a list contains one or more relative or absolute include directories
;; @parameter src-dirs a list contains one or more relative or absolute src dirs
(define (compile include-dirs src-dirs o-dir)
(if (directory? o-dir)
(file:clean-folder o-dir)
(make-dir o-dir))
(set 'path1 "")
(dolist (path include-dirs)
(set 'path1 (append path1 "-I" path " "))) (set 'cmd-template (format "/usr/bin/c++ -g %s -Wall -o %s/" path1 o-dir)) (dolist (dir src-dirs)
(compile-dir dir cmd-template)
)
) ;; @syntax (compile-dir dir cmd-template)
;; @parameter dir one folder which contains many .cc or .cpp files
;; @parameter cmd-template the command template that has -g, -Wall and -I args
(define (compile-dir dir cmd-template)
(set 'file-list (directory dir "\\.cc$|\\.cpp$"))
(println "dir: " dir)
(dolist (cc-path file-list)
(set 'str (append cc-path ".o"))
(set 'cmd (append cmd-template str " -c " dir "/" cc-path))
(println cmd)
(exec cmd))
) ;; @syntax (dynamic-link o-dir bin-dir binary-name libs)
;; @parameter o-dir the direcotry includs all .o files
;; @parameter bin-dir the location of linked binary file
;; @libs the list of all dependencies
(define (dynamic-link o-dir bin-dir binary-name libs)
(if (directory? bin-dir)
(file:clean-folder bin-dir)
(make-dir bin-dir))
(set 'cmd "/usr/bin/c++ -g")
(set 'o-files (directory o-dir "\\.o"))
(dolist (o-file o-files)
(set 'cmd (append cmd " " (real-path o-dir) "/" o-file)))
(set 'cmd (append cmd " -o " bin-dir "/" binary-name " -rdynamic"))
(dolist (lib libs)
(set 'cmd (append cmd " -l" lib)))
(println cmd)
(exec cmd)
) ;; @syntax (static-link o-dir bin-dir binary-name libs)
;; @parameter o-dir the direcotry includs all .o files
;; @parameter bin-dir the location of linked binary file
;; @libs the list of all dependencies
(define (static-link o-dir bin-dir binary-name libs)
(if (directory? bin-dir)
(file:clean-folder bin-dir)
(make-dir bin-dir))
(set 'cmd "/usr/bin/c++ -g ")
(set 'o-files (directory o-dir "\\.o"))
(dolist (o-file o-files)
(set 'cmd (append cmd " " (real-path o-dir) "/" o-file)))
(set 'cmd (append cmd " -o " bin-dir "/" binary-name " -static-libgcc -static-libstdc++ -static -L/usr/lib/x86_64-linux-gnu"))
(dolist (lib libs)
(set 'cmd (append cmd " -l" lib))
(println cmd))
(exec cmd)
)

tmpl.lsp文件内容也不变:

(define (get-extension name)
(first (regex "[^.]*$" name))
) ;; @syntax (remove-extension name)
;; @return file name without extension
;; @note remove extension name e.g a.b .b is extension, it will be removed
(define (remove-extension name)
((regex "(.*)\\.(.*)$" name) 3)
) ;; @syntax (tmpl-to-cc)
;; @note find all tmpl files in tmpl-folder, translate them into *.cc files
(define (tmpl-to-cc tmpl-folder cc-folder)
(set 'tmpl-files (directory tmpl-folder "\\.tmpl"))
(set 'cmd-tmpl (append "cppcms_tmpl_cc " tmpl-folder "/%s -o " cc-folder "/%s.cc"))
(dolist (tmpl-file tmpl-files)
(set 'cmd (format cmd-tmpl tmpl-file (remove-extension tmpl-file)))
(println cmd)
(exec cmd)
)
)

改进的newlisp编译脚本,只需要配置的更多相关文章

  1. 【转】linux 编译安装nginx,配置自启动脚本

    linux 编译安装nginx,配置自启动脚本 本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装ng ...

  2. linux 编译安装nginx,配置自启动脚本

    本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装nginx,记录下安装过程: 参照这篇文章:Linu ...

  3. 从编译安装Keepalived 到 配置 负载均衡(LVS-DR)

    最近在研究服务器高可用集群 (HA)…… Keepalived 是用C写的软路由.提供负载均衡与高可用特性. 负载均衡利用IPVS技术 高可用通过VRRP协议实现 更难能的贵的是,一直到最近还在更新 ...

  4. Gradle Android最新自动化编译脚本教程

    转自:http://blog.csdn.net/changemyself/article/details/39927381 一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主 ...

  5. SCons - 简单而强大的项目编译脚本

    N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...

  6. Android系统编译脚本理解

    android源码编译步骤: 1. repo sync 代码(下载代码) 2.start branch(用哪个分支,git相关) 3. 到根目录(android目录) $cd android/ 4. ...

  7. FFmpeg示例程序合集-批量编译脚本

    此前做了一系列有关FFmpeg的示例程序,组成了<最简单的FFmpeg示例程序合集>,其中包含了如下项目:simplest ffmpeg player:                   ...

  8. Powershell极速教程-如何在三分钟内编写项目编译脚本

    分析及思路 来看一下项目目录结构 炒鸡正常的三板斧src+docs+tests.咦,怎么会多出一个build的文件夹呢,这就是我们今天要研究的目录.今天我会带着大家在五分钟之内编写一个极简的编译脚本. ...

  9. Gradle Android它自己的编译脚本教程的最新举措(提供demo源代码)

    一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自己主动化构建工具. 上面这句话我认为写得非常官方,大家仅仅需知道Gradle能够用来an ...

随机推荐

  1. (3)选择元素——(9)为交替的列加样式(Styling alternate rows)

    Two very useful custom selectors in the jQuery library are :oddand :even. Let's take a look at how w ...

  2. 1034 - Navigation

    Global Positioning System (GPS) is a navigation system based on a set of satellites orbiting approxi ...

  3. hexo博客的优化与配置——加入统计代码

    今天看着csdn博客的訪客数,就想给hexo博客也加入统计訪客的插件,上次折腾了个pacman主题,中间自带的是goole的统计,easy被墙,所以就想换一个统计工具,看了好多人用的都是cnzz的站长 ...

  4. Linux驱动设备中的并发控制

    一.基本概念 二.中断屏蔽 三.原子操作 四.自旋锁 五.信号量 六.互斥体 七.自旋锁与信号量的比较 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使 ...

  5. linux 常用find命令

    1.查找当前目录下以test开头的所有文件-会进入子目录中去查找 [root@rusky hgfs]# find -name test* 2.查找当前目录下名为test.txt的文件-会进入子目录中去 ...

  6. NS2仿真:使用NS仿真软件模拟简单网络模型

    NS2仿真实验报告1 实验名称:使用NS仿真软件模拟简单网络模型 实验日期:2015年3月2日~2015年3月7日 实验报告日期:2015年3月8日 一.实验环境(网络平台,操作系统,网络拓扑图) 运 ...

  7. 图形绘制 Canvas Paint Path 详解

    图形绘制简介        Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...

  8. mysql 在windows下的安装,开发基础与要点

    1:安装(windows下) 官网下载.msi文件 运行安装时只需要安装server就行了 在环境变量中配置到bin目录:e.g:C:\programFile\...mysql\bin 完成后进入wi ...

  9. 3.Android Studio系列教程3——快捷键

    原文链接:http://stormzhang.com/devtools/2014/12/09/android-studio-tutorial3/   一.更新Android Studio 项目根目录的 ...

  10. C#Graphics画图

    public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { G ...