1# cmake/modules/language_support.cmake
2#
3# Temporary additional general language support is contained within this
4# file.
5
6# This additional function definition is needed to provide a workaround for
7# CMake bug 9220.
8
9# On debian testing (cmake 2.6.2), I get return code zero when calling
10# cmake the first time, but cmake crashes when running a second time
11# as follows:
12#
13#  -- The Fortran compiler identification is unknown
14#  CMake Error at /usr/share/cmake-2.6/Modules/CMakeFortranInformation.cmake:7 (GET_FILENAME_COMPONENT):
15#    get_filename_component called with incorrect number of arguments
16#  Call Stack (most recent call first):
17#    CMakeLists.txt:3 (enable_language)
18#
19# My workaround is to invoke cmake twice.  If both return codes are zero,
20# it is safe to invoke ENABLE_LANGUAGE(Fortran OPTIONAL)
21
22function(workaround_9220 language language_works)
23  #message("DEBUG: language = ${language}")
24  set(text
25    "project(test NONE)
26    cmake_minimum_required(VERSION 2.8.0)
27    set (CMAKE_Fortran_FLAGS \"${CMAKE_Fortran_FLAGS}\")
28    set (CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS}\")
29    enable_language(${language} OPTIONAL)
30  ")
31  file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/language_tests/${language})
32  file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language})
33  file(WRITE ${CMAKE_BINARY_DIR}/language_tests/${language}/CMakeLists.txt
34    ${text})
35  execute_process(
36    COMMAND ${CMAKE_COMMAND} . -G "${CMAKE_GENERATOR}"
37    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}
38    RESULT_VARIABLE return_code
39    OUTPUT_QUIET
40    ERROR_QUIET
41    )
42
43  if(return_code EQUAL 0)
44    # Second run
45    execute_process (
46      COMMAND ${CMAKE_COMMAND} .
47      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}
48      RESULT_VARIABLE return_code
49      OUTPUT_QUIET
50      ERROR_QUIET
51      )
52    if(return_code EQUAL 0)
53      set(${language_works} ON PARENT_SCOPE)
54    else(return_code EQUAL 0)
55      set(${language_works} OFF PARENT_SCOPE)
56    endif(return_code EQUAL 0)
57  else(return_code EQUAL 0)
58    set(${language_works} OFF PARENT_SCOPE)
59  endif(return_code EQUAL 0)
60endfunction(workaround_9220)
61
62# Temporary tests of the above function.
63#workaround_9220(CXX CXX_language_works)
64#message("CXX_language_works = ${CXX_language_works}")
65#workaround_9220(CXXp CXXp_language_works)
66#message("CXXp_language_works = ${CXXp_language_works}")
67