2

現在、Visual Studio 2012、Eclipse、CodeBlocks、および MinGW を使用して C++ 11 コードを記述しています。

質問:

GCC の機能 (延期、= 対即時、:=、展開/代入など) と Microsoft の nmake に気付き、公式の「makefile」標準とは何なのか疑問に思いました。

  1. C++11 でのメイクファイル標準への更新はありましたか?
  2. GNU makefile 標準がどこにあるのか ( http://www.gnu.org/software/make/manual/make.html ) は知っていますが、"The" makefile 標準はどこにありますか?
  3. 正直に言うと、C++ で makefile を作成し、シェルからスクリプトとして実行したいと思っています。C++ コードをスクリプトとして実行する方法はありますか? おそらくJavascript?これを行うために使用される他のスクリプト言語は何ですか?

バックグラウンド:

難しいのは、(*咳)、コードが各環境でコンパイルされることを確認しようとしているだけでなく、他のターゲットにもクロスコンパイルしようとしていることです (OpenGL API を使用する Linux/Ubuntu、Windows 7、8、 DirectX、Android NDK を使用)。

私の中心的な問題の 1 つは、私が使用しているツールセットの多くが、クロス プラットフォームの素晴らしさをサポートするために実際には「オープン」ではないことです。

Visual Studio 2012: *nix 実行可能なコンパイラはありません。2012 年 11 月のバグのあるバージョンの C++ CTP コンパイラを使用して、C++11 をサポートします。

GCC 4.7.x/4.8x: MinGW32 および MinGW64 のラフ バージョンに限定されます。

CMake: 正しく構成するのは非常に困難ですが、GNU、Microsoft などに固有の makefile を作成するようです。これを構成して「標準」makefile を生成する方法はありますか?

AutoMake/AutoConf: GNU 互換のメイクファイルのみを生成するように見える

4

4 に答える 4

0

回答:マルチプラットフォームの 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;
        }

    }
}



?> 
于 2013-05-20T20:08:21.087 に答える