makefile - 操作系统检测 makefile

标签 makefile os-agnostic os-detection

我经常在几台不同的计算机和几个不同的操作系统上工作,这些操作系统是 Mac OS X、Linux 或 Solaris。对于我正在处理的项目,我从远程 git 存储库中提取代码。

无论我在哪个终端,我都希望能够处理我的项目。到目前为止,我已经找到了通过在每次切换计算机时更改 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

关于makefile - 操作系统检测 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57738682/

相关文章:

ffmpeg - 如何使用 ffmpeg 转换整个目录?

ffmpeg - 如何使用 ffmpeg 转换整个目录?

cross-platform - 是否可以使用 GLib 进行操作系统检测?

python - 如何从 Python 脚本中检测 Android 操作系统?

mercurial - 我使用 Mercurial Hook 将版本号嵌入到我的应用程序中的方法有多好?

ffmpeg - 如何使用 ffmpeg 转换整个目录?

c++ - 生成文件错误

bash - 如何从 Bash 脚本检测操作系统?

c - 手工制作和自动生成的 makefile 在 windows 下失败但在 unix 上工作

c - 等待运行目标的 makefile 列表