forked from jedbrown/cmake-modules
-
Notifications
You must be signed in to change notification settings - Fork 0
/
FindITAPS.cmake
187 lines (172 loc) · 7.34 KB
/
FindITAPS.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# - Try to find ITAPS
#
# This will define
#
# ITAPS_FOUND - Requested components were found
# ITAPS_INCLUDES - Includes for all available components
# ITAPS_LIBRARIES - Libraries for all available components
#
# ITAPS_MESH_FOUND - System has iMesh
# ITAPS_MESH_INCLUDES - The iMesh include directory
# ITAPS_MESH_LIBRARIES - Link these to use iMesh
#
# ITAPS_GEOM_FOUND - System has iGeom
# ITAPS_GEOM_INCLUDES - The iGeom include directory
# ITAPS_GEOM_LIBRARIES - Link these to use iGeom
#
# ITAPS_REL_FOUND - System has iRel
# ITAPS_REL_INCLUDES - The iRel include directory
# ITAPS_REL_LIBRARIES - Link these to use iRel
#
# Setting this changes the behavior of the search
# ITAPS_MESH_DEFS_FILE - path to iMesh-Defs.inc
# ITAPS_GEOM_DEFS_FILE - path to iGeom-Defs.inc
# ITAPS_REL_DEFS_FILE - path to iRel-Defs.inc
#
# If any of these variables are in your environment, they will be used as hints
# IMESH_DIR - directory in which iMesh resides
# IGEOM_DIR - directory in which iGeom resides
# IREL_DIR - directory in which iRel resides
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
#
include (FindPackageMultipass)
include (ResolveCompilerPaths)
include (CheckCSourceRuns)
include (FindPackageHandleStandardArgs)
find_program (MAKE_EXECUTABLE NAMES make gmake)
macro (ITAPS_PREPARE_COMPONENT component name)
find_file (ITAPS_${component}_DEFS_FILE ${name}-Defs.inc
HINTS ENV I${component}_DIR
PATH_SUFFIXES lib64 lib)
# If ITAPS_XXX_DEFS_FILE has changed, the library will be found again
find_package_multipass (ITAPS_${component} itaps_${component}_config_current
STATES DEFS_FILE
DEPENDENTS INCLUDES LIBRARIES EXECUTABLE_RUNS)
endmacro ()
macro (ITAPS_GET_VARIABLE makefile name var)
set (${var} "NOTFOUND" CACHE INTERNAL "Cleared" FORCE)
execute_process (COMMAND ${MAKE_EXECUTABLE} -f ${${makefile}} show VARIABLE=${name}
OUTPUT_VARIABLE ${var}
RESULT_VARIABLE itaps_return)
endmacro (ITAPS_GET_VARIABLE)
macro (ITAPS_TEST_RUNS component name includes libraries program runs)
# message (STATUS "Starting run test: ${includes} ${libraries} ${runs}")
multipass_c_source_runs ("${includes}" "${libraries}" "${program}" ${runs})
if (NOT ITAPS_${component}_EXECUTABLE_RUNS)
set (ITAPS_${component}_EXECUTABLE_RUNS "${${runs}}" CACHE BOOL
"Can the system successfully run an ${name} executable? This variable can be manually set to \"YES\" to force CMake to accept a given configuration, but this will almost always result in a broken build." FORCE)
endif ()
endmacro (ITAPS_TEST_RUNS)
macro (ITAPS_REQUIRED_LIBS component name includes libraries_all program libraries_required)
# message (STATUS "trying program: ${program}")
resolve_libraries (_all_libraries "${libraries_all}")
list (GET _all_libraries 0 _first_library)
itaps_test_runs (${component} ${name} "${includes}" "${_first_library};${itaps_rel_libs}" "${program}" ${name}_works_minimal)
if (${name}_works_minimal)
set (${libraries_required} "${_first_library}")
message (STATUS "${name} executable works when only linking to the interface lib, this probably means you have shared libs.")
else ()
itaps_test_runs (${component} ${name} "${includes}" "${_all_libraries};${itaps_rel_libs}" "${itaps_mesh_program}" ${name}_works_extra)
if (${name}_works_extra)
set (${libraries_required} "${_all_libraries}")
message (STATUS "${name} executable requires linking to extra libs, this probably means it's statically linked.")
else ()
message (STATUS "${name} could not be used, maybe the install is broken.")
endif ()
endif ()
endmacro ()
macro (ITAPS_HANDLE_COMPONENT component name program)
itaps_prepare_component ("${component}" "${name}")
if (ITAPS_${component}_DEFS_FILE AND NOT itaps_${component}_config_current)
# A temporary makefile to probe this ITAPS components's configuration
set (itaps_config_makefile "${PROJECT_BINARY_DIR}/Makefile.${name}")
file (WRITE ${itaps_config_makefile}
"## This file was autogenerated by FindITAPS.cmake
include ${ITAPS_${component}_DEFS_FILE}
show :
\t-@echo -n \${\${VARIABLE}}")
itaps_get_variable (itaps_config_makefile I${component}_INCLUDEDIR itaps_includedir)
itaps_get_variable (itaps_config_makefile I${component}_LIBS itaps_libs)
file (REMOVE ${itaps_config_makefile})
find_path (itaps_include_tmp ${name}.h HINTS ${itaps_includedir} NO_DEFAULT_PATH)
set (ITAPS_${component}_INCLUDES "${itaps_include_tmp}" CACHE STRING "Include directories for ${name}")
set (itaps_include_tmp "NOTFOUND" CACHE INTERNAL "Cleared" FORCE)
itaps_required_libs ("${component}" "${name}" "${ITAPS_${component}_INCLUDES}" "${itaps_libs}" "${program}" itaps_${component}_required_libraries)
set (ITAPS_${component}_LIBRARIES "${itaps_${component}_required_libraries}" CACHE STRING "Libraries for ${name}")
mark_as_advanced (ITAPS_${component}_EXECUTABLE_RUNS ITAPS_${component}_LIBRARIES)
endif()
set (ITAPS_${component}_FOUND "${ITAPS_${component}_EXECUTABLE_RUNS}")
endmacro()
itaps_handle_component (MESH iMesh "
/* iMesh test program */
#include <iMesh.h>
#define CHK(err) if (err) return 1
int main(int argc,char *argv[]) {
int err;
iMesh_Instance m;
iMesh_newMesh(\"\",&m,&err,0);CHK(err);
iMesh_dtor(m,&err);CHK(err);
return 0;
}
")
find_path (imesh_include_tmp iMeshP.h HINTS ${ITAPS_MESH_INCLUDES} NO_DEFAULT_PATH)
if (imesh_include_tmp)
set (ITAPS_MESH_HAS_PARALLEL "YES")
else ()
set (ITAPS_MESH_HAS_PARALLEL "NO")
endif ()
set (imesh_include_tmp "NOTFOUND" CACHE INTERNAL "Cleared" FORCE)
set (itaps_rel_libs) # Extra libraries which should only be set when linking with iRel
itaps_handle_component (GEOM iGeom "
/* iGeom test program */
#include <iGeom.h>
#define CHK(err) if (err) return 1
int main() {
int ierr;
iGeom_Instance g;
iGeom_newGeom(\"\",&g,&ierr,0);CHK(ierr);
iGeom_dtor(g,&ierr);CHK(ierr);
return 0;
}
")
if (ITAPS_MESH_FOUND AND ITAPS_GEOM_FOUND) # iRel only makes sense if iMesh and iGeom are found
set (itaps_rel_libs "${ITAPS_MESH_LIBRARIES}" "${ITAPS_GEOM_LIBRARIES}")
itaps_handle_component (REL iRel "
/* iRel test program */
#include <iRel.h>
#define CHK(err) if (err) return 1
int main() {
int ierr;
iRel_Instance rel;
iRel_create(\"\",&rel,&ierr,0);CHK(ierr);
iRel_destroy(rel,&ierr);CHK(ierr);
return 0;
}
")
endif ()
set (ITAPS_INCLUDES)
set (ITAPS_LIBRARIES)
foreach (component REL GEOM MESH)
if (ITAPS_${component}_INCLUDES)
list (APPEND ITAPS_INCLUDES "${ITAPS_${component}_INCLUDES}")
endif ()
if (ITAPS_${component}_LIBRARIES)
list (APPEND ITAPS_LIBRARIES "${ITAPS_${component}_LIBRARIES}")
endif ()
message (STATUS "ITAPS_${component}: ${ITAPS_${component}_INCLUDES} ${ITAPS_${component}_LIBRARIES}")
endforeach()
list (REMOVE_DUPLICATES ITAPS_INCLUDES)
list (REMOVE_DUPLICATES ITAPS_LIBRARIES)
set (ITAPS_FOUND_REQUIRED_COMPONENTS YES)
if (ITAPS_FIND_REQUIRED)
foreach (component ${ITAPS_FIND_COMPONENTS})
if (NOT ITAPS_${component}_FOUND)
set (ITAPS_FOUND_REQUIRED_COMPONENTS NOTFOUND)
endif()
endforeach()
endif()
message (STATUS "ITAPS: ${ITAPS_INCLUDES} ${ITAPS_LIBRARIES}")
find_package_handle_standard_args (ITAPS "ITAPS not found, check environment variables I{MESH,GEOM,REL}_DIR"
ITAPS_INCLUDES ITAPS_LIBRARIES ITAPS_FOUND_REQUIRED_COMPONENTS)