Makeを直接使用することは時代遅れと見なされますか?[閉まっている]


31

ですから、メイクファイルを直接作成することや、2015年にそれを行うのは馬鹿げたことです。CMakeなどのツールを知っており、実際にCMakeを頻繁に使用しています。大切なのは、CMakeはMakefileを作成して、自分でそれを行うという退屈な作業をなくすことです。もちろん、それは他の多くの素晴らしい機能を追加します...しかし、最終的にはまだMakefileです。

だから私の質問は、Makeユーティリティ全体を指すmakeに関する「時代遅れの」話ですか、それとも自分のMakefileを手動で書くというアイデアですか?私はC / C ++開発にIDEをまったく使用しません(ちょうどemacs)ので、常にMakefileを作成しました。

Makeが古いと見なされる場合、C / C ++開発者は小さな個人プロジェクトを構築するために何を使用すべきですか?


8
小規模な個人プロジェクトの場合はmake、Makefileなしで十分です。面倒なことは何ですか?
ott--

8
私のFreeBSDシステム(デスクトップとサーバーの両方)で利用可能なすべてのソフトウェアには、「make」によって開始されるMakefileがあります。いいえ。「make」は廃止されていません。
ロブ

3
人々はIDEを自由に使用できますが、IDE makeが最初に作成されてから約40年後にMakefilesを使用したプロジェクトをサポートできない場合、人々はそれを回避することを期待すべきではありません。
マイルルーティング

1
「メイクに関する時代遅れの話は」単なる症状またはある痛みのポイントではなく、非推奨の宣言。特に、優れた完全な代替品がまだ存在せず、痛みを軽減するためのすべてのアプローチが、痛みを最も受けやすいユーザーから隠されている何らかの方法で使用されている場合は特にそうです。多くの良い答えが出されていますが、質問自体は意見に基づいた境界線です。
rwong

1
CMake抽象化の層です。この抽象化は、オープンソースに準拠しないさまざまなコンシューマIDE製品を飼いならすために必要ですMakefile。繰り返しますが、これは抽象化だけでなく、設定(autoconfなど)機能を許可します。他の抽象化と同様に、代替を可能にします。しかし、それはCMakeのユーザーが簡単に利用できるMakefileの代替案の実験的な新しいアイデアの道を開きます。
shuva

回答:


30

大きな違いは、CMakeがクロスプラットフォームのメタビルドシステムであることです。単一のCMakeプロジェクトは、通常のUnix / Linuxメイクファイル、Windows用のVisual Studioプロジェクト、Mac用のXCodeプロジェクト、および使用またはサポートする可能性のある他のほぼすべての非メタビルドシステムを生成できます。

makeを直接使用したり、makefileを手動で編集したりすることは「時代遅れ」とは言いませんが、Windowsに移植する必要のないUnix / Linuxの作業をしているのでなければ、おそらくそうすべきではありません非Windowsに移植する場合は、Visual Studioプロジェクトファイルを直接編集しないでください。移植性に興味がある場合は、SconsやCMakeなどのメタビルドシステムを学ぶ価値があります。


9
POSIX makeはクロスプラットフォームでもあります。
Blrfl

6
@Blrflこれは真実かもしれませんが、一般的には、ターゲットとするすべてのプラットフォームがPOSIX準拠であっても、プロジェクトをコンパイルおよび/またはリンクするために使用する必要があるコマンドラインはプラットフォーム固有であることがわかります。 「すべてに同じコンパイラを使用して再(まだの場所で厄介な問題があるでしょう、あなたが必要かどうか、ファイルが含まれる-lm-lnslというようにまたはそれらの施設は、Cライブラリなどに含まれているかどうか)。
ジュール

