Как я могу сделать фреймворки MacOS доступными для Clang в среде Nix? - PullRequest
0 голосов
/ 03 июля 2018

Я нахожусь на macOS 10.13.5, учусь программировать на Rust и использую Nix для управления своей средой разработки.

Некоторые действия, такие как включение библиотеки jsonwebtoken или установка модуля cargo-watch, вызывают сборку, для которой требуется среда MacOS, которая, по-видимому, не установлена. Я получаю это сообщение об ошибке:

  = note: ld: framework not found CoreServices
          clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)

error: aborting due to previous error

error: failed to compile `cargo-watch v6.0.0`, intermediate artifacts can be found at `/var/folders/13/84dj8yr54_1c_pn0s8n7444h0000gn/T/cargo-install.lYPZaEduUBdu`

Caused by:
  Could not compile `cargo-watch`.

Это сокращенная версия команды clang, которая дает сбой:

error: linking with `/nix/store/9j864incgjx7kqggbpisdi3nmssy4qm5-clang-wrapper-5.0.2/bin/cc` failed: exit code: 1
  |
  = note: "/nix/store/9j864incgjx7kqggbpisdi3nmssy4qm5-clang-wrapper-5.0.2/bin/cc" "-m64" "-L" ... "/nix/store/rfp87664xzhl6zv7dx5c1hixasqfxkp4-rustc-1.24.0/lib/rustlib/x86_64-apple-darwin/lib/libcompiler_builtins-ba331b20e371c580.rlib" "-framework" "CoreServices" "-framework" "CoreServices" "-l" "System" "-l" "resolv" "-l" "pthread" "-l" "c" "-l" "m"

Единственное, что я нашел, это попытался добавить фреймворки в мой PATH, но либо этот ответ неверен, либо переменная окружения PATH не может пройти весь путь до места, где я делаю сборку в вопросе.

Как мне сказать clang, где искать фреймворки? Включает ли это изменение в моей рабочей среде, или мне нужно заняться изменением процесса сборки ящиков, которые я хочу установить?

Дополнительная информация

Я обнаружил команду clang -Xlinker -v, и вывод довольно интересный:

@(#)PROGRAM:ld  PROJECT:ld64-274.2
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS)
Library search paths:
    /nix/store/ql6xbmdplca4sjpk0pz647p7djzri03c-libc++-5.0.2/lib
    /nix/store/rfp87664xzhl6zv7dx5c1hixasqfxkp4-rustc-1.24.0/lib
    /nix/store/ql6xbmdplca4sjpk0pz647p7djzri03c-libc++-5.0.2/lib
    /nix/store/rfp87664xzhl6zv7dx5c1hixasqfxkp4-rustc-1.24.0/lib
    /nix/store/8ykfqv6jx9jvfhnc4cdygdzg0piy8253-Libsystem-osx-10.11.6/lib
    /nix/store/4papfih2r9xlsl9m7hlisparij8k9zaq-clang-5.0.2-lib/lib
Framework search paths:
    /nix/store/hc6d711vwlwnn9swmkdpi9nbswbqg6h0-CF-osx-10.10.5/Library/Frameworks
    /nix/store/hc6d711vwlwnn9swmkdpi9nbswbqg6h0-CF-osx-10.10.5/Library/Frameworks
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)

Кажется, это указывает на то, что отсутствует в моей оболочке Nix, а не в операционной системе или даже clang.

1 Ответ

0 голосов
/ 03 июля 2018

Очевидно, что Nix предоставляет пакеты для стандартных сред Apple *. и - это песочница для среды, достаточная для того, чтобы стандартные платформы были недоступны.

Большая часть того, что я обнаружил для этого решения, пришла от Используйте надлежащие SDK и инструменты командной строки в OS X 10.11 , а затем из проверки vim-plugins nix Производное .

Первым шагом является фактическая установка фреймворков, в которых нуждается мой проект. Все они живут в nixpkgs.darwin.apple_sdk.frameworks.

Это приводит к тому, что большая часть ссылки работает, но тогда _CFURLResourceIsReachable - это неопределенный символ на моей платформе. Я решаю это с помощью обновленной переменной NIX_LDFLAGS (как предложено в выводе vim-plugins nix). Конечный результат для моего проекта - это shell.nix файл:

let
    pkgs = import <stable> {};
    frameworks = pkgs.darwin.apple_sdk.frameworks;
in pkgs.stdenv.mkDerivation {
    name = "orizentic";

    buildInputs = [ pkgs.rustc
                    pkgs.cargo
                    frameworks.Security
                    frameworks.CoreFoundation
                    frameworks.CoreServices
                  ];

    shellHook = ''
        export PS1="[$name] \[$txtgrn\]\u@\h\[$txtwht\]:\[$bldpur\]\w \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty \[$bldylw\]\$aws_env\[$txtrst\]\$ "
        export NIX_LDFLAGS="-F${frameworks.CoreFoundation}/Library/Frameworks -framework CoreFoundation $NIX_LDFLAGS";
    '';
}

Это дает мне пакет cargo-watch (который зависит от CoreServices и CoreFoundation). По-видимому, это также разрешает зависимость jsonwebtoken от Security, хотя мне еще не удалось это проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...