lcm-proj/lcm

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:

String spacer = " • ";

String spacer = " • ";

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.

judfs commented

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

This issue should be resolved by #488