Skip to content

Commit fb505f4

Browse files
authored
Merge pull request OSGeo#3711 from mwtoews/proj-db-cache-dir
CMake: add PROJ_DB_CACHE_DIR
2 parents 700721e + 4d56195 commit fb505f4

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

data/CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22
# files containing dictionary of useful projection
33
#
44

5+
set(PROJ_DB_CACHE_DIR "" CACHE PATH "Directory used to cache proj.db")
6+
if(NOT IS_DIRECTORY ${PROJ_DB_CACHE_DIR})
7+
if(NOT "${PROJ_DB_CACHE_DIR}" STREQUAL "")
8+
message(WARNING
9+
"PROJ_DB_CACHE_DIR (${PROJ_DB_CACHE_DIR}) not set to a directory")
10+
set(PROJ_DB_CACHE_DIR "")
11+
endif()
12+
endif()
13+
514
set(CONFIG_FILES
615
proj.ini
716
)
@@ -36,7 +45,7 @@ include(sql_filelist.cmake)
3645
add_custom_command(
3746
OUTPUT ${PROJ_DB}
3847
COMMAND ${CMAKE_COMMAND} -E remove -f ${PROJ_DB}
39-
COMMAND ${CMAKE_COMMAND} "-DALL_SQL_IN=${ALL_SQL_IN}" "-DEXE_SQLITE3=${EXE_SQLITE3}" "-DPROJ_DB=${PROJ_DB}" "-DPROJ_VERSION=${PROJ_VERSION}"
48+
COMMAND ${CMAKE_COMMAND} "-DALL_SQL_IN=${ALL_SQL_IN}" "-DEXE_SQLITE3=${EXE_SQLITE3}" "-DPROJ_DB=${PROJ_DB}" "-DPROJ_VERSION=${PROJ_VERSION}" "-DPROJ_DB_CACHE_DIR=${PROJ_DB_CACHE_DIR}"
4049
-P "${CMAKE_CURRENT_SOURCE_DIR}/generate_proj_db.cmake"
4150
COMMAND ${CMAKE_COMMAND} -E copy ${PROJ_DB} ${CMAKE_CURRENT_BINARY_DIR}/for_tests
4251
DEPENDS ${SQL_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/generate_proj_db.cmake"

data/generate_proj_db.cmake

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,30 @@ file(READ ${ALL_SQL_IN} CONTENTS)
1414
string(REPLACE "\${PROJ_VERSION}" "${PROJ_VERSION}" CONTENTS_MOD "${CONTENTS}")
1515
file(WRITE "${ALL_SQL_IN}" "${CONTENTS_MOD}")
1616

17+
if(IS_DIRECTORY ${PROJ_DB_CACHE_DIR})
18+
set(USE_PROJ_DB_CACHE_DIR TRUE)
19+
set(PROJ_DB_SQL_MD5_FILE "${PROJ_DB_CACHE_DIR}/proj.db.sql.md5")
20+
if(EXISTS "${PROJ_DB_SQL_MD5_FILE}")
21+
file(STRINGS "${PROJ_DB_SQL_MD5_FILE}" PROJ_DB_SQL_MD5 LIMIT_COUNT 1)
22+
endif()
23+
file(MD5 "${ALL_SQL_IN}" PROJ_DB_SQL_MD5)
24+
set(CACHED_PROJ_DB "${PROJ_DB_CACHE_DIR}/proj.db")
25+
if("${PROJ_DB_SQL_MD5}" STREQUAL "${PROJ_DB_SQL_MD5}" AND EXISTS "${CACHED_PROJ_DB}")
26+
message(STATUS "Reusing cached proj.db from ${PROJ_DB_CACHE_DIR}")
27+
get_filename_component(PROJ_DB_DIR "${PROJ_DB}" DIRECTORY)
28+
file(COPY "${CACHED_PROJ_DB}" DESTINATION "${PROJ_DB_DIR}")
29+
return()
30+
endif()
31+
endif()
32+
1733
execute_process(COMMAND "${EXE_SQLITE3}" "${PROJ_DB}"
1834
INPUT_FILE "${ALL_SQL_IN}"
1935
RESULT_VARIABLE STATUS)
2036

2137
if(STATUS AND NOT STATUS EQUAL 0)
22-
message(FATAL_ERROR "SQLite3 failed")
38+
message(FATAL_ERROR "Build of proj.db failed")
39+
elseif(USE_PROJ_DB_CACHE_DIR)
40+
message(STATUS "Saving cache: ${CACHED_PROJ_DB}")
41+
file(COPY "${PROJ_DB}" DESTINATION "${PROJ_DB_CACHE_DIR}")
42+
file(WRITE "${PROJ_DB_SQL_MD5_FILE}" "${PROJ_DB_SQL_MD5}\n")
2343
endif()

docs/source/install.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,11 @@ All cached entries can be viewed using ``cmake -LAH`` from a build directory.
371371
`clcache <https://github.com/frerich/clcache>`_ for MSVC)
372372
to build C/C++ objects.
373373

374+
.. option:: PROJ_DB_CACHE_DIR
375+
376+
Path to an existing directory used to cache :file:`proj.db` to speed-up
377+
subsequent builds without modifications to source SQL files.
378+
374379

375380
Building on Windows with vcpkg and Visual Studio 2017 or 2019
376381
--------------------------------------------------------------------------------

0 commit comments

Comments
 (0)