Folks,
I’m working with a very large CMakeLists.txt, and I’m having trouble generating
a working
Xcode project from it (the Ninja and Make generators seem to work fine).
What’s happening is that the post-build step associated with each of the
targets in
XCODE_DEPEND_HELPER.make is aggressively deleting a bunch of other targets,
including
some that either a) haven’t been built yet; or b) are in the process of being
built.
The former isn’t an issue, but the latter is: I get a build error when this
happens.
Here’s a *very* cut-down look at what’s happening:
Showing All Messages, Filtering for "libpacing.a".
PhaseScriptExecution CMake\ PostBuild\ Rules
build/xcode-osx/cmake/osx/Release/project.build/Debug/ApiVideo_CodecsVideo_Codecs_Api.build/Script-62A3C733E930414E85209FFB.sh
cd /Users/jim/Workspace/myproject
/bin/sh -c
/Users/jim/Workspace/myproject/build/xcode-osx/cmake/osx/Release/project.build/Debug/ApiVideo_CodecsVideo_Codecs_Api.build/Script-62A3C733E930414E85209FFB.sh
/bin/rm -f
/Users/jim/Workspace/myproject/build/xcode-osx/obj/modules/pacing/Debug/libpacing.a
PhaseScriptExecution CMake\ PostBuild\ Rules
build/xcode-osx/cmake/osx/Release/project.build/Debug/Rtc_BaseAudio_Format_To_String.build/Script-61E5555E2FB7443C905B7CC4.sh
cd /Users/jim/Workspace/myproject
/bin/sh -c
/Users/jim/Workspace/myproject/build/xcode-osx/cmake/osx/Release/project.build/Debug/Rtc_BaseAudio_Format_To_String.build/Script-61E5555E2FB7443C905B7CC4.sh
/bin/rm -f
/Users/jim/Workspace/myproject/build/xcode-osx/obj/modules/pacing/Debug/libpacing.a
*** there are a lot more instances of this pattern ***
Libtool build/xcode-osx/obj/modules/pacing/Debug/libpacing.a normal x86_64
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool
-static -arch_only x86_64 -syslibroot
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk
-L/Users/jim/Workspace/myproject/build/xcode-osx/obj/modules/pacing/Debug
-filelist
/Users/jim/Workspace/myproject/build/xcode-osx/cmake/osx/Release/project.build/Debug/ModulesPacingPacing.build/Objects-normal/x86_64/pacing.LinkFileList
/Users/jim/Workspace/myproject/build/xcode-osx/cmake/osx/Release/project.build/Debug/Rtc_BaseRtc_Event.build/Objects-normal/x86_64/event.o
-o
/Users/jim/Workspace/myproject/build/xcode-osx/obj/modules/pacing/Debug/libpacing.a
fatal error:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool:
can't stat file output file:
/Users/jim/Workspace/myproject/build/xcode-osx/obj/modules/pacing/Debug/libpacing.a
(No such file or directory)
*** here we’re dead ***
*** deleting libpacing.a one more time for good measure ***
PhaseScriptExecution CMake\ PostBuild\ Rules
build/xcode-osx/cmake/osx/Release/project.build/Debug/ModulesAudio_ProcessingAgc2Fixed_Digital.build/Script-A48E7039684F4F828D6DC3DE.sh
cd /Users/jim/Workspace/myproject
/bin/sh -c
/Users/jim/Workspace/myproject/build/xcode-osx/cmake/osx/Release/project.build/Debug/ModulesAudio_ProcessingAgc2Fixed_Digital.build/Script-A48E7039684F4F828D6DC3DE.sh
/bin/rm -f
/Users/jim/Workspace/myproject/build/xcode-osx/obj/modules/pacing/Debug/libpacing.a
As you can see, Xcode is complaining about the file libpacing.a not existing at
the same time
it’s trying to link that very file. My guess has been that the file is getting
deleted out
from under the linker. I’m not sure how to resolve that issue, however.
Part of the issue here is that we’re working with a very large CMake file that
was generated
from the output of another build system (don’t ask), so narrowing this down to
an easily
replicable scenario has been challenging. As far as I can tell, the problem is
as follows:
1. Target A is an object library that is used by several targets.
2. Target A* is the post-build target for A.
3. Target B is an executable that depends on A.
4. Target C is different library that B depends on.
Notably, C does not depend on A; nor does A depend on C.
After A is built by Xcode, it builds A* in XCODE_DEPEND_HELPER.make. Because B
depends on A,
A* depends on B in this Makefile. As a result, B’s dependencies are checked to
make sure it’s
up to date.
B depends on C (both in reality and in XCODE_DEPEND_HELPER.make), so C’s
dependencies are
checked. And if C’s dependencies aren’t up to date, or if C doesn’t exist at
all, C is
“built”, which in the context of XCODE_DEPEND_HELPER.make means that it’s
deleted, since
the action for C is “rm -f C”.
As a consequence, building A seems to result in the deletion of C; and if there
are many
targets like A (targets that are depended on by things that also depend on C),
C can
be deleted many times.
And, since there’s no dependency relationship between A and C, there’s nothing
preventing
A’s post-build step from running at the same time C is being built, which
produces (I think)
the errors we’re seeing.
Does this analysis seem correct, or am I missing something about how
XCODE_DEPEND_HELPER.make
is supposed to work?
Assuming I’m on the right track, what’s the right path to resolve the issue?
The dependency
structure referenced above seems to be valid, at least superficially, but it’s
giving Xcode fits.
We’re in the process of massaging the generated CMake into shape manually, but
I want to
make sure we’re headed in the right direction.
Thanks in advance for any hints or guidance you can provide.
--
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:
https://cmake.org/mailman/listinfo/cmake