Как построить проект Swift на NixOS? - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь построить простой проект Swift на NixOS. Вот шаги для воспроизведения:

git clone https://github.com/PerfectlySoft/PerfectTemplate.git
cd PerfectTemplate
touch shell.nix

Добавить shell.nix со следующим содержанием:

with import <nixpkgs> {};

stdenv.mkDerivation {
  name = "swift-env";

  buildInputs = [
    openssl
    stdenv
    binutils
    cmake
    pkgconfig
    curl
    glibc
    icu
    libblocksruntime
    libbsd
    libedit
    libuuid
    libxml2
    ncurses
    sqlite
    swig
  ];

}

Запуск nix-shell --pure shell.nix и оттуда swift build, дает мне:

gcc: error: x86_64-unknown-linux: No such file or directory
gcc: error: unrecognized command line option ‘-target’
gcc: error: unrecognized command line option ‘-fblocks’
gcc: error: x86_64-unknown-linux: No such file or directory
gcc: error: unrecognized command line option ‘-fmodules’; did you mean ‘-fmudflap’?
gcc: error: x86_64-unknown-linux: No such file or directory
gcc: error: x86_64-unknown-linux: No such file or directory
gcc: error: x86_64-unknown-linux: No such file or directory
gcc: error: x86_64-unknown-linux: No such file or directory
gcc: error: unrecognized command line option ‘-target’
gcc: error: x86_64-unknown-linux: No such file or directory
gcc: error: unrecognized command line option ‘-fblocks’
gcc: error: unrecognized command line option ‘-target’
gcc: error: unrecognized command line option ‘-target’
gcc: error: unrecognized command line option ‘-target’
gcc: error: unrecognized command line option ‘-fblocks’
gcc: error: unrecognized command line option ‘-fmodules’; did you mean ‘-fmudflap’?
gcc: error: unrecognized command line option ‘-fblocks’
gcc: error: unrecognized command line option ‘-fblocks’
gcc: error: unrecognized command line option ‘-fmodules’; did you mean ‘-fmudflap’?
gcc: error: unrecognized command line option ‘-target’
gcc: error: unrecognized command line option ‘-fmodules’; did you mean ‘-fmudflap’?
gcc: error: unrecognized command line option ‘-fmodules’; did you mean ‘-fmudflap’?
gcc: error: unrecognized command line option ‘-fblocks’
gcc: error: unrecognized command line option ‘-target’
gcc: error: unrecognized command line option ‘-fmodule-name=PerfectCZlib’
gcc: error: unrecognized command line option ‘-fmodules’; did you mean ‘-fmudflap’?
gcc: error: unrecognized command line option ‘-fmodules-cache-path=/home/dmi3y/Dev/Swift/PerfectTemplate/.build/x86_64-unknown-linux/debug/ModuleCache’
gcc: error: unrecognized command line option ‘-fblocks’

Буду признателен за любую помощь в этом, так как я довольно плохо знаком с nix-shell и NixOS.

EDIT :

Я изменилсямой shell.nix к этому:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  name = "swift-env";

  buildInputs = with pkgs; [
    openssl
    clang
    swift
  ];

  shellHook = ''
    CC=clang
  '';
}

Однако, когда я запускаю nix-shell, а затем swift build, я теперь получаю:

[1/25] Compiling PerfectCZlib zutil.c
[2/25] Compiling PerfectCZlib uncompr.c
[3/25] Compiling PerfectCZlib inftrees.c
[4/25] Compiling PerfectCZlib inflate.c
[5/25] Compiling PerfectCZlib trees.c
[6/25] Compiling PerfectCZlib inffast.c
[7/25] Compiling PerfectCZlib infback.c
[8/25] Compiling PerfectCZlib gzwrite.c
/nix/store/iz6k7x3l14ykr56crz3dizas1rrkcyzr-clang-wrapper-7.1.0/resource-root/include/module.modulemap:24:8: error: redefinition of module '_Builtin_intrinsics'

#  warning _FORTIFY_SOURCE requires compiling with optimization (-O)
   ^
1 warning and 3 errors generated.
1 warning and 3 errors generated.

Полный журнал можно найти здесь .

Теперь это выглядит как отсутствующая зависимость библиотеки или конфликт версий.

Для записи вот дополнительная информация о моей настройке, которая может пролить больше света:

$ nix-channel --list                                                    
home-manager https://github.com/rycee/home-manager/archive/master.tar.gz
nixos https://nixos.org/channels/nixos-19.09  

$ nix-shell --run 'swift -version'                                      
Swift version 5.0.2 (swift-5.0.2-RELEASE)
Target: x86_64-unknown-linux-gnub

После поиска в Интернете я обнаружил проблему с Jira для компилятора Swift и специальный комментарий . Я решил исключить clang из зависимостей и включить только swift, поскольку эта комбинация кажется конфликтующей:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  name = "swift-env";

  buildInputs = with pkgs; [
    openssl
    swift
  ];

  shellHook = ''
    CC=clang
  '';
}

И это сработало! Я наконец смог построить проект!

1 Ответ

1 голос
/ 12 октября 2019

Поскольку вы используете опцию --pure, ничего из вашей предыдущей среды не будет импортировано в оболочку. Это включает в себя двоичный файл swift. Поэтому сначала я бы добавил swift к buildInputs.

Ошибка, которую вы получаете, указывает на то, что gcc даже не понимает передаваемые параметры командной строки. Я ничего не знаю о Swift, но, увидев это, я предположил, что ему нужен другой компилятор. Конечно же, после быстрого поиска, похоже, что он основан на llvm. Таким образом, вам нужно будет также добавить clang к входам вашей сборки. Кроме того, вам нужно будет использовать mkShell вместо mkDerivation для настройки правильной среды.

Первый является оберткой для последнего, который специально разработан для настройки оболочки nix и обеспечивает правильную обработку среды. Вам нужно будет передать атрибут shellHook, чтобы переопределить компилятор c по умолчанию на clang, используя CC envvar. shellHook - это способ запуска произвольных команд в начале оболочки.

В заключение: команда nix-shell по умолчанию ищет shell.nix, поэтому вам не нужно ее передаватьв качестве аргумента. Если shell.nix не существует, он попытается default.nix. Если ни того, ни другого не существует, вам придется явно указать расположение выражений nix.

TLDR

, чтобы сложить все вместе:

# a more idiomatic way to import nixpkgs, overridable from the cmdline
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  name = "swift-env";

  buildInputs = with pkgs; [
    # your other inputs
    clang
    swift
  ];

  shellHook = ''
    CC=clang
  '';
}

Просто чтобы убедиться, что моя логика была правильной, я загрузил репозиторий и отдал его. Все компилируется и работает успешно.

...