Browse Source

Add support for Bruce C Compiler (BCC)

Revise C compiler detection code to be K&R compatible.
Paweł Stankowski 9 years ago
parent
commit
53c0dc2dd2

+ 4 - 0
Help/release/dev/add-bruce-c.rst

@@ -0,0 +1,4 @@
+add-bruce-c
+-----------
+
+* Support was added for the Bruce C Compiler with compiler id ``Bruce``.

+ 1 - 0
Help/variable/CMAKE_LANG_COMPILER_ID.rst

@@ -12,6 +12,7 @@ include:
   ADSP = Analog VisualDSP++ (analog.com)
   AppleClang = Apple Clang (apple.com)
   ARMCC = ARM Compiler (arm.com)
+  Bruce = Bruce C Compiler
   CCur = Concurrent Fortran (ccur.com)
   Clang = LLVM Clang (clang.llvm.org)
   Cray = Cray Compiler (cray.com)

+ 16 - 6
Modules/CMakeCCompilerId.c.in

@@ -5,6 +5,11 @@
 #if defined(__18CXX)
 # define ID_VOID_MAIN
 #endif
+#if defined(__CLASSIC_C__)
+/* cv-qualifiers did not exist in K&R C */
+# define const
+# define volatile
+#endif
 
 @CMAKE_C_COMPILER_ID_CONTENT@
 
@@ -28,23 +33,28 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
 @CMAKE_C_COMPILER_ID_PLATFORM_CONTENT@
 @CMAKE_C_COMPILER_ID_ERROR_FOR_TEST@
 
-const char* info_language_dialect_default = "INFO" ":" "dialect_default["
-#if !defined(__STDC_VERSION__)
-  "90"
+#if !defined(__STDC__)
+# define C_DIALECT
 #elif __STDC_VERSION__ >= 201000L
-  "11"
+# define C_DIALECT "11"
 #elif __STDC_VERSION__ >= 199901L
-  "99"
+# define C_DIALECT "99"
 #else
+# define C_DIALECT "90"
 #endif
-"]";
+const char* info_language_dialect_default =
+  "INFO" ":" "dialect_default[" C_DIALECT "]";
 
 /*--------------------------------------------------------------------------*/
 
 #ifdef ID_VOID_MAIN
 void main() {}
 #else
+# if defined(__CLASSIC_C__)
+int main(argc, argv) int argc; char *argv[];
+# else
 int main(int argc, char* argv[])
+# endif
 {
   int require = 0;
   require += info_compiler[argc];

+ 1 - 0
Modules/CMakeCompilerIdDetection.cmake

@@ -79,6 +79,7 @@ function(compiler_id_detection outvar lang)
     if (lang STREQUAL C)
       list(APPEND ordered_compilers
         TinyCC
+        Bruce
       )
     endif()
     list(APPEND ordered_compilers

+ 3 - 0
Modules/CMakeDetermineCCompiler.cmake

@@ -87,6 +87,9 @@ else()
 
     # Try enabling ANSI mode on HP.
     "-Aa"
+
+    # Try compiling K&R-compatible code (needed by Bruce C Compiler).
+    "-D__CLASSIC_C__"
     )
 endif()
 

+ 3 - 3
Modules/CMakePlatformId.h.in

@@ -91,11 +91,11 @@
 #  define PLATFORM_ID "Windows3x"
 
 # else /* unknown platform */
-#  define PLATFORM_ID ""
+#  define PLATFORM_ID
 # endif
 
 #else /* unknown platform */
-# define PLATFORM_ID ""
+# define PLATFORM_ID
 
 #endif
 
@@ -145,7 +145,7 @@
 # endif
 
 #else
-#  define ARCHITECTURE_ID ""
+#  define ARCHITECTURE_ID
 #endif
 
 /* Convert integer to decimal digit literals.  */

+ 1 - 0
Modules/Compiler/Bruce-C-DetermineCompiler.cmake

@@ -0,0 +1 @@
+set(_compiler_id_pp_test "defined(__BCC__)")

+ 7 - 0
Modules/Compiler/Bruce-C.cmake

@@ -0,0 +1,7 @@
+# Bruce C Compiler ignores "-g" flag and optimization cannot be
+# enabled here (it is implemented only for 8086 target).
+set (CMAKE_C_FLAGS_INIT "-D__CLASSIC_C__")
+set (CMAKE_C_FLAGS_DEBUG_INIT "-g")
+set (CMAKE_C_FLAGS_MINSIZEREL_INIT "-DNDEBUG")
+set (CMAKE_C_FLAGS_RELEASE_INIT "-DNDEBUG")
+set (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-g -DNDEBUG")