[CMake] How to define an 'include_directories' different for each library
Steven Wilson
steven.wesley.wilson at gmail.com
Wed Nov 4 11:30:24 EST 2009
There is no magic way to do this with CMake. However, if you don't mind
writing some functions/macros you can use a variant of the following
function to do what you want:
function(build_library NAME KIND SOURCES DEFINITIONS CFLAGS LFLAGS LIBS
IPATHS LPATHS)
unset(MYCOMPILE_FLAGS)
unset(MYLINK_FLAGS)
set(MYCOMPILE_FLAGS "${CFLAGS}")
set(MYLINK_FLAGS "${LFLAGS}")
if(UNIX)
foreach(IPATH ${IPATHS})
set(MYCOMPILE_FLAGS "${MYCOMPILE_FLAGS} -I${IPATH}")
endforeach(IPATH)
foreach(LPATH ${LPATHS})
set(MYLINK_FLAGS "${MYLINK_FLAGS} -L${LPATH}")
endforeach(LPATH)
elseif(WIN32)
foreach(IPATH ${IPATHS})
set(MYCOMPILE_FLAGS "${MYCOMPILE_FLAGS} /I${IPATH}")
endforeach(IPATH)
foreach(LPATH ${LPATHS})
set(MYLINK_FLAGS "${MYLINK_FLAGS} /LIBPATH:\"${LPATH}\"")
endforeach(LPATH)
endif(UNIX)
add_library(${NAME} ${KIND} ${SOURCES})
target_link_libraries(${NAME} ${LIBS})
set_target_properties(${NAME} PROPERTIES
COMPILE_DEFINITIONS "${DEFINITIONS}"
COMPILE_FLAGS "${MYCOMPILE_FLAGS}"
LINK_FLAGS "${MYLINK_FLAGS}"
)
endfunction(build_library)
This function build_library is designed to allow you to pass target specific
configurations where includes/etc are different for each target. You assign
the includes/defintions/etc to variables and then pass the values as
follows:
build_library(foo STATIC
"${FOO_SOURCES}"
"${FOO_COMPILE_DEFINITIONS}"
"${FOO_COMPILE_FLAGS}"
"${FOO_LINK_FLAGS}"
"${FOO_LIBS}"
"${FOO_INCLUDE_DIRECTORIES}"
"${FOO_LINK_DIRECTORIES}"
)
The sources, compile definitions, libraries, include directories and link
directories variables should all be lists of values while the compile flags
and the link flags should be strings of compiler/linker flags. The second
argument of the function sets the kind of library, STATIC/SHARED/etc...
This function then 'hacks' the include directories into the compiler flags
and the link directories into the link flags with the appropriate command
line escape by platform (-I for Unix, /I for Windows, etc...).
Hope this helps,
Steve
On Wed, Nov 4, 2009 at 8:39 AM, Olivier Pierard
<olivier.pierard at cenaero.be>wrote:
> Hi,
>
> A quite basic question...
>
> In a given project, I build several libraries and an executable. How
> can I get a different 'include_directories' for each library and not the
> same list for all of them (typically, I don't want to have access to the
> includes related to the last library when compiling the first one).
>
> Thank you,
>
> Olivier
>
>
> _______________________________________________
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20091104/af8a56f0/attachment.htm>
More information about the CMake
mailing list