From 09c7709205b1f864fa8d0b929b8d68154f2b595e Mon Sep 17 00:00:00 2001 From: Dexton Anderson Date: Thu, 14 Nov 2024 12:02:27 -0600 Subject: [PATCH 1/6] Add soemJavaNativeLibrary --- .../us/ihmc/etherCAT/master/FoEBootstrap.java | 14 ++++---- .../java/us/ihmc/etherCAT/master/Master.java | 4 +-- .../us/ihmc/etherCAT/master/SlaveInfo.java | 12 +++---- .../ihmc/etherCAT/soemJavaNativeLibrary.java | 36 +++++++++++++++++++ 4 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 src/main/java/us/ihmc/etherCAT/soemJavaNativeLibrary.java diff --git a/src/main/java/us/ihmc/etherCAT/master/FoEBootstrap.java b/src/main/java/us/ihmc/etherCAT/master/FoEBootstrap.java index 19ecf84..0833ddb 100644 --- a/src/main/java/us/ihmc/etherCAT/master/FoEBootstrap.java +++ b/src/main/java/us/ihmc/etherCAT/master/FoEBootstrap.java @@ -1,18 +1,18 @@ package us.ihmc.etherCAT.master; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.HashMap; - import us.ihmc.etherCAT.master.Mailbox.MailboxConfiguration; +import us.ihmc.etherCAT.soemJavaNativeLibrary; import us.ihmc.soem.generated.ec_err_type; import us.ihmc.soem.generated.ec_slavet; import us.ihmc.soem.generated.ec_state; import us.ihmc.soem.generated.ecx_context; import us.ihmc.soem.generated.soem; import us.ihmc.soem.generated.soemConstants; -import us.ihmc.tools.nativelibraries.NativeLibraryLoader; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.HashMap; /** * Standalone implementation for File over EtherCAT in BOOT mode @@ -24,7 +24,7 @@ public class FoEBootstrap { static { - NativeLibraryLoader.loadLibrary("us.ihmc.soem.generated", "soemJava"); + soemJavaNativeLibrary.load(); } private class SlaveConfig diff --git a/src/main/java/us/ihmc/etherCAT/master/Master.java b/src/main/java/us/ihmc/etherCAT/master/Master.java index c1c7cff..40d5fb9 100644 --- a/src/main/java/us/ihmc/etherCAT/master/Master.java +++ b/src/main/java/us/ihmc/etherCAT/master/Master.java @@ -3,6 +3,7 @@ import us.ihmc.etherCAT.master.EtherCATStatusCallback.TRACE_EVENT; import us.ihmc.etherCAT.master.exception.SlavesNotConfiguredException; import us.ihmc.etherCAT.master.exception.SlavesOfflineException; +import us.ihmc.etherCAT.soemJavaNativeLibrary; import us.ihmc.soem.generated.ec_slavet; import us.ihmc.soem.generated.ec_smt; import us.ihmc.soem.generated.ec_state; @@ -10,7 +11,6 @@ import us.ihmc.soem.generated.ecx_portt; import us.ihmc.soem.generated.soem; import us.ihmc.soem.generated.soemConstants; -import us.ihmc.tools.nativelibraries.NativeLibraryLoader; import java.io.IOException; import java.nio.ByteBuffer; @@ -38,7 +38,7 @@ public class Master implements MasterInterface static { - NativeLibraryLoader.loadLibrary("us.ihmc.soem.generated", "soemJava"); + soemJavaNativeLibrary.load(); } private static boolean initialized = false; diff --git a/src/main/java/us/ihmc/etherCAT/master/SlaveInfo.java b/src/main/java/us/ihmc/etherCAT/master/SlaveInfo.java index fa788d6..9170ebc 100644 --- a/src/main/java/us/ihmc/etherCAT/master/SlaveInfo.java +++ b/src/main/java/us/ihmc/etherCAT/master/SlaveInfo.java @@ -1,15 +1,15 @@ package us.ihmc.etherCAT.master; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - +import us.ihmc.etherCAT.soemJavaNativeLibrary; import us.ihmc.soem.generated.ec_slavet; import us.ihmc.soem.generated.ec_smt; import us.ihmc.soem.generated.ecx_context; import us.ihmc.soem.generated.soem; import us.ihmc.soem.generated.soemConstants; -import us.ihmc.tools.nativelibraries.NativeLibraryLoader; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; /** * Simple application to print basic information about the detected slave configuration @@ -24,7 +24,7 @@ public class SlaveInfo static { - NativeLibraryLoader.loadLibrary("us.ihmc.soem.generated", "soemJava"); + soemJavaNativeLibrary.load(); } public static String hex(long n) diff --git a/src/main/java/us/ihmc/etherCAT/soemJavaNativeLibrary.java b/src/main/java/us/ihmc/etherCAT/soemJavaNativeLibrary.java new file mode 100644 index 0000000..a694619 --- /dev/null +++ b/src/main/java/us/ihmc/etherCAT/soemJavaNativeLibrary.java @@ -0,0 +1,36 @@ +package us.ihmc.etherCAT; + +import us.ihmc.tools.nativelibraries.NativeLibraryDescription; +import us.ihmc.tools.nativelibraries.NativeLibraryLoader; +import us.ihmc.tools.nativelibraries.NativeLibraryWithDependencies; + +public class soemJavaNativeLibrary implements NativeLibraryDescription +{ + @Override + public String getPackage(OperatingSystem os, Architecture arch) + { + return "us.ihmc.soem.generated"; + } + + @Override + public NativeLibraryWithDependencies getLibraryWithDependencies(OperatingSystem os, Architecture arch) + { + if (os == OperatingSystem.LINUX64) + { + return NativeLibraryWithDependencies.fromFilename("libsoemJava.so"); + } + throw new RuntimeException("Unsupported platform: " + os.name() + "-" + arch.name()); + } + + private static boolean loaded = false; + + public static boolean load() + { + if (!loaded) + { + soemJavaNativeLibrary lib = new soemJavaNativeLibrary(); + loaded = NativeLibraryLoader.loadLibrary(lib); + } + return loaded; + } +} \ No newline at end of file From ad2a54dc0e1c9c8115ec06abd5ab29fe47a75e19 Mon Sep 17 00:00:00 2001 From: Dexton Anderson Date: Mon, 18 Nov 2024 15:41:53 -0600 Subject: [PATCH 2/6] Use separate libraries for x86_64 and arm64 --- build.gradle.kts | 4 +- .../ihmc/etherCAT/soemJavaNativeLibrary.java | 8 +++- swig/build.gradle.kts.in | 5 ++- swig/settings.gradle.kts.in | 44 ++++++++----------- swig/us/ihmc/soem/generated/CMakeLists.txt | 27 +++++++++--- 5 files changed, 50 insertions(+), 38 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c74dd4d..2a56ee8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,8 +17,8 @@ ihmc { app.entrypoint("SlaveInfo", "us.ihmc.etherCAT.master.SlaveInfo") mainDependencies { - api("us.ihmc:soem:1.4.0-ihmc1") - api("us.ihmc:soem-platform-linux:1.4.0-ihmc1") + api("us.ihmc:soem:1.5.0") + api("us.ihmc:soem-platform-linux-x86_64:1.5.0") api("us.ihmc:ihmc-native-library-loader:2.0.3") api("us.ihmc:ihmc-realtime:1.6.0") } diff --git a/src/main/java/us/ihmc/etherCAT/soemJavaNativeLibrary.java b/src/main/java/us/ihmc/etherCAT/soemJavaNativeLibrary.java index a694619..e953f1e 100644 --- a/src/main/java/us/ihmc/etherCAT/soemJavaNativeLibrary.java +++ b/src/main/java/us/ihmc/etherCAT/soemJavaNativeLibrary.java @@ -15,9 +15,13 @@ public String getPackage(OperatingSystem os, Architecture arch) @Override public NativeLibraryWithDependencies getLibraryWithDependencies(OperatingSystem os, Architecture arch) { - if (os == OperatingSystem.LINUX64) + if (os == OperatingSystem.LINUX64 && arch == Architecture.x64) { - return NativeLibraryWithDependencies.fromFilename("libsoemJava.so"); + return NativeLibraryWithDependencies.fromFilename("libsoemJava-x86_64.so"); + } + else if (os == OperatingSystem.LINUX64 && arch == Architecture.arm64) + { + return NativeLibraryWithDependencies.fromFilename("libsoemJava-arm64.so"); } throw new RuntimeException("Unsupported platform: " + os.name() + "-" + arch.name()); } diff --git a/swig/build.gradle.kts.in b/swig/build.gradle.kts.in index 025dafd..8355f28 100644 --- a/swig/build.gradle.kts.in +++ b/swig/build.gradle.kts.in @@ -5,7 +5,7 @@ plugins { ihmc { group = "us.ihmc" - version = "1.4.0-ihmc1" + version = "1.5.0" vcsUrl = "https://github.com/ihmcrobotics/ihmc-ethercat-master" openSource = true @@ -43,7 +43,8 @@ sourceSets { main { resources{ srcDir("swig/") - include("**/libsoemJava.so") + include("**/libsoemJava-x86_64.so") + include("**/libsoemJava-arm64.so") exclude("**/CMakeFiles") } } diff --git a/swig/settings.gradle.kts.in b/swig/settings.gradle.kts.in index c6746c5..c2e61c9 100644 --- a/swig/settings.gradle.kts.in +++ b/swig/settings.gradle.kts.in @@ -33,29 +33,23 @@ if((target != "JAVA" && target != "PLATFORM")) else { - if(target == "JAVA") - { - rootProject.name="soem" - } - else - { - - if(OperatingSystem.current().isWindows()) - { - rootProject.name="soem-platform-windows" - } - else if (OperatingSystem.current().isLinux()) - { - rootProject.name="soem-platform-linux" - } - else if (OperatingSystem.current().isMacOsX()) - { - rootProject.name="soem-platform-mac" - } - else - { - throw GradleException("Current platform is not supported") - } - - } + if (target == "JAVA") + { + rootProject.name="soem" + } + else + { + if (OperatingSystem.current().isLinux() && System.getProperty("os.arch") == "aarch64") + { + rootProject.name="soem-platform-linux-arm64" + } + else if (OperatingSystem.current().isLinux() && System.getProperty("os.arch") == "amd64") + { + rootProject.name="soem-platform-linux-x86_64" + } + else + { + throw GradleException("Current platform is not supported") + } + } } diff --git a/swig/us/ihmc/soem/generated/CMakeLists.txt b/swig/us/ihmc/soem/generated/CMakeLists.txt index bd81139..5f3f72f 100644 --- a/swig/us/ihmc/soem/generated/CMakeLists.txt +++ b/swig/us/ihmc/soem/generated/CMakeLists.txt @@ -2,13 +2,26 @@ cmake_minimum_required(VERSION 2.8) find_package(JNI REQUIRED) include_directories(${JNI_INCLUDE_DIRS}) -FIND_PACKAGE(SWIG REQUIRED) -INCLUDE(${SWIG_USE_FILE}) +find_package(SWIG REQUIRED) +include(${SWIG_USE_FILE}) -INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/swig/") -INCLUDE_DIRECTORIES("/usr/include/soem") +include_directories("${PROJECT_SOURCE_DIR}/swig/") +include_directories("/usr/include/soem") -SET_PROPERTY(SOURCE soem.i PROPERTY SWIG_FLAGS "-package" "us.ihmc.soem.generated") +set_property(SOURCE soem.i PROPERTY SWIG_FLAGS "-package" "us.ihmc.soem.generated") -SWIG_ADD_MODULE(soemJava java soem.i) -swig_link_libraries(soemJava ihmcsoemwrapper) +if(UNIX AND NOT APPLE) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") + set(LIBRARY_NAME "soemJava-x86_64") + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + set(LIBRARY_NAME "soemJava-arm64") + else() + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}") + endif() +else() + message(FATAL_ERROR "This CMake configuration is only for Linux.") +endif() + +# Add SWIG module with the architecture-specific library name +swig_add_module(${LIBRARY_NAME} java soem.i) +swig_link_libraries(${LIBRARY_NAME} ihmcsoemwrapper) From e4f03c54987e35940294cacab4dc23b591b1b2ff Mon Sep 17 00:00:00 2001 From: Dexton Anderson Date: Mon, 18 Nov 2024 16:20:51 -0600 Subject: [PATCH 3/6] Cross compilation fixes --- linux-aarch64-toolchain.cmake | 8 ++++++++ readme.md | 19 +++++++++++-------- swig/CMakeLists.txt | 2 +- swig/settings.gradle.kts.in | 2 +- swig/us/ihmc/soem/generated/CMakeLists.txt | 8 +++++--- 5 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 linux-aarch64-toolchain.cmake diff --git a/linux-aarch64-toolchain.cmake b/linux-aarch64-toolchain.cmake new file mode 100644 index 0000000..7006d62 --- /dev/null +++ b/linux-aarch64-toolchain.cmake @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10) + +set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) +set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu) +set(CMAKE_PROGRAM_PATH /usr/aarch64-linux-gnu/bin) + +set(ENV{AARCH64_CROSS} "1") diff --git a/readme.md b/readme.md index 2fa9dea..0557965 100644 --- a/readme.md +++ b/readme.md @@ -131,14 +131,17 @@ The gradle build files for the SOEM wrapper and native libraries are created by To build and publish run the following commands. Note that the gradle commands are ran from within the build directory. - -- cd ihmc-ethercat-master -- mkdir build -- cd build -- cmake -DCMAKE_BUILD_TYPE=Release .. -- make -- ../gradlew publishToMavenLocal -Ptarget=JAVA -- ../gradlew publishToMavenLocal -Ptarget=PLATFORM +``` +cd ihmc-ethercat-master +mkdir build +cd build +cmake -DCMAKE_BUILD_TYPE=Release .. +# Cross compile for arm64 using the toolchain +# cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../linux-aarch64-toolchain.cmake .. +make +../gradlew publishToMavenLocal -Ptarget=JAVA +../gradlew publishToMavenLocal -Ptarget=PLATFORM +``` Note that if you want to publish multiple platform libraries you only have to run target=JAVA on a single platform diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt index 0d6a011..860ab87 100644 --- a/swig/CMakeLists.txt +++ b/swig/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.4) +cmake_minimum_required(VERSION 3.10) set(CMAKE_POSITION_INDEPENDENT_CODE true) diff --git a/swig/settings.gradle.kts.in b/swig/settings.gradle.kts.in index c2e61c9..718320c 100644 --- a/swig/settings.gradle.kts.in +++ b/swig/settings.gradle.kts.in @@ -39,7 +39,7 @@ else } else { - if (OperatingSystem.current().isLinux() && System.getProperty("os.arch") == "aarch64") + if (OperatingSystem.current().isLinux() && (System.getProperty("os.arch") == "aarch64" || System.getenv("AARCH64_CROSS") != null)) { rootProject.name="soem-platform-linux-arm64" } diff --git a/swig/us/ihmc/soem/generated/CMakeLists.txt b/swig/us/ihmc/soem/generated/CMakeLists.txt index 5f3f72f..bc04e5d 100644 --- a/swig/us/ihmc/soem/generated/CMakeLists.txt +++ b/swig/us/ihmc/soem/generated/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.10) find_package(JNI REQUIRED) include_directories(${JNI_INCLUDE_DIRS}) @@ -11,9 +11,11 @@ include_directories("/usr/include/soem") set_property(SOURCE soem.i PROPERTY SWIG_FLAGS "-package" "us.ihmc.soem.generated") if(UNIX AND NOT APPLE) - if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") + if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" AND NOT DEFINED ENV{AARCH64_CROSS}) + message(STATUS "Using target platform x86_64") set(LIBRARY_NAME "soemJava-x86_64") - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR DEFINED ENV{AARCH64_CROSS}) + message(STATUS "Using target platform arm64") set(LIBRARY_NAME "soemJava-arm64") else() message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}") From 2ce4bef49b51e82ae0c13d1e6f90b7b13c52579b Mon Sep 17 00:00:00 2001 From: Dexton Anderson Date: Mon, 18 Nov 2024 16:21:22 -0600 Subject: [PATCH 4/6] Cross compilation fixes --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index 2a56ee8..0866cc8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,6 +19,7 @@ app.entrypoint("SlaveInfo", "us.ihmc.etherCAT.master.SlaveInfo") mainDependencies { api("us.ihmc:soem:1.5.0") api("us.ihmc:soem-platform-linux-x86_64:1.5.0") + api("us.ihmc:soem-platform-linux-arm64:1.5.0") api("us.ihmc:ihmc-native-library-loader:2.0.3") api("us.ihmc:ihmc-realtime:1.6.0") } From b1749d0e0b05769339083fb07fb452875d696361 Mon Sep 17 00:00:00 2001 From: Dexton Anderson Date: Mon, 18 Nov 2024 16:53:25 -0600 Subject: [PATCH 5/6] Change cmake_minimum_required --- CMakeLists.txt | 2 +- linux-aarch64-toolchain.cmake | 2 +- swig/CMakeLists.txt | 2 +- swig/us/ihmc/soem/generated/CMakeLists.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 35c465f..a2574c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.5.1) project(ihmcsoemwrapper) add_subdirectory(swig) diff --git a/linux-aarch64-toolchain.cmake b/linux-aarch64-toolchain.cmake index 7006d62..09a745c 100644 --- a/linux-aarch64-toolchain.cmake +++ b/linux-aarch64-toolchain.cmake @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.5.1) set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt index 860ab87..152f139 100644 --- a/swig/CMakeLists.txt +++ b/swig/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.5.1) set(CMAKE_POSITION_INDEPENDENT_CODE true) diff --git a/swig/us/ihmc/soem/generated/CMakeLists.txt b/swig/us/ihmc/soem/generated/CMakeLists.txt index bc04e5d..0dd0bfb 100644 --- a/swig/us/ihmc/soem/generated/CMakeLists.txt +++ b/swig/us/ihmc/soem/generated/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.5.1) find_package(JNI REQUIRED) include_directories(${JNI_INCLUDE_DIRS}) From db43415e1cc980c8d8ca1754bf18bf28be6075c3 Mon Sep 17 00:00:00 2001 From: Dexton Anderson Date: Tue, 19 Nov 2024 10:32:23 -0600 Subject: [PATCH 6/6] Fixup docker images and build scripts --- Dockerfile | 70 ---------------------------------- Dockerfile-arm64_cross | 72 +++++++++++++++++++++++++++++++++++ Dockerfile-x86_64 | 62 ++++++++++++++++++++++++++++++ build-arm64_cross.sh | 11 ++++++ build.sh => build-x86_64.sh | 12 ++---- buildDockerImages.sh | 3 ++ buildWithDocker.sh | 75 ++++++++++++++++++++++--------------- readme.md | 14 +------ settings.gradle.kts | 4 +- swig/settings.gradle.kts.in | 4 +- 10 files changed, 203 insertions(+), 124 deletions(-) delete mode 100644 Dockerfile create mode 100644 Dockerfile-arm64_cross create mode 100644 Dockerfile-x86_64 create mode 100755 build-arm64_cross.sh rename build.sh => build-x86_64.sh (65%) mode change 100644 => 100755 create mode 100755 buildDockerImages.sh diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index e172120..0000000 --- a/Dockerfile +++ /dev/null @@ -1,70 +0,0 @@ -# An image for building the EtherCAT master natives. -# Current version: 0.2 -FROM ubuntu:xenial - -ARG DEBIAN_FRONTEND=noninteractive - -RUN apt-get --quiet 2 --yes update \ - && apt-get --quiet 2 --yes install \ - nano \ - git \ - wget \ - curl \ - unzip \ - locales \ - apt-transport-https \ - ca-certificates \ - curl \ - software-properties-common \ - sudo \ - build-essential \ - swig \ - cmake \ - openjdk-8-jdk \ - > /dev/null \ - && rm -rf /var/lib/apt/lists/* - -RUN locale-gen en_US.UTF-8 -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 - -# Install Gradle -#ARG gradleVersion=7.3.3 -#RUN curl -sL https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip -o gradle.zip -#RUN unzip -q gradle.zip -d gradle -#RUN mv gradle/gradle-$gradleVersion/ /opt/. -#RUN ln -s /opt/gradle-$gradleVersion/ /opt/gradle -#RUN ln -s /opt/gradle/bin/gradle /usr/bin/gradle - -RUN apt-add-repository --yes ppa:halodirobotics/ppa \ - && apt-get --quiet 2 --yes update \ - && apt-get --quiet 2 --yes install \ - soem \ - > /dev/null \ - && rm -rf /var/lib/apt/lists/* - -# Setup a robotlab user as the development user, to avoid using root. -# Allows using sudo with robotlab user without a password. -RUN addgroup robotlab \ - && adduser --home /home/robotlab --gecos "Rosie Robot,1117,1234567,2345678" --ingroup robotlab --disabled-password robotlab \ - && chown -R robotlab /home/robotlab \ - && adduser robotlab sudo \ - && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers -USER robotlab -WORKDIR /home/robotlab - -RUN mkdir -p /home/robotlab/.gradle -RUN echo "org.gradle.java.home=/usr/lib/jvm/java-8-openjdk-amd64" > /home/robotlab/.gradle/gradle.properties -ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 - -RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/build -RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/src -RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/swig -VOLUME /home/robotlab/dev/ihmc-ethercat-master/build -VOLUME /home/robotlab/dev/ihmc-ethercat-master/src -VOLUME /home/robotlab/dev/ihmc-ethercat-master/swig -WORKDIR /home/robotlab/dev/ihmc-ethercat-master - -ENTRYPOINT ["/bin/bash"] -CMD ["build.sh"] diff --git a/Dockerfile-arm64_cross b/Dockerfile-arm64_cross new file mode 100644 index 0000000..14e9b0d --- /dev/null +++ b/Dockerfile-arm64_cross @@ -0,0 +1,72 @@ +# Do not publish to dockerhub +FROM ubuntu:20.04 + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt-get --yes update \ + && apt-get --yes install \ + nano \ + git \ + wget \ + curl \ + unzip \ + locales \ + apt-transport-https \ + ca-certificates \ + curl \ + software-properties-common \ + sudo \ + build-essential \ + swig \ + cmake \ + openjdk-17-jdk \ + gcc-aarch64-linux-gnu \ + binutils-aarch64-linux-gnu \ + g++-aarch64-linux-gnu \ + && rm -rf /var/lib/apt/lists/* + +RUN locale-gen en_US.UTF-8 +ENV LANG=en_US.UTF-8 +ENV LANGUAGE=en_US:en +ENV LC_ALL=en_US.UTF-8 + +ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 +ENV PATH=$PATH:$JAVA_HOME/bin + +# Installing SOEM +WORKDIR /opt +RUN git clone https://github.com/OpenEtherCATsociety/SOEM.git +WORKDIR /opt/SOEM +RUN mkdir build && cd build +WORKDIR /opt/SOEM/build +RUN cmake -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \ + -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \ + -DCMAKE_FIND_ROOT_PATH=/usr/aarch64-linux-gnu \ + -DCMAKE_PROGRAM_PATH=/usr/aarch64-linux-gnu/bin \ + -DHOST_INSTALL="" -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_POSITION_INDEPENDENT_CODE=true \ + -DCMAKE_BUILD_TYPE=Release \ + .. +RUN make +RUN make install + +# Setup a robotlab user as the development user, to avoid using root. +# Allows using sudo with robotlab user without a password. +RUN addgroup robotlab \ + && adduser --uid 1000 --gid 1000 --home /home/robotlab --disabled-password robotlab \ + && chown -R robotlab /home/robotlab \ + && adduser robotlab sudo \ + && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers +USER robotlab +WORKDIR /home/robotlab + +RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/build +RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/src +RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/swig +VOLUME /home/robotlab/dev/ihmc-ethercat-master/build +VOLUME /home/robotlab/dev/ihmc-ethercat-master/src +VOLUME /home/robotlab/dev/ihmc-ethercat-master/swig +WORKDIR /home/robotlab/dev/ihmc-ethercat-master + +ENTRYPOINT ["/bin/bash"] +CMD ["build-arm64_cross.sh"] diff --git a/Dockerfile-x86_64 b/Dockerfile-x86_64 new file mode 100644 index 0000000..7af2e7e --- /dev/null +++ b/Dockerfile-x86_64 @@ -0,0 +1,62 @@ +# Do not publish to dockerhub +FROM ubuntu:20.04 + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt-get --yes update \ + && apt-get --yes install \ + nano \ + git \ + wget \ + curl \ + unzip \ + locales \ + apt-transport-https \ + ca-certificates \ + curl \ + software-properties-common \ + sudo \ + build-essential \ + swig \ + cmake \ + openjdk-17-jdk \ + && rm -rf /var/lib/apt/lists/* + +RUN locale-gen en_US.UTF-8 +ENV LANG=en_US.UTF-8 +ENV LANGUAGE=en_US:en +ENV LC_ALL=en_US.UTF-8 + +ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 +ENV PATH=$PATH:$JAVA_HOME/bin + +# Installing SOEM +WORKDIR /opt +RUN git clone https://github.com/OpenEtherCATsociety/SOEM.git +WORKDIR /opt/SOEM +RUN mkdir build && cd build +WORKDIR /opt/SOEM/build +RUN cmake -DHOST_INSTALL="" -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_POSITION_INDEPENDENT_CODE=true -DCMAKE_BUILD_TYPE=Release .. +RUN make +RUN make install + +# Setup a robotlab user as the development user, to avoid using root. +# Allows using sudo with robotlab user without a password. +RUN addgroup robotlab \ + && adduser --uid 1000 --gid 1000 --home /home/robotlab --disabled-password robotlab \ + && chown -R robotlab /home/robotlab \ + && adduser robotlab sudo \ + && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers +USER robotlab +WORKDIR /home/robotlab + +RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/build +RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/src +RUN mkdir -p /home/robotlab/dev/ihmc-ethercat-master/swig +VOLUME /home/robotlab/dev/ihmc-ethercat-master/build +VOLUME /home/robotlab/dev/ihmc-ethercat-master/src +VOLUME /home/robotlab/dev/ihmc-ethercat-master/swig +WORKDIR /home/robotlab/dev/ihmc-ethercat-master + +ENTRYPOINT ["/bin/bash"] +CMD ["build-x86_64.sh"] diff --git a/build-arm64_cross.sh b/build-arm64_cross.sh new file mode 100755 index 0000000..7f7f69b --- /dev/null +++ b/build-arm64_cross.sh @@ -0,0 +1,11 @@ +#!/bin/sh +export AARCH64_CROSS=1 + +# Build for arm64 +mkdir -p build +cd build +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../linux-aarch64-toolchain.cmake .. +make +../gradlew publishToMavenLocal -Ptarget=JAVA +../gradlew publishToMavenLocal -Ptarget=PLATFORM +cd .. diff --git a/build.sh b/build-x86_64.sh old mode 100644 new mode 100755 similarity index 65% rename from build.sh rename to build-x86_64.sh index df4e605..2d3fda6 --- a/build.sh +++ b/build-x86_64.sh @@ -1,13 +1,9 @@ -#!/bin/bash -# Uncomment for debugging this script -set -o xtrace - +#!/bin/sh +# Build for native platform (probably x86_64) +mkdir -p build cd build - cmake -DCMAKE_BUILD_TYPE=Release .. make - -pwd -ls .. ../gradlew publishToMavenLocal -Ptarget=JAVA ../gradlew publishToMavenLocal -Ptarget=PLATFORM +cd .. diff --git a/buildDockerImages.sh b/buildDockerImages.sh new file mode 100755 index 0000000..83ac55d --- /dev/null +++ b/buildDockerImages.sh @@ -0,0 +1,3 @@ +#!/bin/sh +docker build -f Dockerfile-x86_64 -t ihmcrobotics/soem-compile-x86_64:0.1 . +docker build -f Dockerfile-arm64_cross -t ihmcrobotics/soem-compile-arm64_cross:0.1 . diff --git a/buildWithDocker.sh b/buildWithDocker.sh index b925127..e91b5e2 100755 --- a/buildWithDocker.sh +++ b/buildWithDocker.sh @@ -1,34 +1,49 @@ -#!/bin/bash -# Uncomment for debugging this script -set -o xtrace +#!/bin/sh +rm -rf buildDocker +mkdir -p buildDocker -# Make sure it works one way or the other to reduce possible errors -if (( EUID == 0 )); then - echo "Run without sudo." 1>&2 - exit 1 -fi +echo "Building soemJava x86_64" +sudo docker run \ + --rm \ + --tty \ + --interactive \ + --network host \ + --dns=1.1.1.1 \ + --volume "$(pwd)/buildDocker":/home/robotlab/dev/ihmc-ethercat-master/build \ + --volume "$(pwd)/src":/home/robotlab/dev/ihmc-ethercat-master/src \ + --volume "$(pwd)/swig":/home/robotlab/dev/ihmc-ethercat-master/swig \ + --volume "$(pwd)/build.gradle.kts":/home/robotlab/dev/ihmc-ethercat-master/build.gradle.kts \ + --volume "$(pwd)/gradle.properties":/home/robotlab/dev/ihmc-ethercat-master/gradle.properties \ + --volume "$(pwd)/settings.gradle.kts":/home/robotlab/dev/ihmc-ethercat-master/settings.gradle.kts \ + --volume "$(pwd)/CMakeLists.txt":/home/robotlab/dev/ihmc-ethercat-master/CMakeLists.txt \ + --volume "$(pwd)/build-x86_64.sh":/home/robotlab/dev/ihmc-ethercat-master/build-x86_64.sh \ + --volume "$(pwd)/gradlew":/home/robotlab/dev/ihmc-ethercat-master/gradlew \ + --volume "$(pwd)/gradle/wrapper":/home/robotlab/dev/ihmc-ethercat-master/gradle/wrapper \ + --volume "$HOME/.m2":/home/robotlab/.m2 \ + ihmcrobotics/soem-compile-x86_64:0.1 +sleep 1 +rm -rf buildDocker mkdir -p buildDocker +sleep 1 -if [ ! "$(sudo -u root docker ps -a | grep ethercat-master)" ]; then - echo "ethercat-master not found. Running new container." - sudo -u root docker run \ - --tty \ - --interactive \ - --name ethercat-master \ - --network host \ - --dns=1.1.1.1 \ - --volume "$(pwd)/buildDocker":/home/robotlab/dev/ihmc-ethercat-master/build \ - --volume "$(pwd)/src":/home/robotlab/dev/ihmc-ethercat-master/src \ - --volume "$(pwd)/swig":/home/robotlab/dev/ihmc-ethercat-master/swig \ - --volume "$(pwd)/build.gradle.kts":/home/robotlab/dev/ihmc-ethercat-master/build.gradle.kts \ - --volume "$(pwd)/gradle.properties":/home/robotlab/dev/ihmc-ethercat-master/gradle.properties \ - --volume "$(pwd)/settings.gradle.kts":/home/robotlab/dev/ihmc-ethercat-master/settings.gradle.kts \ - --volume "$(pwd)/CMakeLists.txt":/home/robotlab/dev/ihmc-ethercat-master/CMakeLists.txt \ - --volume "$(pwd)/build.sh":/home/robotlab/dev/ihmc-ethercat-master/build.sh \ - --volume "$(pwd)/gradlew":/home/robotlab/dev/ihmc-ethercat-master/gradlew \ - --volume "$(pwd)/gradle/wrapper":/home/robotlab/dev/ihmc-ethercat-master/gradle/wrapper \ - ihmcrobotics/ethercat-master:0.2 -else - sudo -u root docker start --attach ethercat-master -fi +echo "Building soemJava arm64 (cross compiling)" +sudo docker run \ + --rm \ + --tty \ + --interactive \ + --network host \ + --dns=1.1.1.1 \ + --volume "$(pwd)/buildDocker":/home/robotlab/dev/ihmc-ethercat-master/build \ + --volume "$(pwd)/src":/home/robotlab/dev/ihmc-ethercat-master/src \ + --volume "$(pwd)/swig":/home/robotlab/dev/ihmc-ethercat-master/swig \ + --volume "$(pwd)/build.gradle.kts":/home/robotlab/dev/ihmc-ethercat-master/build.gradle.kts \ + --volume "$(pwd)/gradle.properties":/home/robotlab/dev/ihmc-ethercat-master/gradle.properties \ + --volume "$(pwd)/settings.gradle.kts":/home/robotlab/dev/ihmc-ethercat-master/settings.gradle.kts \ + --volume "$(pwd)/CMakeLists.txt":/home/robotlab/dev/ihmc-ethercat-master/CMakeLists.txt \ + --volume "$(pwd)/linux-aarch64-toolchain.cmake":/home/robotlab/dev/ihmc-ethercat-master/linux-aarch64-toolchain.cmake \ + --volume "$(pwd)/build-arm64_cross.sh":/home/robotlab/dev/ihmc-ethercat-master/build-arm64_cross.sh \ + --volume "$(pwd)/gradlew":/home/robotlab/dev/ihmc-ethercat-master/gradlew \ + --volume "$(pwd)/gradle/wrapper":/home/robotlab/dev/ihmc-ethercat-master/gradle/wrapper \ + --volume "$HOME/.m2":/home/robotlab/.m2 \ + ihmcrobotics/soem-compile-arm64_cross:0.1 diff --git a/readme.md b/readme.md index 0557965..cc5be33 100644 --- a/readme.md +++ b/readme.md @@ -152,16 +152,6 @@ Note that if you want to publish multiple platform libraries you only have to ru ### Compiling with Docker -Run `./buildWithDocker.sh` +Build the docker images first with: `./buildDockerImages.sh` -The Docker image is hosted at [https://hub.docker.com/r/ihmcrobotics/ethercat-master](). - -If changes to the Dockerfile are needed, build it with the following command, incrementing the version. -Then, increment the version in the buildWithDocker.sh file before running. - -``` -# docker build --tag ihmcrobotics/ethercat-master:0.X . -# docker rm ethercat-master -``` - -For more about IHMC Robotics's usage of Docker, see [https://github.com/ihmcrobotics/ihmc-open-robotics-software/tree/develop/docker](). +Then run: `./buildWithDocker.sh` to build the artifacts, they will be copied to the host's local maven repository. \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 70b4c18..25fad26 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ pluginManagement { plugins { - id("us.ihmc.ihmc-build") version "1.0.0" + id("us.ihmc.ihmc-build") version "1.1.0" } } @@ -10,7 +10,7 @@ buildscript { mavenLocal() } dependencies { - classpath("us.ihmc:ihmc-build:1.0.0") + classpath("us.ihmc:ihmc-build:1.1.0") } } diff --git a/swig/settings.gradle.kts.in b/swig/settings.gradle.kts.in index 718320c..a3d7274 100644 --- a/swig/settings.gradle.kts.in +++ b/swig/settings.gradle.kts.in @@ -2,7 +2,7 @@ import org.gradle.internal.os.OperatingSystem; pluginManagement { plugins { - id("us.ihmc.ihmc-build") version "1.0.0" + id("us.ihmc.ihmc-build") version "1.1.0" } } @@ -12,7 +12,7 @@ buildscript { mavenLocal() } dependencies { - classpath("us.ihmc:ihmc-build:1.0.0") + classpath("us.ihmc:ihmc-build:1.1.0") } }