Building 1.5.0 with Java 11 on Ubuntu 22.04 (`default-jdk`) fails with unmappable character
jwatson27 opened this issue · 8 comments
Summary
When attempting to build LCM 1.5.0 from source on Ubuntu 22.04, the make build fails with the following error:
lcm/spy/Spy.java:41: error: unmappable character (0xE2) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/spy/Spy.java:41: error: unmappable character (0x80) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/spy/Spy.java:41: error: unmappable character (0xA2) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/logging/LogPlayer.java:1123: error: unmappable character (0xE2) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/logging/LogPlayer.java:1123: error: unmappable character (0x80) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/logging/LogPlayer.java:1123: error: unmappable character (0xA2) for encoding US-ASCII
String spacer = " ??? ";
Example
Host OS: Ubuntu 22.04
Docker version: Docker version 23.0.6, build ef23cbc
.
Dockerfile
FROM ubuntu:22.04 as lcm
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
build-essential \
cmake \
libglib2.0-dev \
curl \
ca-certificates \
unzip \
python3-dev \
default-jdk \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /usr/src
RUN curl -fSL "https://github.com/lcm-proj/lcm/archive/refs/tags/v1.5.0.zip" -o "lcm-1.5.0.zip" \
&& unzip "lcm-1.5.0.zip"
WORKDIR /usr/src/lcm-1.5.0/build
RUN cmake ..
Build & Run
docker build -f Dockerfile -t lcm-bug .
docker run -it lcm-bug make
Output
[ 0%] Generating lcmUtilities.cmake
[ 0%] Built target lcm_use_file
[ 1%] Building C object lcm/CMakeFiles/lcm-static.dir/eventlog.c.o
[ 2%] Building C object lcm/CMakeFiles/lcm-static.dir/lcm.c.o
[ 2%] Building C object lcm/CMakeFiles/lcm-static.dir/lcm_file.c.o
[ 3%] Building C object lcm/CMakeFiles/lcm-static.dir/lcm_memq.c.o
[ 3%] Building C object lcm/CMakeFiles/lcm-static.dir/lcm_mpudpm.c.o
[ 4%] Building C object lcm/CMakeFiles/lcm-static.dir/lcm_tcpq.c.o
[ 5%] Building C object lcm/CMakeFiles/lcm-static.dir/lcm_udpm.c.o
[ 5%] Building C object lcm/CMakeFiles/lcm-static.dir/ringbuffer.c.o
[ 6%] Building C object lcm/CMakeFiles/lcm-static.dir/udpm_util.c.o
[ 7%] Building C object lcm/CMakeFiles/lcm-static.dir/lcmtypes/channel_port_map_update_t.c.o
[ 7%] Building C object lcm/CMakeFiles/lcm-static.dir/lcmtypes/channel_to_port_t.c.o
[ 8%] Linking C static library liblcm.a
[ 8%] Built target lcm-static
[ 9%] Building C object lcm/CMakeFiles/lcm.dir/eventlog.c.o
[ 9%] Building C object lcm/CMakeFiles/lcm.dir/lcm.c.o
[ 10%] Building C object lcm/CMakeFiles/lcm.dir/lcm_file.c.o
[ 11%] Building C object lcm/CMakeFiles/lcm.dir/lcm_memq.c.o
[ 11%] Building C object lcm/CMakeFiles/lcm.dir/lcm_mpudpm.c.o
[ 12%] Building C object lcm/CMakeFiles/lcm.dir/lcm_tcpq.c.o
[ 13%] Building C object lcm/CMakeFiles/lcm.dir/lcm_udpm.c.o
[ 13%] Building C object lcm/CMakeFiles/lcm.dir/ringbuffer.c.o
[ 14%] Building C object lcm/CMakeFiles/lcm.dir/udpm_util.c.o
[ 14%] Building C object lcm/CMakeFiles/lcm.dir/lcmtypes/channel_port_map_update_t.c.o
[ 15%] Building C object lcm/CMakeFiles/lcm.dir/lcmtypes/channel_to_port_t.c.o
[ 16%] Linking C shared library liblcm.so
[ 16%] Built target lcm
[ 16%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/emit_c.c.o
[ 17%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/emit_csharp.c.o
[ 18%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/emit_cpp.c.o
[ 18%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/emit_go.c.o
[ 19%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/emit_java.c.o
[ 19%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/emit_lua.c.o
[ 20%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/emit_python.c.o
[ 21%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/getopt.c.o
[ 21%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/lcmgen.c.o
[ 22%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/main.c.o
[ 23%] Building C object lcmgen/CMakeFiles/lcm-gen.dir/tokenize.c.o
[ 23%] Linking C executable lcm-gen
[ 23%] Built target lcm-gen
[ 24%] Building C object lcm-logger/CMakeFiles/lcm-logger.dir/lcm_logger.c.o
[ 25%] Building C object lcm-logger/CMakeFiles/lcm-logger.dir/glib_util.c.o
[ 25%] Linking C executable lcm-logger
[ 25%] Built target lcm-logger
[ 26%] Building C object lcm-logger/CMakeFiles/lcm-logplayer.dir/lcm_logplayer.c.o
[ 26%] Linking C executable lcm-logplayer
[ 26%] Built target lcm-logplayer
[ 26%] Building C object liblcm-test/CMakeFiles/lcm-sink.dir/lcm-sink.c.o
[ 27%] Linking C executable lcm-sink
[ 27%] Built target lcm-sink
[ 28%] Building C object liblcm-test/CMakeFiles/lcm-source.dir/lcm-source.c.o
[ 28%] Linking C executable lcm-source
[ 28%] Built target lcm-source
[ 28%] Building C object liblcm-test/CMakeFiles/lcm-tester.dir/lcm-tester.c.o
[ 29%] Linking C executable lcm-tester
[ 29%] Built target lcm-tester
[ 30%] Building C object liblcm-test/CMakeFiles/lcm-example.dir/lcm-example.c.o
[ 30%] Linking C executable lcm-example
[ 30%] Built target lcm-example
[ 31%] Building C object liblcm-test/CMakeFiles/lcm-logfilter.dir/lcm-logfilter.c.o
[ 31%] Linking C executable lcm-logfilter
[ 31%] Built target lcm-logfilter
[ 31%] Building C object liblcm-test/CMakeFiles/lcm-buftest-receiver.dir/buftest-receiver.c.o
[ 32%] Linking C executable lcm-buftest-receiver
[ 32%] Built target lcm-buftest-receiver
[ 33%] Building C object liblcm-test/CMakeFiles/lcm-buftest-sender.dir/buftest-sender.c.o
[ 33%] Linking C executable lcm-buftest-sender
[ 33%] Built target lcm-buftest-sender
[ 34%] Building C object lcm-python/CMakeFiles/lcm-python.dir/module.c.o
[ 34%] Building C object lcm-python/CMakeFiles/lcm-python.dir/pyeventlog.c.o
[ 35%] Building C object lcm-python/CMakeFiles/lcm-python.dir/pylcm.c.o
[ 36%] Building C object lcm-python/CMakeFiles/lcm-python.dir/pylcm_subscription.c.o
[ 36%] Linking C shared module ../python/lcm/_lcm.so
[ 36%] Built target lcm-python
[ 37%] Generating ../python/lcm/__init__.py
[ 37%] Built target lcm-python-init
[ 37%] Building Java objects for jchart2d.jar
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[ 37%] Generating CMakeFiles/jchart2d.dir/java_class_filelist
[ 38%] Creating Java archive jchart2d-3.2.2.jar
[ 39%] Generating ext/jide-oss-2.9.7.jar
[ 40%] Generating ext/xmlgraphics-commons-1.3.1.jar
[ 40%] Built target jchart2d
[ 41%] Building Java objects for lcm-java.jar
lcm/spy/Spy.java:41: error: unmappable character (0xE2) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/spy/Spy.java:41: error: unmappable character (0x80) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/spy/Spy.java:41: error: unmappable character (0xA2) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/logging/LogPlayer.java:1123: error: unmappable character (0xE2) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/logging/LogPlayer.java:1123: error: unmappable character (0x80) for encoding US-ASCII
String spacer = " ??? ";
^
lcm/logging/LogPlayer.java:1123: error: unmappable character (0xA2) for encoding US-ASCII
String spacer = " ??? ";
^
6 errors
make[2]: *** [lcm-java/CMakeFiles/lcm-java.dir/build.make:116: lcm-java/CMakeFiles/lcm-java.dir/java_compiled_lcm-java] Error 1
make[1]: *** [CMakeFiles/Makefile2:922: lcm-java/CMakeFiles/lcm-java.dir/all] Error 2
make: *** [Makefile:166: all] Error 2
Here are the offending lines:
Line 41 in ddeddfe
lcm/lcm-java/lcm/logging/LogPlayer.java
Line 1123 in ddeddfe
It is necessary to have the locale set properly in order to compile the Java code (something the base docker images don't have). For example, we added this line to our Fedora dockerfile to handle that issue.
Gotcha. Adding that line seems to have fixed it. Thanks!
Do you think this is worth adding to the documentation or is this too OS-specific?
I'm generally in favor of more docs. In #448 I floated the idea of having an extra section for things like this.
Adding set(CMAKE_JAVA_COMPILE_FLAGS -encoding utf8)
to lcm-java/CMakeLists.txt
seems to also work for building. Might be preferred?
Yeah, that sounds like a good solution to me