我需要在DOS(Windows)和Cygwin下有makefile
。 我遇到了正确的检测操作系统和设置适当的variables的生成文件的问题。
目标是为以下命令设置variables,然后使用variables调用规则中的命令:
rm
,在DOS中del
。 rmdir
(Cygwin和DOS中的不同参数) cp
,在DOS下copy
。 test
,在DOS中执行IF EXIST
。 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的其他部分也变得更简单了。