2

Building modules in Fortran needs to be done in a specific order, e.g. if a file A.f needs module defined in B.f, then B.f needs to be compiled first. How can I impose such build order in Scons? If I provide it with a list of source files, it arranges them alphabetically (so A.f is compiled before B.f). I read about Requires() and Depends() functions, but wasn't able to get them to work for me.

I would be happy with just listing source files in order I need them compiled (so disabling reshuffling them in alphabetical order), but any other method would be welcomed as well.

As per Kyle's request, here's my Sconscript and a build log:

# Main program building script

Import('env')

PROGRAM = 'main.exe'

SRC_PREFIX = './src/'

SRC = [ 'array_1D_module.f', 
            'array_2D_module.f', 
            'array_3D_module.f', 
            'thomas_algorithm_module.f',
            'histogram_module.f',
            'histogram_computer_module.f',
            'density_parameters_module.f',
            'diffusion3D_aos_z_sub_solver_module.f',
            'diffusion3D_aos_y_sub_solver_module.f',
            'diffusion3D_aos_x_sub_solver_module.f',
            'diffusion3D_aos_solver_module.f',
            'nonlinear_diffusion_utilities_module.f',
            'nonlinear_diffusion_parameters_module.f',
            'derivative_magnitude_computer_module.f',
            'nonlinear_diffusion_module.f',
            'main_module.f',
            'main.f' ]

# Attach prefix to each source file
for i in range( len(SRC) ) :
    SRC[i] = SRC_PREFIX + SRC[i]


env.Program(target = PROGRAM, source = SRC)

This produced:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
ifort -o src/array_1D_module.o -c src/array_1D_module.f
ifort -o src/array_2D_module.o -c src/array_2D_module.f
ifort -o src/array_3D_module.o -c src/array_3D_module.f
ifort -o src/density_parameters_module.o -c src/density_parameters_module.f
ifort -o src/derivative_magnitude_computer_module.o -c src/derivative_magnitude_computer_module.f
ifort -o src/diffusion3D_aos_solver_module.o -c src/diffusion3D_aos_solver_module.f
src/diffusion3D_aos_solver_module.f(7): error #7002: Error in opening the compiled module file.  Check INCLUDE paths.   [DIFFUSION3D_AOS_Z_SUB_SOLVER_MODULE]
    use diffusion3D_aos_z_sub_solver_module, only :
------------^

So density_parameters_module.f was compiled before thomas_algorithm_module.f, even though it comes after it in my list.

4

1 回答 1

5

您的程序(如建议的那样)是否使用模块?那里有几个陷阱:

  1. FORTRANMODDIR 需要定义:有关该问题的讨论,请参见http://scons.tigris.org/ds/viewMessage.do?dsForumId=1272&dsMessageId=82725 。
  2. 我发现包含混合模块定义和源代码的源文件会引起一定程度的混乱。
于 2013-11-12T10:41:16.727 回答