c - 适用于 Windows 和 Cygwin 的 Makefile

标签 c windows cmd makefile cygwin

我需要一个在 Windows 和 Cygwin 下工作的 makefile。我在 makefile 正确检测操作系统并设置适当的变量时遇到问题。

目标是为以下命令设置变量,然后使用变量调用规则中的命令:

  • 删除文件:Cygwin 中的rmdel 在 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/

相关文章:

c - 使用 Zookeeper C 客户端的进程在 SIGTERM 上断开连接

C 在 shell 命令中使用字符串

c++ - 如何追踪 Windows USER 对象泄漏?

c++ - 为什么不能访问自 Windows 95 以来另一个进程的地址空间?

windows - SC - ChangeServiceConfig 失败 5 : on cmd

cmd - PHP Composer 和 Laravel 安装程序输出中的奇怪字符 - Windows 10 CMD

windows - 无法从批处理文件启动程序。 Windows 找不到文件

c - 从 C 中的列表的递归组合中打印

windows - 从命令提示符执行 AutoIt 脚本

c - 将结构成员数组传递给 C 中的函数