<div dir="ltr"><div class="gmail_default" style="font-family:"trebuchet ms",sans-serif">Hi all,</div><div class="gmail_default" style="font-family:"trebuchet ms",sans-serif"><br></div><div class="gmail_default" style="font-family:"trebuchet ms",sans-serif">I'm trying to build an executable that has its debug symbols in a separate file. I implemented that with a POST_BUILD custom command:</div><div class="gmail_default"><span style="font-family:"trebuchet ms",sans-serif"><br></span></div><div class="gmail_default"><font face="monospace, monospace">add_executable(foo a.cpp)</font></div><div class="gmail_default"><font face="monospace, monospace">add_custom_command(TARGET foo</font></div><div class="gmail_default"><font face="monospace, monospace">    POST_BUILD</font></div><div class="gmail_default"><font face="monospace, monospace">    COMMAND ${CMAKE_OBJCOPY} --only-keep-debug foo foo.sym</font></div><div class="gmail_default"><font face="monospace, monospace">    COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=foo.sym foo</font></div><div class="gmail_default"><font face="monospace, monospace">    COMMAND ${CMAKE_STRIP} --strip-debug foo</font></div><div class="gmail_default"><font face="monospace, monospace">    BYPRODUCTS foo.sym</font></div><div class="gmail_default"><font face="monospace, monospace">    COMMENT "Creating symbols"</font></div><div class="gmail_default"><font face="monospace, monospace">)</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">The problem is that if I delete foo.sym, in order for it to be created again it's not enough with running the custom command steps as we have stripped the file and the debug symbols are gone: we need to relink the executable so the debug information is available again.</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">The ninja generator makes this situation possible with the use of byproducts. By adding </font><font face="monospace, monospace">BYPRODUCTS foo.sym</font><font face="trebuchet ms, sans-serif"> to the custom command if I change foo.sym the target is relinked. Unfortunately the GNU Makefiles generator ignores byproducts, so I want to relink the executable I need to remove it. Also the byproducts are added to ninja's clean target, but not for GNU Makefiles.</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">I have tried to achieve the same result with a custom command:</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">add_custom_command(OUTPUT foo</font></div><div class="gmail_default"><font face="monospace, monospace">    DEPENDS foo</font></div><div class="gmail_default"><font face="monospace, monospace">    COMMAND ${CMAKE_OBJCOPY} --only-keep-debug foo foo.sym</font></div><div class="gmail_default"><font face="monospace, monospace">    COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=foo.sym foo</font></div><div class="gmail_default"><font face="monospace, monospace">    COMMAND ${CMAKE_STRIP} --strip-debug foo</font></div><div class="gmail_default"><font face="monospace, monospace">    BYPRODUCTS foo.sym</font></div><div class="gmail_default"><font face="monospace, monospace">    COMMENT "Creating symbols"</font></div><div class="gmail_default"><font face="monospace, monospace">    USES_TERMINAL</font></div><div class="gmail_default"><font face="monospace, monospace">)</font></div><div class="gmail_default"><font face="monospace, monospace"><br></font></div><div class="gmail_default"><font face="monospace, monospace">add_custom_target(foo_symbols ALL<br></font></div><div class="gmail_default"><font face="monospace, monospace">    DEPENDS foo.sym</font></div><div class="gmail_default"><font face="monospace, monospace">)</font></div><div style="font-family:"trebuchet ms",sans-serif"><br></div></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">But I get the same results, the target does not get relinked. Also, it seems that there is an issue of some sort because every time I type </font><font face="monospace, monospace">make</font><font face="trebuchet ms, sans-serif"> the steps to create the file foo.sym are executed, resulting in an error message from objcopy ('debuglink section already exists'). If I touch the CMakeLists.txt file (by adding a space, removing it and saving), make after that correctly does not execute the steps to create foo.sym. I understand that targets created by add_custom_target are always out of date, but I thought there shouldn't be a need to re-run the custom command.</font></div><div class="gmail_default"><br></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace"><b>lgux-pnavarro4 ~/tests/cm2/b $ cmake --version</b></font></div><div class="gmail_default"><font face="monospace, monospace">cmake version 3.10.2</font></div><div class="gmail_default"><font face="monospace, monospace"><br></font></div><div class="gmail_default"><font face="monospace, monospace">CMake suite maintained and supported by Kitware (<a href="http://kitware.com/cmake">kitware.com/cmake</a>).</font></div></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace"><b>lgux-pnavarro4 ~/tests/cm2/b $ rm -rf * && cmake -DCMAKE_BUILD_TYPE=Debug ..</b></font></div><div class="gmail_default"><font face="monospace, monospace">-- The C compiler identification is GNU 7.3.0</font></div><div class="gmail_default"><font face="monospace, monospace">-- The CXX compiler identification is GNU 7.3.0</font></div><div class="gmail_default"><font face="monospace, monospace">-- Check for working C compiler: /usr/local/bin/cc</font></div><div class="gmail_default"><font face="monospace, monospace">-- Check for working C compiler: /usr/local/bin/cc -- works</font></div><div class="gmail_default"><font face="monospace, monospace">-- Detecting C compiler ABI info</font></div><div class="gmail_default"><font face="monospace, monospace">-- Detecting C compiler ABI info - done</font></div><div class="gmail_default"><font face="monospace, monospace">-- Detecting C compile features</font></div><div class="gmail_default"><font face="monospace, monospace">-- Detecting C compile features - done</font></div><div class="gmail_default"><font face="monospace, monospace">-- Check for working CXX compiler: /usr/local/bin/c++</font></div><div class="gmail_default"><font face="monospace, monospace">-- Check for working CXX compiler: /usr/local/bin/c++ -- works</font></div><div class="gmail_default"><font face="monospace, monospace">-- Detecting CXX compiler ABI info</font></div><div class="gmail_default"><font face="monospace, monospace">-- Detecting CXX compiler ABI info - done</font></div><div class="gmail_default"><font face="monospace, monospace">-- Detecting CXX compile features</font></div><div class="gmail_default"><font face="monospace, monospace">-- Detecting CXX compile features - done</font></div><div class="gmail_default"><font face="monospace, monospace">-- Configuring done</font></div><div class="gmail_default"><font face="monospace, monospace">-- Generating done</font></div><div class="gmail_default"><font face="monospace, monospace">-- Build files have been written to: /home/pnavarro/tests/cm2/b</font></div><div class="gmail_default"><font face="monospace, monospace"><b>lgux-pnavarro4 ~/tests/cm2/b $ make</b></font></div><div class="gmail_default"><font face="monospace, monospace">make: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[1]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">Scanning dependencies of target foo</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">[ 33%] Building CXX object CMakeFiles/foo.dir/a.cpp.o</font></div><div class="gmail_default"><font face="monospace, monospace">[ 66%] Linking CXX executable foo</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">[ 66%] Built target foo</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">Scanning dependencies of target foo_symbols</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace" color="#0000ff">[100%] Creating symbols</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">[100%] Built target foo_symbols</font></div><div class="gmail_default"><font face="monospace, monospace">make[1]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace"><b>lgux-pnavarro4 ~/tests/cm2/b $ make</b></font></div><div class="gmail_default"><font face="monospace, monospace">make: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[1]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">[ 66%] Built target foo</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace" color="#0000ff">[100%] Creating symbols</font></div><div class="gmail_default"><font face="monospace, monospace" color="#ff0000">/usr/bin/objcopy: stkkJQMo: debuglink section already exists</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">[100%] Built target foo_symbols</font></div><div class="gmail_default"><font face="monospace, monospace">make[1]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace"><b>lgux-pnavarro4 ~/tests/cm2/b $ </b></font></div><div style="font-family:"trebuchet ms",sans-serif"><br></div></div><div class="gmail_default"><i style=""><font face="monospace, monospace"><touch CMakeLists.txt></font></i></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace"><b>lgux-pnavarro4 ~/tests/cm2/b $ make</b></font></div><div class="gmail_default"><font face="monospace, monospace">make: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">-- Configuring done</font></div><div class="gmail_default"><font face="monospace, monospace">-- Generating done</font></div><div class="gmail_default"><font face="monospace, monospace">-- Build files have been written to: /home/pnavarro/tests/cm2/b</font></div><div class="gmail_default"><font face="monospace, monospace">make[1]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">[ 66%] Built target foo</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Entering directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make[2]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">[100%] Built target foo_symbols</font></div><div class="gmail_default"><font face="monospace, monospace">make[1]: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div class="gmail_default"><font face="monospace, monospace">make: Leaving directory '/home/pnavarro/tests/cm2/b'</font></div><div style="font-family:"trebuchet ms",sans-serif"><br></div></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">This leads me to the following questions:</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">1) Is is possible to achieve what I want (relink the target if a file created after POST_BUILD is deleted) with GNU Make files?</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">2) As the documentation says that byproducts are ignored but the files marked as GENERATED, shouldn't GENERATED files created by POST_BUILD be added as a trigger for a new link?</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">3) Byproducts are added to the clean target in ninja, but in GNU Makefiles you need to add them to ADDITIONAL_MAKE_CLEAN_FILES. Shouldn't GENERATED files in POST_BUILD be automatically added to the make clean target? At least it will give parity between ninja and make's behaviors.</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif">4) Is my issue with foo_symbols not being executed after touching CMakelists.txt a bug?</font></div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div><div class="gmail_default">Thanks!</div><div class="gmail_default">Pedro</div><div class="gmail_default"><font face="trebuchet ms, sans-serif"><br></font></div></div>