Split targets mixing .c and .cc sources.
The Bazel build format doesn't support having separate
lists of compilation flags for C and C++; it just has a single
copts list for cc_library:
https://bazel.build/versions/master/docs/be/c-cpp.html#cc_binary.copts
This makes it hard to convert our GN targets to Bazel when there are
compiler warnings that aren't supported for C (like -Woverloaded-virtual
being added in bugs.webrtc.org/6653).
The solution for this is to move all .c files to their own targets
and remove C++-only compiler flags during conversion.
New targets:
//webrtc/common_audio:common_audio_c
//webrtc/common_audio:common_audio_neon_c
//webrtc/modules/audio_coding:g711_c
//webrtc/modules/audio_coding:g722_c
//webrtc/modules/audio_coding:ilbc_c
//webrtc/modules/audio_coding:isac_c
//webrtc/modules/audio_coding:isac_fix_c
//webrtc/modules/audio_coding:isac_test_util
//webrtc/modules/audio_coding:pcm16b_c
//webrtc/modules/audio_coding:webrtc_opusj_c
//webrtc/modules/audio_device:mac_portaudio
//webrtc/modules/audio_procssing:audio_processing_c
//webrtc/modules/audio_procssing:audio_processing_neon_c
This CL also adds a PRESUBMIT.py check that will throw an error
if targets are mixing .c and .cc files, to preven this from regressing.
BUG=webrtc:6653
NOTRY=True
Review-Url: https://codereview.webrtc.org/2550563003
Cr-Commit-Position: refs/heads/master@{#15433}
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index a973ffe..86d5c21 100755
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -6,6 +6,7 @@
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
+import json
import os
import re
import sys
@@ -291,6 +292,35 @@
items=violating_gn_files)]
return []
+def _CheckNoMixingCAndCCSources(input_api, gn_files, output_api):
+ # Disallow mixing .c and .cc source files in the same target.
+ source_pattern = input_api.re.compile(r' +sources \+?= \[(.*?)\]',
+ re.MULTILINE | re.DOTALL)
+ file_pattern = input_api.re.compile(r'"(.*)"')
+ violating_gn_files = dict()
+ for gn_file in gn_files:
+ contents = input_api.ReadFile(gn_file)
+ for source_block_match in source_pattern.finditer(contents):
+ c_files = []
+ cc_files = []
+ for file_list_match in file_pattern.finditer(source_block_match.group(1)):
+ source_file = file_list_match.group(1)
+ if source_file.endswith('.c'):
+ c_files.append(source_file)
+ if source_file.endswith('.cc'):
+ cc_files.append(source_file)
+ if c_files and cc_files:
+ violating_gn_files[gn_file.LocalPath()] = sorted(c_files + cc_files)
+ if violating_gn_files:
+ return [output_api.PresubmitError(
+ 'GN targets cannot mix .cc and .c source files. Please create a '
+ 'separate target for each collection of sources.\n'
+ 'Mixed sources: \n'
+ '%s\n'
+ 'Violating GN files:' % json.dumps(violating_gn_files, indent=2),
+ items=violating_gn_files.keys())]
+ return []
+
def _CheckGnChanges(input_api, output_api):
source_file_filter = lambda x: input_api.FilterSourceFile(
x, white_list=(r'.+\.(gn|gni)$',))
@@ -304,6 +334,7 @@
if gn_files:
result.extend(_CheckNoRtcBaseDeps(input_api, gn_files, output_api))
result.extend(_CheckNoSourcesAbove(input_api, gn_files, output_api))
+ result.extend(_CheckNoMixingCAndCCSources(input_api, gn_files, output_api))
return result
def _CheckUnwantedDependencies(input_api, output_api):