To be clear, I do have a "package" target per real native target.
However, if I set up the dependencies like so:

Target 'A' depends on 'copy_dlls'
Target 'A' depends on target 'B'
Target 'A_package' depends on 'A'
Target 'A_package' depends on 'copy_dlls'

Furthermore, the add_custom_command() to delete 'libs' and copy the
*.so is added to 'A' and 'B' (each for their own 'libs' directory and
their own *.so output)

Then when I do:

$ ninja A_package

The following items are built in any order (due to parallel builds):

* B
* A (after B)
* copy_dlls

If 'copy_dlls' happens while 'B' is building, then it's possible the
post-build event run by B that deletes the 'libs' directory also
deletes some files copied by 'copy_dlls', which means those files will
not get packaged when 'A_package' invokes `ant release` for the APK
packaging.

I hope that makes the issue a little clearer... sorry for the confusion.

On Thu, May 18, 2017 at 1:22 PM, David Cole <dlrd...@aol.com> wrote:
> Seems to me the simplest thing to do would be to have copy_dlls depend
> on nothing, and have package depend on copy_dlls and all the native
> targets, and then tell your developers to run:
>
>   make individualTarget && make package
>
> Either that, or introduce a packageIndividualTarget target for each
> individualTarget.
>
> Maybe I just don't understand fully, but why would you ever "make
> individualTarget" and then expect package to work properly? What if
> stuff that depends on that individualTarget also needs to rebuild
> before packaging? Shouldn't you have to do a build all to guarantee
> that packaging the results works properly?
>
>
>
>
>
>
> On Thu, May 18, 2017 at 12:16 PM, Robert Dailey
> <rcdailey.li...@gmail.com> wrote:
>> So let me go over the problem I'm trying to solve, because it's
>> possible at this point I'm over-engineering it, but it's hard to fix.
>>
>> So my build process is for native shared library targets that
>> eventually get included in an APK for Android. I'm using the NDK
>> toolchain to build my native targets. The general flow from nothing to
>> complete APK is as follows:
>>
>> 1. Build all native library targets
>> 2. Copy native *.so outputs from the CMake build to `libs/armeabi-v7a`
>> in the android project directory (where the src, res, and other
>> android directories are located)
>> 3. Run custom commands that basically invoke 'ant release', and since
>> I positioned the *.so files under 'libs' they get packaged with the
>> APK itself.
>>
>> This is how I provide support for using CMake to build native, run
>> java build, and perform APK packaging.
>>
>> There's a lot of setup that happens in CMake in order to make sure the
>> 'ant release' command behaves as expected. I have to handle a few
>> corner cases:
>>
>> * Each new build of the custom target that runs the 'ant release'
>> command has to only contain the *.so files that were built during that
>> run
>> * Various third-party libraries (pre-compiled *.so files) have to also
>> be copied to libs/armeabi-v7a for only certain android projects,
>> because we do not want duplicated *.so files across multiple android
>> libraries (ant release will fail if there are duplicate *.so files
>> across android project dependencies)
>>
>> So given this, my complete pipeline is as follows:
>>
>> 1. A `android_clean_libs` custom target is run which iterates all
>> known native targets with mapped java projects and completely deletes
>> its 'libs' directory (this is a forced clean prior to building)
>> 2. A `copy_dlls` target runs next, which copies third party
>> (precompiled) *.so files to a single common java project, in its
>> 'libs/armeabi-v7a' directory.
>> 3. Each native target now builds in parallel, as a post-build event it
>> copies its output *.so file to its respective libs/armeabi-v7a
>> directory for packaging.
>> 4. A final 'package' custom target runs which runs 'ant release' on
>> the bottom-most android project (that is not a library target by
>> itself).
>>
>> The part I don't like here is step #1. I don't like the clean to
>> require keeping track of a global property of a list of directories to
>> remove. Ideally, #1 should run as a post-build event during step 3.
>> Basically each native target should delete its 'libs' directory prior
>> to copying its own *.so target to that directory. However, I can't do
>> this because of step #2. Step 2 must happen first, because it's the
>> only way I can guarantee that it will execute regardless of which
>> target I build (all, or specific target). I make `copy_dlls` a
>> dependency of every other target, so it always runs. If I could force
>> it to run *last*, then I could simplify step 1.
>>
>> Sorry if this is too much information or if I've not explained things
>> clearly, but I wanted to hash out the details because maybe there is a
>> better approach. I'm willing to start from scratch on this if it
>> improves the design of the targets.
>>
>> Thanks again!!
>>
>>
>> On Thu, May 18, 2017 at 10:51 AM, David Cole <dlrd...@aol.com> wrote:
>>> I'm sorry, I misunderstood that you wanted it to run last regardless
>>> of what target you are building. I was assuming you wanted it to
>>> happen when you build the "all" target. I didn't think you wanted to
>>> run it after any other *individual* target which you might specify.
>>>
>>> I don't know of an easy way to do that. You could add a custom command
>>> as a post-build command on every single target, but that seems like it
>>> wouldn't work for you either, as it would run the command potentially
>>> multiple times, with no way to tell whether you're being called last
>>> or not.
>>>
>>> Sorry.
>>>
>>> Why does this need to run after the build of any individual target?
>>> Why not just say there are two ways to get it to run: build "all" or
>>> explicitly build it after you build the other individual thing you
>>> want?
>>>
>>>
>>>
>>>
>>> On Thu, May 18, 2017 at 10:24 AM, Robert Dailey
>>> <rcdailey.li...@gmail.com> wrote:
>>>> David,
>>>>
>>>> Thanks for your help. So if I do it as you suggest, this will also
>>>> require I specify `ALL` to add_custom_target(), correct? If I do it
>>>> this way, will it still run even if it isn't a dependency of the
>>>> target I'm building?
>>>>
>>>> Let me set up a simple scenario for my own understanding. Suppose I
>>>> have the following targets:
>>>>
>>>> * A (add_library target)
>>>> * B (add_library target)
>>>> * C (add_custom_target target)
>>>>
>>>> Dependencies:
>>>>
>>>> B depends on A
>>>> C depends on B and A
>>>>
>>>> Normally if I build B, only A and B will build. However, if C was set
>>>> up using `ALL`, will it build C when I build B? So the expected build
>>>> order in this case would be:
>>>>
>>>> 1. A
>>>> 2. B
>>>> 3. C
>>>>
>>>> Thanks in advance.
>>>>
>>>> On Wed, May 17, 2017 at 4:26 PM, David Cole <dlrd...@aol.com> wrote:
>>>>> The way I know how to do this is to add it last at the bottom of the
>>>>> top-level CMakeLists.txt file, and then use add_dependencies to make
>>>>> it depend on all other targets. (Or at least all other "leaf" targets,
>>>>> which further depend on others, ... the sum of which is "all other
>>>>> targets" besides the new "last" target.)
>>>>>
>>>>> So it's not pretty, but it's possible.
>>>>>
>>>>>
>>>>> HTH,
>>>>> David C.
>>>>>
>>>>>
>>>>>
>>>>> On Wed, May 17, 2017 at 11:36 AM, Robert Dailey
>>>>> <rcdailey.li...@gmail.com> wrote:
>>>>>> I have a custom target that must meet the following requirements:
>>>>>>
>>>>>> * It must always run, regardless of what subset of other targets are 
>>>>>> being built
>>>>>> * It must always be the very last thing run. In parallelized builds,
>>>>>> it must wait until all other targets are done building before
>>>>>> starting, so that it is the very last target run, and should not run
>>>>>> in parallel  with others.
>>>>>>
>>>>>> Is this possible? I'm willing to use hackery if needed...
>>>>>>
>>>>>> Running CMake 3.8.0. Thanks!
>>>>>> --
>>>>>>
>>>>>> 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
-- 

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

Reply via email to