2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MakefileでOS毎に異なる処理を実行したい時の方策を考える

Last updated at Posted at 2022-11-30

事の起こり

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

:warning: 別々に管理していた頃の名残で各々のOS用のMakefileを用いてリンクを張っていますが,直接リンクを張る処理を実装する方法でも良いと思います.

:warning: 1行目で変数osにOS名を代入していますが,:=を用いて代入しています.=を用いた場合は,変数osの値が評価される度に代入処理が実行されます.

:warning: else ifeqは古いバージョン(3.8.1以前)のMakeでは利用出来ません.

:warning: エラー終了は@exit 戻り値で設定します.

実行方法

実行方法は簡単です.上記のディレクトリ構造におけるdotfilesディレクトリ内でMakeを実行するだけです.

make

まとめ

Makeは非常に歴史有る開発ツールですが,様々な場面で活用出来る有用なツールだと筆者は思っています.今後も色々と試しつつ活用の幅を広げていきたいと思っています.

Reference

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?