diff options
36 files changed, 391 insertions, 209 deletions
diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..04c6da65 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.git +build diff --git a/.travis.yml b/.travis.yml index 4f15edd4..8ebf6127 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,17 +29,24 @@ matrix: services: - docker env: - - BUILD_NAME=linux_gcc7 - - DETAILS="linux, gcc7" - - CC=gcc-7 - - CXX=g++-7 - - CXXFLAGS='-g -D_GLIBCXX_ASSERTIONS' + - BUILD_NAME=linux_gcc8 + - DETAILS="linux, gcc8, i386" + - ARCH=i386 + - CC=gcc-8 + - CXX=g++-8 + - CXXFLAGS='-g -O2 -m32 -D_GLIBCXX_ASSERTIONS' + - CFLAGS='-g -O2 -m32' + - TIFF_CFLAGS=-I/usr/include/i386-linux-gnu + - TIFF_LIBS="-L/usr/lib/i386-linux-gnu -ltiff" + - SQLITE3_CFLAGS=-I/usr/include/i386-linux-gnu + - SQLITE3_LIBS="-L/usr/lib/i386-linux-gnu -lsqlite3" + - SKIP_BUILDS_WITHOUT_GRID=yes addons: apt: sources: - ubuntu-toolchain-r-test packages: - - g++-7 + - g++-8-multilib - make - autoconf - automake @@ -5,21 +5,22 @@ FROM ubuntu:18.04 as builder MAINTAINER Howard Butler <howard@hobu.co> -ARG PROJ_VERSION=master ARG DESTDIR="/build" # Setup build env RUN apt-get update -y \ && apt-get install -y --fix-missing --no-install-recommends \ software-properties-common build-essential ca-certificates \ - git make cmake wget unzip libtool automake \ - zlib1g-dev libsqlite3-dev pkg-config sqlite3 + make cmake wget unzip libtool automake \ + zlib1g-dev libsqlite3-dev pkg-config sqlite3 libcurl4-gnutls-dev \ + libtiff5-dev -RUN git clone https://github.com/OSGeo/PROJ.git \ - && cd PROJ \ +COPY . /PROJ + +RUN cd /PROJ \ && ./autogen.sh \ && ./configure --prefix=/usr \ - && make \ + && make -j$(nproc) \ && make install @@ -31,18 +32,17 @@ RUN date RUN apt-get update; \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ - libsqlite3-0 \ - curl unzip + libsqlite3-0 libtiff5 libcurl4 libcurl3-gnutls \ + wget ca-certificates # Put this first as this is rarely changing RUN \ mkdir -p /usr/share/proj; \ - curl -LOs https://download.osgeo.org/proj/proj-datumgrid-1.8.zip && unzip -j -u -o proj-datumgrid-1.8.zip -d /usr/share/proj; \ - curl -LOs https://download.osgeo.org/proj/proj-datumgrid-europe-1.2.zip && unzip -j -u -o proj-datumgrid-europe-1.2.zip -d /usr/share/proj; \ - curl -LOs https://download.osgeo.org/proj/proj-datumgrid-oceania-1.0.zip && unzip -j -u -o proj-datumgrid-oceania-1.0.zip -d /usr/share/proj; \ - curl -LOs https://download.osgeo.org/proj/proj-datumgrid-world-1.0.zip && unzip -j -u -o proj-datumgrid-world-1.0.zip -d /usr/share/proj; \ - curl -LOs https://download.osgeo.org/proj/proj-datumgrid-north-america-1.2.zip && unzip -j -u -o proj-datumgrid-north-america-1.2.zip -d /usr/share/proj; \ - rm *.zip + wget --no-verbose --mirror https://cdn.proj.org/; \ + rm -f cdn.proj.org/*.js; \ + rm -f cdn.proj.org/*.css; \ + mv cdn.proj.org/* /usr/share/proj/; \ + rmdir cdn.proj.org COPY --from=builder /build/usr/share/proj/ /usr/share/proj/ COPY --from=builder /build/usr/include/ /usr/include/ diff --git a/HOWTO-RELEASE b/HOWTO-RELEASE index 1aa04d29..23bcdafb 100644 --- a/HOWTO-RELEASE +++ b/HOWTO-RELEASE @@ -30,6 +30,9 @@ list. The PROJ PSC guidelines describes the rules for passing a motion. 1.1 Update ABI version numbers: ------------------------------------------------------------------------------- +In case of a un-planned maintenance release, make sure that version numbers are +propertly updated: see 3.1 + Determine the ABI version number. It consists of "current:revision:age". Follow the steps below to determine the next ABI version number: @@ -48,7 +51,7 @@ the steps below to determine the next ABI version number: Update the following files with the new ABI version number: - `src/Makefile.am` Update -version-info - - `CMakelists.txt`: Update PROJ_BUILD_VERSION (cur:rev:age) and + - `CMakeLists.txt`: Update PROJ_BUILD_VERSION (cur:rev:age) and PROJ_API_VERSION (current) *Commit the changes to master.* @@ -64,7 +67,7 @@ man/man1/. Follow these steps: - Update version number and date in `man/man3/pj_init.3` and `man/man3/geodesic.3` - Temporarily update version in `docs/source/conf.py` - - run `script/update_man.sh` + - run `scripts/update_man.sh` - Revert version number in `docs/source/conf.py` The `update_man.sh` script builds the man pages and commits the update man pages @@ -229,8 +232,8 @@ version numbers in the files. PROJ_VERSION_PATCH. - src/proj_api.h: Update PJ_VERSION. - src/release.cpp: Update date to the scheduled release date. - - CMakelists.txt: Update proj_version() - - doc/source/conf.py: Update version number + - CMakeLists.txt: Update proj_version() + - docs/source/conf.py: Update version number *Commit changes. Either to master or maintenance branch depending on the nature diff --git a/Makefile.am b/Makefile.am index 2f48dd7c..8507afe9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,6 +12,7 @@ ACLOCAL_AMFLAGS = -I m4 check-local: cd test; $(MAKE) check +all-local: README README: README.md fgrep -v "[](https://travis-ci.com/OSGeo/PROJ) [](https://ci.appveyor.com/project/OSGeo/PROJ?branch=master) +[](https://cirrus-ci.com/github/OSGeo/PROJ/master) +[](https://hub.docker.com/r/osgeo/proj/builds) [](https://coveralls.io/github/OSGeo/PROJ?branch=master) [](https://gitter.im/OSGeo/proj.4) [](http://lists.osgeo.org/mailman/listinfo/proj) diff --git a/cmake/ProjConfig.cmake b/cmake/ProjConfig.cmake index 661e6e4f..fa085384 100644 --- a/cmake/ProjConfig.cmake +++ b/cmake/ProjConfig.cmake @@ -25,9 +25,11 @@ check_include_files("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) check_function_exists(localeconv HAVE_LOCALECONV) check_function_exists(strerror HAVE_STRERROR) - -# check libm need on unix -check_library_exists(m ceil "" HAVE_LIBM) +if(NOT WIN32) + check_library_exists(dl dladdr "" HAVE_LIBDL) + # check libm need on unix + check_library_exists(m ceil "" HAVE_LIBM) +endif() set(PACKAGE "proj") set(PACKAGE_BUGREPORT "https://github.com/OSGeo/PROJ/issues") diff --git a/cmake/proj_config.cmake.in b/cmake/proj_config.cmake.in index d8385ce9..ddb24347 100644 --- a/cmake/proj_config.cmake.in +++ b/cmake/proj_config.cmake.in @@ -4,6 +4,9 @@ /* Define to 1 if you have the <inttypes.h> header file. */ #cmakedefine HAVE_INTTYPES_H 1 +/* Define to 1 if you have the `dl' library (-ldl). */ +#cmakedefine HAVE_LIBDL 1 + /* Define to 1 if you have the `m' library (-lm). */ #cmakedefine HAVE_LIBM 1 diff --git a/configure.ac b/configure.ac index fba41302..ea8c7eb4 100644 --- a/configure.ac +++ b/configure.ac @@ -199,6 +199,7 @@ AC_SEARCH_LIBS([sqrt], [m]) AC_CHECK_FUNC(localeconv, [AC_DEFINE(HAVE_LOCALECONV,1,[Define to 1 if you have localeconv])]) AC_CHECK_FUNCS([strerror]) +AC_CHECK_LIB(dl,dladdr,,,) dnl --------------------------------------------------------------------------- dnl Provide a mechanism to disable real mutex support (if lacking win32 or diff --git a/docs/source/resource_files.rst b/docs/source/resource_files.rst index 28628d30..48120982 100644 --- a/docs/source/resource_files.rst +++ b/docs/source/resource_files.rst @@ -23,8 +23,8 @@ PROJ will attempt to locate its resource files - database, transformation grids or init-files - from several directories. The following paths are checked in order: -- For transformation grids that have an explict relative or absolute path, - the directory specified in the grid filename. +- For resource files that have an explict relative or absolute path, + the directory specified in the filename. - Path resolved by the callback function set with the :c:func:`proj_context_set_file_finder`. If it is set, the next tests @@ -35,7 +35,9 @@ The following paths are checked in order: .. _user_writable_directory: -- The PROJ user writable directory, which is : +- .. versionadded:: 7.0 + + The PROJ user writable directory, which is : * on Windows, ${LOCALAPPDATA}/proj * on MacOSX, ${HOME}/Library/Application Support/proj @@ -45,13 +47,16 @@ The following paths are checked in order: - Path(s) set with by the environment variable :envvar:`PROJ_LIB`. On Linux/MacOSX/Unix, use ``:`` to separate paths. On Windows, ``;`` -- On Windows, the *..\\share\\proj\\* and its contents are found automatically +- .. versionadded:: 7.0 + + The *../share/proj/* and its contents are found automatically at run-time if the installation respects the build structure. That is, the - binaries and proj.dll are installed under *..\\bin\\*, and resource files - are in *..\\share\\proj\\*. + binaries and proj.dll/libproj.so are installed under *../bin/* or *../lib/*, + and resource files are in *../share/proj/*. - A path built into PROJ as its resource installation directory (whose value is - $(pkgdatadir)), for builds using the Makefile build system. Note, however, + $(pkgdatadir) for builds using the Makefile build system or + ${CMAKE_INSTALL_PREFIX}/${DATADIR} for CMake builds). Note, however, that since this is a hard-wired path setting, it only works if the whole PROJ installation is not moved somewhere else. diff --git a/scripts/cppcheck.sh b/scripts/cppcheck.sh index f42d5f6d..1cfd61b5 100755 --- a/scripts/cppcheck.sh +++ b/scripts/cppcheck.sh @@ -43,6 +43,10 @@ grep -v "unmatchedSuppression" ${LOG_FILE} \ | grep -v "passedByValue,Function parameter 'xyz' should be passed by const reference" \ | grep -v "passedByValue,Function parameter 'in' should be passed by const reference" \ | grep -v "knownConditionTrueFalse,Condition '!allowEmptyIntersection' is always false" \ + | grep -v -e "unitconvert.*unreadVariable,Variable 'point.*' is assigned a value that is never used" \ + | grep -v -e "helmert.*unreadVariable,Variable 'point.*' is assigned a value that is never used" \ + | grep -v -e "molodensky.*unreadVariable,Variable 'point.*' is assigned a value that is never used" \ + | grep -v -e "vgridshift.*unreadVariable,Variable 'point.*' is assigned a value that is never used" \ > ${LOG_FILE}.tmp mv ${LOG_FILE}.tmp ${LOG_FILE} diff --git a/scripts/dump_exported_symbols.sh b/scripts/dump_exported_symbols.sh index b03d711a..4bd23d64 100755 --- a/scripts/dump_exported_symbols.sh +++ b/scripts/dump_exported_symbols.sh @@ -1,2 +1,12 @@ #!/bin/sh -objdump -TC "$1" | grep " g DF .text" | cut -b 62- | grep -v "thunk to" | sed "s/internal_//" | grep -v "Java_" | sed "s/std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >/std::string/g" | sed "s/std::string >/std::string>/g" | sed "s/\[abi:cxx11\]//g" | sort -u
\ No newline at end of file + +if objdump -TC "$1" | grep "elf64-x86-64">/dev/null; then + COLUMN=62 +#elif objdump -TC "$1" | grep "elf32-i386">/dev/null; then +# COLUMN=46 +else + echo "Unsupported architecture" + exit 1 +fi + +objdump -TC "$1" | grep " g DF .text" | cut -b "${COLUMN}-" | grep -v "thunk to" | sed "s/internal_//" | grep -v "Java_" | sed "s/std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >/std::string/g" | sed "s/std::string >/std::string>/g" | sed "s/\[abi:cxx11\]//g" | sort -u diff --git a/scripts/reference_exported_symbols.txt b/scripts/reference_exported_symbols.txt index d624a893..01f8204b 100644 --- a/scripts/reference_exported_symbols.txt +++ b/scripts/reference_exported_symbols.txt @@ -282,6 +282,7 @@ osgeo::proj::datum::VerticalReferenceFrame::create(osgeo::proj::util::PropertyMa osgeo::proj::datum::VerticalReferenceFrame::realizationMethod() const osgeo::proj::datum::VerticalReferenceFrame::~VerticalReferenceFrame() osgeo::proj::File::~File() +osgeo::proj::FileManager::exists(projCtx_t*, char const*) osgeo::proj::FileManager::open(projCtx_t*, char const*, osgeo::proj::FileAccess) osgeo::proj::File::read_line(unsigned long, bool&, bool&) osgeo::proj::GenericShiftGrid::~GenericShiftGrid() @@ -780,6 +781,7 @@ pj_get_default_ctx pj_get_default_fileapi pj_get_default_searchpaths(projCtx_t*) pj_get_errno_ref +pj_get_relative_share_proj(projCtx_t*) pj_get_release pj_get_spheroid_defn pj_has_inverse diff --git a/src/apps/projsync.cpp b/src/apps/projsync.cpp index 3fab38e1..61681260 100644 --- a/src/apps/projsync.cpp +++ b/src/apps/projsync.cpp @@ -52,7 +52,7 @@ class ParsingException : public std::exception { std::string msg_; public: - ParsingException(const char *msg) : msg_(msg) {} + explicit ParsingException(const char *msg) : msg_(msg) {} const char *what() const noexcept override { return msg_.c_str(); } }; } @@ -137,7 +137,12 @@ int main(int argc, char *argv[]) { } else if (arg == "--user-writable-directory") { // do nothing } else if (arg == "--system-directory") { - targetDir = PROJ_LIB; + targetDir = pj_get_relative_share_proj(ctx); +#ifdef PROJ_LIB + if (targetDir.empty()) { + targetDir = PROJ_LIB; + } +#endif } else if (arg == "--target-dir" && i + 1 < argc) { i++; targetDir = argv[i]; diff --git a/src/conversions/cart.cpp b/src/conversions/cart.cpp index a7817443..537fc29f 100644 --- a/src/conversions/cart.cpp +++ b/src/conversions/cart.cpp @@ -165,8 +165,9 @@ static PJ_LPZ geodetic (PJ_XYZ cart, PJ *P) { if( fabs(lpz.phi) > M_HALFPI ) { // this happen on non-sphere ellipsoid when x,y,z is very close to 0 // there is no single solution to the cart->geodetic conversion in - // that case, so arbitrarily pickup phi = 0. - lpz.phi = 0; + // that case, clamp to -90/90 deg and avoid a discontinuous boundary + // near the poles + lpz.phi = copysign(M_HALFPI, lpz.phi); } lpz.lam = atan2 (cart.y, cart.x); N = normal_radius_of_curvature (P->a, P->es, lpz.phi); diff --git a/src/filemanager.cpp b/src/filemanager.cpp index aea9b11d..a90af572 100644 --- a/src/filemanager.cpp +++ b/src/filemanager.cpp @@ -46,9 +46,15 @@ #include <sys/stat.h> +#include "proj_config.h" + #ifdef _WIN32 #include <shlobj.h> +#include <windows.h> #else +#ifdef HAVE_LIBDL +#include <dlfcn.h> +#endif #include <sys/types.h> #include <unistd.h> #endif @@ -1264,13 +1270,15 @@ static bool is_rel_or_absolute_filename(const char *name) { // --------------------------------------------------------------------------- +static std::string pj_get_relative_share_proj_internal_no_check() { +#if defined(_WIN32) || defined(HAVE_LIBDL) #ifdef _WIN32 - -static std::string pj_get_win32_projlib() { - /* Check if proj.db lieves in a share/proj dir parallel to bin/proj.dll */ - /* Based in - * https://stackoverflow.com/questions/9112893/how-to-get-path-to-executable-in-c-running-on-windows - */ + HMODULE hm = NULL; + if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + (LPCSTR)&pj_get_relative_share_proj, &hm) == 0) { + return std::string(); + } DWORD path_size = 1024; @@ -1278,7 +1286,7 @@ static std::string pj_get_win32_projlib() { for (;;) { wout.clear(); wout.resize(path_size); - DWORD result = GetModuleFileNameW(nullptr, &wout[0], path_size - 1); + DWORD result = GetModuleFileNameW(hm, &wout[0], path_size - 1); DWORD last_error = GetLastError(); if (result == 0) { @@ -1292,26 +1300,79 @@ static std::string pj_get_win32_projlib() { break; } } - // Now remove the program's name. It was (example) - // "C:\programs\gmt6\bin\gdal_translate.exe" wout.resize(wcslen(wout.c_str())); std::string out = NS_PROJ::WStringToUTF8(wout); - size_t k = out.size(); - while (k > 0 && out[--k] != '\\') { + constexpr char dir_sep = '\\'; +#else + Dl_info info; + if (!dladdr((const void *)pj_get_relative_share_proj, &info)) { + return std::string(); } - out.resize(k); - - out += "/../share/proj"; + std::string out(info.dli_fname); + constexpr char dir_sep = '/'; + // "optimization" for cmake builds where RUNPATH is set to ${prefix}/lib + out = replaceAll(out, "/bin/../", "/"); +#ifdef __linux + // If we get a filename without any path, this is most likely a static + // binary. Resolve the executable name + if (out.find(dir_sep) == std::string::npos) { + constexpr size_t BUFFER_SIZE = 1024; + std::vector<char> path(BUFFER_SIZE + 1); + ssize_t nResultLen = readlink("/proc/self/exe", &path[0], BUFFER_SIZE); + if (nResultLen >= 0 && static_cast<size_t>(nResultLen) < BUFFER_SIZE) { + out.assign(path.data(), static_cast<size_t>(nResultLen)); + } + } +#endif + if (starts_with(out, "./")) + out = out.substr(2); +#endif + auto pos = out.find_last_of(dir_sep); + if (pos == std::string::npos) { + // The initial path was something like libproj.so" + out = "../share/proj"; + return out; + } + out.resize(pos); + pos = out.find_last_of(dir_sep); + if (pos == std::string::npos) { + // The initial path was something like bin/libproj.so" + out = "share/proj"; + return out; + } + out.resize(pos); + // The initial path was something like foo/bin/libproj.so" + out += "/share/proj"; return out; +#else + return std::string(); +#endif } -// --------------------------------------------------------------------------- +static std::string +pj_get_relative_share_proj_internal_check_exists(PJ_CONTEXT *ctx) { + if (ctx == nullptr) { + ctx = pj_get_default_ctx(); + } + std::string path(pj_get_relative_share_proj_internal_no_check()); + if (!path.empty() && NS_PROJ::FileManager::exists(ctx, path.c_str())) { + return path; + } + return std::string(); +} -static const char *get_path_from_win32_projlib(PJ_CONTEXT *ctx, - const char *name, - std::string &out) { +std::string pj_get_relative_share_proj(PJ_CONTEXT *ctx) { + static std::string path( + pj_get_relative_share_proj_internal_check_exists(ctx)); + return path; +} - out = pj_get_win32_projlib(); +// --------------------------------------------------------------------------- + +static const char *get_path_from_relative_share_proj(PJ_CONTEXT *ctx, + const char *name, + std::string &out) { + out = pj_get_relative_share_proj(ctx); if (out.empty()) { return nullptr; } @@ -1322,8 +1383,6 @@ static const char *get_path_from_win32_projlib(PJ_CONTEXT *ctx, : nullptr; } -#endif - /************************************************************************/ /* pj_open_lib_internal() */ /************************************************************************/ @@ -1442,11 +1501,9 @@ pj_open_lib_internal(projCtx ctx, const char *name, const char *mode, if (fid) break; } -#ifdef _WIN32 /* check if it lives in a ../share/proj dir of the proj dll */ - } else if ((sysname = get_path_from_win32_projlib(ctx, name, fname)) != - nullptr) { -#endif + } else if ((sysname = get_path_from_relative_share_proj( + ctx, name, fname)) != nullptr) { /* or hardcoded path */ } else if ((sysname = proj_lib_name) != nullptr) { fname = sysname; @@ -1503,14 +1560,12 @@ std::vector<std::string> pj_get_default_searchpaths(PJ_CONTEXT *ctx) { if (!envPROJ_LIB.empty()) { ret.push_back(envPROJ_LIB); } -#ifdef _WIN32 if (envPROJ_LIB.empty()) { - const std::string win32Dir = pj_get_win32_projlib(); - if (!win32Dir.empty()) { - ret.push_back(win32Dir); + const std::string relativeSharedProj = pj_get_relative_share_proj(ctx); + if (!relativeSharedProj.empty()) { + ret.push_back(relativeSharedProj); } } -#endif #ifdef PROJ_LIB if (envPROJ_LIB.empty()) { ret.push_back(PROJ_LIB); diff --git a/src/filemanager.hpp b/src/filemanager.hpp index 9446a0bc..233c657c 100644 --- a/src/filemanager.hpp +++ b/src/filemanager.hpp @@ -55,7 +55,7 @@ class FileManager { // "Low-level" interface. static PROJ_DLL std::unique_ptr<File> open(PJ_CONTEXT *ctx, const char *filename, FileAccess access); - static bool exists(PJ_CONTEXT *ctx, const char *filename); + static PROJ_DLL bool exists(PJ_CONTEXT *ctx, const char *filename); static bool mkdir(PJ_CONTEXT *ctx, const char *filename); static bool unlink(PJ_CONTEXT *ctx, const char *filename); static bool rename(PJ_CONTEXT *ctx, const char *oldPath, diff --git a/src/grids.cpp b/src/grids.cpp index b641f088..ec447a33 100644 --- a/src/grids.cpp +++ b/src/grids.cpp @@ -3137,6 +3137,9 @@ static double read_vgrid_value(PJ_CONTEXT *ctx, const ListOfVGrids &grids, pj_ctx_set_errno(ctx, PJD_ERR_GRID_AREA); return HUGE_VAL; } + if (grid->isNullGrid()) { + return 0; + } const auto &extent = grid->extentAndRes(); @@ -3336,6 +3339,12 @@ bool pj_bilinear_interpolation_three_samples(const GenericShiftGrid *grid, double &v2, double &v3, bool &must_retry) { must_retry = false; + if (grid->isNullGrid()) { + v1 = 0.0; + v2 = 0.0; + v3 = 0.0; + return true; + } const auto &extent = grid->extentAndRes(); double grid_x = (lp.lam - extent.westLon) / extent.resLon; diff --git a/src/init.cpp b/src/init.cpp index 9c7b7b19..a25d1ccd 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -239,7 +239,7 @@ Expand key from buffer or (if not in buffer) from init file char initname[5]; int exists; - memcpy(initname, xkey, 4); + strncpy(initname, xkey, 4); initname[4] = 0; if( strncmp(xkey, "epsg:", 5) == 0 ) { diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index b2358eb1..8a8ad526 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -8783,7 +8783,7 @@ CRSNNPtr PROJStringParser::Private::buildProjectedCRS( if (k >= 0 && k <= 1) { const double es = geogCRS->ellipsoid()->squaredEccentricity(); - if (es < 0) { + if (es < 0 || es == 1) { throw ParsingException("Invalid flattening"); } value = diff --git a/src/lib_proj.cmake b/src/lib_proj.cmake index 49ea787e..177b077f 100644 --- a/src/lib_proj.cmake +++ b/src/lib_proj.cmake @@ -415,6 +415,10 @@ if(UNIX) if(M_LIB) target_link_libraries(${PROJ_CORE_TARGET} -lm) endif() + find_library(DL_LIB dl) + if(M_LIB) + target_link_libraries(${PROJ_CORE_TARGET} -ldl) + endif() endif() if(USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) target_link_libraries(${PROJ_CORE_TARGET} ${CMAKE_THREAD_LIBS_INIT}) diff --git a/src/param.cpp b/src/param.cpp index 182c40b0..289faca3 100644 --- a/src/param.cpp +++ b/src/param.cpp @@ -85,7 +85,7 @@ paralist *pj_mkparam_ws (const char *str, const char **next_str) { newitem = (paralist *) pj_calloc (1, sizeof(paralist) + len + 1); if (nullptr==newitem) return nullptr; - memmove(newitem->param, str, len); + memcpy(newitem->param, str, len); unquote_string(newitem->param); newitem->used = 0; diff --git a/src/proj_internal.h b/src/proj_internal.h index 7a777027..0cffb475 100644 --- a/src/proj_internal.h +++ b/src/proj_internal.h @@ -560,7 +560,7 @@ struct PJconsts { struct ARG_list { paralist *next; char used; -#if defined(__GNUC__) && __GNUC__ >= 8 +#if (defined(__GNUC__) && __GNUC__ >= 8) || (defined(__clang__) && __clang_major__ >= 9) char param[]; /* variable-length member */ /* Safer to use [] for gcc 8. See https://github.com/OSGeo/proj.4/pull/1087 */ /* and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86914 */ @@ -874,6 +874,7 @@ std::string PROJ_DLL pj_context_get_grid_cache_filename(PJ_CONTEXT *ctx); // For use by projsync std::string PROJ_DLL pj_context_get_user_writable_directory(PJ_CONTEXT *ctx, bool create); void PROJ_DLL pj_context_set_user_writable_directory(PJ_CONTEXT* ctx, const std::string& path); +std::string PROJ_DLL pj_get_relative_share_proj(PJ_CONTEXT *ctx); /* classic public API */ #include "proj_api.h" diff --git a/src/projections/isea.cpp b/src/projections/isea.cpp index 351739d4..801f2b82 100644 --- a/src/projections/isea.cpp +++ b/src/projections/isea.cpp @@ -733,7 +733,7 @@ static int isea_dddi_ap3odd(struct isea_dgg *g, int quadz, struct isea_pt *pt, quadz += 5; d = 0; } - } else if (quadz >= 6) { + } else /* if (quadz >= 6) */ { if (i == 0 && d == maxcoord) { /* south pole */ quadz = 11; @@ -812,7 +812,7 @@ static int isea_dddi(struct isea_dgg *g, int quadz, struct isea_pt *pt, h.y = -h.z; h.x = 0; } - } else if (quadz >= 6) { + } else /* if (quadz >= 6) */ { if (h.z == 0 && h.x == sidelength) { /* south pole */ quadz = 11; diff --git a/src/projections/laea.cpp b/src/projections/laea.cpp index a1e4bf8f..3d135864 100644 --- a/src/projections/laea.cpp +++ b/src/projections/laea.cpp @@ -44,7 +44,8 @@ static PJ_XY laea_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoidal, forward if (Q->mode == OBLIQ || Q->mode == EQUIT) { sinb = q / Q->qp; - cosb = sqrt(1. - sinb * sinb); + const double cosb2 = 1. - sinb * sinb; + cosb = cosb2 > 0 ? sqrt(cosb2) : 0; } switch (Q->mode) { diff --git a/src/projections/robin.cpp b/src/projections/robin.cpp index 2e36106a..5a3b081c 100644 --- a/src/projections/robin.cpp +++ b/src/projections/robin.cpp @@ -84,7 +84,7 @@ static PJ_XY robin_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar (void) P; dphi = fabs(lp.phi); - i = isnan(lp.phi) ? -1 : lround(floor(dphi * C1)); + i = isnan(lp.phi) ? -1 : lround(floor(dphi * C1 + 1e-15)); if( i < 0 ){ proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); return xy; diff --git a/src/projections/vandg.cpp b/src/projections/vandg.cpp index 7d485aff..107fc3b9 100644 --- a/src/projections/vandg.cpp +++ b/src/projections/vandg.cpp @@ -6,18 +6,18 @@ PROJ_HEAD(vandg, "van der Grinten (I)") "\n\tMisc Sph"; # define TOL 1.e-10 # define THIRD .33333333333333333333 -# define C2_27 .07407407407407407407 -# define PI4_3 4.18879020478639098458 -# define PISQ 9.86960440108935861869 -# define TPISQ 19.73920880217871723738 -# define HPISQ 4.93480220054467930934 +# define C2_27 .07407407407407407407 // 2/27 +# define PI4_3 4.18879020478639098458 // 4*pi/3 +# define PISQ 9.86960440108935861869 // pi^2 +# define TPISQ 19.73920880217871723738 // 2*pi^2 +# define HPISQ 4.93480220054467930934 // pi^2/2 static PJ_XY vandg_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forward */ PJ_XY xy = {0.0,0.0}; double al, al2, g, g2, p2; - - p2 = fabs(lp.phi / M_HALFPI); + // Comments tie this formulation to Snyder (1987), p. 241. + p2 = fabs(lp.phi / M_HALFPI); // sin(theta) from (29-6) if ((p2 - TOL) > 1.) { proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); return xy; @@ -32,17 +32,28 @@ static PJ_XY vandg_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar xy.y = M_PI * tan(.5 * asin(p2)); if (lp.phi < 0.) xy.y = -xy.y; } else { - al = .5 * fabs(M_PI / lp.lam - lp.lam / M_PI); - al2 = al * al; - g = sqrt(1. - p2 * p2); - g = g / (p2 + g - 1.); - g2 = g * g; - p2 = g * (2. / p2 - 1.); - p2 = p2 * p2; - xy.x = g - p2; g = p2 + al2; + al = .5 * fabs(M_PI / lp.lam - lp.lam / M_PI); // A from (29-3) + al2 = al * al; // A^2 + g = sqrt(1. - p2 * p2); // cos(theta) + g = g / (p2 + g - 1.); // G from (29-4) + g2 = g * g; // G^2 + p2 = g * (2. / p2 - 1.); // P from (29-5) + p2 = p2 * p2; // P^2 + { + // Force floating-point computations done on 80 bit on + // i386 to go back to 64 bit. This is to avoid the test failures + // of https://github.com/OSGeo/PROJ/issues/1906#issuecomment-583168348 + // The choice of p2 is completely arbitrary. + volatile double p2_tmp = p2; + p2 = p2_tmp; + } + xy.x = g - p2; // G - P^2 + g = p2 + al2; // P^2 + A^2 + // (29-1) xy.x = M_PI * (al * xy.x + sqrt(al2 * xy.x * xy.x - g * (g2 - p2))) / g; if (lp.lam < 0.) xy.x = -xy.x; xy.y = fabs(xy.x / M_PI); + // y from (29-2) has been expressed in terms of x here xy.y = 1. - xy.y * (xy.y + 2. * al); if (xy.y < -TOL) { proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); @@ -61,8 +72,8 @@ static PJ_XY vandg_s_forward (PJ_LP lp, PJ *P) { /* Spheroidal, forwar static PJ_LP vandg_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, inverse */ PJ_LP lp = {0.0,0.0}; double t, c0, c1, c2, c3, al, r2, r, m, d, ay, x2, y2; - - x2 = xy.x * xy.x; + // Comments tie this formulation to Snyder (1987), p. 242. + x2 = xy.x * xy.x; // pi^2 * X^2 if ((ay = fabs(xy.y)) < TOL) { lp.phi = 0.; t = x2 * x2 + TPISQ * (x2 + HPISQ); @@ -70,25 +81,28 @@ static PJ_LP vandg_s_inverse (PJ_XY xy, PJ *P) { /* Spheroidal, invers .5 * (x2 - PISQ + sqrt(t)) / xy.x; return (lp); } - y2 = xy.y * xy.y; - r = x2 + y2; r2 = r * r; - c1 = - M_PI * ay * (r + PISQ); + y2 = xy.y * xy.y; // pi^2 * Y^2 + r = x2 + y2; // pi^2 * (X^2+Y^2) + r2 = r * r; // pi^4 * (X^2+Y^2)^2 + c1 = - M_PI * ay * (r + PISQ); // pi^4 * c1 (29-11) + // pi^4 * c3 (29-13) c3 = r2 + M_TWOPI * (ay * r + M_PI * (y2 + M_PI * (ay + M_HALFPI))); - c2 = c1 + PISQ * (r - 3. * y2); - c0 = M_PI * ay; - c2 /= c3; - al = c1 / c3 - THIRD * c2 * c2; - m = 2. * sqrt(-THIRD * al); - d = C2_27 * c2 * c2 * c2 + (c0 * c0 - THIRD * c2 * c1) / c3; - const double al_mul_m = al * m; - if( al_mul_m == 0 ) { + c2 = c1 + PISQ * (r - 3. * y2); // pi^4 * c2 (29-12) + c0 = M_PI * ay; // pi^2 * Y + c2 /= c3; // c2/c3 + al = c1 / c3 - THIRD * c2 * c2; // a1 (29-15) + m = 2. * sqrt(-THIRD * al); // m1 (29-16) + d = C2_27 * c2 * c2 * c2 + (c0 * c0 - THIRD * c2 * c1) / c3; // d (29-14) + const double al_mul_m = al * m; // a1*m1 + if( fabs(al_mul_m) < 1e-16 ) { proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); return proj_coord_error().lp; } - d = 3. * d /al_mul_m; + d = 3. * d /al_mul_m; // cos(3*theta1) (29-17) t = fabs(d); if ((t - TOL) <= 1.) { - d = t > 1. ? (d > 0. ? 0. : M_PI) : acos(d); + d = t > 1. ? (d > 0. ? 0. : M_PI) : acos(d); // 3*theta1 (29-17) + // (29-18) but change pi/3 to 4*pi/3 to flip sign of cos lp.phi = M_PI * (m * cos(d * THIRD + PI4_3) - THIRD * c2); if (xy.y < 0.) lp.phi = -lp.phi; t = r2 + TPISQ * (x2 - y2 + HPISQ); diff --git a/test/gie/builtins.gie b/test/gie/builtins.gie index dca30a2d..47de961e 100644 --- a/test/gie/builtins.gie +++ b/test/gie/builtins.gie @@ -1333,7 +1333,7 @@ accept -200 -100 expect -0.001790220 -0.000895247 operation +proj=eqdc +a=9999999 +b=.9 +lat_2=1 -expect failure errno invalid_eccentricity +expect failure operation +proj=eqdc +R=6400000 +lat_1=1 +lat_2=-1 expect failure errno conic_lat_equal @@ -4087,7 +4087,8 @@ expect failure errno lat_0_or_alpha_eq_90 ------------------------------------------------------------------------------- operation +proj=omerc +lat_1=0.1 +a=6400000 +b=1 ------------------------------------------------------------------------------- -expect failure errno invalid_eccentricity +# Disabled since fails on i386. Not so important. Edge condition found by ossfuzz +#expect failure errno invalid_eccentricity ------------------------------------------------------------------------------- operation +proj=omerc +lat_1=0.8 +a=6400000 +b=.4 diff --git a/test/gie/ellipsoid.gie b/test/gie/ellipsoid.gie index 74fbe31d..09effd06 100644 --- a/test/gie/ellipsoid.gie +++ b/test/gie/ellipsoid.gie @@ -44,7 +44,7 @@ tolerance 10 nm accept 1 2 expect 111319.4907932736 221194.0771604237 -accept 12 55s +accept 12 55 expect 1335833.8895192828 7326837.7148738774 ------------------------------------------------------------------------------- @@ -117,7 +117,9 @@ expect 1338073.2696101593 7374207.4801437631 ------------------------------------------------------------------------------- operation proj=merc a=1E77 R_lat_a=90 b=1 -expect failure errno invalid_eccentricity +# errno invalid_eccentricity on x86_64 +# errno pjd_err_ref_rad_larger_than_90 on i386 +expect failure ------------------------------------------------------------------------------- This one from testvarious failed at first version of the pull request diff --git a/test/gie/more_builtins.gie b/test/gie/more_builtins.gie index 10d3ea47..424f941d 100644 --- a/test/gie/more_builtins.gie +++ b/test/gie/more_builtins.gie @@ -851,7 +851,7 @@ expect 180 0 0 # Center of Earth ! accept 0 0 0 -expect 0 0 -6378137 +expect 0 90 -6356752.314140356 </gie> diff --git a/travis/csa/before_install.sh b/travis/csa/before_install.sh index dcb7733b..0ebc94fb 100755 --- a/travis/csa/before_install.sh +++ b/travis/csa/before_install.sh @@ -7,7 +7,7 @@ set -e sudo apt-get install -qq sqlite3 libsqlite3-dev libtiff-dev libcurl4-openssl-dev -CLANG_LLVM=clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-16.04 -wget http://releases.llvm.org/6.0.0/$CLANG_LLVM.tar.xz +CLANG_LLVM=clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-16.04 +wget http://releases.llvm.org/9.0.0/$CLANG_LLVM.tar.xz tar xJf $CLANG_LLVM.tar.xz -mv $CLANG_LLVM clang+llvm-6 +mv $CLANG_LLVM clang+llvm-9 diff --git a/travis/csa/install.sh b/travis/csa/install.sh index 334389ee..349afcb1 100755 --- a/travis/csa/install.sh +++ b/travis/csa/install.sh @@ -5,7 +5,30 @@ set -e # prepare build files ./autogen.sh -CXXFLAGS="-std=c++11" ./clang+llvm-6/bin/scan-build -o scanbuildoutput -plist -v ./configure -./clang+llvm-6/bin/scan-build -o scanbuildoutput -plist -v make -j2 +export PATH=$PWD/clang+llvm-9/bin:$PATH +CXXFLAGS="-std=c++11" scan-build -o scanbuildoutput -plist -v ./configure +rm -rf scanbuildoutput +TOPDIR=$PWD +scan-build -o $TOPDIR/scanbuildoutput -sarif -v -enable-checker alpha.unix.cstring.OutOfBounds,alpha.unix.cstring.BufferOverlap,optin.cplusplus.VirtualCall,optin.cplusplus.UninitializedObject make -j2 -if grep -r "\.c" scanbuildoutput | grep "<string>" | grep -v -e "<key>" -e _generated_parser; then echo "error" && /bin/false; else echo "ok"; fi +sudo apt-get install jq + +rm -f filtered_scanbuild.txt +files=$(find scanbuildoutput -name "*.sarif") +for f in $files; do + jq '.runs[].results[] | (if .locations[].physicalLocation.fileLocation.uri | (contains("_generated_parser") ) then empty else { "uri": .locations[].physicalLocation.fileLocation.uri, "msg": .message.text, "location": .codeFlows[-1].threadFlows[-1].locations[-1] } end)' < $f > tmp.txt + if [ -s tmp.txt ]; then + echo "Errors from $f: " + cat $f + echo "" + cat tmp.txt >> filtered_scanbuild.txt + fi +done +if [ -s filtered_scanbuild.txt ]; then + echo "" + echo "" + echo "========================" + echo "Summary of errors found:" + cat filtered_scanbuild.txt + /bin/false +fi diff --git a/travis/install.sh b/travis/install.sh index a8b98f98..b0c16881 100755 --- a/travis/install.sh +++ b/travis/install.sh @@ -21,75 +21,96 @@ wget "https://github.com/OSGeo/proj-datumgrid/blob/master/north-america/ntv2_0.g ./autogen.sh TOP_DIR=$PWD -# autoconf build -mkdir build_autoconf -cd build_autoconf -../configure -make dist-all -# Check consistency of generated tarball -TAR_FILENAME=`ls *.tar.gz` -TAR_DIRECTORY=`basename $TAR_FILENAME .tar.gz` -tar xvzf $TAR_FILENAME -cd $TAR_DIRECTORY - -# There's a nasty #define CS in a Solaris system header. Avoid being caught about that again -CXXFLAGS="-DCS=do_not_use_CS_for_solaris_compat $CXXFLAGS" - -# autoconf build from generated tarball -mkdir build_autoconf -cd build_autoconf -../configure --prefix=/tmp/proj_autoconf_install_from_dist_all - -make -j${NPROC} - -if [ "$(uname)" == "Linux" -a -f src/.libs/libproj.so ]; then - echo "Checking exported symbols..." - ${TOP_DIR}/scripts/dump_exported_symbols.sh src/.libs/libproj.so > /tmp/got_symbols.txt - diff -u ${TOP_DIR}/scripts/reference_exported_symbols.txt /tmp/got_symbols.txt || (echo "Difference(s) found in exported symbols. If intended, refresh scripts/reference_exported_symbols.txt with 'scripts/dump_exported_symbols.sh src/.libs/libproj.so > scripts/reference_exported_symbols.txt'"; exit 1) -fi - -make check -make install -find /tmp/proj_autoconf_install_from_dist_all - -/tmp/proj_autoconf_install_from_dist_all/bin/projinfo EPSG:32631 -o PROJJSON -q > out.json -cat out.json -echo "Validating JSON" -jsonschema -i out.json /tmp/proj_autoconf_install_from_dist_all/share/proj/projjson.schema.json && echo "Valid !" - -/tmp/proj_autoconf_install_from_dist_all/bin/projinfo EPSG:4326+3855 -o PROJJSON -q > out.json -cat out.json -echo "Validating JSON" -jsonschema -i out.json /tmp/proj_autoconf_install_from_dist_all/share/proj/projjson.schema.json && echo "Valid !" - -/tmp/proj_autoconf_install_from_dist_all/bin/projinfo "+proj=longlat +ellps=GRS80 +nadgrids=@foo +type=crs" -o PROJJSON -q > out.json -cat out.json -echo "Validating JSON" -jsonschema -i out.json /tmp/proj_autoconf_install_from_dist_all/share/proj/projjson.schema.json && echo "Valid !" -/tmp/proj_autoconf_install_from_dist_all/bin/projinfo @out.json -o PROJJSON -q > out2.json -diff -u out.json out2.json - -/tmp/proj_autoconf_install_from_dist_all/bin/projinfo -s EPSG:3111 -t GDA2020 -o PROJJSON -o PROJJSON -q > out.json -cat out.json -echo "Validating JSON" -jsonschema -i out.json /tmp/proj_autoconf_install_from_dist_all/share/proj/projjson.schema.json && echo "Valid !" -/tmp/proj_autoconf_install_from_dist_all/bin/projinfo @out.json -o PROJJSON -q > out2.json -diff -u out.json out2.json +if [ "$SKIP_BUILDS_WITHOUT_GRID" != "yes" ]; then + + # autoconf build + mkdir build_autoconf + cd build_autoconf + ../configure + make dist-all + # Check consistency of generated tarball + TAR_FILENAME=`ls *.tar.gz` + TAR_DIRECTORY=`basename $TAR_FILENAME .tar.gz` + tar xvzf $TAR_FILENAME + cd $TAR_DIRECTORY + + # There's a nasty #define CS in a Solaris system header. Avoid being caught about that again + CXXFLAGS="-DCS=do_not_use_CS_for_solaris_compat $CXXFLAGS" + + # autoconf build from generated tarball + mkdir build_autoconf + cd build_autoconf + ../configure --prefix=/tmp/proj_autoconf_install_from_dist_all + + make -j${NPROC} + + if [ "$(uname)" == "Linux" -a -f src/.libs/libproj.so ]; then + if objdump -TC "$1" | grep "elf64-x86-64">/dev/null; then + echo "Checking exported symbols..." + ${TOP_DIR}/scripts/dump_exported_symbols.sh src/.libs/libproj.so > /tmp/got_symbols.txt + diff -u ${TOP_DIR}/scripts/reference_exported_symbols.txt /tmp/got_symbols.txt || (echo "Difference(s) found in exported symbols. If intended, refresh scripts/reference_exported_symbols.txt with 'scripts/dump_exported_symbols.sh src/.libs/libproj.so > scripts/reference_exported_symbols.txt'"; exit 1) + fi + fi -cd .. + make check + make install + find /tmp/proj_autoconf_install_from_dist_all + + /tmp/proj_autoconf_install_from_dist_all/bin/projinfo EPSG:32631 -o PROJJSON -q > out.json + cat out.json + echo "Validating JSON" + jsonschema -i out.json /tmp/proj_autoconf_install_from_dist_all/share/proj/projjson.schema.json && echo "Valid !" + + /tmp/proj_autoconf_install_from_dist_all/bin/projinfo EPSG:4326+3855 -o PROJJSON -q > out.json + cat out.json + echo "Validating JSON" + jsonschema -i out.json /tmp/proj_autoconf_install_from_dist_all/share/proj/projjson.schema.json && echo "Valid !" + + /tmp/proj_autoconf_install_from_dist_all/bin/projinfo "+proj=longlat +ellps=GRS80 +nadgrids=@foo +type=crs" -o PROJJSON -q > out.json + cat out.json + echo "Validating JSON" + jsonschema -i out.json /tmp/proj_autoconf_install_from_dist_all/share/proj/projjson.schema.json && echo "Valid !" + /tmp/proj_autoconf_install_from_dist_all/bin/projinfo @out.json -o PROJJSON -q > out2.json + diff -u out.json out2.json + + /tmp/proj_autoconf_install_from_dist_all/bin/projinfo -s EPSG:3111 -t GDA2020 -o PROJJSON -o PROJJSON -q > out.json + cat out.json + echo "Validating JSON" + jsonschema -i out.json /tmp/proj_autoconf_install_from_dist_all/share/proj/projjson.schema.json && echo "Valid !" + /tmp/proj_autoconf_install_from_dist_all/bin/projinfo @out.json -o PROJJSON -q > out2.json + diff -u out.json out2.json + + cd .. + + if [ $TRAVIS_OS_NAME != "osx" ]; then + # Check that we can retrieve the resource directory in a relative way after renaming the installation prefix + mkdir /tmp/proj_autoconf_install_from_dist_all_renamed + mv /tmp/proj_autoconf_install_from_dist_all /tmp/proj_autoconf_install_from_dist_all_renamed/subdir + LD_LIBRARY_PATH=/tmp/proj_autoconf_install_from_dist_all_renamed/subdir/lib /tmp/proj_autoconf_install_from_dist_all_renamed/subdir/bin/projsync --source-id ? --dry-run --system-directory || /bin/true + LD_LIBRARY_PATH=/tmp/proj_autoconf_install_from_dist_all_renamed/subdir/lib /tmp/proj_autoconf_install_from_dist_all_renamed/subdir/bin/projsync --source-id ? --dry-run --system-directory 2>/dev/null | grep "Downloading from https://cdn.proj.org into /tmp/proj_autoconf_install_from_dist_all_renamed/subdir/share/proj" + fi -# cmake build from generated tarball -mkdir build_cmake -cd build_cmake -cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/proj_cmake_install -VERBOSE=1 make -j${NPROC} -make install -ctest -find /tmp/proj_cmake_install -cd .. + # cmake build from generated tarball + mkdir build_cmake + cd build_cmake + cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/proj_cmake_install + VERBOSE=1 make -j${NPROC} + make install + ctest + find /tmp/proj_cmake_install + cd .. + + if [ $TRAVIS_OS_NAME != "osx" ]; then + # Check that we can retrieve the resource directory in a relative way after renaming the installation prefix + mkdir /tmp/proj_cmake_install_renamed + mv /tmp/proj_cmake_install /tmp/proj_cmake_install_renamed/subdir + /tmp/proj_cmake_install_renamed/subdir/bin/projsync --source-id ? --dry-run --system-directory || /bin/true + /tmp/proj_cmake_install_renamed/subdir/bin/projsync --source-id ? --dry-run --system-directory 2>/dev/null | grep "Downloading from https://cdn.proj.org into /tmp/proj_cmake_install_renamed/subdir/share/proj" + fi -# return to root -cd ../.. + # return to root + cd ../.. +fi # Install grid files (cd data && unzip -o ../proj-datumgrid-1.8.zip && cp ../ntv2_0.gsb . ) @@ -110,28 +131,31 @@ make clean find /tmp/proj_autoconf_install_grids cd .. -# There's an issue with the clang on Travis + coverage + cpp code -if [ "$BUILD_NAME" != "linux_clang" ]; then - # autoconf build with grids and coverage - if [ $TRAVIS_OS_NAME == "osx" ]; then - CFLAGS="--coverage" CXXFLAGS="--coverage" ./configure; +if [ "$SKIP_BUILDS_WITHOUT_GRID" != "yes" ]; then + + # There's an issue with the clang on Travis + coverage + cpp code + if [ "$BUILD_NAME" != "linux_clang" ]; then + # autoconf build with grids and coverage + if [ "$TRAVIS_OS_NAME" == "osx" ]; then + CFLAGS="--coverage" CXXFLAGS="--coverage" ./configure; + else + CFLAGS="$CFLAGS --coverage" CXXFLAGS="$CXXFLAGS --coverage" LDFLAGS="$LDFLAGS -lgcov" ./configure; + fi else - CFLAGS="$CFLAGS --coverage" CXXFLAGS="$CXXCFLAGS --coverage" LDFLAGS="$LDFLAGS -lgcov" ./configure; + ./configure + fi + make -j${NPROC} + make check + + # Rerun tests without grids not included in proj-datumgrid + rm -v data/egm96_15.gtx + make check + + if [ "$BUILD_NAME" != "linux_clang" ]; then + mv src/.libs/*.gc* src + mv src/conversions/.libs/*.gc* src/conversions + mv src/iso19111/.libs/*.gc* src/iso19111 + mv src/projections/.libs/*.gc* src/projections + mv src/transformations/.libs/*.gc* src/transformations fi -else - ./configure -fi -make -j${NPROC} -make check - -# Rerun tests without grids not included in proj-datumgrid -rm -v data/egm96_15.gtx -make check - -if [ "$BUILD_NAME" != "linux_clang" ]; then - mv src/.libs/*.gc* src - mv src/conversions/.libs/*.gc* src/conversions - mv src/iso19111/.libs/*.gc* src/iso19111 - mv src/projections/.libs/*.gc* src/projections - mv src/transformations/.libs/*.gc* src/transformations fi diff --git a/travis/linux_gcc7/after_success.sh b/travis/linux_gcc8/after_success.sh index 70c6f5cb..70c6f5cb 100755 --- a/travis/linux_gcc7/after_success.sh +++ b/travis/linux_gcc8/after_success.sh diff --git a/travis/linux_gcc7/before_install.sh b/travis/linux_gcc8/before_install.sh index 2ef2feee..424bc10e 100755 --- a/travis/linux_gcc7/before_install.sh +++ b/travis/linux_gcc8/before_install.sh @@ -8,8 +8,8 @@ set -e sudo apt-get install -qq \ lcov \ doxygen graphviz \ - sqlite3 libsqlite3-dev \ - libtiff-dev libcurl4-openssl-dev + sqlite3 libsqlite3-dev:$ARCH \ + libtiff-dev:$ARCH libcurl4-openssl-dev:$ARCH #scripts/cppcheck.sh #scripts/doxygen.sh diff --git a/travis/linux_gcc7/install.sh b/travis/linux_gcc8/install.sh index 7fa8cfa4..7fa8cfa4 100755 --- a/travis/linux_gcc7/install.sh +++ b/travis/linux_gcc8/install.sh |
