web-dev-qa-db-ja.com

(.deb)パッケージでバイナリをビルドするために使用されるコンパイラフラグを取得するにはどうすればよいですか?

apt-get source <package_name>がソースパッケージを提供することを知っています。 debianフォルダーとrulesというファイルが含まれています。私がそれを正しく理解していれば、このファイルは、どのコンパイラフラグを使用するかを含め、ソースパッケージを.debパッケージに変換する方法を説明しています。

2つの質問:

  1. 実際に使用されているコンパイラフラグを取得するにはどうすればよいですか? make -nを実行する必要がありますか(これが可能な場合でも)、またはドキュメントを解析して何らかの方法で取得できますか?
  2. 公式リポジトリからのソースパッケージの場合を考えます。コンパイラフラグはrulesファイルによって100%決定されますか、それとも.debの作成が行われたシステムに依存しますか?公式の.debビルドプロセスで使用されたのと同じフラグを取得するために、公式のビルドシステムを「ミラーリング」する必要がありますか?これどうやってするの?

私は here を学びました。debianには、.debでパックされたバイナリにどのコンパイラフラグが使用されるかという公式のポリシーがないことを学びました。

7
langlauf.io

使用されるコンパイラフラグは、

  • debian/rulesファイル
  • パッケージのビルドファイル(上流の作者もそこにフラグを指定する場合があるため)、
  • 使用されるビルドシステム(dhcdbsなど)、
  • デフォルトのコンパイラ設定。

使用されているフラグを確認するには、少なくともパッケージをコンパイルする必要があります。

debian/rules build

のようなことをしよう

debian/rules -n

通常、それほど遠くまでは行きません。たとえば、dhベースのパッケージでは、次のようになります

dh build

または同様のもの; (--no-actを使用して)何が生成されるかを示すようにdhに要求する

dh_testdir
dh_auto_configure
dh_auto_build

等々。

debian/rules;を読み取ってビルドフラグを判別する、誰にでもわかる簡単な方法はありません。そこに設定されたフラグを探すことで、また(適切な場合)dpkg-buildflagsDEB_BUILD_MAINT_OPTIONSなど)のオプションを探して実行することで、いくつかのアイデアを得ることができます。多くのパッケージで、どのフラグが使用されたかを確認する最も簡単な方法は、アーカイブで出荷されたパッケージのビルドログを https://buildd.debian.org から開始することです。たとえば、 logs for coreutils on i386 は、使用されたフラグが-Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector-strong -Wformat -Werror=format-securityでコンパイルされ、-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wl,--as-needed -Wl,-z,relroでリンクされたことを示します(ありがとう- Faheem Mitha 後者を指摘してください!).

5
Stephen Kitt