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:
parent
6c72d25aee
commit
3c53fbb1f0
|
@ -1622,6 +1622,10 @@ WriteCustomRule(std::ostream& fout,
|
|||
}
|
||||
|
||||
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"
|
||||
<< "\t\t\t\t\tName=\"" << customTool << "\"\n"
|
||||
<< "\t\t\t\t\tDescription=\""
|
||||
|
|
|
@ -1563,6 +1563,13 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences()
|
|||
i != depends.end(); ++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);
|
||||
cmMakefile* mf = dt->GetMakefile();
|
||||
std::string name = dt->GetName();
|
||||
|
|
|
@ -16,6 +16,8 @@ MACRO(ADD_TEST_MACRO NAME COMMAND)
|
|||
LIST(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/${dir}")
|
||||
ENDMACRO(ADD_TEST_MACRO)
|
||||
|
||||
INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/CheckFortran.cmake)
|
||||
|
||||
# Fake a user home directory to avoid polluting the real one.
|
||||
IF(DEFINED ENV{HOME} AND NOT CTEST_NO_TEST_HOME)
|
||||
SET(TEST_HOME "${CMake_BINARY_DIR}/Tests/CMakeFiles/TestHome")
|
||||
|
@ -155,6 +157,9 @@ IF(BUILD_TESTING)
|
|||
ADD_TEST_MACRO(MissingSourceFile MissingSourceFile)
|
||||
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")
|
||||
IF(CMAKE_Fortran_COMPILER)
|
||||
ADD_TEST_MACRO(FortranOnly FortranOnly)
|
||||
ENDIF()
|
||||
ADD_TEST_MACRO(COnly COnly)
|
||||
ADD_TEST_MACRO(CxxOnly CxxOnly)
|
||||
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
|
||||
# CMAKE_STANDARD_LIBRARIES needs to be per language
|
||||
IF(CMAKE_TEST_GENERATOR MATCHES "Make|KDevelop")
|
||||
INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/CheckFortran.cmake)
|
||||
IF(CMAKE_Fortran_COMPILER)
|
||||
ADD_TEST(Fortran ${CMAKE_CTEST_COMMAND}
|
||||
--build-and-test
|
||||
|
|
|
@ -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)
|
|
@ -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()
|
|
@ -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})
|
|
@ -0,0 +1,5 @@
|
|||
SUBROUTINE HELLO
|
||||
|
||||
PRINT *, 'Hello'
|
||||
|
||||
END
|
|
@ -0,0 +1,6 @@
|
|||
PROGRAM TESTF
|
||||
|
||||
CALL HELLO()
|
||||
CALL WORLD()
|
||||
|
||||
END
|
|
@ -0,0 +1,5 @@
|
|||
SUBROUTINE WORLD
|
||||
|
||||
PRINT *, 'World!'
|
||||
|
||||
END
|
Loading…
Reference in New Issue