Skip to content

Commit f80c79f

Browse files
committed
Make build of C API and libbz2 reusable
1 parent 8f8f259 commit f80c79f

File tree

2 files changed

+64
-71
lines changed

2 files changed

+64
-71
lines changed

graalpython/com.oracle.graal.python.cext/CMakeLists.txt

Lines changed: 53 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,22 @@ cmake_minimum_required(VERSION 3.22)
3030
project(com.oracle.graal.python.cext)
3131

3232
function(require_var var)
33-
if (NOT ${var})
34-
message(FATAL_ERROR "${var} needs to be set")
35-
endif()
36-
endfunction()
37-
38-
function(check_var var)
39-
set(${var} PARENT_SCOPE)
40-
require_var(${var})
33+
if (NOT DEFINED ${var})
34+
message(FATAL_ERROR "${var} needs to be set")
35+
endif()
4136
endfunction()
4237

43-
# set variable from environement variable if the latter exists
44-
function(setFromEnv varname envname)
45-
if(DEFINED ENV{${envname}})
46-
set(${varname} $ENV{${envname}} PARENT_SCOPE)
47-
endif()
48-
endfunction()
38+
if(WIN32)
39+
require_var(GRAALVM_LLVM_LIB_DIR)
40+
endif()
41+
require_var(TRUFFLE_H_INC)
42+
require_var(GRAALPY_EXT)
4943

50-
require_var(LLVM_MODE)
51-
require_var(BZ2_LIB_DIR)
44+
if(NOT DEFINED SRC_DIR)
45+
set(SRC_DIR ".")
46+
endif()
5247

5348
set(TARGET_LIBPYTHON "python")
54-
set(LIB_OUTPUT_DIR "${PROJECT_OUTPUT_DIR}/lib")
5549

5650
######################################################################
5751
# common variables and compile/link options (for all build targets)
@@ -92,29 +86,32 @@ endif()
9286
# don't install into the system but into the MX project's output dir
9387
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
9488

95-
check_var(GRAALVM_LLVM_LIB_DIR)
96-
check_var(TRUFFLE_H_INC)
97-
98-
require_var(GRAALPY_EXT)
89+
set(CAPI_SRC "${SRC_DIR}/src")
9990

