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

January 6, 2014 · 1 min · kamus

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\e32m OK [\em FAILURE = [\e[1m\e31m FAILURE [\em 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 -MT $2 $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $1 ...

August 7, 2013 · 1 min · kamus