回答:マルチプラットフォームの Makefile はありません。 標準: 代わりに、PHP、PERL、Python (SCons) などの標準のマルチプラットフォーム スクリプト言語を使用して、C++ プロジェクトをコンパイルします。
統一された標準ではないという他のすべての人のコメントに基づいて、より永続的で拡張可能なクロスプラットフォーム対応のエレガントなソリューションの必要性が私にとってより重要になりました (さらに、私はメイクファイルを作成するのが嫌いです!)。
そこで、Perl、JavaScript、PHP (さらには Python スクリプト) を調べた後、PHP を使用して C++ プロジェクトをビルドすることにしました。
この特定の選択をした理由はたくさんありますが、主な理由は次のとおりです。 1. PHP ツールの数 2. Web インターフェースを介したリモート ビルド操作への簡単な統合 3. Windows、Linux、BSD、OSX の移植性。4. 多くのネストされたフォルダー構造、名前空間、およびクロスコンパイルを含むプロジェクトの高度なロジック、インクルードのサポート。
シェル スクリプトのサポート、クロス プラットフォームの可用性などを備えた PHP は、自然に適合します。
それで、これ以上苦労することなく、ここに私が作成したばかりの小さくて手っ取り早い概念実証があります。明らかに何も「実行」しませんが、問題なく実行/コンパイルされ、実際のメイク ファイルでどのように動作するかは簡単にわかります。
助けてくれてありがとう!
<?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;
}
}
}
?>