{"id":328,"date":"2026-10-13T15:21:10","date_gmt":"2026-10-13T15:21:10","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2012\/05\/24\/make-for-windows-nmake\/"},"modified":"2026-10-13T15:21:10","modified_gmt":"2026-10-13T15:21:10","slug":"make-for-windows-nmake","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/make-for-windows-nmake\/","title":{"rendered":"NMake for Windows: What It Is, How to Install It, and How to Use It"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">NMake is Microsoft\u2019s implementation of the <em>make<\/em> build utility for Windows. If you work with Visual Studio toolchains, legacy Perl module builds, or command-line Windows builds, this guide will help you understand where NMake fits, how to install or locate it, and how to run common build commands safely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2012-05-24; fully revised and updated.<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2012\/05\/windows-nmake.png\" alt=\"NMake on Windows\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">What NMake is and when to use it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">NMAKE.EXE reads a build description file (commonly called a makefile) and runs the commands needed to compile, test, or package software. In practice, many Windows build instructions that say <code>make<\/code> are adapted to <code>nmake<\/code> when using Microsoft toolchains.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The original post defines NMake as Microsoft\u2019s Program Maintenance Utility and also highlights a common use case: replacing Unix-style make steps with NMake commands in Windows environments.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where to get NMake on Windows<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are two practical paths: a modern Visual Studio-based path and a legacy standalone package path referenced in the original article.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Option<\/th><th>Best for<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Visual Studio \/ Build Tools environment<\/td><td>Current Windows C\/C++ build workflows<\/td><td>Typically the preferred modern approach; NMake is used from a configured developer command shell.<\/td><\/tr><tr><td>Legacy NMAKE 1.5 package<\/td><td>Older workflows like historical ActivePerl instructions<\/td><td>Original links: <a href=\"http:\/\/support.microsoft.com\/default.aspx?scid=kb;en-us;Q132084\">Microsoft KB<\/a> and <a href=\"http:\/\/download.microsoft.com\/download\/vc15\/patch\/1.52\/w95\/en-us\/nmake15.exe\">direct nmake15.exe<\/a>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Legacy installation steps from the original ActivePerl workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post describes a legacy installation method that was common for older Perl-on-Windows setups.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Download <code>nmake15.exe<\/code>.<\/li><li>Run it to extract files such as <code>nmake.exe<\/code>, <code>nmake.err<\/code>, and <code>readme.txt<\/code>.<\/li><li>Copy <code>nmake.exe<\/code> and <code>nmake.err<\/code> to <code>C:\\Perl\\bin<\/code> (as described in the original post).<\/li><li>Open a command window and run <code>nmake<\/code> to verify it responds.<\/li><\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">nmake<\/span>\n\n<span class=\"hljs-selector-tag\">Microsoft<\/span> (<span class=\"hljs-selector-tag\">R<\/span>) <span class=\"hljs-selector-tag\">Program<\/span> <span class=\"hljs-selector-tag\">Maintenance<\/span> <span class=\"hljs-selector-tag\">Utility<\/span>   <span class=\"hljs-selector-tag\">Version<\/span> 1<span class=\"hljs-selector-class\">.50<\/span>\n<span class=\"hljs-selector-tag\">Copyright<\/span> (<span class=\"hljs-selector-tag\">c<\/span>) <span class=\"hljs-selector-tag\">Microsoft<\/span> <span class=\"hljs-selector-tag\">Corp<\/span> 1988<span class=\"hljs-selector-tag\">-94<\/span>. <span class=\"hljs-selector-tag\">All<\/span> <span class=\"hljs-selector-tag\">rights<\/span> <span class=\"hljs-selector-tag\">reserved<\/span>.\n\n<span class=\"hljs-selector-tag\">NMAKE<\/span> : <span class=\"hljs-selector-tag\">fatal<\/span> <span class=\"hljs-selector-tag\">error<\/span> <span class=\"hljs-selector-tag\">U1064<\/span>: <span class=\"hljs-selector-tag\">MAKEFILE<\/span> <span class=\"hljs-selector-tag\">not<\/span> <span class=\"hljs-selector-tag\">found<\/span> <span class=\"hljs-selector-tag\">and<\/span> <span class=\"hljs-selector-tag\">no<\/span> <span class=\"hljs-selector-tag\">target<\/span> <span class=\"hljs-selector-tag\">specified<\/span>\n<span class=\"hljs-selector-tag\">Stop<\/span>.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The <code>U1064<\/code> message above is expected when NMake runs without a makefile or explicit target.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Typical NMake workflow for Perl module builds<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For Perl module workflows that document Unix-style <code>make<\/code> commands, the Windows equivalent is usually <code>nmake<\/code>.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Open Windows build shell] --> B[Run perl Makefile.PL]\n    B --> C[Run nmake]\n    C --> D[Run nmake test]\n    D --> E{Tests pass}\n    E -- no --> F[Fix code and rerun]\n    E -- yes --> G[Run nmake install]\n<\/pre>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">perl<\/span> <span class=\"hljs-selector-tag\">Makefile<\/span><span class=\"hljs-selector-class\">.PL<\/span>\n<span class=\"hljs-selector-tag\">nmake<\/span>\n<span class=\"hljs-selector-tag\">nmake<\/span> <span class=\"hljs-selector-tag\">test<\/span>\n<span class=\"hljs-selector-tag\">nmake<\/span> <span class=\"hljs-selector-tag\">install<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Unix-style make commands vs Windows NMake commands<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Common docs (Unix-style)<\/th><th>Windows with NMake<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>perl Makefile.PL<\/code><\/td><td><code>perl Makefile.PL<\/code><\/td><td>Generate build files<\/td><\/tr><tr><td><code>make<\/code><\/td><td><code>nmake<\/code><\/td><td>Build<\/td><\/tr><tr><td><code>make test<\/code><\/td><td><code>nmake test<\/code><\/td><td>Run tests<\/td><\/tr><tr><td><code>make install<\/code><\/td><td><code>nmake install<\/code><\/td><td>Install artifacts<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Minimal NMake makefile example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If your environment has Microsoft C\/C++ tools configured, a minimal NMake file can look like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-makefile\">CC=cl\nCFLAGS=<span class=\"hljs-regexp\">\/nologo \/<\/span>W3\n\n<span class=\"hljs-attr\">all<\/span>: hello.exe\n\nhello.exe: hello.c\n\t$(CC) $(CFLAGS) \/Fehello.exe hello.c\n\n<span class=\"hljs-attr\">clean<\/span>:\n\tdel hello.exe<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">nmake\nnmake clean<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Historical Microsoft reference from the original post: <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd9y37ha%28v=vs.71%29.aspx\">MSDN NMake documentation link<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use a properly configured Windows developer shell so compiler and linker tools are on <code>PATH<\/code>.<\/li><li>In legacy setups, keep <code>nmake.err<\/code> with <code>nmake.exe<\/code> as instructed by the original workflow.<\/li><li>If NMake reports missing makefiles, verify file name, current directory, and explicit target usage.<\/li><li>Do not assume GNU Make syntax is fully compatible with NMake; review makefile syntax when porting build scripts.<\/li><li>Treat very old download links as legacy references and validate trusted sources before use.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>NMake is Microsoft\u2019s make utility for Windows, commonly used in Visual Studio and older Perl-on-Windows build flows. This guide explains what NMake does, how to set it up (including legacy steps from the original post), and how to run practical build commands.<\/p>\n","protected":false},"author":1,"featured_media":3796,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[55],"tags":[2433,2430,2431,2424,2432,670,2423,182,2425,2428,2426,2427,2429],"class_list":["post-328","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-windows","tag-about-nmake","tag-namke-guide","tag-namke-tutorial","tag-nmake","tag-nmake-introduction","tag-what","tag-what-is-nmake","tag-windows","tag-windows-nmake","tag-windows-nmake-instruction","tag-windows-nmake-introduction","tag-windows-nmake-overview","tag-windows-nmake-references"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=328"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/328\/revisions"}],"predecessor-version":[{"id":79196,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/328\/revisions\/79196"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3796"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}