← Back to team overview

kicad-developers team mailing list archive

Re: OSX build fails consistently with same error

 

On 03/21/2014 11:01 PM, Jean-Paul Louis wrote:
> The make in the common directory made a difference, but now I get a failure I never saw
> before.
> Looks like an issue with Cairo and GAL, but I have no clue as I never looked at that part
> of the code.
> 
> Jean-Paul (AC9GH)
> 
> The result below is the "make" after the previous “make" in the "common" directory.

I said

$ make pcb_plot_params_keywords.o

not:

$ make



> 
> Jean-Pauls-MacBook-Pro:kicad-build jean-paullouis$ make
> [  1%] Built target boost
> [  2%] Built target pixman
> [  2%] Built target pkgconfig
> [  3%] Built target libpng
> [  4%] Built target cairo
> [  4%] Built target glew
> [  5%] Built target libwxpython
> [  5%] Built target pcre
> [  5%] Built target swig
> [  5%] Built target lib-dependencies
> [  5%] Built target polygon
> [ 39%] Built target bitmaps
> [ 46%] Built target common
> [ 48%] Built target pcb_calculator_kiface
> [ 48%] Built target pcb_calculator
> [ 50%] Built target 3d-viewer
> [ 50%] Built target avhttp
> [ 50%] Built target github_plugin
> [ 50%] Built target shader_headers
> [ 52%] Built target gal
> [ 57%] Built target pcbcommon
> [ 58%] Built target pcad2kicadpcb
> *Linking CXX shared module _cvpcb.kiface*
> clang: warning: argument unused during compilation: '-XLinker,-cref'
> clang: warning: argument unused during compilation: '-XLinker,-Map=_cvpcb.kiface.map'


This warning is stupid, CMake is clearly telling you it is linking 3 lines above, and
clang is telling you it is compiling.  There is clearly a disagreement.  Either clang
needs a bug fix, or cmake does.

What version of cmake?

The CMakeLists.txt script is setting LINK_FLAGS, so it looks like it could be a problem
with CMake support for CLang, or if CLang is providing a compatibility shim, then this has
a problem.


