fortran-lang / fpm

Fortran Package Manager (fpm)
https://fpm.fortran-lang.org
MIT License
848 stars 96 forks source link

fpm fails at building projects with too many files #991

Open davidpfister opened 5 months ago

davidpfister commented 5 months ago

Description

The original issue appeared when building the project feq-parse with the following configuration

Version:     0.10.0, alpha
Program:     fpm(1)
Description: A Fortran package manager and build system
Home Page:   https://github.com/fortran-lang/fpm
License:     MIT
OS Type:     Windows

The test project has a quite large number of files (170), which results in a very long command line for the final linking. On Windows, command lines are limited in size and the present build exceeds the limit. This has been tested with cmd, msys2 and powershell without any difference.

FWIW, Visual Studio creates temporary files (e.g. "RSP1.rsp") with the content of the command line and ifort is invoked as ifort @".\RSP1.rsp

Expected Behaviour

The project should build on Windows without having to split the files to 2 or more subprojects.

Version of fpm

0.10.0, alpha

Platform and Architecture

Windows 10

Additional Information

The end of the build log is:

gfortran    -O3 -funroll-loops -Wimplicit-interface -fPIC -fmax-errors=1 -fcoarray=single -fimplicit-none -Werror=implicit-interface  build\gfortran_2654F75F5833692A\feq-parse\test_test.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_abs_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_acos_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_asin_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_atan_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_cos_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_division_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_gaussian3d_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_linear_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_linear_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_linear_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_linear_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_linear_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_linear_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_linear_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_linear_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log10_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_log_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_monadic_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_print_tokens.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_random_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sech_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sin_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_sqrt_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tanh_sfp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_r1fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_r1fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_r2fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_r2fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_r3fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_r3fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_r4fp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_r4fp64.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_sfp32.f90.o build\gfortran_2654F75F5833692A\feq-parse\test_tan_sfp64.f90.o build\gfortran_63E63B2712D76620\feq-parse\libfeq-parse.a -o build\gfortran_688A5DB7BAD2F9DA\test\test.exe
 + gfortran    -O3 -funroll-loops -Wimplicit-interface -fPIC -fmax-errors=1 -fcoarray=single -fimplicit-none -Werror=implicit-interface  build\gfortran_2654F75F5833692A\feq-parse\example_scalar_with_scalar_eval.f90.o build\gfortran_63E63B2712D76620\feq-parse\libfeq-parse.a -o build\gfortran_688A5DB7BAD2F9DA\example\scalar_with_scalar_eval.exe
The command line is too long.
<ERROR> Unable to find build log " test.exe.log "
<ERROR> Compilation failed for object " test.exe "
perazz commented 5 months ago

Windows has a hard limit of 32767 characters per command line that cannot be avoided. I believe fpm cannot use something like rsp files, because the gfortran toolchains do not support them.

Instead, I think it would be viable to change the linking procedure according to the GCC guideline:

This would be suitable for all compilers and platforms.

davidpfister commented 5 months ago

That looks like a good and quite simple idea to implement