Am 17.07.2017 um 18:41 schrieb Deniz Bahadir:
Am 17.07.2017 um 17:15 schrieb Nils Gladitz:
On 17.07.2017 17:13, Deniz Bahadir wrote:
Am 17.07.2017 um 16:47 schrieb Nils Gladitz:
On 7/17/2017 3:52 PM, Deniz Bahadir wrote:
This works just fine. However, now I want to add an additional
build-step after creation of the object-files and before linking
the shared library. (In particular, I want to compress the
debug-symbols in the object-files. But that should be irrelevant
for my question.)
My first attempt was to add the following between the two
add_library commands:
```
add_custom_command( TARGET ${PROJECT_NAME}_OBJECTS POST_BUILD
COMMAND objcopy --compress-debug-sections
$<TARGET_OBJECTS:${PROJECT_NAME}_OBJECT>
)
```
But that results in the following error:
```
(add_custom_command):
Target "MyProject_OBJECTS" is an OBJECT library that may not
have PRE_BUILD, PRE_LINK, or POST_BUILD commands.
```
So I tried instead to add the following between the two add_library
commands:
```
add_custom_command( TARGET ${PROJECT_NAME} PRE_LINK
COMMAND objcopy --compress-debug-sections
$<TARGET_OBJECTS:${PROJECT_NAME}_OBJECT>
)
```
This then fails when evaluating the generator-expression:
```
(add_custom_command):
Error evaluating generator expression:
$<TARGET_OBJECTS:MyProject_OBJECTS>
The evaluation of the TARGET_OBJECTS generator expression is only
suitable
for consumption by CMake. It is not suitable for writing out
elsewhere.
```
So I am currently out of ideas (which do not make the
CMakeLists.txt file completely unmaintainable). Therefore my
question is:
How can I retrieve the list of generated object-files so that I can
pass it to another program that should be run as additional
build-step before linking?
IMHO, the most comfortable (and syntactically cleanest) way would
be my first attempt. But that is probably more a feature-request
than a simple question.
FWIW this was implemented in the upcoming 3.9:
https://cmake.org/cmake/help/latest/module/CPackIFW.html#command:cpack_ifw_configure_component
Thank you for your answer, Nils, but I do not really see how this
relates.
This command seems to address CPack, while I am still struggling with
CMake building files (that later might be installed by CPack).
So sorry about that.
Must have gotten the wrong link in my clipboard.
The correct link is:
https://cmake.org/cmake/help/latest/release/3.9.html#other
Thanks a lot. That makes more sense now.
So I will wait for CMake 3.9 to automagically fix my problem. :-)
I just realized that CMake 3.9 does actually support my second attempt
(with some modifications), not my first attempt.
The first one still fails with the same reason: An OBJECT-library does
not support add_custom_command with POST_BUILD.
The working solution is to use the following command (which is a
slightly modification of my second attempt from above):
```
add_custom_command( TARGET ${PROJECT_NAME} PRE_LINK
COMMAND bash -c "for i in $(echo
'$<TARGET_OBJECTS:${PROJECT_NAME}_OBJECTS>' | tr '[;]' ' '); do objcopy
--compress-debug-sections $i; done"
VERBATIM
)
```
(Note, that I had to somehow get rid of the semicolon which was used as
delimiter in the list of target-objects because in bash a semicolon is
seen as a command-delimiter.)
However, although that worked, it led to another problem:
objcopy is modifying the object-files so that at least ninja thinks they
need to be rebuild the next time it is run. (Probably due to the fact,
that the hashes changed. make might be fine because it just looks at the
modification-date.)
If I would have been able to use my first attempt, that means
associating the object-files manipulation with the OBJECT-library
directly, that might not have been a problem, because the hash of the
object-files would not change and only be taken into consideration after
the OBJECT-library would have been created.
Is that observation correct!?
Are there any plans to support OBJECT-libraries with add_custom_command
and PRE_BUILD/POST_BUILD commands?
Or does anyone have another idea how to prevent ninja from rebuilding
all object-files after they were modified?
Thanks in advance,
Deniz
PS: Just letting objcopy modify copies of the object-files is no valid
workaround as it defeats its purpose in the fist place, which is to
reduce the space needed for the build-products on the harddrive.
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
information on each offering, please visit:
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake