[CMake] Cross Compilation & Source file generators

Dave Flogeras dflogeras2 at gmail.com
Tue May 24 21:05:14 EDT 2016


Another "outside the box" solution that I have had success with is as
follows  (Note this solution will only work with Linux):

You can use the Linux binfmt_misc driver to execute non-native executables
through an interpreter.  If you google for qemu binfmt wrapper, you'll find
various suitable approaches, but basically, you register a wrapper
executable that calls binaries via qemu if the shell detects that it is of
a specific type (namely ARM elf).

After that, you can run the detected protoc "natively".  Note this also has
the side benefit of protoc will always match the version of the protobuf
headers.  I had earlier hacked my build system into finding my ARM
installaed protobuf headers, but using the native protoc, but it complained
because they weren't exactly the same version, which is unsupported under
protobuf IIRC.

Hope that helps,
Dave

On Tue, May 24, 2016 at 5:02 PM, Walter Gray <chrysalisx at gmail.com> wrote:

> @Hendrik - Yes, unfortunately it didn't help me too much.
> Superbuilds are not really an appropriate solution here - The project I'm
> working on is too heavily down an alternative path, and I'm trying to set
> up the exported .cmake files in the protobuf 3.0 beta to properly support
> any sort of option.
>
> I suppose the question I should have asked is 'When setting up exported
> package config files, what is the best way to handle the case where some
> users will want to mix and match components based on platform?'.
>
> The concept of a protobuf_PROTOC override variable would certainly do the
> job, but seems like a bit of a hack. I'd like to establish what the
> canonical 'best practice' for solving this problem should be in a way that
> supports using pre-built libraries.
>
> I'm thinking if I split the protobuf project's exports into 2 components,
> one for the libraries and one for protoc, I can have clients call
> find_package twice with different search paths and component lists, and add
> some checks to reject a match if, for example, someone targeting arm tries
> to link libraries compiled for mac.
>
> On Mon, May 23, 2016 at 5:17 AM David E DeMarle <dave.demarle at kitware.com>
> wrote:
>
>> Just to clarify, although ParaView's superbuild assists you to set up and
>> compile in either "compile TOOLS" or "CROSS compile" mode (or the default
>> "HOST" mode) the protobuf inclusion I was speaking of in is found within
>> paraview's source code and is not an external project.
>> See ${PVSOURCE}/ThirdParty/protobuf
>>
>> hope that helps
>>
>> On Saturday, May 21, 2016, Craig Scott <craig.scott at crascit.com> wrote:
>>
>>> There's also the technique described in this stack overflow
>>> question/answer:
>>>
>>>
>>> http://stackoverflow.com/questions/36084785/building-a-tool-immediately-so-it-can-be-used-later-in-same-cmake-run
>>>
>>> I'd probably recommend the superbuild approach used by Paraview though
>>> if your build can be structured that way. With the superbuild approach,
>>> it's a bit easier to tell what's going on. The method in the above link
>>> would only be better if you really needed to keep everything in the one
>>> single build.
>>>
>>>
>>>
>>>
>>> On Sat, May 21, 2016 at 11:10 PM, David E DeMarle <
>>> dave.demarle at kitware.com> wrote:
>>>
>>>> Take a look at paraview's internal copy of protobuf. We compile protoc
>>>> in the host tools pass and then use it when we build libprotobuf in the
>>>> cross compile pass.
>>>> On May 20, 2016 10:14 PM, "Walter Gray" <chrysalisx at gmail.com> wrote:
>>>>
>>>>> A small addendum - The way I am currently solving this problem is by
>>>>> replacing the version of protoc in the library folder for android with one
>>>>> that works on the host machine, but this is really not the best since it
>>>>> means that the library distribution is tied to the host AND the target.
>>>>>
>>>>> Thinking in terms of concepts, I think I would want a find_package
>>>>> that understood the difference between finding a package for executing and
>>>>> finding a package for linking, but that'd be a pretty fundamental change.
>>>>>
>>>>> On Fri, May 20, 2016 at 7:02 PM Walter Gray <chrysalisx at gmail.com>
>>>>> wrote:
>>>>>
>>>>>> I've got a project with a number of target platforms, including some
>>>>>> that I have to cross-compile to such as android, that uses protobuf. If
>>>>>> you're unfamiliar, the crux of the issue is that there is both a library,
>>>>>> libprotobuf, and an 'compiler', protoc, that takes .proto files and
>>>>>> generates a .h/.cc pair that are then included in the project.
>>>>>>
>>>>>> When cross compiling, want to use the libprotobuf that was compiled
>>>>>> on andriod, but the protoc that was compiled for my host environment. How
>>>>>> could this be achieved?
>>>>>>
>>>>>> Currently, my build machine has several different directories where I
>>>>>> store the external libraries that have been compiled for the various
>>>>>> platforms/compilers that we support (Libraries-arm32, Libraries-x64,
>>>>>> Libraries-x64-vc14, ect).
>>>>>>
>>>>>> Solutions that require modifying protobuf's -config.cmake file are
>>>>>> welcome, I've already submitted several PR's improving it. I'd like to
>>>>>> establish what the best practice for this kind of situation is as I have
>>>>>> the same issue with Flatbuffers.
>>>>>>
>>>>>> On a slightly unrelated note, is there some way to write something
>>>>>> like the AUTOUIC system without modifying cmake itself? It would be lovely
>>>>>> if all I had to do was include the .proto file in the source file list.
>>>>>>
>>>>>> Thanks!
>>>>>> Walter
>>>>>>
>>>>>
>>>>> --
>>>>>
>>>>> Powered by www.kitware.com
>>>>>
>>>>> Please keep messages on-topic and check the CMake FAQ at:
>>>>> http://www.cmake.org/Wiki/CMake_FAQ
>>>>>
>>>>> Kitware offers various services to support the CMake community. For
>>>>> more information on each offering, please visit:
>>>>>
>>>>> CMake Support: http://cmake.org/cmake/help/support.html
>>>>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>>>>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>>>>
>>>>> Visit other Kitware open-source projects at
>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://public.kitware.com/mailman/listinfo/cmake
>>>>>
>>>>
>>>> --
>>>>
>>>> Powered by www.kitware.com
>>>>
>>>> Please keep messages on-topic and check the CMake FAQ at:
>>>> http://www.cmake.org/Wiki/CMake_FAQ
>>>>
>>>> Kitware offers various services to support the CMake community. For
>>>> more information on each offering, please visit:
>>>>
>>>> CMake Support: http://cmake.org/cmake/help/support.html
>>>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>>>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.html
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://public.kitware.com/mailman/listinfo/cmake
>>>>
>>>
>>>
>>>
>>> --
>>> Craig Scott
>>> Melbourne, Australia
>>> http://crascit.com
>>>
>>
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20160524/8a5ac69a/attachment.html>


More information about the CMake mailing list