Makefileの練習

# 目的
今更感があるのですが、Makefileの練習です

> [make](https://ja.wikipedia.org/wiki/Make)

# 環境

```
$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G4015
```

# サンプルコードを用意

```c:hello.c
#include <stdio.h>

int main() {
  puts("hello, world!");
  return 0;
}
```

一旦、ビルドして実行

```
$ gcc -o hello hello.c
$ ./hello 
hello, world!
```

デバッグ用に必要に応じて実行パスを追加

```
（例）カレントディレクトリの実行パスを追加する
$ CURRENT_DIR=`pwd`
$ export PATH=${PATH}:${CURRENT_DIR}
$ hello 
hello, world!
```

# Makefile作成

```makefile:Makefile
CC = gcc
CFLAGS = -g -Wall -Wextra
CODE = hello.c
PROGRAM = hello

hello:
        $(CC) $(CFLAGS) $(CODE) -o $(PROGRAM)

clean:
        $(RM) hello
```

makeして実行する

```
$ make
gcc -g -Wall -Wextra hello.c -o hello
$ ./hello 
hello, world!
```

# .mkファイルを添えてMakefile作成

```makefile:Makefile
include test.mk

CC = gcc
CFLAGS := -g $(CXXFLAGS)
CODE = hello.c
PROGRAM = hello

hello:
        $(CC) $(CFLAGS) $(CODE) -o $(PROGRAM)

clean:
        $(RM) hello
```

```makefile:test.mk
CXXFLAGS = -Wall -Wextra
```

makeして実行する

```
$ make 
gcc -g -Wall -Wextra hello.c -o hello
$ ./hello
hello, world!
```

# cmakeでMakefileを作成する

CMakeLists.txt を作成

```CMakeLists.txt 
cmake_minimum_required(VERSION 3.0)
project(test_project)
add_executable(executable_file hello.c)
```

cmakeでMakefileを作成

```
$ cmake .
-- The C compiler identification is AppleClang 10.0.0.10001044
-- The CXX compiler identification is AppleClang 10.0.0.10001044
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: mkfile
```

makeして実行する

```
$ make
Scanning dependencies of target executable_file
[ 50%] Building C object CMakeFiles/executable_file.dir/hello.c.o
[100%] Linking C executable executable_file
[100%] Built target executable_file
$ ./hello
hello, world!
```

hello, world! と出力されたのでOK

# make実行時に*** missing separator. Stop.が出る
Makefileのスペースをタブに変更すれば解決する。
例えば、以下のclean: の下の部分がスペースの場合にエラーが出るのでタブに変換する。

```
clean:
	$(RM) hello
```

# 参考
[Makefileでmake時に 「*** missing separator. Stop.」 と出たときの対処法](https://kakts-tec.hatenablog.com/entry/2016/12/18/225353)
[2016年だけどMakefileを使ってみる](https://qiita.com/petitviolet/items/a1da23221968ee86193b)
[Makefileの解説](http://omilab.naist.jp/~mukaigawa/misc/Makefile.html)
[トリビアなmakefile入門](http://www.jsk.t.u-tokyo.ac.jp/%7Ek-okada/makefile/)
[configure, make, make install とは何か](https://qiita.com/chihiro/items/f270744d7e09c58a50a5)
[Makefileでmake時に 「*** missing separator. Stop.」 と出たときの対処法](http://kakts-tec.hatenablog.com/entry/2016/12/18/225353)
[3. Makefileの記述](http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_2.html)
[メークファイルをインクルードする](https://docs.oracle.com/cd/E19620-01/805-5827/make-79/index.html)
[make の種類あれこれ](https://maku77.github.io/memo/tool/make.html)