Could you share more details about your CMake version, the platform you're on, 
and the generator you're using?

I haven't run into this issue (and it's pretty counter to how I'd expect CMake 
to behave). The only similar setting I'm aware of is 
https://cmake.org/cmake/help/latest/prop_tgt/LINK_DEPENDS_NO_SHARED.html, but 
that's for shared libraries, not static libraries.

As an experiment, I used the following CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.3)
project(cmtest C)
add_library(mylib STATIC source.c)
add_executable(mytest test.c)
target_link_libraries(mytest mylib)

I'm running CMake 3.12.3 on macOS 10.14.1, and I tried both the Makefile and 
Ninja generators. With both, any modification to source.c causes mytest to be 
rebuilt, as I'd expect (and unlike what you're seeing).

If you're able to provide a small self-contained CMakeLists.txt that reproduces 
the issue, that'd also be helpful for debugging.

Thanks,
Shoaib Meenai

From: CMake <[email protected]> on behalf of Stephan Menzel 
<[email protected]>
Date: Wednesday, April 3, 2019 at 10:56 PM
To: cmake <[email protected]>
Subject: Re: [CMake] Fake dependencies of executables to static libs

Hello again,

no ideas so far? Perhaps I can elaborate. I have tried multiple approaches over 
the years. Most recently adding the source files of the lib explicitly as 
dependencies to the created executable.

Like this:

set (SRC
MySource1.cpp
MySource2.cpp
)

set (HDR
MySource1.hpp
MySource2.hpp
)

add_library(mylib STATIC ${SRC} ${HDR})

add_executable(myexecutable main.cpp)
target_link_libraries(myexecutable
mylib
)

add_dependencies(myexecutable ${SRC})

This leads to errors though:

CMake Error at CMakeLists.txt:79 (add_dependencies):
  The dependency target "MySource1.cpp" of target "myexecutable" does not exist.

Obviously, I cannot simply state a filename and treat it as a target. I have 
however seen something similar been done when it comes to code generation. I 
have also seen explicit subtargets for files being created and then depend on 
those subtargets. But I don't really know how to do this the right way.

Alternatively I would also appreciate input about what exactly the problem with 
depending on static libs is. The explanations I remember from my last efforts 
to tackle this weren't really satisfying. If I understood in more detail why 
this isn't possible I may be able to better craft a workaround on my own.

Really, anything helps. I am losing time and nerve every day because of this 
and have been paying this price for so many years that I think it really is 
time to come up with a solution.

Cheers,
Stephan






On Tue, Apr 2, 2019 at 5:54 AM Stephan Menzel 
<[email protected]<mailto:[email protected]>> wrote:
Hello List,

In our projects we are using static linkage on Windows (MSVC) and Linux. A 
number of static libs are created and then linked into executables, such as 
unit tests, tools and the actual production artifacts. Very normal stuff.

add_library(mylib STATIC mysources)
add_excecutable(mytest mytest.cpp)
target_link_libraries(mytest mylib)

Now although I don't understand the exact reasons behind that, over the years 
came to accept that depedencies between the lib and the resulting artifcats are 
not working. Like, when I change a source file to mylib, the lib will get 
rebuilt but the resulting test tool won't be relinked.
For test driven development or busy change cycles that can put quite a strain 
on effort, especially on windows. My normal workflow is that I always click in 
mytest.cpp, add and remove a space to mark it dirty as quickly as possible and 
thereby cause the rebuild. But sometimes I forget this and this caused me quite 
a bit of extra work.
My question is, can I fake that dependency somehow? Perhaps by some hack or 
using some workaround?

What I want to achieve is that when I change the lib, the unit test (or any 
other test tool using it) that depends on it will be relinked, even if it has 
not changed.

Is that possible somehow?

Cheers,
Stephan
-- 

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

Reply via email to