summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2004-08-06 18:51:41 (GMT)
committerBill Hoffman <bill.hoffman@kitware.com>2004-08-06 18:51:41 (GMT)
commit9655299f08b5aa04ea63193ebecfa08efae7ca3d (patch)
tree69f0415d9b8414cee074b25d80c4520a6feb6086 /Source
parent0220a85e3337f87c3b34c2d49d85b6ace127ea50 (diff)
downloadCMake-9655299f08b5aa04ea63193ebecfa08efae7ca3d.zip
CMake-9655299f08b5aa04ea63193ebecfa08efae7ca3d.tar.gz
CMake-9655299f08b5aa04ea63193ebecfa08efae7ca3d.tar.bz2
ENH: initial fortran support
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGlobalGenerator.cxx43
-rw-r--r--Source/cmLocalUnixMakefileGenerator.cxx114
-rw-r--r--Source/cmMakefile.cxx13
-rw-r--r--Source/cmMakefile.h2
-rw-r--r--Source/cmSystemTools.cxx5
-rw-r--r--Source/cmSystemTools.h1
-rw-r--r--Source/cmTarget.cxx18
-rw-r--r--Source/cmTarget.h3
-rw-r--r--Source/cmTryCompileCommand.cxx16
9 files changed, 179 insertions, 36 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index e739ee9..a4c1e25 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -108,10 +108,10 @@ void cmGlobalGenerator::EnableLanguage(const char* lang,
}
bool needCBackwards = false;
bool needCXXBackwards = false;
-
+ bool needTestFortran = false;
if (!isLocal &&
!this->GetLanguageEnabled("C") && !this->GetLanguageEnabled("CXX") &&
- !this->GetLanguageEnabled("JAVA"))
+ !this->GetLanguageEnabled("JAVA") && !this->GetLanguageEnabled("FORTRAN"))
{
#if defined(_WIN32) && !defined(__CYGWIN__)
/* Windows version number data. */
@@ -186,6 +186,17 @@ void cmGlobalGenerator::EnableLanguage(const char* lang,
mf->ReadListFile(0,determineCFile.c_str());
this->SetLanguageEnabled("JAVA");
}
+ // check for a Fortran compiler and configure it
+ if(!isLocal &&
+ !this->GetLanguageEnabled("FORTRAN") &&
+ strcmp(lang, "FORTRAN") == 0)
+ {
+ needTestFortran = true;
+ std::string determineCFile = root;
+ determineCFile += "/Modules/CMakeDetermineFortranCompiler.cmake";
+ mf->ReadListFile(0,determineCFile.c_str());
+ this->SetLanguageEnabled("FORTRAN");
+ }
std::string fpath = rootBin;
if(!mf->GetDefinition("CMAKE_SYSTEM_LOADED"))
@@ -216,7 +227,14 @@ void cmGlobalGenerator::EnableLanguage(const char* lang,
mf->ReadListFile(0,fpath.c_str());
this->SetLanguageEnabled("JAVA");
}
- if ( lang[0] == 'C' && !mf->GetDefinition("CMAKE_SYSTEM_SPECIFIC_INFORMATION_LOADED"))
+ if(strcmp(lang, "FORTRAN") == 0 && !mf->GetDefinition("CMAKE_FORTRAN_COMPILER_LOADED"))
+ {
+ fpath = rootBin;
+ fpath += "/CMakeFortranCompiler.cmake";
+ mf->ReadListFile(0,fpath.c_str());
+ this->SetLanguageEnabled("FORTRAN");
+ }
+ if ( (lang[0] == 'C' || lang[0] == 'F') && !mf->GetDefinition("CMAKE_SYSTEM_SPECIFIC_INFORMATION_LOADED"))
{
fpath = root;
fpath += "/Modules/CMakeSystemSpecificInformation.cmake";
@@ -259,6 +277,16 @@ void cmGlobalGenerator::EnableLanguage(const char* lang,
}
}
}
+ if(needTestFortran)
+ {
+ if (!m_CMakeInstance->GetIsInTryCompile())
+ {
+ std::string ifpath = root + "/Modules/CMakeTestFortranCompiler.cmake";
+ mf->ReadListFile(0,ifpath.c_str());
+ }
+ }
+
+
// if we are from the top, always define this
mf->AddDefinition("RUN_CONFIGURE", true);
}
@@ -479,6 +507,15 @@ int cmGlobalGenerator::TryCompile(const char *, const char *bindir,
{
makeCommand += " ";
makeCommand += target;
+#if defined(_WIN32) || defined(__CYGWIN__)
+ std::string tmp = target;
+ // if the target does not already end in . something
+ // then assume .exe
+ if(tmp.size() < 4 || tmp[tmp.size()-4] != '.')
+ {
+ makeCommand += ".exe";
+ }
+#endif // WIN32
}
else
{
diff --git a/Source/cmLocalUnixMakefileGenerator.cxx b/Source/cmLocalUnixMakefileGenerator.cxx
index 16724f5..d866151 100644
--- a/Source/cmLocalUnixMakefileGenerator.cxx
+++ b/Source/cmLocalUnixMakefileGenerator.cxx
@@ -717,7 +717,7 @@ void cmLocalUnixMakefileGenerator::OutputLinkLibraries(std::ostream& fout,
// Some search paths should never be emitted
emitted.insert("");
emitted.insert("/usr/lib");
- std::string libPathFlag = m_Makefile->GetDefinition("CMAKE_LIBRARY_PATH_FLAG");
+ std::string libPathFlag = m_Makefile->GetRequiredDefinition("CMAKE_LIBRARY_PATH_FLAG");
std::string libLinkFlag = m_Makefile->GetSafeDefinition("CMAKE_LINK_LIBRARY_FLAG");
// collect all the flags needed for linking libraries
std::string linkLibs;
@@ -984,17 +984,23 @@ static RuleVariables ruleReplaceVars[] =
{
{"<CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS>", "CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS"},
{"<CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS>", "CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS"},
+ {"<CMAKE_SHARED_MODULE_CREATE_FORTAN_FLAGS>", "CMAKE_SHARED_MODULE_CREATE_FORTAN_FLAGS"},
{"<CMAKE_SHARED_MODULE_C_FLAGS>", "CMAKE_SHARED_MODULE_C_FLAGS"},
+ {"<CMAKE_SHARED_MODULE_FORTRAN_FLAGS>", "CMAKE_SHARED_MODULE_FORTRAN_FLAGS"},
{"<CMAKE_SHARED_MODULE_CXX_FLAGS>", "CMAKE_SHARED_MODULE_CXX_FLAGS"},
{"<CMAKE_SHARED_LIBRARY_C_FLAGS>", "CMAKE_SHARED_LIBRARY_C_FLAGS"},
+ {"<CMAKE_SHARED_LIBRARY_FORTRAN_FLAGS>", "CMAKE_SHARED_LIBRARY_FORTRAN_FLAGS"},
{"<CMAKE_SHARED_LIBRARY_CXX_FLAGS>", "CMAKE_SHARED_LIBRARY_CXX_FLAGS"},
{"<CMAKE_CXX_LINK_FLAGS>", "CMAKE_CXX_LINK_FLAGS"},
{"<CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS>", "CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS"},
+ {"<CMAKE_SHARED_LIBRARY_CREATE_FORTRAN_FLAGS>", "CMAKE_SHARED_LIBRARY_CREATE_FORTRAN_FLAGS"},
{"<CMAKE_SHARED_MODULE_CREATE_C_FLAGS>", "CMAKE_SHARED_MODULE_CREATE_C_FLAGS"},
{"<CMAKE_SHARED_LIBRARY_SONAME_C_FLAG>", "CMAKE_SHARED_LIBRARY_SONAME_C_FLAG"},
+ {"<CMAKE_SHARED_LIBRARY_SONAME_FORTRAN_FLAG>", "CMAKE_SHARED_LIBRARY_SONAME_FORTRAN_FLAG"},
{"<CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG>", "CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG"},
{"<CMAKE_C_LINK_FLAGS>", "CMAKE_C_LINK_FLAGS"},
+ {"<CMAKE_FORTRAN_LINK_FLAGS>", "CMAKE_FORTRAN_LINK_FLAGS"},
{"<CMAKE_AR>", "CMAKE_AR"},
{"<CMAKE_RANLIB>", "CMAKE_RANLIB"},
@@ -1021,6 +1027,9 @@ cmLocalUnixMakefileGenerator::ExpandRuleVariables(std::string& s,
m_Makefile->GetSafeDefinition("CMAKE_CXX_COMPILER"));
std::string ccompiler = this->ConvertToOutputForExisting(
m_Makefile->GetSafeDefinition("CMAKE_C_COMPILER"));
+ std::string fcompiler = this->ConvertToOutputForExisting(
+ m_Makefile->GetSafeDefinition("CMAKE_FORTRAN_COMPILER"));
+ cmSystemTools::ReplaceString(s, "<CMAKE_FORTRAN_COMPILER>", fcompiler.c_str());
cmSystemTools::ReplaceString(s, "<CMAKE_CXX_COMPILER>", cxxcompiler.c_str());
cmSystemTools::ReplaceString(s, "<CMAKE_C_COMPILER>", ccompiler.c_str());
if(linkFlags)
@@ -1165,7 +1174,7 @@ void cmLocalUnixMakefileGenerator::OutputLibraryRule(std::ostream& fout,
std::vector<std::string> commands;
std::string cmakecommand = this->ConvertToOutputForExisting(
- m_Makefile->GetDefinition("CMAKE_COMMAND"));
+ m_Makefile->GetRequiredDefinition("CMAKE_COMMAND"));
// Remove any existing files for this library.
std::string remove = cmakecommand;
@@ -1199,7 +1208,7 @@ void cmLocalUnixMakefileGenerator::OutputLibraryRule(std::ostream& fout,
// collect up the build rules
std::vector<std::string> rules;
- rules.push_back(m_Makefile->GetDefinition(createVariable));
+ rules.push_back(m_Makefile->GetRequiredDefinition(createVariable));
// expand multi-command semi-colon separated lists
// of commands into separate commands
cmSystemTools::ExpandList(rules, commands);
@@ -1261,9 +1270,9 @@ void cmLocalUnixMakefileGenerator::OutputLibraryRule(std::ostream& fout,
depend.c_str(),
commands);
}
+ // Add a target with the canonical name (no prefix, suffix or path).
+ this->OutputMakeRule(fout, comment, name, tgt.c_str(), 0);
- // Add a target with the canonical name (no prefix, suffix or path).
- this->OutputMakeRule(fout, comment, name, tgt.c_str(), 0);
}
void cmLocalUnixMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout,
@@ -1274,11 +1283,19 @@ void cmLocalUnixMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout,
if(t.HasCxx())
{
createRule = "CMAKE_CXX_CREATE_SHARED_LIBRARY";
- }
+ }
else
{
- createRule = "CMAKE_C_CREATE_SHARED_LIBRARY";
+ if(t.HasFortran())
+ {
+ createRule = "CMAKE_FORTRAN_CREATE_SHARED_LIBRARY";
+ }
+ else
+ {
+ createRule = "CMAKE_C_CREATE_SHARED_LIBRARY";
+ }
}
+
std::string buildType = m_Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
buildType = cmSystemTools::UpperCase(buildType);
std::string linkFlags = m_Makefile->GetSafeDefinition("CMAKE_SHARED_LINKER_FLAGS");
@@ -1427,7 +1444,8 @@ void cmLocalUnixMakefileGenerator::OutputExecutableRule(std::ostream& fout,
{
needsLocalTarget = true;
}
- std::string objs = "$(" + this->CreateMakeVariable(name, "_SRC_OBJS") + ") $(" + this->CreateMakeVariable(name, "_EXTERNAL_OBJS") + ") ";
+ std::string objs = "$(" + this->CreateMakeVariable(name, "_SRC_OBJS") +
+ ") $(" + this->CreateMakeVariable(name, "_EXTERNAL_OBJS") + ") ";
std::string depend = "$(";
depend += this->CreateMakeVariable(name, "_SRC_OBJS")
+ ") $(" + this->CreateMakeVariable(name, "_EXTERNAL_OBJS")
@@ -1445,7 +1463,7 @@ void cmLocalUnixMakefileGenerator::OutputExecutableRule(std::ostream& fout,
if(t.HasCxx())
{
- rules.push_back(m_Makefile->GetDefinition("CMAKE_CXX_LINK_EXECUTABLE"));
+ rules.push_back(m_Makefile->GetRequiredDefinition("CMAKE_CXX_LINK_EXECUTABLE"));
flags += m_Makefile->GetSafeDefinition("CMAKE_CXX_FLAGS");
flags += " ";
flags += m_Makefile->GetSafeDefinition("CMAKE_SHARED_LIBRARY_CXX_FLAGS");
@@ -1453,11 +1471,22 @@ void cmLocalUnixMakefileGenerator::OutputExecutableRule(std::ostream& fout,
}
else
{
- rules.push_back(m_Makefile->GetDefinition("CMAKE_C_LINK_EXECUTABLE"));
- flags += m_Makefile->GetSafeDefinition("CMAKE_C_FLAGS");
- flags += " ";
- flags += m_Makefile->GetSafeDefinition("CMAKE_SHARED_LIBRARY_C_FLAGS");
- flags += " ";
+ if(t.HasFortran())
+ {
+ rules.push_back(m_Makefile->GetRequiredDefinition("CMAKE_FORTRAN_LINK_EXECUTABLE"));
+ flags += m_Makefile->GetSafeDefinition("CMAKE_FORTRAN_FLAGS");
+ flags += " ";
+ flags += m_Makefile->GetSafeDefinition("CMAKE_SHARED_LIBRARY_FORTRAN_FLAGS");
+ flags += " ";
+ }
+ else
+ {
+ rules.push_back(m_Makefile->GetRequiredDefinition("CMAKE_C_LINK_EXECUTABLE"));
+ flags += m_Makefile->GetSafeDefinition("CMAKE_C_FLAGS");
+ flags += " ";
+ flags += m_Makefile->GetSafeDefinition("CMAKE_SHARED_LIBRARY_C_FLAGS");
+ flags += " ";
+ }
}
cmOStringStream linklibs;
this->OutputLinkLibraries(linklibs, 0, t);
@@ -1540,15 +1569,14 @@ void cmLocalUnixMakefileGenerator::OutputExecutableRule(std::ostream& fout,
depend.c_str(),
commands);
}
-
- // Add a target with the canonical name (no prefix, suffix or path).
- // Note that on some platforms the "local target" added above will
- // actually be the canonical name and will have set "target"
- // correctly. Do not duplicate this target.
- if(target != name)
- {
- this->OutputMakeRule(fout, comment.c_str(), name, target.c_str(), 0);
- }
+ // Add a target with the canonical name (no prefix, suffix or path).
+ // Note that on some platforms the "local target" added above will
+ // actually be the canonical name and will have set "target"
+ // correctly. Do not duplicate this target.
+ if(target != name)
+ {
+ this->OutputMakeRule(fout, comment.c_str(), name, target.c_str(), 0);
+ }
}
@@ -2476,7 +2504,7 @@ void cmLocalUnixMakefileGenerator::OutputMakeVariables(std::ostream& fout)
}
std::string cmakecommand = this->ConvertToOutputForExisting(
- m_Makefile->GetDefinition("CMAKE_COMMAND"));
+ m_Makefile->GetRequiredDefinition("CMAKE_COMMAND"));
fout << "CMAKE_COMMAND = "
<< cmakecommand
<< "\n";
@@ -2699,14 +2727,14 @@ void cmLocalUnixMakefileGenerator::OutputMakeRules(std::ostream& fout)
this->OutputSourceObjectBuildRules(fout);
// find ctest
- std::string ctest = m_Makefile->GetDefinition("CMAKE_COMMAND");
+ std::string ctest = m_Makefile->GetRequiredDefinition("CMAKE_COMMAND");
ctest = cmSystemTools::GetFilenamePath(ctest.c_str());
ctest += "/";
ctest += "ctest";
ctest += cmSystemTools::GetExecutableExtension();
if(!cmSystemTools::FileExists(ctest.c_str()))
{
- ctest = m_Makefile->GetDefinition("CMAKE_COMMAND");
+ ctest = m_Makefile->GetRequiredDefinition("CMAKE_COMMAND");
ctest = cmSystemTools::GetFilenamePath(ctest.c_str());
ctest += "/Debug/";
ctest += "ctest";
@@ -2714,7 +2742,7 @@ void cmLocalUnixMakefileGenerator::OutputMakeRules(std::ostream& fout)
}
if(!cmSystemTools::FileExists(ctest.c_str()))
{
- ctest = m_Makefile->GetDefinition("CMAKE_COMMAND");
+ ctest = m_Makefile->GetRequiredDefinition("CMAKE_COMMAND");
ctest = cmSystemTools::GetFilenamePath(ctest.c_str());
ctest += "/Release/";
ctest += "ctest";
@@ -2727,7 +2755,7 @@ void cmLocalUnixMakefileGenerator::OutputMakeRules(std::ostream& fout)
{
return;
}
- ctest = m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH");
+ ctest = m_Makefile->GetRequiredDefinition("EXECUTABLE_OUTPUT_PATH");
ctest += "/ctest";
}
if (m_Makefile->IsOn("CMAKE_TESTING_ENABLED"))
@@ -2745,7 +2773,7 @@ void cmLocalUnixMakefileGenerator::OutputMakeRules(std::ostream& fout)
{
// We are building CMake itself. We cannot use the original
// executable to install over itself.
- std::string rule = m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH");
+ std::string rule = m_Makefile->GetRequiredDefinition("EXECUTABLE_OUTPUT_PATH");
rule += "/cmake";
rule = cmSystemTools::ConvertToOutputPath(rule.c_str());
rule += " -P cmake_install.cmake";
@@ -2794,7 +2822,7 @@ OutputBuildObjectFromSource(std::ostream& fout,
{
case cmSystemTools::C_FILE_FORMAT:
{
- rules.push_back(m_Makefile->GetDefinition("CMAKE_C_COMPILE_OBJECT"));
+ rules.push_back(m_Makefile->GetRequiredDefinition("CMAKE_C_COMPILE_OBJECT"));
flags += m_Makefile->GetSafeDefinition("CMAKE_C_FLAGS");
flags += " ";
if(buildType.size())
@@ -2818,7 +2846,7 @@ OutputBuildObjectFromSource(std::ostream& fout,
}
case cmSystemTools::CXX_FILE_FORMAT:
{
- rules.push_back(m_Makefile->GetDefinition("CMAKE_CXX_COMPILE_OBJECT"));
+ rules.push_back(m_Makefile->GetRequiredDefinition("CMAKE_CXX_COMPILE_OBJECT"));
flags += m_Makefile->GetSafeDefinition("CMAKE_CXX_FLAGS");
flags += " ";
if(buildType.size())
@@ -2840,6 +2868,30 @@ OutputBuildObjectFromSource(std::ostream& fout,
}
break;
}
+ case cmSystemTools::FORTRAN_FILE_FORMAT:
+ {
+ rules.push_back(m_Makefile->GetRequiredDefinition("CMAKE_FORTRAN_COMPILE_OBJECT"));
+ flags += m_Makefile->GetSafeDefinition("CMAKE_FORTRAN_FLAGS");
+ flags += " ";
+ if(buildType.size())
+ {
+ std::string build = "CMAKE_FORTRAN_FLAGS_";
+ build += buildType;
+ flags += m_Makefile->GetSafeDefinition(build.c_str());
+ flags += " ";
+ }
+ if(shared)
+ {
+ flags += m_Makefile->GetSafeDefinition("CMAKE_SHARED_LIBRARY_FORTRAN_FLAGS");
+ flags += " ";
+ }
+ if(cmSystemTools::IsOn(m_Makefile->GetDefinition("BUILD_SHARED_LIBS")))
+ {
+ flags += m_Makefile->GetSafeDefinition("CMAKE_SHARED_BUILD_FORTRAN_FLAGS");
+ flags += " ";
+ }
+ break;
+ }
case cmSystemTools::HEADER_FILE_FORMAT:
return;
case cmSystemTools::DEFINITION_FILE_FORMAT:
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 3e3c87b..77bf08d 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -1346,6 +1346,19 @@ bool cmMakefile::IsOn(const char* name) const
return cmSystemTools::IsOn(value);
}
+const char* cmMakefile::GetRequiredDefinition(const char* name) const
+{
+ const char* ret = this->GetDefinition(name);
+ if(!ret)
+ {
+ cmSystemTools::Error("Error required internal CMake variable not set, cmake may be not be built correctly.\n",
+ "Missing variable is:\n",
+ name);
+ return "";
+ }
+ return ret;
+}
+
const char* cmMakefile::GetDefinition(const char* name) const
{
const char* def = 0;
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index efca41e..4452622 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -503,7 +503,7 @@ public:
*/
const char* GetDefinition(const char*) const;
const char* GetSafeDefinition(const char*) const;
-
+ const char* GetRequiredDefinition(const char* name) const;
/**
* Get the list of all variables in the current space. If argument
* cacheonly is specified and is greater than 0, then only cache
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 4927da8..7dfcdde 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -1095,6 +1095,11 @@ cmSystemTools::FileFormat cmSystemTools::GetFileFormat(const char* cext)
ext == "m" || ext == ".m" ||
ext == "mm" || ext == ".mm"
) { return cmSystemTools::CXX_FILE_FORMAT; }
+ if (
+ ext == "f" || ext == ".f" ||
+ ext == "F" || ext == ".F" ||
+ ext == "f77" || ext == ".f77"
+ ) { return cmSystemTools::FORTRAN_FILE_FORMAT; }
if ( ext == "java" || ext == ".java" ) { return cmSystemTools::JAVA_FILE_FORMAT; }
if (
ext == "H" || ext == ".H" ||
diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h
index 061b9cc..e0fbffc 100644
--- a/Source/cmSystemTools.h
+++ b/Source/cmSystemTools.h
@@ -211,6 +211,7 @@ public:
NO_FILE_FORMAT = 0,
C_FILE_FORMAT,
CXX_FILE_FORMAT,
+ FORTRAN_FILE_FORMAT,
JAVA_FILE_FORMAT,
HEADER_FILE_FORMAT,
RESOURCE_FILE_FORMAT,
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index f914094..7c3fb7a 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -437,6 +437,24 @@ bool cmTarget::HasCxx() const
return false;
}
+bool cmTarget::HasFortran() const
+{
+ if(this->GetProperty("HAS_FORTRAN"))
+ {
+ return true;
+ }
+ for(std::vector<cmSourceFile*>::const_iterator i = m_SourceFiles.begin();
+ i != m_SourceFiles.end(); ++i)
+ {
+ if(cmSystemTools::GetFileFormat((*i)->GetSourceExtension().c_str())
+ == cmSystemTools::FORTRAN_FILE_FORMAT)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 804e126..3ba8690 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -87,6 +87,9 @@ public:
///! does this target have a cxx file in it
bool HasCxx() const;
+
+ ///! does this target have a fortran file in it
+ bool HasFortran() const;
/**
* Get the list of the source files used by this target
*/
diff --git a/Source/cmTryCompileCommand.cxx b/Source/cmTryCompileCommand.cxx
index 422b02b..b72f14d 100644
--- a/Source/cmTryCompileCommand.cxx
+++ b/Source/cmTryCompileCommand.cxx
@@ -156,10 +156,14 @@ int cmTryCompileCommand::CoreTryCompileCode(
{
fprintf(fout, "PROJECT(CMAKE_TRY_COMPILE CXX)\n");
}
+ else if ( format == cmSystemTools::FORTRAN_FILE_FORMAT )
+ {
+ fprintf(fout, "PROJECT(CMAKE_TRY_COMPILE FORTRAN)\n");
+ }
else
{
cmSystemTools::Error("Unknown file format for file: ", source.c_str(),
- "; TRY_COMPILE only works for C and CXX files");
+ "; TRY_COMPILE only works for C, CXX, and FORTRAN files");
return -1;
}
const char* cflags = mf->GetDefinition("CMAKE_C_FLAGS");
@@ -181,6 +185,16 @@ int cmTryCompileCommand::CoreTryCompileCode(
}
fprintf(fout, " ${COMPILE_DEFINITIONS}\")\n");
}
+ if(format == cmSystemTools::FORTRAN_FILE_FORMAT )
+ {
+ const char* fflags = mf->GetDefinition("CMAKE_FORTRAN_FLAGS");
+ fprintf(fout, "SET(CMAKE_FORTRAN_FLAGS \"${CMAKE_FORTRAN_FLAGS} ");
+ if(fflags)
+ {
+ fprintf(fout, " %s ", fflags);
+ }
+ fprintf(fout, " ${COMPILE_DEFINITIONS}\")\n");
+ }
fprintf(fout, "INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES})\n");
fprintf(fout, "LINK_DIRECTORIES(${LINK_DIRECTORIES})\n");
// handle any compile flags we need to pass on