5
@Julesにはさらに多くの(または少ない)がありCMake、基本的にはELFローダーを備えたシステム向けの標準的なモジュラーアプリケーションの作成に合わせて調整され、特定のツールチェーンに必要なすべてのツールの抽象化を提供します。そのツールチェーン(たとえば、ベアメタル用のカスタムリンカースクリプト)から離れると、CMake突然サポートもポータビリティもまったく提供されず、完全にカスタムビルドスクリプトをハックするのと同じようにハッキングされてしまいます。
Ext3h

Q make についても同じことが言えます(** ap CMakeの動作が一貫性のない
不適切に

11

されてmake、本当に古いですか?

そうは思いません。最終的に、makeは、変更されたソースなどの条件付きコンパイルなど、必要なすべての機能を提供するのに十分強力です。言ってmake古いされた、書き込みカスタムリンカスクリプトが古いたと言っと同じになります。

しかし、raw makeが提供しないのは、拡張された機能と、パラメトリックヘッダー生成、統合テストフレームワーク、または一般的な条件付きライブラリなどの快適さのためのストックライブラリです。

一方、CMake汎用ELFライブラリと実行可能ファイルを生成するように直接調整されています。事前定義された手順から離れるたびにCMake、自分のMakefileをハッキングするのと同じように、ハッキングを開始する必要があります。

ELFローダーを知っているシステムの平均的なアプリケーションよりもC ++ではるかに多く作成できることを考えると、CMake確かにすべてのシナリオに適しているわけではありません。ただし、このような標準化された環境で作業している場合、CMakeまたはこれらの他の最新のスクリプトジェネレータフレームワークが間違いなく親友です。

それは常に、アプリケーションの専門性と、CMakeフレームワークの構造がワークフローにどの程度適合するかによって異なります。


makeは有用ではありますが、脳死、不可解な構文、および多くのOOPSモーメントをもたらす不必要な制限が多数ある恐ろしいシステムです。
antred

7

むかしむかし、高レベル言語は単なるアイデアでした。人々はコンパイラを実装しようとしました。当時、ハードウェアには厳しい制限がありました。グラフィカルツールがなかったため、入力ファイル形式に「プレーンテキスト」が使用されていました。通常、コンピューターのRAMは非常に少ないため、ソースコードを細かく分割する必要があり、コンパイラーは個別のユーティリティ(プリプロセッサー、コンパイラー、アセンブラー、リンカー)に分割されました。CPUは低速で高価だったため、高価な最適化などを行うことができませんでした。

もちろん、多くのソースファイルと多くのユーティリティを使用して多くのオブジェクトファイルを作成しているため、手動で何かをビルドするのは面倒です。ツールの設計上の欠陥(ハードウェアが非常に限られていることが原因)の回避策として、人々は自然にスクリプトを記述し始めて、面倒な作業の一部を取り除きました。

悲しいことに、スクリプトは厄介で面倒でした。スクリプトの問題(ハードウェアが限られていることによるツールの設計上の欠陥の回避策)を回避するために、人々はやがて物事を簡単にするユーティリティを発明しましたmake

しかしながら; メイクファイルは厄介で面倒です。メイクファイルの問題(ハードウェアの制限によるツールの設計上の欠陥の回避策でした)を回避するために、人々は自動生成されたメイクファイルの実験を始めました。コンパイラーに依存関係を生成させるなどのことから始めます。auto-confやcmakeなどのツールに至るまで。

これが現在の状況です。ハードウェアの制限が原因のツールの設計欠陥の回避策の回避策の回避策。

世紀の終わりまでに、既存のパイルの上に「回避策のための回避策」の層がさらにいくつかあることを期待しています。皮肉なことに、このすべてを引き起こしたハードウェアの厳しい制限は何十年も前になくなり、今でもこのような古風な混乱を使用している唯一の理由は「これが常に行われている方法」です。


1
それでは、代替手段は何ですか?私たちが知っているように、代替案はビルドの概念を完全に変えていますか?
-JParrilla

1
@Darkslash:(架空の)代替案を検討し始めると、水門を開くようなものになります-すべてを疑問視することになります(そして、セマンティクスと構文の分離、IDEとツールの再設計、および個々のピースではなくセットとしての配信のようなアイデアになります)より大きなパズル)。より実用的なのは、cmake症状を治療するだけで、根本原因を治すことができないようなツールを認識することです。これにより、「理想」に決して近づかないツールを使用する以外に選択肢がないという事実を受け入れやすくなります。
ブレンダン

