1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

s3-param Generate parameter tables

This commit is contained in:
Andrew Bartlett 2011-07-01 14:36:25 +10:00
parent d4ef70a764
commit 4f3a155fb5
6 changed files with 97 additions and 439 deletions

2
.gitignore vendored
View File

@ -90,6 +90,8 @@ source3/script/installbin.sh
source3/script/uninstallbin.sh source3/script/uninstallbin.sh
source3/smbadduser source3/smbadduser
source3/smbd/build_options.c source3/smbd/build_options.c
source3/param/param_global.h
source3/param/param_local.h
source3/setup source3/setup
pidl/blib pidl/blib
pidl/cover_db pidl/cover_db

View File

@ -99,7 +99,7 @@ $file->("/* This file was automatically generated by mkparmdefs.pl. DO NOT EDIT
$file->("{\n"); $file->("{\n");
} }
sub print_footer($$$) sub print_footer($$$)
{ {
my ($file, $header_name, $generate_scope) = @_; my ($file, $header_name, $generate_scope) = @_;
$file->("LOADPARM_EXTRA_" . $generate_scope . "S\n"); $file->("LOADPARM_EXTRA_" . $generate_scope . "S\n");
@ -107,32 +107,43 @@ sub print_footer($$$)
$file->("\n#endif /* $header_name */\n\n"); $file->("\n#endif /* $header_name */\n\n");
} }
sub handle_loadparm($$$) sub handle_loadparm($$$)
{ {
my ($file,$line,$generate_scope) = @_; my ($file,$line,$generate_scope) = @_;
my $scope;
my $type;
my $name;
my $var;
if ($line =~ /^FN_(GLOBAL|LOCAL)_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),(.*)\)/o) { if ($line =~ /^FN_(GLOBAL|LOCAL)_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),(.*)\)/o) {
my $scope = $1; $scope = $1;
my $type = $2; $type = $2;
my $name = $3; $name = $3;
my $var = $4; $var = $4;
} elsif ($line =~ /^FN_(GLOBAL|LOCAL)_PARM_(CONST_STRING|STRING|BOOL|bool|CHAR|INTEGER|LIST)\((\w+),(.*)\)/o) {
$scope = $1;
$type = $2;
$name = $3;
$var = $4;
} else {
return;
}
my %tmap = (
"BOOL" => "int ",
"CONST_STRING" => "char *",
"STRING" => "char *",
"INTEGER" => "int ",
"CHAR" => "char ",
"LIST" => "const char **",
);
my %tmap = ( if ($scope eq $generate_scope) {
"BOOL" => "int ", $file->("\t$tmap{$type} $var;\n");
"CONST_STRING" => "char *",
"STRING" => "char *",
"INTEGER" => "int ",
"CHAR" => "char ",
"LIST" => "const char **",
);
if ($scope eq $generate_scope) {
$file->("\t$tmap{$type} $var;\n");
}
} }
} }
sub process_file($$) sub process_file($$)
{ {
my ($file, $filename) = @_; my ($file, $filename) = @_;
@ -146,8 +157,8 @@ sub process_file($$)
my $comment = undef; my $comment = undef;
my $incomment = 0; my $incomment = 0;
while (my $line = <FH>) { while (my $line = <FH>) {
if ($line =~ /^\/\*\*/) { if ($line =~ /^\/\*\*/) {
$comment = ""; $comment = "";
$incomment = 1; $incomment = 1;
} }
@ -157,16 +168,18 @@ sub process_file($$)
if ($line =~ /\*\//) { if ($line =~ /\*\//) {
$incomment = 0; $incomment = 0;
} }
} }
# these are ordered for maximum speed # these are ordered for maximum speed
next if ($line =~ /^\s/); next if ($line =~ /^\s/);
next unless ($line =~ /\(/); next unless ($line =~ /\(/);
next if ($line =~ /^\/|[;]/); next if ($line =~ /^\/|[;]/);
if ($line =~ /^FN_/) { if ($line =~ /^static (FN_.*)/) {
handle_loadparm($file, $1, $generate_scope);
} elsif ($line =~ /^FN_/) {
handle_loadparm($file, $line, $generate_scope); handle_loadparm($file, $line, $generate_scope);
} }
next; next;
@ -186,7 +199,6 @@ if (not defined($file)) {
} }
mkpath(dirname($file), 0, 0755); mkpath(dirname($file), 0, 0755);
open(PUBLIC, ">$file") or die("Can't open `$file': $!"); open(PUBLIC, ">$file") or die("Can't open `$file': $!");
print PUBLIC "$$public_data"; print PUBLIC "$$public_data";
close(PUBLIC); close(PUBLIC);

View File

@ -1552,7 +1552,7 @@ all:: SHOWFLAGS basics libs $(SBIN_PROGS) $(BIN_PROGS) \
$(MODULES) $(NSS_MODULES) $(PAM_MODULES) \ $(MODULES) $(NSS_MODULES) $(PAM_MODULES) \
$(EXTRA_ALL_TARGETS) $(EXTRA_ALL_TARGETS)
basics:: samba3-idl basics:: samba3-idl mkparam
nss_modules:: $(NSS_MODULES) nss_modules:: $(NSS_MODULES)
@ -1629,6 +1629,10 @@ idl_full::
@PIDL_OUTPUTDIR="librpc/gen_ndr" PIDL_ARGS="$(PIDL_ARGS)" CPP="$(CPP)" PIDL="../pidl/pidl" \ @PIDL_OUTPUTDIR="librpc/gen_ndr" PIDL_ARGS="$(PIDL_ARGS)" CPP="$(CPP)" PIDL="../pidl/pidl" \
srcdir="$(srcdir)" $(srcdir)/script/build_idl.sh --full $(IDL_FILES) srcdir="$(srcdir)" $(srcdir)/script/build_idl.sh --full $(IDL_FILES)
mkparam:
$(PERL) ../script/mkparamdefs.pl $(srcdir)/param/loadparm.c --file param/param_local.h --generate-scope=LOCAL
$(PERL) ../script/mkparamdefs.pl $(srcdir)/param/loadparm.c --file param/param_global.h --generate-scope=GLOBAL
##################################################################### #####################################################################
@ -3377,6 +3381,8 @@ cleanlibs::
clean:: cleanlibs clean:: cleanlibs
-rm -f include/build_env.h -rm -f include/build_env.h
-rm -f smbd/build_options.c -rm -f smbd/build_options.c
-rm -f param/param_local.h
-rm -f param/param_global.h
-rm -f $(PRECOMPILED_HEADER) -rm -f $(PRECOMPILED_HEADER)
-rm -f core */*~ *~ \ -rm -f core */*~ *~ \
*/*.o */*/*.o */*/*/*.o */*/*/*/*.o \ */*.o */*/*.o */*/*/*.o */*/*/*/*.o \

View File

@ -125,416 +125,45 @@ struct param_opt_struct {
unsigned flags; unsigned flags;
}; };
/* #define LOADPARM_EXTRA_GLOBALS \
* This structure describes global (ie., server-wide) parameters. struct param_opt_struct *param_opt; \
*/ char *szRealm; \
struct loadparm_global { char *szLogLevel; \
int ConfigBackend; int iminreceivefile; \
char *smb_ports; char *szPrintcapname; \
char *dos_charset; int CupsEncrypt; \
char *unix_charset; int iPreferredMaster; \
char *szPrintcapname; int iDomainMaster; \
char *szAddPortCommand; char *szLdapMachineSuffix; \
char *szEnumPortsCommand; char *szLdapUserSuffix; \
char *szAddPrinterCommand; char *szLdapIdmapSuffix; \
char *szDeletePrinterCommand; char *szLdapGroupSuffix; \
char *szOs2DriverMap; char *szStateDir; \
char *szLockDir; char *szCacheDir; \
char *szStateDir; char *szSocketAddress; \
char *szCacheDir; char *szUsershareTemplateShare; \
char *szPidDir; char *szIdmapUID; \
char *szRootdir; char *szIdmapGID; \
char *szDefaultService; int winbindMaxDomainConnections; \
char *szGetQuota;
char *szSetQuota;
char *szMsgCommand;
char *szServerString;
char *szAutoServices;
char *szPasswdProgram;
char *szPasswdChat;
char *szLogFile;
char *szConfigFile;
char *szSMBPasswdFile;
char *szPrivateDir;
char *szPassdbBackend;
char **szPreloadModules;
char *szPasswordServer;
char *szSocketOptions;
char *szRealm;
char *szRealmUpper;
char *szDnsDomain;
char *szAfsUsernameMap;
int iAfsTokenLifetime;
char *szLogNtTokenCommand;
char *szUsernameMap;
char *szLogonScript;
char *szLogonPath;
char *szLogonDrive;
char *szLogonHome;
char **szWINSservers;
char **szInterfaces;
char *szRemoteAnnounce;
char *szRemoteBrowseSync;
char *szSocketAddress;
bool bNmbdBindExplicitBroadcast;
char *szNISHomeMapName;
char *szWorkgroup;
char *szNetbiosName;
char **szNetbiosAliases;
char *szNetbiosScope;
char *szNameResolveOrder;
char *szPanicAction;
char *szAddUserScript;
char *szRenameUserScript;
char *szDelUserScript;
char *szAddGroupScript;
char *szDelGroupScript;
char *szAddUserToGroupScript;
char *szDelUserFromGroupScript;
char *szSetPrimaryGroupScript;
char *szAddMachineScript;
char *szShutdownScript;
char *szAbortShutdownScript;
char *szUsernameMapScript;
int iUsernameMapCacheTime;
char *szCheckPasswordScript;
char *szWINSHook;
char *szUtmpDir;
char *szWtmpDir;
bool bUtmp;
char *szIdmapUID;
char *szIdmapGID;
bool bPassdbExpandExplicit;
int AlgorithmicRidBase;
char *szTemplateHomedir;
char *szTemplateShell;
char *szWinbindSeparator;
bool bWinbindEnumUsers;
bool bWinbindEnumGroups;
bool bWinbindUseDefaultDomain;
bool bWinbindTrustedDomainsOnly;
bool bWinbindNestedGroups;
int winbind_expand_groups;
bool bWinbindRefreshTickets;
bool bWinbindOfflineLogon;
bool bWinbindNormalizeNames;
bool bWinbindRpcOnly;
bool bCreateKrb5Conf;
int winbindMaxDomainConnections;
char *szIdmapBackend;
char *szAddShareCommand;
char *szChangeShareCommand;
char *szDeleteShareCommand;
char **szEventLogs;
char *szGuestaccount;
char *szManglingMethod;
char **szServicesList;
char *szUsersharePath;
char *szUsershareTemplateShare;
char **szUsersharePrefixAllowList;
char **szUsersharePrefixDenyList;
int mangle_prefix;
int max_log_size;
char *szLogLevel;
int max_xmit;
int max_mux;
int max_open_files;
int open_files_db_hash_size;
int pwordlevel;
int unamelevel;
int deadtime;
bool getwd_cache;
int maxprotocol;
int minprotocol;
int security;
char **AuthMethods;
bool paranoid_server_security;
int maxdisksize;
int lpqcachetime;
int iMaxSmbdProcesses;
bool bDisableSpoolss;
int syslog;
int os_level;
bool enhanced_browsing;
int max_ttl;
int max_wins_ttl;
int min_wins_ttl;
int lm_announce;
int lm_interval;
int machine_password_timeout;
int map_to_guest;
int oplock_break_wait_time;
int winbind_cache_time;
int winbind_reconnect_delay;
int winbind_max_clients;
char **szWinbindNssInfo;
int iLockSpinTime;
char *szLdapMachineSuffix;
char *szLdapUserSuffix;
char *szLdapIdmapSuffix;
char *szLdapGroupSuffix;
int ldap_ssl;
bool ldap_ssl_ads;
int ldap_deref;
int ldap_follow_referral;
char *szLdapSuffix;
char *szLdapAdminDn;
int ldap_debug_level;
int ldap_debug_threshold;
int iAclCompat;
char *szCupsServer;
int CupsEncrypt;
char *szIPrintServer;
char *ctdbdSocket;
char **szClusterAddresses;
bool clustering;
int ctdb_timeout;
int ctdb_locktime_warn_threshold;
int ldap_passwd_sync;
int ldap_replication_sleep;
int ldap_timeout; /* This is initialised in init_globals */
int ldap_connection_timeout;
int ldap_page_size;
bool ldap_delete_dn;
bool bMsAddPrinterWizard;
bool bDNSproxy;
bool bWINSsupport;
bool bWINSproxy;
bool bLocalMaster;
int iPreferredMaster;
int iDomainMaster;
bool bDomainLogons;
char **szInitLogonDelayedHosts;
int InitLogonDelay;
bool bEncryptPasswords;
int clientSchannel;
int serverSchannel;
bool bNullPasswords;
bool bObeyPamRestrictions;
bool bLoadPrinters;
int PrintcapCacheTime;
bool bLargeReadwrite;
bool bReadRaw;
bool bWriteRaw;
bool bSyslogOnly;
bool bBrowseList;
bool bNISHomeMap;
bool bTimeServer;
bool bBindInterfacesOnly;
bool bPamPasswordChange;
bool bUnixPasswdSync;
bool bPasswdChatDebug;
int iPasswdChatTimeout;
bool bTimestampLogs;
bool bNTSmbSupport;
bool bNTPipeSupport;
bool bNTStatusSupport;
bool bStatCache;
int iMaxStatCacheSize;
bool bKernelOplocks;
bool bAllowTrustedDomains;
bool bLanmanAuth;
bool bNTLMAuth;
bool bUseSpnego;
bool bClientLanManAuth;
bool bClientNTLMv2Auth;
bool bClientPlaintextAuth;
bool bClientUseSpnego;
bool client_use_spnego_principal;
bool send_spnego_principal;
bool bDebugPrefixTimestamp;
bool bDebugHiresTimestamp;
bool bDebugPid;
bool bDebugUid;
bool bDebugClass;
bool bEnableCoreFiles;
bool bHostMSDfs;
bool bUseMmap;
bool bHostnameLookups;
bool bUnixExtensions;
bool bDisableNetbios;
char * szDedicatedKeytabFile;
int iKerberosMethod;
bool bDeferSharingViolations;
bool bEnablePrivileges;
bool bASUSupport;
bool bUsershareOwnerOnly;
bool bUsershareAllowGuests;
bool bRegistryShares;
int restrict_anonymous;
int name_cache_timeout;
int client_signing;
int server_signing;
int client_ldap_sasl_wrapping;
int iUsershareMaxShares;
int iIdmapCacheTime;
int iIdmapNegativeCacheTime;
bool bResetOnZeroVC;
bool bLogWriteableFilesOnExit;
int iKeepalive;
int iminreceivefile;
struct param_opt_struct *param_opt;
int cups_connection_timeout;
char *szSMBPerfcountModule;
bool bMapUntrustedToDomain;
bool bAsyncSMBEchoHandler;
bool bMulticastDnsRegister;
int ismb2_max_read;
int ismb2_max_write;
int ismb2_max_trans;
int ismb2_max_credits; int ismb2_max_credits;
char *ncalrpc_dir; #define LOADPARM_EXTRA_LOCALS \
}; bool valid; \
int usershare; \
struct timespec usershare_last_mod; \
int iMaxPrintJobs; \
char *szCopy; \
char *szInclude; \
bool bAvailable; \
bool bWidelinks; \
struct param_opt_struct *param_opt; \
struct bitmap *copymap; \
char dummy[3]; /* for alignment */
#include "param/param_global.h"
#include "param/param_local.h"
static struct loadparm_global Globals; static struct loadparm_global Globals;
/*
* This structure describes a single service.
*/
struct loadparm_service {
bool valid;
bool autoloaded;
int usershare;
struct timespec usershare_last_mod;
char *szService;
char *szPath;
char *szUsername;
char **szInvalidUsers;
char **szValidUsers;
char **szAdminUsers;
char *szCopy;
char *szInclude;
char *szPreExec;
char *szPostExec;
char *szRootPreExec;
char *szRootPostExec;
char *szCupsOptions;
char *szPrintcommand;
char *szLpqcommand;
char *szLprmcommand;
char *szLppausecommand;
char *szLpresumecommand;
char *szQueuepausecommand;
char *szQueueresumecommand;
char *szPrintername;
char *szPrintjobUsername;
char *szDontdescend;
char **szHostsallow;
char **szHostsdeny;
char *szMagicScript;
char *szMagicOutput;
char *szVetoFiles;
char *szHideFiles;
char *szVetoOplockFiles;
char *comment;
char *force_user;
char *force_group;
char **readlist;
char **writelist;
char **printer_admin;
char *volume;
char *fstype;
char **szVfsObjects;
char *szMSDfsProxy;
char *szAioWriteBehind;
char *szDfree;
int iMinPrintSpace;
int iMaxPrintJobs;
int iMaxReportedPrintJobs;
int iWriteCacheSize;
int iCreate_mask;
int iCreate_force_mode;
int iSecurity_mask;
int iSecurity_force_mode;
int iDir_mask;
int iDir_force_mode;
int iDir_Security_mask;
int iDir_Security_force_mode;
int iMaxConnections;
int iDefaultCase;
int iPrinting;
int iOplockContentionLimit;
int iCSCPolicy;
int iBlock_size;
int iDfreeCacheTime;
bool bPreexecClose;
bool bRootpreexecClose;
int iCaseSensitive;
bool bCasePreserve;
bool bShortCasePreserve;
bool bHideDotFiles;
bool bHideSpecialFiles;
bool bHideUnReadable;
bool bHideUnWriteableFiles;
bool bBrowseable;
bool bAccessBasedShareEnum;
bool bAvailable;
bool bRead_only;
bool bNo_set_dir;
bool bGuest_only;
bool bAdministrative_share;
bool bGuest_ok;
bool bPrint_ok;
bool bPrintNotifyBackchannel;
bool bMap_system;
bool bMap_hidden;
bool bMap_archive;
bool bStoreDosAttributes;
bool bDmapiSupport;
bool bLocking;
int iStrictLocking;
bool bPosixLocking;
bool bShareModes;
bool bOpLocks;
bool bLevel2OpLocks;
bool bOnlyUser;
bool bMangledNames;
bool bWidelinks;
bool bSymlinks;
bool bSyncAlways;
bool bStrictAllocate;
bool bStrictSync;
char magic_char;
struct bitmap *copymap;
bool bDeleteReadonly;
bool bFakeOplocks;
bool bDeleteVetoFiles;
bool bDosFilemode;
bool bDosFiletimes;
bool bDosFiletimeResolution;
bool bFakeDirCreateTimes;
bool bBlockingLocks;
bool bInheritPerms;
bool bInheritACLS;
bool bInheritOwner;
bool bMSDfsRoot;
bool bUseClientDriver;
bool bDefaultDevmode;
bool bForcePrintername;
bool bNTAclSupport;
bool bForceUnknownAclUser;
bool bUseSendfile;
bool bProfileAcls;
bool bMap_acl_inherit;
bool bAfs_Share;
bool bEASupport;
bool bAclCheckPermissions;
bool bAclMapFullControl;
bool bAclGroupControl;
bool bChangeNotify;
bool bKernelChangeNotify;
int iallocation_roundup_size;
int iAioReadSize;
int iAioWriteSize;
int iMap_readonly;
int iDirectoryNameCacheSize;
int ismb_encrypt;
struct param_opt_struct *param_opt;
char dummy[3]; /* for alignment */
};
/* This is a default service used to prime a services structure */ /* This is a default service used to prime a services structure */
static struct loadparm_service sDefault = static struct loadparm_service sDefault =
{ {
@ -5648,8 +5277,7 @@ FN_GLOBAL_BOOL(lp_usershare_allow_guests, bUsershareAllowGuests)
FN_GLOBAL_BOOL(lp_usershare_owner_only, bUsershareOwnerOnly) FN_GLOBAL_BOOL(lp_usershare_owner_only, bUsershareOwnerOnly)
FN_GLOBAL_BOOL(lp_disable_netbios, bDisableNetbios) FN_GLOBAL_BOOL(lp_disable_netbios, bDisableNetbios)
FN_GLOBAL_BOOL(lp_reset_on_zero_vc, bResetOnZeroVC) FN_GLOBAL_BOOL(lp_reset_on_zero_vc, bResetOnZeroVC)
FN_GLOBAL_BOOL(lp_log_writeable_files_on_exit, FN_GLOBAL_BOOL(lp_log_writeable_files_on_exit, bLogWriteableFilesOnExit)
bLogWriteableFilesOnExit)
FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, bMsAddPrinterWizard) FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, bMsAddPrinterWizard)
FN_GLOBAL_BOOL(lp_dns_proxy, bDNSproxy) FN_GLOBAL_BOOL(lp_dns_proxy, bDNSproxy)
FN_GLOBAL_BOOL(lp_we_are_a_wins_server, bWINSsupport) FN_GLOBAL_BOOL(lp_we_are_a_wins_server, bWINSsupport)
@ -5770,7 +5398,7 @@ FN_LOCAL_STRING(lp_postexec, szPostExec)
FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec) FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec) FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
FN_LOCAL_STRING(lp_servicename, szService) FN_LOCAL_STRING(lp_servicename, szService)
FN_LOCAL_CONST_STRING(lp_const_servicename, szService) FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
FN_LOCAL_STRING(lp_pathname, szPath) FN_LOCAL_STRING(lp_pathname, szPath)
FN_LOCAL_STRING(lp_dontdescend, szDontdescend) FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
FN_LOCAL_STRING(lp_username, szUsername) FN_LOCAL_STRING(lp_username, szUsername)

