6 Scanning configure.ac, using aclocal


Automake通过读取 configure.ac来确定源码包的某些信息。在 configure.ac中需要定义一些 autoconf宏和变量。Automake还会根据 configure.ac中的某些信息调整它的输出。
Automake提供了一些Autoconf宏以使维护更加方便。这些宏可以利用 aclocal程序自动添加到你的 aclocal.m4中。

6.1 Configuration requirements

如果在configure.ac中引用了AM_INIT_AUTOMAKE宏,说明需要调用Automake工具。该宏完成一些Automake正常操作时需要的东西。
下面是configure.ac中的一些其他宏:

  • AC_CONFIG_FILES
    AC_OUTPUT
    这两个宏通常在configure.ac文件尾部以下列方式使用:

    ...
    AC_CONFIG_FILES([
    Makefile
    doc/Makefile
    src/Makefile
    src/lib/Makefile
    ...
    ])
    AC_OUTPUT
    

    Automake通过这两个宏决定生成哪些文件。在AC_CONFIG_FILES宏中列出的文件如果在源码包同目录中有同名的以 .am为文件扩展名的对应文件,Automake就会生成与被列出文件同名的以 .in 为文件扩展名的中间文件,作为生成被列出文件时的输入文件 lgd注AC_CONFIG_FILES宏中列出的文件一般为各级目录下的Makefile,所以只要对应目录下有Makefile.am文件,Automake就会生成Makefile.in文件作为生成相应Makefile的输入文件,最后执行configure脚本时根据Makefile.in文件生成最终的Makefile。生成MakefileconfigureMakefile.in完全拷贝为Makefile,然后将拷贝后的Makefile中的在configure.ac中定义的变量替换为相应的值,即生成最终的Makefile。例如,‘AC_CONFIG_FILES([foo/Makefile])’ 宏使Automake在 foo/Makefile.am文件存在时生成foo/Makefile.in文件。当AC_CONFIG_FILES宏对某一个输出文件使用了多个输入文件时,如:

    AC_CONFIG_FILES([Makefile:top.in:Makefile.in:bot.in])
    

    (注:AC_CONFIG_FILES参数的一般形式 [output1 output2 …],完整形式是 outputn替换为outputn:input1:input2:…:inputn,一般形式时默认要生成的文件outputn的输入文件是以 .in为扩展名的同名文件outputn.in,并且该目录下也只需要有一个以 .am为扩展名的同名文件outputn.am以使Automake根据此文件生成outputn.in
    对于AC_CONFIG_FILES参数中某个输出文件outputn带多个以 .in 为扩展名的input输入文件情况,automake在判断任意输入文件 inputn.in(此时inputn.in可能还没生成)有对应的 inputn.am文件存在时,会生成输入文件列表的第一个输入文件input1.in。如果一个对应的 inputn.am也不存在,则最终不会生成输出文件output。由AC_CONFIG_FILES宏指定的文件,不管是不是Makefile,都会被make distclean删除。而生成AC_CONFIG_FILES宏指定文件时各输入文件(即Makefile.in等中间文件)不会被删除,除非该输入文件也是AC_CONFIG_FILES宏指定的文件。最终,会在各子目录Makefile(如果没有子目录则在最根目录)中生成rebuild规则。
    如果AC_CONFIG_FILES参数使用的是字面值,则上述机制(cleaning, distributing 和 rebuilding)会正常运行。如果AC_CONFIG_FILES的某部分使用的是shell变量,automake将无法满足上述机制。例如,

    file=input
    ...
    AC_CONFIG_FILES([output:$file],, [file=$file])
    

    file=output
    file2=out:in
    ...
    AC_CONFIG_FILES([$file:input],, [file=$file])
    AC_CONFIG_FILES([$file2],, [file2=$file2])
    

    很明显automake无法确认当后续configure脚本运行时 ‘$file’ 是什么值,并且无法在Makefile中使用shell变量 ‘$file’。但是,如果以 ${file} 的形式引用 $file(即使得与make相兼容的语法),此外使用AC_SUBST宏保证 ‘${file}’Makefile中是有效的,则automake可以使用 **‘{file}’**来生成上述规则。如下是Automake自身源码包生成用于测试组件的版本控制脚本:

    AC_SUBST([APIVERSION], ...)
    ...
    AC_CONFIG_FILES(
    [tests/aclocal-${APIVERSION}:tests/aclocal.in],
    [chmod +x tests/aclocal-${APIVERSION}],
    [APIVERSION=$APIVERSION])
    AC_CONFIG_FILES(
    [tests/automake-${APIVERSION}:tests/automake.in],
    [chmod +x tests/automake-${APIVERSION}])
    

    此时cleaning,distributing和rebuilding自动执行,因为在执行make‘${APIVERSION}’ 是可知的。
    注意,无论如果都不能通过一个变量来声明Makefile文件(automake必须为其创建Makefile.in作为输入文件),即使通过AC_SUBST宏也不行。因为automake运行时需要通过其名字判断Makefile.am文件是否存在。
    综上:

    • 尽量对Makefile文件及其他文件的名称都尽量使用字面值
    • 通过 ‘$file’(或在未使用AC_SUBST宏情况下通过 ‘${file}’)引用文件会导致automake忽略该引用。
    • 在使用AC_SUBST宏情况下通过 '${file}'引用文件不会使automake忽略该引用。

6.2 Other things Automake recognizes

Automake每次运行时都会通过Autoconf跟踪configure.ac。通过这种方式Automake可以识别configure.ac中使用的某些宏,并据此调整生成的Makefile.in。以下是目录可识别的宏以及它们的作用:

  • AC_CANONICAL_BUILD
    AC_CANONICAL_HOST
    AC_CANNONICAL_TARGET
    Automake将会保证config.guessconfig.sub存在。同时,在Makefile中会引用build_triplethost_triplettarget_triplt
  • AC_CONFIG_AUX_DIR
    Automake会在该宏指定的目录中寻找各种帮助脚本,如install-sh。(所有帮助脚本有:ar-lib, config.guess, config.sub, depcomp, compile, install-sh, ltmain.sh, mdate-sh, missing, mkinstalldirs, py-compile, test-driver, texinfo.tex, ylwrap)并不是所有脚本都会被寻找,只有生成的Makefile.in需要时才会查找。
    如果没有使用AC_CONFIG_AUX_DIR宏,这些脚本会在他们的标准目录中查找。其中mdate-sh, texinfo.texylwrap脚本,标准目录是相应的Makefile.am对应的目录。其他脚本文件是 ...../**..**中最先提供任意脚本文件的一个目录。(See Section
    “Finding ‘configure’ Input” in The Autoconf Manual.)
    AC_CONFIG_AUX_DIR指定目录下要求的脚本是自动发布的,即使该目录下没有 Makefile.am
  • AC_CONFIG_LIBOBJ_DIR
    Automake会在该宏指定目录下寻找被宏AC_LIBSOURCE宏指定的源文件。
  • AC_CONFIG_HEADERS
    Automake会生成规则来根据相应模板rebuild被该宏指定的这些头文件(通常头文件xxx.h的模板是xxx.h.in)。旧版本Automake使用AC_CONFIG_HEADER,这个以新版本中将被移除。
    AC_CONFIG_FILES宏类似,使用shell变量的参数如果在cleaning,distributing和rebuilding时涉及会被忽略
  • AC_CONFIG_LINKS
    Automake会生成规则来在make distclean时删除configure脚本生成的链接(links)并且在make dist时发布指定源文件。关于参数使用shell变量情况与AC_CONFIG_FILES类似。
  • AC_LIBOBJ
    AC_LIBSOURCE
    AC_LIBSOURCES
    Automake会自动发布由AC_LIBSOURCE宏和AC_LIBSOURCES宏列出的任何文件。
    注意,AC_LIBOBJ宏会调用AC_LIBSOURCE,所以如果某个宏以AC_LIBOBJ([file])形式调用,file.c文件被Automake自动可发布。上述某个宏包含AC_FUNC_ALLOCA, AC_FUNC_MEMCMPAC_REPLACE_FUNCS等。因此,不推荐直接传参给LIBOBJS,而替换为使用AC_LIBOJBS宏。(See Section “AC_LIBOBJ vs. LIBOBJS” in The Autoconf Manual.)
  • AC_PROG_RANLIB
    如果该源码包构建了任意库,则需要使用该宏。(See Section “Particular
    Program Checks” in The Autoconf Manual.)
  • AC_PROG_CXX
    如果包含任意C++源时需要该宏。(See Section “Particular
    Program Checks” in The Autoconf Manual.)
  • AC_PROG_OBJC
    如果包含任意Object C源时需要该宏。(See Section “Particular
    Program Checks” in The Autoconf Manual.)
  • AC_PROG_OBJCXX
    如果包含任意Object C++源时需要该宏。(See Section “Particular
    Program Checks” in The Autoconf Manual.)
  • AC_PROG_F77
    如果包含任意Fortran 77源时需要该宏。(See Section “Particular
    Program Checks” in The Autoconf Manual.)
  • AC_F77_LIBRARY_LDFLAGS
    对于程序或库使用的混合语言中如果包括Fortran 77时需要该宏。
  • AC_FC_SRCEXT
  • AC_PROG_FC
    见Automake Manual。
  • AC_PROG_LIBTOOL
    Automake会启动对libtool的处理。
  • AC_PROG_YACC
    AC_PROG_LEX
    见Automake Manual。
  • AC_REQUIRE_AUX_FILE
    对于每个AC_REQUIRE_AUX_FILE([file])automake会保证file文件存在aux目录(由AC_CONFIG_AUX_DIR宏指定)存在,否则会报错。该宏配合AC_CONFIG_AUX_DIR使用。
  • AC_SUBST(var, value)
    该宏的第一个参数会自动在每个生成的Makefile.in中被定义为变量,除非AM_SUBST_NOTMAKE也作用于该变量。对于每个可赋值变量varautomake在每个Makefile.in中添加一千 var = value。很多Autoconf宏会引用AC_SUBST来设置输出变量。(一般在Makefile.am中以 @var@ 的形式引用AC_SUBST宏定义的变量)
  • AM_CONDITIONAL
    该宏用于Automake布尔变量设置,只有True和False两种值。
    AM_CONDITIONAL([AMDEP], [test “x$enable_dependency_tracking” != xno])
  • ** AM_COND_IF**
    该宏可以判断AM_CONDITIONAL宏定义的布尔变量值来执行不同的分支,automake可以根据该宏的判断来确定configure.ac中后续的执行情况,如果分支有AC_CONFIG_FILES宏,就可以确定要生成哪些文件。
  • AM_GNU_GETTEXT
    该宏用于使用了GNU gettext的源码包。如果Automake读取到了该宏,就可以确定该源码包满足gettext的一些要求。
  • AM_GNU_GETTEXT_INTL_SUBDIR
    该宏指定intl/子目录会被构建,即使引用了第一个参数为externalAM_GNU_GETTEXT宏。
  • AM_MAINTAINER_MODE([default-mode])
    该宏会添加 –enable-maintainer-mode 选项到configure脚本。如果使用了该宏,automake会在生成的Makefile.in中默认关闭”maintainer-only“规则,除非default-modeenable。该宏定义了MAINTAINER_MODE条件式,可用于Makefile.am
  • AM_SUBST_NOTMAKE(var)
    该宏用于阻止Automake定义var,即使该变量原来可被config.status替换。通常,Automake对每个configure替换(即AC_SUBST([var]))定义一个make变量。如果AC_SUBST
    未用于定义变量var,该宏不起任何作用。该功能可用于多行值的替换,即**var = @value@**可能导致奇怪结果的地方。
  • m4_include
    configure.ac中通过该宏引用的文件会被Automake检测和发布。这些文件也会出现在Makefile规则的依赖性关系中。m4_include很少在configure.ac中使用,但会用于aclocal.m4aclocal会在源码包中由该宏引用的文件中查找一些要求的宏(相对于查找系统预安装的宏)

6.3 Auto-generating aclocal.m4

Automake包含一些Autoconf宏(指在configure.ac中使用的以AM_ 开头的宏),Automake在特定情况下需要这些宏。这些宏需要定义在aclocal.m4中,否则autoconf无法识别这些宏。
aclocal程序会根据configure.ac脚本的内容自动生成aclocal.m4。因此可以很方便的获取Automake-provided宏。aclocal机制还允许用户自定义并维护自己的宏。
在启动时,aclocal程序浏览所有它可以找到的以 .m4结尾的文件来查找宏定义。然后aclocal浏览configure.ac脚本,如果某个宏在configure.ac脚本中被引用并且该宏在上一步中有查找到,则该宏以及该宏依次引用到的其他宏会被放入aclocal.m4文件中。
Putting包含宏定义的文件内容到aclocal.m4文件时,通常是拷贝整个文件内容到aclocal.m4文件中,包含未被使用的宏定义以及所有的 ‘#’‘dnl’ 内容。如果想在宏定义文件中注释一些会被aclocal.m4忽略的内容,需要在注释内容开头使用 ‘##’
。。。

6.4 Autoconf macros supplied with Automake

Automake提供了一些在configure.ac脚本中使用的Autoconf宏。当这些宏被使用时,其宏定义会被aclocal程序放入aclocal.m4文件中。

  • AM_INIT_AUTOMAKE([OPTIONS])
    AM_INIT_AUTOMAKE被引用时只需要一个参数:由空格分隔的Automake参数列表,这些参数会被应用到构建树中的所有Makefile.am文件中。效果类似于在AUTOMAKE_OPTIONS(17章)中列出相应选项。
    该宏还有一种不推荐的即将被废弃的引用方式:AM_INIT_
    AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])

    如果在你的configure.ac有:
    AC_INIT([src/foo.c])
    AM_INIT_AUTOMAKE([mumble], [1.5])

    建议修改为:
    AC_INIT([mumble], [1.5])
    AC_CONFIG_SRCDIR([src/foo.c])
    AM_INIT_AUTOMAKE

    注意:如果正准备将configure.ac从旧的Automake版本升级过来,直接将package和version参数直接从AM_INIT_AUTOMAKE宏移到AC_INIT宏并不总是正确的。
  • AM_PATH_LISPDIR
    查找emacs程序,如果找到,设置输出变量lispdir的值为Emacs’ site-lisp的完全路径。
    注意:该宏的操作假设查找到的emacs程序版本支持Emacs Lisp(例如GNU Emacs或XEmacs)。其他版本可能会出现异常。
  • AM_PROG_AR([act-if-fail])
    如果要在程序中使用archiver,则必须使用这个宏。
  • AM_PROG_CC_C_O
    这个宏用于检测C编译器是否支持 -c-o选项。自从Automake 1.14版本之后,AC_PROG_CC宏用于检测这两个选项,所以该宏不建议使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器人激光扫描系统的校准技术是为了确保系统的准确度和稳定性,在应用中起着至关重要的作用。校准技术是通过调整和校准激光扫描系统的各个参数,以使其在实际测量中达到预期的精度和准确性。 首先,校准技术可以用于调整机器人的位置和姿态,以确保激光扫描系统的测量平面与目标物体的表面平行。通过对机器人进行准确定位和姿态调整,可以最大限度地减小系统误差,提高测量结果的精度。 其次,校准技术可以用于对激光扫描系统的内部参数进行调整和校准。这些内部参数包括激光发射器和接收器的表面法线向量、光束的发射位置和方向、激光扫描速度等。通过精确调整这些参数,可以消除系统内部误差,提高测量的准确性。 此外,校准技术还可以用于对激光扫描系统的外部参数进行调整和校准。外部参数包括机器人的位置和姿态、测量场景的光照条件等。通过准确调整和校准这些参数,可以最大限度地减少环境因素对测量结果的影响,提高系统的稳定性和准确性。 总之,校准技术在机器人激光扫描系统的应用中起着至关重要的作用。通过精确调整和校准系统的各个参数,可以提高系统的准确性和稳定性,确保测量结果的精度。校准技术的不断发展和应用将进一步推动机器人激光扫描系统在各个领域的应用,为人们的生活和工作带来更多便利和效益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值