Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >cmake:在Makefile中运行ant脚本

cmake:在Makefile中运行ant脚本

作者头像
10km
发布于 2019-05-25 14:35:47
发布于 2019-05-25 14:35:47
1.9K00
代码可运行
举报
文章被收录于专栏:10km的专栏10km的专栏
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433746

Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,在Java开发环境中应用非常广泛。

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake,在c/c++跨平台开发中应用非常广泛 。

有的时候,我们项目是java/c/c++混合代码,这时可能就需要同时应用上述两种工具。

在项目初始阶段,java和c/c++代码可以分别用ant和cmake写脚本进行编译,但当项目越来越成形,越来越复杂的时候,再分别手工编译就非常容易出错。

如果能统一用一个工具(ant或cmake)进行编译,就可以提高工作效率减少编译环节出错的机率。

很久以前写过一个博客《ant调用make实现Makefile编译》,可以通过shell脚本方式,让ant执行Makefile编译,可以实现用ant统一编译项目代码的需求。

反过来,cmake也可以生成可以执行ant脚本的Makefile,以用cmake统一编译项目代码的需求。

cmake实现在Makefile中执行ant脚本是通过add_custom_commandadd_custom_target命令来完成的。add_custom_command允许用户将任何一个可执行文件定义成类似cmake-command的custom_command语句。而add_custom_target可以定义一个依赖于custom_command的target。

好吧,说起来好绕口,还是用例证来说明吧。

下面这段代码是cmake脚本中的片段,用于在cmake脚本中执行ant脚本编译java代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 定义一个是否编译java代码的开关,默认不编译
option(BUILD_JAVA "Build the cassdk_jni jar (Java)" OFF)
if(BUILD_JAVA)
    # 执行find_program 命令在 环境变量(PATH)中查找ant可执行程序
    find_program (ANT_CMD ant)
    if(NOT ANT_CMD)
        // 如果没有找到ant.exe则报错退出
        message(FATAL_ERROR "NOT FOUND ant")
    endif()
    # 执行file命令生成java编译依赖文件列表,当列表中的java代码文件被修改时,就会执行ant脚本编译java代码
    # GLOB_RECURSE指定递归搜索子目录
    file(GLOB_RECURSE  java_srcs "${CMAKE_CURRENT_SOURCE_DIR}/src/*.java")
    # 定义输出的jar包名及位置
    set ( CASSDK_JAR ${CMAKE_CURRENT_SOURCE_DIR}/build/jar/cassdk_jni.jar)
    # 执行 ant jar命令 (当然 ant脚本build.xml中要有名为'jar'的target)
    # 编译 java 代码,并将java代码编译并生成jar包
    add_custom_command(
      OUTPUT ${CASSDK_JAR} 
      COMMAND ${ANT_CMD} jar
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
      DEPENDS ${java_srcs} # 依赖的java源码改变时会执行此命令
      COMMENT "run ant jar -> cassdk_jni.jar"
    )
    # 创建自定义target
    add_custom_target(CASSDKJavaJar ALL
      DEPENDS ${CASSDK_JAR} # 依赖add_custom_command输出的jar包
      COMMENT "building cassdk_jni.jar"
    )
    # 安装jar包到 jar目录下
    install(FILES ${CASSDK_JAR}
      DESTINATION jar COMPONENT JavaModule
    )
endif(BUILD_JAVA)        

上面代码中使用ant脚本比较简单,也一并贴出来

build.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="cassdk_jni">
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>
    <property name="build.dir" value="${basedir}/build" />
    <property name="jar.dir" value="${build.dir}/jar" />
    <property name="release.dir" value="${basedir}/../release/jar" />
    <property name="jarname" value="${ant.project.name}.jar" />
    <path id="cassdk_jni.classpath">
        <pathelement location="build/classes"/>
    </path>
    <target name="init">
        <mkdir dir="build/classes"/>
        <copy includeemptydirs="false" todir="build/classes">
            <fileset dir="src">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
        <copy includeemptydirs="false" todir="build/classes">
            <fileset dir="test">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
    <target name="clean" description="清除生成的文件">
        <delete dir="${build.dir}"/>
    </target>
    <target depends="clean" name="cleanall" description="清除所有生成的文件(包含release)">
         <delete dir="${release.dir}"/>
    </target>
    <target depends="init" name="build" description="编译代码">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="build/classes" includeantruntime="false" source="${source}" target="${target}" encoding="utf-8">
            <src path="src"/>
            <classpath refid="cassdk_jni.classpath"/>
        </javac>
    </target>
    <target depends="clean,build" name="rebuild" description="重新编译代码"/>
    <target name="jar" depends="build" description="生成jar包">
        <echo message="生成${jar.dir}/${jarname}" />
        <jar destfile="${jar.dir}/${jarname}">
            <fileset dir="${build.dir}/classes" />
        </jar>
    </target>
    <target name="release" depends="clean,jar" description="复制jar包到release目录">
        <copy includeemptydirs="false" todir="${release.dir}">
            <fileset dir="${jar.dir}">
                <include name="**/*.jar"/>
            </fileset>
        </copy>
    </target>
