lcm-proj / lcm

Lightweight Communications and Marshalling
GNU Lesser General Public License v2.1
944 stars 385 forks source link

Building 1.5.0 with Java 11 on Ubuntu 22.04 (`default-jdk`) fails with unmappable character #454

Closed jwatson27 closed 5 months ago

jwatson27 commented 1 year ago

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
jwatson27 commented 1 year ago

Here are the offending lines:

https://github.com/lcm-proj/lcm/blob/ddeddfe1a9115fca7403807e5744e25876972064/lcm-java/lcm/spy/Spy.java#L41

https://github.com/lcm-proj/lcm/blob/ddeddfe1a9115fca7403807e5744e25876972064/lcm-java/lcm/logging/LogPlayer.java#L1123

nosracd commented 1 year ago

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.

jwatson27 commented 1 year ago

Gotcha. Adding that line seems to have fixed it. Thanks!

jwatson27 commented 1 year ago

Do you think this is worth adding to the documentation or is this too OS-specific?

nosracd commented 1 year ago

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 8 months ago

Adding set(CMAKE_JAVA_COMPILE_FLAGS -encoding utf8) to lcm-java/CMakeLists.txt seems to also work for building. Might be preferred?

nosracd commented 8 months ago

Yeah, that sounds like a good solution to me

nosracd commented 5 months ago

This issue should be resolved by #488