Merge "Record module type statistics"
diff --git a/core/Makefile b/core/Makefile
index 7b52193..7082f5a 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -1621,10 +1621,9 @@
$(HOST_LIBRARY_PATH)/libconscrypt_openjdk_jni$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libbrillo$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libbrillo-stream$(HOST_SHLIB_SUFFIX) \
- $(HOST_LIBRARY_PATH)/libbrillo-http$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libchrome$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libcurl-host$(HOST_SHLIB_SUFFIX) \
- $(HOST_LIBRARY_PATH)/libevent$(HOST_SHLIB_SUFFIX) \
+ $(HOST_LIBRARY_PATH)/libevent-host$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libprotobuf-cpp-lite$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libssl-host$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libz-host$(HOST_SHLIB_SUFFIX) \
diff --git a/core/binary.mk b/core/binary.mk
index 41520c2..85d084f 100644
--- a/core/binary.mk
+++ b/core/binary.mk
@@ -70,6 +70,9 @@
$(error $(LOCAL_PATH): LOCAL_SDK_VERSION cannot be used in host module)
endif
+ # Make sure we've built the NDK.
+ my_additional_dependencies += ndk
+
# mips32r6 is not supported by the NDK. No released NDK contains these
# libraries, but the r10 in prebuilts/ndk had a local hack to add them :(
#
@@ -81,9 +84,31 @@
endif
endif
- my_ndk_source_root := $(HISTORICAL_NDK_VERSIONS_ROOT)/$(LOCAL_NDK_VERSION)/sources
- my_ndk_sysroot := $(HISTORICAL_NDK_VERSIONS_ROOT)/$(LOCAL_NDK_VERSION)/platforms/android-$(LOCAL_SDK_VERSION)/arch-$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)
- my_ndk_sysroot_include := $(my_ndk_sysroot)/usr/include
+ my_arch := $(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)
+ ifneq (,$(filter arm64 mips64 x86_64,$(my_arch)))
+ my_min_sdk_version := 21
+ else
+ my_min_sdk_version := 9
+ endif
+
+ # Historically we've just set up a bunch of symlinks in prebuilts/ndk to map
+ # missing API levels to existing ones where necessary, but we're not doing
+ # that for the generated libraries. Clip the API level to the minimum where
+ # appropriate.
+ my_ndk_api := \
+ $(shell if [ $(LOCAL_SDK_VERSION) -lt $(my_min_sdk_version) ]; then \
+ echo $(my_min_sdk_version); else echo $(LOCAL_SDK_VERSION); fi)
+
+ my_ndk_source_root := \
+ $(HISTORICAL_NDK_VERSIONS_ROOT)/$(LOCAL_NDK_VERSION)/sources
+ my_ndk_sysroot := \
+ $(HISTORICAL_NDK_VERSIONS_ROOT)/$(LOCAL_NDK_VERSION)/platforms/android-$(my_ndk_api)/arch-$(my_arch)
+ my_built_ndk := $(SOONG_OUT_DIR)/ndk
+ my_ndk_triple := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_TRIPLE)
+ my_ndk_sysroot_include := \
+ $(my_built_ndk)/sysroot/usr/include \
+ $(my_built_ndk)/sysroot/usr/include/$(my_ndk_triple) \
+ $(my_ndk_sysroot)/usr/include \
# x86_64 and and mips64 are both multilib toolchains, so their libraries are
# installed in /usr/lib64. Aarch64, on the other hand, is not a multilib
@@ -92,14 +117,19 @@
# Mips32r6 is yet another variation, with libraries installed in libr6.
#
# For the rest, the libraries are installed simply to /usr/lib.
- ifneq (,$(filter x86_64 mips64,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)))
- my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/lib64
+ ifneq (,$(filter x86_64 mips64,$(my_arch)))
+ my_ndk_libdir_name := lib64
else ifeq (mips32r6,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH_VARIANT))
- my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/libr6
+ my_ndk_libdir_name := libr6
else
- my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/lib
+ my_ndk_libdir_name := lib
endif
+ my_ndk_platform_dir := \
+ $(my_built_ndk)/platforms/android-$(my_ndk_api)/arch-$(my_arch)
+ my_built_ndk_libs := $(my_ndk_platform_dir)/usr/$(my_ndk_libdir_name)
+ my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/$(my_ndk_libdir_name)
+
# The bionic linker now has support for packed relocations and gnu style
# hashes (which are much faster!), but shipping to older devices requires
# the old style hash. Fortunately, we can build with both and it'll work
@@ -180,6 +210,11 @@
endif
endif
endif
+
+ my_generated_ndk_shared_libraries := \
+ $(filter $(NDK_MIGRATED_LIBS),$(my_system_shared_libraries))
+ my_system_shared_libraries := \
+ $(filter-out $(NDK_MIGRATED_LIBS),$(my_system_shared_libraries))
endif
# MinGW spits out warnings about -fPIC even for -fpie?!) being ignored because
@@ -1365,7 +1400,14 @@
$(addprefix $(my_ndk_sysroot_lib)/, \
$(addsuffix $(so_suffix), $(my_system_shared_libraries)))
-built_shared_libraries += $(my_system_shared_libraries_fullpath)
+my_built_ndk_shared_libraries_fullpath := \
+ $(addprefix $(my_built_ndk_libs)/,\
+ $(addsuffix $(so_suffix),$(my_generated_ndk_shared_libraries)))
+
+built_shared_libraries += \
+ $(my_built_ndk_shared_libraries_fullpath) \
+ $(my_system_shared_libraries_fullpath) \
+
else
built_shared_libraries := \
$(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
diff --git a/core/clang/tidy.mk b/core/clang/tidy.mk
index 35871f0..d50b43d 100644
--- a/core/clang/tidy.mk
+++ b/core/clang/tidy.mk
@@ -15,10 +15,12 @@
#
# Most Android source files are not clang-tidy clean yet.
-# Global tidy checks include only google* and misc-macro-parentheses,
-# but not google-readability* or google-runtime-references.
+# Global tidy checks include only google*, performance*,
+# and misc-macro-parentheses, but not google-readability*
+# or google-runtime-references.
DEFAULT_GLOBAL_TIDY_CHECKS := \
- -*,google*,-google-readability*,-google-runtime-references,misc-macro-parentheses
+ -*,google*,performance*,misc-macro-parentheses \
+ ,-google-readability*,-google-runtime-references
# Disable style rules usually not followed by external projects.
# Every word in DEFAULT_LOCAL_TIDY_CHECKS list has the following format:
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index f1a9592..6121c45 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -199,6 +199,7 @@
# to avoid installing the presigned apks with classes.dex unstripped.
LOCAL_REPLACE_PREBUILT_APK_INSTALLED:=
LOCAL_NDK_VERSION:=current
+LOCAL_COPY_TO_INTERMEDIATE_LIBRARIES:=
LOCAL_LOGTAGS_FILES:=
LOCAL_RECORDED_MODULE_TYPE:=
diff --git a/core/definitions.mk b/core/definitions.mk
index 36d8080..53a6fcd 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -1692,7 +1692,7 @@
$(PRIVATE_TARGET_LIBGCC) \
$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
$(PRIVATE_LDFLAGS) \
- $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
+ $(PRIVATE_ALL_SHARED_LIBRARIES) \
-o $@ \
$(PRIVATE_TARGET_CRTEND_SO_O) \
$(PRIVATE_LDLIBS)
@@ -1780,7 +1780,7 @@
$(PRIVATE_TARGET_LIBGCC) \
$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
$(PRIVATE_LDFLAGS) \
- $(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
+ $(PRIVATE_ALL_SHARED_LIBRARIES) \
-o $@ \
$(PRIVATE_TARGET_CRTEND_O) \
$(PRIVATE_LDLIBS)
diff --git a/core/main.mk b/core/main.mk
index b99de49..59e9524 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -1125,4 +1125,7 @@
tidy_only:
@echo Successfully make tidy_only.
+ndk: $(SOONG_OUT_DIR)/ndk.timestamp
+.PHONY: ndk
+
endif # KATI
diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk
index 90e9547..701414a 100644
--- a/core/prebuilt_internal.mk
+++ b/core/prebuilt_internal.mk
@@ -46,9 +46,18 @@
$(LOCAL_PACK_MODULE_RELOCATIONS))
ifeq (SHARED_LIBRARIES,$(LOCAL_MODULE_CLASS))
- # Put the built targets of all shared libraries in a common directory
- # to simplify the link line.
- OVERRIDE_BUILT_MODULE_PATH := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)
+ # LOCAL_COPY_TO_INTERMEDIATE_LIBRARIES indicates that this prebuilt should be
+ # installed to the common directory of libraries. This is needed for the NDK
+ # shared libraries built by soong, as we build many different versions of each
+ # library (one for each API level). Since they all have the same basename,
+ # they'd clobber each other (as well as any platform libraries by the same
+ # name).
+ ifneq ($(LOCAL_COPY_TO_INTERMEDIATE_LIBRARIES),false)
+ # Put the built targets of all shared libraries in a common directory
+ # to simplify the link line.
+ OVERRIDE_BUILT_MODULE_PATH := \
+ $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)
+ endif
ifeq ($(LOCAL_IS_HOST_MODULE)$(my_strip_module),)
# Strip but not try to add debuglink
my_strip_module := no_debuglink
diff --git a/core/soong.mk b/core/soong.mk
index c96ca2f..cb0a0d0 100644
--- a/core/soong.mk
+++ b/core/soong.mk
@@ -25,6 +25,13 @@
$(hide) mkdir -p $(dir $@)
$(hide) BUILDDIR=$(SOONG_OUT_DIR) ./bootstrap.bash
+BINDER32BIT :=
+ifneq ($(TARGET_USES_64_BIT_BINDER),true)
+ifneq ($(TARGET_IS_64_BIT),true)
+BINDER32BIT := true
+endif
+endif
+
# Create soong.variables with copies of makefile settings. Runs every build,
# but only updates soong.variables if it changes
SOONG_VARIABLES_TMP := $(SOONG_VARIABLES).$$$$
@@ -44,6 +51,7 @@
echo ' "HostStaticBinaries": $(if $(strip $(BUILD_HOST_static)),true,false),'; \
echo ' "Cpusets": $(if $(strip $(ENABLE_CPUSETS)),true,false),'; \
echo ' "Schedboost": $(if $(strip $(ENABLE_SCHEDBOOST)),true,false),'; \
+ echo ' "Binder32bit": $(if $(BINDER32BIT),true,false),'; \
echo ''; \
echo ' "DeviceName": "$(TARGET_DEVICE)",'; \
echo ' "DeviceArch": "$(TARGET_ARCH)",'; \
diff --git a/tools/releasetools/check_target_files_signatures.py b/tools/releasetools/check_target_files_signatures.py
index 5c541ab..3048488 100755
--- a/tools/releasetools/check_target_files_signatures.py
+++ b/tools/releasetools/check_target_files_signatures.py
@@ -245,7 +245,7 @@
fullname = os.path.join(dirpath, fn)
displayname = fullname[len(d)+1:]
apk = APK(fullname, displayname)
- self.apks[apk.package] = apk
+ self.apks[apk.filename] = apk
self.apks_by_basename[os.path.basename(apk.filename)] = apk
self.max_pkg_len = max(self.max_pkg_len, len(apk.package))
@@ -316,8 +316,7 @@
self.max_pkg_len, apk.package,
apk.shared_uid)
else:
- print " %-*s %-*s" % (self.max_fn_len, apk.filename,
- self.max_pkg_len, apk.package)
+ print " %-*s %s" % (self.max_fn_len, apk.filename, apk.package)
print
def CompareWith(self, other):
diff --git a/tools/warn.py b/tools/warn.py
index 51349af..f17e8ac 100755
--- a/tools/warn.py
+++ b/tools/warn.py
@@ -10,6 +10,10 @@
help='Generate a CSV file with number of various warnings',
action="store_true",
default=False)
+parser.add_argument('--byproject',
+ help='Separate warnings in HTML output by project names',
+ action="store_true",
+ default=False)
parser.add_argument('--url',
help='Root URL of an Android source code tree prefixed '
'before files in warnings')
@@ -1660,6 +1664,7 @@
{ 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'',
'description':'Undefined result',
'patterns':[r".*: warning: The result of .+ is undefined",
+ r".*: warning: passing an object that .+ has undefined behavior \[-Wvarargs\]",
r".*: warning: 'this' pointer cannot be null in well-defined C\+\+ code;",
r".*: warning: shifting a negative signed value is undefined"] },
{ 'category':'C/C++', 'severity':severity.MEDIUM, 'members':[], 'option':'',
@@ -1774,6 +1779,21 @@
'description':'clang-tidy misc',
'patterns':[r".*: .+\[misc-.+\]$"] },
{ 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'',
+ 'description':'clang-tidy performance-faster-string-find',
+ 'patterns':[r".*: .+\[performance-faster-string-find\]$"] },
+ { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'',
+ 'description':'clang-tidy performance-for-range-copy',
+ 'patterns':[r".*: .+\[performance-for-range-copy\]$"] },
+ { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'',
+ 'description':'clang-tidy performance-implicit-cast-in-loop',
+ 'patterns':[r".*: .+\[performance-implicit-cast-in-loop\]$"] },
+ { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'',
+ 'description':'clang-tidy performance-unnecessary-copy-initialization',
+ 'patterns':[r".*: .+\[performance-unnecessary-copy-initialization\]$"] },
+ { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'',
+ 'description':'clang-tidy performance-unnecessary-value-param',
+ 'patterns':[r".*: .+\[performance-unnecessary-value-param\]$"] },
+ { 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'',
'description':'clang-tidy CERT',
'patterns':[r".*: .+\[cert-.+\]$"] },
{ 'category':'C/C++', 'severity':severity.TIDY, 'members':[], 'option':'',
@@ -1796,43 +1816,52 @@
# A list of [project_name, file_path_pattern].
# project_name should not contain comma, to be used in CSV output.
projectlist = [
- ['art', r"(^|.*/)art/.*: warning:"],
- ['bionic', r"(^|.*/)bionic/.*: warning:"],
- ['bootable', r"(^|.*/)bootable/.*: warning:"],
- ['build', r"(^|.*/)build/.*: warning:"],
- ['cts', r"(^|.*/)cts/.*: warning:"],
- ['dalvik', r"(^|.*/)dalvik/.*: warning:"],
- ['developers', r"(^|.*/)developers/.*: warning:"],
- ['development', r"(^|.*/)development/.*: warning:"],
- ['device', r"(^|.*/)device/.*: warning:"],
- ['doc', r"(^|.*/)doc/.*: warning:"],
- ['external', r"(^|.*/)external/.*: warning:"],
- ['frameworks', r"(^|.*/)frameworks/.*: warning:"],
- ['hardware', r"(^|.*/)hardware/.*: warning:"],
- ['kernel', r"(^|.*/)kernel/.*: warning:"],
- ['libcore', r"(^|.*/)libcore/.*: warning:"],
- ['libnativehelper', r"(^|.*/)libnativehelper/.*: warning:"],
- ['ndk', r"(^|.*/)ndk/.*: warning:"],
- ['packages', r"(^|.*/)packages/.*: warning:"],
- ['pdk', r"(^|.*/)pdk/.*: warning:"],
- ['prebuilts', r"(^|.*/)prebuilts/.*: warning:"],
- ['system', r"(^|.*/)system/.*: warning:"],
- ['toolchain', r"(^|.*/)toolchain/.*: warning:"],
- ['test', r"(^|.*/)test/.*: warning:"],
- ['tools', r"(^|.*/)tools/.*: warning:"],
- ['vendor', r"(^|.*/)vendor/.*: warning:"],
- ['out/obj', r".*/(gen|obj[^/]*)/(include|EXECUTABLES|SHARED_LIBRARIES|STATIC_LIBRARIES)/.*: warning:"],
- ['other', r".*: warning:"],
+ ['art', r"(^|.*/)art/.*: warning:"],
+ ['bionic', r"(^|.*/)bionic/.*: warning:"],
+ ['bootable', r"(^|.*/)bootable/.*: warning:"],
+ ['build', r"(^|.*/)build/.*: warning:"],
+ ['cts', r"(^|.*/)cts/.*: warning:"],
+ ['dalvik', r"(^|.*/)dalvik/.*: warning:"],
+ ['developers', r"(^|.*/)developers/.*: warning:"],
+ ['development', r"(^|.*/)development/.*: warning:"],
+ ['device', r"(^|.*/)device/.*: warning:"],
+ ['doc', r"(^|.*/)doc/.*: warning:"],
+ # match external/google* before external/
+ ['external/google', r"(^|.*/)external/google.*: warning:"],
+ ['external/non-google', r"(^|.*/)external/.*: warning:"],
+ ['frameworks', r"(^|.*/)frameworks/.*: warning:"],
+ ['hardware', r"(^|.*/)hardware/.*: warning:"],
+ ['kernel', r"(^|.*/)kernel/.*: warning:"],
+ ['libcore', r"(^|.*/)libcore/.*: warning:"],
+ ['libnativehelper', r"(^|.*/)libnativehelper/.*: warning:"],
+ ['ndk', r"(^|.*/)ndk/.*: warning:"],
+ ['packages', r"(^|.*/)packages/.*: warning:"],
+ ['pdk', r"(^|.*/)pdk/.*: warning:"],
+ ['prebuilts', r"(^|.*/)prebuilts/.*: warning:"],
+ ['system', r"(^|.*/)system/.*: warning:"],
+ ['toolchain', r"(^|.*/)toolchain/.*: warning:"],
+ ['test', r"(^|.*/)test/.*: warning:"],
+ ['tools', r"(^|.*/)tools/.*: warning:"],
+ # match vendor/google* before vendor/
+ ['vendor/google', r"(^|.*/)vendor/google.*: warning:"],
+ ['vendor/non-google', r"(^|.*/)vendor/.*: warning:"],
+ # keep out/obj and other patterns at the end.
+ ['out/obj', r".*/(gen|obj[^/]*)/(include|EXECUTABLES|SHARED_LIBRARIES|STATIC_LIBRARIES)/.*: warning:"],
+ ['other', r".*: warning:"],
]
projectpatterns = []
for p in projectlist:
projectpatterns.append({'description':p[0], 'members':[], 'pattern':re.compile(p[1])})
-# Each warning pattern has a dictionary that maps
-# a project name to number of warnings in that project.
+# Each warning pattern has 3 dictionaries:
+# (1) 'projects' maps a project name to number of warnings in that project.
+# (2) 'projectanchor' maps a project name to its anchor number for HTML.
+# (3) 'projectwarning' maps a project name to a list of warning of that project.
for w in warnpatterns:
w['projects'] = {}
+ w['projectanchor'] = {}
+ w['projectwarning'] = {}
platformversion = 'unknown'
targetproduct = 'unknown'
@@ -1937,17 +1966,12 @@
output('<blockquote>\n')
for i in warnpatterns:
if i['severity'] == sev and len(i['members']) > 0:
- output('\n<table frame="box">\n')
anchor += 1
i['anchor'] = str(anchor)
- mark = str(anchor) + '_mark'
- output('<tr bgcolor="' + colorforseverity(sev) + '">' +
- '<td><button class="bt" id="' + mark +
- '" onclick="expand(\'' + str(anchor) + '\');">' +
- '⊕</button> ' + descriptionfor(i) +
- ' (' + str(len(i['members'])) + ')</td></tr>\n')
- output('</table>\n')
- dumpcategory(i)
+ if args.byproject:
+ dumpcategorybyproject(sev, i)
+ else:
+ dumpcategory(sev, i)
output('</blockquote>\n')
def allpatterns(cat):
@@ -2002,19 +2026,35 @@
else:
return '<a href="' + args.url + '/' + filepath + '">' + filepath + '</a>:' + linenumber + ':' + warning
-# dump a category, provided it is not marked as 'SKIP' and has more than 0 occurrences
-def dumpcategory(cat):
- if cat['severity'] != severity.SKIP and len(cat['members']) != 0:
- header = [descriptionfor(cat),str(len(cat['members'])) + ' occurences:']
- if cat['option'] != '':
- header[1:1] = [' (related option: ' + cat['option'] +')']
+def dumpgroup(sev, anchor, description, warnings):
+ mark = anchor + '_mark'
+ output('\n<table frame="box">\n')
+ output('<tr bgcolor="' + colorforseverity(sev) + '">' +
+ '<td><button class="bt" id="' + mark +
+ '" onclick="expand(\'' + anchor + '\');">' +
+ '⊕</button> ' + description + '</td></tr>\n')
+ output('</table>\n')
+ output('<div id="' + anchor + '" style="display:none;">')
+ output('<table>\n')
+ for i in warnings:
+ tablerow(warningwithurl(i))
+ output('</table></div>\n')
- output('<div id="' + cat['anchor'] + '" style="display:none;">')
- output('<table>\n')
- for i in cat['members']:
- tablerow(warningwithurl(i))
- output('</table></div>\n')
+# dump warnings in a category
+def dumpcategory(sev, cat):
+ description = descriptionfor(cat) + ' (' + str(len(cat['members'])) + ')'
+ dumpgroup(sev, cat['anchor'], description, cat['members'])
+# similar to dumpcategory but output one table per project.
+def dumpcategorybyproject(sev, cat):
+ warning = descriptionfor(cat)
+ projects = cat['projectwarning'].keys()
+ projects.sort()
+ for p in projects:
+ anchor = cat['projectanchor'][p]
+ projectwarnings = cat['projectwarning'][p]
+ description = '{}, in {} ({})'.format(warning, p, len(projectwarnings))
+ dumpgroup(sev, anchor, description, projectwarnings)
def findproject(line):
for p in projectpatterns:
@@ -2023,15 +2063,26 @@
return '???'
def classifywarning(line):
+ global anchor
for i in warnpatterns:
for cpat in i['compiledpatterns']:
if cpat.match(line):
i['members'].append(line)
pname = findproject(line)
+ # Count warnings by project.
if pname in i['projects']:
- i['projects'][pname] += 1
+ i['projects'][pname] += 1
else:
- i['projects'][pname] = 1
+ i['projects'][pname] = 1
+ # Collect warnings by project.
+ if args.byproject:
+ if pname in i['projectwarning']:
+ i['projectwarning'][pname].append(line)
+ else:
+ i['projectwarning'][pname] = [line]
+ if pname not in i['projectanchor']:
+ anchor += 1
+ i['projectanchor'][pname] = str(anchor)
return
else:
# If we end up here, there was a problem parsing the log