質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

5945閲覧

Makefileの読み方がわからない

fermat

総合スコア183

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

4グッド

1クリップ

投稿2017/05/17 07:34

初心者です。
ネットでMakefileの作り方を色々と参照してMakefileを解読しているのですが、
Makefileを作るためのスクリプトの読み方がよく分かっていません。

Make特有のマクロ定義があるとかPowerShellのルールがあるとか
自分なりに調べたのですが、具体的なスクリプトとなると読めなくなってしまい・・・
いくつか教えていただけないでしょうか。


※以下のスクリプトは抜粋しています。

C++

1##スクリプト① 2R_HOME := $(shell R RHOME) 3 4RCPPFLAGS := $(shell $(R_HOME)/bin/R CMD config --cppflags) 5RCPPINCL := $(shell echo 'Rcpp:::CxxFlags()' | $(R_HOME)/bin/R --vanilla --slave) 6 7CXXFLAGS := $(RCPPFLAGS) $(RCPPINCL)

C++

1##スクリプト② 2R_HOME = $$system(R RHOME) 3 4RCPPFLAGS = $$system($$R_HOME/bin/R CMD config --cppflags) 5RCPPINCL = $$system($$R_HOME/bin/Rscript -e \'Rcpp:::CxxFlags\(\)\') 6 7CXXFLAGS := $(RCPPFLAGS) $(RCPPINCL)

【1】上記2つのスクリプトについて
似たようなスクリプトが2つ検索で見つかったのですが(スクリプト①とスクリプト②、以下①②と記述。)
①はshellと書かれていて、②はsystemと書かれているのですが、違いがあるのでしょうか。
shellが書かれた①は、.NETをインストールしていないと動かないとか?

【2】「$」の使い方
makefileの中ではマクロの引用に$()を使うとかまでは調べたのですが(でもよく分かっていない)、
②では$$とドルマークを2重で使っています。これは何ですか。
$そのものを使いたいときは$$にするとか??

【3】「:=」と「=」
①では「:=」が使われていて、②では「=」が使われています。
これも何か違いや意味があるのでしょうか。

【4】systemの使い方1
R_HOME = $$system(R RHOME)でRとRHOMEをsystemに渡しているようなのですが、
system関数はcmd.exeに引数のstring型文字列を渡してソフトを実行させるとありました。
RとRHOMEって実行ファイルでもなさそうなのですが、内部ではどう認識されているのでしょうか。環境変数の何か?とアタリを付けたのですが、自分で分かる範囲はここまででした。
手元の本にもsystemについての解説がなく、これは何?という状態です。

【5】systemの使い方2
RCPPFLAGS = $$system($$R_HOME/bin/R CMD config --cppflags)
とあり、どこかのディレクトリまで何かを探しにいったのだろうというところまでは何となくわかったのですが「CMD」と「config」と「--cppflags」の示す意味が分かりません。--cppfragsについてはオプション?と思っているのですが・・・。

【6】パイプについて
①では、RCPPINCL := $(shell echo 'Rcpp:::CxxFlags()' | $(R_HOME)/bin/R --vanilla --slave)
②では、RCPPINCL = $$system($$R_HOME/bin/Rscript -e 'Rcpp:::CxxFlags()')
と書かれています。

①は「Rcpp:::CxxFlags」を実行してから「R_HOME/bin/R」を実行っていう意味なのでしょうか?
でも②では1行で済んでいます。

また、①では「$(R_HOME)/bin/R」「Rcpp:::CxxFlags()」、
②では「R_HOME/bin/Rscript」「'Rcpp:::CxxFlags()\」と書かれ方が違うようです。これも書き方の違いが分かりません。

【7】変数について
R_HOME・RCPPFLAGS・RCPPINCL・CXXFLAGS というものが出てくるのですが、何かmakeのルールに従った既存の関数?変数なのでしょうか。それとも、makefile内部で作られた変数なのでしょうか。


何とか読もうとしているのですが
1行1行何をどう読めばいいのか分からない状態です。
質問が多くなり申し訳ないのですが、一部分でも何かご存じでしたら
どうぞよろしくお願いします。

can110, TaishiYamamoto, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Best が出ていますが、いくつかコメントしましょう。

【2】「$」の使い方

makefileの中ではマクロの引用に$()を使うとかまでは調べたのですが

「変数」と考えてください。R_HOME := $(shell R RHOME) で代入がされており、$(R_HOME) で参照できます。$R_HOME でもよいのですが、$R_HOMEabc だったときに

  • $(R_HOME)defabcdef
  • $R_HOMEdef は、一つの別の変数

を指すという違いがあります。

【3】「:=」と「=」

Makefile の中では使い分けがあります。Makefile で代入の扱い を見てみて下さい。

