Ответ: Там нет мультиплатформенный Makefile Стандарт: Вместо использования стандартных, мульти-платформенных языков сценариев, таких как PHP, Perl, Python, (Scons) и т.д., чтобы компилировать проекты C++
Основываясь на комментариях остальных о том, что они не являются единым стандартом, потребность в более постоянном, расширяемом, кросс-платформенном элегантном решении стала для меня намного более важной (кроме того, я ненавижу делать make-файлы!).
Итак, взглянув на Perl, JavaScript, PHP, (даже скрипт Python), я решил использовать PHP для создания проектов на C++.
Есть так много причин, по которым я сделал этот конкретный выбор, но основными причинами были следующие: 1. Количество инструментов PHP 2. Простая интеграция этого в операции удаленной сборки через веб-интерфейсы. 3. Windows, Linux, BSD, совместимость с OSX. 4. Поддержка расширенной логики, включает в себя проекты, связанные с множеством вложенных структур папок, пространств имен и кросс-компиляции.
PHP, с поддержкой оболочки, поддержкой кросс-платформы и т. Д., Является естественным.
Итак, без дальнейших церемоний, вот небольшой, быстрый и грязный доказательство концепции, которую я только что сделал. Очевидно, что он ничего не делает, но он отлично работает/компилируется, и как это можно было бы работать в реальном файле 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;
}
}
}
?>
makefile и C++ - две независимые вещи –
Создание, как и большинство систем сборки, не зависит от языка. Хотя существуют «лучшие методы», они в большей степени зависят от используемой системы сборки (CMake, gnu make и т. Д.), Чем на том языке, на котором вы строите. – ChrisCM