<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le lun. 7 oct. 2019 à 14:41, Vincent van Beveren <<a href="mailto:v.van.beveren@nikhef.nl">v.van.beveren@nikhef.nl</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello everyone,<br>
<br>
I'm setting up a new build targeting an embedded platform (LM32) and <br>
trying to integrate a CRC32 into the resulting ELF. I have previously <br>
done this using plain Makefiles with the following steps (pseudo code):<br>
<br>
target.elf: <obj-files><br>
    link <obj-files> --symbol CRC_VALUE=0 intermediate.elf<br>
    objcopy --binary intermediate.elf intermediate.bin<br>
    link <obj-files> --symbol CRC_VALUE=`crc32 intermediate.bin` target.elf<br>
    rm intermediate.bin<br>
<br>
Now I would like to achieve the same thing with CMake. I'm using <br>
add_executable with multiple targets. The end of my CMakeLists.txt looks <br>
like this, where F_GEN contains generic source files and F__* source <br>
files specific for that variant of the build:<br>
<br>
# [...defining of cross compiler, and source files, some compile flags, <br>
etc...]<br>
# Educate the linker<br>
add_link_options(<br>
     -nostartfiles<br>
     -nodefaultlibs<br>
     -nostdlib<br>
     -Wl,--gc-sections<br>
     -T ${CMAKE_SOURCE_DIR}/${P_SRC}/romram.ld<br>
     -Wl,--defsym=CRC_VALUE=0<br>
     -Wl,--defsym=_start=0<br>
     )<br>
<br>
# DOM v2 target<br>
add_executable( clb_v2_dom.elf ${F_GEN} ${F__DOM} )<br>
target_compile_definitions(clb_v2_dom.elf PUBLIC -DDOM -DCLBV2 )<br>
<br>
# BASE v2 target<br>
add_executable( clb_v2_base.elf ${F_GEN} ${F__BASE} )<br>
# TODO migrate define 'DUBASE' -> 'BASE'<br>
target_compile_definitions(clb_v2_base.elf PUBLIC -DDUBASE -DBASE -DCLBV2)<br>
<br>
# Golden v2 target<br>
add_executable( clb_v2_golden.elf ${F_GEN} ${F__GLD} )<br>
target_compile_definitions( clb_v2_golden.elf PUBLIC -DGOLDEN -DCLBV2 )<br>
<br>
==<br>
<br>
As you can see CRC_VALUE is now simply defined 0 for every target. Which <br>
works well for compiling but during runtime poses a problem to the ROM <br>
verification procedure. What would a 'proper' way be of adding a CRC to <br>
an ELF file be using CMake, and be different for each target. Any help <br>
is welcome!<br></blockquote><div><br></div><div>I would try to add a set of custom command as POST_BUILD event.</div><div><a href="https://cmake.org/cmake/help/v3.15/command/add_custom_command.html#build-events">https://cmake.org/cmake/help/v3.15/command/add_custom_command.html#build-events</a><br></div><div><br></div><div>add_custom_command(TARGET clb_v2_base.elf POST_BUILD<br></div><div>                                   COMMAND crc32 $<TARGET_FILE:clb_v2_base.elf> > $<TARGET_FILE:clb_v2_base.elf>.crc32</div><div>                                   COMMAND ${CMAKE_C_COMPILER} --symbol $<TARGET_FILE:clb_v2_base.elf>.crc32  $<TARGET_FILE:clb_v2_base.elf></div><div>                                  )</div><div><br></div><div>I don't know if the linker can read the computed crc32 from the previously generated file but you get the idea.</div><div>Moreover if you want to easily collect objects used for linking a target you may need to use an intermediate</div><div>OBJECT library in order to be able to retrieve $<TARGET_OBJECTS:objlib> </div><div>see: <a href="https://cmake.org/cmake/help/latest/command/add_library.html#object-libraries">https://cmake.org/cmake/help/latest/command/add_library.html#object-libraries</a><br></div><div>i.e. replace: </div><div>add_executable( clb_v2_dom.elf ${F_GEN} ${F__DOM} )<br></div><div></div><div><br></div><div>by</div><div>add_library(clb_v2_dom.objs OBJECT ${F_GEN} ${F__DOM})</div><div>add_executable(clb_v2_dom.elf  $<TARGET_OBJECTS:clb_v2_dom.objs>)<br></div><div><br></div><div>and then:</div><div><br></div><div>add_custom_command(TARGET clb_v2_dom.elf POST_BUILD<br>                                   COMMAND crc32 $<TARGET_FILE:clb_v2_dom.elf> > $<TARGET_FILE:clb_v2_dom.elf>.crc32<br>                                   COMMAND ${CMAKE_C_COMPILER} $<TARGET_OBJECTS:clb_v2_dom.objs> --symbol $<TARGET_FILE:clb_v2_dom.elf>.crc32  $<TARGET_FILE:clb_v2_dom.elf><br>                                  )<br></div><div><br></div><div>If this looks ok to you I would then write my own</div><div><br></div><div>lm32_add_executable that would wraps this up in order to be called as:</div><div><br></div><div>lm32_add_executable(EXECUTABLE clb_v2_dom.elf<br></div><div>                                 SOURCES ${F_GEN} ${F__DOM})</div><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Kind regards,<br>
Vincent<br>
<br>
<br>
<br>
-- <br>
National Institute for Subatomic Physics Nikhef<br>
Department of Computer Technology<br>
Science Park 105<br>
1098 XG AMSTERDAM<br>
<br>
tel.  : +31 (0)20 592 2032<br>
e-mail: <a href="mailto:v.van.beveren@nikhef.nl" target="_blank">v.van.beveren@nikhef.nl</a><br>
site  : <a href="http://www.nikhef.nl/~vincentb" rel="noreferrer" target="_blank">http://www.nikhef.nl/~vincentb</a><br>
<br>
-- <br>
<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" rel="noreferrer" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
<br>
Kitware offers various services to support the CMake community. For more information on each offering, please visit:<br>
<br>
CMake Support: <a href="http://cmake.org/cmake/help/support.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/support.html</a><br>
CMake Consulting: <a href="http://cmake.org/cmake/help/consulting.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/consulting.html</a><br>
CMake Training Courses: <a href="http://cmake.org/cmake/help/training.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/training.html</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="https://cmake.org/mailman/listinfo/cmake" rel="noreferrer" target="_blank">https://cmake.org/mailman/listinfo/cmake</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>Eric<br></div></div></div></div></div></div>