我经常在几台不同的计算机和几个不同的操作系统上工作,它们是 Mac OS X、Linux 或 Solaris。对于我正在处理的项目,我从远程 git 存储库中提取代码。
无论我在哪个终端,我都希望能够处理我的项目。到目前为止,我已经找到了通过在每次切换计算机时更改生成文件来绕过操作系统更改的方法。然而,这很乏味并且会引起很多头痛。
如何修改我的 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
此处定义的 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