Merge lp:~allanlesage/unity-scope-click/enable-coverage-reporting-refreshed into lp:unity-scope-click

Proposed by Allan LeSage
Status: Superseded
Proposed branch: lp:~allanlesage/unity-scope-click/enable-coverage-reporting-refreshed
Merge into: lp:unity-scope-click
Diff against target: 312 lines (+271/-0)
5 files modified
CMakeLists.txt (+20/-0)
cmake/EnableCoverageReport.cmake (+158/-0)
cmake/FindLcov.cmake (+35/-0)
cmake/Findgcovr.cmake (+43/-0)
debian/copyright (+15/-0)
To merge this branch: bzr merge lp:~allanlesage/unity-scope-click/enable-coverage-reporting-refreshed
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Needs Fixing
dobey Pending
Review via email: mp+218164@code.launchpad.net

This proposal supersedes a proposal from 2014-04-10.

Description of the change

Here we're adding some CMake tooling to aid in the generation of coverage reports. As described in the top-level CMakeLists.txt, after you've make and make test'ed, try make coverage and look for a coveragereport dir with html files in your build dir.

Note that you'll need a couple of dependencies, esp. lcov and gcovr --note that unity8 and mir have elected not to make these part of the debian/control deps. Also note that this method is borrowed wholesale from those projects and others, with some adaptation for your project.

We have some good tests to build on here :) , maybe the html view will help.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:209
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~allanlesage/unity-scope-click/enable-coverage-reporting/+merge/215319/+edit-commit-message

http://jenkins.qa.ubuntu.com/job/unity-scope-click-ci/428/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-amd64-ci/329
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-armhf-ci/326
        deb: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-armhf-ci/326/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity-scope-click-ci/428/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
dobey (dobey) wrote : Posted in a previous version of this proposal

Please use "bzr commit unchanged --fixes=lp:1305180" so that bug #1305180 is linked to the branch.

Revision history for this message
dobey (dobey) : Posted in a previous version of this proposal
review: Needs Fixing
Revision history for this message
Allan LeSage (allanlesage) wrote : Posted in a previous version of this proposal

Done; sorry for the delay :) .

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Approve (continuous-integration)
Revision history for this message
dobey (dobey) wrote : Posted in a previous version of this proposal

As unity-scope-click is under the CLA, and is distributed as GPLv3+OpenSSL exception, I wonder if we can include this, given the cmake module being copy/pasted here is GPLv2+ without such an exception.

Is there any reason we cannot package the bits being added under cmake/ as a separate project/package in Ubuntu, which all our projects depend on? It will make updating for any changes much easier, and will not introduce such copyright/license conflicts in the distribution of the source.

Also, where is the ParseArguments.cmake module from? It has no copyright information at all in it, so I wonder if we are even allowed to redistribute it? Is there a particular reason that the standard cmake argument parsing module can't be used?

I'm basically OK with the changes that enable the feature, but I think we need to ship the actual cmake module separately as its own package.

Revision history for this message
Allan LeSage (allanlesage) wrote : Posted in a previous version of this proposal

I've long wanted to find the means to do this, but I'm wondering to where our CMake coverage bits would be shipped? I may need some instructio--meanwhile I'll try to collect some licensing information from Canonical committers for the files you've singled out.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Approve (continuous-integration)
Revision history for this message
Allan LeSage (allanlesage) wrote : Posted in a previous version of this proposal

Switched to the standard CMake argument parsing macro per dobey's suggestion.

Rodney, do lines 67-8 resolve your licensing concern?

Lastly can you provide some instruction on packaging these CMake files? I.e. does a standard archive exist already for such, and how are they invoked, etc.?

Revision history for this message
dobey (dobey) wrote : Posted in a previous version of this proposal

> Rodney, do lines 67-8 resolve your licensing concern?

Not really. The license is still different from the rest of the code we ship. And we cannot add the OpenSSL exception clause to this license. With the other file, which had no copyright/license info at all, gone from the branch, the licensing is at least something we are legally allowed to redistribute (and change) now. It just means shipping things under different licenses, in the same source, and having to deal with managing any necessary changes to these files across several projects, versus a central source for it.

> Lastly can you provide some instruction on packaging these CMake files? I.e.
> does a standard archive exist already for such, and how are they invoked,
> etc.?

