Ubuntu22.04安装Madagascar遇scons报错:sfpseudodepth环境冲突
Ubuntu22.04安装Madagascar报错:Two environments with different actions were specified for the same target: sfpseudodepth
问题概述
我是Linux新手,在Ubuntu22.04系统上安装Madagascar时,执行make install后出现错误,根源是SCons报重复目标定义的错误。尝试修改安装路径后问题依旧。
错误信息
执行make install时的错误:
make: *** [Makefile:7: install] Error 2
SCons核心报错:
scons: *** Two environments with different actions were specified for the same target: sfpseudodepth
我的SConstruct文件内容
import sys, os sys.path.append('../../framework') import bldutil progs = ''' integral1 pseudodepth ''' mpi_progs = ''' mpirtmiso ''' place = '' try: # distributed version Import('env root pkgdir bindir') env = env.Clone() except: # local version env = bldutil.Debug() root = None SConscript('../../api/c/SConstruct') src = Glob('[a-z]*.c') env.Prepend(CPPPATH=['../../include'], LIBPATH=['../../lib'], LIBS=[env.get('DYNLIB','')+'rsf']) mpicc = env.get('MPICC') for source in src: inc = env.RSF_Include(source,prefix='') obj = env.StaticObject(source) env.Ignore(inc,inc) env.Depends(obj,inc) lapack = env.get('LAPACK') if lapack: if not isinstance(lapack,bool): env.Prepend(LIBS=lapack) progs += ' pseudodepth' elif root: place += ' pseudodepth' for prog in Split('pseudodepth'): prog = env.RSF_Place('sf'+prog,None,var='LAPACK',package='lapack') env.Install(bindir,prog) fftw = env.get('FFTW') if fftw: progs += ' zomiso zomvti' elif root: place += ' zomiso zomvti' for prog in Split('zomiso zomvti'): prog = env.RSF_Place('sf'+prog,None,var='FFTW',package='fftw') env.Install(bindir,prog) mains = Split(progs) for prog in mains: sources = ['M' + prog] bldutil.depends(env,sources,'M'+prog) env.StaticObject('M'+prog+'.c') prog = env.Program(prog,[x + '.o' for x in sources]) if root: env.Install(bindir,prog) mpi_mains = Split(mpi_progs) if mpicc and fftw: for prog in mpi_mains: sources = ['M' + prog] bldutil.depends(env,sources,'M'+prog) env.StaticObject('M'+prog+'.c',CC=mpicc) prog = env.Program(prog,[x + '.o' for x in sources],CC=mpicc) if root: env.Install(bindir,prog) else: place += mpi_progs for prog in mpi_mains: prog = env.RSF_Place('sf'+prog,None,var='MPICC',package='mpi') if root: env.Install(bindir,prog) ###################################################################### # SELF-DOCUMENTATION ###################################################################### if root: user = os.path.basename(os.getcwd()) main = 'sf%s.py' % user docs = [env.Doc(prog,'M' + prog) for prog in mains+mpi_mains+Split(place)] env.Depends(docs,'#/framework/rsf/doc.py') doc = env.RSF_Docmerge(main,docs) env.Install(pkgdir,doc)
操作步骤及配置输出
1. 执行configure命令
(base) master@MasterComputer:~/Python/Madagascar/madagascar-4.0$ ./configure --prefix=/home/master/Python/Madagascar
关键配置输出:
checking for Python ... /home/master/anaconda3/bin/python checking Python version ... 3.9.13 checking for RSFROOT ... /home/master/Python/Madagascar checking for SCons ... /home/master/anaconda3/bin/scons checking SCons version ... v4.4.0.fc8d0ec215ee6cba8bc158ad40c099be0b598297 Running RSFROOT=/home/master/Python/Madagascar /home/master/anaconda3/bin/scons config ... scons: Reading SConscript files ... checking platform ... (cached) linux [ubuntu] checking for C compiler ... (cached) gcc checking if gcc works ... yes ... checking for LAPACK ... no Optional package: liblapack-dev ... checking for FFTW ... no Optional package: libfftw3-dev ... scons: *** Two environments with different actions were specified for the same target: sfpseudodepth File "/home/master/Python/Madagascar/madagascar-4.0/build/user/xuxin/SConstruct", line 61, in <module>
2. 执行make install命令
(base) master@MasterComputer:~/Python/Madagascar/madagascar-4.0$ make install
输出:
RSFROOT=/home/master/Python/Madagascar PYTHONPATH=/home/master/Python/Madagascar/lib/python3.9/site-packages /home/master/anaconda3/bin/scons install scons: Reading SConscript files ... scons: *** Two environments with different actions were specified for the same target: sfpseudodepth File "/home/master/Python/Madagascar/madagascar-4.0/build/user/xuxin/SConstruct", line 61, in <module> make: *** [Makefile:7: install] Error 2
问题原因
从配置输出可见,系统未安装LAPACK库,此时SConstruct的逻辑出现冲突:
- 开头
progs变量已包含pseudodepth - 因
lapack检测为no,进入elif root:分支,调用env.RSF_Place('sfpseudodepth'...)并执行安装 - 后续遍历
mains = Split(progs)时,又为pseudodepth创建编译任务并执行安装
同一目标文件sfpseudodepth被两个不同的SCons操作重复定义,触发报错。
修复方案
1. 修改SConstruct文件
移除开头progs变量中的pseudodepth,确保该程序只在一个分支中处理:
progs = ''' integral1 '''
修改后,LAPACK存在时会将pseudodepth添加到编译列表;LAPACK不存在时,只会执行RSF_Place逻辑,不会重复定义目标。
2. 安装依赖(可选,如需pseudodepth功能)
如果需要使用pseudodepth工具,先安装LAPACK依赖:
sudo apt-get install liblapack-dev libblas-dev
之后重新执行./configure和make install即可正常编译。
内容的提问来源于stack exchange,提问作者Master Zhang
相关产品推荐
相关产品推荐

