<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 04-Dec-15 03:47, Alexander Neundorf
      wrote:<br>
    </div>
    <blockquote cite="mid:14211828.dtnMx6GTBJ@tuxedo.neundorf.net"
      type="cite">
      <meta name="qrichtext" content="1">
      <style type="text/css">
p, li { white-space: pre-wrap; }
</style>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">On Thursday, December 03, 2015 09:27:29 Ruslan Baratov via CMake wrote:</p>
      <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> On 03-Dec-15 04:34, Alexander Neundorf wrote:</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> > On Wednesday, December 02, 2015 12:27:42 Ruslan Baratov wrote:</p>
      <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> > If RPATH was _designed_ to be patchable, tools could just do it,</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> > instead of having to implement workarounds for longer strings. E.g.</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> > the linker would support a command line argument how much space it</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> > should reserve for the RPATH entry, or something like that.</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> I think it's not possible. As far as I know there is no limitation for</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> path size on Linux for example. Hence it's not possible to predict what</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> size for path to library user want to use by setting RPATH.</p>
      <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">More nitpicking about the meaning of "designed" ;-) :</p>
      <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">CMake knows the length of the build RPATH and the length of the install RPATH. Let's say the build RPATH has a length of 100, and the install RPATH has a length of 150, it could, during linking, give the build RPATH to the linker, and also something like --rpath-size=150, and the linker would make the field for the RPATH 150 bytes big, so it could be patched easly later on.</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">This is what I would consider the minimum support if it was "designed" to be patched.</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Instead cmake has to add 50 ":" at the end of the build RPATH. :-/</p>
      <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">...</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> > The idea above was only for solving the question "am I installed ?"</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> > yes/no, not "where am I installed ?".</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> Then I don't understand how it's planned to be used. I thought that in</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> build directory you changing "$$$$_I_M_NOT_INSTALLED_$$$$" to</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> "/path/to/build/directory" so resources can be found there, and on</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> install you change it to "/path/to/install/directory". So my guess is</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">> not correct?</p>
      <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
      <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">Nothing is planned, just some ideas.</p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">The idea was, during install, to set the first byte of that special string to '\0', and in the code you test whether the string is empty ( -> it has been patched, so it is installed) or not (still the original "$$$$_I_M_NOT_INSTALLED_$$$$").</p>
      <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; "> </p>
      <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">With that information, the developer can then do whatever he wants. e.g. when not installed, search just in $CMAKE_BINARY_DIR (which could be configured into some other string), and if installed, search in some other way.</p>
    </blockquote>
    Will not work, just like I said compiler is smart enough to figure
    out if the first char in string literal is '\0' or not. Just make
    some testing: <a class="moz-txt-link-freetext" href="https://gist.github.com/ruslo/04d8993800ee78513d1c">https://gist.github.com/ruslo/04d8993800ee78513d1c</a><br>
    <br>
    The only one possibility to implement what you want I see in
    creating new dynamic library (probably by CMake) with one literal:<br>
    <br>
    // 3rd party library API<br>
    const char* path_to_install();<br>
    <br>
    void parse_resources() {<br>
      const char* x = path_to_install();<br>
      assert(x != 0);<br>
      if (x[0] == '\0') {<br>
        // OK, can't be optimized since it's an external library<br>
      }<br>
      else {<br>
        // load resources<br>
      }<br>
    }<br>
    <br>
    So CMake should create such library in build directory and then
    re-create and install it with new string in install directory. Of
    course if you move such library it will not work :) So still doesn't
    make sense to me...<br>
    <br>
    Ruslo<br>
    <br>
  </body>
</html>