如何在我的Makefile上运行eval函数

时间:2019-05-10 13:52:34

标签: makefile ocaml eval

我有一个makefile来安装和编译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'。但是这些似乎都不起作用。

这是我要修改的Makefile

#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 :(得分:0)

您可以使用opam config exec ...在适当的环境中运行构建命令。构建命令可以是对make的递归调用。

但是在Makefile内安装opam似乎有点混乱。您确定要这样做吗?

答案 1 :(得分:0)

eval的建议对于交互式外壳是正确的。默认情况下,Make在单独的外壳中运行每个命令-就像您在每个命令后关闭并重新启动计算机一样; eval的结果立即丢失。

有一个GNU make扩展名.ONESHELL,它使您可以在单个shell中运行配方中的所有行,也可以重构配方以明确地做到这一点:

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

(我不得不猜测一些事情需要在同一shell调用中运行。我假设evrun是需要eval的shell命令,并且clear是常规的shell命令,可能永远不要在Makefile中使用。)