Skip to content

Commit 565e82d

Browse files
authored
cmake: fix ctypesgen's generation of GRASS API (#5418)
1 parent dec4f63 commit 565e82d

File tree

3 files changed

+70
-57
lines changed

3 files changed

+70
-57
lines changed

cmake/ctypesgen.cmake

+37-32
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
#[[
22
AUTHOR(S): Rashad Kanavath <rashad km gmail>
3-
PURPOSE: Cmake building of lib/python/ctypes (TODO)
4-
COPYRIGHT: (C) 2020 by the GRASS Development Team
3+
PURPOSE: Generation of Python interface to GRASS API
4+
COPYRIGHT: (c) 2020-2025 by the GRASS Development Team
55
66
SPDX-License-Identifier: GPL-2.0-or-later
77
#]]
88

9+
foreach(req OUT_FILE HDRS LIBS CTYPESGEN_PY COMPILER)
10+
if(NOT DEFINED ${req} OR "${${req}}" STREQUAL "")
11+
message(FATAL_ERROR "ctypesgen.cmake: you must set ${req}")
12+
endif()
13+
endforeach()
14+
915
set(ENV{GISRC}
1016
"${OUTDIR}/${GRASS_INSTALL_DEMODIR}/.grassrc${GRASS_VERSION_MAJOR}${GRASS_VERSION_MINOR}"
1117
)
@@ -17,52 +23,51 @@ set(ENV{PYTHONPATH}
1723
"${OUTDIR}/${GRASS_INSTALL_GUIDIR}/wxpython:${OUTDIR}/${GRASS_INSTALL_PYDIR}:$ENV{PYTHONPATH}"
1824
)
1925
if(NOT MSVC)
20-
set(ENV{LD_LIBRARY_PATH}
21-
"${OUTDIR}/${GRASS_INSTALL_LIBDIR}:$ENV{LD_LIBRARY_PATH}")
26+
set(_d
27+
"${OUTDIR}/${GRASS_INSTALL_LIBDIR}:${OUTDIR}/${GRASS_INSTALL_BINDIR}:${OUTDIR}/${GRASS_INSTALL_SCRIPTDIR}"
28+
)
29+
set(ENV{${LD_LIBRARY_PATH_VAR}} "${_d}:$ENV{${LD_LIBRARY_PATH_VAR}}")
30+
unset(_d)
2231
endif()
2332
set(ENV{LC_ALL} C)
2433

34+
set(CTYPESFLAGS "${COMPILER} -E ${C_FLAGS}")
35+
2536
set(LIBRARIES)
2637
foreach(LIB ${LIBS})
27-
list(APPEND LIBRARIES --library=${LIB})
28-
endforeach()
29-
30-
set(HEADERS)
31-
foreach(HDR ${HDRS})
32-
list(APPEND HEADERS "${OUTDIR}/${GRASS_INSTALL_INCLUDEDIR}/grass/${HDR}")
38+
list(APPEND LIBRARIES "-l${LIB}")
3339
endforeach()
3440

35-
set(SYSHEADERS)
36-
foreach(SYSHDR ${SYSHDRS})
37-
list(APPEND SYSHEADERS "--includedir=${SYSHDR}")
38-
endforeach()
39-
40-
foreach(req OUT_FILE HDRS LIBS CTYPESGEN_PY COMPILER)
41-
if(NOT DEFINED ${req} OR "${${req}}" STREQUAL "")
42-
message(FATAL_ERROR "you must set ${req}")
43-
endif()
41+
set(INC_HEADERS)
42+
foreach(INCHDR ${INCHDRS})
43+
list(APPEND INC_HEADERS "-I${INCHDR}")
4444
endforeach()
4545

46+
set(DEFINES)
4647
if(MSVC)
47-
set(CTYPESFLAGS "${COMPILER} -E -DPACKAGE=\"grasslibs\"")
48+
# ??
49+
elseif(APPLE)
50+
# ??
4851
else()
49-
set(CTYPESFLAGS
50-
"${COMPILER} -E -DPACKAGE=\"grasslibs\" -D__GLIBC_HAVE_LONG_LONG")
52+
list(APPEND DEFINES "__GLIBC_HAVE_LONG_LONG")
5153
endif()
54+
list(TRANSFORM DEFINES PREPEND "-D")
5255

