Skip to content
  • Brad King's avatar
    Prefer generic system compilers by default for C, C++, and Fortran · 7e58e5bb
    Brad King authored
    Teach CMake to prefer the system default compiler automatically when no
    compiler is specified.  By default use "cc" for C, "CC" for C++, and
    "f95" for Fortran.  Load a new Platform/<os>-<lang>.cmake module to
    allow each platform to specify for each language its system compiler
    name(s) and/or exclude certain names.
    
    Create Platform/(CYGWIN|Darwin|Linux|Windows)-CXX.cmake modules to
    specify "c++" as the system C++ compiler name for these platforms.  On
    systems that use case-insensitive filesystems exclude C++ compiler names
    that are distinguished from C compiler names only by case.
    
    This will change the default compiler selection for existing build
    scripts that do not specify a compiler when run on machines with
    separate system and GNU compilers both installed in the PATH.  We do not
    make this change in default behavior lightly.  However:
    
    (1) If a given build really needs specific compilers one should specify
        them explicitly e.g. by setting CC, CXX, and FC in the environment.
    
    (2) The motivating case is to prefer the system Clang on newer OS X
        systems over the older GNU compilers typically also installed.  On
        such systems the names "cc" and "c++" link to Clang.  This is the
        first platform known to CMake on which "c++" is not a GNU compiler.
        The old behavior selected "gcc" for C and "c++" C++ and therefore
        chooses GNU for C and Clang for C++ by default.  The new behavior
        selects GNU or Clang consistently for both languages on older or
        newer OS X systems, respectively.
    
    (3) Other than the motivating OS X case the conditions under which the
        behavior changes do not tend to exist in default OS installations.
        They typically occur only on non-GNU systems with manually-installed
        GNU compilers.
    
    (4) The consequences of the new behavior are not dire.  At worst the
        project fails to compile with the system compiler when it previously
        worked with the non-system GNU compiler.  Such failure is easy to
        work around (see #1).
    
    In short this change creates a more sensible default behavior everywhere
    and fixes poor default behavior on a widely-used platform at the cost of
    a modest change in behavior in less-common conditions.
    7e58e5bb