Browse Source

Working on ArduPlane options.

master
James Goppert 13 years ago
parent
commit
6fae800dc2
  1. 7
      ArduPlane/CMakeLists.txt
  2. 2
      ArduPlane/options.cmake
  3. 87
      cmake/modules/APMOption.cmake

7
ArduPlane/CMakeLists.txt

@ -16,10 +16,12 @@ include(CMakeParseArguments)
include(APMOption) include(APMOption)
# options # options
add_definitions(-DUSE_CMAKE_APM_CONFIG)
include(options.cmake) include(options.cmake)
include_directories(${CMAKE_BINARY_DIR}) include_directories(${CMAKE_BINARY_DIR})
apm_option_generate_config(FILE "APM_Config_cmake.h" OPTIONS ${APM_OPTIONS}) add_definitions(-DUSE_CMAKE_APM_CONFIG)
apm_option_generate_config(FILE "APM_Config_cmake.h" BUILD_FLAGS APM_BUILD_FLAGS)
add_definitions(${APM_BUILD_FLAGS})
message(STATUS "build flags: ${APM_BUILD_FLAGS}")
#configure_file(APM_Config2.h.cmake APM_Config2.h) #configure_file(APM_Config2.h.cmake APM_Config2.h)
# disallow in-source build # disallow in-source build
@ -42,6 +44,7 @@ set(ARDUINO_EXTRA_LIBRARIES_PATH ${CMAKE_SOURCE_DIR}/../libraries)
set(${FIRMWARE_NAME}_SKETCH ${CMAKE_SOURCE_DIR}/../${PROJECT_NAME}) set(${FIRMWARE_NAME}_SKETCH ${CMAKE_SOURCE_DIR}/../${PROJECT_NAME})
set(${FIRMWARE_NAME}_BOARD ${APM_PROCESSOR}) set(${FIRMWARE_NAME}_BOARD ${APM_PROCESSOR})
set(${FIRMWARE_NAME}_PORT ${APM_PROGRAMMING_PORT}) set(${FIRMWARE_NAME}_PORT ${APM_PROGRAMMING_PORT})
set(${FIRMWARE_NAME}_SRCS ${CMAKE_BINARY_DIR}/APM_Config_cmake.h)
generate_arduino_firmware(${FIRMWARE_NAME}) generate_arduino_firmware(${FIRMWARE_NAME})
install(FILES ${CMAKE_BINARY_DIR}/${FIRMWARE_NAME}.hex DESTINATION "/") install(FILES ${CMAKE_BINARY_DIR}/${FIRMWARE_NAME}.hex DESTINATION "/")

2
ArduPlane/options.cmake

@ -97,7 +97,7 @@ apm_option("MAV_SYSTEM_ID" TYPE STRING ADVANCED
DESCRIPTION "MAVLink System ID?" DESCRIPTION "MAVLink System ID?"
DEFAULT "1") DEFAULT "1")
apm_option("MAVLINKV10" TYPE BOOL DEFINE_ONLY apm_option("MAVLINK10" TYPE BOOL DEFINE_ONLY BUILD_FLAG
DESCRIPTION "Use mavlink version 1.0?" DESCRIPTION "Use mavlink version 1.0?"
DEFAULT OFF) DEFAULT OFF)

87
cmake/modules/APMOption.cmake