53-
message(
54-
STATUS "Running ${PYTHON_EXECUTABLE} ${CTYPESGEN_PY} --cpp=${CTYPESFLAGS} \
55-
--no-embed-preamble --strip-build-path ${RUNTIME_GISBASE} ${SYSHEADERS} \
56-
${C_FLAGS} ${LIBRARIES} ${HEADERS} --output=${OUT_FILE}")
56+
set(HEADERS)
57+
foreach(HDR ${HDRS})
58+
list(APPEND HEADERS "${OUTDIR}/${GRASS_INSTALL_INCLUDEDIR}/grass/${HDR}")
59+
endforeach()
60+
61+
message(STATUS "Generating ${OUT_FILE}")
5762
execute_process(
5863
COMMAND
59-
${PYTHON_EXECUTABLE} ${CTYPESGEN_PY} --cpp=${CTYPESFLAGS}
60-
--no-embed-preamble --strip-build-path ${RUNTIME_GISBASE} ${SYSHEADERS}
61-
--includedir="${OUTDIR}/${GRASS_INSTALL_INCLUDEDIR}" ${C_FLAGS} ${LIBRARIES}
62-
${HEADERS} --output=${OUT_FILE}
64+
${PYTHON_EXECUTABLE} ${CTYPESGEN_PY} --cpp "${CTYPESFLAGS}"
65+
--no-embed-preamble --strip-build-path ${RUNTIME_GISBASE} ${INC_HEADERS}
66+
${LIBRARIES} ${DEFINES} -o ${OUT_FILE} ${HEADERS}
6367
OUTPUT_VARIABLE ctypesgen_OV
6468
ERROR_VARIABLE ctypesgen_EV
65-
RESULT_VARIABLE ctypesgen_RV)
69+
RESULT_VARIABLE ctypesgen_RV COMMAND_ECHO STDOUT)
70+
6671
if(ctypesgen_RV)
67-
message(FATAL_ERROR "ctypesgen.py: ${ctypesgen_EV} \n ${ctypesgen_OV}")
72+
message(FATAL_ERROR "${CTYPESGEN_PY}: ${ctypesgen_EV} \n ${ctypesgen_OV}")
6873
endif()

lib/init/CMakeLists.txt

-9
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,6 @@ set(DLL_PATH_LIST)
7676
list(APPEND DLL_PATH_LIST ${grass_dll_dir})
7777
separate_arguments(DLL_PATH_LIST)
7878

79-
set(LD_LIBRARY_PATH_VAR)
80-
if(UNIX OR MINGW)
81-
if(DEFINED ENV{LD_LIBRARY_PATH})
82-
set(LD_LIBRARY_PATH_VAR
83-
"${OUTDIR}/${GRASS_INSTALL_LIBDIR}:$ENV{LD_LIBRARY_PATH}")
84-
else()
85-
set(LD_LIBRARY_PATH_VAR "${OUTDIR}/${GRASS_INSTALL_LIBDIR}")
86-
endif()
87-
endif()
8879
message(STATUS "GISBASE (build) : ${GISBASE_DIR}")
8980
message(STATUS "grass config directory (build): ${grass_config_dir}")
9081

python/libgrass_interface_generator/CMakeLists.txt