View File

@ -735,9 +735,19 @@ if bld.env.toplevel_build:
deps='''s3_param_h param''', deps='''s3_param_h param''',
vars=locals()) vars=locals())
bld.SAMBA_GENERATOR('param/param_local_h',
source= 'param/loadparm.c ../script/mkparamdefs.pl',
target='param/param_local.h',
rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT} --generate-scope=LOCAL')
bld.SAMBA_GENERATOR('param/param_global_h',
source= 'param/loadparm.c ../script/mkparamdefs.pl',
target='param/param_global.h',
rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT} --generate-scope=GLOBAL')
bld.SAMBA3_SUBSYSTEM('param', bld.SAMBA3_SUBSYSTEM('param',
source=PARAM_WITHOUT_REG_SRC, source=PARAM_WITHOUT_REG_SRC,
deps='samba-util PARAM_UTIL smbd_conn ldap lber LOADPARM_CTX samba3core smbconf''') deps='samba-util PARAM_UTIL smbd_conn ldap lber LOADPARM_CTX samba3core smbconf param/param_local_h param/param_global_h''')
bld.SAMBA3_SUBSYSTEM('param_service', bld.SAMBA3_SUBSYSTEM('param_service',
source='param/service.c', source='param/service.c',

View File

@ -6,12 +6,12 @@ bld.SAMBA_GENERATOR('s3_param_h',
rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT}') rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT}')
bld.SAMBA_GENERATOR('param_local_h', bld.SAMBA_GENERATOR('param_local_h',
source= 'loadparm.c ../script/mkparamdefs.pl', source= 'loadparm.c ../../script/mkparamdefs.pl',
target='param_local.h', target='param_local.h',
rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT} --generate-scope=LOCAL') rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT} --generate-scope=LOCAL')
bld.SAMBA_GENERATOR('param_global_h', bld.SAMBA_GENERATOR('param_global_h',
source= 'loadparm.c ../script/mkparamdefs.pl', source= 'loadparm.c ../../script/mkparamdefs.pl',
target='param_global.h', target='param_global.h',
rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT} --generate-scope=GLOBAL') rule='${PERL} ${SRC[1].abspath(env)} ${SRC[0].abspath(env)} --file ${TGT} --generate-scope=GLOBAL')