Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows: add --incompatible_windows_escape_jvm_flags #7490

Closed

Commits on Feb 21, 2019

  1. Windows: add --incompatible_windows_escape_jvm_flags

    Add --incompatible_windows_escape_jvm_flags flag
    (default: false). This flag has no effect on
    platforms other than Windows.
    
    This flag affects how Bazel builds the launcher of
    java_binary and java_test targets. (The launcher
    is the .exe file that sets up the environment for
    the Java program and launches the JVM.)
    
    In particular, the flag controls whether or not
    Bazel will Bash-tokenize the jvm_flags that were
    declared in the BUILD file, and whether or not
    these jvm_flags are escaped by the launcher when
    it invokes the JVM.
    
    When the flag is enabled:
    
    - Bazel will Bash-tokenize java_binary.jvm_flags
      and java_test.jvm_flags (as documented by the
      Build Encyclopedia) before embedding them into
      the launcher. The build fails if an entry cannot
      be Bash-tokenized, e.g. if it has unterminated
      quotes.
    
    - The launcher will properly escape these flags
      when it runs the JVM as a subprocess (using
      launcher_util::WindowsEscapeArg2).
    
    - The result is that the jvm_flags declared in the
      BUILD file will arrive to the Java program as
      intended. However, due to the extra
      Bash-tokenization step, some ill-formed flags
      are no longer accepted, e.g.
      `jvm_flags=["-Dfoo='a"]` now results in a build
      error.
    
    When the flag is disabled:
    
    - Bazel does not Bash-tokenize the jvm_flags
      before embedding them in the launcher. This
      preserves quoting meant to be stripped away, and
      it also means Bazel won't check whether the
      argument is properly quoted.
    
    - The launcher escapes the flags with a Bash-like
      escaping logic (launcher_util::WindowsEscapeArg)
      which cannot properly quote and escape
      everything.
    
    - The result: the jvm_flags declared in the BUILD
      file might get messed up as they are passed to
      the JVM, or the launcher may not even be able to
      run the JVM. However, due to the lack of
      Bash-tokenization, Bazel propagates some flags
      to the Java binary that it would no longer
      accept if the new
      `--incompatible_windows_escape_jvm_flags` were
      enabled, e.g. `jvm_flags=["'a"]` is fine.
    
    Incompatible flag: bazelbuild#7486
    
    Related: bazelbuild#7072
    
    RELNOTES[NEW]: Added --incompatible_windows_escape_jvm_flags flag: enables correct java_binary.jvm_flags and java_test.jvm_flags tokenization and escaping on Windows. (No-op on other platforms.)
    
    Change-Id: I531cc63cdfeccbe4b6d48876cb82870c1726a723
    laszlocsomor committed Feb 21, 2019
    Configuration menu
    Copy the full SHA
    d49ae09 View commit details
    Browse the repository at this point in the history
  2. Restructure test: assertions are more focused.

    Change-Id: I8ff717731053d0291681afc94f7ee6d918a65fc8
    laszlocsomor committed Feb 21, 2019
    Configuration menu
    Copy the full SHA
    c7f1763 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    97bea74 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    8bcf935 View commit details
    Browse the repository at this point in the history