1. ホーム
  2. メイクファイル

[解決済み】OSがmakefileを検出する

2022-03-30 08:45:46

質問

私は日常的に複数の異なるコンピュータと、Mac OS X、Linux、またはSolarisといった複数の異なるオペレーティングシステムで作業しています。私が取り組んでいるプロジェクトでは、リモート git リポジトリからコードを取得しています。

私は、どの端末にいてもプロジェクトに取り組めるのがいいと思っています。これまでは、パソコンを切り替えるたびにmakefileを変更することで、OSの変更を回避する方法を見つけてきました。しかし、これは面倒で、多くの頭痛の種を引き起こしています。

どのOSを使用しているかを検知し、それに応じて構文を変更するようにmakefileを修正するにはどうしたらよいでしょうか?

以下は、その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

解決方法は?

すでに多くの良い答えがここにありますが、私は両方のより完全な例を共有したかったのです。

  • を想定していません。 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