答:没有多平台的 Makefile 标准:而是使用标准的、多平台的脚本语言,例如 PHP、PERL、Python、(SCons)等来编译 C++ 项目
基于其他人关于他们不是一个统一标准的评论,对我来说,需要一个更永久、可扩展、跨平台的优雅解决方案变得更加重要,(此外,我讨厌制作 makefile!)。
因此,在查看了 Perl、JavaScript、PHP(甚至 Python 脚本)之后,我决定使用 PHP 来构建 C++ 项目。
我做出这个特殊选择的原因有很多,但主要原因是:1. PHP 工具的数量 2. 通过 Web 界面轻松将其集成到远程构建操作中。3. Windows、Linux、BSD、OSX 的可移植性。4. 支持高级逻辑,包括,对于涉及许多嵌套文件夹结构、命名空间和交叉编译的项目。
PHP 及其 shell 脚本支持、跨平台可用性等是天作之合。
因此,事不宜迟,这是我刚刚制作的一个小而快速且肮脏的概念证明。显然它没有“做”任何事情,但它运行/编译得很好,并且很容易看出它在真正的 make 文件中是如何工作的。
感谢所有的帮助!
<?php
// Windows cannot "del /files/*.o /S /Q" because it confuses paths for switches.
// Made my own Variable for Directory Separator for Readability.
$DS = DIRECTORY_SEPARATOR;
// ***********************************************
// **** Compiler Variables
// ***** use PHP: include "Config.php", etc
// ***** to have external variables and functions.
$Compiler = "mingw32-g++.exe";
$DebugFlags = "";
$CompilationFlags = "-std=c++11 -Wall -c -o";
$LinkFlags = "-Wall -o";
$IncludeFlags =
array(
"-I".$DS."Includes",
"-L".$DS."Redist".$DS."Headers"
);
$LibraryLocations =
array(
"-L".$DS."Lib",
"-L".$DS."Redist".$DS."Lib"
);
// ***********************************************
// **** Project Properties
class Project {
public $Name = "";
public $Location = "";
public function __construct($name="Project", $location="")
{
$this->Name = $name;
$this->Location = $location;
}
}
$SubProjects =
array(
new Project("Framework", str_replace("/", $DS, "../Projects/API/Source"))
// new Project("Logging", str_replace("/", $DS, "../Projects/Logging/Projects/API/Source"),
);
// ***********************************************
// **** Environment Variables
$BuildRoot = "D:".$DS."Build".$DS;
$ObjectRoot = $BuildRoot + "OBJs".$DS;
$LibRoot = $BuildRoot + "LIBs".$DS;
$RunRoot = $BuildRoot + "Run".$DS;
$ConfigRoot = getcwd();
$directory = ".".$DS;
$filterList = array(".", "..");
$commandOutput = array("");
$returnValue = 1;
$directoryContents = array_diff(scandir($directory), $filterList);
// ***********************************************
// ***** Main Execution Block
// print_r($SubProjects);
echo PHP_EOL . PHP_EOL;
echo "***********************************************" . PHP_EOL;
echo "***** Building: Starting" . PHP_EOL;
ProcessSubProjects($SubProjects);
echo "***********************************************" . PHP_EOL;
echo "***** Building: Finished" . PHP_EOL;
// ***********************************************
function ProcessSubProjects($subProjects)
{
foreach ($subProjects as $project)
{
$command = 'dir ' . realpath($project->Location);
$commandEcho = array();
// echo $project->Location . PHP_EOL;
// echo realpath($project->Location) . PHP_EOL;
echo PHP_EOL . $command . PHP_EOL . PHP_EOL;
exec ($command, $commandEcho);
foreach ($commandEcho as $message)
{
echo $message . PHP_EOL;
}
}
}
?>