On Ubuntu at least, cmake-data and qtbase5-dev include the majority of cmake modules. The Qt ones are shipped by Qt, and not cmake. I'm not sure why these haven't been included in upstream cmake already, but getting them accepted there would be one way to get them packaged centrally. Another option would be inside the gcovr/lcov packages, if the licensing allows for it. And another option would be to simply place them in their own package, cmake-coverage or something, which only ships these files.

Revision history for this message
dobey (dobey) wrote : Posted in a previous version of this proposal

17 +include(EnableCoverageReport)

Can you include a comment next to this, in the form of "# Using gcov cmake modules from https://wherever/they/came/from" so that we have a link to the true upstream of these cmake files?

Also, can you please update debian/copyright to add the necessary bits for the cmake/*.cmake files, which are not (C) Canonical, and which are GPLv2+ rather than GPLv3+OpenSSL?

review: Needs Fixing
Revision history for this message
Allan LeSage (allanlesage) wrote :

Resubmitted under a fresh branch based on devel per dobey's req, updating to the most recent upstream versions of these macros and registering the proper license in debian/copyright, with requested notes.

Note that our version of EnableCoverageReport.cmake differs from the upstream version in omitting the ParseArguments.cmake, which is unlicensed upstream--instead we're using a CMake-native macro (as in the original version of this MP).

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:238
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~allanlesage/unity-scope-click/enable-coverage-reporting-refreshed/+merge/218164/+edit-commit-message

http://jenkins.qa.ubuntu.com/job/unity-scope-click-ci/460/
Executed test runs:
    FAILURE: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-amd64-ci/361/console
    FAILURE: http://jenkins.qa.ubuntu.com/job/unity-scope-click-trusty-armhf-ci/358/console

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity-scope-click-ci/460/rebuild

review: Needs Fixing (continuous-integration)
239. By Allan LeSage

Correct Wienke copyright to 2010-2012, correct cor-lab.org URL.

240. By Allan LeSage

Coverage tooling origin comment http->https per dobey req.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2014-04-30 16:00:10 +0000
3+++ CMakeLists.txt 2014-05-02 22:12:55 +0000
4@@ -10,6 +10,8 @@
5 SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -Wall -Wextra -Werror -fPIC")
6 SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -g -Wextra -Wall -Werror -fPIC")
7
8+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
9+
10 include(GNUInstallDirs)
11
12 set(SCOPE_LIB_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/unity-scopes/clickscope/)
13@@ -38,6 +40,24 @@
14 add_subdirectory(data)
15 add_subdirectory(po)
16
17+include(EnableCoverageReport) # Using gcov CMake modules from http://code.cor-lab/projects/rsc
18+#####################################################################
19+# Enable code coverage calculation with gcov/gcovr/lcov
20+# Usage:
21+# * Switch build type to coverage (use ccmake or cmake-gui)
22+# * Invoke make, make test, make coverage (or ninja if you use that backend)
23+# * Find html report in subdir coveragereport
24+# * Find xml report feasible for jenkins in coverage.xml
25+#####################################################################
26+string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower)
27+if(cmake_build_type_lower MATCHES coverage)
28+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage" )
29+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage" )
30+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --coverage" )
31+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage" )
32+ ENABLE_COVERAGE_REPORT(TARGETS ${SCOPE_LIB_UNVERSIONED} FILTER /usr/include ${CMAKE_SOURCE_DIR}/tests/* ${CMAKE_BINARY_DIR}/*)
33+endif()
34+
35 # Custom targets for the tests
36 add_custom_target (test
37 DEPENDS test-click-scope
38
39=== added directory 'cmake'
40=== added file 'cmake/EnableCoverageReport.cmake'
41--- cmake/EnableCoverageReport.cmake 1970-01-01 00:00:00 +0000
42+++ cmake/EnableCoverageReport.cmake 2014-05-02 22:12:55 +0000
43@@ -0,0 +1,158 @@
44+# - Creates a special coverage build type and target on GCC.
45+#
46+# Defines a function ENABLE_COVERAGE_REPORT which generates the coverage target
47+# for selected targets. Optional arguments to this function are used to filter
48+# unwanted results using globbing expressions. Moreover targets with tests for
49+# the source code can be specified to trigger regenerating the report if the
50+# test has changed
51+#
52+# ENABLE_COVERAGE_REPORT(TARGETS target... [FILTER filter...] [TESTS test targets...])
53+#
54+# To generate a coverage report first build the project with
55+# CMAKE_BUILD_TYPE=coverage, then call make test and afterwards make coverage.
56+#
57+# The coverage report is based on gcov. Depending on the availability of lcov
58+# a HTML report will be generated and/or an XML report of gcovr is found.
59+# The generated coverage target executes all found solutions. Special targets
60+# exist to create e.g. only the xml report: coverage-xml.
61+#
62+# Copyright (C) 2010 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
63+#
64+# This file may be licensed under the terms of the
65+# GNU Lesser General Public License Version 3 (the ``LGPL''),
66+# or (at your option) any later version.
67+#
68+# Software distributed under the License is distributed
69+# on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
70+# express or implied. See the LGPL for the specific language
71+# governing rights and limitations.
72+#
73+# You should have received a copy of the LGPL along with this
74+# program. If not, go to http://www.gnu.org/licenses/lgpl.html
75+# or write to the Free Software Foundation, Inc.,
76+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
77+#
78+# The development of this software was supported by:
79+# CoR-Lab, Research Institute for Cognition and Robotics
80+# Bielefeld University
81+
82+FIND_PACKAGE(Lcov)
83+FIND_PACKAGE(gcovr)
84+
85+FUNCTION(ENABLE_COVERAGE_REPORT)
86+
87+ # argument parsing
88+ SET(MULTI_VALUE_ARGS FILTER TARGETS TESTS)
89+ CMAKE_PARSE_ARGUMENTS(ENABLE_COVERAGE_REPORT "" "" "${MULTI_VALUE_ARGS}" ${ARGN})
90+
91+ SET(COVERAGE_RAW_FILE "${CMAKE_BINARY_DIR}/coverage.raw.info")
92+ SET(COVERAGE_FILTERED_FILE "${CMAKE_BINARY_DIR}/coverage.info")
93+ SET(COVERAGE_REPORT_DIR "${CMAKE_BINARY_DIR}/coveragereport")
94+ SET(COVERAGE_XML_FILE "${CMAKE_BINARY_DIR}/coverage.xml")
95+ SET(COVERAGE_XML_COMMAND_FILE "${CMAKE_BINARY_DIR}/coverage-xml.cmake")
96+
97+ # decide if there is any tool to create coverage data
98+ SET(TOOL_FOUND FALSE)
99+ IF(LCOV_FOUND OR GCOVR_FOUND)
100+ SET(TOOL_FOUND TRUE)
101+ ENDIF()
102+ IF(NOT TOOL_FOUND)
103+ MESSAGE(STATUS "Cannot enable coverage targets because neither lcov nor gcovr are found.")
104+ ENDIF()
105+
106+ STRING(TOLOWER "${CMAKE_BUILD_TYPE}" COVERAGE_BUILD_TYPE)
107+ IF(CMAKE_COMPILER_IS_GNUCXX AND TOOL_FOUND AND "${COVERAGE_BUILD_TYPE}" MATCHES "coverage")
108+
109+ MESSAGE(STATUS "Coverage support enabled for targets: ${ENABLE_COVERAGE_REPORT_TARGETS}")
110+
111+ # create coverage build type
112+ SET(CMAKE_CXX_FLAGS_COVERAGE ${CMAKE_CXX_FLAGS_DEBUG} PARENT_SCOPE)
113+ SET(CMAKE_C_FLAGS_COVERAGE ${CMAKE_C_FLAGS_DEBUG} PARENT_SCOPE)
114+ SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} coverage PARENT_SCOPE)
115+
116+ # instrument targets
117+ SET_TARGET_PROPERTIES(${ENABLE_COVERAGE_REPORT_TARGETS} PROPERTIES COMPILE_FLAGS --coverage
118+ LINK_FLAGS --coverage)
119+
120+ # html report
121+ IF (LCOV_FOUND)
122+
123+ MESSAGE(STATUS "Enabling HTML coverage report")
124+
125+ # set up coverage target
126+
127+ ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_RAW_FILE}
128+ COMMAND ${LCOV_EXECUTABLE} -c -d ${CMAKE_BINARY_DIR} -o ${COVERAGE_RAW_FILE}
129+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
130+ COMMENT "Collecting coverage data"
131+ DEPENDS ${ENABLE_COVERAGE_REPORT_TARGETS} ${ENABLE_COVERAGE_REPORT_TESTS}
132+ VERBATIM)
133+
134+ # filter unwanted stuff
135+ LIST(LENGTH ENABLE_COVERAGE_REPORT_FILTER FILTER_LENGTH)
136+ IF(${FILTER_LENGTH} GREATER 0)
137+ SET(FILTER COMMAND ${LCOV_EXECUTABLE})
138+ FOREACH(F ${ENABLE_COVERAGE_REPORT_FILTER})
139+ SET(FILTER ${FILTER} -r ${COVERAGE_FILTERED_FILE} ${F})
140+ ENDFOREACH()
141+ SET(FILTER ${FILTER} -o ${COVERAGE_FILTERED_FILE})
142+ ELSE()
143+ SET(FILTER "")
144+ ENDIF()
145+
146+ ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_FILTERED_FILE}
147+ COMMAND ${LCOV_EXECUTABLE} -e ${COVERAGE_RAW_FILE} "${CMAKE_SOURCE_DIR}*" -o ${COVERAGE_FILTERED_FILE}
148+ ${FILTER}
149+ DEPENDS ${COVERAGE_RAW_FILE}
150+ COMMENT "Filtering recorded coverage data for project-relevant entries"
151+ VERBATIM)
152+ ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_REPORT_DIR}
153+ COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_REPORT_DIR}
154+ COMMAND ${GENHTML_EXECUTABLE} --legend --show-details -t "${PROJECT_NAME} test coverage" -o ${COVERAGE_REPORT_DIR} ${COVERAGE_FILTERED_FILE}
155+ DEPENDS ${COVERAGE_FILTERED_FILE}
156+ COMMENT "Generating HTML coverage report in ${COVERAGE_REPORT_DIR}"
157+ VERBATIM)
158+
159+ ADD_CUSTOM_TARGET(coverage-html
160+ DEPENDS ${COVERAGE_REPORT_DIR})
161+
162+ ENDIF()
163+
164+ # xml coverage report
165+ IF(GCOVR_FOUND)
166+
167+ MESSAGE(STATUS "Enabling XML coverage report")
168+
169+ # gcovr cannot write directly to a file so the execution needs to
170+ # be wrapped in a cmake file that generates the file output
171+ FILE(WRITE ${COVERAGE_XML_COMMAND_FILE}
172+ "SET(ENV{LANG} en)\n")
173+ FILE(APPEND ${COVERAGE_XML_COMMAND_FILE}
174+ "EXECUTE_PROCESS(COMMAND \"${GCOVR_EXECUTABLE}\" -x -r \"${CMAKE_SOURCE_DIR}\" OUTPUT_FILE \"${COVERAGE_XML_FILE}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")\n")
175+
176+ ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_XML_FILE}
177+ COMMAND ${CMAKE_COMMAND} ARGS -P ${COVERAGE_XML_COMMAND_FILE}
178+ COMMENT "Generating coverage XML report"
179+ VERBATIM)
180+
181+ ADD_CUSTOM_TARGET(coverage-xml
182+ DEPENDS ${COVERAGE_XML_FILE})
183+
184+ ENDIF()
185+
186+ # provide a global coverage target executing both steps if available
187+ SET(GLOBAL_DEPENDS "")
188+ IF(LCOV_FOUND)
189+ LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_REPORT_DIR})
190+ ENDIF()
191+ IF(GCOVR_FOUND)
192+ LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_XML_FILE})
193+ ENDIF()
194+ IF(LCOV_FOUND OR GCOVR_FOUND)
195+ ADD_CUSTOM_TARGET(coverage
196+ DEPENDS ${GLOBAL_DEPENDS})
197+ ENDIF()
198+
199+ ENDIF()
200+
201+ENDFUNCTION()
202
203=== added file 'cmake/FindLcov.cmake'
204--- cmake/FindLcov.cmake 1970-01-01 00:00:00 +0000
205+++ cmake/FindLcov.cmake 2014-05-02 22:12:55 +0000
206@@ -0,0 +1,35 @@
207+# - Find lcov
208+# Will define:
209+#
210+# LCOV_EXECUTABLE - the lcov binary
211+# GENHTML_EXECUTABLE - the genhtml executable
212+#
213+# Copyright (C) 2010 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
214+#
215+# This file may be licensed under the terms of the
216+# GNU Lesser General Public License Version 3 (the ``LGPL''),
217+# or (at your option) any later version.
218+#
219+# Software distributed under the License is distributed
220+# on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
221+# express or implied. See the LGPL for the specific language
222+# governing rights and limitations.
223+#
224+# You should have received a copy of the LGPL along with this
225+# program. If not, go to http://www.gnu.org/licenses/lgpl.html
226+# or write to the Free Software Foundation, Inc.,
227+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
228+#
229+# The development of this software was supported by:
230+# CoR-Lab, Research Institute for Cognition and Robotics
231+# Bielefeld University
232+
233+INCLUDE(FindPackageHandleStandardArgs)
234+
235+FIND_PROGRAM(LCOV_EXECUTABLE lcov)
236+FIND_PROGRAM(GENHTML_EXECUTABLE genhtml)
237+
238+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lcov DEFAULT_MSG LCOV_EXECUTABLE GENHTML_EXECUTABLE)
239+
240+# only visible in advanced view
241+MARK_AS_ADVANCED(LCOV_EXECUTABLE GENHTML_EXECUTABLE)
242
243=== added file 'cmake/Findgcovr.cmake'
244--- cmake/Findgcovr.cmake 1970-01-01 00:00:00 +0000
245+++ cmake/Findgcovr.cmake 2014-05-02 22:12:55 +0000
246@@ -0,0 +1,43 @@
247+# - Find gcovr scrip
248+# Will define:
249+#
250+# GCOVR_EXECUTABLE - the gcovr script
251+#
252+# Uses:
253+#
254+# GCOVR_ROOT - root to search for the script
255+#
256+# Copyright (C) 2011 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
257+#
258+# This file may be licensed under the terms of the
259+# GNU Lesser General Public License Version 3 (the ``LGPL''),
260+# or (at your option) any later version.
261+#
262+# Software distributed under the License is distributed
263+# on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
264+# express or implied. See the LGPL for the specific language
265+# governing rights and limitations.
266+#
267+# You should have received a copy of the LGPL along with this
268+# program. If not, go to http://www.gnu.org/licenses/lgpl.html
269+# or write to the Free Software Foundation, Inc.,
270+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
271+#
272+# The development of this software was supported by:
273+# CoR-Lab, Research Institute for Cognition and Robotics
274+# Bielefeld University
275+
276+INCLUDE(FindPackageHandleStandardArgs)
277+
278+FIND_PROGRAM(GCOVR_EXECUTABLE gcovr
279+ HINTS ${GCOVR_ROOT}
280+ "${GCOVR_ROOT}/bin"
281+ "${GCOVR_ROOT}/share/python"
282+ "/usr/share/python"
283+ "/usr/local/share/python"
284+ "${CMAKE_INSTALL_PREFIX}/share/python")
285+
286+FIND_PACKAGE_HANDLE_STANDARD_ARGS(gcovr DEFAULT_MSG GCOVR_EXECUTABLE)
287+
288+# only visible in advanced view
289+MARK_AS_ADVANCED(GCOVR_EXECUTABLE)
290
291=== modified file 'debian/copyright'
292--- debian/copyright 2014-03-24 19:18:13 +0000
293+++ debian/copyright 2014-05-02 22:12:55 +0000
294@@ -18,3 +18,18 @@
295 .
296 On Debian/Ubuntu systems, the full text of the GPL v3 can be found in
297 `/usr/share/common-licenses/GPL-3'
298+
299+Files: cmake/EnableCoverageReport.cmake cmake/Findgcovr.cmake cmake/FindLcov.cmake
300+Copyright: 2010 Johannes Wienke
301+License: LGPL-3
302+ This file may be licensed under the terms of the
303+ GNU Lesser General Public License Version 3 (the ``LGPL''),
304+ or (at your option) any later version.
305+ .
306+ Software distributed under the License is distributed
307+ on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
308+ express or implied. See the LGPL for the specific language
309+ governing rights and limitations.
310+ .
311+ On Debian/Ubuntu systems, the full text of the LGPL v3 can be found in
312+ `/usr/share/common-licenses/LGPL-3'

Subscribers

People subscribed via source and target branches

to all changes: