CMake non dispone di supporto diretto per questo, ma è possibile utilizzare alcuni passaggi POST_BUILD e INSTALL per ottenere il risultato desiderato. Tuttavia, vale la pena notare che l'utilizzo di objcopy
non è l'unico modo per fare questo genere di cose. È anche possibile utilizzare l'id di build e questo potrebbe essere più facile da implementare in modo efficace con CMake.
Piuttosto che ripetere tutto qui, c'è uno pretty good description of your choices and the methods che è stato pubblicato nella mailing list di CMake alcuni anni fa da Michael Hertling. Prenderò qui l'alternativa di lavoro per riferimento, ma ti consiglio di leggere il link. C'è anche un altro complete discussion of the two alternatives nella documentazione GDB che dovrebbe riempire gli spazi vuoti sui due approcci (collegamento di debug versus build-id). Ecco approccio generale accumulo id di Michael (build-id è esplicitamente dato in suo esempio, leggere gli articoli di riferimento per una spiegazione di ciò che ci si aspetta di rappresentare):
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(BUILDID C)
SET(CMAKE_VERBOSE_MAKEFILE ON)
SET(BUILDID "abcdef1234")
STRING(SUBSTRING "${BUILDID}" 0 2 BUILDIDPREFIX)
STRING(SUBSTRING "${BUILDID}" 2 8 BUILDIDSUFFIX)
FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "int main(void){return 0;}\n")
ADD_EXECUTABLE(main main.c)
SET_TARGET_PROPERTIES(main PROPERTIES
LINK_FLAGS "-Wl,--build-id=0x${BUILDID}")
ADD_CUSTOM_COMMAND(TARGET main POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:main>
${CMAKE_BINARY_DIR}/main.debug
COMMAND ${CMAKE_STRIP} -g $<TARGET_FILE:main>)
INSTALL(FILES ${CMAKE_BINARY_DIR}/main.debug
DESTINATION ${CMAKE_BINARY_DIR}/.build-id/${BUILDIDPREFIX}
RENAME ${BUILDIDSUFFIX}.debug)
Configurare con CMAKE_BUILD_TYPE == di debug e costruire; successivamente, invoca
gdb -ex "imposta debug-file-directory." -ex "file main"
all'interno di CMAKE_BINARY_DIR, e si legge "nessun simbolo di debug trovato" come previsto. Ora, problema "make install", re-invoke gdb e lesse: "simboli lettura da .../build-id/ab/cdef1234.debug"
Come si può vedere, le informazioni di debug il file è collegato con l'eseguibile spogliato solo dall'ID build; nessuna objcopy in vista.
Quanto sopra si basa sul fatto che il file .debug
è un normale eseguibile con informazioni di debug non eliminate.
fonte
2015-11-23 20:59:54