Hello,
My apologies in advance if I'm completely mis-reading your question and
if this answer seems way off base: just addressing what seemed like the
most likely issue from the info you provided. (This link below [1]
might help you get better results out of mailing lists.)
A script called by find_package(whatever) only normally sets variables
in CMake - it doesn't include or link any targets against any
libraries. (You might have several targets in one CMake project, each
that link against different libraries) So, in addition to the
find_package(Mypackage), in your CMakeLists.txt, you'll also want to do,
for example:
include_directories(${MYPACKAGE_INCLUDE_DIRS})
add_executable(myapp ${MYAPP_SOURCES})
target_link_libraries(myapp ${MYPACKAGE_FOOCOMP_LIBRARY}
${MYPACKAGE_BARCOMP_LIBRARY})
Note that according to the readme.txt in the modules directory of cmake
(and what seems to be convention), you'll note that your find module
variables should probably be named as above (
PACKAGEUPPER_COMPONENTUPPER_LIBRARY ). Additionally, once you've run
find_package_handle_standard_args, if(PACKAGEUPPER_FOUND), you will
probably want to do the following - this example assumes you have some
main library for the package that's always needed to link against that
package, and some additional optional libraries specified as components
(openscenegraph is an example of one of these types of packages)
set(PACKAGEUPPER_LIBRARIES ${PACKAGEUPPER_LIBRARY})
foreach(COMPONENT ${list_of_requested_and_found_components})
list(APPEND PACKAGEUPPER_LIBRARIES ${PACKAGEUPPER_COMPONENT_LIBRARY})
endforeach()
I've attached a rather simple example of this kind of script - you'd of
course have your component search loop and the additional foreach loop
explained above added to this basic structure. (and if you're doing it
by creating imported targets, you'll obviously use that code instead of
the direct file path code)
Hope this helps!
Ryan
[1] http://catb.org/~esr/faqs/smart-questions.html
On 01/07/2010 09:19 AM, Nico Schlömer wrote:
Hi Michael,
I added to the FindMypackage.cmake in the FOREACH(COMPONENT) loop the
following snipped
ADD_LIBRARY(${COMPONENT} STATIC IMPORTED)
SET_TARGET_PROPERTIES( ${COMPONENT} PROPERTIES
IMPORTED_LOCATION "${${UPPERCOMPONENT}_LIBRARY}"
LINK_INTERFACE_LIBRARIES
"${${COMPONENT}_LINK_INTERFACE_LIBRARIES}"
)
where "${${UPPERCOMPONENT}_LIBRARY}" is the path of the respective
library in the filesystem, and
"${${COMPONENT}_LINK_INTERFACE_LIBRARIES}" a semicolon-separated list
of dependencies of ${COMPONENT} (being either another component, or
something of the form /path/to/libfancy.a). CMake does create all the
Makefiles -- good -- but the dependency information doesn't sit in
there (?).
I expected that I can go like
FIND_PACKAGE( Mypackage COMPONENTS foocomp barcomp )
and that all the necessary stuff would be included automatically. --
Well, now that I think about it this is probably a pipe dream. What
would I further have to include?
Cheers,
Nico
On Thu, Jan 7, 2010 at 12:47 PM, Michael Wild<them...@gmail.com> wrote:
Hi Nico
In that case you need to do this:
add_library(${COMPONENT} IMPORTED)
set_target_properties(${COMPONENT} PROPERTIES
IMPORTED_LOCATION "${${COMPONENT}_LIBRARY}"
LINK_INTERFACE_LIBRARIES "${${COMPONENT}_LINK_INTERFACE_LIBRARIES}"
)
where each of the components X has a variable X_LIBRARY containing its path on
the system (e.g. determined by find_library(X_LIBRARY ...)) and a variable
X_LINK_INTERFACE_LIBRARIES which you have to set outside the foreach loop.
HTH
Michael
On 7. Jan, 2010, at 11:51 , Nico Schlömer wrote:
Hi Michael,
thanks for the explanations.
I'm indeed about to write a FindModule.cmake for a library which I did
*not* write, but to certain components of which I'd like to link
against using CMake (in a clean fashion).
I'm FOREACHing through the components of the library, and upon trying to set
ADD_LIBRARY( ${COMPONENT} )
cmake complains about
add_library cannot create target "A" because another target with the
same name already exists. The existing target is a static library created
in source directory "/path/to/A". See
documentation for policy CMP0002 for more details.
Okay, so it exists already? Fine. Let's then
SET_TARGET_PROPERTIES( ${COMPONENT} PROPERTIES
LINK_INTERFACE_LIBRARIES "B;C;" )
-- but again, cmake complains that
set_target_properties Can not find target to add properties to: A
TARGET_LINK_LIBRARIES doesn't work anyway as I'm not *building the
libraries (cmake says).
Hmmm...
Nico
On Thu, Jan 7, 2010 at 11:08 AM, Michael Wild<them...@gmail.com> wrote:
One quick question: Are these libraries created by you? In that case you
shouldn't write a FindMymodule.cmake, but a MymoduleConfig.cmake (see the
documentation of find_package).
Anyhow, to define the transitive link dependencies you can either use
target_link_libraries(A LINK_INTERFACE_LIBRARIES B C) if your CMake is new enough, or you
can use set_target_properties(A PROPERTIES LINK_INTERFACE_LIBRARIES "B;C").
Both solutions require that you use add_library(X IMPORTED) (where X = A, B and C) and
set their IMPORTED_LOCATION property to the location on the file system. All of this is
full automatic if you write a MymoduleConfig.cmake, because then you can use
install_targets(A B C EXPORT MymoduleExports
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
PUBLIC_HEADER DESTINATION include
)
install(EXPORT MymoduleExports
NAMESPACE Mymodule_
DESTINATION share/mymodule/cmake
)
which will install a file
${CMAKE_INSTALL_PREFIX}/share/mymodule/cmake/MymoduleExports.cmake containing
all the IMPORT stuff and which you can INCLUDE in your MymoduleConfig.cmake.
I hope I could help a bit, otherwise tell us which case it is and I'll be able
to help more.
Michael
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake
--
Ryan Pavlik
HCI Graduate Student
Virtual Reality Applications Center
Iowa State University
rpav...@iastate.edu
http://academic.cleardefinition.com
Internal VRAC/HCI Site: http://tinyurl.com/rpavlik
# - try to find GPM library
#
# Cache Variables: (probably not for direct use in your scripts)
# GPM_INCLUDE_DIR
# GPM_LIBRARY
#
# Non-cache variables you might use in your CMakeLists.txt:
# GPM_FOUND
# GPM_INCLUDE_DIRS
# GPM_LIBRARIES
# GPM_MARK_AS_ADVANCED - whether to mark our vars as advanced even
# if we don't find this library.
#
# Requires these CMake modules:
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpav...@iastate.edu> <abir...@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
find_library(GPM_LIBRARY
NAMES gpm)
find_path(GPM_INCLUDE_DIR
NAMES gpm.h)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GPM DEFAULT_MSG
GPM_LIBRARY
GPM_INCLUDE_DIR)
if(GPM_FOUND)
set(GPM_LIBRARIES "${GPM_LIBRARY}")
set(GPM_INCLUDE_DIRS "${GPM_INCLUDE_DIR}")
endif()
if(GPM_FOUND OR GPM_MARK_AS_ADVANCED)
foreach(_cachevar
GPM_INCLUDE_DIR
GPM_LIBRARY)
mark_as_advanced(${_cachevar})
endforeach()
endif()
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake