Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake install (TARGETS in subdirectories)

Consider the following CMakeLists.txt file:

add_subdirectory(execA) add_subdirectory(libB)  install(TARGETS execA libB         RUNTIME DESTINATION bin         LIBRARY DESTINATION lib         ARCHIVE DESTINATION lib) 

I get the following error:

install TARGETS given target "execA" which does not exist in this   directory 

execA and libB have their own CMakeList.txt files and are located under project directory, as well as the build directory I'm running cmake (cmake ..):

project   |------ CMakeList.txt (the one with the code)   |----execA   |      \- .cpp, .hpp and CMakelist.txt   |----libB   |      \- .cpp, .hpp and CMakelist.txt   |---- lib   |---- bin   \---- build (where I´m commanding: $ cmake .. 

How do I fix this error?

like image 777
Mendes Avatar asked Dec 23 '15 20:12

Mendes


2 Answers

According to this bugreport, install(TARGETS) command flow accepts only targets created within the same directory.

So you need either move the add_library() call into the top-level directory, or split install(TARGETS) call into per-target ones, and move each of them into the corresponding subdirectory.

Since CMake 3.13 install(TARGETS) can work even with targets created in other directories.

install(TARGETS) can install targets that were created in other directories. When using such cross-directory install rules, running make install (or similar) from a subdirectory will not guarantee that targets from other directories are up-to-date.

like image 129
Tsyvarev Avatar answered Oct 19 '22 14:10

Tsyvarev


Even though it would help seeing the CMakeLists.txt files contained in the subdirectories, I guess they contain add_executable and/or add_library statements to create your stuff.
Also, because of your example, I guess you are using the same name of your directories for your targets.
That said, you should know that symbols defined in a CMakeLists.txt file in a subdirectory are not visible by default within the context of the CMakeLists.txt file in the parent directory. Because of that, you should rather move your install statements within the CMakeLists.txt files within your subdirectories.
This should solve the problem, if my thoughts were right. Otherwise, I strongly suggest you to post in your question also the content of the other files above mentioned.

Anyway, the error is quite clear.
The file that contains the install statement for the target named X does not contain a target creation statement (add_executable and the others) that gives birth to that target, so it goes on saying that that target does not exist in that directory.

like image 33
skypjack Avatar answered Oct 19 '22 14:10

skypjack