我尝试使用以下命令构建 Debian 软件包:
debian/rules clean
dpkg-source -b .
debian/rules build
debian/rules binary
我有这个文件:
myprog_1.1.0.orig.tar.gz
myprog_1.1.0-1.dsc
myprog_1.1.0-1.debian.tar.xz
myprog_1.1.0-1_all.deb
myprog-doc_1.1.0-1_all.deb
所有步骤均已成功完成。当我打开目录时myprog-1.1.0/debian
,我发现了一些看起来像 Debian 软件包的东西。但我的图书馆不在其中,它们在myprog-1.1.0/debian/tmp/usr/lib/...
.
而且编译好的库不在我的.deb
.
- 这是正常的吗?
- 还需要做些什么来完成这个包吗?
- 如果我希望它分发它,我应该重新创建一个
tar.gz
frommyprog-1.1.0
吗?
答案1
我认为您的构建缺少的重要一点是make install
荣誉Makefile
变量DESTDIR
(在打包目标上应该类似于./debian/myprog
)。
构建之后、打包之前,库应该位于myprog-1.1.0/debian/myprog/usr/lib
not中tmp
。
作为参考:以下是一个最小的工作示例以及我用来获取包的命令。将这些文件全部放入该目录中myprog-1.0.1
。
Makefile
:
CFLAGS += -O2 -Wall
LIBS += -L$(BUILDDIR)/usr/lib -lfunc
ifeq ($(BUILDDIR),)
BUILDDIR = build
endif
all: $(BUILDDIR)/usr/bin/myprog $(BUILDDIR)/usr/lib/libfunc.so
install: $(BUILDDIR)/usr/bin/myprog $(BUILDDIR)/usr/lib/libfunc.so
mkdir -p $(DESTDIR)/usr/bin $(DESTDIR)/usr/lib
cp $(BUILDDIR)/usr/bin/myprog $(DESTDIR)/usr/bin
cp $(BUILDDIR)/usr/lib/libfunc.so $(DESTDIR)/usr/lib
dir-stamp:
mkdir -p $(BUILDDIR)/usr/bin $(BUILDDIR)/usr/lib
touch $@
$(BUILDDIR)/usr/bin/myprog: myprog.c $(BUILDDIR)/usr/lib/libfunc.so
$(CC) $(CFLAGS) -o $@ $< $(LIBS)
$(BUILDDIR)/usr/lib/libfunc.so: func.c dir-stamp
$(CC) $(CFLAGS) -shared -o $@ $<
clean:
-rm -fr dir-stamp $(BUILDDIR)
myprog.c
:
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
int main(int argc, char **argv) {
printf("%d\n", func(atoi(argv[1]), atoi(argv[2])));
return 0;
}
func.h
:
#ifndef FUNC_H
#define FUNC_H
int func(int a, int b);
#endif
func.c
:
#include "func.h"
int func(int a, int b) {
return a + b;
}
这里是命令:
dh_make --createorig
#choose type of package (single)
rm debian/*.ex debian/*.EX (if not needed)
# update: depcheck against the built command
dpkg-depcheck -d ./build/usr/bin/myprog 1 1
#edit debian/control (add Build-Depends)
dpkg-buildpackage -us -uc -rfakeroot
dpkg --contents ../myprog_1.0.1-1_i386.deb
./
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/myprog/
./usr/share/doc/myprog/changelog.Debian.gz
./usr/share/doc/myprog/copyright
./usr/share/doc/myprog/README.Debian
./usr/lib/
./usr/lib/libfunc.so
./usr/bin/
./usr/bin/myprog
使用cmake
:
我对 没有信心cmake
,但快速测试有效。
唯一奇怪的是命令行中生成Makefile
, 的前缀可能会出现问题,具体取决于项目的复杂性。
默认情况下,cmake
使用/usr/local
作为前缀,在 上构建包时会出现错误rmdir
,但使用/usr
可以。
另请注意,我添加了OWNER_WRITE
,因为删除 rpath 时出现错误myprog
,可能有更好的方法来正确设置所需的权限。
CMakeLists.txt
:
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(myprog C)
ADD_DEFINITIONS(-O2 -Wall)
ADD_EXECUTABLE(myprog myprog.c)
ADD_LIBRARY(func SHARED func.c)
TARGET_LINK_LIBRARIES(myprog func)
INSTALL(TARGETS myprog DESTINATION "bin"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
INSTALL(TARGETS func DESTINATION "lib"
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
生成Makefile
使用:
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .