]> granicus.if.org Git - php/commitdiff
Add dist target to makefile that will generate the file layout for
authorWez Furlong <wez@php.net>
Sat, 6 Dec 2003 16:14:03 +0000 (16:14 +0000)
committerWez Furlong <wez@php.net>
Sat, 6 Dec 2003 16:14:03 +0000 (16:14 +0000)
a win32 binary distro under build_dir/_dist_.
This isn't finalized yet, and you need Edin's distro template.

win32/build/Makefile
win32/build/config.w32
win32/build/mkdist.php [new file with mode: 0644]

index 1968267b10ff5ae3220697ba55f4a96deb8091b0..ca7159df13dd238d3b6f29faee12a7b5712f3241 100644 (file)
@@ -71,7 +71,10 @@ clean: clean-sapi
 
 test:
        <<test_suite_uses_lame_env_vars.bat
-set TEST_PHP_EXECUTABLE=$(BUILD_DIR)\\php.exe
-$(BUILD_DIR)\\php.exe -d open_basedir= -d safe_mode=0 -d output_buffering=0 run-tests.php $(TESTS)
+set TEST_PHP_EXECUTABLE=$(BUILD_DIR)\php.exe
+$(BUILD_DIR)\php.exe -d open_basedir= -d safe_mode=0 -d output_buffering=0 run-tests.php $(TESTS)
 <<NOKEEP
-       
+
+dist: all
+       $(BUILD_DIR)\php.exe win32/build/mkdist.php "$(BUILD_DIR)" "$(PHPDLL)" "$(SAPI_TARGETS)" "$(EXT_TARGETS)" "$(SNAPSHOT_TEMPLATE)"
+
index 15a63ed74bd20ed7ea9f5c403c8217e23d5b3bb7..6f9dc592df412086d9bd351bc3471a8eea22a584 100644 (file)
@@ -195,3 +195,15 @@ AC_DEFINE('HAVE_GETADDRINFO', main_network_has_ipv6);
 AC_DEFINE('HAVE_GAI_STRERROR', main_network_has_ipv6);
 AC_DEFINE('HAVE_IPV6', main_network_has_ipv6);
 