</project>

参考资料:

https://cmake.org/cmake/help/v3.1/command/add_custom_command.html

https://cmake.org/cmake/help/v3.1/command/add_custom_target.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年07月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Ant_build.xml的最完整解释
Ant的概念 Make命令是一个项目管理工具,而Ant所实现功能与此类似。像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷。最初Ant开发者在开发跨平台的应用时,用样也是基于这些缺陷对Ant做了更好的设计。 Ant 与 makefile Makefile有一些不足之处,比如很多人都会碰到的烦人的Tab问题。最初的Ant开发者多次强调”只是我在Tab前面加了一个空格,所以我的命令就不能执行”。有一些工具在一定程度上解决了这个问题,但还是有很多其他的问题。An
流柯
2018/08/30
1.6K0
ant命令征集详解
ANT的命令到此结束。他们的依赖关系,大家细细琢磨。本人目前已经不使用ANT脚本很久了。目前使用的maven,maven比ANT好多了,具体好在哪里大家可以到网上搜一搜。等以后有时间了给大家贡献maven的讲解。请大家多多关注本人的博客!!
业余草
2019/01/21
7010
ant命令征集详解
ANT标签详解
1、<project>标签 每个构建文件对应一个项目,project标签是构建文件的跟标签,它可以有多个内在属性,各个属性的含义分别如下所示: default表示默认的执行目标,这个属性是必须的。 basedir表示项目的基准路径,这个属性是必须的。 name表示项目名称。 description表示项目的描述(或者是对这个标签的作用进行表述)。 每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有自己的构建文件。
用户4522413
2021/07/21
1.1K0
ANT标签详解
ant调用make实现Makefile编译
上一篇博文《cmake:shell(bat,sh) 脚本方式生成Makefile》中完成了cmake生成Makefile脚本的过程,也就是步骤1,本文谈谈步骤2和步骤3的实现:
10km
2022/05/07
8300
web项目ant打包完整案例
前两周做的web项目要部署到服务器上去,为了后续升级部署方便,决定采用Ant进行(开发用的myeclipse 8.5),ant打包测试也是在myeclipse上进行,build.xml测试完成后地通过
小小科
2018/05/02
2K0
web项目ant打包完整案例
CMake 秘籍(三)
测试是代码开发工具箱的核心组成部分。通过使用单元和集成测试进行自动化测试,不仅可以帮助开发者在早期检测功能回归,还可以作为新加入项目的开发者的起点。它可以帮助新开发者提交代码变更,并确保预期的功能得以保留。对于代码的用户来说,自动化测试在验证安装是否保留了代码功能方面至关重要。从一开始就为单元、模块或库使用测试的一个好处是,它可以引导程序员编写更加模块化和不那么复杂的代码结构,采用纯粹的、函数式的风格,最小化并局部化全局变量和全局状态。
ApacheCN_飞龙
2024/05/16
7680
CMake 秘籍(三)
java: ant 脚本示例
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!--basedir是从build.xml所在的目录为基础算起的--> 4 <project nam
菩提树下的杨过
2018/01/24
8950
ant的安装和使用
  1.1 添加环境变量:ANT_HOME=D:\software\ant\apache-ant-1.10.1
全栈程序员站长
2022/09/07
5420
ant的安装和使用
Hadoop2.4.0 Eclipse插件制作
 跌跌撞撞两天装Hadoop2.4.0的环境,今天终于可以尝试写点程序了,想了一想,不得其法,但有一点是肯定的,那就是需要用eclipse,查了一上午的资料,怎么讲的都有,最后锁定了这个帖子,hadoop2x-eclipse-plugin。想用Github下载,但是最后下载失败,页面右侧有个Download ZIP,用这个下载成功。下边来说说我的整个制作过程吧:
星哥玩云
2022/07/01
4270
CMake使用总结
CMake意为cross-platform make,可用于管理c/c++工程。CMake解析配置文件CMakeLists.txt生成Makefile,相比直接用Makefile管理工程,CMake更灵活和简单。
bear_fish
2018/09/19
1.8K0
Ant学习笔记
  前言:这段时间在学习Ant,发现这是一个很强大的构建工具。你可能使用了很长一段时间,才发现Ant能做数不完的事。总之,个人觉得,Ant学习门槛低,入门简单,能大概看懂程序,写一些简单的脚本即可,剩下在遇到的时候边做边学就可以了。另外,博主资历尚浅,有说的不对的地方,还请大家不吝指教。 1、Ant是一个Apache基金会下的跨平台的构建工具,它可以实现项目的自动构建和部署等功能。它具有跨平台、使用简单、语法清晰、功能强大等特点 2、下载和安装:http://ant.apache.org/,添加环境变量A
JMCui
2018/03/15
9760
Ant学习笔记
Ant下载安装及使用详解
Apache Ant 是由 Java 语言开发的工具,由 Apache 软件基金会所提供。Apache Ant 的配置文件写成 XML 容易维护和书写,而且结构很清晰。
JavaEdge
2020/05/27
3.3K0
Ant下载安装及使用详解
ant的高级使用,ant命令详解,ant打包,ant编译后打包去掉jar文件
在日常的项目开发中,我们可以经常性的需要打包测试,尤其是开发环境是windows,而实际环境则是linux。 这样的话,很多程序员要一会打一个包,一会打一个包,这些包可能会很大,实际上只有代码部分会变动,而jar包基本则不动。 当然很多人可能会说,自动化测试。很好的,我们今天要做的就是自动化测试的第一步。 这个时候我是可以使用ant来打包,去掉项目中的所有的jar文件。然后在项目的tomcat启动时到特定的地点去加载jar文件。
业余草
2019/01/21
2K0
1,什么是ant「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。1,什么是ant ant是构建工具 2,什么是构建 概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个 3,ant的好处 跨平台 –因为ant是使用java实现的,所以它跨平台 使用简单–与ant的兄弟make比起来 语法清晰–同样是和make相比 功能强大–ant能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当你自己开发一些ant插件的时候,你会发现它更多的功能。 4
全栈程序员站长
2022/07/25
1.1K0
JAVAWEB项目自动打包部署脚本(SVN+ANT)
acts_meeting_build.xml 脚本: <?xml version="1.0" encoding="utf-8"?> <project name="acts_meeting" base
小柒2012
2018/04/13
2.2K0
Android NDK开发扫盲及最新CMake的编译使用
本节将会对文档进行总结和补充。所以建议先浏览一遍文档,或者看完本篇文章再回头看一遍文档。
做个快乐的码农
2021/11/25
2.5K0
Android NDK开发扫盲及最新CMake的编译使用
简单的Hibernate入门简介
其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持。然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西,比如: Tomcat, Eclipse, Log4J,Struts, XDoclet, 甚至JBoss。这容易让人产生Hibernate复杂难懂的误解,特别是打击了初学者的积极性。 在这篇文章将不涉及Eclipse, log4j, Struts, Tomcat, XDoclet,和JBoss。本文的目的是演示
庞小明
2018/03/09
8120
带有Selenium的Apache ANT:完整教程
在创建完整的软件产品时,需要注意不同的第三方API,它们的类路径,清理先前的可执行二进制文件,编译我们的源代码,执行源代码,创建报告和部署代码库等。如果完成了这些任务一个接一个地手动操作,将花费大量时间,并且该过程容易出错。
用户7466307
2020/06/17
2.1K0
编译Hadoop 1.2.1 Hadoop-eclipse-plugin插件
个人理解,ant的初衷是打造一个本地化工具,而编译hadoop插件的资源间的依赖超出了这一目标。导致我们在使用ant编译的时候需要手工去修改配置。那么自然少不了设置环境变量、设置classpath、添加依赖、设置主函数、javac、jar清单文件编写、验证、部署等步骤。
星哥玩云
2022/06/29
4380
编译Hadoop 1.2.1 Hadoop-eclipse-plugin插件
Ant是什么?「建议收藏」
Ant是Java的生成工具,是Apache的核心项目; Ant类似于Unix中的Make工具,都是用来编译、生成; Ant是跨平台的,而Make不能; Ant的主要目的就是把你想做的事情自动化,不用你手动一步一步做,因为里面内置了javac、java、创建目录、复制文件等功能,所以可以直接点击Ant文件,即可编译生成你的项目。 下载地址:http://ant.apache.org/bindownload.cgi
全栈程序员站长
2022/09/18
1.8K0
Ant是什么?「建议收藏」
相关推荐
Ant_build.xml的最完整解释
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验