Skip to content

Commit ccbaa7c

Browse files
author
Peter Soetens
committed
cmake: fix bug #1012: CMake issues with newer Xenomai custom installs.
Addressed the various issues and ambiguous error reports one could have when selecting the xenomai target. Also fixed linking with the mqueue headers in Xenomai environments by passing the flags from xeno-config directly. Signed-off-by: Peter Soetens <[email protected]>
1 parent 2c830bf commit ccbaa7c

7 files changed

+53
-20
lines changed

config/FindXenomai.cmake

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
################################################################################
22
#
3-
# CMake script for finding XENOMAI.
3+
# CMake script for finding the XENOMAI native skin.
44
# If the optional XENOMAI_ROOT_DIR environment variable exists, header files and
55
# libraries will be searched in the XENOMAI_ROOT_DIR/include and XENOMAI_ROOT_DIR/lib
66
# directories, respectively. Otherwise the default CMake search process will be
@@ -21,6 +21,14 @@ if(NOT $ENV{XENOMAI_ROOT_DIR} STREQUAL "")
2121
mark_as_advanced(XENOMAI_ROOT_DIR)
2222
endif()
2323

24+
if ( Xenomai_FIND_QUIETLY )
25+
set( XENOMAI_FIND_QUIETLY "QUIET")
26+
endif()
27+
28+
if ( Xenomai_FIND_REQUIRED )
29+
set( XENOMAI_FIND_REQUIRED "REQUIRED")
30+
endif()
31+
2432
# Header files to find
2533
set(header_NAME native/task.h)
2634

@@ -31,16 +39,26 @@ set(XENOMAI_NATIVE_NAME native)
3139
# Find headers and libraries
3240
if(XENOMAI_ROOT_DIR)
3341
# Use location specified by environment variable
42+
find_program(XENOMAI_XENO_CONFIG NAMES xeno-config PATHS ${XENOMAI_ROOT_DIR}/bin NO_DEFAULT_PATH)
3443
find_path(XENOMAI_INCLUDE_DIR NAMES ${header_NAME} PATHS ${XENOMAI_ROOT_DIR}/include PATH_SUFFIXES xenomai NO_DEFAULT_PATH)
3544
find_library(XENOMAI_LIBRARY NAMES ${XENOMAI_NAME} PATHS ${XENOMAI_ROOT_DIR}/lib NO_DEFAULT_PATH)
3645
find_library(XENOMAI_NATIVE_LIBRARY NAMES ${XENOMAI_NATIVE_NAME} PATHS ${XENOMAI_ROOT_DIR}/lib NO_DEFAULT_PATH)
3746
else()
3847
# Use default CMake search process
48+
find_program(XENOMAI_XENO_CONFIG NAMES xeno-config )
3949
find_path(XENOMAI_INCLUDE_DIR NAMES ${header_NAME} PATH_SUFFIXES xenomai )
4050
find_library(XENOMAI_LIBRARY NAMES ${XENOMAI_NAME})
4151
find_library(XENOMAI_NATIVE_LIBRARY NAMES ${XENOMAI_NATIVE_NAME})
4252
endif()
4353

