用于DOS / Windows和Cygwin的Makefile

我需要在DOSWindows)和Cygwin下有makefile 。 我遇到了正确的检测操作系统和设置适当的variables的生成文件的问题。

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

  • 删除文件:在Cygwin中的rm ,在DOS中del
  • 删除目录: rmdir (Cygwin和DOS中的不同参数)
  • 复制文件:在Cygwin中的cp ,在DOS下copy
  • testing文件存在:在Cygwin中进行test ,在DOS中执行IF EXIST
  • 列出一个文件的内容:在Cygwin中type DOS。

这是我的尝试,总是使用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 

我使用正斜杠字符“/”作为目录分隔符。 这是DOS命令的一个问题,因为它将它解释为程序参数而不是分隔符。 有人知道如何解决这个问题?

编辑 :我在Windows控制台(DOS)和Cygwin中都使用了Mingw。

由Matt B.提出的CMake是这个问题的正确答案之一。 其他正确答案是SCons , Jam和Bakefile 。

由于您使用Cygwin, Autoconf + Automake也为您提供解决问题的工具。 不过,这更像是一个解决问题的工具,而不是一个开箱即用的解决方案。

首要的一点是向上移动一层抽象,以便您可以从单一来源支持大量构建系统。

我强烈建议你移动到CMake来自动生成你的Makefiles。 这些问题都已经解决了,支持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 Makefiles,则所有路径都将自动转换为DOS风格。 这是一件美丽的事情。

最后,这也使得Makefile的其他部分也变得更简单了。