事の起こり
UNIX系OSを利用していると様々なdotfileが育っていきます..bash_profile
, .bashrc
, .vimrc
等々です.筆者はこれらのファイルをGitで管理しています.自宅ではMacとLinuxを利用しているので様々なdotfileを管理していますが,これまでMac用,Linux用各々のリポジトリで管理していましたが,管理が非常に煩雑になってきました.よって1つのリポジトリでディレクトリで切り分け,dotfileのシンボリックリンクを張る時にOS毎に異なるファイルのリンクを張れる様にMakefile上で実行しているOS情報を取り出し,条件分岐で切り分ける処理が実装出来れば煩雑さが軽減しそうです.
ディレクトリ構造
dotfiles/
├── Makefile
├── linux
└── mac
実装方法
UNIX系OSではuname -s
でOS名が取り出せます.よって,コマンドの実行結果を変数に代入し,OS毎に処理を切り分けます.
os := $(shell uname -s)
all:
ifeq ($(os),Darwin)
cd mac && make -f Makefile_mac
else ifeq ($(os),Linux)
cd linux && make -f Makefile_linux
else
echo Error: This system may be incompatible!!
@exit 1
endif
別々に管理していた頃の名残で各々のOS用のMakefileを用いてリンクを張っていますが,直接リンクを張る処理を実装する方法でも良いと思います.
1行目で変数
os
にOS名を代入していますが,:=
を用いて代入しています.=
を用いた場合は,変数os
の値が評価される度に代入処理が実行されます.
else ifeq
は古いバージョン(3.8.1以前)のMakeでは利用出来ません.
エラー終了は
@exit 戻り値
で設定します.
実行方法
実行方法は簡単です.上記のディレクトリ構造におけるdotfiles
ディレクトリ内でMakeを実行するだけです.
make
まとめ
Makeは非常に歴史有る開発ツールですが,様々な場面で活用出来る有用なツールだと筆者は思っています.今後も色々と試しつつ活用の幅を広げていきたいと思っています.
Reference