<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Make on kamuszhou&#39;s blog</title>
    <link>https://ykyi.net/tags/make/</link>
    <description>Recent content in Make on kamuszhou&#39;s blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 06 Jan 2014 02:19:04 +0000</lastBuildDate>
    <atom:link href="https://ykyi.net/tags/make/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>configure –prefix 和 make install DESTDIR= 还有make install prefix 什么区别</title>
      <link>https://ykyi.net/?p=1116/</link>
      <pubDate>Mon, 06 Jan 2014 02:19:04 +0000</pubDate>
      <guid>https://ykyi.net/?p=1116/</guid>
      <description>&lt;p&gt;./configure –prefix=*&lt;/p&gt;
&lt;p&gt;确定了程序会被包装到哪里，以及，程序将在什么位置搜寻运行需要用到的相关的文件。如果你在一台机器上编译，然后仍然在这台机器上运行，那使用configure –prefix就是你想要的了。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;make install DESTDIR=*&lt;/p&gt;
&lt;p&gt;把程序安装到一个临时用的目录，这个目录不是程序以后将要运行的目录。例如，这个功能被deb包的打包人员使用。打包人员使用此功能时，并不真正把程序安装到–prefix指定的目录下。因为他可能已经安装了不同的版本，他不想搞乱他的环境，或者他没有boot权限，没有办法把程序安装到/bin,/sbin之类目录。 –prefix=/usr，让程序运行时认为被安装在/usr，然后make install DESTDIR=debian/tmp则实际把程序安装到debian/tmp。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;make install prefix=/foo/bar/baz&lt;/p&gt;
&lt;p&gt;和 make install DESTDIR的区别在于，前者不会创建prefix后面指定的所有目录层级，而DESTDIR会。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;./configure –prefix=usr/local &amp;amp;&amp;amp; make &amp;amp;&amp;amp; sudo make install prefix=/usr/local/stow/foo 会把程序安装在/usr/local/stow/bin目录下。&lt;/p&gt;
&lt;p&gt;而: make install DESTDIR=/usr/local/stow/foo，则把程序安装在/usr/local/stow/foo/usr/local/bin下面。&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;color: rgb(0, 0, 0); font-family: Verdana, Geneva, sans-serif; font-size: 16px; line-height: 22px; background-color: rgb(244, 244, 244);&#34;&gt;copyright ykyi.net&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>makefile使cpp文件依赖头文件</title>
      <link>https://ykyi.net/?p=974/</link>
      <pubDate>Wed, 07 Aug 2013 12:00:10 +0000</pubDate>
      <guid>https://ykyi.net/?p=974/</guid>
      <description>&lt;p&gt;读代码时发现目前工程中的makefile文件中有一个问题或bug，.即cpp文件没有和该.cpp文件include的头文件建立依赖性。这个危害是，当头文件被修改后，受影响的.cpp文件对应的.o文件不会被重新创建。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;而目前的代码中大量使用C++模板，模板的实现全部写在.h文件中.&lt;/p&gt;
&lt;p&gt;我做了个实验，修改了单件模板的实现文件 SingletonHolder.h。虽然这个修改影响了大量include了SingletonHolder.h的.cpp文件，但它们对应的.o全被没有被重新编译。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;解决方法是用g++编译器提供的 -MM 选项。这个选项会让g++在把.cpp依赖的头文件(除系统头文件)全部列出来。具体的使用方法可以查阅手册。思路是，把cpp文件和头文件的依赖性写入到.d文件，在主makefile文件中include所有的.d文件。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;以tcpd工程为列，修改后的makefile如下(亦见附件)，该makefile可以检查到.cpp依赖的头文件被修改，使得重新生成目标文件。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;include ./makefile.def&lt;/p&gt;
&lt;p&gt;SRCS = $(wildcard *.cpp)&lt;/p&gt;
&lt;p&gt;OBJS = $(patsubst %.cpp,%.o,$(SRCS))&lt;/p&gt;
&lt;p&gt;# 每个.cpp都对应一个.d文件，.d文件由g++ -MM生成，列出了.cpp依赖的头文件.&lt;/p&gt;
&lt;p&gt;DEPENDENCIES = $(subst .cpp,.d,$(SRCS))&lt;/p&gt;
&lt;p&gt;TARGET = tcpd&lt;/p&gt;
&lt;p&gt;OK = [\e[1m\e&lt;a href=&#34;file:///%5Ce%5B1m%5Ce%5b32m&#34;&gt;32m&lt;/a&gt; OK [\e&lt;a href=&#34;file:///%5Ce%5Bm&#34;&gt;m&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;FAILURE = [\e[1m\e&lt;a href=&#34;file:///%5Ce%5B1m%5Ce%5b31m&#34;&gt;31m&lt;/a&gt; FAILURE [\e&lt;a href=&#34;file:///%5Ce%5Bm&#34;&gt;m&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;all:$(TARGET)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;# 使包含.d文件，.d文件指定了.o文件依赖哪些头文件。&lt;/p&gt;
&lt;p&gt;# 如果不是make clean 就include所有的.d文件。&lt;/p&gt;
&lt;p&gt;ifneq &amp;ldquo;$(MAKECMDGOALS)&amp;rdquo; &amp;ldquo;clean&amp;rdquo;&lt;/p&gt;
&lt;p&gt;  -include $(DEPENDENCIES)&lt;/p&gt;
&lt;p&gt;endif&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;# 此函数生成.d文件，参考g++的 -MM -MF -MT选项&lt;/p&gt;
&lt;p&gt;#$(call make-depend,source-file,object-file,depend-file)&lt;/p&gt;
&lt;p&gt;define make-depend&lt;/p&gt;
&lt;p&gt;  g++ -MM -MF $3 -MT $2 $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $1&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
