cmakeを使用してGNU GuixSDでプログラムをコンパイルする

cmakeを使用してGNU GuixSDでプログラムをコンパイルする

コンパイルしようとしています。Xash3DGuixSD v1.0.0とgcc 8.3.0で。

以下のようにld(GNU Linker)は、ctr1.oとctri.oが見つからないというエラーを表示します。これらのファイルは/ gnu / store / {specicProgramName}内の複数のディレクトリ内の異なる場所に存在しますが、驚くべきことに、ルートアクセスも同じであっても、他のライブラリがある〜/ .guix_profileへのシンボリックリンクを作成することはできません。さまざまなサイズの複数のバージョンがあるため、そのプログラムとのみ互換性があるとします。また。 ~/.guix_profile は Unix システムのルートをエミュレートしているように見えますが、GuixSD ではルートと ~/.guix_profile の両方に /usr がありません。ファイル。

デフォルトでは、crt1.o、crti.o、libgcc_s.soは見つかりません。以前と同様にld、これら2つのcオブジェクトとlibgccをリンクまたはインストールした後、cmakeは追加のエラー依存関係の他のエラーで停止します。

とにかく、次の命令で印刷/記録される内容です。 (Xash3Dのインストールに推奨される方法です。)

sudo cmake -DHL_SDK_DIR=../hlsdk -DXASH_SDL=yes -DXASH_VGUI=yes -DCMAKE_C_FLAGS="-m32" -DCMAKE_CXX_FLAGS="-m32" -DCMAKE_EXE_LINKER_FLAGS="-m32" ../ && sudo make
-- The C compiler identification is GNU 9.1.0
-- The CXX compiler identification is GNU 9.1.0
-- Check for working C compiler: /home/nick/.guix-profile/bin/gcc
-- Check for working C compiler: /home/nick/.guix-profile/bin/gcc -- broken
CMake Error at /gnu/store/nrsbv2df55abwji1gsb1ilf22n3rc1xa-cmake-3.13.1/share/cmake-3.13/Modules/CMakeTestCCompiler.cmake:52 (message):
  The C compiler

    "/home/nick/.guix-profile/bin/gcc"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /home/nick/xash3d/build/CMakeFiles/CMakeTmp
    Run Build Command:"/home/nick/.guix-profile/bin/make" "cmTC_7635d/fast"
    /home/nick/.guix-profile/bin/make -f CMakeFiles/cmTC_7635d.dir/build.make CMakeFiles/cmTC_7635d.dir/build
    make[1]: Entering directory '/home/nick/xash3d/build/CMakeFiles/CMakeTmp'
    Building C object CMakeFiles/cmTC_7635d.dir/testCCompiler.c.o
    /home/nick/.guix-profile/bin/gcc   -m32    -o CMakeFiles/cmTC_7635d.dir/testCCompiler.c.o   -c /home/nick/xash3d/build/CMakeFiles/CMakeTmp/testCCompiler.c
    Linking C executable cmTC_7635d
    /gnu/store/nrsbv2df55abwji1gsb1ilf22n3rc1xa-cmake-3.13.1/bin/cmake -E cmake_link_script CMakeFiles/cmTC_7635d.dir/link.txt --verbose=1
    /home/nick/.guix-profile/bin/gcc -m32     -rdynamic CMakeFiles/cmTC_7635d.dir/testCCompiler.c.o  -o cmTC_7635d 
    /home/nick/.guix-profile/bin/ld: cannot find crt1.o: No such file or directory
    /home/nick/.guix-profile/bin/ld: cannot find crti.o: No such file or directory
    /home/nick/.guix-profile/bin/ld: skipping incompatible /gnu/store/69x60a1pn0mf5jv68al8awjfkyp1miwi-gcc-8.3.0-lib/lib/gcc/x86_64-unknown-linux-gnu/8.3.0/libgcc.a when searching for -lgcc
    /home/nick/.guix-profile/bin/ld: cannot find -lgcc
    /home/nick/.guix-profile/bin/ld: skipping incompatible /gnu/store/69x60a1pn0mf5jv68al8awjfkyp1miwi-gcc-8.3.0-lib/lib/gcc/x86_64-unknown-linux-gnu/8.3.0/../../../libgcc_s.so.1 when searching for libgcc_s.so.1
    /home/nick/.guix-profile/bin/ld: cannot find libgcc_s.so.1
    /home/nick/.guix-profile/bin/ld: skipping incompatible /gnu/store/69x60a1pn0mf5jv68al8awjfkyp1miwi-gcc-8.3.0-lib/lib/gcc/x86_64-unknown-linux-gnu/8.3.0/libgcc.a when searching for -lgcc
    /home/nick/.guix-profile/bin/ld: cannot find -lgcc
    collect2: error: ld returned 1 exit status
    make[1]: *** [CMakeFiles/cmTC_7635d.dir/build.make:87: cmTC_7635d] Error 1
    make[1]: Leaving directory '/home/nick/xash3d/build/CMakeFiles/CMakeTmp'
    make: *** [Makefile:121: cmTC_7635d/fast] Error 2

Debian と同様に、Guix にはパッケージをインストールするための bash コマンド「guix install $PACKAGE」がありますが、約 10,000 個のライブラリには Debian の問題を解決する「gcc-multilib」というライブラリは含まれていません。たぶんこのライブラリと他のライブラリを含む代替パッケージがありますか?

Wineを使用しないソリューションを探しています。 libgccの問題だけを解決するだけでは十分ではないかもしれないので、実際の解決策を見つけるためにコメントに残された提案を試してみましょう。 (私には危険ではありません。OSはUSBキーの隔離された環境にインストールされます。)

私の$PATH外観は次のとおりです。

/gnu/store/hk4f641r18vpj44m42pny6rp1nwg3d4w-glib-2.56.3-bin/bin
/run/setuid-programs
/home/nick/.config/guix/current/bin
/home/nick/.guix-profile/bin
/home/nick/.guix-profile/sbin
/run/current-system/profile/bin
/run/current-system/profile/sbin

Debianベースのオペレーティングシステムからインストールする必要がある2つのパッケージの名前は、gcc-multilibとです。libc-devこれらのパッケージ(またはその要素)はGuixパッケージライブラリのどこかにある必要がありますが、別の名前で存在する必要があります。

次のようなシェルのさまざまなパスにLIBRARY_PATHをバインドしてみました。

$HOME/.guix-profile/lib
$HOME/.guix-profile/lib/gcc/x86_64-unknown-linux-gnu/4.8.2
## Containing many c object/shared object and header files
/gnu/store/aqv6njg05w2yqh8krgrjy0wcbfxb4nn3-gcc-toolchain-9.1.0/lib/crt1.o
## Containing crt1.o and crti.o

答え1

パッケージを作成します。これはおおよその概要であり、改善が必要です。

(define-module (gnu packages xash3d)
  #:use-module (guix packages)
  #:use-module (guix git-download)
  #:use-module (guix utils)
  #:use-module (guix build-system cmake)
  #:use-module ((guix licenses) #:select (gpl3))
  #:use-module (gnu packages))

(define-public xash3d
  (package
    (name "xash3d")
    (version "0.19.2")
    (let (commit (string-append "v" version))
          (revision "1")) 
    (source (origin
              (method git-fetch)
              (uri (git-reference
                   (url (string-append "https://github.com/FWGS/" name "/"))
                   (commit commit)))))
    (build-system cmake-build-system)
    (synopsis "Xash3D FWGS Engine.")
    (description "Xash3D Engine is a custom Gold Source engine rewritten from scratch.")
    (home-page "https://xash.su/")
    (license gpl3)))

リソース:https://www.gnu.org/software/guix/manual/en/html_node/Defining-Packages.html

答え2

gcc-toolchain下図のようにパッケージをインストールします。マニュアルに記載されています。

答え3

新しいGNUコンパイルフレームワーク(クロスまたはネイティブ)をコンパイルするたびに、このcrt * .oエラーが発生します。

crt[1,i,n].o は、下位レベルの接続に使用される C ランタイムファイルです。 ld と Collect2 は各個別のコンパイルに使用します。問題は、コンパイラ自体に非常に近いものをコンパイルしようとしたときに発生します。ログ(testCCompiler.co構築)を見ると、これを試しているようです。

この問題を完全に解決するためのユニークでエレガントな方法を見つける努力は最終的に失敗しましたが、常にエラーを克服しました。私はあなたがGNU Makeコンパイルプロセス(特にエラーデバッグ)を理解していると仮定します。 CMakeはGNU Makeの構成ラッパーに過ぎません。以下はあなたに役立ついくつかの便利な手がかりです。

  • コンパイルを開始する前に、crt * .oファイルのパスを決定してください。これはエラー解決に非常に重要です。

  • コンパイル中に一時コンパイラであるxgccは、-B "ディレクトリ"パス検索オプションを使用します(gccのマニュアルページを参照)。 crtファイルパスを手動で追加して使用してください。

  • エラー出力に基づいてcrtファイルへのシンボリックリンクを生成すると、コンパイルエラーは削除されます。ただし、コンパイルプロセス中にこの操作を複数回再実行する必要がある可能性が高いことに注意してください。

お役に立てば幸いです。

PS:私があなたの状況に直面している場合は、自分に尋ねます。このtestCCompilerは本当に必要ですか?

関連情報