Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • danc/MicroCART
  • snawerdt/MicroCART_17-18
  • bbartels/MicroCART_17-18
  • jonahu/MicroCART
4 results
Show changes
Showing
with 0 additions and 2657 deletions
// vrpn_print_message.C: Print out information about all the messages
// that come from a VRPN file or connection. Useful for seeing what
// is at a server or in a file.
// It uses the logging feature to get called even for messages that
// it has not registered senders for.
// XXX Does not work on files; nothing gets printed...
// XXX Bad side effect: It produces a file called vrpn_temp.deleteme
// in the current directory.
#include <stdio.h> // for fprintf, NULL, stderr, etc
#include <stdlib.h> // for exit
#include <vrpn_Configure.h> // for VRPN_CALLBACK
#include <vrpn_Shared.h> // for timeval
#include <vrpn_Connection.h> // for vrpn_HANDLERPARAM, etc
vrpn_Connection *conn; // Connection pointer
int Usage(char *s)
{
fprintf(stderr, "Usage: %s vrpn_connection_name\n", s);
fprintf(stderr, " (Note: file:filename can be connection name)\n");
return -1;
}
// This function does the work. It prints out the message type,
// sender, size and time for each message that comes in to the
// connection.
int VRPN_CALLBACK msg_handler(void *, vrpn_HANDLERPARAM p)
{
const char *sender_name = conn->sender_name(p.sender);
const char *type_name = conn->message_type_name(p.type);
// We'll need to adjust the sender and type if it was
// unknown.
if (sender_name == NULL) {
sender_name = "UNKNOWN_SENDER";
}
if (type_name == NULL) {
type_name = "UNKNOWN_TYPE";
}
printf("Time: %ld:%ld, Sender: %s, Type %s, Length %d\n",
static_cast<long>(p.msg_time.tv_sec),
static_cast<long>(p.msg_time.tv_usec), sender_name, type_name,
p.payload_len);
return -1; // Do not log the message
}
int main(int argc, char *argv[])
{
char *conn_name; // Name of the connection or file
// Parse the command line
if (argc != 2) {
return Usage(argv[0]);
}
else {
conn_name = argv[1];
}
// Open the connection, with a file for incoming log required for some
// reason.
// (I think it's so that there is a log that we can filter by displaying it)
conn = vrpn_get_connection_by_name(conn_name, "vrpn_temp.deleteme");
if (conn == NULL) {
fprintf(stderr, "ERROR: Can't get connection %s\n", conn_name);
return -1;
}
// Set up the callback for all message types
conn->register_log_filter(msg_handler, NULL);
// Mainloop until they kill us.
while (1) {
conn->mainloop();
}
return 0; // Sure!
}
/* vrpn_print_performance.C
This is a VRPN client program that will connect to one or more VRPN
server devices and print out the rate of any of a number of message types.
These include only tracker messages at this time, but the rest are easy.
While it doesn't (currently) attempt to consider latency, its measurement of
update rate might be informative to some.
*/
#include <stdio.h> // for printf, NULL, fprintf, etc
#include <stdlib.h> // for exit, atoi
#ifndef _WIN32_WCE
#include <signal.h> // for signal, SIGINT
#endif
#include <string.h> // for strcmp, strncpy
#include <vrpn_Analog.h> // for vrpn_Analog_Remote, etc
#include <vrpn_Button.h> // for vrpn_Button_Remote, etc
#include <vrpn_FileConnection.h> // For preload and accumulate settings
#include <vrpn_Shared.h> // for vrpn_gettimeofday, etc
#include <vrpn_Tracker.h> // for vrpn_TRACKERACCCB, etc
#include <vector> // for vector
#include "vrpn_BaseClass.h" // for vrpn_System_TextPrinter, etc
#include "vrpn_Configure.h" // for VRPN_CALLBACK
using namespace std;
int done = 0; // Signals that the program should exit
double report_interval = 1; // Every n seconds a report will be printed
//-------------------------------------
// This section contains the data structure that holds information on
// the devices that are created. For each named device, a remote of each
// type (tracker, button, analog, dial, text) is created. A particular device
// may only report a subset of these values, but that doesn't hurt anything --
// there simply will be no messages of the other types to receive and so
// nothing is printed.
class device_info {
public:
char *name;
vrpn_Tracker_Remote *tkr;
vrpn_Button_Remote *btn;
vrpn_Analog_Remote *ana;
};
const unsigned MAX_DEVICES = 50;
//-------------------------------------
// This section contains the data structure that is used to determine how
// often to print a report for each sensor of each tracker. Each element
// contains a counter that is used by the callback routine to keep track
// of how many it has skipped. There is an element for each possible sensor.
// A new array of elements is created for each new tracker object, and a
// pointer to it is passed as the userdata pointer to the callback handlers.
// A separate array is kept for the position, velocity, and acceleration for
// each
// tracker. The structure passed to the callback handler also has a
// string that is the name of the tracker.
class t_user_callback {
public:
char t_name[vrpn_MAX_TEXT_LEN];
vector<unsigned> t_counts;
vector<struct timeval> t_last_report;
};
struct timeval t_analog_last_report;
unsigned t_analog_count;
/*****************************************************************************
*
Callback handlers
*
*****************************************************************************/
void VRPN_CALLBACK
handle_tracker_pos_quat(void *userdata, const vrpn_TRACKERCB t)
{
t_user_callback *t_data = static_cast<t_user_callback *>(userdata);
// Make sure we have a count value for this sensor
while (t_data->t_counts.size() <= static_cast<unsigned>(t.sensor)) {
t_data->t_counts.push_back(0);
}
struct timeval now;
double interval;
vrpn_gettimeofday(&now, NULL);
// Make sure we have a count value for this sensor
while (t_data->t_last_report.size() <= static_cast<unsigned>(t.sensor)) {
t_data->t_last_report.push_back(now);
}
interval =
vrpn_TimevalDurationSeconds(now, t_data->t_last_report[t.sensor]);
t_data->t_counts[t.sensor]++;
// See if it's been long enough to display a frequency notification
if (interval >= report_interval) {
double frequency = t_data->t_counts[t.sensor] / interval;
t_data->t_counts[t.sensor] = 0;
t_data->t_last_report[t.sensor] = now;
printf("Tracker %s, sensor %d:\t%5.2f Hz (%5.2f sec)\n", t_data->t_name,
t.sensor, frequency, interval);
}
}
void VRPN_CALLBACK handle_tracker_vel(void *userdata, const vrpn_TRACKERVELCB t)
{
t_user_callback *t_data = static_cast<t_user_callback *>(userdata);
// Make sure we have a count value for this sensor
while (t_data->t_counts.size() <= static_cast<unsigned>(t.sensor)) {
t_data->t_counts.push_back(0);
}
struct timeval now;
double interval;
vrpn_gettimeofday(&now, NULL);
// Make sure we have a count value for this sensor
while (t_data->t_last_report.size() <= static_cast<unsigned>(t.sensor)) {
t_data->t_last_report.push_back(now);
}
interval =
vrpn_TimevalDurationSeconds(now, t_data->t_last_report[t.sensor]);
t_data->t_counts[t.sensor]++;
// See if it's been long enough to display a frequency notification
if (interval >= report_interval) {
double frequency = t_data->t_counts[t.sensor] / interval;
t_data->t_counts[t.sensor] = 0;
t_data->t_last_report[t.sensor] = now;
printf("Tracker %s, sensor %d:\t\t%5.2f messages per second averaged "
"over %5.2f seconds\n",
t_data->t_name, t.sensor, frequency, interval);
}
}
void VRPN_CALLBACK handle_tracker_acc(void *userdata, const vrpn_TRACKERACCCB t)
{
t_user_callback *t_data = static_cast<t_user_callback *>(userdata);
// Make sure we have a count value for this sensor
while (t_data->t_counts.size() <= static_cast<unsigned>(t.sensor)) {
t_data->t_counts.push_back(0);
}
struct timeval now;
double interval;
vrpn_gettimeofday(&now, NULL);
// Make sure we have a count value for this sensor
while (t_data->t_last_report.size() <= static_cast<unsigned>(t.sensor)) {
t_data->t_last_report.push_back(now);
}
interval =
vrpn_TimevalDurationSeconds(now, t_data->t_last_report[t.sensor]);
t_data->t_counts[t.sensor]++;
// See if it's been long enough to display a frequency notification
if (interval >= report_interval) {
double frequency = t_data->t_counts[t.sensor] / interval;
t_data->t_counts[t.sensor] = 0;
t_data->t_last_report[t.sensor] = now;
printf("Tracker %s, sensor %d:\t\t%5.2f messages per second averaged "
"over %5.2f seconds\n",
t_data->t_name, t.sensor, frequency, interval);
}
}
void VRPN_CALLBACK handle_button(void *userdata, const vrpn_BUTTONCB b)
{
const char *name = (const char *)userdata;
printf("Button %s, number %d was just %s\n", name, b.button,
b.state ? "pressed" : "released");
}
void VRPN_CALLBACK handle_analog(void *userdata, const vrpn_ANALOGCB /*a*/)
{
const char *name = (const char *)userdata;
struct timeval now;
double interval;
vrpn_gettimeofday(&now, NULL);
interval = vrpn_TimevalDurationSeconds(now, t_analog_last_report);
t_analog_count++;
// See if it's been long enough to display a frequency notification
if (interval >= report_interval) {
double frequency = t_analog_count / interval;
t_analog_count = 0;
t_analog_last_report = now;
printf("Analog %s:\t\t%5.2f messages per second averaged over %5.2f "
"seconds\n",
name, frequency, interval);
}
/*
const char *name = (const char *)userdata;
int i;
printf("Analog %s:\n %5.2f", name, a.channel[0]);
for (i = 1; i < a.num_channel; i++) {
printf(", %5.2f", a.channel[i]);
}
printf(" (%d chans)\n", a.num_channel);
*/
}
// WARNING: On Windows systems, this handler is called in a separate
// thread from the main program (this differs from Unix). To avoid all
// sorts of chaos as the main program continues to handle packets, we
// set a done flag here and let the main program shut down in its own
// thread by calling shutdown() to do all of the stuff we used to do in
// this handler.
void handle_cntl_c(int) { done = 1; }
void Usage(const char *arg0)
{
fprintf(
stderr,
"Usage: %s [--notracker] [--nobutton] [--noanalog] [--nodial]\n"
" [--reportinterval n]\n"
" [--notext] device1 [device2] [device3] [device4] [...]\n"
" -trackerstride: Print every nth report from each tracker sensor\n"
" -notracker: Don't print tracker reports for following devices\n"
" -nobutton: Don't print button reports for following devices\n"
" -noanalog: Don't print analog reports for following devices\n"
" deviceX: VRPN name of device to connect to (eg: Tracker0@ioglab)\n"
" The default behavior is to print all message types for all devices "
"listed\n"
" The order of the parameters can be changed to suit\n",
arg0);
exit(0);
}
int main(int argc, char *argv[])
{
int print_for_tracker = 1; // Print tracker reports?
int print_for_button = 1; // Print button reports?
int print_for_analog = 1; // Print analog reports?
// If we happen to open a file, neither preload nor accumulate the
// messages in memory, to avoid crashing for huge files.
vrpn_FILE_CONNECTIONS_SHOULD_PRELOAD = false;
vrpn_FILE_CONNECTIONS_SHOULD_ACCUMULATE = false;
device_info device_list[MAX_DEVICES];
int num_devices = 0;
int i;
// Parse arguments, creating objects as we go. Arguments that
// change the way a device is treated affect all devices that
// follow on the command line.
for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "-notracker")) {
print_for_tracker = 0;
}
else if (!strcmp(argv[i], "--nobutton")) {
print_for_button = 0;
}
else if (!strcmp(argv[i], "--noanalog")) {
print_for_analog = 0;
}
else if (!strcmp(argv[i], "--reportinterval")) {
if (++i >= argc) {
Usage(argv[0]);
}
report_interval = atoi(argv[i]);
if (report_interval <= 0) {
fprintf(stderr,
"--reportinterval argument must be 1 or greater\n");
return -1;
}
}
else { // Create a device and connect to it.
device_info *dev;
// Make sure we have enough room for the new device
if (num_devices == MAX_DEVICES) {
fprintf(stderr, "Too many devices!\n");
exit(-1);
}
// Name the device and open it as everything
dev = &device_list[num_devices];
dev->name = argv[i];
dev->tkr = new vrpn_Tracker_Remote(dev->name);
dev->ana = new vrpn_Analog_Remote(dev->name);
dev->btn = new vrpn_Button_Remote(dev->name);
if ((dev->tkr == NULL) || (dev->ana == NULL) ||
(dev->btn == NULL)) {
fprintf(stderr, "Error opening %s\n", dev->name);
return -1;
}
else {
printf("Opened %s as:", dev->name);
}
struct timeval now;
vrpn_gettimeofday(&now, NULL);
// If we are printing the tracker reports, prepare the
// user-data callbacks and hook them up to be called with
// the correct data for this device.
if (print_for_tracker) {
vrpn_Tracker_Remote *tkr = dev->tkr;
t_user_callback *tc1 = new t_user_callback;
t_user_callback *tc2 = new t_user_callback;
t_user_callback *tc3 = new t_user_callback;
if ((tc1 == NULL) || (tc2 == NULL) || (tc3 == NULL)) {
fprintf(stderr, "Out of memory\n");
}
printf(" Tracker");
// Fill in the user-data callback information
strncpy(tc1->t_name, dev->name, sizeof(tc1->t_name));
strncpy(tc2->t_name, dev->name, sizeof(tc2->t_name));
strncpy(tc3->t_name, dev->name, sizeof(tc3->t_name));
// Set up the tracker callback handlers
tkr->register_change_handler(tc1, handle_tracker_pos_quat);
tkr->register_change_handler(tc2, handle_tracker_vel);
tkr->register_change_handler(tc3, handle_tracker_acc);
}
if (print_for_button) {
printf(" Button");
dev->btn->register_change_handler(dev->name, handle_button);
}
if (print_for_analog) {
printf(" Analog");
t_analog_last_report = now;
t_analog_count = 0;
dev->ana->register_change_handler(dev->name, handle_analog);
}
printf(".\n");
num_devices++;
}
}
if (num_devices == 0) {
Usage(argv[0]);
}
#ifndef _WIN32_WCE
// signal handler so logfiles get closed right
signal(SIGINT, handle_cntl_c);
#endif
/*
* main interactive loop
*/
printf("Press ^C to exit.\n");
while (!done) {
int i;
// Let all the devices do their things
for (i = 0; i < num_devices; i++) {
device_list[i].tkr->mainloop();
device_list[i].btn->mainloop();
device_list[i].ana->mainloop();
}
// Sleep for 1ms so we don't eat the CPU
vrpn_SleepMsecs(1);
}
return 0;
} /* main */
# - Script to check if the signature for a mac HID callback uses UInt32 or uint32_t
# Requires that the associated CPP file be present: CheckMacHIDAPI.cpp.
#
# MACOSX_HID_UINT32T, set according to the results of our test.
#
# Use add_definitions(-DMACOSX_HID_UINT32T=${MACOSX_HID_UINT32T}) in your
# listfile and the following prototype for the function you'd like to
# register using setInterruptReportHandlerCallback:
# void ReaderReportCallback(
# void *target,
# IOReturn result,
# void *refcon,
# void *sender,
# MACOSX_HID_UINT32T size
# )
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(APPLE)
if(NOT MACOSX_HID_UINT32T)
get_filename_component(_moddir ${CMAKE_CURRENT_LIST_FILE} PATH)
try_compile(_HID_uint32t
${CMAKE_BINARY_DIR}
${_moddir}/CheckMacHIDAPI.cpp
OUTPUT_VARIABLE
_HID_uint32t_OUTPUT
COMPILE_DEFINITIONS
-DMACOSX_HID_UINT32T=uint32_t)
message(STATUS
"Checking uint32_t in HID callback signature... ${_HID_uint32t}")
try_compile(_HID_UInt32
${CMAKE_BINARY_DIR}
${_moddir}/CheckMacHIDAPI.cpp
OUTPUT_VARIABLE
_HID_UInt32_OUTPUT
COMPILE_DEFINITIONS
-DMACOSX_HID_UINT32T=UInt32)
message(STATUS
"Checking UInt32 in HID callback signature... ${_HID_UInt32}")
if(_HID_uint32t)
set(MACOSX_HID_UINT32T
"uint32_t"
CACHE
STRING
"The 32-bit uint type desired in the callback set by setInterruptReportHandlerCallback")
mark_as_advanced(MACOSX_HID_UINT32T)
elseif(_HID_UInt32)
set(MACOSX_HID_UINT32T
"UInt32"
CACHE
STRING
"The 32-bit uint type desired in the callback set by setInterruptReportHandlerCallback")
mark_as_advanced(MACOSX_HID_UINT32T)
else()
message(SEND_ERROR
"ERROR: Could not detect appropriate Mac HID uint32 type!")
endif()
endif()
endif()
/**
* \file CheckMacHIDAPI.cpp
* \brief C++ source file used by CMake module CheckMacHIDAPI.cmake
*
* \author
* Ryan Pavlik, 2009-2010
* <rpavlik@iastate.edu>
* http://academic.cleardefinition.com/
*
* \author
* Based on code extracted from VRPN 07.22 for use as a minimal test case
*
* Attempts to compile a difficult bit of code against the Mac
* HID API, as two different types have been required in the callback
* function (UInt32 and uint32_t) and testing is the best way to know
* which one is correct for a given system.
*
*/
#if defined(__APPLE__)
#include <stdio.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/hid/IOHIDLib.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>
void ReaderReportCallback(
void *target, IOReturn result, void *refcon, void *sender, MACOSX_HID_UINT32T size
)
{}
#endif
int main(int argc, char* argv[]) {
#if defined(__APPLE__)
io_object_t _ioObject;
IOHIDDeviceInterface122 **_interface;
unsigned char _buffer[512];
IOReturn result = (*_interface)->setInterruptReportHandlerCallback(_interface,
_buffer, 512,
ReaderReportCallback,
NULL, 0);
#endif
return 0;
}
# - Removes duplicate entries and non-directories from a provided list
#
# clean_directory_list(<listvar> [<additional list items>...])
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__clean_directory_list)
return()
endif()
set(__clean_directory_list YES)
function(clean_directory_list _var)
# combine variable's current value with additional list items
set(_in ${${_var}} ${ARGN})
if(_in)
# Initial list cleaning
list(REMOVE_DUPLICATES _in)
# Grab the absolute path of each actual directory
set(_out)
foreach(_dir ${_in})
if(IS_DIRECTORY "${_dir}")
get_filename_component(_dir "${_dir}" ABSOLUTE)
file(TO_CMAKE_PATH "${_dir}" _dir)
list(APPEND _out "${_dir}")
endif()
endforeach()
if(_out)
# Clean up the output list now
list(REMOVE_DUPLICATES _out)
endif()
# return _out
set(${_var} "${_out}" PARENT_SCOPE)
endif()
endfunction()
# - A smarter replacement for list(REMOVE_DUPLICATES) for library lists
#
# Note that, in the case of cyclic link dependencies, you _do_ actually need
# a library in a list multiple times. So, only use this function when you know
# that the dependency graph is acyclic.
#
# clean_library_list(<listvar> [<additional list items>...]) - where
# listvar is the name of a destination variable, and also possibly a source, and
# it is followed by any number (including 0) of additional libraries to append
# to the list before processing.
#
# Removes duplicates from the list, leaving only the last instance, while
# preserving the meaning of the "optimized", "debug", and "general" labeling.
# (Libraries listed as general are listed in the result instead as optimized and
# debug)
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__clean_library_list)
return()
endif()
set(__clean_library_list YES)
function(clean_library_list _var)
# combine variable's current value with additional list items
set(_work ${${_var}} ${ARGN})
if(_work)
# Turn each of optimized, debug, and general into flags
# prefixed on their respective library (combining list items)
string(REGEX REPLACE "optimized;" "1CLL%O%" _work "${_work}")
string(REGEX REPLACE "debug;" "1CLL%D%" _work "${_work}")
string(REGEX REPLACE "general;" "1CLL%G%" _work "${_work}")
# Any library that doesn't have a prefix is general, and a general
# library is both debug and optimized so stdize it
set(_std)
foreach(_lib ${_work})
if(NOT "${_lib}" MATCHES "^1CLL%.%")
list(APPEND _std "1CLL%D%${_lib}" "1CLL%O%${_lib}")
elseif("${_lib}" MATCHES "^1CLL%G%")
string(REPLACE "1CLL%G%" "" _justlib "${_lib}")
list(APPEND _std "1CLL%D%${_justlib}" "1CLL%O%${_justlib}")
else()
list(APPEND _std "${_lib}")
endif()
endforeach()
# REMOVE_DUPLICATES leaves the first - so we reverse before and after
# to keep the last, instead
list(REVERSE _std)
list(REMOVE_DUPLICATES _std)
list(REVERSE _std)
# Split list items back out again: turn prefixes into the
# library type flags.
string(REGEX REPLACE "1CLL%D%" "debug;" _std "${_std}")
string(REGEX REPLACE "1CLL%O%" "optimized;" _std "${_std}")
# Return _std
set(${_var} ${_std} PARENT_SCOPE)
endif()
endfunction()
# - Run cppcheck on c++ source files as a custom target and a test
#
# include(CppcheckTargets)
# add_cppcheck(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FORCE] [FAIL_ON_WARNINGS]) -
# Create a target to check a target's sources with cppcheck and the indicated options
# add_cppcheck_sources(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FORCE] [FAIL_ON_WARNINGS]) -
# Create a target to check standalone sources with cppcheck and the indicated options
#
# Requires these CMake modules:
# Findcppcheck
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__add_cppcheck)
return()
endif()
set(__add_cppcheck YES)
if(NOT CPPCHECK_FOUND)
find_package(cppcheck QUIET)
endif()
if(CPPCHECK_FOUND)
if(NOT TARGET all_cppcheck)
add_custom_target(all_cppcheck)
set_target_properties(all_cppcheck PROPERTIES EXCLUDE_FROM_ALL TRUE)
endif()
endif()
function(add_cppcheck_sources _targetname)
if(CPPCHECK_FOUND)
set(_cppcheck_args)
set(_input ${ARGN})
list(FIND _input UNUSED_FUNCTIONS _unused_func)
if("${_unused_func}" GREATER "-1")
list(APPEND _cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG})
list(REMOVE_AT _input ${_unused_func})
endif()
list(FIND _input STYLE _style)
if("${_style}" GREATER "-1")
list(APPEND _cppcheck_args ${CPPCHECK_STYLE_ARG})
list(REMOVE_AT _input ${_style})
endif()
list(FIND _input POSSIBLE_ERROR _poss_err)
if("${_poss_err}" GREATER "-1")
list(APPEND _cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG})
list(REMOVE_AT _input ${_poss_err})
endif()
list(FIND _input FORCE _force)
if("${_force}" GREATER "-1")
list(APPEND _cppcheck_args "--force")
list(REMOVE_AT _input ${_force})
endif()
list(FIND _input FAIL_ON_WARNINGS _fail_on_warn)
if("${_fail_on_warn}" GREATER "-1")
list(APPEND
CPPCHECK_FAIL_REGULAR_EXPRESSION
${CPPCHECK_WARN_REGULAR_EXPRESSION})
list(REMOVE_AT _input ${_fail_on_warn})
endif()
set(_files)
foreach(_source ${_input})
get_source_file_property(_cppcheck_loc "${_source}" LOCATION)
if(_cppcheck_loc)
# This file has a source file property, carry on.
get_source_file_property(_cppcheck_lang "${_source}" LANGUAGE)
if("${_cppcheck_lang}" MATCHES "CXX")
list(APPEND _files "${_cppcheck_loc}")
endif()
else()
# This file doesn't have source file properties - figure it out.
get_filename_component(_cppcheck_loc "${_source}" ABSOLUTE)
if(EXISTS "${_cppcheck_loc}")
list(APPEND _files "${_cppcheck_loc}")
else()
message(FATAL_ERROR
"Adding CPPCHECK for file target ${_targetname}: "
"File ${_source} does not exist or needs a corrected path location "
"since we think its absolute path is ${_cppcheck_loc}")
endif()
endif()
endforeach()
if("1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0")
# Older than CMake 2.8.0
add_test(${_targetname}_cppcheck_test
"${CPPCHECK_EXECUTABLE}"
${CPPCHECK_TEMPLATE_ARG}
${_cppcheck_args}
${_files})
else()
# CMake 2.8.0 and newer
add_test(NAME
${_targetname}_cppcheck_test
COMMAND
"${CPPCHECK_EXECUTABLE}"
${CPPCHECK_TEMPLATE_ARG}
${_cppcheck_args}
${_files})
endif()
set_tests_properties(${_targetname}_cppcheck_test
PROPERTIES
FAIL_REGULAR_EXPRESSION
"${CPPCHECK_FAIL_REGULAR_EXPRESSION}")
add_custom_command(TARGET
all_cppcheck
PRE_BUILD
COMMAND
${CPPCHECK_EXECUTABLE}
${CPPCHECK_QUIET_ARG}
${CPPCHECK_TEMPLATE_ARG}
${_cppcheck_args}
${_files}
WORKING_DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT
"${_targetname}_cppcheck: Running cppcheck on target ${_targetname}..."
VERBATIM)
endif()
endfunction()
function(add_cppcheck _name)
if(NOT TARGET ${_name})
message(FATAL_ERROR
"add_cppcheck given a target name that does not exist: '${_name}' !")
endif()
if(CPPCHECK_FOUND)
set(_cppcheck_args)
list(FIND ARGN UNUSED_FUNCTIONS _unused_func)
if("${_unused_func}" GREATER "-1")
list(APPEND _cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG})
endif()
list(FIND ARGN STYLE _style)
if("${_style}" GREATER "-1")
list(APPEND _cppcheck_args ${CPPCHECK_STYLE_ARG})
endif()
list(FIND ARGN POSSIBLE_ERROR _poss_err)
if("${_poss_err}" GREATER "-1")
list(APPEND _cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG})
endif()
list(FIND ARGN FORCE _force)
if("${_force}" GREATER "-1")
list(APPEND _cppcheck_args "--force")
endif()
list(FIND _input FAIL_ON_WARNINGS _fail_on_warn)
if("${_fail_on_warn}" GREATER "-1")
list(APPEND
CPPCHECK_FAIL_REGULAR_EXPRESSION
${CPPCHECK_WARN_REGULAR_EXPRESSION})
list(REMOVE_AT _input ${_unused_func})
endif()
get_target_property(_cppcheck_includes "${_name}" INCLUDE_DIRECTORIES)
set(_includes)
foreach(_include ${_cppcheck_includes})
list(APPEND _includes "-I${_include}")
endforeach()
get_target_property(_cppcheck_sources "${_name}" SOURCES)
set(_files)
foreach(_source ${_cppcheck_sources})
get_source_file_property(_cppcheck_lang "${_source}" LANGUAGE)
get_source_file_property(_cppcheck_loc "${_source}" LOCATION)
if("${_cppcheck_lang}" MATCHES "CXX")
list(APPEND _files "${_cppcheck_loc}")
endif()
endforeach()
if("1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0")
# Older than CMake 2.8.0
add_test(${_name}_cppcheck_test
"${CPPCHECK_EXECUTABLE}"
${CPPCHECK_TEMPLATE_ARG}
${_cppcheck_args}
${_files})
else()
# CMake 2.8.0 and newer
add_test(NAME
${_name}_cppcheck_test
COMMAND
"${CPPCHECK_EXECUTABLE}"
${CPPCHECK_TEMPLATE_ARG}
${_cppcheck_args}
${_files})
endif()
set_tests_properties(${_name}_cppcheck_test
PROPERTIES
FAIL_REGULAR_EXPRESSION
"${CPPCHECK_FAIL_REGULAR_EXPRESSION}")
add_custom_command(TARGET
all_cppcheck
PRE_BUILD
COMMAND
${CPPCHECK_EXECUTABLE}
${CPPCHECK_QUIET_ARG}
${CPPCHECK_TEMPLATE_ARG}
${_cppcheck_args}
${_includes}
${_files}
WORKING_DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT
"${_name}_cppcheck: Running cppcheck on target ${_name}..."
VERBATIM)
endif()
endfunction()
# - Create ctest -S scripts to use to run dashboard builds
#
# include(CreateDashboardScripts)
# create_dashboard_scripts([<initialcachetemplatefilename>])
#
# If you need additional settings to persist from the "parent" CMake instance
# to the initial cache created by the dashboard script,
# you may pass a filename which will be configured into the initial cache.
#
# In the resulting DASHBOARDSCRIPT_BASE_DIRECTORY, an end-user
# may optionally create a file named
# CustomInitialCache.${DASHBOARDSCRIPT_SCRIPT_NAME}
# (by default, CustomInitialCache.go.cmake) containing set commands that use
# the CACHE option, to set up additional site-local cache variable values.
#
# Requires these CMake modules:
# GetCompilerInfoString
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# Only do any of the prep work if not already in a dashboard script
if(NOT IN_DASHBOARD_SCRIPT)
# Hide a CTest variable
mark_as_advanced(DART_TESTING_TIMEOUT)
include(GetCompilerInfoString)
get_compiler_info_string(_COMPILERID)
# We must run the following at "include" time, not at function call time,
# to find the path to this module rather than the path to a calling list file
get_filename_component(_dashboardmoddir
${CMAKE_CURRENT_LIST_FILE}
PATH)
if(NOT "$ENV{USER}" MATCHES "^$")
set(_user "$ENV{USER}")
elseif(NOT "$ENV{USERNAME}" MATCHES "^$")
set(_user "$ENV{USERNAME}")
endif()
if(NOT _dashboardscript_machine)
if(NOT SITE)
site_name(SITE)
endif()
set(_dashboardscript_machine "${SITE}" CACHE INTERNAL "")
set(SITE
"${_user}@${_dashboardscript_machine}"
CACHE
STRING
"Human-readable site name"
FORCE)
endif()
set(DASHBOARDSCRIPT_BASE_DIRECTORY
"${CMAKE_BINARY_DIR}/Dashboards-${_dashboardscript_machine}-${_user}"
CACHE
PATH
"Directory to use as the root of all dashboard work")
mark_as_advanced(DASHBOARDSCRIPT_BASE_DIRECTORY)
set(DASHBOARDSCRIPT_SOURCE_DIRECTORY "${CMAKE_SOURCE_DIR}")
set(BUILDNAME
"${CMAKE_SYSTEM}-${CMAKE_SYSTEM_PROCESSOR}-${_COMPILERID}"
CACHE
STRING
"Human-readable build ID info")
set(DASHBOARDSCRIPT_CMAKE_COMMAND
"${CMAKE_COMMAND}"
CACHE
FILEPATH
"The cmake binary to use when configuring a dashboard build")
mark_as_advanced(DASHBOARDSCRIPT_CMAKE_COMMAND)
# Try to find CTest, preferably right next to the chosen CMake
if(DASHBOARDSCRIPT_CMAKE_COMMAND)
get_filename_component(_cmake_dir
${DASHBOARDSCRIPT_CMAKE_COMMAND}
PATH)
else()
get_filename_component(_cmake_dir ${CMAKE_COMMAND} PATH)
endif()
find_program(DASHBOARDSCRIPT_CTEST_EXECUTABLE
NAMES
ctest
HINTS
"${_cmake_dir}"
NO_DEFAULT_PATH)
find_program(DASHBOARDSCRIPT_CTEST_EXECUTABLE
NAMES
ctest
HINTS
"${_cmake_dir}")
set(DASHBOARDSCRIPT_CTEST_EXECUTABLE
"${DASHBOARDSCRIPT_CTEST_EXECUTABLE}"
CACHE
FILEPATH
"Path to the CTest executable to use for dashboard builds.")
mark_as_advanced(DASHBOARDSCRIPT_CTEST_EXECUTABLE)
# Optionals
if(NOT "1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0")
if(IS_DIRECTORY "${CMAKE_SOURCE_DIRECTORY}/.git")
find_program(DASHBOARDSCRIPT_GIT_EXECUTABLE NAMES git git.cmd)
if(DASHBOARDSCRIPT_GIT_EXECUTABLE)
set(UPDATE_TYPE "git")
set(UPDATE_COMMAND "${DASHBOARDSCRIPT_GIT_EXECUTABLE}")
set(UPDATE_OPTIONS "")
mark_as_advanced(DASHBOARDSCRIPT_GIT_EXECUTABLE)
endif()
endif()
endif()
else()
# IN_DASHBOARD_SCRIPT is YES
message(STATUS
"CreateDashboardScripts detected that we're in a dashboard script already.")
endif()
function(create_dashboard_scripts)
# Only create the script if we have all the required variables
# and are not already in it, and are at least 2.8.0.
if(DASHBOARDSCRIPT_BASE_DIRECTORY AND
DASHBOARDSCRIPT_SOURCE_DIRECTORY AND
DASHBOARDSCRIPT_BASE_DIRECTORY AND
BUILDNAME AND
DASHBOARDSCRIPT_CMAKE_COMMAND AND
DASHBOARDSCRIPT_CTEST_EXECUTABLE AND
NOT IN_DASHBOARD_SCRIPT AND
NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.0")
set(_Continuous_cron "15 * * * * ")
set(_Nightly_cron "15 0 * * * ")
set(_Experimental_cron
"\nor run this command for an one-off experimental test build:\n")
set(_Experimental_flags "-VV")
message(STATUS
"Dashboard scripts have been generated for automatic nightly and continuous builds.")
if(WIN32)
set(_Continuous_cron)
set(_Nightly_cron)
message(STATUS
"You can set up scheduled tasks to run these command lines:")
else()
message(STATUS "You can add these sample lines to your crontab:")
endif()
set(_msg)
if(NOT DASHBOARDSCRIPT_BUILD_CONFIGURATION)
set(DASHBOARDSCRIPT_BUILD_CONFIGURATION "RelWithDebInfo")
endif()
set(DASHBOARDSCRIPT_BUILD_CONFIGURATION "${DASHBOARDSCRIPT_BUILD_CONFIGURATION}" CACHE STRING "Build configuration to use for dashboard builds by default")
mark_as_advanced(DASHBOARDSCRIPT_BUILD_CONFIGURATION)
foreach(DASHBOARDSCRIPT_DASH_TYPE Nightly Continuous Experimental)
# If given a cache template, configure it
if(ARGN)
configure_file(${ARGN}
"${DASHBOARDSCRIPT_BASE_DIRECTORY}/GeneratedInitialCache.run${DASHBOARDSCRIPT_DASH_TYPE}.cmake"
@ONLY)
endif()
# Actually create the script file
configure_file(${_dashboardmoddir}/DashboardScript.cmake.in
"${DASHBOARDSCRIPT_BASE_DIRECTORY}/run${DASHBOARDSCRIPT_DASH_TYPE}.cmake"
@ONLY)
set(_msg
"${_msg}\n${_${DASHBOARDSCRIPT_DASH_TYPE}_cron}\"${DASHBOARDSCRIPT_CTEST_EXECUTABLE}\" -S \"${DASHBOARDSCRIPT_BASE_DIRECTORY}/run${DASHBOARDSCRIPT_DASH_TYPE}.cmake\" ${_${DASHBOARDSCRIPT_DASH_TYPE}_flags}")
endforeach()
message(STATUS "\n${_msg}\n")
message(STATUS "")
endif()
endfunction()
# - Dashboard driver script for use with ctest.
#
# Generated file processed by CreateDashboardScripts.cmake
# Run it like:
# ctest -S nameofthisfile
# with -V or -V -VV if you want more feedback.
#
# Generally you do not need to edit this file by hand!
#
# If this file isn't named DashboardScript.cmake.in and located
# in the same directory as CreateDashboardScripts.cmake, it has been
# auto-generated and will be overwritten every time CMake configures
# itself. (This may be every build!)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
set(CTEST_CMAKE_GENERATOR "@CMAKE_GENERATOR@")
set(CTEST_PROJECT_NAME "@PROJECT_NAME@")
set(CTEST_DASHBOARD_ROOT "@DASHBOARDSCRIPT_BASE_DIRECTORY@")
set(CTEST_SOURCE_DIRECTORY "@DASHBOARDSCRIPT_SOURCE_DIRECTORY@")
set(DASH_TYPE "@DASHBOARDSCRIPT_DASH_TYPE@")
set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}/build-${DASH_TYPE}")
set(CTEST_NOTES_FILES
"${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}"
"${CTEST_DASHBOARD_ROOT}/GeneratedCombinedCache.${CTEST_SCRIPT_NAME}")
set(CTEST_BUILD_NAME "@BUILDNAME@")
set(CTEST_SITE "@SITE@")
set(CTEST_USE_LAUNCHERS TRUE)
set(CTEST_COMMAND "@DASHBOARDSCRIPT_CTEST_EXECUTABLE@")
set(CTEST_CMAKE_COMMAND "@DASHBOARDSCRIPT_CMAKE_COMMAND@")
set(CTEST_UPDATE_TYPE "@UPDATE_TYPE@")
set(CTEST_UPDATE_COMMAND "@UPDATE_COMMAND@")
set(CTEST_UPDATE_OPTIONS "@UPDATE_OPTIONS@")
if((NOT CTEST_CONFIGURATION_TYPE) OR (NOT CTEST_BUILD_CONFIGURATION))
set(CTEST_BUILD_CONFIGURATION "@DASHBOARDSCRIPT_BUILD_CONFIGURATION@")
set(CTEST_CONFIGURATION_TYPE "@DASHBOARDSCRIPT_BUILD_CONFIGURATION@")
endif()
# Avoid non-ascii characters in tool output.
set(ENV{LC_ALL} C)
if(EXISTS "${CTEST_DASHBOARD_ROOT}/GeneratedInitialCache.${CTEST_SCRIPT_NAME}")
file(READ "${CTEST_DASHBOARD_ROOT}/GeneratedInitialCache.${CTEST_SCRIPT_NAME}" _initcache)
else()
set(_initcache)
endif()
if(EXISTS "${CTEST_DASHBOARD_ROOT}/CustomInitialCache.cmake")
file(READ "${CTEST_DASHBOARD_ROOT}/CustomInitialCache.cmake" _customcache)
set(_initcache "${_initcache}
${_customcache}")
endif()
set(_initcache "# This file is automatically regenerated every dashboard build -
# Do not edit it directly!
# If you want to add initial cache values, you can create/modify
# the CustomInitialCache.cmake file in this directory.
# Pretty typical settings to preseve from the generating cache
set(BUILD_TESTING ON CACHE BOOL docstring)
set(IN_DASHBOARD_SCRIPT ON CACHE BOOL docstring)
set(CTEST_USE_LAUNCHERS ON CACHE BOOL docstring)
set(CMAKE_PREFIX_PATH \"@CMAKE_PREFIX_PATH@\" CACHE STRING docstring)
set(CMAKE_BUILD_TYPE \"@CMAKE_BUILD_TYPE@\" CACHE STRING docstring)
set(CTEST_CONFIGURATION_TYPE \"@CMAKE_BUILD_TYPE@\" CACHE STRING docstring)
# testing tool locations
# Saved here because the tools in the path might be outdated
set(CPPCHECK_EXECUTABLE \"@CPPCHECK_EXECUTABLE@\" CACHE FILEPATH docstring)
set(DOXYGEN_EXECUTABLE \"@DOXYGEN_EXECUTABLE@\" CACHE FILEPATH docstring)
${_initcache}")
file(WRITE "${CTEST_DASHBOARD_ROOT}/GeneratedCombinedCache.${CTEST_SCRIPT_NAME}" "${_initcache}")
ctest_empty_binary_directory("${CTEST_BINARY_DIRECTORY}")
ctest_start(${DASH_TYPE})
if(CTEST_UPDATE_COMMAND AND NOT DASH_TYPE STREQUAL "Experimental")
ctest_update(SOURCE "${CTEST_SOURCE_DIRECTORY}" RETURN_VALUE res)
endif()
# Only proceed if we updated a file or if we're not a continuous build
set(PROCEED NO)
if(res GREATER 0)
message(STATUS "One or more files were updated, so we will proceed to "
"and build")
set(PROCEED YES)
endif()
if(NOT DASH_TYPE STREQUAL "Continuous")
message(STATUS "We are not a continuous dashboard, so continuing regardless "
"of whether any files were updated")
set(PROCEED YES)
endif()
if(PROCEED)
ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res
OPTIONS "-C${CTEST_DASHBOARD_ROOT}/GeneratedCombinedCache.${CTEST_SCRIPT_NAME}")
if(${res} EQUAL 0)
# Only try to build if we could configure
ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
# Some tests, like cppcheck tests, don't depend on a successful build
ctest_test(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
endif()
endif()
# Always submit results
ctest_submit(RETURN_VALUE res)
# - Run doxygen on source files as a custom target
#
# include(DoxygenTargets)
# add_doxygen(<doxyfile> [OUTPUT_DIRECTORY <outputdir>]
# [EXTRA_INPUT <single path or quoted list of paths>]
# [EXTRA_STRIP_FROM_PATH <single path or quoted list of paths>]
# [EXTRA_STRIP_FROM_INC_PATH <single path or quoted list of paths>]
# [INSTALL_DESTINATION <installdir>
# [INSTALL_COMPONENT <installcomponent>]
# [INSTALL_PDF_NAME <installpdfname>] ]
# [DOC_TARGET <targetname>]
# [PROJECT_NUMBER <versionnumber>]
# [NO_WARNINGS]
# [NO_PDF])
#
# Requires these CMake modules:
# FindDoxygen
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__add_doxygen)
return()
endif()
set(__add_doxygen YES)
# We must run the following at "include" time, not at function call time,
# to find the path to this module rather than the path to a calling list file
get_filename_component(_doxygenmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
if(APPLE)
list(APPEND CMAKE_PREFIX_PATH "/usr/texbin")
endif()
if(NOT DOXYGEN_FOUND)
find_package(Doxygen QUIET)
endif()
set(DOXYGEN_LATEX "NO")
set(DOXYGEN_PDFLATEX "NO")
set(DOXYGEN_DOT "NO")
if(DOXYGEN_DOT_EXECUTABLE)
set(DOXYGEN_DOT "YES")
endif()
find_package(LATEX QUIET)
if(LATEX_COMPILER AND MAKEINDEX_COMPILER)
set(DOXYGEN_LATEX "YES")
endif()
if(PDFLATEX_COMPILER)
set(DOXYGEN_PDFLATEX "YES")
endif()
# An optional single-file install that supports cmake older than 2.8.0
# For internal use
function(_dt_install_file target filename dest rename)
if(CMAKE_VER VERSION_LESS 2.8.0)
set(INSTALL_CODE "
if(EXISTS \"${filename}\")
message(STATUS \"Found: ${filename}\")
file(INSTALL
DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${dest}\"
TYPE FILE
RENAME \"${rename}\"
FILES \"${filename}\")
else()
message(STATUS \"Skipping (build '${target}' to create): ${filename}\")
endif()
")
if(NOT ARGN STREQUAL "")
set(INSTALL_COMPONENT "${ARGN}")
set(INSTALL_CODE "
if(NOT CMAKE_INSTALL_COMPONENT OR \"\${CMAKE_INSTALL_COMPONENT}\" STREQUAL \"${INSTALL_COMPONENT}\")
${INSTALL_CODE}
endif()
")
endif()
install(CODE "${INSTALL_CODE}")
else()
set(COMPONENT_ARGS)
if(NOT ARGN STREQUAL "")
set(COMPONENT_ARGS COMPONENT "${ARGN}")
endif()
install(FILES
"${filename}"
DESTINATION
"${dest}"
RENAME "${rename}"
${COMPONENT_ARGS}
OPTIONAL)
endif()
endfunction()
# An optional single-directory install that supports cmake older than 2.8.0
# For internal use
function(_dt_install_dir target dir dest)
if(CMAKE_VER VERSION_LESS 2.8.0)
set(INSTALL_CODE "
if(EXISTS \"${dir}\")
message(STATUS \"Found: ${dir}\")
file(INSTALL
DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${dest}\"
TYPE DIRECTORY
FILES \"${dir}\")
else()
message(STATUS \"Skipping (build '${target}' to create): ${dir}\")
endif()
")
if(NOT ARGN STREQUAL "")
set(INSTALL_COMPONENT "${ARGN}")
set(INSTALL_CODE "
if(NOT CMAKE_INSTALL_COMPONENT OR \"\${CMAKE_INSTALL_COMPONENT}\" STREQUAL \"${INSTALL_COMPONENT}\")
${INSTALL_CODE}
endif()
")
endif()
install(CODE "${INSTALL_CODE}")
else()
set(COMPONENT_ARGS)
if(NOT ARGN STREQUAL "")
set(COMPONENT_ARGS COMPONENT "${ARGN}")
endif()
install(DIRECTORY
"${dir}"
DESTINATION
"${dest}"
${COMPONENT_ARGS}
OPTIONAL)
endif()
endfunction()
function(add_doxygen _doxyfile)
# parse arguments
set(WARNINGS YES)
set(_nowhere)
set(_curdest _nowhere)
set(_val_args
OUTPUT_DIRECTORY
EXTRA_INPUT
EXTRA_STRIP_FROM_PATH
EXTRA_STRIP_FROM_INC_PATH
DOC_TARGET
INSTALL_DESTINATION
INSTALL_COMPONENT
INSTALL_PDF_NAME
PROJECT_NUMBER)
set(_bool_args
NO_WARNINGS
NO_PDF)
foreach(_arg ${_val_args} ${_bool_args})
set(${_arg})
endforeach()
foreach(_element ${ARGN})
list(FIND _val_args "${_element}" _val_arg_find)
list(FIND _bool_args "${_element}" _bool_arg_find)
if("${_val_arg_find}" GREATER "-1")
set(_curdest "${_element}")
elseif("${_bool_arg_find}" GREATER "-1")
set("${_element}" ON)
set(_curdest _nowhere)
else()
list(APPEND ${_curdest} "${_element}")
endif()
endforeach()
if(_nowhere)
message(FATAL_ERROR "Syntax error in use of add_doxygen!")
endif()
if(NO_WARNINGS)
set(WARNINGS NO)
endif()
if(NOT DOC_TARGET)
set(DOC_TARGET doc)
endif()
if(NOT OUTPUT_DIRECTORY)
set(OUTPUT_DIRECTORY "docs-generated")
endif()
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIRECTORY}")
if(NOT INSTALL_PDF_NAME)
set(INSTALL_PDF_NAME "docs-generated.pdf")
endif()
if(NOT PROJECT_NUMBER)
set(PROJECT_NUMBER "${CPACK_PACKAGE_VERSION}")
endif()
if(DOXYGEN_FOUND)
if(TARGET ${DOC_TARGET})
message(FATAL_ERROR "Documentation target ${DOC_TARGET} already exists!")
endif()
if(NOT IS_ABSOLUTE "${OUTPUT_DIRECTORY}")
get_filename_component(OUTPUT_DIRECTORY
"${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_DIRECTORY}"
ABSOLUTE)
endif()
set_property(DIRECTORY
APPEND
PROPERTY
ADDITIONAL_MAKE_CLEAN_FILES
"${OUTPUT_DIRECTORY}/html"
"${OUTPUT_DIRECTORY}/latex")
if(NOT TARGET ${DOC_TARGET}_open)
# Create a target to open the generated HTML file.
if(WIN32)
set(DOXYGEN_LAUNCHER_COMMAND start)
elseif(NOT APPLE)
set(DOXYGEN_LAUNCHER_COMMAND xdg-open)
endif()
if(DOXYGEN_LAUNCHER_COMMAND)
add_custom_target(${DOC_TARGET}_open
COMMAND ${DOXYGEN_LAUNCHER_COMMAND} "${OUTPUT_DIRECTORY}/html/index.html"
VERBATIM)
set_target_properties(${DOC_TARGET}_open
PROPERTIES
EXCLUDE_FROM_ALL
TRUE)
set_target_properties(${DOC_TARGET}_open
PROPERTIES
EXCLUDE_FROM_DEFAULT_BUILD
TRUE)
add_dependencies(${DOC_TARGET}_open ${DOC_TARGET})
endif()
endif()
get_filename_component(_doxyfileabs "${_doxyfile}" ABSOLUTE)
get_filename_component(INCLUDE_FILE "${_doxyfileabs}" NAME)
get_filename_component(INCLUDE_PATH "${_doxyfileabs}" PATH)
# Doesn't currently work on Windows, so don't bother
if(DOXYGEN_LATEX AND NOT NO_PDF AND NOT WIN32)
set(MAKE_PDF YES)
set(GENERATE_LATEX YES)
else()
set(MAKE_PDF NO)
set(GENERATE_LATEX NO)
endif()
if(DOXYGEN_PDFLATEX AND MAKE_PDF)
set(USE_PDFLATEX YES)
else()
set(USE_PDFLATEX NO)
endif()
if(DOXYGEN_DOT)
set(HAVE_DOT YES)
set(DOT_PATH ${DOXYGEN_DOT_PATH})
else()
set(HAVE_DOT NO)
set(DOT_PATH)
endif()
# See http://www.cmake.org/pipermail/cmake/2006-August/010786.html
# for info on this variable
if("${CMAKE_BUILD_TOOL}" MATCHES "(msdev|devenv)")
set(WARN_FORMAT "\"$file($line) : $text \"")
else()
set(WARN_FORMAT "\"$file:$line: $text \"")
endif()
configure_file("${_doxygenmoddir}/DoxygenTargets.doxyfile.in"
"${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.${DOC_TARGET}.additional"
@ONLY)
if(IN_DASHBOARD_SCRIPT)
set(ALL_IN_DASHBOARD ALL)
else()
set(ALL_IN_DASHBOARD)
endif()
add_custom_target(${DOC_TARGET} ${ALL_IN_DASHBOARD}
COMMAND
"${DOXYGEN_EXECUTABLE}"
"${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.${DOC_TARGET}.additional"
WORKING_DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}"
#MAIN_DEPENDENCY ${DOC_TARGET}
COMMENT
"Running Doxygen with configuration ${_doxyfile}..."
VERBATIM)
if(NOT IN_DASHBOARD_SCRIPT)
set_target_properties(${DOC_TARGET}
PROPERTIES
EXCLUDE_FROM_ALL
TRUE)
set_target_properties(${DOC_TARGET}
PROPERTIES
EXCLUDE_FROM_DEFAULT_BUILD
TRUE)
endif()
if(MAKE_PDF)
add_custom_command(TARGET
${DOC_TARGET}
POST_BUILD
COMMAND
${CMAKE_MAKE_PROGRAM}
WORKING_DIRECTORY
"${OUTPUT_DIRECTORY}/latex"
COMMENT
"Generating PDF using PDFLaTeX..."
VERBATIM)
endif()
if(INSTALL_DESTINATION)
if(INSTALL_COMPONENT)
_dt_install_dir("${DOC_TARGET}" "${OUTPUT_DIRECTORY}/html" "${INSTALL_DESTINATION}" "${INSTALL_COMPONENT}")
if(MAKE_PDF)
_dt_install_file("${DOC_TARGET}" "${OUTPUT_DIRECTORY}/latex/refman.pdf" "${INSTALL_DESTINATION}" "${INSTALL_PDF_NAME}" "${INSTALL_COMPONENT}")
endif()
else()
_dt_install_dir("${DOC_TARGET}" "${OUTPUT_DIRECTORY}/html" "${INSTALL_DESTINATION}")
if(MAKE_PDF)
_dt_install_file("${DOC_TARGET}" "${OUTPUT_DIRECTORY}/latex/refman.pdf" "${INSTALL_DESTINATION}" "${INSTALL_PDF_NAME}")
endif()
endif()
endif()
endif()
endfunction()
@INCLUDE_PATH = "@INCLUDE_PATH@"
@INCLUDE = "@INCLUDE_FILE@"
OUTPUT_DIRECTORY = "@OUTPUT_DIRECTORY@"
GENERATE_LATEX = "@GENERATE_LATEX@"
USE_PDFLATEX = @USE_PDFLATEX@
HAVE_DOT = @HAVE_DOT@
DOT_PATH = "@DOT_PATH@"
LATEX_CMD_NAME = "@LATEX_COMPILER@"
MAKEINDEX_CMD_NAME = "@MAKEINDEX_COMPILER@"
WARNINGS = @WARNINGS@
WARN_FORMAT = @WARN_FORMAT@
PROJECT_NUMBER = @PROJECT_NUMBER@
INPUT += @EXTRA_INPUT@
STRIP_FROM_PATH += @EXTRA_STRIP_FROM_PATH@
STRIP_FROM_INC_PATH += @EXTRA_STRIP_FROM_INC_PATH@
LATEX_BATCHMODE = YES
QUIET = YES
# - Add flags to compile with extra warnings
#
# enable_extra_compiler_warnings(<targetname>)
# globally_enable_extra_compiler_warnings() - to modify CMAKE_CXX_FLAGS, etc
# to change for all targets declared after the command, instead of per-command
#
#
# Original Author:
# 2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__enable_extra_compiler_warnings)
return()
endif()
set(__enable_extra_compiler_warnings YES)
macro(_enable_extra_compiler_warnings_flags)
set(_flags)
if(MSVC)
option(COMPILER_WARNINGS_EXTREME
"Use compiler warnings that are probably overkill."
off)
mark_as_advanced(COMPILER_WARNINGS_EXTREME)
set(_flags "/W4")
if(COMPILER_WARNINGS_EXTREME)
set(_flags "${_flags} /Wall /wd4619 /wd4668 /wd4820 /wd4571 /wd4710")
endif()
else()
include(CheckCXXCompilerFlag)
set(_flags)
check_cxx_compiler_flag(-W SUPPORTS_W_FLAG)
if(SUPPORTS_W_FLAG)
set(_flags "${_flags} -W")
endif()
check_cxx_compiler_flag(-Wall SUPPORTS_WALL_FLAG)
if(SUPPORTS_WALL_FLAG)
set(_flags "${_flags} -Wall")
endif()
check_cxx_compiler_flag(-Wextra SUPPORTS_WEXTRA_FLAG)
if(SUPPORTS_WEXTRA_FLAG)
set(_flags "${_flags} -Wextra")
endif()
endif()
endmacro()
function(enable_extra_compiler_warnings _target)
_enable_extra_compiler_warnings_flags()
get_target_property(_origflags ${_target} COMPILE_FLAGS)
if(_origflags)
set_property(TARGET
${_target}
PROPERTY
COMPILE_FLAGS
"${_flags} ${_origflags}")
else()
set_property(TARGET
${_target}
PROPERTY
COMPILE_FLAGS
"${_flags}")
endif()
endfunction()
function(globally_enable_extra_compiler_warnings)
_enable_extra_compiler_warnings_flags()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flags}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flags}" PARENT_SCOPE)
endfunction()
# - Add flags to compile with profiling support - currently only for GCC
#
# enable_profiling(<targetname>)
# globally_enable_profiling() - to modify CMAKE_CXX_FLAGS, etc
# to change for all targets declared after the command, instead of per-command
#
#
# Original Author:
# 2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__enable_profiling)
return()
endif()
set(__enable_profiling YES)
macro(_enable_profiling_flags)
set(_flags)
if(MSVC)
# TODO: what kind of flags are needed to profile on MSVC?
#set(_flags /W4)
elseif(CMAKE_COMPILER_IS_GNUCXX)
set(_flags "-p")
endif()
endmacro()
function(enable_profiling _target)
_enable_profiling_flags()
get_target_property(_origflags ${_target} COMPILE_FLAGS)
if(_origflags)
set_property(TARGET
${_target}
PROPERTY
COMPILE_FLAGS
"${_flags} ${_origflags}")
else()
set_property(TARGET
${_target}
PROPERTY
COMPILE_FLAGS
"${_flags}")
endif()
endfunction()
function(globally_enable_profiling)
_enable_profiling_flags()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flags}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flags}" PARENT_SCOPE)
endfunction()
# - try to find Adrienne Electronics Corporation timecode card library
#
# SDK available from the manufacturer: http://www.adrielec.com/
#
# Cache Variables: (probably not for direct use in your scripts)
# ADRIENNE_INCLUDE_DIR
# ADRIENNE_LIBRARY
# ADRIENNE_RUNTIME_LIBRARY
# ADRIENNE_INCLUDE_FILE
#
# Variables you might use in your CMakeLists.txt:
# ADRIENNE_FOUND
# ADRIENNE_INCLUDE_DIRS
# ADRIENNE_LIBRARIES
# ADRIENNE_RUNTIME_LIBRARIES - the AEC_NTTC.dll file
# ADRIENNE_RUNTIME_LIBRARY_DIRS
#
# ADRIENNE_INCLUDE_FILENAME - this is probably AEC_NTTC.h, but it might also
# be AECINTTC.H.
#
# ADRIENNE_INCLUDE_HAS_EXTERN_C - Some (most) versions of the header already
# wrap their definitions in extern "C" { }, but some do not.
#
# ADRIENNE_DEFINITIONS - defines a quoted ADRIENNE_INCLUDE_FILENAME as above,
# so you can write a line like #include ADRIENNE_INCLUDE_FILENAME
# Also defines ADRIENNE_BEFORE_INCLUDE and ADRIENNE_AFTER_INCLUDE to handle
# adding extern "C" { and } if the header file doesn't do so itself.
#
# Variables that might be set by the user in the gui/command line to help
# find the library:
# ADRIENNE_ROOT_DIR - root of an Adrienne CD, disk, or extracted/copied contents
# thereof.
#
# Requires these CMake modules:
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
#
# Original Author:
# 2012 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2012.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# Apparently Windows only.
if(WIN32 OR CYGWIN)
set(ADRIENNE_ROOT_DIR
"${ADRIENNE_ROOT_DIR}"
CACHE
PATH
"Directory to search for Adrienne Electronics Timecode data - root of a software distribution or extracted download from http://www.adrielec.com/")
set(ADRIENNE_DEFINITIONS)
set(ADRIENNE_INCLUDE_SEARCH
# from AecPCIeTC_8-12a: contains AEC_NTTC.h with extern "C" and three extra functions:
# AEC_PCTC_OPEN_ALL, AEC_PCTC_CLOSE_ALL, AEC_PCTC_INITIALIZE_EVENT
"SDK_SourceCode"
# from AecPci6_02_CD - called AECINTTC.H but otherwise essentially identical to earlier versions
"TestPrograms_WithDLL/DLL_API_INFO"
# A zipped development project contains essentially the same, named AEC_NTTC.h so we'll add this in case it's unzipped.
"TestPrograms_WithDLL/ZippedDevelopmentProjects/AecMfc32_Rel504"
# from pc-ltc - called AECINTTC.H and lacks extern "C"
"NT-CODE/C40-APP1"
)
set(ADRIENNE_HEADER_NAMES
AEC_NTTC.H
AEC_NTTC.h
Aec_nttc.h
AECINTTC.H)
set(ADRIENNE_LIB_SEARCH)
set(ADRIENNE_DLL_SEARCH)
if(CMAKE_SIZEOF_VOID_P MATCHES "8")
# 64 bit code - apparently initially packaged only in the
# PCIe version of their software
list(APPEND ADRIENNE_LIB_SEARCH
# from AecPCIeTC_8-12a
"64BitOS_files/DLL Versions")
list(APPEND ADRIENNE_DLL_SEARCH
# from AecPCIeTC_8-12a
"64BitOS_files/DLL Versions")
else()
# 32-bit code, much more prevalent.
list(APPEND ADRIENNE_LIB_SEARCH
# from AecPCIeTC_8-12a
"32BitOS_files/DLLversions"
# from AecPci6_02_CD
"TestPrograms_WithDLL/DLL_API_INFO"
# from pc-ltc
"NT-CODE/DLL"
)
list(APPEND ADRIENNE_DLL_SEARCH
# from AecPCIeTC_8-12a
"32BitOS_files/DLLversions"
# from AecPci6_02_CD
"TestPrograms_WithDLL"
# from pc-ltc
"NT-CODE/DLL")
endif()
find_library(ADRIENNE_LIBRARY
NAMES
AEC_NTTC
PATHS
"${ADRIENNE_ROOT_DIR}"
PATH_SUFFIXES
${ADRIENNE_LIB_SEARCH})
find_path(ADRIENNE_INCLUDE_DIR
NAMES
${ADRIENNE_HEADER_NAMES}
PATHS
"${ADRIENNE_ROOT_DIR}"
PATH_SUFFIXES
${ADRIENNE_INCLUDE_SEARCH})
if(ADRIENNE_INCLUDE_DIR)
find_file(ADRIENNE_INCLUDE_FILE
NAMES
${ADRIENNE_HEADER_NAMES}
HINTS
${ADRIENNE_INCLUDE_DIR})
# Get include filename
get_filename_component(ADRIENNE_INCLUDE_FILENAME
"${ADRIENNE_INCLUDE_FILE}"
NAME)
list(APPEND ADRIENNE_DEFINITIONS -DADRIENNE_INCLUDE_FILENAME="ADRIENNE_INCLUDE_FILENAME")
# Find out if it has extern "C" in it.
file(STRINGS "${ADRIENNE_INCLUDE_FILE}" strings)
set(ADRIENNE_INCLUDE_HAS_EXTERN_C OFF)
foreach(_line ${strings})
if("${_line}" STREQUAL "extern \"C\"")
set(ADRIENNE_INCLUDE_HAS_EXTERN_C ON)
break()
endif()
endforeach()
if(ADRIENNE_INCLUDE_HAS_EXTERN_C)
list(APPEND ADRIENNE_DEFINITIONS -DADRIENNE_BEFORE_INCLUDE -DADRIENNE_AFTER_INCLUDE)
else()
list(APPEND ADRIENNE_DEFINITIONS "-DADRIENNE_BEFORE_INCLUDE=extern \"C\" {" "-DADRIENNE_AFTER_INCLUDE=}")
endif()
endif()
get_filename_component(_adrienne_libdir "${ADRIENNE_LIBRARY}" PATH)
find_file(ADRIENNE_RUNTIME_LIBRARY
NAMES
AEC_NTTC.dll
HINTS
"${_adrienne_libdir}"
"${_adrienne_libdir}/.."
PATHS
"${ADRIENNE_ROOT_DIR}"
PATH_SUFFIXES
${ADRIENNE_DLL_SEARCH})
set(ADRIENNE_RUNTIME_LIBRARIES "${ADRIENNE_RUNTIME_LIBRARY}")
get_filename_component(ADRIENNE_RUNTIME_LIBRARY_DIRS
"${ADRIENNE_RUNTIME_LIBRARY}"
PATH)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Adrienne
DEFAULT_MSG
ADRIENNE_LIBRARY
ADRIENNE_RUNTIME_LIBRARY
ADRIENNE_INCLUDE_DIR
ADRIENNE_INCLUDE_FILENAME)
if(ADRIENNE_FOUND)
set(ADRIENNE_LIBRARIES "${ADRIENNE_LIBRARY}")
set(ADRIENNE_INCLUDE_DIRS "${ADRIENNE_INCLUDE_DIR}")
mark_as_advanced(ADRIENNE_ROOT_DIR)
endif()
mark_as_advanced(
ADRIENNE_LIBRARY
ADRIENNE_RUNTIME_LIBRARY
ADRIENNE_INCLUDE_DIR
ADRIENNE_INCLUDE_FILE)
else()
set(ADRIENNE_FOUND OFF)
set(ADRIENNE_SDK_IS_WINDOWS_ONLY NOTFOUND)
find_package_handle_standard_args(Adrienne
DEFAULT_MSG
ADRIENNE_SDK_IS_WINDOWS_ONLY)
endif()
# - Find Microsoft DirectShow sample files, library, and headers.
#
# DIRECTSHOW_INCLUDE_DIRS - where to find needed include file
# DIRECTSHOW_BASECLASS_DIR- Directory containing the DirectShow baseclass sample code.
# DIRECTSHOW_FOUND - True if DirectShow found.
#
# Requires these CMake modules:
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
#
# Initially in VRPN - Distributed under the Boost Software License, Version 1.0.
#
# Almost entirely re-written by:
# 2012 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2012.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# Look for one of the sample files.
find_package(WindowsSDK)
find_package(DirectX QUIET)
set(DIRECTSHOW_WINDOWSSDK_ROOT
"${DIRECTSHOW_WINDOWSSDK_ROOT}"
CACHE
PATH
"A specific Windows SDK to use for DirectShow.")
if(MSVC AND CMAKE_CL_64)
set(DIRECTSHOW_LIB_SUBDIR /x64)
else()
set(DIRECTSHOW_LIB_SUBDIR)
endif()
set(_acceptable_winsdk)
if(WINDOWSSDK_FOUND)
foreach(_sdkdir ${WINDOWSSDK_DIRS})
if(EXISTS "${_sdkdir}/Samples/Multimedia/DirectShow/BaseClasses/streams.h"
AND EXISTS "${_sdkdir}/Lib${DIRECTSHOW_LIB_SUBDIR}/strmiids.lib"
AND EXISTS "${_sdkdir}/Include/DShow.h")
list(APPEND _acceptable_winsdk "${_sdkdir}")
endif()
endforeach()
endif()
find_path(DIRECTSHOW_BASECLASS_DIR
NAMES
streams.h
HINTS
"${DIRECTSHOW_WINDOWSSDK_ROOT}"
PATHS
${_acceptable_winsdk}
PATH_SUFFIXES
"Samples/Multimedia/DirectShow/BaseClasses")
find_path(DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR
NAMES
DShow.h
HINTS
"${DIRECTSHOW_WINDOWSSDK_ROOT}"
PATHS
${_acceptable_winsdk}
PATH_SUFFIXES
"Include")
# This one we can grab from another SDK version.
find_path(DIRECTSHOW_QEDIT_INCLUDE_DIR
NAMES
qedit.h
HINTS
"${DIRECTSHOW_WINDOWSSDK_ROOT}"
PATHS
${WINDOWSSDK_DIRS}
PATH_SUFFIXES
"Include")
find_library(DIRECTSHOW_STRMIIDS_LIBRARY
NAMES
strmiids
HINTS
"${DIRECTSHOW_WINDOWSSDK_ROOT}"
PATHS
${_acceptable_winsdk}
PATH_SUFFIXES
"Lib${DIRECTSHOW_LIB_SUBDIR}")
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(DirectShow
DEFAULT_MSG
DIRECTSHOW_BASECLASS_DIR
DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR
DIRECTSHOW_QEDIT_INCLUDE_DIR
DIRECTX_INCLUDE_DIR
DIRECTSHOW_STRMIIDS_LIBRARY)
if(DIRECTSHOW_FOUND)
set(DIRECTSHOW_INCLUDE_DIRS
# Baseclass must be before SDK so it gets the correct refclock.h
"${DIRECTSHOW_BASECLASS_DIR}"
"${DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR}"
"${DIRECTX_INCLUDE_DIR}"
)
if(EXISTS "${DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR}/atl/atlbase.h")
list(APPEND
DIRECTSHOW_INCLUDE_DIRS
"${DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR}/atl")
endif()
if(NOT "${DIRECTSHOW_QEDIT_INCLUDE_DIR}" STREQUAL "${DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR}")
# QEdit include dir might be an older SDK, so put it last.
list(APPEND DIRECTSHOW_INCLUDE_DIRS "${DIRECTSHOW_QEDIT_INCLUDE_DIR}")
endif()
set(DIRECTSHOW_LIBRARIES "${DIRECTSHOW_STRMIIDS_LIBRARY}")
mark_as_advanced(DIRECTSHOW_WINDOWSSDK_ROOT)
endif()
mark_as_advanced(DIRECTSHOW_BASECLASS_DIR
DIRECTSHOW_WINDOWSSDK_INCLUDE_DIR
DIRECTSHOW_QEDIT_INCLUDE_DIR
DIRECTSHOW_STRMIIDS_LIBRARY)
# - try to find part of DirectX SDK
#
# Cache Variables: (probably not for direct use in your scripts)
# DIRECTX_INCLUDE_DIR
#
# Variables you should use in your CMakeLists.txt:
# DIRECTX_DXGUID_LIBRARY - deprecated, see below
# DIRECTX_DXERR_LIBRARY - deprecated, see http://blogs.msdn.com/b/chuckw/archive/2012/04/24/where-s-dxerr-lib.aspx
# DIRECTX_DINPUT_LIBRARY
# DIRECTX_DINPUT_INCLUDE_DIR
# DIRECTX_D3D9_LIBRARY
# DIRECTX_D3DXOF_LIBRARY
# DIRECTX_D3DX9_LIBRARIES
# DIRECTX_INCLUDE_DIRS
# DIRECTX_FOUND - if this is not true, do not attempt to use this library
#
# Defines these macros:
# find_directx_include - wrapper for find_path that provides PATHS, HINTS, and PATH_SUFFIXES.
# find_directx_library - wrapper for find_library that provides PATHS, HINTS, and PATH_SUFFIXES.
# Requires these CMake modules:
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
# SelectLibraryConfigurations
#
# Original Author:
# 2012 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2012.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
set(DIRECTX_ROOT_DIR
"${DIRECTX_ROOT_DIR}"
CACHE
PATH
"Root directory to search for DirectX")
if(MSVC)
file(TO_CMAKE_PATH "$ENV{ProgramFiles}" _PROG_FILES)
file(TO_CMAKE_PATH "$ENV{ProgramFiles(x86)}" _PROG_FILES_X86)
if(_PROG_FILES_X86)
set(_PROG_FILES "${_PROG_FILES_X86}")
endif()
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_dx_lib_suffixes lib/x64 lib)
else()
set(_dx_lib_suffixes lib/x86 lib)
endif()
set(DXSDK_DIRS)
find_package(WindowsSDK)
if(WINDOWSSDK_FOUND)
foreach(_dir ${WINDOWSSDK_DIRS})
get_windowssdk_include_dirs(${_dir} _include_dirs)
if(_include_dirs)
list(APPEND DXSDK_DIRS ${_include_dirs})
endif()
endforeach()
endif()
macro(_append_dxsdk_in_inclusive_range _low _high)
if((NOT MSVC_VERSION LESS ${_low}) AND (NOT MSVC_VERSION GREATER ${_high}))
list(APPEND DXSDK_DIRS ${ARGN})
endif()
endmacro()
_append_dxsdk_in_inclusive_range(1500 1600 "${_PROG_FILES}/Microsoft DirectX SDK (June 2010)")
_append_dxsdk_in_inclusive_range(1400 1600
"${_PROG_FILES}/Microsoft DirectX SDK (February 2010)"
"${_PROG_FILES}/Microsoft DirectX SDK (August 2009)"
"${_PROG_FILES}/Microsoft DirectX SDK (March 2009)"
"${_PROG_FILES}/Microsoft DirectX SDK (November 2008)"
"${_PROG_FILES}/Microsoft DirectX SDK (August 2008)"
"${_PROG_FILES}/Microsoft DirectX SDK (June 2008)"
"${_PROG_FILES}/Microsoft DirectX SDK (March 2008)")
_append_dxsdk_in_inclusive_range(1310 1500
"${_PROG_FILES}/Microsoft DirectX SDK (November 2007)"
"${_PROG_FILES}/Microsoft DirectX SDK (August 2007)"
"${_PROG_FILES}/Microsoft DirectX SDK (June 2007)"
"${_PROG_FILES}/Microsoft DirectX SDK (April 2007)"
"${_PROG_FILES}/Microsoft DirectX SDK (February 2007)"
"${_PROG_FILES}/Microsoft DirectX SDK (December 2006)"
"${_PROG_FILES}/Microsoft DirectX SDK (October 2006)"
"${_PROG_FILES}/Microsoft DirectX SDK (August 2006)"
"${_PROG_FILES}/Microsoft DirectX SDK (June 2006)"
"${_PROG_FILES}/Microsoft DirectX SDK (April 2006)"
"${_PROG_FILES}/Microsoft DirectX SDK (February 2006)")
file(TO_CMAKE_PATH "$ENV{DXSDK_DIR}" ENV_DXSDK_DIR)
if(ENV_DXSDK_DIR)
list(APPEND DXSDK_DIRS ${ENV_DXSDK_DIR})
endif()
else()
set(_dx_lib_suffixes lib)
set(DXSDK_DIRS /mingw)
endif()
find_path(DIRECTX_INCLUDE_DIR
NAMES
dxdiag.h
dinput.h
dxerr8.h
PATHS
${DXSDK_DIRS}
HINTS
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
include)
find_path(DIRECTX_DINPUT_INCLUDE_DIR
NAMES
dinput.h
PATHS
${DXSDK_DIRS}
HINTS
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
include)
set(DXLIB_HINTS)
if(WINDOWSSDK_FOUND AND DIRECTX_INCLUDE_DIR)
get_windowssdk_from_component("${DIRECTX_INCLUDE_DIR}" _winsdk)
if(_winsdk)
get_windowssdk_library_dirs("${_winsdk}" _libdirs)
if(_libdirs)
list(APPEND DXLIB_HINTS ${_libdirs})
endif()
endif()
endif()
if(WINDOWSSDK_FOUND AND DIRECTX_DINPUT_INCLUDE_DIR)
get_windowssdk_from_component("${DIRECTX_DINPUT_INCLUDE_DIR}" _winsdk)
if(_winsdk)
get_windowssdk_library_dirs("${_winsdk}" _includes)
if(_includes)
list(APPEND DXLIB_HINTS ${_includes})
endif()
endif()
endif()
find_library(DIRECTX_DXGUID_LIBRARY
NAMES
dxguid
PATHS
${DXLIB_HINTS}
${DXSDK_DIRS}
HINTS
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
if(DIRECTX_DXGUID_LIBRARY)
get_filename_component(_dxsdk_lib_dir ${DIRECTX_DXGUID_LIBRARY} PATH)
list(APPEND DXLIB_HINTS "${_dxsdk_lib_dir}")
endif()
find_library(DIRECTX_DINPUT_LIBRARY
NAMES
dinput8
dinput
PATHS
${DXSDK_DIRS}
HINTS
${DXLIB_HINTS}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
find_library(DIRECTX_DXERR_LIBRARY
NAMES
dxerr
dxerr9
dxerr8
PATHS
${DXSDK_DIRS}
HINTS
${DXLIB_HINTS}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
find_library(DIRECTX_D3D9_LIBRARY
NAMES
d3d9
PATHS
${DXSDK_DIRS}
HINTS
${DXLIB_HINTS}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
find_library(DIRECTX_D3DXOF_LIBRARY
NAMES
d3dxof
PATHS
${DXSDK_DIRS}
HINTS
${DXLIB_HINTS}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
find_library(DIRECTX_D3DX9_LIBRARY_RELEASE
NAMES
d3dx9
PATHS
${DXSDK_DIRS}
HINTS
${DXLIB_HINTS}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
find_library(DIRECTX_D3DX9_LIBRARY_DEBUG
NAMES
d3dx9d
PATHS
${DXSDK_DIRS}
HINTS
${DXLIB_HINTS}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
find_library(DIRECTX_XINPUT_LIBRARY
NAMES
Xinput9_1_0
Xinput
PATHS
${DXSDK_DIRS}
HINTS
${DXLIB_HINTS}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
include(SelectLibraryConfigurations)
select_library_configurations(DIRECTX_D3DX9)
set(DIRECTX_EXTRA_CHECK)
if(DIRECTX_INCLUDE_DIR)
if(MSVC80)
set(DXSDK_DEPRECATION_BUILD 1962)
endif()
if(DXSDK_DEPRECATION_BUILD)
include(CheckCSourceCompiles)
set(_dinput_old_includes ${CMAKE_REQUIRED_INCLUDES})
set(CMAKE_REQUIRED_INCLUDES "${DIRECTX_INCLUDE_DIR}")
check_c_source_compiles("
#include <dxsdkver.h>
#if _DXSDK_BUILD_MAJOR >= ${DXSDK_DEPRECATION_BUILD}
#error
#else
int main(int argc, char * argv[]) {
return 0;
}
#endif
"
DIRECTX_SDK_SUPPORTS_COMPILER)
set(DIRECTX_EXTRA_CHECK DIRECTX_SDK_SUPPORTS_COMPILER)
set(CMAKE_REQUIRED_INCLUDES "${_dinput_old_includes}")
else()
# Until proven otherwise.
set(DIRECTX_SDK_SUPPORTS_COMPILER TRUE)
endif()
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(DirectX
DEFAULT_MSG
DIRECTX_DXGUID_LIBRARY
DIRECTX_DINPUT_LIBRARY
DIRECTX_INCLUDE_DIR
${DIRECTX_EXTRA_CHECK})
if(DIRECTX_FOUND)
set(DIRECTX_LIBRARIES
"${DIRECTX_DXGUID_LIBRARY}"
"${DIRECTX_DINPUT_LIBRARY}")
set(DIRECTX_INCLUDE_DIRS "${DIRECTX_INCLUDE_DIR}")
mark_as_advanced(DIRECTX_ROOT_DIR)
endif()
macro(find_directx_library)
find_library(${ARGN}
PATHS
${DXSDK_DIRS}
HINTS
${DXLIB_HINTS}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
${_dx_lib_suffixes})
endmacro()
macro(find_directx_include)
find_path(${ARGN}
PATHS
${DXSDK_DIRS}
HINTS
${DIRECTX_INCLUDE_DIR}
"${DIRECTX_ROOT_DIR}"
PATH_SUFFIXES
include)
endmacro()
mark_as_advanced(DIRECTX_DINPUT_LIBRARY
DIRECTX_DXGUID_LIBRARY
DIRECTX_DXERR_LIBRARY
DIRECTX_D3D9_LIBRARY
DIRECTX_D3DXOF_LIBRARY
DIRECTX_D3DX9_LIBRARY_RELEASE
DIRECTX_D3DX9_LIBRARY_DEBUG
DIRECTX_INCLUDE_DIR)
# - try to find Sensable GHOST library and include files
# GHOST_INCLUDE_DIRS, where to find GL/glut.h, etc.
# GHOST_LIBRARIES, the libraries to link against
# GHOST_FOUND, If false, do not try to use GLUT.
# GHOST_RUNTIME_LIBRARY_DIRS, path to DLL on Windows for runtime use.
#
# Requires these CMake modules:
# no additional modules required
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
set(GHOST_ROOT_DIR
"${GHOST_ROOT_DIR}"
CACHE
PATH
"Path to search for GHOST")
set(_dirs)
if(WIN32)
include(ProgramFilesGlob)
program_files_fallback_glob(_dirs "/Sensable/GHOST/v*/")
endif()
find_path(GHOST_INCLUDE_DIR
gstPHANToM.h
PATHS
${_dirs}
HINTS
"${GHOST_ROOT_DIR}"
PATH_SUFFIXES
include)
find_library(GHOST_LIBRARY
GHOST40
GHOST31
PATHS
${_dirs}
HINTS
"${GHOST_ROOT_DIR}"
PATH_SUFFIXES
lib)
if(MSVC)
if(MSVC_VERSION GREATER 1300)
# .NET and newer: fake the STL headers
get_filename_component(_moddir "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(GHOST_STL_INCLUDE_DIR "${_moddir}/ghost-fake-stl")
else()
# 6.0 and earlier - use GHOST-provided STL
find_path(GHOST_STL_INCLUDE_DIR
vector.h
PATHS
${_dirs}
HINTS
"${GHOST_ROOT_DIR}"
"${GHOST_INCLUDE_DIR}"
PATH_SUFFIXES
external/stl
stl)
endif()
set(_deps_check GHOST_STL_INCLUDE_DIR)
else()
set(_deps_check)
endif()
# handle the QUIETLY and REQUIRED arguments and set xxx_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GHOST
DEFAULT_MSG
GHOST_LIBRARY
${_deps_check}
GHOST_INCLUDE_DIR)
if(GHOST_FOUND)
set(GHOST_LIBRARIES "${GHOST_LIBRARY}")
set(GHOST_INCLUDE_DIRS "${GHOST_INCLUDE_DIR}")
mark_as_advanced(GHOST_ROOT_DIR)
endif()
mark_as_advanced(GHOST_LIBRARY GHOST_STL_INCLUDE_DIR GHOST_INCLUDE_DIR)
# - 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
#
# Requires these CMake modules:
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
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()
mark_as_advanced(GPM_INCLUDE_DIR GPM_LIBRARY)
# - try to find HIDAPI library
# from http://www.signal11.us/oss/hidapi/
#
# Cache Variables: (probably not for direct use in your scripts)
# HIDAPI_INCLUDE_DIR
# HIDAPI_LIBRARY
#
# Non-cache variables you might use in your CMakeLists.txt:
# HIDAPI_FOUND
# HIDAPI_INCLUDE_DIRS
# HIDAPI_LIBRARIES
#
# Requires these CMake modules:
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
find_library(HIDAPI_LIBRARY
NAMES hidapi)
find_path(HIDAPI_INCLUDE_DIR
NAMES hidapi.h)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(HIDAPI
DEFAULT_MSG
HIDAPI_LIBRARY
HIDAPI_INCLUDE_DIR)
if(HIDAPI_FOUND)
set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARY}")
set(HIDAPI_INCLUDE_DIRS "${HIDAPI_INCLUDE_DIR}")
endif()
mark_as_advanced(HIDAPI_INCLUDE_DIR HIDAPI_LIBRARY)
# - try to find InterSense library
#
# Cache Variables: (probably not for direct use in your scripts)
# INTERSENSE_INCLUDE_DIR
# INTERSENSE_ISENSEC_DIR - location of the isense.c "import library" substitute.
# INTERSENSE_LIBRARY
#
# Non-cache variables you might use in your CMakeLists.txt:
# INTERSENSE_FOUND
# INTERSENSE_INCLUDE_DIRS
# INTERSENSE_LIBRARIES
#
# Requires these CMake modules:
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
#
# Author:
# 2013 Eric Marsh <bits@wemarsh.com>
# http://wemarsh.com/
# Kognitiv Neuroinformatik, Universität Bremen
#
# (building on Ryan Pavlik's templates)
#
# 2013 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
set(INTERSENSE_ROOT_DIR
"${INTERSENSE_ROOT_DIR}"
CACHE
PATH
"Directory to search for the Intersense SDK")
if(APPLE)
set(_ARCH UniversalLib)
else()
if(CMAKE_SIZEOF_VOID_P MATCHES "8")
set(_ARCH x86_64)
else()
set(_ARCH x86_32)
endif()
endif()
if(APPLE)
set(_SDKDIR MacOSX)
elseif(WIN32)
set(_SDKDIR Windows)
else() # Assume Linux, since that's the only other platform supported by this library
set(_SDKDIR Linux)
endif()
find_path(INTERSENSE_INCLUDE_DIR
NAMES isense.h
PATHS "${INTERSENSE_ROOT_DIR}" "${INTERSENSE_ROOT_DIR}/SDK")
find_path(INTERSENSE_ISENSEC_DIR
NAMES isense.c
PATHS "${INTERSENSE_ROOT_DIR}" "${INTERSENSE_ROOT_DIR}/SDK"
PATH_SUFFIXES
Linux/Sample
MacOSX/Sample
"Windows/Sample/Visual C++ 2005"
"Windows/Sample/Visual C++ 2005 (single tracker)")
include(FindPackageHandleStandardArgs)
# This is a weird one - no import library is supplied, and instead, at least on Windows, they use
# an isense.c file to call into the DLL. Not sure if MinGW can link right against the dll in this case.
if(WIN32)
find_package_handle_standard_args(InterSense
DEFAULT_MSG
INTERSENSE_INCLUDE_DIR
INTERSENSE_ISENSEC_DIR)
if(INTERSENSE_FOUND)
set(INTERSENSE_LIBRARIES "")
set(INTERSENSE_INCLUDE_DIRS "${INTERSENSE_INCLUDE_DIR}" "${INTERSENSE_ISENSEC_DIR}")
endif()
else() # Only MSVC on Windows theoretically needs import libraries, so...
find_library(INTERSENSE_LIBRARY
NAMES isense
PATHS "${INTERSENSE_ROOT_DIR}" "${INTERSENSE_ROOT_DIR}/SDK"
PATH_SUFFIXES "${_SDKDIR}/${_ARCH}")
find_package_handle_standard_args(InterSense
DEFAULT_MSG
INTERSENSE_LIBRARY
INTERSENSE_INCLUDE_DIR)
if(INTERSENSE_FOUND)
set(INTERSENSE_LIBRARIES "${INTERSENSE_LIBRARY}" ${CMAKE_DL_LIBS})
set(INTERSENSE_INCLUDE_DIRS "${INTERSENSE_INCLUDE_DIR}")
endif()
endif()
mark_as_advanced(INTERSENSE_INCLUDE_DIR INTERSENSE_ISENSEC_DIR INTERSENSE_LIBRARY)