mieki256's diary



2024/01/03(水) [n年前の日記]

#2 [prog] Makefileの中で処理を分けたい

ここ数日、MinGW用と、MSYS2 MINGW64用の、2つのMakefileを書きながら実験してるけど、なんだか面倒臭くなってきた。make -f Makefile.msys2 と打つべき場面で make と打ってしまってエラーが出てきたり…。ちょっと面倒臭い。

1つの Makefile の中で、MinGW上で使おうとしているのか、MSYS2 MINGW64上で使おうとしているのか判別して、処理を分けることはできないのだろうか。

使ってるのは GNU Make。3.81 と 4.4.1。

処理を分けることもできるらしい :

調べてみたら、Makefile の中でも、ifeq - else - endif や ifdef - else - endif といった書き方ができるらしい。

また、MSYS2 上で作業する場合、環境変数 MSYSTEM に、MINGW32 とか MINGW64 といった文字列が入るらしい。
$ echo $MSYSTEM
MINGW64

MinGW上では、何も入らない。
> echo %MSYSTEM%
%MSYSTEM%

であれば、こういう書き方ができるかな…。
ifeq ($(MSYSTEM),MINGW64)

# MSYS2 MINGW64

04_loadpng_objcopy.exe: 04_loadpng_objcopy.c texture.o Makefile
    gcc 04_loadpng_objcopy.c texture.o -o 04_loadpng_objcopy.exe -D FREEGLUT_STATIC -lfreeglut -lopengl32 -lwinmm -lgdi32 -static

texture.o: texture.png Makefile
    ld -r -b binary -o texture.o texture.png

else

# MinGW

04_loadpng_objcopy.exe: 04_loadpng_objcopy.c texture.o Makefile
    gcc 04_loadpng_objcopy.c texture.o -o 04_loadpng_objcopy.exe -D FREEGLUT_STATIC -lfreeglut_static -lopengl32 -lwinmm -lgdi32

texture.o: texture.png Makefile
    objcopy -I binary -O elf32-i386 -B i386 texture.png texture.o

#texture.o: texture.png Makefile
#   ld -r -b binary -o texture.o texture.png

endif

.PHONY: clean
clean:
    rm -f 04_loadpng_objcopy.exe
    rm -f *.o

サンプルについてくる Makefile としては、ちょっと分かりづらくなるな…。でもまあ、フツーはコンパイルの仕方を書かないでソースだけ紹介するサンプルが大半だし。まだ Makefile があるだけマシかも。

余談。特殊変数について :

余談。本来 Makefile を書くときは、$@ や $< 等の変数を使うのが当たり前だけど。

_Makefile の特殊変数・自動変数の一覧 | 晴耕雨読
_トリビアなmakefile入門

そのあたりを書いちゃうと、一見どういうことをしてるのか分からなくなりそうなので、あえてベタ書きしてます。ただ、こういう書き方をしてしまうなら、いっそのことbatファイルでもええやん、とも…。

以上です。

過去ログ表示

Prev - 2024/01 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project