> Undefined symbols for architecture x86_64:
>   "_cairo_append_path", referenced from:
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_arc", referenced from:
>       KIGFX::CAIRO_GAL::DrawSegment(VECTOR2<double> const&, VECTOR2<double> const&,

Sometimes you have to capture the actual command being give to the linker.

This is done with

$ make VERBOSE=1 > actual.txt

Then look for the step which links _cvpcb.kiface, search that file actual for it with a
text editor.  Verify that ${CAIRO_LIBRARIES} on 116 of cvpcb/CMakeList.txt is expanding to
what it should.  And that it trails what "gal" expands to on line 111.

the cairo substitution needs to come *after* the gal substitution in the command which
generates _cvpcb.kiface.


I may have to install CLang on linux, and see if it actually even works, or if its a house
of cards still.


Dick


> double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawCircle(VECTOR2<double> const&, double) in
> libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawArc(VECTOR2<double> const&, double, double, double) in
> libgal.a(cairo_gal.cpp.o)
>   "_cairo_close_path", referenced from:
>       KIGFX::CAIRO_GAL::DrawRectangle(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>   "_cairo_copy_path", referenced from:
>       KIGFX::CAIRO_GAL::storePath() in libgal.a(cairo_gal.cpp.o)
>   "_cairo_create", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::CreateBuffer() in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_curve_to", referenced from:
>       KIGFX::CAIRO_GAL::DrawCurve(VECTOR2<double> const&, VECTOR2<double> const&,
> VECTOR2<double> const&, VECTOR2<double> const&) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_destroy", referenced from:
>       KIGFX::CAIRO_GAL::~CAIRO_GAL() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::deinitSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::EndDrawing() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::EndGroup() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::~CAIRO_COMPOSITOR() in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::clean() in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::Resize(unsigned int, unsigned int) in
> libgal.a(cairo_compositor.cpp.o)
>       ...
>   "_cairo_device_to_user_distance", referenced from:
>       KIGFX::CAIRO_GAL::SetLineWidth(double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_fill", referenced from:
>       KIGFX::CAIRO_GAL::ClearScreen() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_fill_preserve", referenced from:
>       KIGFX::CAIRO_GAL::storePath() in libgal.a(cairo_gal.cpp.o)
>   "_cairo_format_stride_for_width", referenced from:
>       KIGFX::CAIRO_GAL::CAIRO_GAL(wxWindow*, wxEvtHandler*, wxEvtHandler*, wxString
> const&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::allocateBitmaps() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::ResizeScreen(int, int) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::Resize(unsigned int, unsigned int) in
> libgal.a(cairo_compositor.cpp.o)
>   "_cairo_get_matrix", referenced from:
>       KIGFX::CAIRO_COMPOSITOR::CreateBuffer() in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::SetBuffer(unsigned int) in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::DrawBuffer(unsigned int) in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::SetMainContext(_cairo*) in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_identity_matrix", referenced from:
>       KIGFX::CAIRO_COMPOSITOR::DrawBuffer(unsigned int) in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_image_surface_create_for_data", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::CreateBuffer() in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_line_to", referenced from:
>       KIGFX::CAIRO_GAL::DrawLine(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawSegment(VECTOR2<double> const&, VECTOR2<double> const&,
> double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawRectangle(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawPolyline(std::deque<VECTOR2<double>,
> std::allocator<VECTOR2<double> > >&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawPolygon(std::deque<VECTOR2<double>,
> std::allocator<VECTOR2<double> > > const&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawCurve(VECTOR2<double> const&, VECTOR2<double> const&,
> VECTOR2<double> const&, VECTOR2<double> const&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::drawGridLine(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>       ...
>   "_cairo_matrix_init", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::Transform(MATRIX3x3<double>) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_move_to", referenced from:
>       KIGFX::CAIRO_GAL::DrawLine(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawSegment(VECTOR2<double> const&, VECTOR2<double> const&,
> double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawRectangle(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawPolyline(std::deque<VECTOR2<double>,
> std::allocator<VECTOR2<double> > >&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawPolygon(std::deque<VECTOR2<double>,
> std::allocator<VECTOR2<double> > > const&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawCurve(VECTOR2<double> const&, VECTOR2<double> const&,
> VECTOR2<double> const&, VECTOR2<double> const&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::drawGridLine(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>       ...
>   "_cairo_new_path", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::storePath() in libgal.a(cairo_gal.cpp.o)
>   "_cairo_new_sub_path", referenced from:
>       KIGFX::CAIRO_GAL::DrawCircle(VECTOR2<double> const&, double) in
> libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawArc(VECTOR2<double> const&, double, double, double) in
> libgal.a(cairo_gal.cpp.o)
>   "_cairo_paint", referenced from:
>       KIGFX::CAIRO_COMPOSITOR::DrawBuffer(unsigned int) in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_paint_with_alpha", referenced from:
>       KIGFX::CAIRO_GAL::EndDrawing() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::SetLayerDepth(double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::SetTarget(KIGFX::RENDER_TARGET) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_path_destroy", referenced from:
>       KIGFX::CAIRO_GAL::DeleteGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_pop_group_to_source", referenced from:
>       KIGFX::CAIRO_GAL::EndDrawing() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::SetLayerDepth(double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::SetTarget(KIGFX::RENDER_TARGET) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_push_group", referenced from:
>       KIGFX::CAIRO_GAL::BeginDrawing() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::SetLayerDepth(double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::SetTarget(KIGFX::RENDER_TARGET) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_rectangle", referenced from:
>       KIGFX::CAIRO_GAL::ClearScreen() in libgal.a(cairo_gal.cpp.o)
>   "_cairo_restore", referenced from:
>       KIGFX::CAIRO_GAL::DrawSegment(VECTOR2<double> const&, VECTOR2<double> const&,
> double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::Restore() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_rotate", referenced from:
>       KIGFX::CAIRO_GAL::DrawSegment(VECTOR2<double> const&, VECTOR2<double> const&,
> double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::Rotate(double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_save", referenced from:
>       KIGFX::CAIRO_GAL::DrawSegment(VECTOR2<double> const&, VECTOR2<double> const&,
> double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::Save() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_scale", referenced from:
>       KIGFX::CAIRO_GAL::Scale(VECTOR2<double> const&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_set_antialias", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::CreateBuffer() in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_set_line_cap", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::CreateBuffer() in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_set_line_join", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::CreateBuffer() in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_set_line_width", referenced from:
>       KIGFX::CAIRO_GAL::SetLineWidth(double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_set_matrix", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::CreateBuffer() in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::SetBuffer(unsigned int) in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::DrawBuffer(unsigned int) in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_set_source_rgb", referenced from:
>       KIGFX::CAIRO_GAL::storePath() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::ClearScreen() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::drawGridLine(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>   "_cairo_set_source_surface", referenced from:
>       KIGFX::CAIRO_COMPOSITOR::DrawBuffer(unsigned int) in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_status", referenced from:
>       KIGFX::CAIRO_GAL::initSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::CreateBuffer() in libgal.a(cairo_compositor.cpp.o)
>   "_cairo_stroke", referenced from:
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::drawGridLine(VECTOR2<double> const&, VECTOR2<double> const&) in
> libgal.a(cairo_gal.cpp.o)
>   "_cairo_stroke_preserve", referenced from:
>       KIGFX::CAIRO_GAL::storePath() in libgal.a(cairo_gal.cpp.o)
>   "_cairo_surface_destroy", referenced from:
>       KIGFX::CAIRO_GAL::~CAIRO_GAL() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::deinitSurface() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::EndDrawing() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::EndGroup() in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::~CAIRO_COMPOSITOR() in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::clean() in libgal.a(cairo_compositor.cpp.o)
>       KIGFX::CAIRO_COMPOSITOR::Resize(unsigned int, unsigned int) in
> libgal.a(cairo_compositor.cpp.o)
>       ...
>   "_cairo_transform", referenced from:
>       KIGFX::CAIRO_GAL::Transform(MATRIX3x3<double>) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
>   "_cairo_translate", referenced from:
>       KIGFX::CAIRO_GAL::DrawSegment(VECTOR2<double> const&, VECTOR2<double> const&,
> double) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::Translate(VECTOR2<double> const&) in libgal.a(cairo_gal.cpp.o)
>       KIGFX::CAIRO_GAL::DrawGroup(int) in libgal.a(cairo_gal.cpp.o)
> ld: symbol(s) not found for architecture x86_64
> clang: error: linker command failed with exit code 1 (use -v to see invocation)
> make[2]: *** [cvpcb/_cvpcb.kiface] Error 1
> make[1]: *** [cvpcb/CMakeFiles/cvpcb_kiface.dir/all] Error 2
> make: *** [all] Error 2
> Jean-Pauls-MacBook-Pro:kicad-build jean-paullouis$ 
> 
> 
> On Mar 21, 2014, at 10:54 PM, Jean-Paul Louis <louijp@xxxxxxxxx <mailto:louijp@xxxxxxxxx>>
> wrote:
> 
>> Thanks for the help guys.
>>
>> It progressed a bit further. But it died building cvpcb. I will send the error message
>> on my new trial
>>
>> Jean-Paul
>>
>>
>> On Mar 21, 2014, at 7:40 PM, Adam Wolf <adamwolf@xxxxxxxxxxxxxxxxxxxx
>> <mailto:adamwolf@xxxxxxxxxxxxxxxxxxxx>> wrote:
>>
>>> I tried to send an email to Jean Paul earlier today about this, but four hours later a
>>> kindly email server told me I sent from the wrong address.
>>>
>>> This is a bug that is already in the bug tracker.  Do exactly what Dick says--cd
>>> common, make, cd back, make again.
>>>
>>> I know Marco was looking into it, but I'm not sure if it's gotten anywhere yet.
>>>
>>> I've been watching the Mac builds like a hawk lately--it's interesting that you haven't
>>> been bit by this one yet.
>>>
>>> Adam Wolf
>>> Wayne and Layne LLC
>>>
>>> On Mar 21, 2014 5:12 PM, "Dick Hollenbeck" <dick@xxxxxxxxxxx <mailto:dick@xxxxxxxxxxx>>
>>> wrote:
>>>
>>>     On 03/21/2014 04:06 PM, Jean-Paul Louis wrote:
>>>     > Hello all,
>>>     >
>>>     > Since today, I cannot succeed to build OSX version of Kicad (BZR 4764).
>>>     > I can build all the modules (kicad, eeschema, common, cvpcb, pcb_calculator)
>>>     except “pcbnew”.
>>>     > Before, I was able to address the issue with a “make” followed by a “make
>>>     common”, and
>>>     > finally another “make”.
>>>     > But now, I cannot find a way that solve the issue.
>>>     > I do not know which part is supposed to create the missing header file.
>>>     >
>>>     > Please help.
>>>     >
>>>     > Jean-Paul (AC9GH)
>>>
>>>
>>>     pcb_plot_params.h is generated by CMake, driven from make, on line 340 of
>>>     pcbnew/CMakeList.txt.
>>>
>>>     It is placed into <src>/pcbnew/pcb_plot_params.h  as it is generated.
>>>
>>>     1) First verify it is missing by looking for it in <src>/common/ dir.
>>>
>>>     2) If missing, then
>>>     $ cd <build>/common
>>>
>>>     i.e. go into one directory below your build directory into one named common.
>>>
>>>     3) make help | grep pcb_plot_params_keywords.o
>>>
>>>     common$ make help | grep pcb_plot_params_keywords.o
>>>     ... pcb_plot_params_keywords.o
>>>
>>>     If you don't see this, punt, go back to step 2.
>>>
>>>
>>>     4) force the damn file to be built, while still in that dir:
>>>     $ make pcb_plot_params_keywords.o
>>>
>>>
>>>     5) verify it was built and placed into <src>/pcbnew/pcb_plot_params.h
>>>
>>>
>>>     If not, send me your computer and $2,000.  :)
>>>
>>>
>>>     Dick
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>     _______________________________________________
>>>     Mailing list: https://launchpad.net/~kicad-developers
>>>     Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>>>     Unsubscribe : https://launchpad.net/~kicad-developers
>>>     More help   : https://help.launchpad.net/ListHelp
>>>
>>> _______________________________________________
>>> Mailing list: https://launchpad.net/~kicad-developers
>>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>> <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>> More help   : https://help.launchpad.net/ListHelp
>>
>> _______________________________________________
>> Mailing list: https://launchpad.net/~kicad-developers
>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>> <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>> Unsubscribe : https://launchpad.net/~kicad-developers
>> More help   : https://help.launchpad.net/ListHelp
> 
> 
> 
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help   : https://help.launchpad.net/ListHelp
> 



Follow ups

References