我正在阅读GitHub上的CIF(Collective Intelligence Framework)源代码
在文件中src/lib/CIF/Generated.pm.in
我看到了这样的声明
use constant PROTOCOL_VERSION => @CIF_PROTOCOL_VERSION@;
为什么有两个标志 @
?
package CIF; use warnings; use strict; use constant VERSION => '@CIF_VERSION_MAJOR@.@CIF_VERSION_MINOR@.@CIF_VERSION_PATCH@@CIF_VERSION_META@'; our ($MAJOR_VERSION, $MINOR_VERSION, $PATCH, $META) = VERSION =~ /^(\d+)\.(\d+)\.(\d+)-?([\w\.\d]+)?$/; use constant PROTOCOL_VERSION => @CIF_PROTOCOL_VERSION@; use constant ORG => '@ORG@'; use constant DEFAULT_PORT => @DEFAULT_PORT@; use constant DEFAULT_FRONTEND_PORT => DEFAULT_PORT(); use constant DEFAULT_BACKEND_PORT => (DEFAULT_PORT() + 1); use constant DEFAULT_PUBLISHER_PORT => (DEFAULT_PORT() + 2); use constant DEFAULT_STATS_PUBLISHER_PORT => (DEFAULT_PORT() + 3); our $CIF_USER = '@CIF_USER@'; our $CIF_GROUP = '@CIF_GROUP@'; our $BasePath = '@CIF_PATH@'; our $LibPath = '@siteperldir@'; our $EtcPath = '@ext_sysconfdir@'; our $VarPath = '@ext_localstatedir@'; our $LogPath = $VarPath.'/log'; our $PidPath = $VarPath.'/run'; our $BinPath = $BasePath . '/bin'; our $SbinPath = $BasePath . '/sbin'; our $SmrtRulesPath = $EtcPath . '/rules'; our $SmrtRulesDefault = $SmrtRulesPath . '/default'; our $SmrtRulesLocal = $SmrtRulesPath . '/local'; 1;
cjm.. 9
.pm.in
不是Perl代码的正常扩展.相反,.in
通常表示某种类型的模板,用于生成具有相同名称但.in
已删除的文件.
在这种情况下,模板系统是Autoconf.如果你查看configure.ac,你会看到
AC_CONFIG_FILES([ Makefile src/Makefile.PL src/lib/CIF/Generated.pm elasticsearch/Makefile hacking/packaging/ubuntu/default/cif ])
这意味着src/lib/CIF/Generated.pm
将src/lib/CIF/Generated.pm.in
在configure
运行时生成.的@...@
(其Autoconf的称之为"符号输出变量 ")由在该时刻的配置的选项所取代.它们不是Perl语法,它们是Autoconf的模板语法.
换句话说,Generated.pm.in
不是Perl代码; 它是一个模板,Autoconf可以从中生成Perl代码.像一条线
use constant PROTOCOL_VERSION => @CIF_PROTOCOL_VERSION@;
会成为
use constant PROTOCOL_VERSION => 1;
在src/lib/CIF/Generated.pm
如果configure
确定CIF_PROTOCOL_VERSION应该是1.如何configure
决定太复杂,在这里解释; 有关详细信息,请阅读Autoconf手册.
.pm.in
不是Perl代码的正常扩展.相反,.in
通常表示某种类型的模板,用于生成具有相同名称但.in
已删除的文件.
在这种情况下,模板系统是Autoconf.如果你查看configure.ac,你会看到
AC_CONFIG_FILES([ Makefile src/Makefile.PL src/lib/CIF/Generated.pm elasticsearch/Makefile hacking/packaging/ubuntu/default/cif ])
这意味着src/lib/CIF/Generated.pm
将src/lib/CIF/Generated.pm.in
在configure
运行时生成.的@...@
(其Autoconf的称之为"符号输出变量 ")由在该时刻的配置的选项所取代.它们不是Perl语法,它们是Autoconf的模板语法.
换句话说,Generated.pm.in
不是Perl代码; 它是一个模板,Autoconf可以从中生成Perl代码.像一条线
use constant PROTOCOL_VERSION => @CIF_PROTOCOL_VERSION@;
会成为
use constant PROTOCOL_VERSION => 1;
在src/lib/CIF/Generated.pm
如果configure
确定CIF_PROTOCOL_VERSION应该是1.如何configure
决定太复杂,在这里解释; 有关详细信息,请阅读Autoconf手册.