From 7a96149c318478dafda282e0f372d749f370905f Mon Sep 17 00:00:00 2001 From: Turiiya Date: Sun, 28 Apr 2024 23:40:47 +0200 Subject: [PATCH 01/11] builder: use enum for cc --- vlib/v/builder/cc.v | 59 ++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index 854cbea8050186..c9e9f2d7a74971 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -94,18 +94,21 @@ fn (mut v Builder) show_cc(cmd string, response_file string, response_file_conte } } +enum CC { + tcc + gcc + icc + msvc + clang +} + struct CcompilerOptions { mut: guessed_compiler string shared_postfix string // .so, .dll // - // - debug_mode bool - is_cc_tcc bool - is_cc_gcc bool - is_cc_icc bool - is_cc_msvc bool - is_cc_clang bool + debug_mode bool + cc CC // env_cflags string // prepended *before* everything else env_ldflags string // appended *after* everything else @@ -189,17 +192,17 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { } } ccompiler_file_name := os.file_name(ccompiler) - ccoptions.is_cc_tcc = ccompiler_file_name.contains('tcc') || ccoptions.guessed_compiler == 'tcc' - ccoptions.is_cc_gcc = ccompiler_file_name.contains('gcc') || ccoptions.guessed_compiler == 'gcc' - ccoptions.is_cc_icc = ccompiler_file_name.contains('icc') || ccoptions.guessed_compiler == 'icc' - ccoptions.is_cc_msvc = ccompiler_file_name.contains('msvc') - || ccoptions.guessed_compiler == 'msvc' - ccoptions.is_cc_clang = ccompiler_file_name.contains('clang') - || ccoptions.guessed_compiler == 'clang' + ccoptions.cc = match true { + ccompiler_file_name.contains('tcc') || ccoptions.guessed_compiler == 'tcc' { .tcc } + ccompiler_file_name.contains('gcc') || ccoptions.guessed_compiler == 'gcc' { .gcc } + ccompiler_file_name.contains('clang') || ccoptions.guessed_compiler == 'clang' { .clang } + ccompiler_file_name.contains('msvc') || ccoptions.guessed_compiler == 'msvc' { .msvc } + ccompiler_file_name.contains('icc') || ccoptions.guessed_compiler == 'icc' { .icc } + else { panic('unknown ccompiler: ${ccompiler_file_name}') } + } // Add -fwrapv to handle UB overflows - if (ccoptions.is_cc_gcc || ccoptions.is_cc_clang || ccoptions.is_cc_tcc) - && v.pref.os in [.macos, .linux, .windows] { + if ccoptions.cc in [.gcc, .clang, .tcc] && v.pref.os in [.macos, .linux, .windows] { ccoptions.args << '-fwrapv' } @@ -208,7 +211,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { ccoptions.args << '-fpermissive' ccoptions.args << '-w' } - if ccoptions.is_cc_clang { + if ccoptions.cc == .clang { if ccoptions.debug_mode { debug_options = ['-g', '-O0'] } @@ -227,7 +230,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { '-Wno-int-to-void-pointer-cast', ] } - if ccoptions.is_cc_gcc { + if ccoptions.cc == .gcc { if ccoptions.debug_mode { debug_options = ['-g'] if user_darwin_version > 9 { @@ -236,7 +239,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { } optimization_options = ['-O3', '-flto'] } - if ccoptions.is_cc_icc { + if ccoptions.cc == .icc { if ccoptions.debug_mode { debug_options = ['-g'] if user_darwin_version > 9 { @@ -251,7 +254,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { } if v.pref.is_prod { // don't warn for vlib tests - if ccoptions.is_cc_tcc && !(v.parsed_files.len > 0 + if ccoptions.cc == .tcc && !(v.parsed_files.len > 0 && v.parsed_files.last().path.contains('vlib')) { eprintln('Note: tcc is not recommended for -prod builds') } @@ -298,7 +301,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { ccoptions.args << '-Wl,--no-entry' } if ccoptions.debug_mode && builder.current_os != 'windows' && v.pref.build_mode != .build_module { - if builder.current_os == 'macos' && !ccoptions.is_cc_tcc { + if ccoptions.cc != .tcc && builder.current_os == 'macos' { ccoptions.linker_flags << '-Wl,-export_dynamic' // clang for mac needs export_dynamic instead of -rdynamic } else { ccoptions.linker_flags << '-rdynamic' // needed for nicer symbolic backtraces @@ -306,7 +309,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { } if v.pref.os == .freebsd { // Needed for -usecache on FreeBSD 13, otherwise we get `ld: error: duplicate symbol: _const_math__bits__de_bruijn32` errors there - if !ccoptions.is_cc_tcc { + if ccoptions.cc != .tcc { ccoptions.linker_flags << '-Wl,--allow-multiple-definition' } else { // tcc needs this, otherwise it fails to compile the runetype.h system header with: @@ -318,7 +321,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { if ccompiler != 'msvc' && v.pref.os != .freebsd { ccoptions.wargs << '-Werror=implicit-function-declaration' } - if ccoptions.is_cc_tcc { + if ccoptions.cc == .tcc { // tcc 806b3f98 needs this flag too: ccoptions.wargs << '-Wno-write-strings' } @@ -333,7 +336,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { // macOS code can include objective C TODO remove once objective C is replaced with C if v.pref.os in [.macos, .ios] { - if !ccoptions.is_cc_tcc && !user_darwin_ppc && !v.pref.is_bare && ccompiler != 'musl-gcc' { + if ccoptions.cc != .tcc && !user_darwin_ppc && !v.pref.is_bare && ccompiler != 'musl-gcc' { ccoptions.source_args << '-x objective-c' } } @@ -378,14 +381,14 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { ccoptions.pre_args << others ccoptions.linker_flags << libs if v.pref.use_cache && v.pref.build_mode != .build_module { - if !ccoptions.is_cc_tcc { + if ccoptions.cc != .tcc { $if linux { ccoptions.linker_flags << '-Xlinker -z' ccoptions.linker_flags << '-Xlinker muldefs' } } } - if ccoptions.is_cc_tcc && 'no_backtrace' !in v.pref.compile_defines { + if ccoptions.cc == .tcc && 'no_backtrace' !in v.pref.compile_defines { ccoptions.post_args << '-bt25' } // Without these libs compilation will fail on Linux @@ -426,7 +429,7 @@ fn (v &Builder) all_args(ccoptions CcompilerOptions) []string { // /volatile:ms - there seems to be no equivalent, // normally msvc should use /volatile:iso // but it could have an impact on vinix if it is created with msvc. - if !ccoptions.is_cc_msvc { + if ccoptions.cc != .msvc { if v.pref.os != .wasm32_emscripten { all << '-Wl,-stack=16777216' } @@ -625,7 +628,7 @@ pub fn (mut v Builder) cc() { } } $if windows { - if v.ccoptions.is_cc_tcc { + if v.ccoptions.cc == .tcc { def_name := v.pref.out_name[0..v.pref.out_name.len - 4] v.pref.cleanup_files << '${def_name}.def' } From a8e62e3ec19e08985df99aa4d8034a7f0167d938 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Sun, 28 Apr 2024 23:41:04 +0200 Subject: [PATCH 02/11] fix setting cc on macos --- vlib/v/builder/cc.v | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index c9e9f2d7a74971..951ca44aff40fb 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -178,7 +178,8 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { } ccoptions.debug_mode = v.pref.is_debug ccoptions.guessed_compiler = v.pref.ccompiler - if ccoptions.guessed_compiler == 'cc' && v.pref.is_prod { + guess_compiler := $if macos { true } $else { v.pref.is_prod } + if ccoptions.guessed_compiler == 'cc' && guess_compiler { // deliberately guessing only for -prod builds for performance reasons ccversion := os.execute('cc --version') if ccversion.exit_code == 0 { From 9b5846653b5c9a2e80c6292e83cf0aa5d2d4d233 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Sun, 28 Apr 2024 23:46:58 +0200 Subject: [PATCH 03/11] fix vpath in sanitized run --- .github/workflows/sanitized_ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sanitized_ci.yml b/.github/workflows/sanitized_ci.yml index 19755d239070bb..f2b9209bbbb8c7 100644 --- a/.github/workflows/sanitized_ci.yml +++ b/.github/workflows/sanitized_ci.yml @@ -39,6 +39,7 @@ on: - 'vlib/v/markused/**.v' - 'vlib/v/preludes/**.v' - 'vlib/v/embed_file/**.v' + - '**/sanitized_ci.yml' pull_request: paths: - '!**' @@ -64,6 +65,7 @@ on: - 'vlib/v/markused/**.v' - 'vlib/v/preludes/**.v' - 'vlib/v/embed_file/**.v' + - '**/sanitized_ci.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} @@ -161,7 +163,7 @@ jobs: .\make.bat -msvc .\v.exe self - name: Ensure code is well formatted - run: v test-cleancode + run: ./v test-cleancode # - name: Install dependencies # run: | # .\v.exe setup-freetype From 1047fd60bbe39a6882312ce2719def14b3ebc982 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 29 Apr 2024 03:46:27 +0200 Subject: [PATCH 04/11] improve cc determination, always guess --- vlib/v/builder/cc.v | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index 951ca44aff40fb..5f89790a722d5a 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -178,28 +178,32 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { } ccoptions.debug_mode = v.pref.is_debug ccoptions.guessed_compiler = v.pref.ccompiler - guess_compiler := $if macos { true } $else { v.pref.is_prod } - if ccoptions.guessed_compiler == 'cc' && guess_compiler { - // deliberately guessing only for -prod builds for performance reasons - ccversion := os.execute('cc --version') - if ccversion.exit_code == 0 { - if ccversion.output.contains('This is free software;') - && ccversion.output.contains('Free Software Foundation, Inc.') { - ccoptions.guessed_compiler = 'gcc' - } - if ccversion.output.contains('clang version ') { - ccoptions.guessed_compiler = 'clang' + if ccoptions.guessed_compiler == 'cc' { + if cc_ver := os.execute_opt('cc --version') { + if gcc_ver := os.execute_opt('gcc --version') { + if cc_ver.output == gcc_ver.output { + ccoptions.cc = .gcc + } + } else if clang_ver := os.execute_opt('clang --version') { + if cc_ver.output == clang_ver.output { + ccoptions.cc = .clang + } + } else if gpp_ver := os.execute_opt('g++ --version') { + if cc_ver.output == gpp_ver.output { + ccoptions.cc = .gcc + } } } - } - ccompiler_file_name := os.file_name(ccompiler) - ccoptions.cc = match true { - ccompiler_file_name.contains('tcc') || ccoptions.guessed_compiler == 'tcc' { .tcc } - ccompiler_file_name.contains('gcc') || ccoptions.guessed_compiler == 'gcc' { .gcc } - ccompiler_file_name.contains('clang') || ccoptions.guessed_compiler == 'clang' { .clang } - ccompiler_file_name.contains('msvc') || ccoptions.guessed_compiler == 'msvc' { .msvc } - ccompiler_file_name.contains('icc') || ccoptions.guessed_compiler == 'icc' { .icc } - else { panic('unknown ccompiler: ${ccompiler_file_name}') } + } else { + ccompiler_file_name := os.file_name(ccompiler) + ccoptions.cc = match true { + ccompiler_file_name.contains('tcc') || ccoptions.guessed_compiler == 'tcc' { .tcc } + ccompiler_file_name.contains('gcc') || ccoptions.guessed_compiler == 'gcc' { .gcc } + ccompiler_file_name.contains('clang') || ccoptions.guessed_compiler == 'clang' { .clang } + ccompiler_file_name.contains('msvc') || ccoptions.guessed_compiler == 'msvc' { .msvc } + ccompiler_file_name.contains('icc') || ccoptions.guessed_compiler == 'icc' { .icc } + else { panic('unknown ccompiler: ${ccompiler_file_name}') } + } } // Add -fwrapv to handle UB overflows From 9e8b7cbf3788006e39c62ca7fc13f8664a916e02 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 29 Apr 2024 04:11:11 +0200 Subject: [PATCH 05/11] improve info on unknown compiler (for now keep panic for CI, add .unknown to enum later) --- vlib/v/builder/cc.v | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index 5f89790a722d5a..50a6a5c9f30192 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -192,17 +192,21 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { if cc_ver.output == gpp_ver.output { ccoptions.cc = .gcc } + } else { + panic('unknown C compiler') } } } else { - ccompiler_file_name := os.file_name(ccompiler) + cc_file_name := os.file_name(ccompiler) ccoptions.cc = match true { - ccompiler_file_name.contains('tcc') || ccoptions.guessed_compiler == 'tcc' { .tcc } - ccompiler_file_name.contains('gcc') || ccoptions.guessed_compiler == 'gcc' { .gcc } - ccompiler_file_name.contains('clang') || ccoptions.guessed_compiler == 'clang' { .clang } - ccompiler_file_name.contains('msvc') || ccoptions.guessed_compiler == 'msvc' { .msvc } - ccompiler_file_name.contains('icc') || ccoptions.guessed_compiler == 'icc' { .icc } - else { panic('unknown ccompiler: ${ccompiler_file_name}') } + // vfmt off + cc_file_name.contains('tcc') || ccoptions.guessed_compiler == 'tcc' { .tcc } + cc_file_name.contains('gcc') || cc_file_name.contains('g++') || ccoptions.guessed_compiler == 'gcc' { .gcc } + cc_file_name.contains('clang') || ccoptions.guessed_compiler == 'clang' { .clang } + cc_file_name.contains('msvc') || ccoptions.guessed_compiler == 'msvc' { .msvc } + cc_file_name.contains('icc') || ccoptions.guessed_compiler == 'icc' { .icc } + else { panic('unknown C compiler `${cc_file_name}`') } + // vfmt on } } From 427976129ef3f7c43257960041ec540a6407d2bc Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 29 Apr 2024 04:49:16 +0200 Subject: [PATCH 06/11] further improve when compiler is `cc` --- vlib/v/builder/cc.v | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index 50a6a5c9f30192..fbbebf2e5f7a82 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -180,20 +180,14 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { ccoptions.guessed_compiler = v.pref.ccompiler if ccoptions.guessed_compiler == 'cc' { if cc_ver := os.execute_opt('cc --version') { - if gcc_ver := os.execute_opt('gcc --version') { - if cc_ver.output == gcc_ver.output { - ccoptions.cc = .gcc - } - } else if clang_ver := os.execute_opt('clang --version') { - if cc_ver.output == clang_ver.output { - ccoptions.cc = .clang - } - } else if gpp_ver := os.execute_opt('g++ --version') { - if cc_ver.output == gpp_ver.output { - ccoptions.cc = .gcc - } + if cc_ver.output.contains('Free Software Foundation') + && cc_ver.output.contains('This is free software') { + // Also covers `g++-9` and `g++-11`. + ccoptions.cc = .gcc + } else if cc_ver.output.contains('clang version ') { + ccoptions.cc = .clang } else { - panic('unknown C compiler') + panic('failed to detect C compiler from version info `${cc_ver.output}`') } } } else { From 1a16b509ccdde8f711f4331c30fe346ff502f262 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 29 Apr 2024 05:41:07 +0200 Subject: [PATCH 07/11] cleanup (still panic if compiler would be unknown) --- vlib/v/builder/cc.v | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index fbbebf2e5f7a82..8276c090033eeb 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -180,14 +180,11 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { ccoptions.guessed_compiler = v.pref.ccompiler if ccoptions.guessed_compiler == 'cc' { if cc_ver := os.execute_opt('cc --version') { - if cc_ver.output.contains('Free Software Foundation') - && cc_ver.output.contains('This is free software') { - // Also covers `g++-9` and `g++-11`. - ccoptions.cc = .gcc - } else if cc_ver.output.contains('clang version ') { - ccoptions.cc = .clang - } else { - panic('failed to detect C compiler from version info `${cc_ver.output}`') + ccoptions.cc = match true { + // Also covers `g++`, `g++-9`, `g++-11` etc. + cc_ver.output.replace('\n', '').contains('Free Software Foundation, Inc.This is free software;') { .gcc } + cc_ver.output.contains('clang version ') { .clang } + else { panic('failed to detect C compiler from version info `${cc_ver.output}`') } } } } else { From e771063ba8c6f52ef6784b0da0dbf5f11e1d08d4 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 29 Apr 2024 05:49:31 +0200 Subject: [PATCH 08/11] add panic for edge case when ccompiler == `cc` and failing to execute `cc --version` to guess compiler --- vlib/v/builder/cc.v | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index 8276c090033eeb..486a501d49f8d3 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -186,6 +186,8 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { cc_ver.output.contains('clang version ') { .clang } else { panic('failed to detect C compiler from version info `${cc_ver.output}`') } } + } else { + panic('unknown C compiler') } } else { cc_file_name := os.file_name(ccompiler) From 863af9bf00d88e88c217ca16f5fd09e90c1a74df Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Mon, 29 Apr 2024 14:02:27 +0300 Subject: [PATCH 09/11] Update .github/workflows/sanitized_ci.yml --- .github/workflows/sanitized_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sanitized_ci.yml b/.github/workflows/sanitized_ci.yml index f2b9209bbbb8c7..427240298cfe71 100644 --- a/.github/workflows/sanitized_ci.yml +++ b/.github/workflows/sanitized_ci.yml @@ -163,7 +163,7 @@ jobs: .\make.bat -msvc .\v.exe self - name: Ensure code is well formatted - run: ./v test-cleancode + run: .\v.exe test-cleancode # - name: Install dependencies # run: | # .\v.exe setup-freetype From bce316561fafe7d9e3be05c14eed5b3a862a2d2b Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 29 Apr 2024 13:36:40 +0200 Subject: [PATCH 10/11] remove panics on unknown C compiler --- vlib/v/builder/cc.v | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index 486a501d49f8d3..e5d33f7b95f306 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -100,6 +100,7 @@ enum CC { icc msvc clang + unknown } struct CcompilerOptions { @@ -180,11 +181,17 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { ccoptions.guessed_compiler = v.pref.ccompiler if ccoptions.guessed_compiler == 'cc' { if cc_ver := os.execute_opt('cc --version') { - ccoptions.cc = match true { + if cc_ver.output.replace('\n', '').contains('Free Software Foundation, Inc.This is free software;') { // Also covers `g++`, `g++-9`, `g++-11` etc. - cc_ver.output.replace('\n', '').contains('Free Software Foundation, Inc.This is free software;') { .gcc } - cc_ver.output.contains('clang version ') { .clang } - else { panic('failed to detect C compiler from version info `${cc_ver.output}`') } + ccoptions.cc = .gcc + } else if cc_ver.output.contains('clang version ') { + ccoptions.cc = .clang + } else { + if v.pref.is_verbose { + eprintln('failed to detect C compiler from version info `${cc_ver.output}`') + } + eprintln('Compilation with unkown C compiler') + ccoptions.cc = .unknown } } else { panic('unknown C compiler') @@ -198,9 +205,12 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { cc_file_name.contains('clang') || ccoptions.guessed_compiler == 'clang' { .clang } cc_file_name.contains('msvc') || ccoptions.guessed_compiler == 'msvc' { .msvc } cc_file_name.contains('icc') || ccoptions.guessed_compiler == 'icc' { .icc } - else { panic('unknown C compiler `${cc_file_name}`') } + else { .unknown } // vfmt on } + if ccoptions.cc == .unknown { + eprintln('Compilation with unkown C compiler `${cc_file_name}`') + } } // Add -fwrapv to handle UB overflows From ed619f887d91af1d9689e864c802c3e64f8c8547 Mon Sep 17 00:00:00 2001 From: Turiiya Date: Mon, 29 Apr 2024 13:38:25 +0200 Subject: [PATCH 11/11] fix typos --- vlib/v/builder/cc.v | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index e5d33f7b95f306..803fcf6c400917 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -190,7 +190,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { if v.pref.is_verbose { eprintln('failed to detect C compiler from version info `${cc_ver.output}`') } - eprintln('Compilation with unkown C compiler') + eprintln('Compilation with unknown C compiler') ccoptions.cc = .unknown } } else { @@ -209,7 +209,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) { // vfmt on } if ccoptions.cc == .unknown { - eprintln('Compilation with unkown C compiler `${cc_file_name}`') + eprintln('Compilation with unknown C compiler `${cc_file_name}`') } }