54+
if( XENOMAI_LIBRARY AND XENOMAI_INCLUDE_DIR AND NOT XENOMAI_XENO_CONFIG )
55+
message(SEND_ERROR "Your Xenomai installation is broken: I can not determine Xenomai Native cflags/ldflags without xeno-config.")
56+
else()
57+
execute_process(COMMAND ${XENOMAI_XENO_CONFIG} --skin=native --ldflags OUTPUT_VARIABLE XENOMAI_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
58+
execute_process(COMMAND ${XENOMAI_XENO_CONFIG} --skin=native --cflags OUTPUT_VARIABLE XENOMAI_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
59+
endif()
60+
61+
4462
# Set the include dir variables and the libraries and let libfind_process do the rest.
4563
# NOTE: Singular variables for this library, plural for libraries this this lib depends on.
4664
set(XENOMAI_PROCESS_INCLUDES XENOMAI_INCLUDE_DIR)

config/FindXenomaiPosix.cmake

+18-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
################################################################################
22
#
3-
# CMake script for finding XENOMAI.
3+
# CMake script for finding the XENOMAI Posix skin.
44
# If the optional XENOMAI_ROOT_DIR environment variable exists, header files and
55
# libraries will be searched in the XENOMAI_ROOT_DIR/include and XENOMAI_ROOT_DIR/lib
66
# directories, respectively. Otherwise the default CMake search process will be
@@ -16,9 +16,17 @@
1616
include(LibFindMacros)
1717

1818
# Get hint from environment variable (if any)
19-
if(NOT $ENV{XENOMAI_POSIX_ROOT_DIR} STREQUAL "")
20-
set(XENOMAI_POSIX_ROOT_DIR $ENV{XENOMAI_POSIX_ROOT_DIR} CACHE PATH "Xenomai Posix base directory location (optional, used for nonstandard installation paths)" FORCE)
21-
mark_as_advanced(XENOMAI_POSIX_ROOT_DIR)
19+
if(NOT $ENV{XENOMAI_ROOT_DIR} STREQUAL "")
20+
set(XENOMAI_ROOT_DIR $ENV{XENOMAI_ROOT_DIR} CACHE PATH "Xenomai Posix base directory location (optional, used for nonstandard installation paths)" FORCE)
21+
mark_as_advanced(XENOMAI_ROOT_DIR)
22+
endif()
23+
24+
if ( XenomaiPosix_FIND_QUIETLY )
25+
set( XENOMAI_POSIX_FIND_QUIETLY "QUIET")
26+
endif()
27+
28+
if ( XenomaiPosix_FIND_REQUIRED )
29+
set( XENOMAI_POSIX_FIND_REQUIRED "REQUIRED")
2230
endif()
2331

2432
# Header files to find
@@ -28,11 +36,11 @@ set(header_NAME pthread.h)
2836
set(XENOMAI_POSIX_NAME pthread_rt)
2937

3038
# Find headers and libraries
31-
if(XENOMAI_POSIX_ROOT_DIR)
39+
if(XENOMAI_ROOT_DIR)
3240
# Use location specified by environment variable
33-
find_program(XENOMAI_XENO_CONFIG NAMES xeno-config PATHS ${XENOMAI_POSIX_ROOT_DIR}/bin NO_DEFAULT_PATH)
34-
find_path(XENOMAI_POSIX_INCLUDE_DIR NAMES ${header_NAME} PATHS ${XENOMAI_POSIX_ROOT_DIR}/include PATH_SUFFIXES xenomai/posix NO_DEFAULT_PATH)
35-
find_library(XENOMAI_POSIX_LIBRARY NAMES ${XENOMAI_POSIX_NAME} PATHS ${XENOMAI_POSIX_ROOT_DIR}/lib NO_DEFAULT_PATH)
41+
find_program(XENOMAI_XENO_CONFIG NAMES xeno-config PATHS ${XENOMAI_ROOT_DIR}/bin NO_DEFAULT_PATH)
42+
find_path(XENOMAI_POSIX_INCLUDE_DIR NAMES ${header_NAME} PATHS ${XENOMAI_ROOT_DIR}/include PATH_SUFFIXES xenomai/posix NO_DEFAULT_PATH)
43+
find_library(XENOMAI_POSIX_LIBRARY NAMES ${XENOMAI_POSIX_NAME} PATHS ${XENOMAI_ROOT_DIR}/lib NO_DEFAULT_PATH)
3644
else()
3745
# Use default CMake search process
3846
find_program(XENOMAI_XENO_CONFIG NAMES xeno-config )
@@ -43,8 +51,8 @@ endif()
4351
if( XENOMAI_POSIX_LIBRARY AND XENOMAI_POSIX_INCLUDE_DIR AND NOT XENOMAI_XENO_CONFIG )
4452
message(SEND_ERROR "Your Xenomai installation is broken: I can not determine Xenomai POSIX cflags/ldflags without xeno-config.")
4553
else()
46-
execute_process(COMMAND ${XENOMAI_XENO_CONFIG} --posix-ldflags OUTPUT_VARIABLE XENOMAI_POSIX_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
47-
execute_process(COMMAND ${XENOMAI_XENO_CONFIG} --posix-cflags OUTPUT_VARIABLE XENOMAI_POSIX_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
54+
execute_process(COMMAND ${XENOMAI_XENO_CONFIG} --skin=posix --ldflags OUTPUT_VARIABLE XENOMAI_POSIX_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
55+
execute_process(COMMAND ${XENOMAI_XENO_CONFIG} --skin=posix --cflags OUTPUT_VARIABLE XENOMAI_POSIX_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
4856
endif()
4957

5058
# Set the include dir variables and the libraries and let libfind_process do the rest.

config/LibFindMacros.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ macro (libfind_process PREFIX)
7171
foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS})
7272
message("${i}=${${i}}")
7373
endforeach (i)
74-
message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, use the ${PREFIX}_ROOT_DIR environment variable or ccmake to set the missing variables manually.")
74+
message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, set the ${PREFIX}_ROOT_DIR environment variable or use cmake to set the missing variables manually.")
7575
else (${PREFIX}_FIND_REQUIRED) # NOTE: else case not included in original file
7676
message (STATUS "Optional library ${PREFIX} NOT FOUND. If the library is already installed, use the ${PREFIX}_ROOT_DIR environment variable or ccmake to set the missing variables manually.")
7777
endif (${PREFIX}_FIND_REQUIRED)

config/check_depend.cmake

+9-2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ endif(XERCES_FOUND)
111111
message("Orocos target is ${OROCOS_TARGET}")
112112
string(TOUPPER ${OROCOS_TARGET} OROCOS_TARGET_CAP)
113113

114+
if ( NOT ";lxrt;gnulinux;xenomai;macosx;win32;" MATCHES ".*;${OROCOS_TARGET};.*")
115+
message( FATAL_ERROR "OROCOS_TARGET=${OROCOS_TARGET} is an unkown target. Please use one of lxrt;gnulinux;xenomai;macosx;win32.")
116+
endif()
117+
114118
# Setup flags for RTAI/LXRT
115119
if(OROCOS_TARGET STREQUAL "lxrt")
116120
set(OROPKG_OS_LXRT TRUE CACHE INTERNAL "This variable is exported to the rtt-config.h file to expose our target choice to the code." FORCE)
@@ -144,10 +148,13 @@ if(OROCOS_TARGET STREQUAL "xenomai")
144148
add_definitions( -Wall )
145149

146150
if(XENOMAI_FOUND)
147-
list(APPEND OROCOS-RTT_USER_LINK_LIBS ${XENOMAI_LIBRARIES} ) # For libraries used in inline (fosi/template) code.
151+
# Input for .pc and .cmake generated files:
148152
list(APPEND OROCOS-RTT_INCLUDE_DIRS ${XENOMAI_INCLUDE_DIRS} ${PTHREAD_INCLUDE_DIRS})
149153
list(APPEND OROCOS-RTT_LIBRARIES ${XENOMAI_LIBRARIES} ${PTHREAD_LIBRARIES} dl)
150154
list(APPEND OROCOS-RTT_DEFINITIONS "OROCOS_TARGET=${OROCOS_TARGET}")
155+
# Direct input only for .pc file:
156+
list(APPEND RTT_USER_LDFLAGS ${XENOMAI_LDFLAGS} )
157+
list(APPEND RTT_USER_CFLAGS ${XENOMAI_CFLAGS} )
151158
if (XENOMAI_POSIX_FOUND)
152159
set(MQ_LDFLAGS ${XENOMAI_POSIX_LDFLAGS} )
153160
set(MQ_CFLAGS ${XENOMAI_POSIX_CFLAGS} )
@@ -261,7 +268,7 @@ else(OROCOS_TARGET STREQUAL "win32")
261268
endif(OROCOS_TARGET STREQUAL "win32")
262269

263270
if( NOT OROCOS-RTT_DEFINITIONS )
264-
message(FATAL_ERROR "No suitable OROCOS_TARGET selected. Use one of 'lxrt,xenomai,gnulinux,macosx,win32'")
271+
message(FATAL_ERROR "No suitable OROCOS_TARGET found. Please check your setup or provide additional search paths to cmake.")
265272
endif()
266273

267274
# The machine type is tested using compiler macros in rtt-config.h.in

orocos-rtt.default.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ else()
6969
set(OROCOS_TARGET gnulinux CACHE STRING "${DOC_STRING}")
7070
endif()
7171
endif()
72-
message( "No OROCOS_TARGET environment variable detected. Using: ${OROCOS_TARGET}")
72+
message( "No OROCOS_TARGET environment variable set. Using: ${OROCOS_TARGET}")
7373
endif()
7474

7575
# Useful for Windows/MSVC builds, sets all libraries and executables in one place.

rtt/orocos-rtt.pc.in

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ includedir=${prefix}/include
66
Name: Orocos-RTT # human-readable name
77
Description: Open Robot Control Software: Real-Time Tookit # human-readable description
88
Version: @RTT_VERSION@
9-
Libs: -L${libdir} -lorocos-rtt-@OROCOS_TARGET@ @RTT_USER_LINK_LIBS@ # If some RTT headers include inline calls to other libraries, we need to specify these here too.
9+
Libs: -L${libdir} -lorocos-rtt-@OROCOS_TARGET@ @RTT_USER_LINK_LIBS@ @RTT_USER_LDFLAGS@ # If some RTT headers include inline calls to other libraries, we need to specify these here too.
1010
Libs.private: @RTT_LINKFLAGS@
11-
Cflags: -I${includedir} @RTT_DEFINES@ @RTT_CFLAGS@
11+
Cflags: -I${includedir} @RTT_DEFINES@ @RTT_CFLAGS@ @RTT_USER_CFLAGS@

rtt/transports/mqueue/orocos-rtt-mqueue.pc.in

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ Name: Orocos-RTT-MQUEUE # human-readable nam
77
Description: Open Robot Control Software: Real-Time Tookit # human-readable description
88
Requires: orocos-rtt-@OROCOS_TARGET@
99
Version: @RTT_VERSION@
10-
Libs: -L${libdir} -lorocos-rtt-mqueue-@OROCOS_TARGET@
11-
Libs.private: @RTT_MQUEUE_LINKFLAGS@
12-
Cflags: -I${includedir}/rtt/mqueue @RTT_MQUEUE_DEFINES@ @RTT_MQUEUE_CFLAGS@
10+
Libs: -L${libdir} -lorocos-rtt-mqueue-@OROCOS_TARGET@ @MQ_LDFLAGS@
11+
Libs.private:
12+
Cflags: -I${includedir}/rtt/mqueue @MQ_CFLAGS@

0 commit comments

Comments
 (0)