[英]Makefile for Windows and Cygwin
我需要在Windows和Cygwin下运行makefile
。 我在makefile正确检测操作系统并设置适当的变量时遇到问题。
目的是为以下命令设置变量,然后使用变量在规则中调用命令:
rm
,Windows中的del
。 rmdir
(Cygwin和Windows中的不同参数) cp
,Windows中为copy
。 test
,在Windows中为IF EXIST
。 cat
,在Windows中type
。 这是我的尝试,该尝试始终使用else
子句:
OS_KIND = $(OSTYPE) #OSTYPE is an environment variable set by Cygwin.
ifeq ($(OS_KIND), cygwin)
ENV_OS = Cygwin
RM = rm -f
RMDIR = rmdir -r
CP = cp
REN = mv
IF_EXIST = test -a
IF_NOT_EXIST = ! test -a
LIST_FILE = cat
else
ENV_OS = Win_Cmd
RM = del -f -Q
RMDIR = rmdir /S /Q
IF_EXIST = if exist
IF_NOT_EXIST = if not exist
LIST_FILE = type
endif
我使用正斜杠字符“ /”作为目录分隔符。 Windows命令存在问题,因为它将命令解释为程序参数而不是分隔符。 有人知道如何解决这个问题吗?
我在Windows Console和Cygwin中都使用Mingw的make。
我强烈建议您使用CMake自动生成Makefile。 这些问题均已解决,并且支持MingW,MSYS和Cygwin。
RM: file(REMOVE [file1 ...])
RMDIR: file(REMOVE_RECURSE [file1 ...]) # (not quite the same functionality; deletes files, too)
CP: file(COPY files... DESTINATION...)
REN: file(RENAME <oldname> <newname>)
IF_EXIST: if(EXISTS file-name)
IF_NOT_EXIST: if(NOT EXISTS file-name)
LIST_FILE: file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX])
如果要生成MinGW Makefile,则所有路径都会自动转换为DOS样式。 这是一件美丽的事。
最后,它也使Makefile的其余部分变得更加简单。
准确检测构建平台是棘手的部分。 这就是我的方法。
ifeq '$(findstring ;,$(PATH))' ';'
UNAME := Windows
else
UNAME := $(shell uname 2>/dev/null || echo Unknown)
UNAME := $(patsubst CYGWIN%,Cygwin,$(UNAME)) # CYGWIN_NT-10.0 -> Cygwin
endif
UNAME变量设置为Linux,Cygwin,Windows,FreeBSD,NetBSD(或可能是Solaris,Darwin,OpenBSD,AIX,HP-UX)或未知。 然后可以在整个Makefile的其余部分进行比较,以分隔所有OS敏感变量和命令。
我将在另一个主题中对此进行进一步讨论
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.