[cmake-developers] Compiler features/extensions remaining/future issues

Stephen Kelly steveire at gmail.com
Fri Jun 13 05:19:21 EDT 2014


Stephen Kelly wrote:

> Here is a dump of some notes I have accumulated regarding compile
> features.
> 

Just a few more:

10) WriteCompilerDetectionHeader content size

Already, with only two compilers supported, the header generated by 
WriteCompilerDetectionHeader is quite large when generating for all 
features. 

If that is a problem (Is it?), then a solution may be to generate something 
like:

 #if Foo_COMPILER_IS_GNU
 #include "foo_compiler_detection_gnu.hpp"
 #elif Foo_COMPILER_IS_Clang
 #include "foo_compiler_detection_clang.hpp"
 #endif

However, that would mean requiring the user to install multiple files rather 
than just one. So, it might make sense to add a new signature

 write_compiler_detection_header(
   DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/compiler_detection"
   FILE_SUFFIX "hpp"
   PREFIX Foo
   COMPILERS GNU Clang AppleClang MSVC Intel XL Cray HP SunPro
   FEATURES
     ${cxx_known_features}
 )

so users can do

 install((DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/compiler_detection/"
   DESTINATION include
 )

There are still use-cases for the single-file signature. For example, for a
project composed of multiple libraries (like Boost or KF5), each individual
library may care about only 2 or 3 compile features and each would generate
a header for only those that it needs. This doesn't actually arise for KF5
because compile feature detection is provided by Qt. For Boost, each library
depends on the Boost.Config library, so wouldn't use this either. But I 
think keeping the use-case still makes sense.


11) WriteCompilerDetectionHeader vs GenerateExportHeader

Related to the 'universal interface for features' issue, it would be 
possible to define features such as cmake_c{,xx}_hidden_visibility to 
generate content similar to what GenerateExportHeader creates. That would 
make GenerateExportHeader obsolete for compilers supported by 
WriteCompilerDetectionHeader and the <LANG>_VISIBILITY_PRESET and 
VISIBILITY_INLINES_HIDDEN target properties.

This would require a new signature like

 write_compiler_detection_header(
   FILE mytarget_compiler_detection.h
   TARGET mytarget
   COMPILERS GNU Clang
   FEATURES
     cmake_cxx_hidden_visibility
     cxx_attribute_deprecated
 )

and

 write_compiler_detection_header(
   DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/compiler_detection"
   TARGET mytarget
   COMPILERS GNU Clang
   FEATURES
     cmake_cxx_hidden_visibility
     cxx_attribute_deprecated
 )

The <target> is needed in order to know what the value of the DEFINE_SYMBOL 
target property is.


12) Platform-specific defines

We could consider adding defines such as PLATFORM_IS_UNIX, 
PLATFORM_IS_WINDOWS etc, which CMake already knows how to detect. There are 
other things which would be possible to detect too, such as architecture, OS 
etc.

This is what Boost.Predef offers, but possibly not with the same names as
CMake (I didn't check).

 https://github.com/boostorg/predef/tree/master/include/boost/predef


Thanks,

Steve.





More information about the cmake-developers mailing list