我需要一个在 Windows 和 Cygwin 下工作的 makefile
。我在 makefile 正确检测操作系统并设置适当的变量时遇到问题。
目标是为以下命令设置变量,然后使用变量调用规则中的命令:
- 删除文件:Cygwin 中的
rm
,del
在 Windows 中。 - 删除目录:
rmdir
(不同 Cygwin 和 Windows 中的参数) - 复制文件:在 Cygwin 中
cp
,在中复制
Windows。 - 测试文件是否存在:
test
在 Cygwin 中,IF EXIST
在 Windows 中。 - 列出文件的内容:
cat
in Cygwin,在 Windows 中输入
。
这是我的尝试,它始终使用 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 控制台和 Cygwin 中将 make 与 Mingw 一起使用。
最佳答案
我强烈建议您转到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 的其余部分变得更加简单。
关于c - 适用于 Windows 和 Cygwin 的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3065880/