Commit 1817b508 authored by Nicolas Benes's avatar Nicolas Benes
Browse files

fastddsgen: add missing C preprocessor dependency to wrapper

fastddsgen internally calls 'cpp' (the C preprocessor) to resolve
include directives, include guards, etc. See

https://github.com/eProsima/Fast-DDS-Gen/blob/541129f6e7365b6b789fd2d41fa6efd94503a6b4/src/main/java/com/eprosima/fastdds/fastddsgen.java#L1423

Make 'cpp' available from the fastddsgen wrapper script. Use the
unwrapped 'cpp', because the wrapped one passes additional parameters,
which make the produced output incompatible with fastddsgen (string out
of bounds exception).

Fixes the error when using IDL files with includes:

```
Processing the file build/foo.idl...
ERROR: Cannot generate the files
begin -3, end 1, length 1
java.lang.StringIndexOutOfBoundsException: begin -3, end 1, length 1
        at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4602)
        at java.base/java.lang.String.substring(String.java:2705)
        at com.eprosima.idl.context.Context.processPreprocessorLine(Context.java:955)
        at com.eprosima.idl.parser.grammar.IDLLexer.PREPROC_DIRECTIVE_action(IDLLexer.java:223)
        at com.eprosima.idl.parser.grammar.IDLLexer.action(IDLLexer.java:215)
        at org.antlr.v4.runtime.atn.LexerCustomAction.execute(LexerCustomAction.java:97)
        at org.antlr.v4.runtime.atn.LexerActionExecutor.execute(LexerActionExecutor.java:168)
        at org.antlr.v4.runtime.atn.LexerATNSimulator.accept(LexerATNSimulator.java:366)
        at org.antlr.v4.runtime.atn.LexerATNSimulator.failOrAccept(LexerATNSimulator.java:299)
        at org.antlr.v4.runtime.atn.LexerATNSimulator.execATN(LexerATNSimulator.java:230)
        at org.antlr.v4.runtime.atn.LexerATNSimulator.match(LexerATNSimulator.java:114)
        at org.antlr.v4.runtime.Lexer.nextToken(Lexer.java:141)
        at org.antlr.v4.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:169)
        at org.antlr.v4.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:152)
        at org.antlr.v4.runtime.BufferedTokenStream.setup(BufferedTokenStream.java:254)
        at org.antlr.v4.runtime.BufferedTokenStream.lazyInit(BufferedTokenStream.java:249)
        at org.antlr.v4.runtime.CommonTokenStream.LT(CommonTokenStream.java:92)
        at org.antlr.v4.runtime.Parser.enterRule(Parser.java:628)
        at com.eprosima.idl.parser.grammar.IDLParser.specification(IDLParser.java:304)
        at com.eprosima.fastdds.fastddsgen.parseIDL(fastddsgen.java:809)
        at com.eprosima.fastdds.fastddsgen.process(fastddsgen.java:640)
        at com.eprosima.fastdds.fastddsgen.execute(fastddsgen.java:458)
        at com.eprosima.fastdds.fastddsgen.main(fastddsgen.java:1581)
```
parent 87475b25
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
{ lib, stdenv, runtimeShell, fetchFromGitHub, gradle_7, openjdk17 }:
{ lib
, stdenv
, makeWrapper
, fetchFromGitHub
, gradle_7
, openjdk17
}:

let
  pname = "fastddsgen";
  version = "3.3.0";
@@ -17,7 +24,11 @@ stdenv.mkDerivation {
    hash = "sha256-oqbSIzsYUwD8bTqGKZ9he9d18EDq9mHZFoNUp0RK0qU=";
  };

  nativeBuildInputs = [ gradle openjdk17 ];
  nativeBuildInputs = [
    gradle
    openjdk17
    makeWrapper
  ];

  mitmCache = gradle.fetchDeps {
    inherit pname;
@@ -33,12 +44,12 @@ stdenv.mkDerivation {

    gradle install --install_path=$out

    # Override the default start script to use absolute java path
    cat  <<EOF >$out/bin/fastddsgen
    #!${runtimeShell}
    exec ${openjdk17}/bin/java -jar "$out/share/fastddsgen/java/fastddsgen.jar" "\$@"
    EOF
    chmod a+x "$out/bin/fastddsgen"
    # Override the default start script to use absolute java path.
    # Make the unwrapped "cpp" available in the path, since the wrapped "cpp"
    # passes additional flags and produces output incompatible with fastddsgen.
    makeWrapper ${openjdk17}/bin/java $out/bin/fastddsgen \
      --add-flags "-jar $out/share/fastddsgen/java/fastddsgen.jar" \
      --prefix PATH : ${lib.makeBinPath [ stdenv.cc.cc ]}

    runHook postInstall
  '';