On 9. Jan, 2009, at 10:26, Martin Apel wrote:
Michael Wild wrote:
On 9. Jan, 2009, at 9:27, Martin Apel wrote:
Hi all,
I am experiencing a problem with one Fortran source file
containing a
module definition. Unfortunately the whole source file is enclosed
in
'#ifdef WINDOWS'. On Linux this causes the build process to fail,
because cmake wants to copy a generated .mod file, which does not
exist.
The file containing the module has the suffix ".f". When changing
the
suffix to ".F", everything works fine.
CMake probably thinks, the file need not be preprocessed before
scanning, if it has the suffix ".f". Is there any way to tell CMake,
that files with the suffix ".f" have to be preprocessed before
dependency scanning?
Regards,
Martin
Hi
I think it is fairly non-standard to have a .f file preprocessed. All
Fortran compilers I'm acquainted with only preprocess a file if it
has
a .F extension (unless forced, of course).
But since it is the whole file, can't you just exclude it in the
CMake
code?
set( SRCS foo.f bar.f )
if(WIN32)
list( APPEND SRCS winspecific.f )
endif(WIN32)
add_executable( super_cow ${SRCS} )
You are right, that this is uncommon. But I'm trying to replace an
existing "build system" for some thousands of files, which
preprocesses
all Fortran files, even those with ".f" suffix. Unfortunately this is
something I can't change.
I could use the approach you suggest, but I'd like a more general
solution, because I cannot be sure, that this is the only file, where
preprocessing makes a difference. There might
be other files containing a USE directive enclosed in ifdefs.
Regards,
Martin
I just constructed a small test case, and it works for me (using
CMake-2.6 and gfortran). See below.
Michael
test.f90:
=========
program test
#ifdef MORE
use test_module
#endif
implicit none
print *, "This is a test"
#ifdef MORE
call hello()
#endif
end program test
modules/test_module.f90
=======================
#ifdef MORE
module test_module
implicit none
contains
subroutine hello()
implicit none
print *,"Hello World"
end subroutine
end module test_module
#endif
CMakeLists.txt
==============
project( test Fortran )
cmake_minimum_required( VERSION 2.6 )
option( DEFINE_MORE "If set to ON, -DMORE will be defined" OFF )
# force gfortran to preprocess the input files
# change this to "-fpp" for ifort (that's the ones i know...)
set( FORTRAN_PREPROCESS_FLAG "-x f95-cpp-input" CACHE STRING
"Flags to force the Fortran compiler to preprocess the source
files.")
if( DEFINE_MORE )
add_definitions( -DMORE )
endif( DEFINE_MORE )
add_executable( test test.f90 modules/test_module.f90 )
set_target_properties( test PROPERTIES COMPILE_FLAGS $
{FORTRAN_PREPROCESS_FLAG} ))
_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake