diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2011-12-03 13:29:22 +0100 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2011-12-03 13:29:22 +0100 |
commit | ca32f08966f1b51fcb19460f0996bb0c4048e6fe (patch) | |
tree | ec04cc15b867bc21eedca904cea9af0254531a11 /maintenance/hiphop | |
parent | a22fbfc60f36f5f7ee10d5ae6fe347340c2ee67c (diff) |
Update to MediaWiki 1.18.0
* also update ArchLinux skin to chagnes in MonoBook
* Use only css to hide our menu bar when printing
Diffstat (limited to 'maintenance/hiphop')
-rw-r--r-- | maintenance/hiphop/compiler.conf | 5 | ||||
-rw-r--r-- | maintenance/hiphop/extra-files | 35 | ||||
-rw-r--r-- | maintenance/hiphop/make | 308 | ||||
-rw-r--r-- | maintenance/hiphop/run-server | 75 | ||||
-rw-r--r-- | maintenance/hiphop/server.conf | 30 |
5 files changed, 453 insertions, 0 deletions
diff --git a/maintenance/hiphop/compiler.conf b/maintenance/hiphop/compiler.conf new file mode 100644 index 00000000..3e01640d --- /dev/null +++ b/maintenance/hiphop/compiler.conf @@ -0,0 +1,5 @@ +GenerateSourceInfo = true +EnableEval = 2 +AllDynamic = true +EnableHipHopSyntax = true +EnableHipHopExperimentalSyntax = true diff --git a/maintenance/hiphop/extra-files b/maintenance/hiphop/extra-files new file mode 100644 index 00000000..15f48577 --- /dev/null +++ b/maintenance/hiphop/extra-files @@ -0,0 +1,35 @@ +img_auth.php +includes/AjaxFunctions.php +includes/AutoLoader.php +includes/DefaultSettings.php +includes/Defines.php +includes/GlobalFunctions.php +includes/ImageFunctions.php +includes/OutputHandler.php +includes/ProxyTools.php +includes/SeleniumWebSettings.php +includes/Setup.php +includes/StreamFile.php +includes/WebStart.php +includes/filerepo/NullRepo.php +includes/normal/UtfNormalDefines.php +includes/normal/UtfNormalUtil.php +index.php +languages/Names.php +load.php +maintenance/Maintenance.php +maintenance/commandLine.inc +maintenance/doMaintenance.php +maintenance/eval.php +opensearch_desc.php +profileinfo.php +redirect.php +resources/Resources.php +serialized/serialize.php +skins/MonoBook.deps.php +skins/MonoBook.php +skins/Vector.deps.php +skins/Vector.php +thumb.php +trackback.php + diff --git a/maintenance/hiphop/make b/maintenance/hiphop/make new file mode 100644 index 00000000..e792e08b --- /dev/null +++ b/maintenance/hiphop/make @@ -0,0 +1,308 @@ +#!/usr/bin/hphpi -f +<?php + +require( dirname( __FILE__ ) . '/../Maintenance.php' ); + +class MakeHipHop extends Maintenance { + function execute() { + global $wgHipHopBuildDirectory; + + $startTime = time(); + + $thisDir = realpath( dirname( __FILE__ ) ); + $IP = realpath( "$thisDir/../.." ); + if ( strval( $wgHipHopBuildDirectory ) !== '' ) { + $buildDir = $wgHipHopBuildDirectory; + } else { + $buildDir = "$thisDir/build"; + } + $extensionsDir = realpath( MWInit::getExtensionsDirectory() ); + $outDir = "$buildDir/hiphop-output"; + $persistentDir = "$buildDir/persistent"; + + if ( !is_dir( $buildDir ) ) { + mkdir( $buildDir, 0777, true ); + } + if ( !is_dir( $persistentDir ) ) { + mkdir( $persistentDir, 0777, true ); + } + + if ( realpath( "$IP/../phase3" ) !== $IP + || realpath( "$IP/../extensions" ) !== $extensionsDir ) + { + # Set up a fake source directory with the correct layout + $sourceBase = "$buildDir/source"; + $this->setupFakeSourceBase( $IP, $extensionsDir, $sourceBase ); + } else { + $sourceBase = realpath( "$IP/.." ); + unlink( "$buildDir/source" ); + } + + # With the CentOS RPMs, you just get g++44, no g++, so we have to + # use the environment + if ( isset( $_ENV['CXX'] ) ) { + $cxx = $_ENV['CXX']; + } else { + $cxx = 'g++'; + } + + # Create a function that provides the HipHop compiler version, and + # doesn't exist when MediaWiki is invoked in interpreter mode. + $version = str_replace( PHP_EOL, ' ', trim( `hphp --version` ) ); + file_put_contents( + "$buildDir/HipHopCompilerVersion.php", + "<" . "?php\n" . + "function wfHipHopCompilerVersion() {\n" . + "return " . var_export( $version, true ) . ";\n" . + "}\n" + ); + + # Generate the file list + $files = $this->getFileList(); + file_put_contents( + "$buildDir/file-list", + implode( "\n", $files ) . "\n" ); + + # Generate the C++ + passthru( + 'hphp' . + ' --target=cpp' . + ' --format=file' . + ' --input-dir=' . wfEscapeShellArg( $sourceBase ) . + ' --input-list=' . wfEscapeShellArg( "$buildDir/file-list" ) . + ' --inputs=' . wfEscapeShellArg( "$buildDir/HipHopCompilerVersion.php" ) . + ' -c ' . wfEscapeShellArg( "$thisDir/compiler.conf" ) . + ' --parse-on-demand=false' . + ' --program=mediawiki-hphp' . + ' --output-dir=' . wfEscapeShellArg( $outDir ) . + ' --log=3', $ret ); + + if ( $ret ) { + $this->error( "hphp hit an error. Stopping build.\n" ); + exit( 1 ); + } + + # Sanity check, quickly make sure we've got an output directory + if( !is_dir( $outDir ) ) { + $this->error( "No output directory", true ); + } + + # Warn about volatile classes + $this->checkVolatileClasses( $outDir ); + + # Copy the generated C++ files into the source directory for cmake + $iter = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( $outDir ), + RecursiveIteratorIterator::SELF_FIRST ); + $sourceFiles = array(); + $regenerateMakefile = false; + $numFiles = 0; + $numFilesChanged = 0; + foreach ( $iter as $sourcePath => $file ) { + $name = substr( $sourcePath, strlen( $outDir ) + 1 ); + $sourceFiles[$name] = true; + $destPath = "$persistentDir/$name"; + if ( $file->isDir() ) { + if ( !is_dir( $destPath ) ) { + mkdir( $destPath ); + } + continue; + } + + $numFiles++; + # Remove any files that weren't touched, these may have been removed + # from file-list, we should not compile them + if ( $file->getMTime() < $startTime ) { + if ( file_exists( $destPath ) ) { + unlink( $destPath ); + # Files removed, regenerate the makefile + $regenerateMakefile = true; + } + unlink( $sourcePath ); + $numFilesChanged++; + continue; + } + + if ( file_exists( $destPath ) ) { + $sourceHash = md5( file_get_contents( $sourcePath ) ); + $destHash = md5( file_get_contents( $destPath ) ); + if ( $sourceHash == $destHash ) { + continue; + } + } else { + # New files added, regenerate the makefile + $regenerateMakefile = true; + } + $numFilesChanged++; + copy( $sourcePath, $destPath ); + } + + echo "MediaWiki: $numFilesChanged files changed out of $numFiles\n"; + + if ( !file_exists( "$persistentDir/CMakeLists.txt" ) ) { + # Run cmake for the first time + $regenerateMakefile = true; + } + + # Do our own version of $HPHP_HOME/bin/run.sh, which isn't so broken. + # HipHop's RELEASE mode seems to be stuck always on, so symbols get + # stripped. Also we will try keeping the generated .o files instead of + # throwing away hours of CPU time every time you make a typo. + + chdir( $persistentDir ); + + if ( $regenerateMakefile ) { + copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt', + "$persistentDir/CMakeLists.txt" ); + + if ( file_exists( "$persistentDir/CMakeCache.txt" ) ) { + unlink( "$persistentDir/CMakeCache.txt" ); + } + + $cmd = 'cmake' . + " -D CMAKE_BUILD_TYPE:string=" . wfEscapeShellArg( $GLOBALS['wgHipHopBuildType'] ) . + ' -D PROGRAM_NAME:string=mediawiki-hphp'; + + if ( file_exists( '/usr/bin/ccache' ) ) { + $cmd .= ' -D CMAKE_CXX_COMPILER:string=ccache' . + ' -D CMAKE_CXX_COMPILER_ARG1:string=' . wfEscapeShellArg( $cxx ); + } + + $cmd .= ' .'; + echo "$cmd\n"; + passthru( $cmd ); + } + + # Determine appropriate make concurrency + # Compilation can take a lot of memory, let's assume that that is limiting. + $procs = $this->getNumProcs(); + + # Run make. This is the slow step. + passthru( 'make -j' . wfEscapeShellArg( $procs ) ); + + $elapsed = time() - $startTime; + + echo "Completed in "; + if ( $elapsed >= 3600 ) { + $hours = floor( $elapsed / 3600 ); + echo $hours . 'h '; + $elapsed -= $hours * 3600; + } + if ( $elapsed >= 60 ) { + $minutes = floor( $elapsed / 60 ); + echo $minutes . 'm '; + $elapsed -= $minutes * 60; + } + echo $elapsed . "s\n"; + echo "The MediaWiki executable is at $buildDir/persistent/mediawiki-hphp\n"; + } + + function checkVolatileClasses( $dir ) { + $lines = file( "$dir/sys/dynamic_table_class.cpp" ); + $classes = array(); + foreach ( $lines as $line ) { + if ( preg_match( '/^\s+\(const char \*\)"([^"]*)", \(const char \*\)-1/', $line, $m ) ) { + $classes[] = $m[1]; + } + } + if ( !count( $classes ) ) { + print "No volatile classes found\n"; + return; + } + sort( $classes ); + $classes = array_unique( $classes ); + print "WARNING: The following classes are volatile: " . implode( ', ', $classes ) . "\n"; + } + + function getNumProcs() { + global $wgHipHopCompilerProcs; + if ( $wgHipHopCompilerProcs !== 'detect' ) { + return intval( $wgHipHopCompilerProcs ); + } + + if ( !file_exists( '/proc/meminfo' ) ) { + return 1; + } + $mem = false; + foreach ( file( '/proc/meminfo' ) as $line ) { + if ( preg_match( '/^MemTotal:\s+(\d+)\s+kB/', $line, $m ) ) { + $mem = intval( $m[1] ); + break; + } + } + if ( $mem ) { + // At least one process + return max( 1, floor( $mem / 1000000 ) ); + } else { + return 1; + } + } + + function setupFakeSourceBase( $phase3, $extensions, $dest ) { + if ( !file_exists( $dest ) ) { + mkdir( $dest, 0777, true ); + } + + $this->forceCreateLink( "$dest/phase3", $phase3 ); + $this->forceCreateLink( "$dest/extensions", $extensions ); + } + + function forceCreateLink( $target, $link ) { + if ( file_exists( $target ) ) { + if ( readlink( $target ) === $link ) { + return; + } + unlink( $target ); + } + symlink( $target, $link ); + } + + function getFileList() { + global $wgAutoloadClasses, $wgAutoloadLocalClasses, $wgCompiledFiles; + $inputFiles = array_merge( + array_values( $wgAutoloadClasses ), + array_values( $wgAutoloadLocalClasses ), + $wgCompiledFiles + ); + $processedFiles = array(); + foreach ( $inputFiles as $file ) { + if ( substr( $file, 0, 1 ) === '/' ) { + $processedFiles[] = $this->absoluteToRelative( $file ); + } elseif ( preg_match( '/^extensions/', $file ) ) { + $processedFiles[] = $file; + } else { + $processedFiles[] = "phase3/$file"; + } + } + + $extraCoreFiles = array_map( 'trim', file( dirname( __FILE__ ) . '/extra-files' ) ); + foreach ( $extraCoreFiles as $file ) { + if ( $file === '' ) { + continue; + } + $processedFiles[] = "phase3/$file"; + } + return array_unique( $processedFiles ); + } + + function absoluteToRelative( $file ) { + global $IP; + + $coreBase = realpath( $IP ) . '/'; + $extBase = realpath( MWInit::getExtensionsDirectory() ) . '/'; + $file = realpath( $file ); + + if ( substr( $file, 0, strlen( $extBase ) ) === $extBase ) { + return 'extensions/' . substr( $file, strlen( $extBase ) ); + } elseif ( substr( $file, 0, strlen( $coreBase ) ) === $coreBase ) { + return 'phase3/' . substr( $file, strlen( $coreBase ) ); + } else { + $this->error( "The following file is registered for compilation but is not in \$IP or " . + "\$wgExtensionsDirectory: $file \n" ); + exit( 1 ); + } + } +} + +$maintClass = 'MakeHipHop'; +require_once( RUN_MAINTENANCE_IF_MAIN ); diff --git a/maintenance/hiphop/run-server b/maintenance/hiphop/run-server new file mode 100644 index 00000000..0ad43134 --- /dev/null +++ b/maintenance/hiphop/run-server @@ -0,0 +1,75 @@ +#!/usr/bin/hphpi -f +<?php + +require( dirname( __FILE__ ) . '/../Maintenance.php' ); + +class RunHipHopServer extends Maintenance { + function __construct() { + parent::__construct(); + $this->addOption( 'interpret', 'Run in interpreted mode' ); + } + + function execute() { + if ( $this->hasOption( 'interpret' ) ) { + $this->runInterpreted(); + } else { + $this->runCompiled(); + } + } + + function runCompiled() { + global $wgHipHopBuildDirectory; + $thisDir = realpath( dirname( __FILE__ ) ); + $IP = realpath( "$thisDir/../.." ); + if ( strval( $wgHipHopBuildDirectory ) !== '' ) { + $buildDir = $wgHipHopBuildDirectory; + } else { + $buildDir = "$thisDir/build"; + } + + if ( file_exists( "$buildDir/source" ) ) { + $sourceBase = "$buildDir/source"; + } else { + $sourceBase = realpath( "$IP/.." ); + } + + passthru( + 'cd ' . wfEscapeShellArg( $sourceBase ) . " && " . + 'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' . + wfEscapeShellArg( + "$buildDir/persistent/mediawiki-hphp", + '-c', "$thisDir/server.conf", + '-v', "Server.SourceRoot=$sourceBase", + '-v', "Server.IncludeSearchPaths.0=$sourceBase", + '-v', 'ServerVariables.MW_COMPILED=1', + '--mode=server', + '--port=8080' + ), + $ret + ); + exit( $ret ); + } + + function runInterpreted() { + $thisDir = realpath( dirname( __FILE__ ) ); + $IP = realpath( "$thisDir/../.." ); + $sourceBase = realpath( "$IP/.." ); + + passthru( + 'cd ' . wfEscapeShellArg( $sourceBase ) . " && " . + 'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' . + wfEscapeShellArg( + 'hphpi', + '-c', "$thisDir/server.conf", + '-v', "Server.SourceRoot=$sourceBase", + '-v', "Server.IncludeSearchPaths.0=$sourceBase", + '--mode=server', + '--port=8080' + ), + $ret + ); + exit( $ret ); + } +} +$maintClass = 'RunHipHopServer'; +require_once( RUN_MAINTENANCE_IF_MAIN ); diff --git a/maintenance/hiphop/server.conf b/maintenance/hiphop/server.conf new file mode 100644 index 00000000..16af0f2f --- /dev/null +++ b/maintenance/hiphop/server.conf @@ -0,0 +1,30 @@ +Log { + Level = Warning + UseLogFile = true + NativeStackTrace = true + InjectedStackTrace = true +} +Debug { + FullBacktrace = true + ServerStackTrace = true + ServerErrorMessage = true + TranslateSource = true +} +Server { + EnableStaticContentCache = false + EnableStaticContentFromDisk = false + AlwaysUseRelativePath = true +} +VirtualHost { + * { + ServerName = localhost + Pattern = . + RewriteRules { + * { + pattern = ^/wiki/(.*)$ + to = /phase3/index.php?title=$1 + qsa = true + } + } + } +} |