我有一个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
命令,或者有其他方法可以配置该项目。
答案 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调用中运行。我假设ev
和run
是需要eval
的shell命令,并且clear
是常规的shell命令,可能永远不要在Makefile中使用。)