Search code examples
cwindowscmdmakefilecygwin

Makefile for Windows and Cygwin


I need to have a makefile work under Windows and Cygwin. I having problems with the makefile detecting the OS correctly and setting appropriate variables.

The objective is to set variables for the following commands, then invoke the commands in rules using the variables:

  • Delete file: rm in Cygwin, del in Windows.
  • Remove directory: rmdir (different parameters in Cygwin and Windows)
  • Copy file: cp in Cygwin, copy in Windows.
  • Testing for file existance: test in Cygwin, IF EXIST in Windows.
  • Listing contents of a file: cat in Cygwin, type in Windows.

Here is my attempt, which always uses the else clause:

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

I'm using the forward slash character, '/', as a directory separator. This is a problem with the Windows command, as it is interpreting it as program argument rather than a separator. Anybody know how to resolve this issue?

I am using make with Mingw in both Windows Console and Cygwin.


Solution

  • CMake, suggested by Matt B., is one of the right answers to this question. Other right answers are SCons, Jam, and Bakefile.

    Since you're using Cygwin, Autoconf+Automake also gives you the tools to solve your problem. It's more of a toolkit for solving the problem than an out-of-the-box solution, though.

    The overarching point is to move up a layer of abstraction so you can support lots of build systems from only a single source.