[cmake-developers] Depends information in buildsystem files

Stephen Kelly steveire at gmail.com
Thu Feb 7 11:42:49 EST 2013


Brad King wrote:
> The full solution is to refactor things enough that a new kind of
> try_compile can be implemented.  It should push the configuration
> process state on a stack, run more CMake code in the isolated state
> to add some targets, and then generate the build system for them
> directly out of the temporary configuration state.  Finally the
> configuration stack would be popped back to the try_compile call and
> the result variable would be set.  This would allow the full state
> of the main project to be used for generation of a try_compile,
> including imported targets.

Are you sure? It seems to me it would be much easier and less duplicative to 
add a way to specify TARGETS in try_compile, and in cmCoreTryCompile, 
generate the IMPORTED targets there with whatever properties they have.


 cmake_minimum_required(VERSION 2.8)

 project(iface)

 find_package(Qt4 REQUIRED)

 include(CMakeParseArguments)

 macro(CHECK_CXX_SOURCE_COMPILES_COPY SOURCE)

   set(oneValueArgs VAR)
   set(multiValueArgs TARGETS)
   cmake_parse_arguments(_CSC "${options}" "${oneValueArgs}" 
"${multiValueArgs}" ${ARGN} )

   if(NOT "${_CSC_VAR}" MATCHES "^${_CSC_VAR}$")
     return()
   endif()

   file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx"
     "${SOURCE}\n")

   message(STATUS "Performing Test ${_CSC_VAR}")
   try_compile(${_CSC_VAR}
     ${CMAKE_BINARY_DIR}
     "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx"

     # NOTE: This is new!
     TARGETS ${_CSC_TARGETS}
     OUTPUT_VARIABLE OUTPUT)

   foreach(_regex ${_FAIL_REGEX})
     if("${OUTPUT}" MATCHES "${_regex}")
       set(${VAR} 0)
     endif()
   endforeach()

   if(${_CSC_VAR})
     set(${_CSC_VAR} 1 CACHE INTERNAL "Test ${_CSC_VAR}")
     message(STATUS "Performing Test ${_CSC_VAR} - Success")
     file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
       "Performing C++ SOURCE FILE Test ${_CSC_VAR} succeded with the 
following output:\n"
       "${OUTPUT}\n"
       "Source file was:\n${SOURCE}\n")
   else()
     message(STATUS "Performing Test ${_CSC_VAR} - Failed")
     set(${_CSC_VAR} "" CACHE INTERNAL "Test ${_CSC_VAR}")
     file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
       "Performing C++ SOURCE FILE Test ${_CSC_VAR} failed with the 
following output:\n"
       "${OUTPUT}\n"
       "Source file was:\n${SOURCE}\n")
   endif()
 endmacro()


 CHECK_CXX_SOURCE_COMPILES_COPY(
     "#include <QApplication>

 #ifndef QT_GUI_LIB
 #error Expected QT_GUI_LIB
 #endif
 #ifndef QT_CORE_LIB
 #error Expected QT_CORE_LIB
 #endif

 int main(int argc, char **argv)
 { QApplication app(argc, argv); app.instance(); return 0; }
 "
   VAR
     TC_RESULT
   TARGETS
     Qt4::QtGui Qt4::QtCore
 )

 message("TC_RESULT : ${TC_RESULT}")


I pushed the try_compile_targets topic to my clone as a proof of concept, 
but it would likely need to be reworked from scratch (eg a 
cmExportFileGenerator subclass which can re-export imported targets). 

Any reason not to do it that way?

Thanks,

Steve.






More information about the cmake-developers mailing list