添加共享库时scons编译失败

scons compilation fails when adding shared library

我参与了一个包含C++、Fortran和Python的项目,编译是用scons做的。我尝试修改构建脚本以生成共享库:

diff --git a/src/scons/scons_ext/utils.py b/src/scons/scons_ext/utils.py
index bddadd6..896b2aa 100644
--- a/src/scons/scons_ext/utils.py
+++ b/src/scons/scons_ext/utils.py
@@ -650,6 +650,8 @@ to highly recommended debugging and optimization options.
             program_dependencies = [self.rebase_dir(build_dir, target)] \
                                     + src_dependencies + dir_dependencies
             program = env.Program(program_name, program_dependencies)
+            if 'ssh-aerosol.f90' in target:
+                mylib = env.SharedLibrary('ssh-aerosol.so', program_dependencies)
             if program_name in self.command_line_target:
                 BUILD_TARGETS.append(program_name + env["PROGSUFFIX"])

但是修改后,我不得不运行编译脚本~5次才能在src文件夹中生成.so文件。我怀疑 scons 脚本没有以正确的顺序编译文件/在我修改后不理解文件之间的依赖关系。

2019 年 9 月 30 日之前可在此处获得代码的开发版本(不久将通过开源许可发布):https://cloud.enpc.fr/s/mKNc4KZF6KKoWiB

编辑:获得工作库所需的编译运行s 的数量是可变的。该项目是在主目录中使用 ./compile 命令编译的。在日志文件中重定向 stdout 和 stderr 的编译输出显示这种错误:

gfortran -o .build/default/include/Module/ModuleAdaptstep.os -c -cpp -O2 -g3 -I /usr/include -cpp -Waliasing -Wampersand -Wsurprising -Wintrinsics-std -Wintrinsic-shadow -Wline-truncation -Wreal-q-constant -fPIC -DPOLYPHEMUS_WITH_AEROSOL_MODULE -DWITHOUT_NACL_IN_THERMODYNAMICS -DPOLYPHEMUS_SINGLE_UNDERSCORE -DPOLYPHEMUS_FASTJX -I. -Iinclude/common -Iinclude/Talos -Iinclude/SeldonData -Iinclude/AtmoData -Iinclude/isorropia_aec -Iinclude/fastJX -Iinclude/CHEMISTRY/cb05en -Iinclude/CHEMISTRY/common_scram -Iinclude/INC -Iinclude/RDB -Iinclude/SOAP -Iinclude/Module -I/usr/include include/Module/ModuleAdaptstep.F90
AttributeError: 'NoneType' object has no attribute 'get_build_env':
  File "/usr/lib/scons/SCons/Script/Main.py", line 1376:
    _exec_main(parser, values)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1339:
    _main(parser)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1103:
    nodes = _build_targets(fs, options, targets, target_top)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1313:
    jobs.run(postfunc = jobs_postfunc)
  File "/usr/lib/scons/SCons/Job.py", line 111:
    self.job.start()
  File "/usr/lib/scons/SCons/Job.py", line 423:
    task.executed()
  File "/usr/lib/scons/SCons/Script/Main.py", line 237:
    SCons.Taskmaster.OutOfDateTask.executed(self)
  File "/usr/lib/scons/SCons/Taskmaster.py", line 312:
    t.push_to_cache()
  File "/usr/lib/scons/SCons/Node/FS.py", line 2910:
    self.get_build_env().get_CacheDir().push(self)
  File "/usr/lib/scons/SCons/Node/__init__.py", line 624:
    result = self.get_executor().get_build_env()
f951: Fatal Error: Can't rename module file ‘ldiscretization.mod0’ to ‘ldiscretization.mod’: Aucun fichier ou dossier de ce type
compilation terminated.
f951: Fatal Error: Can't rename module file ‘hcongregation.mod0’ to ‘hcongregation.mod’: No such file or directory
compilation terminated.
scons: *** [.build/default/include/Module/ModuleCongregation.o] Error 1
scons: building terminated because of errors.
   use cThermodynamics
      1
Fatal Error: Can't open module file ‘cthermodynamics.mod’ for reading at (1): No such file or directory
compilation terminated.
include/Module/ModuleDiscretization.F90:7:6:

   use eRedistribution
      1
Fatal Error: Can't open module file ‘eredistribution.mod’ for reading at (1): No such file or directory
compilation terminated.
scons: *** [.build/default/include/Module/ModuleRedistribution.o] Error 1
scons: *** [.build/default/include/Module/ModuleDiscretization.os] Error 1
scons: building terminated because of errors.
AttributeError: 'NoneType' object has no attribute 'get_build_env':
  File "/usr/lib/scons/SCons/Script/Main.py", line 1376:
    _exec_main(parser, values)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1339:
    _main(parser)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1103:
    nodes = _build_targets(fs, options, targets, target_top)
  File "/usr/lib/scons/SCons/Script/Main.py", line 1313:
    jobs.run(postfunc = jobs_postfunc)
  File "/usr/lib/scons/SCons/Job.py", line 111:
    self.job.start()
  File "/usr/lib/scons/SCons/Job.py", line 423:
    task.executed()
  File "/usr/lib/scons/SCons/Script/Main.py", line 237:
    SCons.Taskmaster.OutOfDateTask.executed(self)
  File "/usr/lib/scons/SCons/Taskmaster.py", line 312:
    t.push_to_cache()
  File "/usr/lib/scons/SCons/Node/FS.py", line 2910:
    self.get_build_env().get_CacheDir().push(self)
  File "/usr/lib/scons/SCons/Node/__init__.py", line 624:
    result = self.get_executor().get_build_env()

编译问题的解决方案好像是:

             program_dependencies = [self.rebase_dir(build_dir, target)] \
                                     + src_dependencies + dir_dependencies
             program = env.Program(program_name, program_dependencies)
             # Generate shared library for ssh-aerosol
             if 'ssh-aerosol.f90' in target:
-                mylib = env.SharedLibrary('ssh-aerosol.so', program_dependencies)
+                mylib = env.SharedLibrary('ssh-aerosol.so', 'ssh-aerosol.f90')
             if program_name in self.command_line_target:
                 BUILD_TARGETS.append(program_name + env["PROGSUFFIX"])

             # In case another SConstruct wants to depend on this source
             # directory: