这个页面作为搜集、整理ftbfs的解决方案。
https://wiki.debian.org/qa.debian.org/FTBFS
cc -DHAVE_CONFIG_H -I. -I.. -DPACKAGE_SRC_DIR=\""."\" -DPACKAGE_DATA_DIR=\""/usr/share"\" -Wdate-time -D_FORTIFY_SOURCE=2 -Wall -g -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -fPIE -c -o pmask.o pmask.c
pmask.c: In function ‘install_pmask’:
pmask.c:32:54: error: size of array ‘_compile_time_assert__’ is negative
32 | #define COMPILE_TIME_ASSERT(condition) {typedef char _compile_time_assert__[(condition) ? 1 : -1];}
| ^~~~~~~~~~~~~~~~~~~~~~
pmask.c:34:9: note: in expansion of macro ‘COMPILE_TIME_ASSERT’
34 | COMPILE_TIME_ASSERT((1 << MASK_WORD_BITBITS) == MASK_WORD_BITS);
| ^~~~~~~~~~~~~~~~~~~
pmask.c: In function ‘init_pmask’:
pmask.c:40:36: warning: unused variable ‘error’ [-Wunused-variable]
40 | int words, total_words, x, error = 0;
| ^~~~~
pmask.c: In function ‘get_serialized_pmask_size’:
pmask.c:105:13: warning: unused variable ‘words’ [-Wunused-variable]
105 | int words = 1 + ((w-1) >> MASK_WORD_BITBITS);
| ^~~~~
make[3]: *** [Makefile:495: pmask.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[3]: Leaving directory '/<<PKGBUILDDIR>>/src'
make[2]: *** [Makefile:410: all-recursive] Error 1
make[2]: Leaving directory '/<<PKGBUILDDIR>>'
make[1]: *** [Makefile:342: all] Error 2
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
dh_auto_build: error: make -j4 returned exit code 2
make: *** [debian/rules:9: binary-arch] Error 25
dpkg-buildpackage: error: debian/rules binary-arch subprocess returned exit status 2
--- open-invaders-0.3.orig/headers/pmask.h
+++ open-invaders-0.3/headers/pmask.h
@@ -37,7 +37,7 @@ confusing.
//don't worry about setting it incorrectly
//you'll get a compile error if you do, not a run-time error
#if defined(__alpha__) || defined(__ia64__) || (defined(__x86_64__) && defined(__LP64__)) || defined(__s390x__) || (defined(__sparc__)
+&& defined(__arch64__)) \
- || defined(__powerpc64__) || defined(__aarch64__) || (defined(__mips64) && defined(__LP64__))
+ || defined(__powerpc64__) || defined(__aarch64__) || (defined(__mips64) && defined(__LP64__)) || (defined(__riscv) &&
+defined(__LP64__))
#define MASK_WORD_BITBITS 6
#else
#define MASK_WORD_BITBITS 5
在 glibc 2.34 之前, 有一个ftbfs是这样的 , 来自here
[100%] Linking CXX executable ../bin/neochat
cd /<<PKGBUILDDIR>>/obj-riscv64-linux-gnu/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/neochat.dir/link.txt --verbose=1
/usr/bin/c++ -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fno-operator-names -fno-exceptions -Wall -Wextra -Wcast-align -Wchar-subscripts -Wformat-security -Wno-long-long -Wpointer-arith -Wundef -Wnon-virtual-dtor -Woverloaded-virtual -Werror=return-type -Werror=init-self -Wvla -Wdate-time -Wsuggest-override -Wlogical-op -fcoroutines -Wl,--enable-new-dtags -Wl,-z,relro -Wl,-z,now CMakeFiles/neochat.dir/neochat_autogen/mocs_compilation.cpp.o CMakeFiles/neochat.dir/controller.cpp.o CMakeFiles/neochat.dir/actionshandler.cpp.o CMakeFiles/neochat.dir/emojimodel.cpp.o CMakeFiles/neochat.dir/customemojimodel.cpp.o CMakeFiles/neochat.dir/customemojimodel+network.cpp.o CMakeFiles/neochat.dir/clipboard.cpp.o CMakeFiles/neochat.dir/matriximageprovider.cpp.o CMakeFiles/neochat.dir/messageeventmodel.cpp.o CMakeFiles/neochat.dir/messagefiltermodel.cpp.o CMakeFiles/neochat.dir/roomlistmodel.cpp.o CMakeFiles/neochat.dir/roommanager.cpp.o CMakeFiles/neochat.dir/neochatroom.cpp.o CMakeFiles/neochat.dir/neochatuser.cpp.o CMakeFiles/neochat.dir/userlistmodel.cpp.o CMakeFiles/neochat.dir/publicroomlistmodel.cpp.o CMakeFiles/neochat.dir/userdirectorylistmodel.cpp.o CMakeFiles/neochat.dir/utils.cpp.o CMakeFiles/neochat.dir/main.cpp.o CMakeFiles/neochat.dir/notificationsmanager.cpp.o CMakeFiles/neochat.dir/sortfilterroomlistmodel.cpp.o CMakeFiles/neochat.dir/chatdocumenthandler.cpp.o CMakeFiles/neochat.dir/devicesmodel.cpp.o CMakeFiles/neochat.dir/filetypesingleton.cpp.o CMakeFiles/neochat.dir/login.cpp.o CMakeFiles/neochat.dir/stickerevent.cpp.o CMakeFiles/neochat.dir/chatboxhelper.cpp.o CMakeFiles/neochat.dir/commandmodel.cpp.o CMakeFiles/neochat.dir/webshortcutmodel.cpp.o CMakeFiles/neochat.dir/blurhash.cpp.o CMakeFiles/neochat.dir/blurhashimageprovider.cpp.o CMakeFiles/neochat.dir/joinrulesevent.cpp.o CMakeFiles/neochat.dir/collapsestateproxymodel.cpp.o CMakeFiles/neochat.dir/neochataccountregistry.cpp.o CMakeFiles/neochat.dir/colorschemer.cpp.o CMakeFiles/neochat.dir/trayicon_sni.cpp.o CMakeFiles/neochat.dir/runner.cpp.o CMakeFiles/neochat.dir/neochatconfig.cpp.o CMakeFiles/neochat.dir/neochat_autogen/YCDLW3T4OG/qrc_res.cpp.o CMakeFiles/neochat.dir/neochat_autogen/YCDLW3T4OG/qrc_res_desktop.cpp.o -o ../bin/neochat /usr/lib/riscv64-linux-gnu/libKF5SonnetCore.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5Kirigami2.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5Notifications.so.5.94.0 /usr/lib/riscv64-linux-gnu/libQuotient.so.0.6.11 /usr/lib/riscv64-linux-gnu/libcmark.so.0.30.2 /usr/lib/riscv64-linux-gnu/libqt5keychain.so.0.13.2 /usr/lib/riscv64-linux-gnu/libKF5KIOWidgets.so.5.94.0 /usr/lib/riscv64-linux-gnu/libQt5QuickControls2.so.5.15.4 /usr/lib/riscv64-linux-gnu/libQt5Quick.so.5.15.4 /usr/lib/riscv64-linux-gnu/libQt5QmlModels.so.5.15.4 /usr/lib/riscv64-linux-gnu/libQt5Qml.so.5.15.4 /usr/lib/riscv64-linux-gnu/libQt5Multimedia.so.5.15.4 /usr/lib/riscv64-linux-gnu/libKF5ConfigWidgets.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5Codecs.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5Auth.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5KIOGui.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5WindowSystem.so.5.94.0 /usr/lib/riscv64-linux-gnu/libX11.so /usr/lib/riscv64-linux-gnu/libKF5KIOCore.so.5.94.0 /usr/lib/riscv64-linux-gnu/libQt5Network.so.5.15.4 /usr/lib/riscv64-linux-gnu/libKF5AuthCore.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5JobWidgets.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5Service.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5I18n.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5CoreAddons.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5DBusAddons.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5Solid.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5Completion.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5ConfigGui.so.5.94.0 /usr/lib/riscv64-linux-gnu/libKF5ConfigCore.so.5.94.0 /usr/lib/riscv64-linux-gnu/libQt5DBus.so.5.15.4 /usr/lib/riscv64-linux-gnu/libQt5Xml.so.5.15.4 /usr/lib/riscv64-linux-gnu/libKF5WidgetsAddons.so.5.94.0 /usr/lib/riscv64-linux-gnu/libQt5Widgets.so.5.15.4 /usr/lib/riscv64-linux-gnu/libQt5Gui.so.5.15.4 /usr/lib/riscv64-linux-gnu/libQt5Concurrent.so.5.15.4 /usr/lib/riscv64-linux-gnu/libQt5Core.so.5.15.4
/usr/bin/ld: CMakeFiles/neochat.dir/neochatroom.cpp.o: undefined reference to symbol '__atomic_exchange_1@@LIBATOMIC_1.0'
/usr/bin/ld: /usr/lib/riscv64-linux-gnu/libatomic.so.1: error adding symbols: DSO missing from command line
可以使用下面的方法:
<bunk> +ifneq (,$(filter $(DEB_HOST_ARCH), riscv64))
<bunk> + export DEB_LDFLAGS_MAINT_APPEND = -Wl,--no-as-needed -latomic -Wl,--as-needed
<bunk> +endif
-I/usr/include/libpng16 -I/usr/include/SDL2 -c -o IOGfxSurfaceGL2.o IOGfxSurfaceGL2.cpp
> gfx_fonts.cpp: In function ‘void setup_font(TTF_Font*)’:
> gfx_fonts.cpp:296:44: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
> 296 | char *familyname = TTF_FontFaceFamilyName(font);
详见 #1015106
cc: error: unrecognized command-line option ‘-m64’
cc: error: unrecognized command-line option ‘-m32’
解决方案是,在相关的测试fail中,过滤掉不属于这个架构的测试:
--- a/tests/05_32_bits/Makefile
+++ b/tests/05_32_bits/Makefile
@@ -2,11 +2,13 @@
# Make sure the 64 bits versions are not picked up.
LD_LIBRARY_PATH=
+CPU_ARCH=$(shell uname -m)
.PHONY: clean
all: check
+ifeq ($(CPU_ARCH), $(filter x86_64 amd64 i686 i386 ppc% sparc64,$(CPU_ARCH)))
lib64/libx.so:
mkdir -p $(@D)
echo 'int a(){return 42;}' | $(CC) -shared -Wl,-soname,$(@F) -m64 -o $@ -nostdlib -x c -
@@ -25,6 +27,11 @@
../../libtree exe32
../../libtree exe64
+else
+check:
+ @echo Architecture does not support -m32 or -m64 options. Do nothing.
+endif
+
clean:
rm -rf lib32 lib64 exe*
filter在这里是匹配返回值的意思。
https://gist.github.com/hack3ric/c6fbbc7055f19b6024340384b4fc750a
debian/watch 对于新手打包者来说,是一个非常难啃的骨头,所以,这里简单的记录下。
version=4
opts=dversionmangle=s/\+ds(\.\d+)?$//,repacksuffix=+ds,repack,compression=xz,pgpsigurlmangle=s/$/.asc/, \
https://strace.io/files/@ANY_VERSION@/@PACKAGE@-@ANY_VERSION@@ARCHIVE_EXT@
debian/watch:
version=4
opts=dversionmangle=s/\+dfsg.*$//,repacksuffix=+dfsg,compression=xz \
https://github.com/rems-project/sail/tags .*/archive/.*/(\d\S+)\.tar\.gz
现在能匹配到 0.18-linux-binary, 如何只匹配到 0.18
如下:
version=4
opts=dversionmangle=s/\+dfsg.*$//,repacksuffix=+dfsg,compression=xz \
https://github.com/rems-project/sail/tags .*/archive/.*/(\d+\.\d+)\.tar\.gz
(\d+\.\d+):这部分正则表达式只匹配由数字和一个点组成的版本号,如 0.18,它确保只会匹配类似 0.18 的格式,而不会匹配后面带有其他字符的版本号,如 0.18-linux-binary。
目前,众所周知的是,如果软件包是大版本升级,需要首先进入 NEW queue,目前这个机制在Debian内部也引起了巨大的反响,还正在讨论中。 当NEW queue没有问题后,向 release team发行 transition请求,即可再次向sid发送此版本的package更新。
在这里,简单记录下所有相关资料的链接。
一个推荐的工作流程:
dch -i -m "Source only upload for testing migration."
dch -r
debuild -S
cd .. ; dput $changes_file
# git commit & git tag
Emaces team推荐的方式:
for foo in ...; do
dgit clone foo
dch "Rebuild for ..."
dch -r
git commit debian/changelog -m"..."
dgit push-source
done
Not relevant with the issue. But could you tell me what meaning of binNMU here and how to generate it?
binNMUs (~= binary NMU) are rebuilds of a package without an upload. They can be triggered by the release team and are part of transitions. See also https://wiki.debian.org/Teams/ReleaseTeam/Transitions
From my view I can understand, because we want to upgrade libzim(7->8), but its reverse dependencies has failed build on libzim8, so we have to upload binNMU for libzim8’s reverse dependencies packages? Or binNMU is just for libzim8?
The binNMUs are for the reverse dependencies of libzim7 so that they pick up a dependency on libzim8.
Package: release.debian.org
Severity: normal
User: [email protected]
Usertags: binnmu
Hello,
I want to request binNMU to support python3.11.
nmu spglib_2.0.2-1 . ANY . unstable . -m "Add python3.11"
下面的命令可以展示tmux的具体依赖关系,当然,是以图片的方式展示的。
sudo apt-rdepends --dotty tmux | dot -Tpng > dependency-tmux-map.png
推荐使用 apt install ubuntu-dev-tools下的reverse-depends工具:
sudo reverse-depends python3-dbus
Reverse-Recommends
* autosuspend
* deluge-common
* gajim
* hijra-applet
* linuxcnc-uspace [amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x]
* monajat-applet
* mps-youtube
* netatalk [amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x]
* pithos
* python3-pantalaimon
* quodlibet
* sabnzbdplus
* solaar
* xboxdrv [amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x]
* xpra [amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x]
Reverse-Depends
* a2jmidid [amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x]
* autokey-common
* autokey-gtk
...
该包是 devscripts 工具包的一部分, 具体的用法为:
build-rdeps glyphspkg
Reverse Build-depends in testing/main:
See #1095519
出于验证一个测试程序的目的,需要在riscv64的板子上源码安装golang,原本很简单的事情,但是操作之后才发现不是这回事,故这里简单记录下,以便后面需要时用到。
以下操作是在mengzhuo老师的指导下完成。
首先知道的一点是,源码编译go, here,另外golang目前(2022/08/01)还没有riscv64的二进制包,需要更需要从源码编译。从源码编译,需要有一个自举的过程,但是Bootstrap toolchain from C source code 1.4 版本还不支持rv,所以,这里就麻烦一些了。
首先安装 golang-go - Go programming language compiler, linker, compiled stdlib. 在目前的debian系统上,已经默认安装支持golang-go,一定要使用这个,不要使用gccgo,后者的问题非常多。
apt install golang-go
然后 go version就可以看到相应的输出了。在相同的terminal下,然后下载 golang 的source code,我下载的是 go version go1.18.4.解压,然后执行./make.bash即可。
这个时候或者编译完成后,如果go version提示说找不到相关命令,大概率是由于 goroot gopath的相关路径不对。
GOROOT=/home/vimer/go/go/
这里其实就是指向的你的go源码的位置:
vimer@unmatched:~/go/go$ ls
AUTHORS CONTRIBUTORS PATENTS SECURITY.md api codereview.cfg lib pkg test
CONTRIBUTING.md LICENSE README.md VERSION bin doc misc src
紧接着,要把 go的可执行程序加入$PATH中:
export PATH=$PATH:$GOROOT/bin
还有一个是GOPATH:
GOPATH="/home/vimer/go/proj"
这个是用来存储相关go的生成物的。
因为go是google开发的嘛,有些东西timeout是不可避免的,所以遇到这种问题时,需要使用:
GOPROXY="https://proxy.golang.com.cn"
目前来看,bookworm应该默认使用gcc-12了,不过,从目前的QA质量来看,有不少C++包在rebuild时失败了。这篇文章就是简单的记录这个ftbfs summary. 其实做了这么多我发现,任何东西都不能浮于表面,也就是fix 一个issue,需要深挖背后的原理。当然,我现在的时间、资历还达不到那个级别,所以这个page就是当做笔记用的。
GCC 11 defaults to the GNU++17 standard.
指引性的文章here
其实大部分的ftbfs集中在这一块。
http://qa-logs.debian.net/2022/06/09/gcc12/dbus-c++_0.9.0-9_unstable_gcc12.log
/usr/include/c++/12/iomanip:170:5: note: template argument deduction/substitution failed:
../../include/dbus-c++/types.h:96:8: note: ‘DBus::MessageIter’ is not derived from ‘std::basic_istream<_CharT, _Traits>’
96 | ri >> cast;
| ~~~^~~~~~~
/usr/include/c++/12/iomanip:200:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>&
+std::operator>>(basic_istream<_CharT, _Traits>&, _Setprecision)’
200 | operator>>(basic_istream<_CharT, _Traits>& __is, _Setprecision __f)
| ^~~~~~~~
/usr/include/c++/12/iomanip:200:5: note: template argument deduction/substitution failed:
../../include/dbus-c++/types.h:96:8: note: ‘DBus::MessageIter’ is not derived from ‘std::basic_istream<_CharT, _Traits>’
96 | ri >> cast;
| ~~~^~~~~~~
/usr/include/c++/12/iomanip:230:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>&
+std::operator>>(basic_istream<_CharT, _Traits>&, _Setw)’
230 | operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f)
| ^~~~~~~~
/usr/include/c++/12/iomanip:230:5: note: template argument deduction/substitution failed:
../../include/dbus-c++/types.h:96:8: note: ‘DBus::MessageIter’ is not derived from ‘std::basic_istream<_CharT, _Traits>’
96 | ri >> cast;
| ~~~^~~~~~~
/usr/include/c++/12/iomanip:264:5: note: candidate: ‘template<class _CharT, class _Traits, class _MoneyT> std::basic_istream<_CharT,
+_Traits>& std::operator>>(basic_istream<_CharT, _Traits>&, _Get_money<_MoneyT>)’
264 | operator>>(basic_istream<_CharT, _Traits>& __is, _Get_money<_MoneyT> __f)
Solutions: todo