From 34e1ac2489778a854c3ffaa9c141a9a70416a47e Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 12 Nov 2010 09:03:49 -0500 Subject: [PATCH 1/2] Create Fortran info variables for .mod behavior Define CMAKE_Fortran_MODDIR_DEFAULT and CMAKE_Fortran_MODOUT_FLAG variables to help some Fortran compilers generate .mod files in the current working directory. --- Source/cmDocumentVariables.cxx | 23 +++++++++++++++++++++++ Source/cmMakefileTargetGenerator.cxx | 13 +++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Source/cmDocumentVariables.cxx b/Source/cmDocumentVariables.cxx index a877680de..a69bb8ff6 100644 --- a/Source/cmDocumentVariables.cxx +++ b/Source/cmDocumentVariables.cxx @@ -1336,6 +1336,29 @@ void cmDocumentVariables::DefineVariables(cmake* cm) "this variable is defined to 1.", false,"Variables for Languages"); + cm->DefineProperty( + "CMAKE_Fortran_MODDIR_FLAG", cmProperty::VARIABLE, + "Fortran flag for module output directory.", + "This stores the flag needed to pass the value of the " + "Fortran_MODULE_DIRECTORY target property to the compiler.", + false,"Variables for Languages"); + + cm->DefineProperty( + "CMAKE_Fortran_MODDIR_DEFAULT", cmProperty::VARIABLE, + "Fortran default module output directory.", + "Most Fortran compilers write .mod files to the current working " + "directory. " + "For those that do not, this is set to \".\" and used when the " + "Fortran_MODULE_DIRECTORY target property is not set.", + false,"Variables for Languages"); + + cm->DefineProperty( + "CMAKE_Fortran_MODOUT_FLAG", cmProperty::VARIABLE, + "Fortran flag to enable module output.", + "Most Fortran compilers write .mod files out by default. " + "For others, this stores the flag needed to enable module output.", + false,"Variables for Languages"); + // variables that are used by cmake but not to be documented cm->DefineProperty("CMAKE_MATCH_0", cmProperty::VARIABLE,0,0); cm->DefineProperty("CMAKE_MATCH_1", cmProperty::VARIABLE,0,0); diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index 9153f3a6b..6b290aba0 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -1723,6 +1723,8 @@ const char* cmMakefileTargetGenerator::GetFortranModuleDirectory() this->Target->GetProperty("Fortran_MODULE_DIRECTORY"); const char* moddir_flag = this->Makefile->GetDefinition("CMAKE_Fortran_MODDIR_FLAG"); + const char* moddir_default = + this->Makefile->GetDefinition("CMAKE_Fortran_MODDIR_DEFAULT"); if(target_mod_dir && moddir_flag) { // Compute the full path to the module directory. @@ -1743,6 +1745,10 @@ const char* cmMakefileTargetGenerator::GetFortranModuleDirectory() // Make sure the module output directory exists. cmSystemTools::MakeDirectory(this->FortranModuleDirectory.c_str()); } + else if(moddir_default && moddir_flag) + { + this->FortranModuleDirectory = moddir_default; + } this->FortranModuleDirectoryComputed = true; } @@ -1760,6 +1766,13 @@ const char* cmMakefileTargetGenerator::GetFortranModuleDirectory() //---------------------------------------------------------------------------- void cmMakefileTargetGenerator::AddFortranFlags(std::string& flags) { + // Enable module output if necessary. + if(const char* modout_flag = + this->Makefile->GetDefinition("CMAKE_Fortran_MODOUT_FLAG")) + { + this->LocalGenerator->AppendFlags(flags, modout_flag); + } + // Add a module output directory flag if necessary. if(const char* mod_dir = this->GetFortranModuleDirectory()) { From 53e76c8f126fd2480c560cf2bb46a93eabbc91fa Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 12 Nov 2010 09:12:08 -0500 Subject: [PATCH 2/2] Teach CMake about Cray C, C++, and Fortran compilers The Cray Fortran compiler needs "-em" to enable module output and also "-J." to place the .mod files in the current working directory (instead of next to the .o file). --- Modules/CMakeCCompilerId.c.in | 3 +++ Modules/CMakeCXXCompilerId.cpp.in | 3 +++ Modules/CMakeFortranCompilerId.F.in | 2 ++ Modules/Compiler/Cray-C.cmake | 1 + Modules/Compiler/Cray-CXX.cmake | 1 + Modules/Compiler/Cray-Fortran.cmake | 4 ++++ 6 files changed, 14 insertions(+) create mode 100644 Modules/Compiler/Cray-C.cmake create mode 100644 Modules/Compiler/Cray-CXX.cmake create mode 100644 Modules/Compiler/Cray-Fortran.cmake diff --git a/Modules/CMakeCCompilerId.c.in b/Modules/CMakeCCompilerId.c.in index accda3257..2b80c886a 100644 --- a/Modules/CMakeCCompilerId.c.in +++ b/Modules/CMakeCCompilerId.c.in @@ -42,6 +42,9 @@ #elif defined(__PATHSCALE__) # define COMPILER_ID "PathScale" +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" + #elif defined(__GNUC__) # define COMPILER_ID "GNU" diff --git a/Modules/CMakeCXXCompilerId.cpp.in b/Modules/CMakeCXXCompilerId.cpp.in index 4a32823f8..91f116aa9 100644 --- a/Modules/CMakeCXXCompilerId.cpp.in +++ b/Modules/CMakeCXXCompilerId.cpp.in @@ -44,6 +44,9 @@ #elif defined(__PATHSCALE__) # define COMPILER_ID "PathScale" +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" + #elif defined(__GNUC__) # define COMPILER_ID "GNU" diff --git a/Modules/CMakeFortranCompilerId.F.in b/Modules/CMakeFortranCompilerId.F.in index 107470cd0..4080cc117 100644 --- a/Modules/CMakeFortranCompilerId.F.in +++ b/Modules/CMakeFortranCompilerId.F.in @@ -6,6 +6,8 @@ PRINT *, 'INFO:compiler[Intel]' #elif defined(__SUNPRO_F90) || defined(__SUNPRO_F95) PRINT *, 'INFO:compiler[SunPro]' +#elif defined(_CRAYFTN) + PRINT *, 'INFO:compiler[Cray]' #elif defined(__G95__) PRINT *, 'INFO:compiler[G95]' #elif defined(__PATHSCALE__) diff --git a/Modules/Compiler/Cray-C.cmake b/Modules/Compiler/Cray-C.cmake new file mode 100644 index 000000000..675560c2a --- /dev/null +++ b/Modules/Compiler/Cray-C.cmake @@ -0,0 +1 @@ +set(CMAKE_C_VERBOSE_FLAG "-v") diff --git a/Modules/Compiler/Cray-CXX.cmake b/Modules/Compiler/Cray-CXX.cmake new file mode 100644 index 000000000..9fb191c75 --- /dev/null +++ b/Modules/Compiler/Cray-CXX.cmake @@ -0,0 +1 @@ +set(CMAKE_CXX_VERBOSE_FLAG "-v") diff --git a/Modules/Compiler/Cray-Fortran.cmake b/Modules/Compiler/Cray-Fortran.cmake new file mode 100644 index 000000000..4f45176d2 --- /dev/null +++ b/Modules/Compiler/Cray-Fortran.cmake @@ -0,0 +1,4 @@ +set(CMAKE_Fortran_VERBOSE_FLAG "-v") +set(CMAKE_Fortran_MODOUT_FLAG -em) +set(CMAKE_Fortran_MODDIR_FLAG -J) +set(CMAKE_Fortran_MODDIR_DEFAULT .)