Make command for Windows - possible options?
As you found, a stand-alone make
wasn't enough; you needed Cygwin.
make
is a program that interprets a makefile and executes the commands in the makefile. But, what are those commands? If you look at your makefile you will see UNIX-style commands that are available in Linux, Mac OS X, or Cygwin but are not available in an off-the-shelf Windows system. Thus, simply grabbing a make
wasn't enough.
How to install and use make in Windows?
make
is a GNU command so the only way you can get it on Windows is installing a Windows version like the one provided by GNUWin32. Anyway, there are several options for getting that:
The most simple choice is using Chocolatey. First you need to install this package manager. Once installed you simlpy need to install
make
(you may need to run it in an elevated/admin command prompt) :choco install make
Other recommended option is installing a Windows Subsystem for Linux (WSL/WSL2), so you'll have a Linux distribution of your choice embedded in Windows 10 where you'll be able to install
make
,gcc
and all the tools you need to build C programs.For older Windows versions (MS Windows 2000 / XP / 2003 / Vista / 2008 / 7 with msvcrt.dll) you can use GnuWin32.
An outdated alternative was MinGw, but the project seems to be abandoned so it's better to go for one of the previous choices.
How to run a makefile in Windows?
If you have Visual Studio, run the Visual Studio Command prompt from the Start menu, change to the directory containing Makefile.win
and type this:
nmake -f Makefile.win
You can also use the normal command prompt and run vsvars32.bat (c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools for VS2008). This will set up the environment to run nmake and find the compiler tools.
Is there an equivalent of Make on Windows?
I found some ports of gnu make for
Windows, but they don't seem to be
working.
Here are a few ports of GNU tools to Windows:
- GnuWin32 - http://gnuwin32.sourceforge.net/summary.html
- Gnu Tools for NT - http://www.devhood.com/Tools/tool_details.aspx?tool_id=3
- GNU Utilities for Win32 - http://unxutils.sourceforge.net/
I am pretty sure I have used some of the utilities from the unxutils port without problems.
Cannot compile Makefile using make command on Windows
I can't answer but maybe I can orient you.
First nmake
is not make. It will not work with any makefile not written specifically as an nmake makefile. And it's only available on Windows. So, best to just forget it exists.
Second, it's important to understand how make works: rules in makefiles are a combination of targets/prerequisites, and a recipe. The recipe is not in "makefile" syntax, it's a shell script (batch file). So make works in tandem with the shell, to run commands. Which shell? On POSIX systems like GNU/Linux and MacOS it's very simple: a POSIX shell; by default /bin/sh
.
On Windows systems it's much less simple: there are a lot of options. It could be cmd.exe
. It could be PowerShell. It could be a POSIX shell, that was installed by the user. Which one is chosen by default, depends on how your version of make
was compiled. That's why you see different behaviors for different "ports" of make
to Windows.
So, if you look at the makefiles you are trying to use you can see they are unquestionably written specifically for a POSIX system and expect a POSIX shell and a POSIX environment. Any attempt to use a version of make
that invokes cmd.exe
as its default shell will fail immediately with syntax errors ("" was unexpected at this time.).
OK, so you find a version of make that invokes a POSIX shell, and you don't get that error anymore.
But then you have to contend with another difference: directory separators. In Windows they use backslash. In POSIX systems, they use forward slash and backslash is an escape character (so it's not just passed through the shell untouched). If you are going to use paths in a POSIX shell, you need to make sure your paths use forward slashes else the shell will remove them as escape characters. Luckily, most Windows programs accept forward slashes as well as backslashes as directory separators (but not all: for example cmd.exe
built-in tools do not).
Then you have to contend with the Windows abomination known as drive letters. This is highly problematic for make
because to make
, the :
character is special in various places. So when make sees a line like C:/foo:C:/bar
its parser will get confused, and you get errors. Some versions of make
compiled for Windows enable a heuristic which tries to see if a path looks like a drive letter or not. Some just assume POSIX-style paths. They can also be a problem for the POSIX shell: many POSIX environments on Windows map drive letters to standard POSIX paths, so C:\foo
is written as /c/foo
or /mnt/c/foo
or something else. If you are adding paths to your makefile you need to figure out what the right mapping, if any, is and use that.
That's not even to start discussing the other differences between POSIX and Windows... there are so many.
From what you've shown above, this project was not written with any sort of portability to Windows in mind. Given the complexity of this, that's not surprising: it takes a huge amount of work. So you have these options that I can see:
- Port it yourself to be Windows-compatible
- Try to get it working inside cygwin (cygwin is intended to be a POSIX-style environment that runs on Windows)
- Try to get it working in WSL
- Install a virtual machine using VMWare, VirtualBox, etc. running a Linux distribution and build and run it there
Unfortunately I don't know much about the pros and cons of these approaches so I can't advise you as to the best course.
The route I chose, long long ago, was to get rid of Windows entirely and just use GNU/Linux. But of course that won't be possible for everyone :).
Create a batch file with multiple options
This should get you started. The CHOICE command is available in most versions of Windows but may require that you get the Windows NT 4 resource kit. The CHOICE command is available in Windows 7.
@ECHO OFF
CLS
ECHO 1.Restart
ECHO 2.Shutdown
ECHO 3.Close all Windows
ECHO 4.Log off
ECHO 5.Switch User
ECHO.
CHOICE /C 12345 /M "Enter your choice:"
:: Note - list ERRORLEVELS in decreasing order
IF ERRORLEVEL 5 GOTO SwitchUser
IF ERRORLEVEL 4 GOTO Logoff
IF ERRORLEVEL 3 GOTO CloseAllWindows
IF ERRORLEVEL 2 GOTO Shutdown
IF ERRORLEVEL 1 GOTO Restart
:Restart
ECHO Restart (put your restart code here)
GOTO End
:Shutdown
ECHO Shutdown (put your shutdown code here)
GOTO End
:CloseAllWindows
ECHO Close All Windows (put your close all windows code here)
GOTO End
:Logoff
ECHO Logoff (put your log off code here)
GOTO End
:SwitchUser
ECHO Switch User (put your switch user code here)
GOTO End
:End
Is there an equivalent of 'which' on the Windows command line?
Windows Server 2003 and later (i.e. anything after Windows XP 32 bit) provide the where.exe
program which does some of what which
does, though it matches all types of files, not just executable commands. (It does not match built-in shell commands like cd
.) It will even accept wildcards, so where nt*
finds all files in your %PATH%
and current directory whose names start with nt
.
Try where /?
for help.
Note that Windows PowerShell defines where
as an alias for the Where-Object
cmdlet, so if you want where.exe
, you need to type the full name instead of omitting the .exe
extension. Alternatively, you can set an alias for it:
Set-Alias which where.exe
Update: Using Get-Command
(alias: gcm
) is recommended since it's native to PS and will get all command types: aliases, cmdlets, executables, and functions. Example:
gcm notepad*
Calling Windows commands (e.g. del) from a GNU makefile
It seems the /C
switch needs to be escaped because a /
is interpreted as a path in GNU Make. The following works as expected:
clean:
cmd //C del *.o
Related Topics
Is It Ok (Performance-Wise) to Have Hundreds or Thousands of Files in the Same Linux Directory
How to Run the Cron Job as a User Instead of Root User
Component Based Web Project Directory Layout with Git and Symlinks
On X64 Linux, Differencebetween Syscall, Int 0X80 and Ret to Exit a Program
Compiling 32 Bit Assembler on 64 Bit Ubuntu
How to Set Environment Variables on Ec2 Instance via User Data
Differencebetween Ldd and Objdump
How to Create Virtual Environment for Python 3.7.0
How to Find the Main Function's Entry Point of Elf Executable File Without Any Symbolic Information
Add a Header to a Tab Delimited File
Libaio.So.1: Cannot Open Shared Object File
How to Get Pid from Forked Child Process in Shell Script
How to Name the 'Screen' Logfile from the -L Flag
Find All Writable Files in the Current Directory
How to Emulate Raspberry Pi Raspbian with Qemu
What's the Point of Using Busybox in a Low Ram Embedded System