| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html><head> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
| <meta name="keywords" content="NetBeans, IDE, Oracle Solaris Studio, integrated development environment, user, documentation, open source"> |
| <meta name="description" content="This article describes the Make Dependency Checking feature for C and C++ |
| projects in NetBeans IDE and Oracle Solaris Studio IDE. "> |
| <meta name="author" content="Alexey Vladykin"> |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css"> |
| <title>Make Dependency Checking - NetBeans IDE</title> |
| </head> |
| <body> |
| <a name="top"></a> |
| |
| <h1>Make Dependency Checking</h1> |
| <div class="articledate" style="margin-left: 0px;font-style:italic;"> |
| Contributed by Alexey Vladykin<br> |
| March 2014 [Revision number: V8.0-1] |
| </div> |
| <!-- maintained by susanm --> |
| |
| <p>This tutorial shows you how to enable the NetBeans IDE to check file dependencies in your projects when |
| building. Dependency checking is performed by the <tt>make</tt> utility through instructions in the <tt>Makefile</tt>.</p> |
| |
| <p><b>Contents</b></p> |
| <img src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" class="stamp" |
| alt="Content on this page applies to NetBeans IDE 7.3 and 7.4 and 8.0" |
| title="Content on this page applies to the NetBeans IDE 7.3 and 7.4 and 8.0"> |
| |
| <ul class="toc"> |
| <li><a href="#requirements" title="Requirements">Requirements</a></li> |
| <li><a href="#introduction" title="Introduction">Introduction</a></li> |
| <li><a href="#build" title="Build Process (make and Makefiles)">Build Process (make and |
| Makefiles)</a></li> |
| <li><a href="#basics" title="Dependency Generation Basics">Dependency Generation Basics</a></li> |
| <li><a href="#implementation" title="Implementation">Implementation</a></li> |
| </ul> |
| <h2><A NAME="requirements"></a>Requirements</h2> |
| <p><b>To follow this tutorial, you need the following software and resources.</b> </p> |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">Software</th> |
| <th class="tblheader" scope="col">Version Required</th> |
| </tr> |
| <tr> |
| <td class="tbltd1">NetBeans IDE (including C/C++ support)</td> |
| <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">version 7.3, 7.4, or 8.0 with NetBeans C/C++ plugin</a></td> |
| </tr> |
| <tr> |
| <td class="tbltd1">Java Development Kit (JDK)</td> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">version 7 or 8</a></td> |
| </tr> |
| </tbody> |
| </table> |
| <br> |
| <p>See the <a href="../../../community/releases/80/install.html">NetBeans IDE |
| Installation |
| Instructions</a> and <a |
| HREF="../../../community/releases/80/cpp-setup-instructions.html"> |
| Configuring the NetBeans IDE for C/C++/Fortran</a><br> for |
| information about downloading and installing the required software.</p> |
| |
| |
| <h2><a name="introduction"></a>Introduction</h2> |
| |
| <p> |
| Large C/C++ projects consist of thousands of files. For example, the Linux kernel |
| has about 20,000 files. If you are developing such a project and want |
| to rebuild it after a small change - say, a one line fix - |
| there are two options. |
| |
| <ul> |
| <li> |
| Full rebuild (Clean and Build action). It is slower, |
| but guarantees a consistent build result. |
| </li> |
| <li> |
| Incremental rebuild (Build action). It is faster, |
| but will it correctly rebuild everything that should be rebuilt? |
| </li> |
| </ul> |
| |
| <p> |
| The major problem with incremental rebuild is the presence of <tt>#include</tt> |
| directives, which include one file's content into another file. The included file |
| is known as a file dependency. Modification |
| of the included file should be treated as modification of all files that |
| include it. Indirect includes (A includes B, B includes C => A includes C) |
| make the problem even harder. |
| </p> |
| |
| <p> |
| NetBeans IDE supports automatic checking of file dependencies and |
| does its best to make incremental rebuild work correctly. If you change |
| a header file that is included into some of your source files and then |
| click Build, the IDE will rebuild only those |
| parts of the project that really depend on the changed header. |
| This feature saves time and guarantees consistent build results. |
| </p> |
| |
| <h3>Enabling Dependency Checking for a Project</h3> |
| |
| <p> |
| Dependency checking can be controlled for each particular project. |
| You may want to ensure that it's enabled. |
| </p> |
| <p><b>To enable dependency checking for a project:</b></p> |
| |
| <ol> |
| <li>Right-click the project in the Projects window and choose Properties.</li> |
| <li> |
| In the Project Properties dialog box, select the Build node in the Categories list. |
| </li> |
| <li>In the build properties, select the checkbox for Enable Make Dependency Checking.</li> |
| </ol> |
| <br> |
| |
| <img src="../../../images_www/articles/73/cnd/depchecking/project-checkbox.png" |
| alt="Make Dependency Checking checkbox in project properties" class="margin-around"> |
| <br> |
| <h3>Enabling Dependency Checking by Default for New Projects</h3> |
| <p>You can set a default state for dependency checking so that new projects you create are automatically |
| enabled for make dependency checking.</p> |
| <p><b>To enable dependency checking for all new projects created in the IDE:</b></p> |
| |
| <ol> |
| <li>Choose Tools > Options in the IDE main menu.</li> |
| <li> |
| Click the C/C++ button in the top pane. |
| </li> |
| <li>Click the Project Options tab.</li> |
| <li>Select the checkbox for Enable dependency checking in generated makefiles</li> |
| |
| |
| </ol> |
| <br> |
| |
| |
| <img src="../../../images_www/articles/73/cnd/depchecking/global-checkbox.png" |
| alt="Dependency checking checkbox in NetBeans options" class="margin-around"> |
| |
| |
| <h3 class="notes">Notes</h3> |
| |
| <ul> |
| <li> |
| Automatic dependency checking works for C/C++ projects that were created in the IDE |
| (managed projects). The IDE builds dependency checking logic into the generated <tt>Makefile</tt>. |
| For projects created with existing sources you have to rely on dependency |
| checking logic (if any) in the existing <tt>Makefile</tt>. |
| </li> |
| <li> |
| Dependency checking requires support from your tool collection |
| (<tt>make</tt> and compilers). It has been tested with the Oracle Solaris Studio tool collection |
| and GNU tool collections including Cygwin and MinGW. |
| </li> |
| <li> |
| Dependency checking works when Oracle Solaris Studio compilers are used together with |
| Oracle Solaris <tt>make</tt> and when GNU compilers are used with GNU <tt>gmake</tt>. |
| Mixing Oracle Solaris <tt>make</tt> with GNU compilers and vice versa is not supported. |
| </li> |
| </ul> |
| |
| <p> |
| The rest of the article is for those advanced users who |
| want to know what happens under the IDE's hood. |
| </p> |
| |
| |
| <h2><a name="build"></a>Build Process (make and makefiles)</h2> |
| <p> |
| The build process of every C/C++ project in NetBeans is described |
| in a <tt>Makefile</tt>, a file of special format understood by the |
| <tt>make</tt> utility. When you build or clean your project from the GUI, |
| the IDE invokes <tt>make</tt>, which executes the Makefile. This approach |
| allows you to easily build your project outside of the IDE using <tt>make</tt>: |
| just go to your project directory and type <tt>make help</tt> to get instructions. |
| </p> |
| |
| <p> |
| Makefiles used by NetBeans IDE for a C/C++ project are shown |
| below. |
| </p> |
| |
| <img src="../../../images_www/articles/73/cnd/depchecking/makefiles.png" alt="Makefiles used by NetBeans for C/C++ projects" class="margin-around"> |
| |
| <p> |
| The master <tt>Makefile</tt> is generated once and you can edit it manually. |
| Makefiles in <tt>nbproject</tt> directory are not meant for manual |
| editing; they are updated automatically by the IDE. The file |
| <tt>Makefile-<i>CONF</i>.mk</tt> in the illustration represents multiple files for all your |
| project configurations, |
| such as <tt>Makefile-Release.mk</tt>, <tt>Makefile-Debug.mk</tt>, and so on. |
| </p> |
| |
| <p> |
| For a managed project, the IDE generates all the makefiles itself |
| and inserts proper instructions for dependency checking. For |
| a project created from existing sources, dependency checking will |
| work only if the existing <tt>Makefile</tt> contains such instructions, |
| because the NetBeans IDE doesn't change the existing <tt>Makefile</tt>. |
| </p> |
| |
| |
| <h2><a name="basics"></a>Dependency Generation Basics</h2> |
| |
| <p> |
| If you want <tt>make</tt> to check included file dependencies during build |
| then you have to insert dependency information into the <tt>Makefile</tt>. |
| Unfortunately there is no portable way to do this for all <tt>make</tt> utilities |
| and compilers. First, you should detect which <tt>make</tt> is running, |
| and then generate corresponding dependency checking instructions. |
| </p> |
| |
| <p> |
| The Oracle Solaris <tt>make</tt> has a very simple solution. A special <tt>.KEEP_STATE:</tt> |
| rule in the <tt>Makefile</tt> instructs <tt>make</tt> to query the compiler about included |
| file dependencies and store them in a temporary file. Next time |
| the project is rebuilt, <tt>make</tt> loads that temporary file, |
| analyzes dependencies stored there, and determines which headers changed |
| and which object files should be recompiled. |
| </p> |
| |
| <p> |
| For GNU <tt>make</tt> (called <tt>gmake</tt>) the solution is more complex. You have to explicitly |
| ask the compiler to generate dependency information and then explicitly |
| include it into the <tt>Makefile</tt>. The idea is to pass special flags |
| to the compiler, so that the compiler will generate dependency information |
| for each compiled source file. Next time the project is rebuilt, dependency |
| information is collected and included into the <tt>Makefile</tt>. |
| </p> |
| |
| |
| <h2><a name="implementation"></a>Implementation</h2> |
| |
| <p> |
| The following code is added to <tt>nbproject/Makefile-impl.mk</tt>. |
| It detects which <tt>make</tt> is running and puts corresponding |
| dependency checking code into the file <tt>.dep.inc</tt>. GNU <tt>make</tt> is detected |
| by the presence of <tt>MAKE_VERSION</tt> variable. If <tt>MAKE_VERSION</tt> |
| is not set, then the Solaris <tt>make</tt>-specific instructions are generated. |
| </p> |
| |
| <pre class="examplecode"># dependency checking support |
| .depcheck-impl: |
| @echo "# This code depends on make tool being used" >.dep.inc |
| @if [ -n "${MAKE_VERSION}" ]; then \ |
| echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ |
| echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ |
| echo "include \$${DEPFILES}" >>.dep.inc; \ |
| echo "endif" >>.dep.inc; \ |
| else \ |
| echo ".KEEP_STATE:" >>.dep.inc; \ |
| echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ |
| fi</pre> |
| |
| <p> |
| The following code is added to <tt>nbproject/Makefile-${CONF}.mk</tt>. |
| It instructs <tt>make</tt> to read previously generated <tt>.dep.inc</tt> |
| and execute instructions from it. |
| </p> |
| |
| <pre class="examplecode"># Enable dependency checking |
| .dep.inc: .depcheck-impl |
| |
| include .dep.inc</pre> |
| |
| <p> |
| The rule <tt>.dep.inc: .depcheck-impl</tt> is added to prevent build |
| failure when <tt>.dep.inc</tt> does not exist. There is only one case |
| when it happens: when you compile single file from the Projects window. |
| In this case <tt>make</tt> executes file <tt>nbproject/Makefile-${CONF}.mk</tt> |
| directly. |
| </p> |
| |
| |
| <h2>References</h2> |
| |
| <ol> |
| <li> |
| <a href="http://en.wikipedia.org/wiki/Make_%28software%29" target="_blank">Wikipedia article about <tt>make</tt></a> |
| </li> |
| <li> |
| <a href="http://make.paulandlesley.org/autodep.html" target="_blank">Advanced Auto-Dependency Generation</a> |
| </li> |
| </ol> |
| <h2>See Also</h2> |
| <p>Please see the |
| <a href="https://netbeans.org/kb/trails/cnd.html">C/C++ Learning Trail</a> for |
| more articles about developing with C/C++/Fortran in NetBeans IDE.</p> |
| |
| <div class="feedback-box"><a href="mailto:users@cnd.netbeans.org?subject=Feedback:%20Make%20Dependency%20Checking%20-%20NetBeans%20IDE%208.0%20Tutorial">Send Feedback on This Tutorial</a></div> |
| |
| </body></html> |