+/* For snapshot builders, where can we find the additional
+ * files that make up the snapshot template? */
+ARG_WITH("snapshot-template", "Path to snapshot builder template dir", "no");
+
+if (PHP_SNAPSHOT_TEMPLATE == "no") {
+       /* default is as a sibling of the php_build dir */
+       if (FSO.FolderExists(PHP_PHP_BUILD + "\\..\\template")) {
+               PHP_SNAPSHOT_TEMPLATE = FSO.GetAbsolutePathName(PHP_PHP_BUILD + "\\..\\template");
+       }
+}
+
+DEFINE('SNAPSHOT_TEMPLATE', PHP_SNAPSHOT_TEMPLATE);
diff --git a/win32/build/mkdist.php b/win32/build/mkdist.php
new file mode 100644 (file)
index 0000000..2131539
--- /dev/null
@@ -0,0 +1,257 @@
+<?php # $Id$
+/* piece together a windows binary distro */
+
+$build_dir = $argv[1];
+$phpdll = $argv[2];
+$sapi_targets = explode(" ", $argv[3]);
+$ext_targets = explode(" ", $argv[4]);
+$snapshot_template = $argv[5];
+
+$is_debug = preg_match("/^debug/i", $build_dir);
+
+echo "Making dist for $build_dir\n";
+
+$dist_dir = $build_dir . "/_dist_";
+@mkdir($dist_dir);
+@mkdir("$dist_dir/sapi");
+@mkdir("$dist_dir/ext");
+@mkdir("$dist_dir/dev");
+@mkdir("$dist_dir/dlls");
+@mkdir("$dist_dir/extras");
+
+/* figure out additional DLL's that are required */
+$extra_dll_deps = array();
+$per_module_deps = array();
+
+function get_depends($module)
+{
+       static $no_dist = array(
+               /* windows system dlls that should not be bundled */
+               'advapi32.dll', 'comdlg32.dll', 'gdi32.dll', 'kernel32.dll', 'ntdll.dll',
+               'odbc32.dll', 'ole32.dll', 'oleaut32.dll', 'rpcrt4.dll',
+               'shell32.dll', 'shlwapi.dll', 'user32.dll', 'ws2_32.dll', 'ws2help.dll',
+               'comctl32.dll', 'winmm.dll', 'wsock32.dll',
+
+               /* apache */
+               'apachecore.dll',
+
+               /* visual C++; mscvrt.dll is present on everyones system,
+                * but the debug version (msvcrtd.dll) and those from visual studio.net
+                * (msvcrt7x.dll) are not */
+               'msvcrt.dll',
+
+               );
+       global $build_dir, $extra_dll_deps, $ext_targets, $sapi_targets, $phpdll, $per_module_deps;
+       
+       $bd = strtolower(realpath($build_dir));
+
+       $csvname = tempnam($GLOBALS['build_dir'], '_dep');
+       system("depends.exe /c /f:1 /oc:\"$csvname\" \"$module\"", $retcode);
+       $fp = fopen($csvname, "r");
+       $headers = fgetcsv($fp);
+       $n = 0;
+       while (($line = fgetcsv($fp))) {
+               $n++;
+               if ($line[0] == 'D')
+                       continue;
+
+               $dep = strtolower($line[1]);
+               $depbase = basename($dep);
+               /* ignore stuff in our build dir, but only if it is
+            * on of our targets */
+               if (0 == strncmp($dep, $bd, strlen($bd)) &&
+                               (in_array($depbase, $sapi_targets) ||
+                               in_array($depbase, $ext_targets)) ||
+                               $depbase == $phpdll) {
+                       continue;
+               }
+               /* ignore some well-known system dlls */
+               if (in_array(basename($dep), $no_dist)) {
+                       continue;
+               }
+               
+               if (!in_array($dep, $extra_dll_deps)) {
+                       $extra_dll_deps[] = $dep;
+               }
+
+               $per_module_deps[basename($module)][] = $dep;
+       }
+       fclose($fp);
+       unlink($csvname);
+//echo "Module $module [$n lines]\n";
+}
+
+function copy_file_list($source_dir, $dest_dir, $list)
+{
+       global $is_debug, $dist_dir;
+
+       foreach ($list as $item) {
+               echo "Copying $item from $source_dir to $dest_dir\n";
+               copy($source_dir . DIRECTORY_SEPARATOR . $item, $dest_dir . DIRECTORY_SEPARATOR . $item);
+               if ($is_debug) {
+                       $itemdb = preg_replace("/\.(exe|dll)$/i", ".pdb", $item);
+                       if (file_exists("$source_dir/$itemdb")) {
+                               copy("$source_dir/$itemdb", "$dist_dir/dev/$itemdb");
+                       }
+               }
+               if (preg_match("/\.(exe|dll)$/i", $item)) {
+                       get_depends($source_dir . '/' . $item);
+               }
+       }
+}
+
+function copy_text_file($source, $dest)
+{
+       $text = file_get_contents($source);
+       $text = str_replace("\n", "\r\n", $text);
+       $fp = fopen($dest, "w");
+       fwrite($fp, $text);
+       fclose($fp);
+}
+
+/* the core dll */
+copy("$build_dir/php.exe", "$dist_dir/php.exe");
+copy("$build_dir/$phpdll", "$dist_dir/$phpdll");
+
+/* and the .lib goes into dev */
+$phplib = str_replace(".dll", ".lib", $phpdll);
+copy("$build_dir/$phplib", "$dist_dir/dev/$phplib");
+/* debug builds; copy the symbols too */
+if ($is_debug) {
+       $phppdb = str_replace(".dll", ".pdb", $phpdll);
+       copy("$build_dir/$phppdb", "$dist_dir/dev/$phppdb");
+}
+/* copy the sapi */
+copy_file_list($build_dir, "$dist_dir/sapi", $sapi_targets);
+
+/* copy the extensions */
+copy_file_list($build_dir, "$dist_dir/ext", $ext_targets);
+
+/* populate reading material */
+$text_files = array(
+       "LICENSE" =>            "license.txt",
+       "NEWS" =>                       "news.txt",
+       "php.ini-dist" =>       "php.ini-dist",
+       "php.ini-recommended" => "php.ini-recommended",
+);
+
+foreach ($text_files as $src => $dest) {
+       copy_text_file($src, $dist_dir . '/' . $dest);
+}
+
+/* general other files */
+$general_files = array(
+       "win32/install.txt" =>  "install.txt",
+       "php.gif"                       =>      "php.gif",
+);
+
+foreach ($general_files as $src => $dest) {
+       copy($src, $dist_dir . '/' . $dest);
+}
+
+/* include a snapshot identifier */
+$branch = "HEAD"; // TODO - determine this from CVS/Entries 
+$fp = fopen("$dist_dir/snapshot.txt", "w");
+$now = date("r");
+$version = phpversion();
+fwrite($fp, <<<EOT
+This snapshot was automatically generated on
+$now
+
+Version: $version
+Branch: $branch
+Build: $build_dir
+
+EOT
+);
+/* list build-in extensions */
+$exts = get_loaded_extensions();
+fprintf($fp, "\r\nBuild-in Extensions\r\n");
+foreach ($exts as $ext) {
+       fprintf($fp, "%s\r\n", $ext);
+}
+fwrite($fp, "\r\n\r\n");
+
+/* list dependencies */
+fprintf($fp, "Dependency information:\r\n");
+foreach ($per_module_deps as $modulename => $deps) {
+       fprintf($fp, "Module: %s\r\n", $modulename);
+       fwrite($fp, "===========================\r\n");
+       foreach ($deps as $dll) {
+               fprintf($fp, "\t%s\r\n", basename($dll));
+       }
+       fwrite($fp, "\r\n");
+}
+fclose($fp);
+
+/* Now add those dependencies */
+foreach ($extra_dll_deps as $dll) {
+       if (!file_exists($dll)) {
+               /* try template dir */
+               $tdll = $snapshot_template . "/dlls/" . basename($dll);
+               if (!file_exists($tdll)) {
+                       echo "WARNING: distro depends on $dll, but could not find it on your system\n";
+                       continue;
+               }
+               $dll = $tdll;
+       }
+       copy($dll, "$dist_dir/dlls/" . basename($dll));
+}
+
+function copy_dir($source, $dest)
+{
+       if (!is_dir($dest)) {
+               if (!mkdir($dest)) {
+                       return false;
+               }
+       }
+
+       $d = opendir($source);
+       while (($f = readdir($d)) !== false) {
+               if ($f == '.' || $f == '..' || $f == 'CVS') {
+                       continue;
+               }
+               $fs = $source . '/' . $f;
+               $fd = $dest . '/' . $f;
+               if (is_dir($fs)) {
+                       copy_dir($fs, $fd);
+               } else {
+                       copy($fs, $fd);
+               }
+       }
+       closedir($d);
+}
+
+/* add extras from the template dir */
+if (file_exists($snapshot_template)) {
+       $items = glob("$snapshot_template/*");
+       print_r($items);
+
+       foreach ($items as $item) {
+               $bi = basename($item);
+               if (is_dir($item)) {
+                       if ($bi == 'dlls' || $bi == 'symbols') {
+                               continue;
+                       } else if ($bi == 'PEAR') {
+                               /* copy to top level */
+                               copy_dir($item, "$dist_dir/$bi");
+                       } else {
+                               /* copy that dir into extras */
+                               copy_dir($item, "$dist_dir/extras/$bi");
+                       }
+               } else {
+                       if ($bi == 'go-pear.bat') {
+                               /* copy to top level */
+                               copy($item, "$dist_dir/$bi");
+                       } else {
+                               /* copy to extras */
+                               copy($item, "$dist_dir/extras/$bi");
+                       }
+               }
+       }
+} else {
+       echo "WARNING: you don't have a snapshot template\n";
+       echo "         your dist will not complete\n";
+}
+
+?>