改进的newlisp编译脚本,只需要配置

2023-11-27 01:32

本文主要是介绍改进的newlisp编译脚本,只需要配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面有一篇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编译脚本,只需要配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/426706

相关文章

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

在Spring中配置Quartz的三种方式

《在Spring中配置Quartz的三种方式》SpringQuartz是一个任务调度框架,它允许我们定期执行特定的任务,在Spring中,我们可以通过多种方式来配置Quartz,包括使用​​@Sche... 目录介绍使用 ​​@Scheduled​​ 注解XML 配置Java 配置1. 创建Quartz配置

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

Kibana的安装和配置全过程

《Kibana的安装和配置全过程》Kibana是一个开源的数据分析和可视化平台,它与Elasticsearch紧密集成,提供了一个直观的Web界面,使您可以快速地搜索、分析和可视化数据,在本文中,我们... 目录Kibana的安装和配置1.安装Java运行环境2.下载Kibana3.解压缩Kibana4.配

tomcat在nginx中的配置方式

《tomcat在nginx中的配置方式》文章介绍了如何在Linux系统上安装和配置Tomcat,并通过Nginx进行代理,首先,下载并解压Tomcat压缩包,然后启动Tomcat并查看日志,接着,配置... 目录一、下载安装tomcat二、启动tomcat三、配置nginx总结提示:文章写完后,目录可以自动