diff --git a/CMakeLists.txt b/CMakeLists.txt index 34db59ce..5973b659 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,29 +1,38 @@ -cmake_minimum_required(VERSION 2.8.12) +#TODO +# - fix / modernize cmake +# - lower cmake version a bit ~3.7 to support older systems +# - fix abseil warnings or try to use SYSTEM / -isystem includes + +cmake_minimum_required(VERSION 3.8) project(s2-geometry) + +#produces compile_command.json set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +#not used? +#list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/third_party/cmake") +#include(CheckCXXCompilerFlag) +#include(FindPackageHandleStandardArgs) + +## set options include(CMakeDependentOption) -include(CheckCXXCompilerFlag) include(FeatureSummary) -include(FindPackageHandleStandardArgs) - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/third_party/cmake") option(WITH_GFLAGS "Use gflags to change command line flags." OFF) -add_feature_info(GFLAGS WITH_GFLAGS - "allows changing command line flags.") +add_feature_info(GFLAGS WITH_GFLAGS "allows changing command line flags.") # glog option can only be turned on if gflags is on. -cmake_dependent_option(WITH_GLOG "Use glog for logging." ON - "WITH_GFLAGS" OFF) +cmake_dependent_option(WITH_GLOG "Use glog for logging." ON "WITH_GFLAGS" OFF) add_feature_info(GLOG WITH_GLOG "provides logging configurability.") option(BUILD_SHARED_LIBS "Build shared libraries instead of static." ON) -add_feature_info(SHARED_LIBS BUILD_SHARED_LIBS - "builds shared libraries instead of static.") +add_feature_info(SHARED_LIBS BUILD_SHARED_LIBS "builds shared libraries instead of static.") option(BUILD_EXAMPLES "Build s2 documentation examples." ON) feature_summary(WHAT ALL) +## set options - end + if (WITH_GLOG) find_package(Glog REQUIRED) @@ -49,163 +58,180 @@ endif() find_package(OpenSSL REQUIRED) # pthreads isn't used directly, but this is still required for std::thread. find_package(Threads REQUIRED) -find_package(SWIG) -find_package(PythonInterp) -find_package(PythonLibs) # Avoid "Policy CMP0042 is not set" warning on macOS. -if (APPLE) - set(CMAKE_MACOSX_RPATH TRUE) -endif() +# NOTE -- does not harm on other platforms +set(CMAKE_MACOSX_RPATH TRUE) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) -add_definitions(-std=c++11) + + +# If OpenSSL is installed in a non-standard location, configure with +# something like: +# OPENSSL_ROOT_DIR=/usr/local/opt/openssl cmake .. + +## s2 definition +add_library(s2 + src/s2/base/stringprintf.cc + src/s2/base/strtoint.cc + src/s2/base/sysinfo.cc + src/s2/encoded_s2cell_id_vector.cc + src/s2/encoded_s2point_vector.cc + src/s2/encoded_s2shape_index.cc + src/s2/encoded_string_vector.cc + src/s2/id_set_lexicon.cc + src/s2/mutable_s2shape_index.cc + src/s2/r2rect.cc + src/s2/s1angle.cc + src/s2/s1chord_angle.cc + src/s2/s1interval.cc + src/s2/s2boolean_operation.cc + src/s2/s2builder.cc + src/s2/s2builder_graph.cc + src/s2/s2builderutil_closed_set_normalizer.cc + src/s2/s2builderutil_find_polygon_degeneracies.cc + src/s2/s2builderutil_s2point_vector_layer.cc + src/s2/s2builderutil_s2polygon_layer.cc + src/s2/s2builderutil_s2polyline_layer.cc + src/s2/s2builderutil_s2polyline_vector_layer.cc + src/s2/s2builderutil_snap_functions.cc + src/s2/s2cap.cc + src/s2/s2cell.cc + src/s2/s2cell_id.cc + src/s2/s2cell_index.cc + src/s2/s2cell_union.cc + src/s2/s2centroids.cc + src/s2/s2closest_cell_query.cc + src/s2/s2closest_edge_query.cc + src/s2/s2closest_point_query.cc + src/s2/s2contains_vertex_query.cc + src/s2/s2convex_hull_query.cc + src/s2/s2coords.cc + src/s2/s2crossing_edge_query.cc + src/s2/s2debug.cc + src/s2/s2earth.cc + src/s2/s2edge_clipping.cc + src/s2/s2edge_crosser.cc + src/s2/s2edge_crossings.cc + src/s2/s2edge_distances.cc + src/s2/s2edge_tessellator.cc + src/s2/s2error.cc + src/s2/s2furthest_edge_query.cc + src/s2/s2latlng.cc + src/s2/s2latlng_rect.cc + src/s2/s2latlng_rect_bounder.cc + src/s2/s2lax_loop_shape.cc + src/s2/s2lax_polygon_shape.cc + src/s2/s2lax_polyline_shape.cc + src/s2/s2loop.cc + src/s2/s2loop_measures.cc + src/s2/s2measures.cc + src/s2/s2metrics.cc + src/s2/s2max_distance_targets.cc + src/s2/s2min_distance_targets.cc + src/s2/s2padded_cell.cc + src/s2/s2point_compression.cc + src/s2/s2point_region.cc + src/s2/s2pointutil.cc + src/s2/s2polygon.cc + src/s2/s2polyline.cc + src/s2/s2polyline_alignment.cc + src/s2/s2polyline_measures.cc + src/s2/s2polyline_simplifier.cc + src/s2/s2predicates.cc + src/s2/s2projections.cc + src/s2/s2r2rect.cc + src/s2/s2region.cc + src/s2/s2region_term_indexer.cc + src/s2/s2region_coverer.cc + src/s2/s2region_intersection.cc + src/s2/s2region_union.cc + src/s2/s2shape_index.cc + src/s2/s2shape_index_buffered_region.cc + src/s2/s2shape_index_measures.cc + src/s2/s2shape_measures.cc + src/s2/s2shapeutil_build_polygon_boundaries.cc + src/s2/s2shapeutil_coding.cc + src/s2/s2shapeutil_contains_brute_force.cc + src/s2/s2shapeutil_edge_iterator.cc + src/s2/s2shapeutil_get_reference_point.cc + src/s2/s2shapeutil_range_iterator.cc + src/s2/s2shapeutil_visit_crossing_edge_pairs.cc + src/s2/s2text_format.cc + src/s2/s2wedge_relations.cc + src/s2/strings/ostringstream.cc + src/s2/strings/serialize.cc + src/s2/third_party/absl/base/dynamic_annotations.cc + src/s2/third_party/absl/base/internal/raw_logging.cc + src/s2/third_party/absl/base/internal/throw_delegate.cc + src/s2/third_party/absl/numeric/int128.cc + src/s2/third_party/absl/strings/ascii.cc + src/s2/third_party/absl/strings/match.cc + src/s2/third_party/absl/strings/numbers.cc + src/s2/third_party/absl/strings/str_cat.cc + src/s2/third_party/absl/strings/str_split.cc + src/s2/third_party/absl/strings/string_view.cc + src/s2/third_party/absl/strings/strip.cc + src/s2/third_party/absl/strings/internal/memutil.cc + src/s2/util/bits/bit-interleave.cc + src/s2/util/bits/bits.cc + src/s2/util/coding/coder.cc + src/s2/util/coding/varint.cc + src/s2/util/math/exactfloat/exactfloat.cc + src/s2/util/math/mathutil.cc + src/s2/util/units/length-units.cc +) + +# the target system allows for easier inclusion in other projects +# add_subdirectory() +# target_link_libraries( PRIVATE s2) + +target_include_directories(s2 PUBLIC src) +target_include_directories(s2 PRIVATE + ${GFLAGS_INCLUDE_DIRS} + ${GLOG_INCLUDE_DIRS} + ${OPENSSL_INCLUDE_DIR} + ${PYTHON_INCLUDE_DIRS} +) + +target_link_libraries(s2 + ${GFLAGS_LIBRARIES} + ${GLOG_LIBRARIES} + ${OPENSSL_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) if (WIN32) # Use unsigned characters - add_definitions(-J) + target_compile_options(s2 PUBLIC -J) # Make sure cmath header defines things like M_PI - add_definitions(-D_USE_MATH_DEFINES) + target_compile_definitions(s2 PUBLIC -D_USE_MATH_DEFINES) # Make sure Windows doesn't define min/max macros that interfere with STL - add_definitions(-DNOMINMAX) + target_compile_definitions(s2 PUBLIC -DNOMINMAX) else() - add_definitions(-Wno-deprecated-declarations) + target_compile_options(s2 PRIVATE $<$:${-Wno-deprecated-declarations}>) endif() +## s2testing definition +add_library(s2testing STATIC EXCLUDE_FROM_ALL + src/s2/s2builderutil_testing.cc + src/s2/s2shapeutil_testing.cc + src/s2/s2testing.cc +) +target_link_libraries(s2testing PRIVATE s2) -# If OpenSSL is installed in a non-standard location, configure with -# something like: -# OPENSSL_ROOT_DIR=/usr/local/opt/openssl cmake .. -include_directories( - ${GFLAGS_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR} - ${PYTHON_INCLUDE_DIRS}) -include_directories(src) - -add_library(s2 - src/s2/base/stringprintf.cc - src/s2/base/strtoint.cc - src/s2/base/sysinfo.cc - src/s2/encoded_s2cell_id_vector.cc - src/s2/encoded_s2point_vector.cc - src/s2/encoded_s2shape_index.cc - src/s2/encoded_string_vector.cc - src/s2/id_set_lexicon.cc - src/s2/mutable_s2shape_index.cc - src/s2/r2rect.cc - src/s2/s1angle.cc - src/s2/s1chord_angle.cc - src/s2/s1interval.cc - src/s2/s2boolean_operation.cc - src/s2/s2builder.cc - src/s2/s2builder_graph.cc - src/s2/s2builderutil_closed_set_normalizer.cc - src/s2/s2builderutil_find_polygon_degeneracies.cc - src/s2/s2builderutil_s2point_vector_layer.cc - src/s2/s2builderutil_s2polygon_layer.cc - src/s2/s2builderutil_s2polyline_layer.cc - src/s2/s2builderutil_s2polyline_vector_layer.cc - src/s2/s2builderutil_snap_functions.cc - src/s2/s2cap.cc - src/s2/s2cell.cc - src/s2/s2cell_id.cc - src/s2/s2cell_index.cc - src/s2/s2cell_union.cc - src/s2/s2centroids.cc - src/s2/s2closest_cell_query.cc - src/s2/s2closest_edge_query.cc - src/s2/s2closest_point_query.cc - src/s2/s2contains_vertex_query.cc - src/s2/s2convex_hull_query.cc - src/s2/s2coords.cc - src/s2/s2crossing_edge_query.cc - src/s2/s2debug.cc - src/s2/s2earth.cc - src/s2/s2edge_clipping.cc - src/s2/s2edge_crosser.cc - src/s2/s2edge_crossings.cc - src/s2/s2edge_distances.cc - src/s2/s2edge_tessellator.cc - src/s2/s2error.cc - src/s2/s2furthest_edge_query.cc - src/s2/s2latlng.cc - src/s2/s2latlng_rect.cc - src/s2/s2latlng_rect_bounder.cc - src/s2/s2lax_loop_shape.cc - src/s2/s2lax_polygon_shape.cc - src/s2/s2lax_polyline_shape.cc - src/s2/s2loop.cc - src/s2/s2loop_measures.cc - src/s2/s2measures.cc - src/s2/s2metrics.cc - src/s2/s2max_distance_targets.cc - src/s2/s2min_distance_targets.cc - src/s2/s2padded_cell.cc - src/s2/s2point_compression.cc - src/s2/s2point_region.cc - src/s2/s2pointutil.cc - src/s2/s2polygon.cc - src/s2/s2polyline.cc - src/s2/s2polyline_alignment.cc - src/s2/s2polyline_measures.cc - src/s2/s2polyline_simplifier.cc - src/s2/s2predicates.cc - src/s2/s2projections.cc - src/s2/s2r2rect.cc - src/s2/s2region.cc - src/s2/s2region_term_indexer.cc - src/s2/s2region_coverer.cc - src/s2/s2region_intersection.cc - src/s2/s2region_union.cc - src/s2/s2shape_index.cc - src/s2/s2shape_index_buffered_region.cc - src/s2/s2shape_index_measures.cc - src/s2/s2shape_measures.cc - src/s2/s2shapeutil_build_polygon_boundaries.cc - src/s2/s2shapeutil_coding.cc - src/s2/s2shapeutil_contains_brute_force.cc - src/s2/s2shapeutil_edge_iterator.cc - src/s2/s2shapeutil_get_reference_point.cc - src/s2/s2shapeutil_range_iterator.cc - src/s2/s2shapeutil_visit_crossing_edge_pairs.cc - src/s2/s2text_format.cc - src/s2/s2wedge_relations.cc - src/s2/strings/ostringstream.cc - src/s2/strings/serialize.cc - src/s2/third_party/absl/base/dynamic_annotations.cc - src/s2/third_party/absl/base/internal/raw_logging.cc - src/s2/third_party/absl/base/internal/throw_delegate.cc - src/s2/third_party/absl/numeric/int128.cc - src/s2/third_party/absl/strings/ascii.cc - src/s2/third_party/absl/strings/match.cc - src/s2/third_party/absl/strings/numbers.cc - src/s2/third_party/absl/strings/str_cat.cc - src/s2/third_party/absl/strings/str_split.cc - src/s2/third_party/absl/strings/string_view.cc - src/s2/third_party/absl/strings/strip.cc - src/s2/third_party/absl/strings/internal/memutil.cc - src/s2/util/bits/bit-interleave.cc - src/s2/util/bits/bits.cc - src/s2/util/coding/coder.cc - src/s2/util/coding/varint.cc - src/s2/util/math/exactfloat/exactfloat.cc - src/s2/util/math/mathutil.cc - src/s2/util/units/length-units.cc) -add_library(s2testing STATIC - src/s2/s2builderutil_testing.cc - src/s2/s2shapeutil_testing.cc - src/s2/s2testing.cc) -target_link_libraries( - s2 - ${GFLAGS_LIBRARIES} ${GLOG_LIBRARIES} ${OPENSSL_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT}) - -# Allow other CMake projects to use this one with: -# list(APPEND CMAKE_MODULE_PATH "/third_party/cmake") -# add_subdirectory( s2geometry) -# target_link_libraries( s2) -target_include_directories(s2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) +include(CPack) # We don't need to install all headers, only those # transitively included by s2 headers we are exporting. + +# TODO +# - exported headers should be in a different directory than the rest +# Maintaining the lists looks tedious. +# - move lists to different file first +# Dependencies should use sane CMake as well to make this nice! install(FILES src/s2/_fp_contract_off.h src/s2/encoded_s2cell_id_vector.h src/s2/encoded_s2point_vector.h @@ -402,6 +428,7 @@ install(FILES src/s2/util/units/length-units.h DESTINATION include/s2/util/units) install(TARGETS s2 DESTINATION lib) + message("GTEST_ROOT: ${GTEST_ROOT}") if (GTEST_ROOT) add_subdirectory(${GTEST_ROOT} build_gtest) @@ -506,22 +533,27 @@ if (GTEST_ROOT) src/s2/sequence_lexicon_test.cc src/s2/value_lexicon_test.cc) - enable_testing() + # LOOKS LIKE EVERY TU gets its own binary + # WHY? Parallel tests? how long do they run? + enable_testing() foreach (test_cc ${S2TestFiles}) get_filename_component(test ${test_cc} NAME_WE) add_executable(${test} ${test_cc}) target_link_libraries( ${test} - s2testing s2 gtest_main) + s2testing + s2 + gtest_main + ) # does gtest_main support targets? / it did not in the past add_test(${test} ${test}) endforeach() endif() -if (BUILD_EXAMPLES) - add_subdirectory("doc/examples" examples) -endif() +# TODO Set EXCLUDE_FROM_ALL FOR EXAMPLES and show how to use it: +# add_subdirectory(path/to/s2 EXCLUDE_FROM_ALL) +# will only build required targets and not tests and documenation +# if they are excluded form default targets. -if (${SWIG_FOUND} AND ${PYTHONLIBS_FOUND}) - add_subdirectory("src/python" python) -endif() +add_subdirectory("doc/examples" examples) +add_subdirectory("src/python" python) diff --git a/doc/examples/CMakeLists.txt b/doc/examples/CMakeLists.txt index d5858e01..2ac7f378 100644 --- a/doc/examples/CMakeLists.txt +++ b/doc/examples/CMakeLists.txt @@ -1,4 +1,6 @@ -add_executable(point_index point_index.cc) -target_link_libraries(point_index LINK_PUBLIC s2testing s2) -add_executable(term_index term_index.cc) -target_link_libraries(term_index LINK_PUBLIC s2testing s2) +if (BUILD_EXAMPLES) + add_executable(point_index point_index.cc) + target_link_libraries(point_index PUBLIC s2testing s2) + add_executable(term_index term_index.cc) + target_link_libraries(term_index PUBLIC s2testing s2) +endif() diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt index f06de6c5..2262b2f0 100644 --- a/src/python/CMakeLists.txt +++ b/src/python/CMakeLists.txt @@ -1,16 +1,33 @@ +find_package(SWIG) +find_package(PythonInterp) +find_package(PythonLibs) + +if (${SWIG_FOUND} AND ${PYTHONLIBS_FOUND}) + include(${SWIG_USE_FILE}) -include_directories(${PYTHON_INCLUDE_PATH}) + +#set include for swig +get_property(S2_INCLUDES TARGET s2 PROPERTY INTERFACE_INCLUDE_DIRECTORIES) #FIXME +include_directories(${PYTHON_INCLUDE_PATH} ${S2_INCLUDES}) + +#lib definition set(CMAKE_SWIG_FLAGS "") set_property(SOURCE s2.i PROPERTY SWIG_FLAGS "-module" "pywraps2") set_property(SOURCE s2.i PROPERTY CPLUSPLUS ON) swig_add_module(pywraps2 python s2.i) swig_link_libraries(pywraps2 ${PYTHON_LIBRARIES} s2) + +#testing enable_testing() add_test(NAME pywraps2_test COMMAND ${PYTHON_EXECUTABLE} "${PROJECT_SOURCE_DIR}/src/python/pywraps2_test.py") set_property(TEST pywraps2_test PROPERTY ENVIRONMENT "PYTHONPATH=$ENV{PYTHONPATH}:${PROJECT_BINARY_DIR}/python") + +#install install(TARGETS _pywraps2 DESTINATION share/python) install(FILES "${PROJECT_BINARY_DIR}/python/pywraps2.py" DESTINATION share/python) + +endif() diff --git a/src/python/coder.i b/src/python/coder.i index acd710db..19f14b14 100644 --- a/src/python/coder.i +++ b/src/python/coder.i @@ -120,6 +120,6 @@ %unignore Encoder::putfloat(float); %unignore Encoder::reset(void *, size_t); -%include "s2/util/coding/coder.h" +%include %unignoreall