Browse Source

Merge topic 'intel_fortran_vs2010'

3c53fbb Fix custom commands in VS2010 Fortran projects using CFG_INTDIR and test.
David Cole 14 years ago
parent
commit
a772f21a7d

+ 4 - 0
Source/cmLocalVisualStudio7Generator.cxx

@@ -1622,6 +1622,10 @@ WriteCustomRule(std::ostream& fout,
       }
       }
 
 
     std::string script = this->ConstructScript(command, i->c_str());
     std::string script = this->ConstructScript(command, i->c_str());
+    if(this->FortranProject)
+      {
+      cmSystemTools::ReplaceString(script, "$(Configuration)", i->c_str());
+      }
     fout << "\t\t\t\t\t<Tool\n"
     fout << "\t\t\t\t\t<Tool\n"
          << "\t\t\t\t\tName=\"" << customTool << "\"\n"
          << "\t\t\t\t\tName=\"" << customTool << "\"\n"
          << "\t\t\t\t\tDescription=\"" 
          << "\t\t\t\t\tDescription=\"" 

+ 7 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -1578,6 +1578,13 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences()
        i != depends.end(); ++i)
        i != depends.end(); ++i)
     {
     {
     cmTarget* dt = *i;
     cmTarget* dt = *i;
+    // skip fortran targets as they can not be processed by MSBuild
+    // the only reference will be in the .sln file
+    if(static_cast<cmGlobalVisualStudioGenerator*>(this->GlobalGenerator)
+       ->TargetIsFortranOnly(*dt))
+      {
+      continue;
+      }
     this->WriteString("<ProjectReference Include=\"", 2);
     this->WriteString("<ProjectReference Include=\"", 2);
     cmMakefile* mf = dt->GetMakefile();
     cmMakefile* mf = dt->GetMakefile();
     std::string name = dt->GetName();
     std::string name = dt->GetName();

+ 5 - 1
Tests/CMakeLists.txt

@@ -16,6 +16,8 @@ MACRO(ADD_TEST_MACRO NAME COMMAND)
   LIST(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/${dir}")
   LIST(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/${dir}")
 ENDMACRO(ADD_TEST_MACRO)
 ENDMACRO(ADD_TEST_MACRO)
 
 
+INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/CheckFortran.cmake)
+
 # Fake a user home directory to avoid polluting the real one.
 # Fake a user home directory to avoid polluting the real one.
 IF(DEFINED ENV{HOME} AND NOT CTEST_NO_TEST_HOME)
 IF(DEFINED ENV{HOME} AND NOT CTEST_NO_TEST_HOME)
   SET(TEST_HOME "${CMake_BINARY_DIR}/Tests/CMakeFiles/TestHome")
   SET(TEST_HOME "${CMake_BINARY_DIR}/Tests/CMakeFiles/TestHome")
@@ -155,6 +157,9 @@ IF(BUILD_TESTING)
   ADD_TEST_MACRO(MissingSourceFile MissingSourceFile)
   ADD_TEST_MACRO(MissingSourceFile MissingSourceFile)
   SET_TESTS_PROPERTIES(MissingSourceFile PROPERTIES
   SET_TESTS_PROPERTIES(MissingSourceFile PROPERTIES
     PASS_REGULAR_EXPRESSION "CMake Error at CMakeLists.txt:3 \\(add_executable\\):[ \r\n]*Cannot find source file:[ \r\n]*DoesNotExist/MissingSourceFile.c")
     PASS_REGULAR_EXPRESSION "CMake Error at CMakeLists.txt:3 \\(add_executable\\):[ \r\n]*Cannot find source file:[ \r\n]*DoesNotExist/MissingSourceFile.c")
+  IF(CMAKE_Fortran_COMPILER)
+    ADD_TEST_MACRO(FortranOnly FortranOnly)
+  ENDIF()
   ADD_TEST_MACRO(COnly COnly)
   ADD_TEST_MACRO(COnly COnly)
   ADD_TEST_MACRO(CxxOnly CxxOnly)
   ADD_TEST_MACRO(CxxOnly CxxOnly)
   ADD_TEST_MACRO(IPO COnly/COnly)
   ADD_TEST_MACRO(IPO COnly/COnly)
@@ -1879,7 +1884,6 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
   # fortran does not work for IDE builds because
   # fortran does not work for IDE builds because
   # CMAKE_STANDARD_LIBRARIES needs to be per language
   # CMAKE_STANDARD_LIBRARIES needs to be per language
   IF(CMAKE_TEST_GENERATOR MATCHES "Make|KDevelop")
   IF(CMAKE_TEST_GENERATOR MATCHES "Make|KDevelop")
-    INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/CheckFortran.cmake)
     IF(CMAKE_Fortran_COMPILER)
     IF(CMAKE_Fortran_COMPILER)
       ADD_TEST(Fortran ${CMAKE_CTEST_COMMAND}
       ADD_TEST(Fortran ${CMAKE_CTEST_COMMAND}
         --build-and-test
         --build-and-test

+ 42 - 0
Tests/FortranOnly/CMakeLists.txt

@@ -0,0 +1,42 @@
+cmake_minimum_required (VERSION 2.8)
+project(FortranOnly Fortran)
+message("CTEST_FULL_OUTPUT ")
+
+# create a library with hello and world functions
+add_library(FortranOnlylib hello.f world.f)
+# create an executable that calls hello and world
+add_executable(FortranOnly testf.f)
+target_link_libraries(FortranOnly FortranOnlylib)
+
+# create a custom command that runs FortranOnly and puts
+# the output into the file testfhello.txt
+add_custom_command(OUTPUT ${FortranOnly_BINARY_DIR}/testfhello.txt
+  COMMAND ${FortranOnly_BINARY_DIR}/${CMAKE_CFG_INTDIR}/FortranOnly
+  > testfhello.txt)
+# create a second executable FortranOnly2 that has
+# testfhello.txt has an source file so that it will
+# run the above custom command.
+add_executable(FortranOnly2 testfhello.txt testf.f)
+target_link_libraries(FortranOnly2 FortranOnlylib)
+# create a custom target to check the content of testfhello.txt
+# by running the cmake script checktestf2.cmake
+add_custom_target(checktestf2 ALL
+  COMMAND ${CMAKE_COMMAND}
+  -P ${FortranOnly_SOURCE_DIR}/checktestf2.cmake)
+
+# create a custom target that runs FortranOnly exectuable and creates
+# a file out.txt that should have hello world in it.
+add_custom_target(sayhello ALL
+  COMMAND ${FortranOnly_BINARY_DIR}/${CMAKE_CFG_INTDIR}/FortranOnly > out.txt
+)
+# make sure stuff is built in the right order
+add_dependencies(checktestf2 FortranOnly2)
+add_dependencies(sayhello FortranOnly)
+add_dependencies(FortranOnly2 FortranOnly)
+
+# add a custom target that checkes that out.txt has the correct
+# content
+add_custom_target(checksayhello ALL
+  COMMAND ${CMAKE_COMMAND} -P ${FortranOnly_SOURCE_DIR}/checksayhello.cmake
+  )
+add_dependencies(checksayhello sayhello)

+ 7 - 0
Tests/FortranOnly/checksayhello.cmake

@@ -0,0 +1,7 @@
+file(READ out.txt IN)
+message("${IN}")
+if(IN MATCHES Hello AND IN MATCHES World)
+  message("Passed")
+else()
+  message(FATAL_ERROR "Hello world not found")
+endif()

+ 8 - 0
Tests/FortranOnly/checktestf2.cmake

@@ -0,0 +1,8 @@
+file(READ testfhello.txt IN)
+message("${IN}")
+if(IN MATCHES Hello AND IN MATCHES World)
+  message("Passed")
+else()
+  message(FATAL_ERROR "Hello world not found")
+endif()
+file(WRITE testfhello2.txt ${IN})

+ 5 - 0
Tests/FortranOnly/hello.f

@@ -0,0 +1,5 @@
+	SUBROUTINE HELLO
+
+	PRINT *, 'Hello'
+
+	END

+ 6 - 0
Tests/FortranOnly/testf.f

@@ -0,0 +1,6 @@
+	PROGRAM TESTF
+
+	CALL HELLO()
+	CALL WORLD()
+
+	END

+ 5 - 0
Tests/FortranOnly/world.f

@@ -0,0 +1,5 @@
+	SUBROUTINE WORLD
+
+	PRINT *, 'World!'
+
+	END