5
Makefileは決して「厄介で厄介な」ものではありません。それらは信じられないほどエレガントです:makeその中心は、非循環依存グラフを走査するためのエンジンです。「スクリプト」やコマンドラインについては何も「古風」ではありません。
マイルルーティング

1
@MilesRout:厄介で厄介な部分はグラフの構築です。トラバーサルは十分にエレガントです。しかし、面倒な部分の最も一般的な単一の例であるCヘッダーファイルを使用してください。それぞれ#includeがエッジですが、makeCファイルを解析できません。makeこれらのエッジを次のノード(* .oファイル)に保存できるため、まだ問題ではありませんが、それも行いません。
–MSalters

3
より良い設計が可能であることに同意しません。makeCのコンパイルだけではありません!s を取り.c.hファイリングして与えるプログラムが必要ですMakefile。しかし、それはそうではなくmake、それは何をmakeすべきかではありません。繰り返しになりますmakeが、Cだけではありません。組み込まれているC固有のソリューションmakeは悪い考えです(そして、偶然にUNIXの哲学に違反しています)。
マイルルーティング

5

make (ツールまたはMakefileを介したツールの直接使用)は、特に使用する「小規模な個人プロジェクト」にとっては古くありません。

もちろん、複数のプラットフォームを対象とするプロジェクトを含む、より大きなプロジェクトにも使用できます。ターゲット固有の変数あなたは簡単にあなたが別のプラットフォーム用にビルド方法をカスタマイズすることができます。現在、Linuxディストリビューションにはクロスコンパイルツールチェーン(例:mingw-w64)が付属しているため、Makefileから駆動される完全なWindowsソフトウェアパッケージ(必要に応じてインストーラーを使用)をビルドできます。

cmakeqmakeなどのツールは便利ですが、問題がないわけではありません。ライブラリと一緒にアプリケーション自体を構築するのに通常は問題ありません(ただし、ライブラリとそれらを使用するプログラム間でqmakeが適切に依存関係をチェックするのに常に問題がありました)ジョブ(インストーラーの作成、ドキュメントまたは翻訳ファイルの生成/インストール、アーカイブを共有ライブラリーに変換するなどの異常なことを行うなど)。このすべてはで行うことができますがmake依存関係の追跡などには少し手間がかかります。

Qt CreatorやEclipseなどのIDEもMakefileベースのプロジェクトをインポートできるため、IDEを使用する開発者と共有できます。Qt Creator IDEはC ++ IDEとして優れていると思いますが、Emacsでより効果的になるために少し時間を費やした後、Adaの開発をさらに進めているので、すべてにEmacsを好むことに気づきました。makeMakefileのポストリンクステップとしてについての質問に戻るために、(Emacs でのシンボルナビゲーション用の)TAGSファイルを更新し、次をロードしM-x visit-tags-tableます:

find $(SRC_DIR) $(TEST_DIR) -regex ".*\.[ch]\(pp\)?" -print | etags -

またはAda開発の場合:

find $(SRC_DIR) $(TEST_DIR) -name "*.ad?" -print | etags -

2

この回答は、@ lxrecの回答を補完します。

Makefileは、ソースコードからプログラム/ライブラリを作成するだけでなく、さまざまな用途に使用できます。CMakeやautotoolsなどのビルドシステムは、コードを取得し、ユーザーのプラットフォームに適合するようにビルドします(つまり、ライブラリを見つけるか、正しいコンパイルオプションを指定します)。たとえば、次のようないくつかのリリースタスクの自動化に役立つメイクファイルを作成できます。gitから派生したバージョンのコードを含むzipファイルを作成します。コードに対してテストを実行します。上記のzipファイルをホスティングサービスにアップロードします。一部のビルドシステム(automakeなど)は、これを簡単に行う方法を提供する場合もあれば、そうでない場合もあります。

