configure –prefix 和 make install DESTDIR= 还有make install prefix 什么区别

./configure –prefix=*

确定了程序会被包装到哪里,以及,程序将在什么位置搜寻运行需要用到的相关的文件。如果你在一台机器上编译,然后仍然在这台机器上运行,那使用configure –prefix就是你想要的了。

 

make install DESTDIR=*

把程序安装到一个临时用的目录,这个目录不是程序以后将要运行的目录。例如,这个功能被deb包的打包人员使用。打包人员使用此功能时,并不真正把程序安装到–prefix指定的目录下。因为他可能已经安装了不同的版本,他不想搞乱他的环境,或者他没有boot权限,没有办法把程序安装到/bin,/sbin之类目录。 –prefix=/usr,让程序运行时认为被安装在/usr,然后make install DESTDIR=debian/tmp则实际把程序安装到debian/tmp。

 

make install prefix=/foo/bar/baz

和 make install DESTDIR的区别在于,前者不会创建prefix后面指定的所有目录层级,而DESTDIR会。

例如:

./configure –prefix=usr/local && make && sudo make install prefix=/usr/local/stow/foo 会把程序安装在/usr/local/stow/bin目录下。

而: make install DESTDIR=/usr/local/stow/foo,则把程序安装在/usr/local/stow/foo/usr/local/bin下面。

copyright ykyi.net

makefile使cpp文件依赖头文件

读代码时发现目前工程中的makefile文件中有一个问题或bug,.即cpp文件没有和该.cpp文件include的头文件建立依赖性。这个危害是,当头文件被修改后,受影响的.cpp文件对应的.o文件不会被重新创建。

 

而目前的代码中大量使用C++模板,模板的实现全部写在.h文件中.

我做了个实验,修改了单件模板的实现文件 SingletonHolder.h。虽然这个修改影响了大量include了SingletonHolder.h的.cpp文件,但它们对应的.o全被没有被重新编译。

 

解决方法是用g++编译器提供的 -MM 选项。这个选项会让g++在把.cpp依赖的头文件(除系统头文件)全部列出来。具体的使用方法可以查阅手册。思路是,把cpp文件和头文件的依赖性写入到.d文件,在主makefile文件中include所有的.d文件。

 

以tcpd工程为列,修改后的makefile如下(亦见附件),该makefile可以检查到.cpp依赖的头文件被修改,使得重新生成目标文件。

 

 

include ./makefile.def

SRCS = $(wildcard *.cpp)

OBJS = (patsubst %.cpp,%.o,(SRCS))

# 每个.cpp都对应一个.d文件,.d文件由g++ -MM生成,列出了.cpp依赖的头文件.

DEPENDENCIES = (subst .cpp,.d,(SRCS))

TARGET = tcpd

OK = \\e[1m\\e[32m OK \\e[m

FAILURE = \\e[1m\\e[31m FAILURE \\e[m

all:$(TARGET)

 

# 使包含.d文件,.d文件指定了.o文件依赖哪些头文件。

# 如果不是make clean 就include所有的.d文件。

ifneq "$(MAKECMDGOALS)" "clean"

  -include $(DEPENDENCIES)

endif

 

# 此函数生成.d文件,参考g++的 -MM -MF -MT选项

#$(call make-depend,source-file,object-file,depend-file)

define make-depend

  g++ -MM -MF 3 -MT2 (CXXFLAGS)(CPPFLAGS) (TARGET_ARCH)1

endef

 

 

$(TARGET):$(OBJS)

              @echo -ne Linking $(TARGET) …

              @(CXX)(C_FLAGS)  (INC) -fPIC -o@ ^(LIB) && echo  -e (OK) || echo -e(FAILURE)

 

%.o:%.cpp

#如果.cpp文件被修改,就重新生成.d文件.

              (call make-depend,<,@,(subst .o,.d,$@))

              @echo -ne Compiling $<  …

              @(CXX)(C_FLAGS)  (INC) -fPIC -c -o@ < && echo  -e(OK) || echo -e $(FAILURE)

             

clean:

       @rm -f *.o

       @rm -f ./$(TARGET)

 

install:clean all

#     strip $(TARGET)