📄 am_edit
字号:
# } $target_adds{"all"} .= "docs-am "; my $lookup = 'KDE_DOCS\s*=\s*([^\n]*)'; goto nodocs if ($MakefileData !~ /\n$lookup/); print STDOUT "KDE_DOCS processing <$1>\n" if ($verbose); tag_SUBDIRS(); my $tmp = $1; # Either find the files in the directory (AUTO) or use # only the specified po files. my $files = ""; my $appname = $tmp; $appname =~ s/^(\S*)\s*.*$/$1/; if ($appname =~ /AUTO/) { $appname = basename($makefileDir); } if ($tmp !~ / - /) { opendir (THISDIR, "."); foreach $entry (readdir(THISDIR)) { next if ($entry eq "CVS" || $entry =~ /^\./ || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^\#.*\#$/); next if (! -f $entry); $files .= "$entry "; } closedir (THISDIR); print STDOUT "docfiles found = $files\n" if ($verbose); } else { $tmp =~ s/\034/ /g; $tmp =~ s/^\S*\s*-\s*//; $files = $tmp; } goto nodocs if (!$files); # Nothing to do if ($files =~ /(^| )index\.docbook($| )/) { my $lines = ""; my $lookup = 'KDB2HTML\s*='; #if ($MakefileData !~ /\n($lookup)/) {# $lines = "KDB2HTML = \$(SHELL) /\$(kde_bindir)/kdb2html\n";# } $lines .= "docs-am: HTML HTML/index.html\n"; $lines .= "\n"; $lines .= "HTML:\n"; $lines .= "\ttest -d HTML || mkdir HTML\n"; $lines .= "\n"; $lines .= "HTML/index.html: HTML index.docbook\n"; $lines .= "\t\@test -d HTML && rm -r HTML\n"; $lines .= "\t\$(KDB2HTML) \$(srcdir)/index.docbook\n"; $lines .= "\n"; $lines .= "install-docs:\n"; $lines .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname\n"; $lines .= "\t-\@if test -d HTML; then \\\n"; $lines .= "\tfilelist=`(cd HTML && ls -1 * .anchors 2> /dev/null)`; for file in \$\$filelist; do if test -f HTML/\$\$file; then \\\n"; $lines .= "\techo \$(INSTALL_DATA) HTML/\$\$file \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$file ;\\\n"; $lines .= "\t\$(INSTALL_DATA) HTML/\$\$file \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$file; \\\n"; $lines .= "\tfi; done; fi\n"; $lines .= "\t-rm -f \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/common\n"; $lines .= "\t\$(LN_S) /\$(kde_htmldir)/$kdelang/common \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/common\n"; $lines .= "\n"; $lines .= "uninstall-docs:\n"; $lines .= "\t-rm -rf \$(kde_htmldir)/$kdelang/$appname\n"; $lines .= "\n"; $target_adds{"install-data-am"} .= "install-docs "; $target_adds{"uninstall"} .= "uninstall-docs "; appendLines ($lines); $docsadded = 1; } else { appendLines("docs-am:\n"); } $target_adds{"install-data-am"} .= "install-nls"; $target_adds{"uninstall"} .= "uninstall-nls "; $tmp = "install-nls:\n"; $tmp .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname\n"; $tmp .= "\t\@for base in $files; do \\\n"; $tmp .= "\t echo \$(INSTALL_DATA) \$\$base \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; $tmp .= "\t \$(INSTALL_DATA) \$(srcdir)/\$\$base \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; $tmp .= "\tdone\n"; $tmp .= "\n"; $tmp .= "uninstall-nls:\n"; $tmp .= "\tfor base in $files; do \\\n"; $tmp .= "\t rm -f \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; $tmp .= "\tdone\n\n"; appendLines ($tmp); $target_adds{"distdir"} .= "distdir-nls "; $tmp = "distdir-nls:\n"; $tmp .= "\tfor file in $files; do \\\n"; $tmp .= "\t cp \$(srcdir)/\$\$file \$(distdir); \\\n"; $tmp .= "\tdone\n"; appendLines ($tmp); return 0; nodocs: appendLines("docs-am:\n"); return 1;}#-----------------------------------------------------------------------------# Find headers in any of the source directories specified previously, that# are candidates for "moc-ing".sub findMocCandidates (){ my @list = (); foreach $dir (@headerdirs) { chdir ($dir); @list = `grep -l '^.*Q_OBJECT' $hExt 2> /dev/null`; chdir ($makefileDir); # The assoc array of root of headerfile and header filename foreach $hFile (@list) { chomp ($hFile); $hFile =~ /(.*)\.[^\.]*$/; # Find name minus extension if ($mocFiles{$1}) { print STDERR "Warning: Multiple header files found for $1\n"; next; # Use the first one } $mocFiles{$1} = "$dir\035$hFile"; # Add relative dir } } return 0;}#-----------------------------------------------------------------------------# The programmer has specified a moc list. Prune out the moc candidates# list that we found based on looking at the header files. This generates# a warning if the programmer gets the list wrong, but this doesn't have# to be fatal here.sub pruneMocCandidates ($){ my %prunedMoc = (); local @mocList = split(' ', $_[0]); foreach $mocname (@mocList) { $mocname =~ s/\.moc$//; if ($mocFiles{$mocname}) { $prunedMoc{$mocname} = $mocFiles{$mocname}; } else { my $print = $makefileDir; $print =~ s/^\Q$topdir\E\\//; # They specified a moc file but we can't find a header that # will generate this moc file. That's possible fatal! print STDERR "Warning: No moc-able header file for $print/$mocname\n"; } } undef %mocFiles; %mocFiles = %prunedMoc;}#-----------------------------------------------------------------------------# Finds the cpp files (If they exist).# The cpp files get appended to the header file separated by \035sub checkMocCandidates (){ my @cppFiles = (); foreach $mocFile (keys (%mocFiles)) { # Find corresponding c++ files that includes the moc file @cppFiles = `grep -l "^#include[ ]*.$mocFile\.moc." $cppExt 2> /dev/null`; if (@cppFiles == 1) { chomp $cppFiles[0]; $mocFiles{$mocFile} .= "\035" . $cppFiles[0]; push(@deped, $mocFile); next; } if (@cppFiles == 0) { push (@newObs, $mocFile); # Produce new object file next if ($haveAutomocTag); # This is expected... # But this is an error we can deal with - let them know print STDERR "Warning: No c++ file that includes $mocFile.moc\n"; next; } else { # We can't decide which file to use, so it's fatal. Although as a # guess we could use the mocFile.cpp file if it's in the list??? print STDERR "Error: Multiple c++ files that include $mocFile.moc\n"; print STDERR "\t",join ("\t", @cppFiles),"\n"; $errorflag = 1; delete $mocFiles{$mocFile}; # Let's continue and see what happens - They have been told! } }}#-----------------------------------------------------------------------------# Add the rules for generating moc source from header files# For Automoc output *.moc.cpp but normally we'll output *.moc# (We must compile *.moc.cpp separately. *.moc files are included# in the appropriate *.cpp file by the programmer)sub addMocRules (){ my $cppFile; my $hFile; my $cleanMoc = ""; foreach $mocFile (keys (%mocFiles)) { undef $cppFile; ($dir, $hFile, $cppFile) = split ("\035", $mocFiles{$mocFile}, 3); $dir =~ s#^\.#\$(srcdir)#; if (defined ($cppFile)) { appendLines ("\$(srcdir)/$cppFile: $mocFile.moc\n$mocFile.moc: $dir/$hFile\n\t\$(MOC) $dir/$hFile -o $mocFile.moc\n"); $cleanMoc .= " $mocFile.moc"; } else { appendLines ("$mocFile$mocExt: $dir/$hFile\n\t\$(MOC) $dir/$hFile -o $mocFile$mocExt\n"); $cleanMoc .= " $mocFile$mocExt"; } } if ($cleanMoc) { # Always add dist clean tag # Add extra *.moc.cpp files created for USE_AUTOMOC because they # aren't included in the normal *.moc clean rules. appendLines ("$cleantarget-metasources:\n\t-rm -f $cleanMoc\n"); $target_adds{"$cleantarget-am"} .= "$cleantarget-metasources "; }}sub make_meta_classes (){ my $cppFile; my $hFile; my $moc_class_headers = ""; my @cppFiles = `grep -l "setMocClasses[ ]*(.*)[ ]*;" $cppExt 2> /dev/null`; chomp(@cppFiles); print STDOUT "C++ files with setMocClasses() = [".join(' ', @cppFiles)."]\n" if $verbose; foreach $program (@programs) { my $mocs = ""; my @progsources = split(/[\s\034]+/, $sources{$program}); my @depmocs = split(' ', $depedmocs{$program}); my %shash = (), %mhash = (); @shash{@progsources} = 1; # we are only interested in the existence @mhash{@depmocs} = 1; print STDOUT "program=$program\n" if ($verbose); print STDOUT "psources=[".join(' ', keys %shash)."]\n" if ($verbose); print STDOUT "depmocs=[".join(' ', keys %mhash)."]\n" if ($verbose); print STDOUT "globalmocs=[".join(' ', keys(%globalmocs))."]\n" if ($verbose); foreach my $mocFile (keys (%globalmocs)) { undef $cppFile; ($dir, $hFile, $cppFile) = split ("\035", $globalmocs{$mocFile}, 3); $dir =~ s#^\.#\$(srcdir)#; if (defined ($cppFile)) { #print STDOUT "cpp=$cppFile\n"; $mocs .= " $mocFile.moc" if exists $shash{$cppFile}; } else { # Bah. This is the case, if no C++ file includes the .moc # file. We make a .moc.cpp file for that. Unfortunately this # is not included in the %sources hash, but rather is mentioned # in %depedmocs. If the user wants to use AUTO he can't just # use an unspecific METAINCLUDES. Instead he must use # program_METAINCLUDES. Anyway, it's not working real nicely. # E.g. Its not clear what happens if user specifies two # METAINCLUDES=AUTO in the same Makefile.am. $mocs .= " $mocFile.moc.$cxxsuffix" if exists $mhash{$mocFile.".moc.$cxxsuffix"}; } } if ($mocs) { print STDOUT "==> mocs=[".$mocs."]\n" if ($verbose); my $sourcename = $program."_meta_unload"; my $ext = ($program =~ /_la$/) ? ".lo" : ".o"; my $srcfile = $sourcename.".$cxxsuffix"; my $objfile = $sourcename.$ext; $moc_class_headers .= " $srcfile"; my $appl; $appl = "$srcfile: $mocs\n"; $appl .= "\t\@echo 'creating $srcfile'\n"; $appl .= "\t-rm -f $srcfile\n"; $appl .= "\t\@echo 'static const char * _metalist_$program\[\] = {' > $srcfile\n"; $appl .= "\tcat $mocs | grep 'char.*className' | "; $appl .= "sed -e 's/.*[^A-Za-z0-9_:]\\([A-Za-z0-9_:]*\\)::className.*\$\$/\\\"\\1\\\",/' | sort | uniq >> $srcfile\n"; $appl .= "\t\@echo '0};' >> $srcfile\n"; $appl .= "\t\@echo '#include <kunload.h>' >> $srcfile\n"; $appl .= "\t\@echo '_UNLOAD($program)' >> $srcfile\n"; $appl .= "\n"; $realObjs{$program} .= " \034" . $objfile . " "; $sources{$program} .= " $srcfile"; # now also add a dependency for the C++ file which includes a # setMocClasses() call, and is part of this program (if any) #foreach $cppFile (@cppFiles) { #print STDOUT "testing $cppFile\n" if $verbose; #if (exists $shash{$cppFile}) { # $appl .= "\$(srcdir)/$cppFile: $header\n"; #} #} appendLines ($appl); } print STDOUT "\n" if $verbose; } if ($moc_class_headers) { appendLines ("$cleantarget-moc-classes:\n\t-rm -f $moc_class_headers\n"); $target_adds{"$cleantarget-am"} .= "$cleantarget-moc-classes "; }}#-----------------------------------------------------------------------------sub updateMakefile (){ return if ($dryrun); open (FILEOUT, "> $makefile") || die "Could not create $makefile: $!\n"; print FILEOUT "\# $progId - " . '$Revision: 1.200 $ ' . "\n"; $MakefileData =~ s/\034/\\\n/g; # Restore continuation lines print FILEOUT $MakefileData; close FILEOUT;}#-----------------------------------------------------------------------------# The given line needs to be removed from the makefile# Do this by adding the special "removed line" comment at the line start.sub removeLine ($$){ my ($lookup, $old) = @_; $old =~ s/\034/\\\n#>- /g; # Fix continuation lines $MakefileData =~ s/\n$lookup/\n#>\- $old/;}#-----------------------------------------------------------------------------# Replaces the old line with the new line# old line(s) are retained but tagged as removed. The new line(s) have the# "added" tag placed before it.sub substituteLine ($$){ my ($lookup, $new) = @_; if ($MakefileData =~ /\n($lookup)/) { $old = $1; $old =~ s/\034/\\\n#>\- /g; # Fix continuation lines $new =~ s/\034/\\\n/g; my $newCount = 1; $newCount++ while ($new =~ /\n/g); $MakefileData =~ s/\n$lookup/\n#>- $old\n#>\+ $newCount\n$new/; } else { print STDERR "Warning: substitution of \"$lookup\" in $printname failed\n"; }}#-----------------------------------------------------------------------------# Slap new lines on the back of the file.sub appendLines ($){ my ($new) = @_; $new =~ s/\034/\\\n/g; # Fix continuation lines my $newCount = 1; $newCount++ while ($new =~ /\n/g); $MakefileData .= "\n#>\+ $newCount\n$new";}#-----------------------------------------------------------------------------# Restore the Makefile.in to the state it was before we fiddled with itsub restoreMakefile (){ $MakefileData =~ s/# $progId[^\n\034]*[\n\034]*//g; # Restore removed lines $MakefileData =~ s/([\n\034])#>\- /$1/g; # Remove added lines while ($MakefileData =~ /[\n\034]#>\+ ([^\n\034]*)/) { my $newCount = $1; my $removeLines = ""; while ($newCount--) { $removeLines .= "[^\n\034]*([\n\034]|)"; } $MakefileData =~ s/[\n\034]#>\+.*[\n\034]$removeLines/\n/; }}#-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -