热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java自动生成js文件_自动生成Makefile文件

对于较大项目来说,手工编写Makefile文件非常困难,一是Makefile文件的结构复杂,二是Makefile文件常常会受到开发环境的限
对于较大项目来说,手工编写Makefile文件非常困难,一是Makefile文件的结构复杂,二是Makefile文件常常会受到开发环境的限制,只要环境参数不同或者更改了路径,就有可能需要修改该文件以适应环境的变化。Autotools是一个系列工具,它可以自动生成Makefile文件,对较大项目的开发提供了有力的支持。Autotools主要包含以下工具:autoscan: 在自动生成Makefile过程中,需要使用该工具生成configure.scan文件,对该文件进行必要的修改,比如加一些需要的信息或修改一些信息为下面完成自动生成Makefile做准备。然后改名为configure.ac或者configure.in。aclocal:这是一个perl脚本程序,通过扫描configure.ac文件(或configure.in)产生aclocal.m4文件。aclocal.m4文件的内容主要是本地定义的宏。autoconf:  一个shell脚本工具,用来自动配置软件源代码以适应多种类似POSIX的系统。configure.in是autoconf的脚本配置文件,它的原型文件是configure.scan,由autoscan生成。autoheader:  生成config.h.in文件。该工具通常从acconfig.h文件中复制用户附加的符号定义。automake:   从脚本配置文件Makefile.am自动生成Makefile.in的工具,configure程序使用Makefile.in生成Makefilelibtool: 方便生成各种程序库的工具图1是生成Makefile文件的流程图。下面按图1 所示步骤举例说明Makefile文件的自动产生过程。5fd190624a1e8c8bd2cbf8fa5a89635e.png1. 项目说明

首先建立一个目录ts,用来存放项目文件。在ts下建立一个src目录,一般来说源代码都放在src中(这是一个不成文的规定),在src目录下编写3个源程序,整体结构如下:

|-|-teacher.c|-student.c|-ts.h

这三个源程序代码如下:

// ts.h#ifndef __STU__#define __STU__void student(void);#endif

#include #include #ifdef HAVE_CONFIG_H#include #endifint main(void){ printf("Teacher: I'm Mr. Bobo.\n"); printf("Teacher: Please tell me your names!\n"); student();   #ifdef HELLO printf("Teacher: Hey Taotao, long time no see.\n"); #endif}

// student.c#include #ifdef HAVE_CONFIG_H#include #endifvoid student(void){    #ifdef HELLO printf("Student: Hello, Mr. Bobo.\n"); #endif printf("Student: My name is Taotao.\n");}

功能:

1)Bobo老师点名。

2)如果定义了HELLO,学生会向老师问好,然后报出自己的名字。Bobo老师也会向学生问好。

3)如果没有定义HELLO,学生仅报出自己的名字,Bobo老师点名结束。

显然程序编译运行的结果与HELLO这个宏是否定义有关,我们只要在编译前决定要不要定义它,就能实现不同的效果。

注:如果config.h存在的话,编译时Makefile会把宏HAVE_CONFIG_H传给编译器,如果没有定义HAVE_CONFIG_H的话,编译时不应该把config.h 包含进去。

2. 自动生成Makefile过程

首先建立一个目录ts,用来存放项目文件。在ts下建立一个src目录,一般来说源代码都放在src中(这是一个不成文的规定),在src目录下编写3个源程序,整体结构如下:

第一步:确认系统是否安装Autotools工具。

如果没有安装那就先安装,本文在CentOS 7环境下完成。检查autotools工具是否安装可以使用which命令。

6bfd8f7e9344e6053c04e6feecd5663d.png

本机没有安装autotools工具,现在使用命令yum -y install  autoconf  automake安装,如下图所示。

02922644ed14ab8201f442a4c6fdb59c.png

第二步:生成configure.in文件。

生成configure.in文件的方法有两个,一个是自己从零开始编写,二是用autoscan产生。在ts目录下执行autoscan后会生成configure.scan文件,其中包含了一些模板内容,使用时只要把名字改成configure.in就可以。

9b9054dbe0cb5e0831930430d667179d.png

    autoscan 还会产生一个 autoscan.log 档案以记录 autoscan 的扫瞄过程。这个档案可以放心地删除。

修改configure.in文件,内容如下。

b7a89ac112cbc6051ced3d8bd43de923.png

图中划线的行是修改或增加的行。

AC_PREREQ(2.69) 确保使用的是足够新的Autoconf版本。如果用于创建configure的Autoconf的版本比version 要早,就在标准错误输出打印一条错误消息并不会创建configure。

AC_INIT 定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址。 

AC_CONFIG_SRCDIR用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。

AC_CONFIG_HEADER用于生成config.h文件,以便autoheader使用 。

AC_ARG_ENABLE定义一个命令行选项,格式是:

AC_ARG_ENABLE (feature, 

            help-string

            [, action-if-given

            [, action-if-not-given]])