+33-16
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
#[[
2+
COPYRIGHT: (c) 2020-2025 by the GRASS Development Team
3+
SPDX-License-Identifier: GPL-2.0-or-later
4+
]]
5+
16
set(MODULES
27
date
38
gis
@@ -49,9 +54,15 @@ set(stats_HDRS stats.h defs/stats.h)
4954
set(raster3d_HDRS raster3d.h defs/raster3d.h)
5055
set(cluster_HDRS cluster.h defs/cluster.h)
5156

52-
set(proj_SYSHDRS ${PROJ_INCLUDE_DIR} ${GDAL_INCLUDE_DIR})
53-
set(vector_SYSHDRS ${PostgreSQL_INCLUDE_DIR} ${GDAL_INCLUDE_DIR})
54-
set(vedit_SYSHDRS ${PostgreSQL_INCLUDE_DIR} ${GDAL_INCLUDE_DIR})
57+
set(proj_INCHDRS ${PROJ_INCLUDE_DIRS} ${GDAL_INCLUDE_DIRS})
58+
set(vector_INCHDRS ${PostgreSQL_INCLUDE_DIRS} ${GDAL_INCLUDE_DIRS})
59+
set(vedit_INCHDRS ${PostgreSQL_INCLUDE_DIRS} ${GDAL_INCLUDE_DIRS})
60+
61+
set(_c_flags ${CMAKE_C_FLAGS})
62+
if(APPLE AND CMAKE_OSX_SYSROOT)
63+
string(APPEND _c_flags " --sysroot ${CMAKE_OSX_SYSROOT}")
64+
message("_c_flags")
65+
endif()
5566

5667
foreach(module ${MODULES})
5768
if(NOT ${module}_LIBS)
@@ -62,19 +73,18 @@ foreach(module ${MODULES})
6273
message(FATAL_ERROR "${module}_HDRS is not set")
6374
endif()
6475

65-
if(NOT ${module}_SYSHDRS)
66-
set(${module}_SYSHDRS})
76+
if(NOT ${module}_INCHDRS)
77+
set(${module}_INCHDRS})
6778
endif()
68-
list(INSERT ${module}_SYSHDRS 0 ${CMAKE_INSTALL_PREFIX})
69-
list(REMOVE_DUPLICATES ${module}_SYSHDRS)
70-
71-
#[[
72-
foreach(${module}_LIB ${${module}_LIBS})
73-
if(NOT TARGET ${${module}_LIB})
74-
message(FATAL_ERROR "${${module}_LIB} is not a target")
75-
endif()
76-
endforeach()
77-
]]
79+
list(INSERT ${module}_INCHDRS 0 ${OUTDIR}/${GRASS_INSTALL_INCLUDEDIR})
80+
if(CMAKE_INSTALL_INCLUDEDIR)
81+
list(INSERT ${module}_INCHDRS 0
82+
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR})
83+
endif()
84+
if(CMAKE_PREFIX_PATH)
85+
list(INSERT ${module}_INCHDRS 0 ${CMAKE_PREFIX_PATH})
86+
endif()
87+
list(REMOVE_DUPLICATES ${module}_INCHDRS)
7888

7989
if(NOT ${module}_TARGET_NAME)
8090
list(GET ${module}_LIBS 0 first_lib)
@@ -93,7 +103,7 @@ foreach(module ${MODULES})
93103
${CMAKE_COMMAND} -DCTYPESGEN_PY=${CMAKE_CURRENT_SOURCE_DIR}/run.py
94104
-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE} -DCOMPILER=${CMAKE_C_COMPILER}
95105
"-DHDRS=${${module}_HDRS}" "-DLIBS=${${module}_LIBS}" -DOUTDIR=${OUTDIR}
96-
"-DSYSHDRS=${${module}_SYSHDRS}" -DC_FLAGS=${CMAKE_C_FLAGS}
106+
"-DINCHDRS=${${module}_INCHDRS}" -DC_FLAGS=${_c_flags}
97107
-DGRASS_INSTALL_INCLUDEDIR=${GRASS_INSTALL_INCLUDEDIR}
98108
-DGRASS_INSTALL_SCRIPTDIR=${GRASS_INSTALL_SCRIPTDIR}
99109
-DGRASS_INSTALL_DEMODIR=${GRASS_INSTALL_DEMODIR}
@@ -111,3 +121,10 @@ foreach(module ${MODULES})
111121
install(FILES ${output_file} DESTINATION ${GRASS_INSTALL_PYDIR}/grass/lib)
112122

113123
endforeach()
124+
125+
file(COPY_FILE libgrass__init__.py
126+
${OUTDIR}/${GRASS_INSTALL_PYDIR}/grass/lib/__init__.py)
127+
install(FILES ${OUTDIR}/${GRASS_INSTALL_PYDIR}/grass/lib/__init__.py
128+
DESTINATION ${GRASS_INSTALL_PYDIR}/grass/lib)
129+
130+
unset(_c_flags)

0 commit comments

Comments
 (0)