aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2011-10-24 13:36:49 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2011-10-24 13:36:49 +0200
commite44c19d1ccc01a9d0217bf5341d387560702f2a3 (patch)
tree13dd9003c03c5bbc4610abb350569696b7a06f18
parent1ddf88060b6475d3ee6b681bb0ed7b55d311ffa5 (diff)
hopefully this workaround of cmake bug #9220 works for MSVC too
-rw-r--r--blas/CMakeLists.txt23
-rw-r--r--cmake/language_support.cmake65
-rw-r--r--lapack/CMakeLists.txt17
3 files changed, 81 insertions, 24 deletions
diff --git a/blas/CMakeLists.txt b/blas/CMakeLists.txt
index 03346a936..55440f4dc 100644
--- a/blas/CMakeLists.txt
+++ b/blas/CMakeLists.txt
@@ -1,25 +1,19 @@
project(EigenBlas CXX)
-if( NOT DEFINED EIGEN_Fortran_COMPILER_WORKS OR EIGEN_Fortran_COMPILER_WORKS)
+include("../cmake/language_support.cmake")
- enable_language(Fortran OPTIONAL)
+workaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS)
- if(CMAKE_Fortran_COMPILER_WORKS)
- set(EIGEN_Fortran_COMPILER_WORKS TRUE CACHE INTERNAL "workaround cmake's enable_language issue")
- else()
- set(EIGEN_Fortran_COMPILER_WORKS FALSE CACHE INTERNAL "workaround cmake's enable_language issue")
- endif()
-
+if(EIGEN_Fortran_COMPILER_WORKS)
+ enable_language(Fortran OPTIONAL)
endif()
add_custom_target(blas)
set(EigenBlas_SRCS single.cpp double.cpp complex_single.cpp complex_double.cpp xerbla.cpp)
-if(CMAKE_Fortran_COMPILER_WORKS)
-
-message(WARNING " No fortran compiler has been detected, the blas build will be incomplete.")
+if(EIGEN_Fortran_COMPILER_WORKS)
set(EigenBlas_SRCS ${EigenBlas_SRCS}
complexdots.f
@@ -29,8 +23,11 @@ set(EigenBlas_SRCS ${EigenBlas_SRCS}
zhbmv.f zhpr.f ztpmv.f chpmv.f ctbmv.f ctpsv.f dsbmv.f dspr.f dtpmv.f sspr2.f
stbsv.f zhpmv.f ztbmv.f ztpsv.f
)
+else()
+
+message(WARNING " No fortran compiler has been detected, the blas build will be incomplete.")
-endif(CMAKE_Fortran_COMPILER_WORKS)
+endif()
add_library(eigen_blas_static ${EigenBlas_SRCS})
add_library(eigen_blas SHARED ${EigenBlas_SRCS})
@@ -47,7 +44,7 @@ install(TARGETS eigen_blas eigen_blas_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
-if(CMAKE_Fortran_COMPILER_WORKS)
+if(EIGEN_Fortran_COMPILER_WORKS)
if(EIGEN_LEAVE_TEST_IN_ALL_TARGET)
add_subdirectory(testing) # can't do EXCLUDE_FROM_ALL here, breaks CTest
diff --git a/cmake/language_support.cmake b/cmake/language_support.cmake
new file mode 100644
index 000000000..aa5870bb0
--- /dev/null
+++ b/cmake/language_support.cmake
@@ -0,0 +1,65 @@
+# cmake/modules/language_support.cmake
+#
+# Temporary additional general language support is contained within this
+# file.
+
+# This additional function definition is needed to provide a workaround for
+# CMake bug 9220.
+
+# On debian testing (cmake 2.6.2), I get return code zero when calling
+# cmake the first time, but cmake crashes when running a second time
+# as follows:
+#
+# -- The Fortran compiler identification is unknown
+# CMake Error at /usr/share/cmake-2.6/Modules/CMakeFortranInformation.cmake:7 (GET_FILENAME_COMPONENT):
+# get_filename_component called with incorrect number of arguments
+# Call Stack (most recent call first):
+# CMakeLists.txt:3 (enable_language)
+#
+# My workaround is to invoke cmake twice. If both return codes are zero,
+# it is safe to invoke ENABLE_LANGUAGE(Fortran OPTIONAL)
+
+function(workaround_9220 language language_works)
+ #message("DEBUG: language = ${language}")
+ set(text
+ "project(test NONE)
+cmake_minimum_required(VERSION 2.6.0)
+enable_language(${language} OPTIONAL)
+"
+ )
+ file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/language_tests/${language})
+ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language})
+ file(WRITE ${CMAKE_BINARY_DIR}/language_tests/${language}/CMakeLists.txt
+ ${text})
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} .
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}
+ RESULT_VARIABLE return_code
+ OUTPUT_QUIET
+ ERROR_QUIET
+ )
+
+ if(return_code EQUAL 0)
+ # Second run
+ execute_process (
+ COMMAND ${CMAKE_COMMAND} .
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}
+ RESULT_VARIABLE return_code
+ OUTPUT_QUIET
+ ERROR_QUIET
+ )
+ if(return_code EQUAL 0)
+ set(${language_works} ON PARENT_SCOPE)
+ else(return_code EQUAL 0)
+ set(${language_works} OFF PARENT_SCOPE)
+ endif(return_code EQUAL 0)
+ else(return_code EQUAL 0)
+ set(${language_works} OFF PARENT_SCOPE)
+ endif(return_code EQUAL 0)
+endfunction(workaround_9220)
+
+# Temporary tests of the above function.
+#workaround_9220(CXX CXX_language_works)
+#message("CXX_language_works = ${CXX_language_works}")
+#workaround_9220(CXXp CXXp_language_works)
+#message("CXXp_language_works = ${CXXp_language_works}")
diff --git a/lapack/CMakeLists.txt b/lapack/CMakeLists.txt
index ad7c04274..062845a3f 100644
--- a/lapack/CMakeLists.txt
+++ b/lapack/CMakeLists.txt
@@ -1,19 +1,14 @@
project(EigenLapack CXX)
-if( NOT DEFINED EIGEN_Fortran_COMPILER_WORKS OR EIGEN_Fortran_COMPILER_WORKS)
+include("../cmake/language_support.cmake")
- enable_language(Fortran OPTIONAL)
+workaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS)
- if(CMAKE_Fortran_COMPILER_WORKS)
- set(EIGEN_Fortran_COMPILER_WORKS TRUE CACHE INTERNAL "workaround cmake's enable_language issue")
- else()
- set(EIGEN_Fortran_COMPILER_WORKS FALSE CACHE INTERNAL "workaround cmake's enable_language issue")
- endif()
-
+if(EIGEN_Fortran_COMPILER_WORKS)
+ enable_language(Fortran OPTIONAL)
endif()
-
add_custom_target(lapack)
include_directories(../blas)
@@ -21,7 +16,7 @@ set(EigenLapack_SRCS
single.cpp double.cpp complex_single.cpp complex_double.cpp ../blas/xerbla.cpp
)
-if(CMAKE_Fortran_COMPILER_WORKS)
+if(EIGEN_Fortran_COMPILER_WORKS)
get_filename_component(eigen_full_path_to_reference_to_reference_lapack "./reference/" ABSOLUTE)
if(EXISTS ${eigen_full_path_to_reference_to_reference_lapack})
@@ -358,7 +353,7 @@ reference/ctbcon.f reference/dormhr.f reference/sla_
)
endif()
-endif(CMAKE_Fortran_COMPILER_WORKS)
+endif(EIGEN_Fortran_COMPILER_WORKS)
add_library(eigen_lapack_static ${EigenLapack_SRCS})
add_library(eigen_lapack SHARED ${EigenLapack_SRCS})