10091
# using glob patterns is not recommended: https://cmake.org/cmake/help/latest/command/file.html#glob
101-
set(SRC_FILES src/codecs.c src/setobject.c src/compile.c src/thread.c src/moduleobject.c src/preconfig.c
102-
src/getbuildinfo.c src/object.c src/dtoa.c src/pystrhex.c src/capi.c src/complexobject.c src/capsule.c
103-
src/typeobject.c src/obmalloc.c src/descrobject.c src/memoryobject.c src/traceback.c src/unicodeobject.c
104-
src/pythonrun.c src/funcobject.c src/codeobject.c src/unicodectype.c src/structseq.c src/import.c
105-
src/pytime.c src/bytearrayobject.c src/listobject.c src/bytesobject.c src/object_shared.c src/longobject.c
106-
src/sysmodule.c src/pystrtod.c src/tupleobject.c src/iterobject.c src/sliceobject.c src/classobject.c
107-
src/floatobject.c src/namespaceobject.c src/_warnings.c src/dictobject.c src/pystate.c src/mysnprintf.c
108-
src/ceval.c src/getcompiler.c src/pyhash.c src/fileutils.c src/descrobject_shared.c src/modsupport.c
109-
src/context.c src/abstract.c src/frameobject.c src/posixmodule.c src/longobject_shared.c src/exceptions.c
110-
src/pyctype.c src/typeobject_shared.c src/mystrtoul.c src/weakrefobject.c src/modsupport_shared.c
111-
src/fileobject.c src/pystrcmp.c src/getversion.c src/genobject.c src/methodobject.c src/boolobject.c
112-
src/pylifecycle.c src/errors.c src/signals.c src/datetime.c
92+
set(SRC_FILES ${CAPI_SRC}/codecs.c ${CAPI_SRC}/setobject.c ${CAPI_SRC}/compile.c ${CAPI_SRC}/thread.c
93+
${CAPI_SRC}/moduleobject.c ${CAPI_SRC}/preconfig.c ${CAPI_SRC}/getbuildinfo.c ${CAPI_SRC}/object.c
94+
${CAPI_SRC}/dtoa.c ${CAPI_SRC}/pystrhex.c ${CAPI_SRC}/capi.c ${CAPI_SRC}/complexobject.c
95+
${CAPI_SRC}/capsule.c ${CAPI_SRC}/typeobject.c ${CAPI_SRC}/obmalloc.c ${CAPI_SRC}/descrobject.c
96+
${CAPI_SRC}/memoryobject.c ${CAPI_SRC}/traceback.c ${CAPI_SRC}/unicodeobject.c ${CAPI_SRC}/pythonrun.c
97+
${CAPI_SRC}/funcobject.c ${CAPI_SRC}/codeobject.c ${CAPI_SRC}/unicodectype.c ${CAPI_SRC}/structseq.c
98+
${CAPI_SRC}/import.c ${CAPI_SRC}/pytime.c ${CAPI_SRC}/bytearrayobject.c ${CAPI_SRC}/listobject.c
99+
${CAPI_SRC}/bytesobject.c ${CAPI_SRC}/object_shared.c ${CAPI_SRC}/longobject.c ${CAPI_SRC}/sysmodule.c
100+
${CAPI_SRC}/pystrtod.c ${CAPI_SRC}/tupleobject.c ${CAPI_SRC}/iterobject.c ${CAPI_SRC}/sliceobject.c
101+
${CAPI_SRC}/classobject.c ${CAPI_SRC}/floatobject.c ${CAPI_SRC}/namespaceobject.c ${CAPI_SRC}/_warnings.c
102+
${CAPI_SRC}/dictobject.c ${CAPI_SRC}/pystate.c ${CAPI_SRC}/mysnprintf.c ${CAPI_SRC}/ceval.c
103+
${CAPI_SRC}/getcompiler.c ${CAPI_SRC}/pyhash.c ${CAPI_SRC}/fileutils.c ${CAPI_SRC}/descrobject_shared.c
104+
${CAPI_SRC}/modsupport.c ${CAPI_SRC}/context.c ${CAPI_SRC}/abstract.c ${CAPI_SRC}/frameobject.c
105+
${CAPI_SRC}/posixmodule.c ${CAPI_SRC}/longobject_shared.c ${CAPI_SRC}/exceptions.c ${CAPI_SRC}/pyctype.c
106+
${CAPI_SRC}/typeobject_shared.c ${CAPI_SRC}/mystrtoul.c ${CAPI_SRC}/weakrefobject.c
107+
${CAPI_SRC}/modsupport_shared.c ${CAPI_SRC}/fileobject.c ${CAPI_SRC}/pystrcmp.c ${CAPI_SRC}/getversion.c
108+
${CAPI_SRC}/genobject.c ${CAPI_SRC}/methodobject.c ${CAPI_SRC}/boolobject.c ${CAPI_SRC}/pylifecycle.c
109+
${CAPI_SRC}/errors.c ${CAPI_SRC}/signals.c ${CAPI_SRC}/datetime.c
113110
)
114111

115112
include_directories(
116-
"src"
117-
"include"
113+
${CAPI_SRC}
114+
"${SRC_DIR}/include"
118115
"${TRUFFLE_H_INC}"
119116
)
120117

@@ -126,7 +123,7 @@ function(native_module name core src_files)
126123
endif()
127124
if(${core})
128125
target_compile_definitions(${name} PRIVATE Py_BUILD_CORE)
129-
target_include_directories(${name} PRIVATE "include/internal")
126+
target_include_directories(${name} PRIVATE "${SRC_DIR}/include/internal")
130127
endif()
131128
set_target_properties(${name} PROPERTIES SUFFIX "${GRAALPY_EXT}")
132129
set_target_properties(${name} PROPERTIES PREFIX "")
@@ -135,13 +132,9 @@ function(native_module name core src_files)
135132
endfunction()
136133

137134
function(simple_native_module name)
138-
native_module(${name} TRUE "modules/${name}.c")
135+
native_module(${name} TRUE "${SRC_DIR}/modules/${name}.c")
139136
endfunction()
140137

141-
#file(GLOB_RECURSE GLOBBED_SRC_FILES
142-
# LIST_DIRECTORIES FALSE
143-
# "src/*.c")
144-
145138
######################################################################
146139
# BUILD TARGETS
147140
######################################################################
@@ -153,33 +146,34 @@ simple_native_module("_cpython_unicodedata")
153146
simple_native_module("_cpython_struct")
154147

155148
if(NOT WIN32)
156-
native_module("_testcapi" FALSE "modules/_testcapi.c")
149+
native_module("_testcapi" FALSE "${SRC_DIR}/modules/_testcapi.c")
157150
simple_native_module("_testmultiphase")
158151
simple_native_module("_ctypes_test")
159152

160153
###################### BZIP2 ########################
161-
set(TARGET_BZ2 "_bz2")
162-
simple_native_module(${TARGET_BZ2})
163-
set_target_properties(${TARGET_BZ2} PROPERTIES
164-
# BUILD_WITH_INSTALL_RPATH FALSE
165-
# BUILD_RPATH_USE_ORIGIN TRUE
166-
BUILD_RPATH "../lib/${LLVM_MODE}/"
167-
)
168-
target_link_directories(${TARGET_BZ2} PRIVATE "${BZ2_LIB_DIR}")
169-
target_link_libraries(${TARGET_BZ2} bz2)
154+
if(DEFINED LIBBZ2_BUILD_FILE)
155+
include("${LIBBZ2_BUILD_FILE}")
156+
set(TARGET_BZ2 "_bz2")
157+
simple_native_module(${TARGET_BZ2})
158+
# variable 'BZIP2_SRC' is defined in file 'LIBBZ2_BUILD_FILE'
159+
target_include_directories(${TARGET_BZ2} PRIVATE ${BZIP2_SRC})
160+
# variable 'TARGET_LIBBZ2' is defined in file 'LIBBZ2_BUILD_FILE'
161+
target_link_libraries(${TARGET_BZ2} ${TARGET_LIBBZ2})
162+
endif()
170163

171164

172165
###################### PYEXPAT ######################
173166
set(TARGET_PYEXPAT "pyexpat")
174167
simple_native_module(${TARGET_PYEXPAT})
168+
set(EXPAT_SRC "${SRC_DIR}/expat")
175169
set(PYEXPAT_HEADERS
176-
"expat/ascii.h" "expat/asciitab.h" "expat/expat.h" "expat/expat_config.h" "expat/expat_external.h"
177-
"expat/internal.h" "expat/latin1tab.h" "expat/utf8tab.h" "expat/xmlrole.h" "expat/xmltok.h"
178-
"expat/xmltok_impl.h"
170+
${EXPAT_SRC}/ascii.h ${EXPAT_SRC}/asciitab.h ${EXPAT_SRC}/expat.h ${EXPAT_SRC}/expat_config.h
171+
${EXPAT_SRC}/expat_external.h ${EXPAT_SRC}/internal.h ${EXPAT_SRC}/latin1tab.h ${EXPAT_SRC}/utf8tab.h
172+
${EXPAT_SRC}/xmlrole.h ${EXPAT_SRC}/xmltok.h ${EXPAT_SRC}/xmltok_impl.h
179173
)
180174
target_sources(${TARGET_PYEXPAT} PRIVATE ${PYEXPAT_HEADERS})
181-
target_sources(${TARGET_PYEXPAT} PRIVATE "expat/xmlparse.c" "expat/xmlrole.c" "expat/xmltok.c")
182-
target_include_directories(${TARGET_PYEXPAT} PRIVATE "expat")
175+
target_sources(${TARGET_PYEXPAT} PRIVATE ${EXPAT_SRC}/xmlparse.c ${EXPAT_SRC}/xmlrole.c ${EXPAT_SRC}/xmltok.c)
176+
target_include_directories(${TARGET_PYEXPAT} PRIVATE ${EXPAT_SRC})
183177
# bpo-30947: Python uses best available entropy sources to call XML_SetHashSalt(),
184178
# expat entropy sources are not needed
185179
target_compile_definitions(${TARGET_PYEXPAT} PRIVATE
@@ -193,23 +187,18 @@ set_target_properties(${TARGET_LIBPYTHON} PROPERTIES SUFFIX "${GRAALPY_EXT}")
193187

194188
target_sources(${TARGET_LIBPYTHON} PRIVATE ${SRC_FILES})
195189
target_include_directories(${TARGET_LIBPYTHON} PRIVATE
196-
"include/internal"
190+
"${SRC_DIR}/include/internal"
197191
)
198192

199193
######################################################################
200194
# target-specific compile and link options
201195
######################################################################
202196

203-
#target_link_directories(${TARGET_LIBPYTHON} PRIVATE ${GRAALVM_LLVM_LIB_DIR})
204-
#target_link_libraries(${TARGET_LIBPYTHON} graalvm-llvm)
205197
target_compile_options(${TARGET_LIBPYTHON} PRIVATE ${CFLAGS_WARNINGS})
206198

207199
if(WIN32)
208-
target_link_libraries(${TARGET_LIBPYTHON} sulong-native)
200+
target_link_directories(${TARGET_LIBPYTHON} PRIVATE ${GRAALVM_LLVM_LIB_DIR})
201+
target_link_libraries(${TARGET_LIBPYTHON} sulong-native graalvm-llvm)
209202
endif()
210203

211-
#if(APPLE)
212-
# target_link_options(${TARGET_LIBPYTHON} PRIVATE -undefined dynamic_lookup)
213-
#endif()
214-
215204
install(TARGETS ${TARGET_LIBPYTHON} DESTINATION bin)

mx.graalpython/suite.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -540,17 +540,16 @@
540540
"vpath" : True,
541541
"ninja_targets" : ["all"],
542542
"ninja_install_targets" : ["install"],
543-
"cmakeConfig" : {
544-
"LLVM_MODE" : "native",
545-
"GRAALVM_LLVM_LIB_DIR" : "<path:SULONG_NATIVE_HOME>/native/lib",
546-
"TRUFFLE_H_INC": "<path:SULONG_LEGACY>/include",
547-
"CMAKE_C_COMPILER": "<toolchainGetToolPath:native,CC>",
548-
"GRAALPY_EXT" : "<graalpy_ext:native>",
549-
},
550543
"os_arch": {
551544
"windows": {
552545
"<others>": {
553546
"defaultBuild": False,
547+
"cmakeConfig" : {
548+
"GRAALVM_LLVM_LIB_DIR" : "<path:SULONG_NATIVE_HOME>/native/lib",
549+
"TRUFFLE_H_INC": "<path:SULONG_LEGACY>/include",
550+
"CMAKE_C_COMPILER": "<toolchainGetToolPath:native,CC>",
551+
"GRAALPY_EXT" : "<graalpy_ext:native>",
552+
},
554553
"results" : [
555554
"bin/libpython<graalpy_ext:native>",
556555
"bin/modules/_mmap<graalpy_ext:native>",
@@ -563,6 +562,11 @@
563562
"<others>": {
564563
"<others>": {
565564
"defaultBuild" : True,
565+
"cmakeConfig" : {
566+
"TRUFFLE_H_INC": "<path:SULONG_LEGACY>/include",
567+
"CMAKE_C_COMPILER": "<toolchainGetToolPath:native,CC>",
568+
"GRAALPY_EXT" : "<graalpy_ext:native>",
569+
},
566570
"results" : [
567571
"bin/libpython<graalpy_ext:native>",
568572
"bin/modules/_mmap<graalpy_ext:native>",

0 commit comments

Comments
 (0)