Hi @all,
I'm quite new to CMake. If I've made a mistake or something is much easier to
solve, please tell me.
I'd like to use CMake in embedded development (Build System: Linux, Target: ARM
Microcontroller) to get rid of complicated makefiles.
We're building multiple devices where stuff like embedded rtos and peripheral
drivers are identical, so I'd like to separate this part from the user
application. I've achieved that by creating an object library out of all source
and header files, and packing those files using CPack. This archive is then
statically linked against the user application.
So far this worked fine. However, now I have to use driver functions in the
rtos source code and vice versa, resulting in cross-dependencies for header
files:
<drivers/uart.c>
#include uart.h
#include terminal.h
function() {}
<os/terminal.c>
#include terminal.h
#include uart.h
function() {}
How do I resolve something like this? Right now CMake evaluates the compiler
includes in the order that subdirectories are added. This gives me an
compilation error in uart.c that terminal.h cannot be found.
Thank you for your help!
Regards,
Martin
Some excerpt of my project. I've tried to keep the example as simple as
possible.
My directory structure looks something like that:
/
CMakeLists.txt
src +
+CMakeLists.txt (1)
+drivers+
| +uart.c
| +uart.h
| +...
| +CMakeLists.txt (2)
+os-----+
| +terminal.c
| +terminal.h
| +...
| +CMakeLists.txt (3)
(1):
SET(drivers "drivers")
SET(terminal "terminal")
SET(drivers_lib ${drivers})
SET(terminal_lib ${terminal})
SET(ARCHIVE_INSTALL_DIR lib)
SET(INCLUDE_INSTALL_DIR include)
SET(headers_private "_headers_private") # internal headers
SET(headers_public "_headers_public") # public headers go into package
ADD_SUBDIRECTORY(${drivers})
ADD_SUBDIRECTORY(${terminal})
## ---- Targets
-------------------------------------------------------------------
ADD_LIBRARY(bsp ${object_libs})
INSTALL(TARGETS bsp DESTINATION ${ARCHIVE_INSTALL_DIR})
(2):
## drivers
## ---- Sources
-------------------------------------------------------------------
SET(sources
"uart.c"
)
## ---- Header includes
-----------------------------------------------------------
SET(headers
"${CMAKE_CURRENT_SOURCE_DIR}/"
)
SET(${drivers}${headers_public} ${headers} PARENT_SCOPE)
INCLUDE_DIRECTORIES(${headers}
${${terminal}${headers_public}}
)
## ---- Targets
-------------------------------------------------------------------
ADD_LIBRARY(${drivers_lib} OBJECT ${sources})
# add to list of Object Targets
SET(object_libs ${object_libs} $<TARGET_OBJECTS:${drivers_lib}> PARENT_SCOPE)
INSTALL(DIRECTORY ${headers} DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING
PATTERN "*.h")
(3), mostly like (2):
## rtos
## ---- Sources
-------------------------------------------------------------------
SET(sources
"terminal.c"
)
## ---- Header includes
-----------------------------------------------------------
SET(headers
"${CMAKE_CURRENT_SOURCE_DIR}/"
)
SET(${terminal}${headers_public} ${headers} PARENT_SCOPE)
INCLUDE_DIRECTORIES(${headers}
${${drivers}${headers_public}}
)
## ---- Targets
-------------------------------------------------------------------
ADD_LIBRARY(${terminal_lib} OBJECT ${sources})
# add to list of Object Targets
SET(object_libs ${object_libs} $<TARGET_OBJECTS:${terminal_lib}> PARENT_SCOPE)
INSTALL(DIRECTORY ${headers} DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING
PATTERN "*.h")
And finally this creates the package in root directory CMakeLists.txt:
SET(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackOptions.cmake) #
CPackOptions.cmake contains package file name
SET(CPACK_GENERATOR "TBZ2")
INCLUDE(CPack)
I've searched for a solution for this problem for ~1 day, most results only
deal with one directional dependencies or link a shared library/executable at
the end, which does not help me.
When changing (2) "INCLUDE_DIRECTORIES" to
INCLUDE_DIRECTORIES(${headers}
"/home/user/workspace/arm_bsp/src/terminal/"
)
compilation works as expected, but breaks independence of child folders to
parent folders. I defenitively do not want to do that.
CMake Version is "cmake version 3.0.2" (stock Debian 8)
--
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