gradle-native icon indicating copy to clipboard operation
gradle-native copied to clipboard

cpp-library plugin needs suport for cross-compiling for Arm

Open swpalmer opened this issue 6 years ago • 5 comments

The older c and cpp plugins could be configured with custom tool chains to support building for linux-arm on linux x86_64. The new preferred cpp-library needs this ability.

Expected Behavior

I should be able to add target machines such as:

  library {
    targetMachines = [
      machines.linux.x86, machines.linux.x86_64,  // Linux Intel 32/64-bit
      machines.linux.arm, machines.linux.aarch64  // Linux Arm 32/64-bit
    ]
  }

A new mechanism is needed to define a new machine type or specify the tool chain for a type.

Current Behavior

We can't cross-compile for Arm currently

Context

I want to avoid the old c and cpp plugins (which are very complicated to configure) and adopt the new cpp-library plugin, but I have existing code and future needs to build the same project on Linux, Windows and macOS, both 32- and 64-bit for Linux and windows in addition to 32 and 64-bit Arm for Linux.

I am building for an application framework that uses the same source code for desktops and embedded devices.

Your Environment

Windows 10 64-bit Intel Linux (Ubuntu/CentOS) 64-bit Intel, targeting both Intel and Arm macOS

swpalmer avatar Feb 20 '19 15:02 swpalmer

+1 . Does anyone have a workaround?

bmeike avatar Feb 28 '19 01:02 bmeike

+1 Also need this. All our current builds use the component model and cross compile for arm. We'd like to start migrating to the new plugins.

For anyone who is interested, I was able to compile a hello world program for arm using the new Gradle cpp-application plugin and clang. I'm not suggesting this is a good solution, but it did compile an arm binary.

#Dockerfile:


FROM ubuntu:bionic

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -qq -y
clang
openjdk-11-jdk
g++-aarch64-linux-gnu
gcc-aarch64-linux-gnu
g++-7-aarch64-linux-gnu
gcc-7-aarch64-linux-gnu
gcc-7-multilib
g++-7-multilib
lld-6.0
&& rm -rf /var/lib/apt/lists/*


#build.gradle


plugins { id 'cpp-application' }

application { binaries.configureEach { def compileTask = compileTask.get() def linkTask = linkTask.get()

if (toolChain instanceof Clang) {
  compileTask.compilerArgs = ["-fuse-ld=lld", "--sysroot", "/usr/aarch64-linux-gnu", "-I/usr/aarch64-linux-gnu/include/c++/7/aarch64-linux-gnu", "-march=armv8-a", "-static", "-target", "aarch64-linux-gnueabi"]
  linkTask.linkerArgs = ["-fuse-ld=lld", "--sysroot", "/usr/aarch64-linux-gnu", "-I/usr/aarch64-linux-gnu/include/c++/7/aarch64-linux-gnu", "-march=armv8-a", "-static", "-target", "aarch64-linux-gnueabi"]
}

} }


ddresser avatar Apr 12 '19 16:04 ddresser

Does anyone have a workaround?

My workaround is to use the old "cpp" plugin from Gradle 4 instead of "cpp-library". It's routine to define new platforms in the "cpp" plugin, whereas "cpp-library" seems to be limited to 6 hardcoded ones.

Also note that the Android plugins handle ARM architectures, so it's surprising that "cpp-library" can't!

stephengold avatar Jan 21 '22 19:01 stephengold

This is how I do it based on many helpful hints from @lacasseio and others:

https://github.com/pedrolamarao/psys/blob/master/buildSrc/src/main/groovy/toolchain.groovy

pedrolamarao avatar Jan 21 '22 21:01 pedrolamarao

@pedrolamarao It looks like that is using a different plugin 'dev.nokee.cpp-library' not 'cpp-library'

swpalmer avatar Jan 24 '22 19:01 swpalmer