Folks:

Took about 30 minutes to put together a prototype of the great
`3rdparty` flattening. Please see the (extremely preliminary)
review[1] or my working branch[2] for a really close approximation of
the number of changes to the CMake build system we'd need to support
this flattening.

Overall, the changes are extremely small. We (apparently) did a pretty
good job of making the CMake configuration scripts modular and
consumable by arbitrary projects, so the changes are mostly things
like "move the config `include` call over there instead of being over
there" and "change a handful of path variables to reflect the new dir
structure". (I hope, btw, that it doesn't seem arrogant to say this,
but I think it is justified given the relatively minor changes in the
actual CMake code.)

Feel free to remix/take/throw away any subset of this. I don't need
any credit for it in the final patch if someone marches off in that
direction. :)

[1] https://reviews.apache.org/r/44099/
[2] https://github.com/hausdorff/mesos/commits/prototype_flattened_3rd

On Thu, Feb 18, 2016 at 12:22 PM, Kevin Klues <klue...@gmail.com> wrote:
> I am also a fan of git submodules in the long term, but avoiding them
> in the short term.  We should get things organized as we want them
> first, and then start thinking about pulling libprocess/stout out into
> submodules later (while also preserving their history!)
>
> I disagree with moving libprocess and stout up to the same level as
> src/. If we want to make sure they don't bleed into Mesos proper, we
> really should treat them the same as any other 3rdparty code that we
> depend on.  This will become more relevant when/if we move them into
> submodules.
>
> Given all that, the only real challenge with flattening our 3rdparty
> dependencies into a single folder should be the changes we have to
> make to our configure.ac and Makefile.am scripts to know where to look
> for their dependencies now.  In the end these should be URLs to
> versioned tarballs that we host somewhere (or git repos that we can
> have forked and tagged with specific versions).  In the short term
> these can just be relative paths in the mesos tree though.
>
> On Tue, Feb 16, 2016 at 1:26 PM, Kapil Arya <ka...@mesosphere.io> wrote:
>> Thanks for bringing it up Alexander!
>>
>> I don't have a strong opinion wrt git submodules since I don't have
>> much experience with them personally. Having said that, I would like
>> to go conservative on this one (baby steps :-) ).
>>
>> Further, I do understand that moving libprocess and stout directories
>> will be painful for people who already have several branches and will
>> have conflicts. But I do think, there are some interim solutions as
>> well (for example, move libprocess/stout to wherever we want, but keep
>> a symlink from 3rdparty/libprocess, etc, to those new locations for
>> some time). I am sure there are better solutions out there, but this
>> should work too.
>>
>> Best,
>> Kapil
>>
>> On Tue, Feb 16, 2016 at 12:38 PM, Erik Weathers
>> <eweath...@groupon.com.invalid> wrote:
>>> If we go to git submodules, please ensure there are good docs around how to
>>> update cloned repos.
>>>
>>> e.g., From ansible: https://docs.ansible.com/ansible/intro_installation.html
>>>
>>> Note when updating ansible, be sure to not only update the source tree, but
>>> also the “submodules” in git which point at Ansible’s own modules (not the
>>> same kind of modules, alas).
>>>
>>> $ git pull --rebase
>>> $ git submodule update --init --recursive
>>>
>>> Thanks,
>>>
>>> - Erik
>>>
>>> On Tue, Feb 16, 2016 at 8:54 AM, Alexander Rojas <alexan...@mesosphere.io>
>>> wrote:
>>>
>>>> +1
>>>> I am one who is totally in for that change. It is not only the directories
>>>> problem, but the structure which has led that the stout tests (which do
>>>> need to be compiled) are actually managed in the libprocess Makefile, on
>>>> top of all the things you have already mentioned.
>>>>
>>>>
>>>> > On 09 Feb 2016, at 17:53, Kapil Arya <ka...@mesosphere.io> wrote:
>>>> >
>>>> > On Tue, Feb 9, 2016 at 8:23 PM, Jie Yu <yujie....@gmail.com> wrote:
>>>> >> Kapil,
>>>> >>
>>>> >> I guess what I want to understand is why the existing structure makes it
>>>> >> hard for you to do the things that you want to do (installing
>>>> >> module-specific 3rdparty dependencies into "${pkglibdir}/3rdparty" as
>>>> part
>>>> >> of "make install").
>>>> >
>>>> > Let me see if I can answer that :-).
>>>> >
>>>> > This is somewhat related. For example, if we want to install protobuf
>>>> > in 3rdparty/{include,lib} (for module developers to use them without
>>>> > doing a proper mesos installation), you need to provide the correct
>>>> > "--prefix" flag that points to 3rdparty/. However, due to multiple
>>>> > levels of configure.ac, the "--prefix" can at best be generated by
>>>> > prepending "../../../" to get to the great-grandparent directory. This
>>>> > is because we have a separate configure.ac which manages
>>>> > 3rdparty/libprocess/3rdparty/Makefile.am. There are ways around it,
>>>> > but they are not clean.
>>>> >
>>>> > Similar thing holds for system-wide installation of these 3rdparty
>>>> > packages. For example, ideally, we would want to use
>>>> > "${pkglibdir}/3rdparty" as a prefix for those packages. However, since
>>>> > they are part of libprocess package, we don't get the correct
>>>> > directory and have to use either hardwired $pkglibdir, or somehow pass
>>>> > it from the top-level configure all the way down to
>>>> > 3rdparty/libprocess/3rdparty/Makefile.am :-(.
>>>> >
>>>> >
>>>> >> The only reason you mentioned in the original email is that "in the
>>>> current
>>>> >> code base, we don't strictly follow the 3rdparty structure", which IMO
>>>> is
>>>> >> not a very convincing reason for such a big change.
>>>> >
>>>> > How about a not so big change? :-). What if we just move
>>>> > 3rdparty/libprocess/3rdparty/* stuff out to 3rdparty/ while leaving
>>>> > stout as is? That is not a big change since we are not touching
>>>> > libprocess/stout. Just adjusting Makefiles and I am pretty sure it
>>>> > will be cleaner and simpler than what we have right now.
>>>> >
>>>> > As a later time, we can then consider moving stout out to 3rdparty/
>>>> > while leaving libprocess as is. But that's something we can decide
>>>> > later and leave stout as an exception for now.
>>>> >
>>>> > BTW, if we were to install all the 3rdparty packages in 3rdparty/,
>>>> > that would also cut down a lot on the compiler flags (i.e., fewer "-I"
>>>> > and "-L" flags) :-).
>>>> >
>>>> > Kapil
>>>> >
>>>> >>
>>>> >> - Jie
>>>> >>
>>>> >> On Tue, Feb 9, 2016 at 5:04 PM, Kapil Arya <ka...@mesosphere.io> wrote:
>>>> >>
>>>> >>> On Tue, Feb 9, 2016 at 7:20 PM, Jie Yu <yujie....@gmail.com> wrote:
>>>> >>>>
>>>> >>>>>
>>>> >>>>> However, in the current code base, we don't strictly follow the
>>>> >>> 3rdparty
>>>> >>>>> structure. For example, stout has a dependency on picojson and
>>>> >>>>> google-protobuf, but we don't put these two packages inside
>>>> >>>>> 3rdparty/libprocess/3rdparty/stout/3rdparty/.
>>>> >>>>
>>>> >>>>
>>>> >>>> My understanding is that stout is header only. So it does not have to
>>>> >>>> bundle 3rdparty libraries. The user of stout is responsible for
>>>> bundling
>>>> >>>> them if they are used.
>>>> >>>
>>>> >>>
>>>> >>> I don't think being header-only is an excuse to have a broken
>>>> >>> installation :-). Further, we don't make it easier for the user to get
>>>> >>> the 3rdparty binaries either. For example, if the user has a different
>>>> >>> version of protobuf installed on the system, the compilation of any
>>>> >>> program that uses stout will fail spectacularly!
>>>> >>>
>>>> >>> Having said that, the gist here is that we have somewhat deviated from
>>>> >>> original motivation behind the 3rdparty directory and it would be nice
>>>> >>> if we can have a flatter structure.
>>>> >>>
>>>> >>>>
>>>> >>>>
>>>> >>>> - Jie
>>>> >>>>
>>>> >>>> On Tue, Feb 9, 2016 at 4:14 PM, Kapil Arya <ka...@mesosphere.io>
>>>> wrote:
>>>> >>>>
>>>> >>>>> Hi All,
>>>> >>>>>
>>>> >>>>> TLDR: Move everything from 3rdparty/libprocess/3rdparty/* into
>>>> >>> 3rdparty/.
>>>> >>>>> (Optionally) Move libprocess/stout to the top-level directory.
>>>> >>>>>
>>>> >>>>> I wanted to start some discussion around reorganizing stuff inside
>>>> >>>>> "3rdparty". I apologize for the length of the email, please bear with
>>>> >>> me.
>>>> >>>>>
>>>> >>>>> Traditionally, 3rdparty has been used to hold all Mesos dependencies
>>>> >>>>> (zookeeper, libprocess, protobuf, stout, etc.). Further,
>>>> >>>>> libprocess/3rdparty was to hold all libprocess dependencies (which
>>>> may
>>>> >>> in
>>>> >>>>> turn be Mesos dependencies as well).
>>>> >>>>>
>>>> >>>>> As I understand, the original motivation was to emphasize that
>>>> >>> libprocess
>>>> >>>>> is an independent project which depends on "stout", which in turn is
>>>> >>> also
>>>> >>>>> an independent project.
>>>> >>>>>
>>>> >>>>> However, in the current code base, we don't strictly follow the
>>>> >>> 3rdparty
>>>> >>>>> structure. For example, stout has a dependency on picojson and
>>>> >>>>> google-protobuf, but we don't put these two packages inside
>>>> >>>>> 3rdparty/libprocess/3rdparty/stout/3rdparty/.
>>>> >>>>>
>>>> >>>>> In light of these anomalies, I want to propose that we flatten out
>>>> the
>>>> >>>>> 3rdparty directory and put all packages (libprocess, stout, protobuf,
>>>> >>>>> picojson, zookeeper, etc.) at the same level in 3rdparty. We can
>>>> still
>>>> >>> use
>>>> >>>>> "--with-XYZ=..." to the full extent as needed.
>>>> >>>>>
>>>> >>>>> To take it a step further, I want to propose that we bring libprocess
>>>> >>> and
>>>> >>>>> stout out of 3rdparty/ and move them at the top level (i.e., make
>>>> them
>>>> >>>>> peers of src/). That way, all code in 3rdparty/ is stuff from "third"
>>>> >>>>> parties and is used only when "--with-bundled" is defined (by
>>>> default).
>>>> >>>>> This hierarchy will still allow us to keep libprocess and stout as
>>>> >>> separate
>>>> >>>>> independent projects.
>>>> >>>>>
>>>> >>>>> The motivation for this proposal came when dealing with 3rdparty
>>>> >>>>> dependencies for module development. A module developer needs access
>>>> to
>>>> >>>>> protobuf, picojson, glog, etc., and for that matter, the exact
>>>> >>> versions of
>>>> >>>>> these packages that Mesos was compiled with.
>>>> >>>>>
>>>> >>>>> We want to solve this problem by installing module-specific 3rdparty
>>>> >>>>> dependencies into "${pkglibdir}/3rdparty" as part of "make install"
>>>> (if
>>>> >>>>> configured with something like
>>>> "--enable-install-module-dependencies").
>>>> >>>>> (There is a discussion going on in a separate thread).
>>>> >>>>>
>>>> >>>>> Further, as of today, when we install Mesos using "make install", we
>>>> >>>>> install stout headers in "${prefix}/include/stout". However, stout
>>>> has
>>>> >>>>> dependencies on picojson[1] and google-protobuf headers which may not
>>>> >>> be
>>>> >>>>> present on the machine. This leaves stout, and in turn libprocess and
>>>> >>> Mesos
>>>> >>>>> headers, fairly broken. I understand that this issue is somewhat
>>>> >>> orthogonal
>>>> >>>>> to the main issue being discussed in this mail, but I wanted to put
>>>> it
>>>> >>> out
>>>> >>>>> since it's related.
>>>> >>>>>
>>>> >>>>> Any thoughts, comments, concerns are most welcome!
>>>> >>>>>
>>>> >>>>> Best,
>>>> >>>>> Kapil
>>>> >>>>>
>>>> >>>>>
>>>> >>>>> [1]: Picojson issue was resolved as part of
>>>> >>>>> https://reviews.apache.org/r/41424/ which installs picojson.h into
>>>> the
>>>> >>>>> include-dir.
>>>> >>>>>
>>>> >>>
>>>>
>>>>
>
>
>
> --
> ~Kevin



-- 
Alex

Theory is the first term in the Taylor series of practice. -- Thomas M
Cover (1992)

Reply via email to