Как я могу запустить функцию eval на моем make-файле - PullRequest
0 голосов
/ 10 мая 2019

У меня есть make-файл для установки и компиляции проекта ocaml. Мне нужно установить ocaml 4.07, чтобы использовать некоторые особенности этой версии. После установки opam я скачиваю конкретную версию, но для того, чтобы скомпилировать проект с этой версией, я получаю сообщение от терминала, говорящее

The environment is not in sync with the current switch.
          You should run: eval $(opam env)

Я хочу иметь возможность запустить make install и скомпилировать проект в определенной версии.

Я попытался создать определенное правило для вызываемой команды eval, а также попытался вызвать оба eval $(opam env), eval 'opam config env'. Но ни один из них, кажется, не работает.

Вот make-файл, который я пытаюсь изменить

#install package dependencies
install:
    sudo apt install gcc
    sudo add-apt-repository ppa:avsm/ppa
    sudo apt update
    sudo apt install opam
    opam init --yes
    sudo opam instal ocaml-base-compiler
    #opam init --yes
    sudo apt install ocaml-nox
    #eval 'opam env' 
    #eval $(opam env)
    #ev
    #clear
    #run

# Building the world
run: ev depend $(EXEC)

ev:
    eval $(opam env)

# Clean up
clear:
    rm -f *.cm[io] *.cmx *~ .*~ #*#
    rm -f $(GENERATED)
    rm -f $(EXEC)

Как мне скомпилировать этот проект с определенной версией, которую я скачал, без необходимости вручную вызывать команду eval в терминале, или есть другие способы настроить это.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Совет eval что-то правильное для интерактивной оболочки. Make по умолчанию запускает каждую команду в отдельной оболочке - это как если бы вы выключили и перезагрузили компьютер после каждой команды; результат eval немедленно теряется.

Существует расширение GNU make .ONESHELL, которое позволяет вам запускать все строки в рецепте в одной оболочке, или вы можете изменить свой рецепт, чтобы сделать это явно:

install:
    sudo apt install gcc
    # ... ett etc ...
    opam init --yes \
    && sudo opam instal ocaml-base-compiler
    opam init --yes \
    && sudo apt install ocaml-nox
    eval $(opam env) \
    && ev \
    && run

(Мне нужно было угадать некоторые вещи о том, какие вещи должны выполняться при одном и том же вызове оболочки. Я предполагаю, что ev и run - это команды оболочки, для которых требуется eval, а clear - обычный команда оболочки, которая, вероятно, никогда не должна использоваться в Makefile.)

0 голосов
/ 10 мая 2019

Вы можете использовать opam config exec ... для запуска вашей команды сборки в соответствующей среде. Команда build может быть рекурсивным вызовом make.

Но кажется, что установка операционника внутри вашего Makefile выглядит немного грязно. Вы уверены, что хотите это сделать?

...