1- cmake_minimum_required (VERSION 3.1 )
1+ cmake_minimum_required (VERSION 3.5 )
22project (apriltag VERSION 3.3.0 LANGUAGES C CXX)
33
4+ if (MSVC )
5+ add_compile_definitions ("_CRT_SECURE_NO_WARNINGS" )
6+ endif ()
7+
48if (POLICY CMP0077)
59 cmake_policy (SET CMP0077 NEW)
610endif ()
11+
712option (BUILD_SHARED_LIBS "Build shared libraries" ON )
13+ option (BUILD_EXAMPLES "Build example binaries" ON )
814option (ASAN "Use AddressSanitizer for debug builds to detect memory issues" OFF )
915
1016if (ASAN)
@@ -38,150 +44,20 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
3844 set_property (CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo" )
3945endif ()
4046
41- aux_source_directory (common COMMON_SRC)
42- set (APRILTAG_SRCS apriltag.c apriltag_pose.c apriltag_quad_thresh.c)
43-
44- # Library
45- file (GLOB TAG_FILES ${CMAKE_CURRENT_SOURCE_DIR} /tag*.c)
46- add_library (${PROJECT_NAME} ${APRILTAG_SRCS} ${COMMON_SRC} ${TAG_FILES} )
47-
48- if (MSVC )
49- add_compile_definitions ("_CRT_SECURE_NO_WARNINGS" )
50- else ()
51- find_package (Threads REQUIRED)
52- target_link_libraries (${PROJECT_NAME} PUBLIC Threads::Threads m)
53- endif ()
54-
55- set_target_properties (${PROJECT_NAME} PROPERTIES SOVERSION 3 VERSION ${PROJECT_VERSION} )
56- set_target_properties (${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d" )
57-
58- include (GNUInstallDirs)
59- target_include_directories (${PROJECT_NAME} PUBLIC
60- "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} />"
61- "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} >"
62- "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} >/apriltag" )
63-
64-
65- # install header file hierarchy
66- file (GLOB HEADER_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h common/*.h)
67- list (REMOVE_ITEM HEADER_FILES apriltag_detect.docstring.h apriltag_py_type.docstring.h)
68-
69- foreach (HEADER ${HEADER_FILES} )
70- string (REGEX MATCH "(.*)[/\\ ]" DIR ${HEADER} )
71- install (FILES ${HEADER} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /${PROJECT_NAME} /${DIR} )
72- endforeach ()
73-
74- # export library
75- set (generated_dir "${CMAKE_CURRENT_BINARY_DIR} /generated" )
76- set (version_config "${generated_dir} /${PROJECT_NAME} ConfigVersion.cmake" )
77- set (project_config "${generated_dir} /${PROJECT_NAME} Config.cmake" )
78- set (targets_export_name "${PROJECT_NAME} Targets" )
79- set (config_install_dir "share/${PROJECT_NAME} /cmake" )
80-
81- # Include module with fuction 'write_basic_package_version_file'
82- include (CMakePackageConfigHelpers)
83-
84- # Configure '<PROJECT-NAME>Config.cmake'
85- # Use variables:
86- # * targets_export_name
87- # * PROJECT_NAME
88- configure_package_config_file(
89- "CMake/apriltagConfig.cmake.in"
90- "${project_config} "
91- INSTALL_DESTINATION "${config_install_dir} "
92- )
47+ # build main library
48+ add_subdirectory (libs/apriltag)
9349
94- # Configure '<PROJECT-NAME>ConfigVersion.cmake'
95- # Note: PROJECT_VERSION is used as a VERSION
96- write_basic_package_version_file("${version_config} " COMPATIBILITY SameMajorVersion)
97-
98-
99- # install library
100- install (TARGETS ${PROJECT_NAME} EXPORT ${targets_export_name}
101- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
102- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
103- )
104-
105- install (EXPORT ${targets_export_name}
106- NAMESPACE apriltag::
107- DESTINATION ${config_install_dir} )
108-
109- install (FILES ${project_config} ${version_config} DESTINATION ${config_install_dir} )
110-
111- export (TARGETS apriltag
112- NAMESPACE apriltag::
113- FILE ${generated_dir} /${targets_export_name} .cmake)
114-
115-
116- # install pkgconfig file
117- configure_file (${PROJECT_NAME} .pc.in ${PROJECT_NAME} .pc @ONLY)
118- install (FILES "${CMAKE_BINARY_DIR} /${PROJECT_NAME} .pc"
119- DESTINATION "${CMAKE_INSTALL_LIBDIR} /pkgconfig" )
120-
121-
122- # Python wrapper
50+ ## Python wrapper
12351include (CMakeDependentOption)
12452cmake_dependent_option(BUILD_PYTHON_WRAPPER "Builds Python wrapper" ON BUILD_SHARED_LIBS OFF )
12553
12654if (BUILD_PYTHON_WRAPPER)
127- SET (Python_ADDITIONAL_VERSIONS 3)
128- find_package (PythonLibs)
129- execute_process (COMMAND which python3 OUTPUT_QUIET RESULT_VARIABLE Python3_NOT_FOUND)
130- execute_process (COMMAND python3 -c "import numpy" RESULT_VARIABLE Numpy_NOT_FOUND)
131- endif (BUILD_PYTHON_WRAPPER)
132-
133- if (NOT Python3_NOT_FOUND AND NOT Numpy_NOT_FOUND AND PYTHONLIBS_FOUND AND BUILD_PYTHON_WRAPPER)
134- # TODO deal with both python2/3
135- execute_process (COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR} /python_build_flags.py OUTPUT_VARIABLE PY_OUT)
136- set (PY_VARS CFLAGS LDFLAGS LINKER EXT_SUFFIX)
137- cmake_parse_arguments (PY "" "${PY_VARS} " "" ${PY_OUT} )
138- separate_arguments (PY_CFLAGS)
139- list (REMOVE_ITEM PY_CFLAGS -flto)
140- separate_arguments (PY_LDFLAGS)
141-
142- foreach (X detect py_type)
143- add_custom_command (OUTPUT ${PROJECT_BINARY_DIR} /apriltag_${X} .docstring.h
144- COMMAND < ${CMAKE_CURRENT_SOURCE_DIR} /apriltag_${X} .docstring sed 's/\"/\\\\\"/g\; s/^/\"/\; s/$$/\\\\n\"/\;' > apriltag_${X} .docstring.h
145- WORKING_DIRECTORY ${PROJECT_BINARY_DIR} )
146- endforeach ()
147-
148- add_custom_command (OUTPUT apriltag_pywrap.o
149- COMMAND ${CMAKE_C_COMPILER} ${PY_CFLAGS} -I${PROJECT_BINARY_DIR} -c -o apriltag_pywrap.o ${CMAKE_CURRENT_SOURCE_DIR} /apriltag_pywrap.c
150- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} /apriltag_pywrap.c ${PROJECT_BINARY_DIR} /apriltag_detect.docstring.h ${PROJECT_BINARY_DIR} /apriltag_py_type.docstring.h)
151- add_custom_command (OUTPUT apriltag${PY_EXT_SUFFIX}
152- COMMAND ${PY_LINKER} ${PY_LDFLAGS} -Wl,-rpath,lib apriltag_pywrap.o $<TARGET_FILE:apriltag> -o apriltag${PY_EXT_SUFFIX}
153- DEPENDS ${PROJECT_NAME} apriltag_pywrap.o)
154- add_custom_target (apriltag_python ALL
155- DEPENDS apriltag${PY_EXT_SUFFIX} )
156-
157- execute_process (COMMAND python3 -m site --user-site OUTPUT_VARIABLE PY_DEST)
158- string (STRIP ${PY_DEST} PY_DEST)
159- install (FILES ${PROJECT_BINARY_DIR} /apriltag${PY_EXT_SUFFIX} DESTINATION ${PY_DEST} )
160- endif (NOT Python3_NOT_FOUND AND NOT Numpy_NOT_FOUND AND PYTHONLIBS_FOUND AND BUILD_PYTHON_WRAPPER)
55+ # build python wrapper
56+ add_subdirectory (libs/apriltag_python)
57+ endif ()
16158
16259# Examples
163- # apriltag_demo
164- add_executable (apriltag_demo example/apriltag_demo.c)
165- target_link_libraries (apriltag_demo ${PROJECT_NAME} )
166-
167- # opencv_demo
168- set (_OpenCV_REQUIRED_COMPONENTS core imgproc videoio highgui)
169- find_package (OpenCV COMPONENTS ${_OpenCV_REQUIRED_COMPONENTS} QUIET CONFIG)
170- if (OpenCV_FOUND)
171- # NB: contrib required for TickMeter in OpenCV 2.4. This is only required for 16.04 backwards compatibility and can be removed in the future.
172- # If we add it to the find_package initially, the demo won't build for newer OpenCV versions
173- if (OpenCV_VERSION VERSION_LESS "3.0.0" )
174- list (APPEND _OpenCV_REQUIRED_COMPONENTS contrib)
175- find_package (OpenCV COMPONENTS ${_OpenCV_REQUIRED_COMPONENTS} CONFIG)
176- endif ()
177-
178- add_executable (opencv_demo example/opencv_demo.cc)
179- target_link_libraries (opencv_demo apriltag ${OpenCV_LIBRARIES} )
180- set_target_properties (opencv_demo PROPERTIES CXX_STANDARD 11)
181- install (TARGETS opencv_demo RUNTIME DESTINATION bin)
182- else ()
183- message (STATUS "OpenCV not found: Not building demo" )
184- endif (OpenCV_FOUND)
185-
186- # install example programs
187- install (TARGETS apriltag_demo RUNTIME DESTINATION bin)
60+ if (BUILD_EXAMPLES)
61+ # build examples
62+ add_subdirectory (example)
63+ endif ()
0 commit comments