このためにメイクファイルを使用する必要があるというわけではありません。そのようなタスクにはスクリプト言語(シェル、Pythonなど)を使用できます。


1

Makefile特に次の場合、人間が書いたものは時代遅れだとは思いません。

  1. POSIX makeを使用すると、ポータブルな Makefile
  2. またはGNU make 4を使用すると、多くの非常に興味深い機能、特にMakefileジェネレーターによって提供される派手な機能を効率的にコーディングできるGUILE スクリプタビリティが得られます)。もちろん、支払う代償はGNU make 4を要求することです(大したことではない、私見)。

0

テキストファイルが廃止されていないのと同様に、Makefileは廃止されていません。すべてのデータをプレーンテキストで保存することが常に正しい方法とは限りませんが、必要なのがTodoリストだけであれば、プレーンテキストファイルで十分です。より複雑なものには、MarkdownやXMLなどのより複雑な形式、またはカスタムバイナリ形式などが必要ですが、単純な場合はプレーンテキストで問題ありません。

同様に、常に書き出すことを避けたい場合は、g++ -g src/*.c -o blah -W -Wall -Werror && ./blah手書きのMakefileが最適です!

移植性を自分で管理する必要のない、移植性の高いものを構築したい場合は、Autotoolsのようなものが適切なMakefileを生成することを望むでしょう。Autotoolsは、さまざまなプラットフォームでサポートされている機能を検出します。Autotoolsで構築された標準C89で書かれたプログラムは、事実上どこでもコンパイルできます。


「ほぼすべての場所でコンパイルします」->「最新のUnixライクシステムでコンパイルします」。autotoolsたとえば、Windowsシステムでは関連する程度に機能するとは思わない(Cygwin / MingWを割引きます。これは実際にはWindows上のUnixライクなシステムです)。
sleske

最近であることとは関係ありません。autotoolsの利点は、POSIXに似たすべてのリモートシステムで動作することです。WindowsはややPOSIXに準拠しています。
マイルルーティング

はい、修正しました。実際、autotoolsに対する批判の1つは、非常に古いシステムでもコードが含まれているということです。しかし、私はまだWindowsの部分を支持しています。
sleske

そして、その責任は完全にマイクロソフトにあります。彼らが高品質の製品を生産することに関心があるなら、Windowsは国際的なオペレーティングシステム標準(POSIXなど)を適切にサポートします。POSIXは単なる「Unixのもの」ではなく、すべてのオペレーティングシステムに対応するポータブルオペレーティングシステムの標準です。Windowsは、準拠していないがらくたの山です。
マイルルーティング

@MilesRoutの最終結果は、「事実上どこでも」90%のデスクトップコンピューターが除外されることです
el.pescado

-2

プロジェクトが単純で、ファイルの数が非常に少ない場合は、メイクファイルは必要ありません。

ただし、プロジェクトが複雑で、多数のメモリ領域を使用し、多くのファイルがある場合、各メモリ領域をアドレス可能なメモリの適切な場所に配置する必要があります。 1つのファイルに作成され、

最小限の手間とキー入力ミスの可能性で、古いファイル/コンパイル/リンク/インストールを消去したい場合、makefileは本当に有益です。

「現実世界」のプロジェクトに入ると、たった1つまたは2つのファイルではなく、数百のファイルになります。メイクファイルは常に正しいアクションを実行し、(デバッグ後)不要なアクションは実行しないため、1つの単純なコマンドを入力するだけで、メイクファイルがすべての作業を実行します。


1
好む理由は答えなかったmake以上cmake、またはその逆。
Ext3h

メイクファイルを使用すると、毎回すべてのファイルが再構築されるわけではありません。(他のCMakeまたは自動ツールはそれを使用できませんでした)
ideasman42
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.