在 PHP 中调用 CMake 构建系统通常需要通过命令行执行相关的 CMake 命令。你可以使用 PHP 的 shell_exec()exec() 等函数来调用 CMake 构建命令,并执行构建过程。CMake 是一个跨平台的构建系统生成工具,它通常用于生成项目的 Makefile 或其他构建配置文件,然后由其他工具(如 makeninja)进行实际编译。

下面我将为你提供三种常见的 PHP 执行 CMake 构建的示例。

1. 使用 shell_exec() 执行 CMake 构建命令

shell_exec() 是 PHP 中用于执行外部命令的函数,返回命令执行的结果。你可以使用它来调用 CMake 配置和构建命令。

示例:执行 cmake 配置和构建命令

<?php
// 设置项目根目录路径
$projectDir = '/path/to/your/project';

// 进入项目目录并执行 CMake 配置命令
$output = shell_exec("cd $projectDir && cmake .");

// 输出 CMake 配置命令的结果
echo "CMake Output: " . $output;

// 执行构建命令
$buildOutput = shell_exec("cd $projectDir && make");

// 输出构建命令的结果
echo "Build Output: " . $buildOutput;
?>

说明:

  • cd $projectDir && cmake .:切换到项目目录,并运行 cmake . 配置项目。cmake . 会根据项目中的 CMakeLists.txt 文件生成构建系统。
  • make:执行构建命令,编译生成最终的二进制文件。

2. 使用 exec() 执行 CMake 配置并捕获每一行输出

exec() 函数可以用来执行命令并将输出结果捕获到数组中,这对于获取逐行输出非常有用。

示例:捕获每一行的构建输出

<?php
// 设置项目根目录路径
$projectDir = '/path/to/your/project';

// 配置命令
$cmakeCmd = "cd $projectDir && cmake .";
$buildCmd = "cd $projectDir && make";

// 执行 CMake 配置命令并捕获输出
exec($cmakeCmd, $cmakeOutput, $cmakeStatus);
echo "CMake Status: " . $cmakeStatus . "\n";
echo "CMake Output:\n";
foreach ($cmakeOutput as $line) {
    echo $line . "\n";
}

// 执行构建命令并捕获输出
exec($buildCmd, $buildOutput, $buildStatus);
echo "Build Status: " . $buildStatus . "\n";
echo "Build Output:\n";
foreach ($buildOutput as $line) {
    echo $line . "\n";
}
?>

说明:

  • exec($cmakeCmd, $cmakeOutput, $cmakeStatus):执行 cmake 命令,$cmakeOutput 数组会包含命令输出的每一行,$cmakeStatus 将包含命令的退出状态码。
  • 逐行打印 cmakeOutputbuildOutput,便于调试和查看构建过程中的详细信息。

3. 使用 proc_open() 启动 CMake 和 make 并获取实时输出

proc_open() 可以启动一个进程,并且能够实时读取进程的输出流。这对于需要处理长时间运行的构建过程,或者需要动态获取构建进度的场景特别有用。

示例:实时获取构建输出

<?php
// 设置项目根目录路径
$projectDir = '/path/to/your/project';

// 配置命令
$cmakeCmd = "cd $projectDir && cmake .";
$buildCmd = "cd $projectDir && make";

// 启动 CMake 配置进程
$process = proc_open($cmakeCmd, [
    1 => ['pipe', 'w'],  // 标准输出流
    2 => ['pipe', 'w'],  // 错误输出流
], $pipes);

// 获取并输出 CMake 配置过程中的输出
if (is_resource($process)) {
    while ($line = fgets($pipes[1])) {
        echo "CMake: $line";
    }
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($process);
}

// 启动构建进程
$process = proc_open($buildCmd, [
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w'],
], $pipes);

// 获取并输出构建过程中的输出
if (is_resource($process)) {
    while ($line = fgets($pipes[1])) {
        echo "Build: $line";
    }
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($process);
}
?>

说明:

  • proc_open() 启动一个新的进程并返回一个资源句柄,允许你与子进程进行更复杂的交互,比如实时获取输出。
  • fgets($pipes[1]) 用于从标准输出流读取一行输出,并实时输出到浏览器或日志中。

小结

  • shell_exec():适合执行简单的命令并获取整个输出,适用于简单的构建任务。
  • exec():允许捕获命令的每一行输出,适用于需要逐行处理输出的场景。
  • proc_open():提供了最强的控制能力,适合需要实时监控或交互的进程,适合长时间运行的任务。

以上三种方法可以根据不同的需求选择使用,shell_exec() 适用于简单的命令执行,而 proc_open() 则可以处理更复杂的交互场景。