@ -1,6 +1,26 @@
# apm_option: options parsing for ardupilotmega
#
# OPTIONS:
# ADVANCED - indicates this option is advaned (hidden in gui unless advanced selected)
# DEFINE_ONLY - this flag is either indicates that the variable is defined if true, and not defined if false
# BUILD_FLAG - this flag forces the variable to be added to build flags, for files that
# don't include the config header
#
# SINGLE INPUT ARGUMENTS: (can only pass one arguments)
# TYPE - the type of the argument (BOOL for on/off variables/ STRING for all others)
# DESCRIPTION - description of option, shown as tool-tip and written in config file
# DEFAULT - the default value of the option
#
# MULTIPLE VARIABLE ARGUMENTS: (can pass a lit of items)
# OPTIONS - values that this option may take, if only a finite set is possible, creates combo-box in gui
# DEPENDS - a list of booleans that this argument depends on, can be used to disable options when the
# are not appropriate
#
# Author: James Goppert
#
function(apm_option NAME) function(apm_option NAME)
cmake_parse_arguments(ARG cmake_parse_arguments(ARG
"ADVANCED;DEFINE_ONLY" "ADVANCED;DEFINE_ONLY;BUILD_FLAG"
"TYPE;DESCRIPTION;DEFAULT" "OPTIONS;DEPENDS" ${ARGN}) "TYPE;DESCRIPTION;DEFAULT" "OPTIONS;DEPENDS" ${ARGN})
#message(STATUS "parsing argument: ${NAME}") #message(STATUS "parsing argument: ${NAME}")
@ -21,18 +41,30 @@ function(apm_option NAME)
# force variable reinit if it was internal (hidden) # force variable reinit if it was internal (hidden)
get_property(VAR_TYPE CACHE ${NAME} PROPERTY TYPE) get_property(VAR_TYPE CACHE ${NAME} PROPERTY TYPE)
if ("${VAR_TYPE}" STREQUAL "INTERNAL") if ("${VAR_TYPE}" STREQUAL "INTERNAL")
message(STATUS "\tVAR_TYPE: ${VAR_TYPE}") #message(STATUS "\tVAR_TYPE: ${VAR_TYPE}")
set("${NAME}" "${ARG_DEFAULT}" CACHE "${ARG_TYPE}" "${ARG_DESCRIPTION}" FORCE) set("${NAME}" "${ARG_DEFAULT}" CACHE "${ARG_TYPE}" "${ARG_DESCRIPTION}" FORCE)
# if not hidden, add it to the global options list # if a build flag, initialize it and add it to the global options list
else() elseif(${ARG_BUILD_FLAG})
set(APM_OPTIONS ${APM_OPTIONS} ${NAME} CACHE INTERNAL "list of all options") #message(STATUS "build flag found for item ${NAME}")
list(REMOVE_DUPLICATES APM_OPTIONS) set(APM_BUILD_FLAGS_LIST ${APM_BUILD_FLAGS_LIST} ${NAME} CACHE INTERNAL "list of all build flags")
#message(STATUS "APM_OPTIONS: ${APM_OPTIONS}") list(REMOVE_DUPLICATES APM_BUILD_FLAGS_LIST)
# if not hidden, and not a build flag, add it to the global options list
else()
set(APM_OPTIONS_LIST ${APM_OPTIONS_LIST} ${NAME} CACHE INTERNAL "list of all options")
list(REMOVE_DUPLICATES APM_OPTIONS_LIST)
endif() endif()
# set options for combo box # set list of options
set_property(CACHE "${NAME}" PROPERTY STRINGS ${ARG_OPTIONS}) if (NOT "${ARG_OPTIONS}" STREQUAL "")
set_property(CACHE "${NAME}" PROPERTY STRINGS ${ARG_OPTIONS})
list(FIND ARG_OPTIONS "${ARG_DEFAULT}" ARG_POSITION)
if (ARG_POSITION EQUAL -1)
message(FATAL_ERROR "default value: ${ARG_DEFAULT} not in given set of options: ${ARG_OPTIONS}")
endif()
endif()
# mark as advanced if advanced option given # mark as advanced if advanced option given
if(ARG_ADVANCED) if(ARG_ADVANCED)
@ -47,17 +79,27 @@ function(apm_option NAME)
endfunction() endfunction()
# apm_option_generate_config: generates a config file using the list of options.
#
# SINGLE INPUT ARGUMENTS: (can only pass one arguments)
# FILE - the file to write the config to
# BUILD_FLAGS - variable to store build flags in
#
# Author: James Goppert
#
function(apm_option_generate_config) function(apm_option_generate_config)
cmake_parse_arguments(ARG "" "FILE" "" ${ARGN}) cmake_parse_arguments(ARG "" "FILE;BUILD_FLAGS" "" ${ARGN})
list(REMOVE_DUPLICATES APM_OPTIONS)
# options
list(REMOVE_DUPLICATES APM_OPTIONS_LIST)
file (WRITE "${CMAKE_BINARY_DIR}/${ARG_FILE}" "//automatically generated, do not edit\n") file (WRITE "${CMAKE_BINARY_DIR}/${ARG_FILE}" "//automatically generated, do not edit\n")
file (APPEND "${CMAKE_BINARY_DIR}/${ARG_FILE}" "#define OFF 0\n#define ON 1\n") file (APPEND "${CMAKE_BINARY_DIR}/${ARG_FILE}" "#define OFF 0\n#define ON 1\n")
foreach(ITEM ${APM_OPTIONS}) foreach(ITEM ${APM_OPTIONS_LIST})
#message(STATUS "item: ${ITEM}") #message(STATUS "option: ${ITEM}")
get_property(ITEM_VALUE CACHE ${ITEM} PROPERTY VALUE) get_property(ITEM_VALUE CACHE ${ITEM} PROPERTY VALUE)
get_property(ITEM_HELP CACHE ${ITEM} PROPERTY HELPSTRING) get_property(ITEM_HELP CACHE ${ITEM} PROPERTY HELPSTRING)
if (${ITEM}_DEFINE_ONLY) if (${${ITEM}_DEFINE_ONLY})
if (${ITEM}_VALUE) if (${ITEM_VALUE})
file(APPEND "${CMAKE_BINARY_DIR}/${ARG_FILE}" "\n#define ${ITEM} // ${ITEM_HELP}") file(APPEND "${CMAKE_BINARY_DIR}/${ARG_FILE}" "\n#define ${ITEM} // ${ITEM_HELP}")
else() else()
file(APPEND "${CMAKE_BINARY_DIR}/${ARG_FILE}" "\n//#define ${ITEM} // ${ITEM_HELP}") file(APPEND "${CMAKE_BINARY_DIR}/${ARG_FILE}" "\n//#define ${ITEM} // ${ITEM_HELP}")
@ -66,4 +108,19 @@ function(apm_option_generate_config)
file(APPEND "${CMAKE_BINARY_DIR}/${ARG_FILE}" "\n#define ${ITEM} ${ITEM_VALUE} // ${ITEM_HELP}") file(APPEND "${CMAKE_BINARY_DIR}/${ARG_FILE}" "\n#define ${ITEM} ${ITEM_VALUE} // ${ITEM_HELP}")
endif() endif()
endforeach() endforeach()
# build flags
list(REMOVE_DUPLICATES APM_BUILD_FLAGS_LIST)
foreach(ITEM ${APM_BUILD_FLAGS_LIST})
#message(STATUS "build flags: ${ITEM}")
get_property(ITEM_VALUE CACHE ${ITEM} PROPERTY VALUE)
if (${${ITEM}_DEFINE_ONLY})
if (${ITEM_VALUE})
set(${ARG_BUILD_FLAGS} ${${ARG_BUILD_FLAGS}} "-D${ITEM}" CACHE INTERNAL "build flags")
endif()
else()
set(${ARG_BUILD_FLAGS} ${${ARG_BUILD_FLAGS}} "-D${ITEM}=${ITEM_VALUE}" CACHE INTERNAL "build flags")
endif()
endforeach()
endfunction() endfunction()

Loading…
Cancel
Save