私は日常的に、Mac OS X、Linux、Solaris など複数の異なるコンピューターと複数の異なるオペレーティング システムで作業しています。現在取り組んでいるプロジェクトでは、リモートの Git リポジトリからコードを取得します。
どの端末を使っていてもプロジェクトに取り組めるようにしたいです。これまで、コンピューターを切り替えるたびに makefile を変更することで OS の変更を回避する方法を見つけました。しかし、これは面倒で、多くの問題を引き起こします。
使用している OS を検出し、それに応じて構文を変更するように makefile を変更するにはどうすればよいでしょうか?
メイクファイルは次のとおりです:
cc = gcc -g
CC = g++ -g
yacc=$(YACC)
lex=$(FLEX)
all: assembler
assembler: y.tab.o lex.yy.o
$(CC) -o assembler y.tab.o lex.yy.o -ll -l y
assembler.o: assembler.c
$(cc) -o assembler.o assembler.c
y.tab.o: assem.y
$(yacc) -d assem.y
$(CC) -c y.tab.c
lex.yy.o: assem.l
$(lex) assem.l
$(cc) -c lex.yy.c
clean:
rm -f lex.yy.c y.tab.c y.tab.h assembler *.o *.tmp *.debug *.acts
ベストアンサー1
すでに多くの良い回答がここにありますが、私は次の両方のより完全な例を共有したいと思いました。
uname
Windows には存在しないと想定している- プロセッサも検出する
ここで定義されているものCCFLAGS
は、必ずしも推奨または理想的なものではありません。OS/CPU 自動検出を追加していたプロジェクトがたまたま使用していたものにすぎません。
ifeq ($(OS),Windows_NT)
CCFLAGS += -D WIN32
ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
CCFLAGS += -D AMD64
else
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
CCFLAGS += -D AMD64
endif
ifeq ($(PROCESSOR_ARCHITECTURE),x86)
CCFLAGS += -D IA32
endif
endif
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
CCFLAGS += -D LINUX
endif
ifeq ($(UNAME_S),Darwin)
CCFLAGS += -D OSX
endif
UNAME_P := $(shell uname -p)
ifeq ($(UNAME_P),x86_64)
CCFLAGS += -D AMD64
endif
ifneq ($(filter %86,$(UNAME_P)),)
CCFLAGS += -D IA32
endif
ifneq ($(filter arm%,$(UNAME_P)),)
CCFLAGS += -D ARM
endif
endif