【4】systemの使い方1
R_HOME = $$system(R RHOME)でRとRHOMEをsystemに渡しているようなのですが、
system関数はcmd.exeに引数のstring型文字列を渡してソフトを実行させるとありました。
RとRHOMEって実行ファイルでもなさそうなのですが、内部ではどう認識されているのでしょうか。

多分、R という実行ファイルに、RHOME という文字列を読ませています。R の HOME ディレクトリを出力させているのでしょう。

【5】systemの使い方2
RCPPFLAGS = $$system($$R_HOME/bin/R CMD config --cppflags)
とあり、どこかのディレクトリまで何かを探しにいったのだろうというところまでは何となくわかったのですが「CMD」と「config」と「--cppflags」の示す意味が分かりません。--cppfragsについてはオプション?と思っているのですが・・・。

R か、R の C++ モジュールのコンパイルのための、オプション(flag) を出力させていると思います。おそらく、コンパイラに与えるオプションを文字列として得るためのコマンドでしょう。

【7】変数について

R_HOME・RCPPFLAGS・RCPPINCL・CXXFLAGS というものが出てくるのですが、何かmakeのルールに従った既存の関数?変数なのでしょうか。それとも、makefile内部で作られた変数なのでしょうか。

Makefile 内で今定義した/しようとしている 変数だと思っておけばよいでしょう。

【6】パイプについて

多分、同じ結果を得るために、R コマンドと Rscript コマンドと、両方使えるのでしょう。

投稿2017/05/23 13:29

takotakot

総合スコア1111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fermat

2017/05/25 02:09

お返事が遅くなり、失礼いたしました。 長い質問だったのですが、丁寧にご回答してくださって恐縮です。 そういう意味だったのか・・・と何度も読んでいます。 全くの独学で、調べても知りたいことが書かれているサイトや書籍に当たらず、 気づけば何日も経っている状態でした。 「R という実行ファイルに、RHOME という文字列を読ませています。」など勉強になっています。 (R半角スペースRHOME?RHOMEってファイル無いよ?と沼にはまっていました。) 何となく分かったようで分からいないまま作業していたので、それがストレスでもありました。 なので、このご回答のおかげでプログラミングの効率も変わってくる気がしています。 ありがとうございます(^^)/
takotakot

2017/05/28 05:56

shell R RHOME shell echo 'Rcpp:::CxxFlags()' が、構文上同じ構造をしていそうだ、と思えば、見えてくるかもしれませんね。 Makefile であれば、文献も多いので、見慣れるとすぐ読めるようになると思います。 ただ、「Makefileの考え方は知っておいた方が良いですが、実用的には直接Makefileを書くのではなくQMakeやCMakeのようなMakefile生成ツールを使った方が現実的だろう」はそれはそれで正しいので、費用対効果を考えての判断でしょうか。
fermat

2017/05/29 18:51

Makefileを知ると面白そうなのですが、自分の実力では歯が立ちません。 少しずつ目が慣れてきていても、引っかかると1日2日と経ってしまいます。 基礎力や書いてきたスクリプトの量が圧倒的に足りないのも原因だと思います。 (shellも使いこなせないとですね・・・。) Makefileは後の課題として、 やはりQmakeでビルドの方向で行くことに決めました。 アドバイスがなければ遭難する分岐点でした。感謝です!!
guest

0

ベストアンサー

こんにちは。

ここここのサンプルを見ると、①はMakefile、②はQMakeですね。
QMakeは*.proファイルを解釈してMakefileを生成するツールです。

それぞれの文法が記載されている解説を見つけて、それに従って読むべきです。文法書にあたらずに理解するのはナンセンスです。C言語の文法を把握しないままC言語のソースを読むようなものです。
検索すれば、多数解説サイトがでてきますから、頑張って下さい。

ところで、Makefileの考え方は知っておいた方が良いですが、実用的には直接Makefileを書くのではなくQMakeCMakeのようなMakefile生成ツールを使った方が現実的だろうと思います。

投稿2017/05/17 09:50

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fermat

2017/05/17 11:19

①はMakefile、②はQMake、そうかそういう事なんですね! C言語とC++のsystem関数を調べていたので、分からないだらけになっているんですね。 何の文法で書かれているのかもわからず、ごちゃ混ぜで検索していました。 早速それぞれの文法を勉強して、読み直してみます。 実は、VisualStudioの登録が面倒だったので(え何だって?)QtCreatorでちょこちょこと スクリプトを書いています。 Qtを64bitでビルドする方法を紹介した神サイトを書かれた方の名前は、内緒です(笑)
Chironian

2017/05/17 12:30

あはは。中々使う機会がなくてあまり使ってないのですが、QtはC++用GUI開発ツールとして優れものと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問