例,如果定义选项--enble-hello, AC_ARG_ENABLE中的参数分别为:feature为hello;提示信息help-string可以为[ --enable-hello Hello is present];action-if-given为空,即有该选项时enable_hello取默认值,即yes;action-if-not-given为enable_hello=no,即无该选项时enable_hello的值为no。

AC_DEFINE:定义宏。

AM_INIT_AUTOMAKE初始化automake。传到这个宏里的参数是要编译的应用程序的名称和版本号。

AC_OUTPUT: 设置configure所要产生的文件,若是Makefile,configure 便会把它检查出来的结果带入Makefile.in文件后产生合适的Makefile。

注意:configure.in中使用的宏有两种,一种是以AC开头,表示由autoconf 提供,另一种是以AM开头,代表由automake提供。 

第三步:运行aclocal。

在ts录下运行aclocal,将会生成aclocal.m4文件和autom4te.cache目录。

2c255cc1ffd5b36484fb7cef59b3407c.png

第四步:编写acconfig.h在configure.in中使用到的宏(Macro),都应该在这个文件声明,一般用#undef来声明。acconfig.h源程序如下:

#undef HELLO即未定义HELLO第五步:运行autoheaderautoheader会根据configure.in、acconfig.h生成config.h.in文件。7d0cbe0db8d96b66d4ed57f2ce3822cc.png第六步:编写Makefile.am一般来说,在顶级目录和各子目录都应有一个Makefile.am。 本例内容为:

b161f26c6e844496490146a4cf4ef69d.png

第一行是告诉automake不要检测目录中是否存在AUTHORS、README等文件。第二行是告诉automake处理src这个子目录。 automake提供了三种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。src目录下的Makefile.am文件内容为:

ea71c789e6bc80c11f3609a10c437b71.png

第一行作用同前。第二行是目标执行程序的名称。第三行是生成ts这个执行文件所需的源程序和头文件名称。第七步:运行automake接着执行automake,在命令行下输入automake -a自动执行。第八步:运行autoconf执行autoconf将会生成最终的configure。 

4c31643fa4945f6b8c901a5e653ebeeb.png

3. 测试

(1) 无选项--enable-hello

3c2e19bf6a41f7580bb86e48a271f6b2.png

注:部分截图

a062fd77b2c61bccd639f215199434dc.png

30f0607ebe1347c467666aeabb31b3d7.png

85c6b379ab98f729f75a00e4a9b44ad7.png

(2)有选项--enable-hello

5c4cdb6179e078819f895af97e7deafd.png

c84059948664b4705dadbc1b89cbcbde.png

4. tar包好了,至此为止,我们的小软件已经测试完毕,可以发布了,在ts下有很多文件,有的是我们自己写的,也有些是编译时生成的临时档案,到底哪些需要打包到发行包中呢?当然你可以自己一个一个文件挑选,但Autotools工具给我们提供了几个极其方便的功能让我们打包。我们可以用make dist或make distcheck来生成相应的tar包,其中后者还会帮我们测试发布包能否正常工作,所以推荐使用make distcheck。 ba38c6e15bbf86031a7a9abab87bcb54.png20cf1ebba03c75ace82f35c7ab76d305.png看到了吧?发布包ts-1.0.tar.gz已经放到ts下了,有没有留意,这里用的软件名及版本号正是 configure.in中AM_INIT_AUTOMAKE所带的两个参数!现在你可以试试把它解压安装了.



推荐阅读
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 本文深入探讨了NDK与JNI技术在实际项目中的应用及其学习路径。通过分析工程目录结构和关键代码示例,详细介绍了如何在Android开发中高效利用NDK和JNI,实现高性能计算和跨平台功能。同时,文章还提供了从基础概念到高级实践的系统学习指南,帮助开发者快速掌握这些关键技术。 ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • 使用 MyEclipse 和 TestNG 测试框架在 Java 中高效进行单元测试
    通过MyEclipse集成TestNG测试框架,可以在Java开发中高效地进行单元测试。本文介绍了在JDK 1.8.0_121和MyEclipse 10.0离线环境下配置和使用TestNG的具体步骤,帮助开发者提高测试效率和代码质量。 ... [详细]
  • Java 中优先级队列的轮询方法详解与应用 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 本文介绍了一种基于最大匹配算法的简易分词程序的设计与实现。该程序通过引入哈希集合存储词典,利用前向最大匹配方法对输入文本进行高效分词处理,具有较高的准确率和较快的处理速度,适用于中文文本的快速分词需求。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • Liferay Portal 中 AutoEscape 构造函数的应用与实例代码解析 ... [详细]
  • 如何构建基于Spring MVC框架的Java Web应用项目
    在构建基于Spring MVC框架的Java Web应用项目时,首先应创建一个新的动态Web项目。接着,需将必要的JAR包导入至WebContent/WEB-INF/lib目录下,确保包括Spring核心库及相关依赖。如遇缺失的JAR包,可向社区求助或通过Maven等工具自动下载。正确配置后,即可开始搭建应用结构与功能模块。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
author-avatar
皓月当空668
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有