From 1b38e99ca4781172a67b246958ef45f7d2308bf9 Mon Sep 17 00:00:00 2001 From: Jan Christoph Uhde Date: Mon, 28 May 2018 20:04:43 +0200 Subject: [PATCH 1/2] WIP - some cmake changes --- CMakeLists.txt | 288 +++++++++++++++++++++----------------- src/python/CMakeLists.txt | 19 ++- src/python/coder.i | 2 +- 3 files changed, 176 insertions(+), 133 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 34db59ce..40847da6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,9 @@ -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.10) project(s2-geometry) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) include(CMakeDependentOption) @@ -49,17 +54,17 @@ 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() -add_definitions(-std=c++11) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +#TODO flags should be part of the compile interface - warnings should be only set on the project (example below) +# target_compile_options(s2 PRIVATE $<$:${-Wno-deprecated-declarations})>) if (WIN32) # Use unsigned characters add_definitions(-J) @@ -75,134 +80,147 @@ endif() # 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}) + 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 +) + +target_include_directories(s2 PRIVATE + ${GFLAGS_INCLUDE_DIRS} + ${GLOG_INCLUDE_DIRS} + ${OPENSSL_INCLUDE_DIR} + ${PYTHON_INCLUDE_DIRS} +) # 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) +target_include_directories(s2 PUBLIC src) + +target_link_libraries(s2 + ${GFLAGS_LIBRARIES} + ${GLOG_LIBRARIES} + ${OPENSSL_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) + +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) + + +#TODO cpack # We don't need to install all headers, only those # transitively included by s2 headers we are exporting. @@ -402,6 +420,9 @@ install(FILES src/s2/util/units/length-units.h DESTINATION include/s2/util/units) install(TARGETS s2 DESTINATION lib) + +#TODO TEST THIS -- figure out how this is used exactly -- maybe adopt style +# gtest include path seems to be added globally - maybe this can be fixed message("GTEST_ROOT: ${GTEST_ROOT}") if (GTEST_ROOT) add_subdirectory(${GTEST_ROOT} build_gtest) @@ -506,22 +527,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() +# 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 (BUILD_EXAMPLES) add_subdirectory("doc/examples" examples) endif() -if (${SWIG_FOUND} AND ${PYTHONLIBS_FOUND}) - add_subdirectory("src/python" python) -endif() + +add_subdirectory("src/python" python) 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 From 904502dc3a32df82b1695856ebdc094f1de2c213 Mon Sep 17 00:00:00 2001 From: Jan Christoph Uhde Date: Mon, 28 May 2018 22:01:31 +0200 Subject: [PATCH 2/2] some minor clean up --- CMakeLists.txt | 88 ++++++++++++++++++++----------------- doc/examples/CMakeLists.txt | 10 +++-- 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 40847da6..5973b659 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,32 +3,36 @@ # - 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.10) +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) @@ -56,31 +60,19 @@ find_package(OpenSSL REQUIRED) find_package(Threads REQUIRED) # 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) -#TODO flags should be part of the compile interface - warnings should be only set on the project (example below) -# target_compile_options(s2 PRIVATE $<$:${-Wno-deprecated-declarations})>) -if (WIN32) - # Use unsigned characters - add_definitions(-J) - # Make sure cmath header defines things like M_PI - add_definitions(-D_USE_MATH_DEFINES) - # Make sure Windows doesn't define min/max macros that interfere with STL - add_definitions(-DNOMINMAX) -else() - add_definitions(-Wno-deprecated-declarations) -endif() # 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 @@ -192,6 +184,11 @@ add_library(s2 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} @@ -199,12 +196,6 @@ target_include_directories(s2 PRIVATE ${PYTHON_INCLUDE_DIRS} ) -# 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 src) - target_link_libraries(s2 ${GFLAGS_LIBRARIES} ${GLOG_LIBRARIES} @@ -212,6 +203,18 @@ target_link_libraries(s2 ${CMAKE_THREAD_LIBS_INIT} ) +if (WIN32) + # Use unsigned characters + target_compile_options(s2 PUBLIC -J) + # Make sure cmath header defines things like M_PI + target_compile_definitions(s2 PUBLIC -D_USE_MATH_DEFINES) + # Make sure Windows doesn't define min/max macros that interfere with STL + target_compile_definitions(s2 PUBLIC -DNOMINMAX) +else() + 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 @@ -220,10 +223,15 @@ add_library(s2testing STATIC EXCLUDE_FROM_ALL target_link_libraries(s2testing PRIVATE s2) -#TODO cpack - +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 @@ -421,8 +429,6 @@ install(FILES src/s2/util/units/length-units.h install(TARGETS s2 DESTINATION lib) -#TODO TEST THIS -- figure out how this is used exactly -- maybe adopt style -# gtest include path seems to be added globally - maybe this can be fixed message("GTEST_ROOT: ${GTEST_ROOT}") if (GTEST_ROOT) add_subdirectory(${GTEST_ROOT} build_gtest) @@ -536,7 +542,10 @@ if (GTEST_ROOT) add_executable(${test} ${test_cc}) target_link_libraries( ${test} - s2testing s2 gtest_main) # does gtest_main support targets? / it did not in the past + s2testing + s2 + gtest_main + ) # does gtest_main support targets? / it did not in the past add_test(${test} ${test}) endforeach() endif() @@ -545,9 +554,6 @@ endif() # 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 (BUILD_EXAMPLES) - add_subdirectory("doc/examples" examples) -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()