Fix custom commands in VS2010 Fortran projects using CFG_INTDIR and test.

For custom commands in VS2010 Fortran projects the INTDIR variable
is different than in the rest of the solution because Intel
fortran still uses the old VS project files even in VS2010. So,
we replace $(Configuration) directly in the project files. I have also
added a FortranOnly test that tests this feature and is run on any
generator that has Fortran abilities.
This commit is contained in:
Bill Hoffman 2011-08-03 17:24:43 -04:00
parent 6c72d25aee
commit 3c53fbb1f0
9 changed files with 89 additions and 1 deletions

View File

@ -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=\""

View File

@ -1563,6 +1563,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();

View File

@ -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

View File

@ -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)

View File

@ -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()

View File

@ -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})

View File

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

View File

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

View File

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