mirror of
https://github.com/php-win-ext/php-sdk-binary-tools.git
synced 2026-03-24 09:02:12 +01:00
Compare commits
107 Commits
php-sdk-2.
...
php-sdk-2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bebb84afd7 | ||
|
|
841065efd4 | ||
|
|
c726890170 | ||
|
|
b2e52e36d8 | ||
|
|
b8713d8543 | ||
|
|
025290f6d3 | ||
|
|
1ed89bbba2 | ||
|
|
1d4f4966af | ||
|
|
a5b1137938 | ||
|
|
908f5eeea7 | ||
|
|
a7cc2823bf | ||
|
|
ff6a7245a3 | ||
|
|
9bb1377d59 | ||
|
|
95d712bde7 | ||
|
|
446f4272fe | ||
|
|
f6b6bd96e0 | ||
|
|
94b3d07034 | ||
|
|
6797238516 | ||
|
|
02f2f372b6 | ||
|
|
04832718bb | ||
|
|
b52a0c281a | ||
|
|
bc3606fbaf | ||
|
|
41a63dc0b4 | ||
|
|
99ae3ca016 | ||
|
|
777542838c | ||
|
|
82987940a0 | ||
|
|
45344d7691 | ||
|
|
02a726256a | ||
|
|
0a7732ba09 | ||
|
|
8583bb4f00 | ||
|
|
d6fc46edfd | ||
|
|
75740674e5 | ||
|
|
e81199f9af | ||
|
|
134556d419 | ||
|
|
6121772665 | ||
|
|
61dff2296a | ||
|
|
1b8473489f | ||
|
|
e494a28d4c | ||
|
|
22addaf53e | ||
|
|
bb8e318a4a | ||
|
|
87b60bc9d5 | ||
|
|
4936f1d7ca | ||
|
|
7d56095191 | ||
|
|
27c3431e92 | ||
|
|
e5ef707fa0 | ||
|
|
7df3de21ce | ||
|
|
64b37312f7 | ||
|
|
4a219a0d93 | ||
|
|
5d97e8e483 | ||
|
|
9a0f799055 | ||
|
|
4f5028d87a | ||
|
|
93437db5ae | ||
|
|
0572a3ec52 | ||
|
|
52badef774 | ||
|
|
b01fcd36e7 | ||
|
|
fbc6c40761 | ||
|
|
7501f5e567 | ||
|
|
e51c37a375 | ||
|
|
bd0ab3474c | ||
|
|
056e5643fb | ||
|
|
e039de13c4 | ||
|
|
59926c2903 | ||
|
|
7d2b6cf86f | ||
|
|
29d54c140e | ||
|
|
2ef8899939 | ||
|
|
c259e440b6 | ||
|
|
5470b5ae58 | ||
|
|
795ac45864 | ||
|
|
77408342bc | ||
|
|
f9aff35c14 | ||
|
|
a827b2f18f | ||
|
|
5352b3744a | ||
|
|
d816060d55 | ||
|
|
da1e89d23a | ||
|
|
eb3904741a | ||
|
|
6dc9fd3293 | ||
|
|
1d2dae619e | ||
|
|
2a7f364792 | ||
|
|
36570ced8e | ||
|
|
7f75a93bdd | ||
|
|
44925fe946 | ||
|
|
e8d07f824b | ||
|
|
a5426ba7bb | ||
|
|
871816e56c | ||
|
|
70c3290c08 | ||
|
|
d84784d37a | ||
|
|
8ad74abf3f | ||
|
|
9ad145c154 | ||
|
|
f3001d950e | ||
|
|
01ab6a1bad | ||
|
|
659fb3a71d | ||
|
|
d7dcab4c2f | ||
|
|
15ec0845c4 | ||
|
|
a1bab3dc92 | ||
|
|
08b81a4ffc | ||
|
|
569072060e | ||
|
|
b13a2df162 | ||
|
|
96fa91e16a | ||
|
|
8ad971020a | ||
|
|
386d36c251 | ||
|
|
bd9c9ca4d8 | ||
|
|
1d6561c7d5 | ||
|
|
307c5ed4bc | ||
|
|
c6874e5109 | ||
|
|
c3cf4266ad | ||
|
|
01e4fff84a | ||
|
|
4357adc956 |
56
README.md
56
README.md
@@ -12,8 +12,8 @@ The PHP SDK 2.0+ is compatible with PHP 7.0 and above. The compatibility with [o
|
||||
|
||||
# Requirements
|
||||
|
||||
- `Visual C++ 2015` or `Visual C++ 2017` must be installed prior SDK usage
|
||||
- if `Cygwin` is installed, please read notes in the pitfalls section
|
||||
- `Visual C++ 2015` or `Visual C++ 2017` must be installed prior SDK usage (be sure to install both the C++ and the Windows SDK components)
|
||||
- if `Cygwin`, `MingW` or any other cross solution is installed, please read notes in the pitfalls section
|
||||
- if a 64-bit build is intended, a 64-bit system is required. Cross compilation of 64-bit on 32-bit system is not supported at the moment
|
||||
- The PHP SDK was successfully tested on Windows 7 or later, earlier versions might work but are not recommended
|
||||
|
||||
@@ -33,7 +33,7 @@ All the tools included are either scripts or 32-bit binaries. They are therefore
|
||||
|
||||
## Other tools
|
||||
|
||||
- `bison` 3.0.4, `re2c` 1.0.3, `lemon`
|
||||
- `bison` 3.2.4, `re2c` 1.1.1, `lemon`
|
||||
- `awk`, `gawk`, `sed`, `grep`
|
||||
- `diff`, `diff3`, `patch`
|
||||
- `md5sum`, `sha1sum`, `sha224sum`, `sha256sum`, `sha384sum`, `sha512sum`
|
||||
@@ -62,7 +62,7 @@ It is not required to hold the source in the PHP SDK directory. It could be usef
|
||||
|
||||
- `git clone https://github.com/Microsoft/php-sdk-binary-tools.git c:\php-sdk`
|
||||
- `cd c:\php-sdk`
|
||||
- `git checkout php-sdk-2.0.12` or later
|
||||
- `git checkout php-sdk-2.1.9` or later
|
||||
- invoke `phpsdk-vc15-x64.bat`
|
||||
- `phpsdk_buildtree phpmaster`
|
||||
- `git clone https://github.com/php/php-src.git && cd php-src`, or fetch a zipball
|
||||
@@ -138,6 +138,51 @@ After a training case is implemented and put under `pgo/cases`, the work environ
|
||||
|
||||
To skip a training case, add a file named `inactive` into the case folder.
|
||||
|
||||
# Debugging PHP
|
||||
|
||||
This part covers debugging possibilities for the builds produced by the native VS compilers.
|
||||
For the cross compiled builds produced with toolsets other than VC++, please check the
|
||||
documentation for the corresponding toolsets. In any case, general principles on debugging
|
||||
native programs apply.
|
||||
|
||||
Either a debug build of PHP or enabled debug symbols are required to be able to debug PHP.
|
||||
A debug build is usually more suitable for the development process and can be produced by
|
||||
adding `--enable-debug` to the configure options. A release build with debug symbols can
|
||||
be produced by adding `--enable-debug-pack`. These options are mutually exclusive.
|
||||
|
||||
## Debugging with Visual Studio
|
||||
|
||||
- Configure with either `--enable-debug` or `--enable-debug-pack`.
|
||||
- A debug build might bring better experience for dev, but sometimes you want to debug a release build.
|
||||
- `nmake run ARGS=yourscript.php DEBUGGER=1`, that will open a Visual Studio window.
|
||||
- Any additional runtime options for PHP or the script executed go to ARGS, too.
|
||||
- Select `Debug -> New Breakpoint -> Function Breakpoint` and add a function where the debugger should break.
|
||||
- Click `Start`.
|
||||
|
||||
Adding a breakpoint before starting debugging might be not necessary, if a crash is debugged. When such a script runs
|
||||
under the debugger, the debugger will stop at the crashing point. In that case, a breakpoint can be added
|
||||
around the crashed code directly.
|
||||
|
||||
## Debugging test suite with Visual Studio
|
||||
|
||||
The [Microsoft Child Process Debugging Power Tool](https://marketplace.visualstudio.com/items?itemName=vsdbgplat.MicrosoftChildProcessDebuggingPowerTool)
|
||||
plugin for Visual Studio is required. After installing it, following these steps
|
||||
|
||||
- `nmake test TESTS=ext/myext/tests/sometest.phpt DEBUGGER=1`
|
||||
- Select `Debug -> Other Debug Targets -> Child Process Debugging Settings` and enable child process debugging.
|
||||
- If necessary, add a breakpoint and start debugging as described in the previous section.
|
||||
|
||||
## Debugging with WinDbg
|
||||
|
||||
PHP can also be debugged with the tools from the WinDbg package. There is currently no way
|
||||
implemented in the Makefile to start the WinDbg integrated, so it needs to de done manually.
|
||||
Either a debug build or a release build with debug symbols is still required, as described
|
||||
previously.
|
||||
|
||||
# Support
|
||||
|
||||
- Join `#winphp-dev` on Freenode to discuss any ideas or questions
|
||||
- File an issue on GitHub
|
||||
|
||||
# Pitfalls
|
||||
|
||||
@@ -150,5 +195,6 @@ To skip a training case, add a file named `inactive` into the case folder.
|
||||
- The VC++ toolset is still requried, even if another compiler, fe. clang, is intended to be used.
|
||||
- `task.exe` is not a console application, some systems might not propagate exit code except the batch is explicitly run from `cmd /c`, etc.
|
||||
- `7za` should be prefered over `unzip` and `zip` for compatibility reasons.
|
||||
|
||||
- If you experince some strange crashes on MSYS2 tools, try the phpsdk_rebase_msys2 tool. MSYS2 tools might be have unstable
|
||||
on ASLR enabled systems.
|
||||
|
||||
|
||||
BIN
bin/7za.dll
BIN
bin/7za.dll
Binary file not shown.
BIN
bin/7za.exe
BIN
bin/7za.exe
Binary file not shown.
BIN
bin/7zxa.dll
BIN
bin/7zxa.dll
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/php/php.exe
BIN
bin/php/php.exe
Binary file not shown.
BIN
bin/php/php7.dll
BIN
bin/php/php7.dll
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
include dirname(__FILE__) . "/../lib/php/autoload.php";
|
||||
include __DIR__ . "/../lib/php/autoload.php";
|
||||
|
||||
use SDK\{Config, Exception};
|
||||
|
||||
@@ -36,7 +36,7 @@ try {
|
||||
switch ($name) {
|
||||
default:
|
||||
throw new Exception("Unknown switch '$name'");
|
||||
break;
|
||||
break;
|
||||
|
||||
case "h":
|
||||
case "help":
|
||||
|
||||
@@ -29,10 +29,10 @@ $flags = 0;
|
||||
$opt = getopt($sopt, $lopt);
|
||||
foreach ($opt as $name => $val) {
|
||||
switch ($name) {
|
||||
case "p":
|
||||
case "pretty":
|
||||
$flags = JSON_PRETTY_PRINT;
|
||||
break;
|
||||
case "p":
|
||||
case "pretty":
|
||||
$flags = JSON_PRETTY_PRINT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,16 +85,16 @@ foreach ($dirs as $path) {
|
||||
|
||||
$dlls = array();
|
||||
|
||||
for( $i = 0; $i < $zip->numFiles; $i++ ){
|
||||
$stat = $zip->statIndex( $i );
|
||||
|
||||
for ($i = 0; $i < $zip->numFiles; $i++) {
|
||||
$stat = $zip->statIndex($i);
|
||||
|
||||
if (substr($stat['name'], -3) != "dll") {
|
||||
continue;
|
||||
}
|
||||
|
||||
$dlls[] = basename($stat['name']);
|
||||
}
|
||||
|
||||
|
||||
$zip->close();
|
||||
unset($zip);
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?php
|
||||
|
||||
include dirname(__FILE__) . "/../lib/php/autoload.php";
|
||||
include __DIR__ . "/../lib/php/autoload.php";
|
||||
|
||||
use SDK\Config;
|
||||
use SDK\Exception;
|
||||
use SDK\Build\PGO\Controller;
|
||||
|
||||
$sopt = "itudhs:fr";
|
||||
$lopt = array("init", "train", "up", "down", "help", "scenario:", "force", "ready");
|
||||
$sopt = "itudhs:frc:";
|
||||
$lopt = array("init", "train", "up", "down", "help", "scenario:", "force", "ready", "cases:");
|
||||
|
||||
$cmd = NULL;
|
||||
/* TODO For now we simply check the current php build, this could be extended to take arbitrary binaries. */
|
||||
@@ -15,42 +15,48 @@ $deps_root = NULL;
|
||||
$php_root = NULL;
|
||||
$scenario = NULL;
|
||||
$force = false;
|
||||
$cases = NULL;
|
||||
|
||||
try {
|
||||
$opt = getopt($sopt, $lopt);
|
||||
foreach ($opt as $name => $val) {
|
||||
switch ($name) {
|
||||
case "i":
|
||||
case "init":
|
||||
$cmd = "init";
|
||||
break;
|
||||
case "ready":
|
||||
$cmd = "check_init";
|
||||
break;
|
||||
case "t":
|
||||
case "train":
|
||||
$cmd = "train";
|
||||
break;
|
||||
case "u":
|
||||
case "up":
|
||||
$cmd = "up";
|
||||
break;
|
||||
case "d":
|
||||
case "down":
|
||||
$cmd = "down";
|
||||
break;
|
||||
case "s":
|
||||
case "scenario":
|
||||
$scenario = $val;
|
||||
break;
|
||||
case "f":
|
||||
case "force":
|
||||
$force = true;
|
||||
break;
|
||||
case "h": case "help":
|
||||
usage(0);
|
||||
break;
|
||||
|
||||
case "i":
|
||||
case "init":
|
||||
$cmd = "init";
|
||||
break;
|
||||
case "ready":
|
||||
$cmd = "check_init";
|
||||
break;
|
||||
case "t":
|
||||
case "train":
|
||||
$cmd = "train";
|
||||
break;
|
||||
case "u":
|
||||
case "up":
|
||||
$cmd = "up";
|
||||
break;
|
||||
case "d":
|
||||
case "down":
|
||||
$cmd = "down";
|
||||
break;
|
||||
case "s":
|
||||
case "scenario":
|
||||
$scenario = $val;
|
||||
break;
|
||||
case "f":
|
||||
case "force":
|
||||
$force = true;
|
||||
break;
|
||||
/* XXX This option is for now only integrated for training. It
|
||||
would make sense to integrate it also with init. */
|
||||
case "c":
|
||||
case "cases":
|
||||
$cases = explode(",", $val);
|
||||
break;
|
||||
case "h": case "help":
|
||||
usage(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,7 +79,7 @@ try {
|
||||
}
|
||||
}
|
||||
|
||||
$controller = new Controller($cmd, $scenario);
|
||||
$controller = new Controller($cmd, $scenario, $cases);
|
||||
$controller->handle($force);
|
||||
|
||||
if ("check_init" == $cmd) {
|
||||
@@ -105,6 +111,7 @@ function usage(int $code = -1)
|
||||
echo " -d --down Shutdown training environment.", PHP_EOL;
|
||||
echo " -f --force Force requested operation. Not every option can be forced.", PHP_EOL;
|
||||
echo " -s --scenario Run training with a specified scenario.", PHP_EOL;
|
||||
echo " -c --cases Run training with specified cases only. If omited, all the active cases will be used.", PHP_EOL;
|
||||
|
||||
/*echo " -p --php-root PHP binary to train.", PHP_EOL;*/
|
||||
|
||||
|
||||
40
bin/phpsdk_rebase_msys2.cmd
Normal file
40
bin/phpsdk_rebase_msys2.cmd
Normal file
@@ -0,0 +1,40 @@
|
||||
@echo off
|
||||
|
||||
setlocal enableextensions enabledelayedexpansion
|
||||
|
||||
set PHPSDK_MSYS2_BASE_ADDR=0x70000000
|
||||
set PHPSDK_MSYS2_BASE_DYNAMIC=0
|
||||
|
||||
:getopt
|
||||
if /i "%1" equ "--help" goto help
|
||||
if /i "%1" equ "--addr" (
|
||||
set PHPSDK_MSYS2_BASE_ADDR=%2 & shift
|
||||
for /l %%a in (1,1,100) do if "!PHPSDK_MSYS2_BASE_ADDR:~-1!"==" " set PHPSDK_MSYS2_BASE_ADDR=!PHPSDK_MSYS2_BASE_ADDR:~0,-1!
|
||||
)
|
||||
shift
|
||||
if /i "%1" equ "--dynamic" (
|
||||
set PHPSDK_MSYS2_BASE_DYNAMIC=1
|
||||
shift
|
||||
)
|
||||
if not (%1)==() goto getopt
|
||||
|
||||
IF "1" EQU "%PHPSDK_MSYS2_BASE_DYNAMIC%" (
|
||||
echo Rebasing MSYS2 DLLs to load at a dynamic address
|
||||
editbin /NOLOGO /DYNAMICBASE %PHP_SDK_ROOT_PATH%\msys2\usr\bin\*.dll
|
||||
) else (
|
||||
echo Rebasing MSYS2 DLLs to load at %PHPSDK_MSYS2_BASE_ADDR%
|
||||
editbin /NOLOGO /REBASE:BASE=%PHPSDK_MSYS2_BASE_ADDR%,DOWN %PHP_SDK_ROOT_PATH%\msys2\usr\bin\*.dll
|
||||
)
|
||||
|
||||
set PHPSDK_MSYS2_BASE_ADDR=
|
||||
set PHPSDK_MSYS2_BASE_DYNAMIC=
|
||||
|
||||
GOTO EXIT
|
||||
|
||||
:help
|
||||
echo phpsdk_rebase_msys2 ^<address^>
|
||||
echo Rebase MSYS2 DLLs to the given address. If ommited, default is 0x70000000.
|
||||
|
||||
:EXIT
|
||||
exit /b %errorlevel%
|
||||
|
||||
BIN
bin/sqlite3.exe
Normal file
BIN
bin/sqlite3.exe
Normal file
Binary file not shown.
BIN
bin/vswhere.exe
BIN
bin/vswhere.exe
Binary file not shown.
144
doc/task.c
144
doc/task.c
@@ -1,72 +1,72 @@
|
||||
/**
|
||||
* Run the passed command line hidden, suitable for a scheduled task.
|
||||
* Author: Anatol Belski <ab@php.net>
|
||||
* License: BSD 2-Clause
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define CMD_PRE "cmd.exe /c "
|
||||
#define CMD_PRE_LEN (sizeof(CMD_PRE)-1)
|
||||
|
||||
#ifdef DEBUG
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
#else
|
||||
int
|
||||
APIENTRY WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPTSTR in_cmd, int show)
|
||||
#endif
|
||||
{
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
DWORD exit_code;
|
||||
|
||||
char *cmd = NULL;
|
||||
size_t cmd_len = 0, arg_len = 0;
|
||||
char *arg = strchr(GetCommandLine(), ' ');
|
||||
|
||||
if (!arg) {
|
||||
return 3;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf("passed cmd: '%s'\n", arg);
|
||||
#endif
|
||||
|
||||
arg_len = strlen(arg);
|
||||
cmd_len = CMD_PRE_LEN + arg_len + 1;
|
||||
|
||||
cmd = malloc(cmd_len * sizeof(char));
|
||||
memmove(cmd, CMD_PRE, CMD_PRE_LEN);
|
||||
memmove(cmd + CMD_PRE_LEN, arg, arg_len);
|
||||
cmd[cmd_len-1] = '\0';
|
||||
#ifdef DEBUG
|
||||
printf("constructed cmd: '%s'\n", cmd);
|
||||
#endif
|
||||
|
||||
ZeroMemory( &si, sizeof(si) );
|
||||
si.cb = sizeof(si);
|
||||
si.dwFlags = STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow = SW_HIDE;
|
||||
ZeroMemory( &pi, sizeof(pi) );
|
||||
|
||||
if (CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
|
||||
CloseHandle( pi.hThread );
|
||||
} else {
|
||||
free(cmd);
|
||||
printf( "Error: CreatePracess 0x%08lx \n", GetLastError() );
|
||||
return 3;
|
||||
}
|
||||
|
||||
WaitForSingleObject( pi.hProcess, INFINITE );
|
||||
|
||||
GetExitCodeProcess(pi.hProcess, &exit_code);
|
||||
|
||||
CloseHandle( pi.hProcess );
|
||||
|
||||
free(cmd);
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the passed command line hidden, suitable for a scheduled task.
|
||||
* Author: Anatol Belski <ab@php.net>
|
||||
* License: BSD 2-Clause
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define CMD_PRE "cmd.exe /c "
|
||||
#define CMD_PRE_LEN (sizeof(CMD_PRE)-1)
|
||||
|
||||
#ifdef DEBUG
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
#else
|
||||
int
|
||||
APIENTRY WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPTSTR in_cmd, int show)
|
||||
#endif
|
||||
{
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
DWORD exit_code;
|
||||
|
||||
char *cmd = NULL;
|
||||
size_t cmd_len = 0, arg_len = 0;
|
||||
char *arg = strchr(GetCommandLine(), ' ');
|
||||
|
||||
if (!arg) {
|
||||
return 3;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf("passed cmd: '%s'\n", arg);
|
||||
#endif
|
||||
|
||||
arg_len = strlen(arg);
|
||||
cmd_len = CMD_PRE_LEN + arg_len + 1;
|
||||
|
||||
cmd = malloc(cmd_len * sizeof(char));
|
||||
memmove(cmd, CMD_PRE, CMD_PRE_LEN);
|
||||
memmove(cmd + CMD_PRE_LEN, arg, arg_len);
|
||||
cmd[cmd_len-1] = '\0';
|
||||
#ifdef DEBUG
|
||||
printf("constructed cmd: '%s'\n", cmd);
|
||||
#endif
|
||||
|
||||
ZeroMemory( &si, sizeof(si) );
|
||||
si.cb = sizeof(si);
|
||||
si.dwFlags = STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow = SW_HIDE;
|
||||
ZeroMemory( &pi, sizeof(pi) );
|
||||
|
||||
if (CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
|
||||
CloseHandle( pi.hThread );
|
||||
} else {
|
||||
free(cmd);
|
||||
printf( "Error: CreatePracess 0x%08lx \n", GetLastError() );
|
||||
return 3;
|
||||
}
|
||||
|
||||
WaitForSingleObject( pi.hProcess, INFINITE );
|
||||
|
||||
GetExitCodeProcess(pi.hProcess, &exit_code);
|
||||
|
||||
CloseHandle( pi.hProcess );
|
||||
|
||||
free(cmd);
|
||||
|
||||
return exit_code;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
spl_autoload_register(function($name) {
|
||||
$fl = dirname(__FILE__) . DIRECTORY_SEPARATOR . "libsdk" . DIRECTORY_SEPARATOR . $name . ".php";
|
||||
$fl = __DIR__ . DIRECTORY_SEPARATOR . "libsdk" . DIRECTORY_SEPARATOR . $name . ".php";
|
||||
|
||||
if (file_exists($fl)) {
|
||||
require_once $fl;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace SDK\Build\Dependency;
|
||||
|
||||
use SDK\{Config, Exception, FileOps};
|
||||
use SDK\{Exception, FileOps};
|
||||
|
||||
class Fetcher
|
||||
{
|
||||
@@ -13,6 +13,7 @@ class Fetcher
|
||||
protected $stability;
|
||||
protected $arch;
|
||||
protected $series;
|
||||
protected $scheme;
|
||||
|
||||
|
||||
public function __construct(string $host, int $port, string $scheme = "https", string $arch = NULL, string $stability = NULL, Series $series = NULL)
|
||||
@@ -22,6 +23,7 @@ class Fetcher
|
||||
$this->host = $host;
|
||||
$this->port = $port;
|
||||
$this->scheme = $scheme;
|
||||
$this->series = $series;
|
||||
}/*}}}*/
|
||||
|
||||
public function getSeries() : Series
|
||||
|
||||
@@ -11,6 +11,7 @@ class Manager
|
||||
protected $stability;
|
||||
protected $arch;
|
||||
protected $path;
|
||||
protected $cache;
|
||||
protected $series;
|
||||
protected $fetcher;
|
||||
protected $updatesFlag = NULL;
|
||||
@@ -41,7 +42,7 @@ class Manager
|
||||
|
||||
public function updatesAvailable() : bool
|
||||
{/*{{{*/
|
||||
if (!is_null($this->updatesFlag)) {
|
||||
if (NULL !== $this->updatesFlag) {
|
||||
return $this->updatesFlag;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,6 @@ class Series
|
||||
|
||||
public function getName() : string
|
||||
{/*{{{*/
|
||||
$base = Config::getDepsBaseUri();
|
||||
$branch_data = Config::getCurrentBranchData();
|
||||
|
||||
$file = "packages-" . Config::getCurrentBranchName() . "-{$branch_data['crt']}-{$this->arch}-{$this->stability}.txt";
|
||||
|
||||
@@ -2,15 +2,17 @@
|
||||
|
||||
namespace SDK\Build\PGO\Abstracts;
|
||||
|
||||
use SDK\Build\PGO\Interfaces\Server;
|
||||
use SDK\Build\PGO\PHP\CLI;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\{Config as SDKConfig, Exception};
|
||||
|
||||
abstract class PHP
|
||||
{
|
||||
protected $php_root;
|
||||
protected $php_ext_root;
|
||||
protected $opcache_file_cache;
|
||||
protected $id;
|
||||
protected $scenario;
|
||||
protected $conf;
|
||||
|
||||
protected function setupPaths()
|
||||
{
|
||||
@@ -23,6 +25,9 @@ abstract class PHP
|
||||
} else {
|
||||
$this->php_ext_root = $this->php_root;
|
||||
}
|
||||
if ("cache" == $this->scenario) {
|
||||
$this->opcache_file_cache = SDKConfig::getTmpDir() . DIRECTORY_SEPARATOR . $this->id;
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO Might be improved. */
|
||||
@@ -39,12 +44,22 @@ abstract class PHP
|
||||
$deps_root = SDKConfig::getDepsLocalPath();
|
||||
foreach ($env as $k => $v) {
|
||||
if (strtoupper($k) == "PATH") {
|
||||
$env[$k] = "$deps_root" . DIRECTORY_SEPARATOR . "bin;" . $env[$k];
|
||||
$env[$k] = $deps_root . DIRECTORY_SEPARATOR . "bin;" . $env[$k];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$drive = getenv("HOMEDRIVE");
|
||||
$path = getenv("HOMEPATH");
|
||||
if (!$drive || !$path) {
|
||||
$p = SDKConfig::getTmpDir();
|
||||
$drive = substr($p, 0, 2);
|
||||
$path = substr($p, 2);
|
||||
putenv("HOMEDRIVE=$drive");
|
||||
putenv("HOMEPATH=$path");
|
||||
}
|
||||
|
||||
return $env;
|
||||
}
|
||||
|
||||
@@ -95,7 +110,7 @@ abstract class PHP
|
||||
}
|
||||
}
|
||||
|
||||
if (is_null($ret)) {
|
||||
if (NULL === $ret) {
|
||||
throw new Exception("Failed to determine the test PHP version.");
|
||||
}
|
||||
|
||||
@@ -147,6 +162,11 @@ abstract class PHP
|
||||
}
|
||||
}
|
||||
|
||||
/* Special handling, otherwise it'll need functionality to extrapolate ini values. */
|
||||
if ("cache" == $this->scenario) {
|
||||
$tpl_vars[$this->conf->buildTplVarName("php", "opcache", "file_cache")] = $this->opcache_file_cache;
|
||||
}
|
||||
|
||||
$this->conf->processTplFile(
|
||||
$this->getIniTplFilename(),
|
||||
$ret,
|
||||
@@ -174,8 +194,8 @@ abstract class PHP
|
||||
public function exec(string $php_cmd, string $args = NULL, array $extra_env = array()) : int
|
||||
{
|
||||
$env = $this->createEnv();
|
||||
$exe = $this->getExeFilename();
|
||||
$ini = $this->getIniFilename();
|
||||
$exe = $this->getExeFilename();
|
||||
$ini = $this->getIniFilename();
|
||||
|
||||
$cert_path = getenv("PHP_SDK_ROOT_PATH") . "\\msys2\\usr\\ssl\\cert.pem";
|
||||
$ini .= " -d curl.cainfo=$cert_path";
|
||||
@@ -203,7 +223,7 @@ abstract class PHP
|
||||
$env[$k] = $v;
|
||||
}
|
||||
|
||||
$cmd = "$exe -n -c $ini " . ($args ? "$args " : "") . "$php_cmd";
|
||||
$cmd = "$exe -n -c $ini " . ($args ? "$args " : "") . $php_cmd;
|
||||
|
||||
$desc = array(
|
||||
0 => array("file", "php://stdin", "r"),
|
||||
@@ -214,5 +234,13 @@ abstract class PHP
|
||||
|
||||
return proc_close($p);
|
||||
}
|
||||
}
|
||||
|
||||
public function getIdString(): string
|
||||
{
|
||||
return $this->getVersion() . "-"
|
||||
. SDKConfig::getCurrentCrtName() . "-"
|
||||
. ($this->isThreadSafe() ? "ts" : "nts") . "-"
|
||||
. ($this->is64bit() ? "x64" : "x86")
|
||||
. "-" . substr(md5(uniqid()), 0, 8);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace SDK\Build\PGO\Abstracts;
|
||||
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
|
||||
class Server
|
||||
abstract class Server
|
||||
{
|
||||
public function getName() : string
|
||||
{
|
||||
@@ -17,6 +17,3 @@ class Server
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,11 +2,10 @@
|
||||
|
||||
namespace SDK\Build\PGO\Abstracts;
|
||||
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\FileOps;
|
||||
use SDK\Build\PGO\Tool;
|
||||
|
||||
class TrainingCase
|
||||
abstract class TrainingCase
|
||||
{
|
||||
use FileOps;
|
||||
|
||||
@@ -14,6 +13,8 @@ class TrainingCase
|
||||
const TYPE_CLI = "cli";
|
||||
|
||||
protected $stat = array();
|
||||
/** @var \SDK\Build\PGO\Config */
|
||||
protected $conf;
|
||||
|
||||
public function getType() : string
|
||||
{
|
||||
@@ -148,4 +149,3 @@ class TrainingCase
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace SDK\Build\PGO;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception};
|
||||
use SDK\Exception;
|
||||
|
||||
class Config
|
||||
{
|
||||
@@ -18,7 +18,7 @@ class Config
|
||||
protected $tpl_vars = array();
|
||||
protected $srv = array();
|
||||
|
||||
public function __construct(int $mode = MODE_RUN)
|
||||
public function __construct(int $mode = self::MODE_RUN)
|
||||
{
|
||||
if (self::MODE_CHECK_INIT == $mode) {
|
||||
// XXX The check is simple right now, so this is sufficient.
|
||||
@@ -40,7 +40,6 @@ class Config
|
||||
$this->mode = $mode;
|
||||
|
||||
|
||||
$base = getenv("PHP_SDK_ROOT_PATH");
|
||||
if (self::MODE_INIT == $mode) {
|
||||
foreach (array("nginx", "mariadb", "postgresql", "php") as $i) {
|
||||
$this->importSectionFromDir($i, $this->getTplDir() . DIRECTORY_SEPARATOR . $i);
|
||||
@@ -279,7 +278,7 @@ class Config
|
||||
public function processTplFile(string $tpl_fn, string $dst_fn, array $additional_vars = array()) : void
|
||||
{
|
||||
if (!file_exists($tpl_fn)) {
|
||||
throw new Exception("Template file '$fn' doesn't exist.");
|
||||
throw new Exception("Template file '$tpl_fn' doesn't exist.");
|
||||
}
|
||||
|
||||
$s = file_get_contents($tpl_fn);
|
||||
@@ -368,4 +367,3 @@ class Config
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
|
||||
namespace SDK\Build\PGO;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception, Lock};
|
||||
use SDK\{Exception, Lock};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\Build\PGO\Server\{MariaDB, NGINX, PostgreSQL};
|
||||
use SDK\Build\PGO\PHP;
|
||||
use SDK\Build\PGO\Tool\{PGO, PackageWorkman};
|
||||
use SDK\Build\PGO\Interfaces\TrainingCase;
|
||||
use SDK\Build\PGO\TrainingCaseIterator;
|
||||
|
||||
|
||||
/* TODO add bench action */
|
||||
|
||||
@@ -17,8 +16,9 @@ class Controller
|
||||
protected $cmd;
|
||||
protected $scenario;
|
||||
protected $conf;
|
||||
protected $cases;
|
||||
|
||||
public function __construct(string $cmd, ?string $scenario)
|
||||
public function __construct(string $cmd, ?string $scenario, ?array $cases)
|
||||
{
|
||||
$this->cmd = $cmd;
|
||||
|
||||
@@ -26,6 +26,7 @@ class Controller
|
||||
$scenario = "default";
|
||||
}
|
||||
$this->scenario = $scenario;
|
||||
$this->cases = $cases;
|
||||
}
|
||||
|
||||
protected function vitalizeSrv()
|
||||
@@ -77,38 +78,38 @@ class Controller
|
||||
$this->conf = $this->setupConfig($this->cmd);
|
||||
|
||||
switch ($this->cmd) {
|
||||
default:
|
||||
throw new Exception("Unknown action '{$this->cmd}'.");
|
||||
break;
|
||||
case "init":
|
||||
$lk = new Lock("pgo_init");
|
||||
if (!$lk->locked()) {
|
||||
echo "Another process runs initialization right now, waiting.", PHP_EOL;
|
||||
$lk->exclusive(true);
|
||||
echo "Another process finished running initialization, I quit as well.", PHP_EOL;
|
||||
return;
|
||||
}
|
||||
$this->init($force);
|
||||
break;
|
||||
case "train":
|
||||
$lk = new Lock("pgo_train");
|
||||
if (!$lk->locked()) {
|
||||
echo "Another process runs training right now, I have to wait.", PHP_EOL;
|
||||
$lk->exclusive(true);
|
||||
echo "Another process finished training, I may continue.", PHP_EOL;
|
||||
}
|
||||
$this->train();
|
||||
break;
|
||||
case "up":
|
||||
$this->up();
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Unknown action '{$this->cmd}'.");
|
||||
break;
|
||||
case "init":
|
||||
$lk = new Lock("pgo_init");
|
||||
if (!$lk->locked()) {
|
||||
echo "Another process runs initialization right now, waiting.", PHP_EOL;
|
||||
$lk->exclusive(true);
|
||||
echo "Another process finished running initialization, I quit as well.", PHP_EOL;
|
||||
return;
|
||||
}
|
||||
$this->init($force);
|
||||
break;
|
||||
case "train":
|
||||
$lk = new Lock("pgo_train");
|
||||
if (!$lk->locked()) {
|
||||
echo "Another process runs training right now, I have to wait.", PHP_EOL;
|
||||
$lk->exclusive(true);
|
||||
echo "Another process finished training, I may continue.", PHP_EOL;
|
||||
}
|
||||
$this->train();
|
||||
break;
|
||||
case "up":
|
||||
$this->up();
|
||||
break;
|
||||
|
||||
case "down":
|
||||
$this->down($force);
|
||||
break;
|
||||
case "check_init":
|
||||
// pass
|
||||
break;
|
||||
case "down":
|
||||
$this->down($force);
|
||||
break;
|
||||
case "check_init":
|
||||
// pass
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,6 +140,7 @@ class Controller
|
||||
if (!file_exists($composer) || $force) {
|
||||
/* XXX this needs to go into the config, specifically for composer maybe even separate class. */
|
||||
$url = "https://getcomposer.org/installer";
|
||||
/* XXX remove the explicit version option when symfony demo is fixed. */
|
||||
$tool = $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "composer-setup.php";
|
||||
$pw->fetch($url, $tool, $force);
|
||||
$php->exec("$tool --install-dir=" . $this->conf->getToolsDir());
|
||||
@@ -204,10 +206,24 @@ class Controller
|
||||
$pgo->clean();
|
||||
unset($pgo);
|
||||
|
||||
$cases = $this->cases;
|
||||
foreach (new TrainingCaseIterator($this->conf) as $handler) {
|
||||
$name = $handler->getName();
|
||||
/* Just a white list handling for now. */
|
||||
if (is_array($cases)) {
|
||||
if (!in_array($name, $cases)) {
|
||||
continue;
|
||||
}
|
||||
$key = array_search($name, $cases);
|
||||
unset($cases[$key]);
|
||||
}
|
||||
|
||||
echo "\n";
|
||||
$handler->run();
|
||||
}
|
||||
if (is_array($cases) && !empty($cases)) {
|
||||
echo "\n\033[31m WARNING: The cases " . implode(",", $cases) . " don't exist and was ignored!\033[0m\n\n";
|
||||
}
|
||||
|
||||
/* All the PGC files are merged, simply clean them out. */
|
||||
$pgo = new PGO($this->conf, $php);
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace SDK\Build\PGO\Interfaces;
|
||||
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
interface PHP
|
||||
@@ -15,4 +14,3 @@ interface PHP
|
||||
public function getVersion(bool $short = false) : string;
|
||||
public function getExeFilename() : string;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace SDK\Build\PGO\Interfaces;
|
||||
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
interface Server
|
||||
@@ -14,4 +13,3 @@ interface Server
|
||||
public function down(bool $force = false) : void;
|
||||
public function getName() : string;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,4 +10,3 @@ interface DB extends Interfaces\Server
|
||||
public function __construct(Config $conf);
|
||||
public function query(string $s, string $db = NULL) : void;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,4 +11,3 @@ interface HTTP extends Interfaces\Server
|
||||
public function getPhp() : Interfaces\PHP;
|
||||
public function addServer(string $part_tpl_fn, array $tpl_vars = array());
|
||||
}
|
||||
|
||||
|
||||
@@ -25,4 +25,3 @@ interface TrainingCase
|
||||
/* Get training type, it's like "web", "cli", etc.*/
|
||||
public function getType() : string;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,17 +5,19 @@ namespace SDK\Build\PGO\PHP;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\{Exception};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class CLI extends Abstracts\PHP implements Interfaces\PHP
|
||||
{
|
||||
protected $conf;
|
||||
|
||||
public function __construct(PGOConfig $conf)
|
||||
{
|
||||
$this->conf = $conf;
|
||||
$this->scenario = $conf->getScenario();
|
||||
// Don't do that, it'll be a recursive dependency.
|
||||
// Once we need to train CLI, we'll need to split
|
||||
// a new class, this one is a utility class.
|
||||
//$this->id = $this->getIdString();
|
||||
|
||||
$this->setupPaths();
|
||||
}
|
||||
@@ -50,7 +52,4 @@ class CLI extends Abstracts\PHP implements Interfaces\PHP
|
||||
|
||||
return $exe;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -5,12 +5,13 @@ namespace SDK\Build\PGO\PHP;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\{Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class FCGI extends Abstracts\PHP implements Interfaces\PHP
|
||||
{
|
||||
protected $conf;
|
||||
use FileOps;
|
||||
|
||||
protected $is_tcp;
|
||||
|
||||
public function __construct(PGOConfig $conf, bool $is_tcp)
|
||||
@@ -22,6 +23,7 @@ class FCGI extends Abstracts\PHP implements Interfaces\PHP
|
||||
$this->conf = $conf;
|
||||
$this->is_tcp = $is_tcp;
|
||||
$this->scenario = $conf->getScenario();
|
||||
$this->id = $this->getIdString();
|
||||
|
||||
$this->setupPaths();
|
||||
}
|
||||
@@ -64,6 +66,15 @@ echo "PHP FCGI initialization done.\n";*/
|
||||
{
|
||||
echo "Starting PHP FCGI.\n";
|
||||
|
||||
if ("cache" == $this->scenario) {
|
||||
if (file_exists($this->opcache_file_cache)) {
|
||||
$this->rm($this->opcache_file_cache);
|
||||
}
|
||||
if (!mkdir($this->opcache_file_cache)) {
|
||||
throw new Exception("Failed to create '{$this->opcache_file_cache}'");
|
||||
}
|
||||
}
|
||||
|
||||
$exe = $this->getExeFilename();
|
||||
$ini = $this->getIniFilename();
|
||||
$host = $this->conf->getSectionItem("php", "fcgi", "host");
|
||||
@@ -82,6 +93,10 @@ echo "PHP FCGI initialization done.\n";*/
|
||||
/* Give some time, it might be slow on PGI enabled proc. */
|
||||
sleep(3);
|
||||
|
||||
/*while(false !== ($s = fread($pipes[2], 1024))) {
|
||||
echo "$s";
|
||||
}*/
|
||||
|
||||
$c = proc_close($p);
|
||||
|
||||
if ($c) {
|
||||
@@ -99,7 +114,15 @@ echo "PHP FCGI initialization done.\n";*/
|
||||
|
||||
exec("taskkill /f /im php-cgi.exe >nul 2>&1");
|
||||
|
||||
/* XXX Add cleanup interface. */
|
||||
if ("cache" == $this->scenario) {
|
||||
try {
|
||||
$this->rm($this->opcache_file_cache);
|
||||
} catch (\UnexpectedValueException $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "PHP FCGI stopped.\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace SDK\Build\PGO\Server;
|
||||
use SDK\Build\PGO\Interfaces\Server\DB;
|
||||
use SDK\Build\PGO\Abstracts\Server;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\{Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class MariaDB extends Server implements DB
|
||||
@@ -114,10 +114,30 @@ class MariaDB extends Server implements DB
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$pass_arg = $pass ? "-p$pass " : "";
|
||||
$ret = shell_exec(".\\bin\\mysql.exe -u $user $pass_arg -h $host -P $port -e \"$s\"");
|
||||
$db_arg = $db ? "-D $db" : "";
|
||||
shell_exec(".\\bin\\mysql.exe -u $user $pass_arg -h $host -P $port $db_arg -e \"$s\"");
|
||||
//var_dump($this->base, getcwd(), ".\\bin\\mysql.exe -u $user $pass_arg -h $host -P $port -e \"$s\"");
|
||||
|
||||
chdir($cwd);
|
||||
}
|
||||
}
|
||||
|
||||
public function import(string $path, string $db = NULL) : void
|
||||
{
|
||||
$ret = NULL;
|
||||
|
||||
$cwd = getcwd();
|
||||
|
||||
chdir($this->base);
|
||||
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$pass_arg = $pass ? "-p$pass " : "";
|
||||
$db_arg = $db ? "-D $db" : "";
|
||||
shell_exec(".\\bin\\mysql.exe -u $user $pass_arg -h $host -P $port $db_arg < \"$path\"");
|
||||
|
||||
chdir($cwd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace SDK\Build\PGO\Server;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\{Config as PGOConfig};
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\{Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class NGINX extends Abstracts\Server implements Interfaces\Server\HTTP
|
||||
@@ -29,7 +29,6 @@ class NGINX extends Abstracts\Server implements Interfaces\Server\HTTP
|
||||
$nginx_conf_in = $this->conf->getTplDir($this->name) . DIRECTORY_SEPARATOR . "nginx.conf";
|
||||
$conf_fn = $this->base . DIRECTORY_SEPARATOR . "conf" . DIRECTORY_SEPARATOR . "nginx.conf";
|
||||
|
||||
$vars = array();
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
if (!$port) {
|
||||
$port = $this->conf->getNextPort();
|
||||
@@ -148,4 +147,3 @@ class NGINX extends Abstracts\Server implements Interfaces\Server\HTTP
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace SDK\Build\PGO\Server;
|
||||
use SDK\Build\PGO\Interfaces\Server\DB;
|
||||
use SDK\Build\PGO\Abstracts\Server;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\{Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class PostgreSQL extends Server implements DB
|
||||
@@ -90,10 +90,6 @@ class PostgreSQL extends Server implements DB
|
||||
echo "Stopping " . $this->name . ".\n";
|
||||
|
||||
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
|
||||
|
||||
$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "pg_ctl.exe stop -D " . $this->data_dir . " -m fast";
|
||||
exec($cmd);
|
||||
|
||||
@@ -108,7 +104,6 @@ class PostgreSQL extends Server implements DB
|
||||
public function createDb(string $db_name) : void
|
||||
{
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
@@ -119,7 +114,6 @@ class PostgreSQL extends Server implements DB
|
||||
public function dropDb(string $db_name) : void
|
||||
{
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
//$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
@@ -132,13 +126,11 @@ class PostgreSQL extends Server implements DB
|
||||
$ret = NULL;
|
||||
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
//$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$db_arg = $db ? "-d $db" : "";
|
||||
$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "psql.exe -h $host -p $port -U $user $db_arg -c \"$s\"";
|
||||
$ret = shell_exec($cmd);
|
||||
shell_exec($cmd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace SDK\Build\PGO\Tool;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception};
|
||||
use SDK\Exception;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
|
||||
@@ -63,11 +63,11 @@ class PGO
|
||||
$pgc = $this->getPgcName($base);
|
||||
$pgd = $this->getPgdName($base);
|
||||
|
||||
`pgosweep $base $pgc`;
|
||||
shell_exec("pgosweep $base $pgc");
|
||||
//passthru("pgosweep $base $pgc");
|
||||
|
||||
if ($merge) {
|
||||
`pgomgr /merge:1000 $pgc $pgd`;
|
||||
shell_exec("pgomgr /merge:1000 $pgc $pgd");
|
||||
//passthru("pgomgr /merge:1000 $pgc $pgd");
|
||||
/* File is already spent, no need to keep it.
|
||||
If seeing linker warnings about no pgc
|
||||
@@ -98,10 +98,9 @@ class PGO
|
||||
$its = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.pgd");
|
||||
$its = array_merge($its, glob($this->php->getExtRootDir() . DIRECTORY_SEPARATOR . "*" . DIRECTORY_SEPARATOR . "*.pgd"));
|
||||
foreach (array_unique($its) as $pgd) {
|
||||
`pgomgr /clear $pgd`;
|
||||
shell_exec("pgomgr /clear $pgd");
|
||||
//passthru("pgomgr /clear $pgd");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace SDK\Build\PGO\Tool;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\{Exception, FileOps};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
|
||||
|
||||
@@ -47,11 +47,10 @@ class PackageWorkman
|
||||
echo "Unpacking '$cache_fn' to '$tgt_name'\n";
|
||||
try {
|
||||
$this->unzip($cache_fn, $zip_tgt_dn, $tgt_bn);
|
||||
} catch (Throwable $e) {
|
||||
} catch (\Throwable $e) {
|
||||
$this->rm($cache_fn);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace SDK\Build\PGO\Tool;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\Build\PGO\Interfaces\{TrainingCase, Server, Server\DB, PHP};
|
||||
use SDK\Build\PGO\Interfaces\TrainingCase;
|
||||
|
||||
class Training
|
||||
{
|
||||
@@ -15,8 +15,9 @@ class Training
|
||||
{
|
||||
$this->conf = $conf;
|
||||
$this->t_case = $t_case;
|
||||
|
||||
if (!in_array($this->t_case->getType(), array("web", "cli"))) {
|
||||
|
||||
$type = $this->t_case->getType();
|
||||
if (!in_array($type, array("web", "cli"))) {
|
||||
throw new Exception("Unknown training type '$type'.");
|
||||
}
|
||||
}
|
||||
@@ -107,8 +108,7 @@ class Training
|
||||
public function run(int $max_runs = 1, ?array &$stat = array()) : void
|
||||
{
|
||||
$type = $this->t_case->getType();
|
||||
switch ($type)
|
||||
{
|
||||
switch ($type) {
|
||||
case "web":
|
||||
$this->runWeb($max_runs, $stat);
|
||||
break;
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace SDK\Build\PGO;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
|
||||
|
||||
@@ -21,7 +20,7 @@ class TrainingCaseIterator implements \Iterator
|
||||
|
||||
$items = glob($this->conf->getCasesTplDir() . DIRECTORY_SEPARATOR . "*");
|
||||
foreach ($items as $it) {
|
||||
if(!is_dir($it)) {
|
||||
if (!is_dir($it)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -53,7 +52,7 @@ class TrainingCaseIterator implements \Iterator
|
||||
|
||||
public function current()
|
||||
{
|
||||
$base = $this->items[$this->idx];
|
||||
$base = $this->items[$this->idx];
|
||||
$ns = basename($base);
|
||||
|
||||
/* Don't overwrite generated config. */
|
||||
@@ -97,6 +96,4 @@ class TrainingCaseIterator implements \Iterator
|
||||
|
||||
return $this->el->getName();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -2,10 +2,6 @@
|
||||
|
||||
namespace SDK;
|
||||
|
||||
use SDK\Config;
|
||||
use SDK\Cache;
|
||||
use SDK\Exception;
|
||||
|
||||
class Cache
|
||||
{
|
||||
protected $id;
|
||||
@@ -48,7 +44,7 @@ class Cache
|
||||
$old_sum = md5_file($p);
|
||||
$new_sum = md5($content);
|
||||
|
||||
return $old_sum != $new_sum;
|
||||
return $old_sum !== $new_sum;
|
||||
}/*}}}*/
|
||||
|
||||
public function cacheContent(string $path, string $content, bool $relative = false) : void
|
||||
@@ -64,7 +60,7 @@ class Cache
|
||||
|
||||
do {
|
||||
$got = fwrite($fd, substr($content, $wrote));
|
||||
if (false == $got) {
|
||||
if (false === $got) {
|
||||
break;
|
||||
}
|
||||
$wrote += $got;
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
namespace SDK;
|
||||
|
||||
use SDK\Build\Dependency\Fetcher;
|
||||
use SDK\Cache;
|
||||
use SDK\Exception;
|
||||
|
||||
class Config
|
||||
{
|
||||
@@ -130,7 +128,11 @@ class Config
|
||||
{/*{{{*/
|
||||
if (empty(self::$knownBranches)) {
|
||||
$cache_file = "known_branches.txt";
|
||||
$cache = new Cache(self::getDepsLocalPath());
|
||||
$deps_path = self::getDepsLocalPath();
|
||||
if (!$deps_path) {
|
||||
throw new Exception("Couldn't determine dependencies path. Please either switch to the PHP source root or use -d option.");
|
||||
}
|
||||
$cache = new Cache($deps_path);
|
||||
$fetcher = new Fetcher(self::$depsHost, self::$depsPort, self::$depsUriScheme);
|
||||
|
||||
$tmp = $fetcher->getByUri(self::$depsBaseUri . "/series/");
|
||||
@@ -179,6 +181,11 @@ class Config
|
||||
$branch = NULL;
|
||||
$found = false;
|
||||
|
||||
$rmtools_branch = getenv("PHP_RMTOOLS_PHP_BUILD_BRANCH");
|
||||
if ("master" == $rmtools_branch) {
|
||||
return "master";
|
||||
}
|
||||
|
||||
/* Try to figure out the branch. The worky scenarios are
|
||||
- CWD is in php-src
|
||||
- phpize is on the path
|
||||
@@ -209,6 +216,19 @@ class Config
|
||||
if (is_numeric($major) && is_numeric($minor)) {
|
||||
$branch = "$major.$minor";
|
||||
}
|
||||
|
||||
/* Verify that we use an available branch name. Master has some
|
||||
version, but no dedicated series. For master, it rather
|
||||
makes sense to use master as branch name. */
|
||||
$git = trim(shell_exec("where git.exe"));
|
||||
if ($git && is_dir(".git")) {
|
||||
$cmd = "\"$git\" branch";
|
||||
|
||||
$ret = trim(shell_exec($cmd));
|
||||
if (preg_match_all(",\*\s+master,", $ret) > 0) {
|
||||
$branch = "master";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $branch;
|
||||
@@ -273,10 +293,10 @@ class Config
|
||||
}
|
||||
}
|
||||
|
||||
if (!$ret["stability"]) {
|
||||
if (!@$ret["stability"]) {
|
||||
throw new Exception("Failed to find config with stability '" . self::getCurrentStabilityName() . "'");
|
||||
}
|
||||
if (!$ret["crt"]) {
|
||||
if (!@$ret["crt"]) {
|
||||
throw new Exception("Failed to find config with arch '" . self::getCurrentArchName() . "'");
|
||||
}
|
||||
|
||||
|
||||
@@ -2,9 +2,6 @@
|
||||
|
||||
namespace SDK;
|
||||
|
||||
use SDK\Config;
|
||||
use SDK\Exception;
|
||||
|
||||
trait FileOps
|
||||
{
|
||||
protected function md(string $name = "", bool $tmp = false) : string
|
||||
@@ -119,6 +116,9 @@ trait FileOps
|
||||
protected function download(string $url, string $dest_fn = NULL) : ?string
|
||||
{/*{{{*/
|
||||
$fd = NULL;
|
||||
$retry = 0;
|
||||
|
||||
retry:
|
||||
$ch = curl_init();
|
||||
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
@@ -146,6 +146,9 @@ trait FileOps
|
||||
if ($dest_fn) {
|
||||
fclose($fd);
|
||||
}
|
||||
if ($retry++ < 3) {
|
||||
goto retry;
|
||||
}
|
||||
throw new Exception($err);
|
||||
}
|
||||
|
||||
@@ -193,7 +196,7 @@ trait FileOps
|
||||
$name = substr($name, 0, -1);*/
|
||||
|
||||
$name = rtrim($stat["name"], "/");
|
||||
while (strchr($name, '/') !== false) {
|
||||
while (strstr($name, '/') !== false) {
|
||||
$name = dirname($name);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
|
||||
namespace SDK;
|
||||
|
||||
use SDK\{Config, Exception};
|
||||
|
||||
class Lock
|
||||
{
|
||||
protected $fd;
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
msys2/usr/bin/msys-icuuc62.dll
Normal file
BIN
msys2/usr/bin/msys-icuuc62.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
msys2/usr/bin/msys-idn-12.dll
Normal file
BIN
msys2/usr/bin/msys-idn-12.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
msys2/usr/bin/msys-lz4-1.dll
Normal file
BIN
msys2/usr/bin/msys-lz4-1.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user