1# - try to find Adrienne Electronics Corporation timecode card library
2#
3# SDK available from the manufacturer: http://www.adrielec.com/
4#
5# Cache Variables: (probably not for direct use in your scripts)
6#  ADRIENNE_INCLUDE_DIR
7#  ADRIENNE_LIBRARY
8#  ADRIENNE_RUNTIME_LIBRARY
9#  ADRIENNE_INCLUDE_FILE
10#
11# Variables you might use in your CMakeLists.txt:
12#  ADRIENNE_FOUND
13#  ADRIENNE_INCLUDE_DIRS
14#  ADRIENNE_LIBRARIES
15#  ADRIENNE_RUNTIME_LIBRARIES - the AEC_NTTC.dll file
16#  ADRIENNE_RUNTIME_LIBRARY_DIRS
17#
18#  ADRIENNE_INCLUDE_FILENAME - this is probably AEC_NTTC.h, but it might also
19#    be AECINTTC.H.
20#
21#  ADRIENNE_INCLUDE_HAS_EXTERN_C - Some (most) versions of the header already
22#    wrap their definitions in extern "C" { }, but some do not.
23#
24#  ADRIENNE_DEFINITIONS - defines a quoted ADRIENNE_INCLUDE_FILENAME as above,
25#    so you can write a line like #include ADRIENNE_INCLUDE_FILENAME
26#    Also defines ADRIENNE_BEFORE_INCLUDE and ADRIENNE_AFTER_INCLUDE to handle
27#    adding extern "C" { and } if the header file doesn't do so itself.
28#
29# Variables that might be set by the user in the gui/command line to help
30# find the library:
31#  ADRIENNE_ROOT_DIR - root of an Adrienne CD, disk, or extracted/copied contents
32#    thereof.
33#
34# Requires these CMake modules:
35#  FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
36#
37# Original Author:
38# 2012 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
39# http://academic.cleardefinition.com
40# Iowa State University HCI Graduate Program/VRAC
41#
42# Copyright Iowa State University 2012.
43# Distributed under the Boost Software License, Version 1.0.
44# (See accompanying file LICENSE_1_0.txt or copy at
45# http://www.boost.org/LICENSE_1_0.txt)
46
47# Apparently Windows only.
48if(WIN32 OR CYGWIN)
49	set(ADRIENNE_ROOT_DIR
50		"${ADRIENNE_ROOT_DIR}"
51		CACHE
52		PATH
53		"Directory to search for Adrienne Electronics Timecode data - root of a software distribution or extracted download from http://www.adrielec.com/")
54
55	set(ADRIENNE_DEFINITIONS)
56
57	set(ADRIENNE_INCLUDE_SEARCH
58		# from AecPCIeTC_8-12a: contains AEC_NTTC.h with extern "C" and three extra functions:
59		# AEC_PCTC_OPEN_ALL, AEC_PCTC_CLOSE_ALL,  AEC_PCTC_INITIALIZE_EVENT
60		"SDK_SourceCode"
61
62		# from AecPci6_02_CD - called AECINTTC.H but otherwise essentially identical to earlier versions
63		"TestPrograms_WithDLL/DLL_API_INFO"
64		# A zipped development project contains essentially the same, named AEC_NTTC.h so we'll add this in case it's unzipped.
65		"TestPrograms_WithDLL/ZippedDevelopmentProjects/AecMfc32_Rel504"
66
67		# from pc-ltc - called AECINTTC.H and lacks extern "C"
68		"NT-CODE/C40-APP1"
69	)
70	set(ADRIENNE_HEADER_NAMES
71		AEC_NTTC.H
72		AEC_NTTC.h
73		Aec_nttc.h
74		AECINTTC.H)
75
76	set(ADRIENNE_LIB_SEARCH)
77	set(ADRIENNE_DLL_SEARCH)
78
79	if(CMAKE_SIZEOF_VOID_P MATCHES "8")
80		# 64 bit code - apparently initially packaged only in the
81		# PCIe version of their software
82		list(APPEND ADRIENNE_LIB_SEARCH
83			# from AecPCIeTC_8-12a
84			"64BitOS_files/DLL Versions")
85
86		list(APPEND ADRIENNE_DLL_SEARCH
87			# from AecPCIeTC_8-12a
88			"64BitOS_files/DLL Versions")
89	else()
90		# 32-bit code, much more prevalent.
91		list(APPEND ADRIENNE_LIB_SEARCH
92			# from AecPCIeTC_8-12a
93			"32BitOS_files/DLLversions"
94
95			# from AecPci6_02_CD
96			"TestPrograms_WithDLL/DLL_API_INFO"
97
98			# from pc-ltc
99			"NT-CODE/DLL"
100			)
101
102		list(APPEND ADRIENNE_DLL_SEARCH
103			# from AecPCIeTC_8-12a
104			"32BitOS_files/DLLversions"
105
106			# from AecPci6_02_CD
107			"TestPrograms_WithDLL"
108
109			# from pc-ltc
110			"NT-CODE/DLL")
111	endif()
112
113	find_library(ADRIENNE_LIBRARY
114		NAMES
115		AEC_NTTC
116		PATHS
117		"${ADRIENNE_ROOT_DIR}"
118		PATH_SUFFIXES
119		${ADRIENNE_LIB_SEARCH})
120
121	find_path(ADRIENNE_INCLUDE_DIR
122		NAMES
123		${ADRIENNE_HEADER_NAMES}
124		PATHS
125		"${ADRIENNE_ROOT_DIR}"
126		PATH_SUFFIXES
127		${ADRIENNE_INCLUDE_SEARCH})
128
129	if(ADRIENNE_INCLUDE_DIR)
130		find_file(ADRIENNE_INCLUDE_FILE
131			NAMES
132			${ADRIENNE_HEADER_NAMES}
133			HINTS
134			${ADRIENNE_INCLUDE_DIR})
135
136		# Get include filename
137		get_filename_component(ADRIENNE_INCLUDE_FILENAME
138			"${ADRIENNE_INCLUDE_FILE}"
139			NAME)
140		list(APPEND ADRIENNE_DEFINITIONS -DADRIENNE_INCLUDE_FILENAME="ADRIENNE_INCLUDE_FILENAME")
141
142		# Find out if it has extern "C" in it.
143		file(STRINGS "${ADRIENNE_INCLUDE_FILE}" strings)
144		set(ADRIENNE_INCLUDE_HAS_EXTERN_C OFF)
145		foreach(_line ${strings})
146			if("${_line}" STREQUAL "extern \"C\"")
147				set(ADRIENNE_INCLUDE_HAS_EXTERN_C ON)
148				break()
149			endif()
150		endforeach()
151
152		if(ADRIENNE_INCLUDE_HAS_EXTERN_C)
153			list(APPEND ADRIENNE_DEFINITIONS -DADRIENNE_BEFORE_INCLUDE -DADRIENNE_AFTER_INCLUDE)
154		else()
155			list(APPEND ADRIENNE_DEFINITIONS "-DADRIENNE_BEFORE_INCLUDE=extern \"C\" {" "-DADRIENNE_AFTER_INCLUDE=}")
156		endif()
157	endif()
158
159	get_filename_component(_adrienne_libdir "${ADRIENNE_LIBRARY}" PATH)
160	find_file(ADRIENNE_RUNTIME_LIBRARY
161		NAMES
162		AEC_NTTC.dll
163		HINTS
164		"${_adrienne_libdir}"
165		"${_adrienne_libdir}/.."
166		PATHS
167		"${ADRIENNE_ROOT_DIR}"
168		PATH_SUFFIXES
169		${ADRIENNE_DLL_SEARCH})
170
171
172	set(ADRIENNE_RUNTIME_LIBRARIES "${ADRIENNE_RUNTIME_LIBRARY}")
173	get_filename_component(ADRIENNE_RUNTIME_LIBRARY_DIRS
174		"${ADRIENNE_RUNTIME_LIBRARY}"
175		PATH)
176
177	include(FindPackageHandleStandardArgs)
178	find_package_handle_standard_args(Adrienne
179		DEFAULT_MSG
180		ADRIENNE_LIBRARY
181		ADRIENNE_RUNTIME_LIBRARY
182		ADRIENNE_INCLUDE_DIR
183		ADRIENNE_INCLUDE_FILENAME)
184
185	if(ADRIENNE_FOUND)
186		set(ADRIENNE_LIBRARIES "${ADRIENNE_LIBRARY}")
187		set(ADRIENNE_INCLUDE_DIRS "${ADRIENNE_INCLUDE_DIR}")
188		mark_as_advanced(ADRIENNE_ROOT_DIR)
189	endif()
190
191	mark_as_advanced(
192		ADRIENNE_LIBRARY
193		ADRIENNE_RUNTIME_LIBRARY
194		ADRIENNE_INCLUDE_DIR
195		ADRIENNE_INCLUDE_FILE)
196else()
197	set(ADRIENNE_FOUND OFF)
198	set(ADRIENNE_SDK_IS_WINDOWS_ONLY NOTFOUND)
199	find_package_handle_standard_args(Adrienne
200		DEFAULT_MSG
201		ADRIENNE_SDK_IS_WINDOWS_ONLY)
202endif()
203