Skip to content

Commit 8838e52

Browse files
authored
Merge pull request #1933 from Shaikh-Ubaid/pythoncall_suggestions
PythonCall: Add separate CI and rename flag to --link-numpy
2 parents 38cd377 + 56db034 commit 8838e52

File tree

6 files changed

+115
-78
lines changed

6 files changed

+115
-78
lines changed

.github/workflows/CI.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,46 @@ jobs:
290290
cd integration_tests
291291
./run_tests.py -b llvm
292292
./run_tests.py -b c
293+
294+
cpython_interop:
295+
name: Test CPython Interop (@pythoncall)
296+
runs-on: ubuntu-latest
297+
steps:
298+
- uses: actions/checkout@v3
299+
with:
300+
fetch-depth: 0
301+
302+
- uses: mamba-org/setup-micromamba@v1
303+
with:
304+
environment-file: ci/environment.yml
305+
create-args: >-
306+
python=3.10
307+
bison=3.4
308+
309+
- uses: hendrikmuhs/ccache-action@main
310+
with:
311+
variant: sccache
312+
key: ${{ github.job }}-${{ matrix.os }}
313+
314+
- name: Build Linux
315+
shell: bash -l {0}
316+
run: |
317+
./build0.sh
318+
cmake . -GNinja \
319+
-DCMAKE_BUILD_TYPE=Debug \
320+
-DWITH_LLVM=yes \
321+
-DLFORTRAN_BUILD_ALL=yes \
322+
-DWITH_STACKTRACE=no \
323+
-DWITH_RUNTIME_STACKTRACE=yes \
324+
-DCMAKE_PREFIX_PATH="$CONDA_PREFIX" \
325+
-DCMAKE_INSTALL_PREFIX=`pwd`/inst \
326+
-DCMAKE_C_COMPILER_LAUNCHER=sccache \
327+
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache
328+
329+
cmake --build . -j16 --target install
330+
331+
- name: Test Linux
332+
shell: bash -l {0}
333+
run: |
334+
cd integration_tests
335+
./run_tests.py -b cpython_py c_py

integration_tests/CMakeLists.txt

Lines changed: 63 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,10 @@ message("LPYTHON_RTLIB_DIR: ${LPYTHON_RTLIB_DIR}")
7373
message("LPYTHON_RTLIB_LIBRARY: ${LPYTHON_RTLIB_LIBRARY}")
7474

7575

76-
macro(RUN_UTIL RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_IMPORT_PATH RUN_LABELS RUN_ENABLE_CPYTHON RUN_EXTRAFILES RUN_EXTRA_ARGS)
76+
macro(RUN_UTIL RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_LABELS RUN_ENABLE_CPYTHON RUN_EXTRAFILES RUN_EXTRA_ARGS)
7777
set(fail ${${RUN_FAIL}})
7878
set(name ${${RUN_NAME}})
7979
set(file_name ${${RUN_FILE_NAME}})
80-
set(import_path ${${RUN_IMPORT_PATH}})
8180
set(labels ${${RUN_LABELS}})
8281
set(run_enable_cpython ${${RUN_ENABLE_CPYTHON}})
8382
set(extra_files ${${RUN_EXTRAFILES}})
@@ -89,19 +88,11 @@ macro(RUN_UTIL RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_IMPORT_PATH RUN_LABELS RUN_EN
8988

9089
if (${KIND} IN_LIST labels)
9190
if (KIND STREQUAL "llvm")
92-
if (import_path)
93-
add_custom_command(
94-
OUTPUT ${name}.o
95-
COMMAND ${LPYTHON} -c -I ${CMAKE_CURRENT_SOURCE_DIR}/${import_path} ${extra_args} ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py -o ${name}.o
96-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py
97-
VERBATIM)
98-
else ()
99-
add_custom_command(
100-
OUTPUT ${name}.o
101-
COMMAND ${LPYTHON} -c ${extra_args} ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py -o ${name}.o
102-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py
103-
VERBATIM)
104-
endif()
91+
add_custom_command(
92+
OUTPUT ${name}.o
93+
COMMAND ${LPYTHON} -c ${extra_args} ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py -o ${name}.o
94+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py
95+
VERBATIM)
10596
add_executable(${name} ${name}.o ${extra_files})
10697
set_target_properties(${name} PROPERTIES LINKER_LANGUAGE C)
10798
target_link_libraries(${name} lpython_rtlib)
@@ -113,30 +104,34 @@ macro(RUN_UTIL RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_IMPORT_PATH RUN_LABELS RUN_EN
113104
set_tests_properties(${name} PROPERTIES WILL_FAIL TRUE)
114105
endif()
115106
elseif(KIND STREQUAL "c")
116-
if (import_path)
117-
add_custom_command(
118-
OUTPUT ${name}.c
119-
COMMAND ${LPYTHON} ${extra_args} -I ${CMAKE_CURRENT_SOURCE_DIR}/${import_path} --show-c ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py > ${name}.c
120-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py
121-
VERBATIM)
122-
else ()
123-
add_custom_command(
124-
OUTPUT ${name}.c
125-
COMMAND ${LPYTHON} ${extra_args} --show-c ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py > ${name}.c
126-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py
127-
VERBATIM)
128-
endif()
129-
107+
add_custom_command(
108+
OUTPUT ${name}.c
109+
COMMAND ${LPYTHON} ${extra_args} --show-c ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py > ${name}.c
110+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py
111+
VERBATIM)
130112
add_executable(${name} ${name}.c ${extra_files})
131113
target_include_directories(${name} PRIVATE ${CMAKE_SOURCE_DIR})
132114
set_target_properties(${name} PROPERTIES LINKER_LANGUAGE C)
133115
target_link_libraries(${name} lpython_rtlib)
134-
if (run_enable_cpython)
135-
target_include_directories(${name} PRIVATE ${NUMPY_INCLUDE_DIR})
136-
target_link_libraries(${name} Python::Python)
137-
if (extra_files)
138-
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/${extra_files} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
139-
endif()
116+
add_test(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name})
117+
if (labels)
118+
set_tests_properties(${name} PROPERTIES LABELS "${labels}")
119+
endif()
120+
if (${fail})
121+
set_tests_properties(${name} PROPERTIES WILL_FAIL TRUE)
122+
endif()
123+
elseif(KIND STREQUAL "c_py")
124+
add_custom_command(
125+
OUTPUT ${name}.c
126+
COMMAND ${LPYTHON} ${extra_args} --show-c ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py > ${name}.c
127+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file_name}.py
128+
VERBATIM)
129+
add_executable(${name} ${name}.c ${extra_files})
130+
target_include_directories(${name} PRIVATE ${CMAKE_SOURCE_DIR} ${NUMPY_INCLUDE_DIR})
131+
set_target_properties(${name} PROPERTIES LINKER_LANGUAGE C)
132+
target_link_libraries(${name} lpython_rtlib Python::Python)
133+
if (extra_files)
134+
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/${extra_files} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
140135
endif()
141136
add_test(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name})
142137
if (labels)
@@ -145,7 +140,7 @@ macro(RUN_UTIL RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_IMPORT_PATH RUN_LABELS RUN_EN
145140
if (${fail})
146141
set_tests_properties(${name} PROPERTIES WILL_FAIL TRUE)
147142
endif()
148-
elseif(KIND STREQUAL "cpython")
143+
elseif((KIND STREQUAL "cpython") OR (KIND STREQUAL "cpython_py"))
149144
# CPython test
150145
if (extra_files)
151146
set(PY_MOD "${name}_mod")
@@ -243,7 +238,7 @@ macro(RUN_UTIL RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_IMPORT_PATH RUN_LABELS RUN_EN
243238
endmacro(RUN_UTIL)
244239

245240
macro(RUN)
246-
set(options FAIL NOFAST ENABLE_CPYTHON ENABLE_CNUMPY)
241+
set(options FAIL NOFAST ENABLE_CPYTHON LINK_NUMPY)
247242
set(oneValueArgs NAME IMPORT_PATH)
248243
set(multiValueArgs LABELS EXTRAFILES)
249244
cmake_parse_arguments(RUN "${options}" "${oneValueArgs}"
@@ -252,21 +247,28 @@ macro(RUN)
252247
set(RUN_EXTRA_ARGS "")
253248
set(RUN_FILE_NAME ${RUN_NAME})
254249

250+
if (RUN_LINK_NUMPY)
251+
set(RUN_EXTRA_ARGS ${RUN_EXTRA_ARGS} --link-numpy)
252+
set(RUN_ENABLE_CPYTHON TRUE)
253+
endif()
254+
255255
if (RUN_ENABLE_CPYTHON)
256256
set(RUN_EXTRA_ARGS ${RUN_EXTRA_ARGS} --enable-cpython)
257257
endif()
258258

259-
if (RUN_ENABLE_CNUMPY)
260-
set(RUN_EXTRA_ARGS ${RUN_EXTRA_ARGS} --enable-cnumpy)
259+
if (RUN_IMPORT_PATH)
260+
# Only one import path supported for now
261+
# Later add support for multiple import paths by looping over and appending to extra args
262+
set(RUN_EXTRA_ARGS ${RUN_EXTRA_ARGS} -I${CMAKE_CURRENT_SOURCE_DIR}/${RUN_IMPORT_PATH})
261263
endif()
262264

263-
RUN_UTIL(RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_IMPORT_PATH RUN_LABELS RUN_ENABLE_CPYTHON RUN_EXTRAFILES RUN_EXTRA_ARGS)
265+
RUN_UTIL(RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_LABELS RUN_ENABLE_CPYTHON RUN_EXTRAFILES RUN_EXTRA_ARGS)
264266

265267
if ((NOT DISABLE_FAST) AND (NOT RUN_NOFAST))
266268
set(RUN_EXTRA_ARGS ${RUN_EXTRA_ARGS} --fast)
267269
set(RUN_NAME "${RUN_NAME}_FAST")
268-
list(REMOVE_ITEM RUN_LABELS cpython) # remove cpython from --fast test
269-
RUN_UTIL(RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_IMPORT_PATH RUN_LABELS RUN_ENABLE_CPYTHON RUN_EXTRAFILES RUN_EXTRA_ARGS)
270+
list(REMOVE_ITEM RUN_LABELS cpython cpython_py) # remove cpython, cpython_py from --fast test
271+
RUN_UTIL(RUN_FAIL RUN_NAME RUN_FILE_NAME RUN_LABELS RUN_ENABLE_CPYTHON RUN_EXTRAFILES RUN_EXTRA_ARGS)
270272
endif()
271273
endmacro(RUN)
272274

@@ -280,43 +282,31 @@ macro(COMPILE)
280282
cmake_parse_arguments(COMPILE "${options}" "${oneValueArgs}"
281283
"${multiValueArgs}" ${ARGN} )
282284
set(name ${COMPILE_NAME})
283-
set(import_path ${COMPILE_IMPORT_PATH})
284285
if (NOT name)
285286
message(FATAL_ERROR "Must specify the NAME argument")
286287
endif()
287288

289+
set(extra_args "")
290+
if (COMPILE_IMPORT_PATH)
291+
# Only one import path supported for now
292+
# Later add support for multiple import paths by looping over and appending to extra args
293+
set(extra_args ${extra_args} -I${CMAKE_CURRENT_SOURCE_DIR}/${COMPILE_IMPORT_PATH})
294+
endif()
295+
288296
if (${KIND} IN_LIST COMPILE_LABELS)
289297
if (KIND STREQUAL "llvm")
290-
if (import_path)
291-
add_custom_command(
292-
OUTPUT ${name}.o
293-
COMMAND ${LPYTHON} --disable-main -c -I ${CMAKE_CURRENT_SOURCE_DIR}/${import_path} ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py -o ${name}.o
294-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py
295-
VERBATIM)
296-
else ()
297-
add_custom_command(
298-
OUTPUT ${name}.o
299-
COMMAND ${LPYTHON} --disable-main -c ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py -o ${name}.o
300-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py
301-
VERBATIM)
302-
endif()
303-
298+
add_custom_command(
299+
OUTPUT ${name}.o
300+
COMMAND ${LPYTHON} ${extra_args} --disable-main -c ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py -o ${name}.o
301+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py
302+
VERBATIM)
304303
add_library(${name} OBJECT ${name}.o)
305304
elseif(KIND STREQUAL "c")
306-
if (import_path)
307-
add_custom_command(
308-
OUTPUT ${name}.c
309-
COMMAND ${LPYTHON} --disable-main -I ${CMAKE_CURRENT_SOURCE_DIR}/${import_path} --show-c ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py > ${name}.c
310-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py
311-
VERBATIM)
312-
else ()
313-
add_custom_command(
314-
OUTPUT ${name}.c
315-
COMMAND ${LPYTHON} --disable-main --show-c ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py > ${name}.c
316-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py
317-
VERBATIM)
318-
endif()
319-
305+
add_custom_command(
306+
OUTPUT ${name}.c
307+
COMMAND ${LPYTHON} ${extra_args} --disable-main --show-c ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py > ${name}.c
308+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.py
309+
VERBATIM)
320310
add_library(${name} OBJECT ${name}.c)
321311
target_link_libraries(${name} lpython_rtlib)
322312
elseif(KIND STREQUAL "cpython")
@@ -515,8 +505,8 @@ RUN(NAME bindc_05 LABELS llvm c
515505
EXTRAFILES bindc_05b.c)
516506
RUN(NAME bindc_06 LABELS llvm c
517507
EXTRAFILES bindc_06b.c)
518-
RUN(NAME bindpy_01 LABELS cpython c ENABLE_CPYTHON NOFAST EXTRAFILES bindpy_01_module.py)
519-
RUN(NAME bindpy_02 LABELS cpython c ENABLE_CPYTHON ENABLE_CNUMPY EXTRAFILES bindpy_02_module.py)
508+
RUN(NAME bindpy_01 LABELS cpython_py c_py ENABLE_CPYTHON NOFAST EXTRAFILES bindpy_01_module.py)
509+
RUN(NAME bindpy_02 LABELS cpython_py c_py LINK_NUMPY EXTRAFILES bindpy_02_module.py)
520510
RUN(NAME test_generics_01 LABELS cpython llvm c NOFAST)
521511
RUN(NAME test_cmath LABELS cpython llvm c NOFAST)
522512
RUN(NAME test_complex_01 LABELS cpython llvm c wasm wasm_x64)

integration_tests/run_tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
# Initialization
88
DEFAULT_THREADS_TO_USE = 8 # default no of threads is 8
9-
SUPPORTED_BACKENDS = ['llvm', 'c', 'wasm', 'cpython', 'x86', 'wasm_x86', 'wasm_x64']
9+
SUPPORTED_BACKENDS = ['llvm', 'c', 'wasm', 'cpython', 'x86', 'wasm_x86', 'wasm_x64', 'c_py', 'cpython_py']
1010
BASE_DIR = os.path.dirname(os.path.realpath(__file__))
1111
LPYTHON_PATH = f"{BASE_DIR}/../src/bin"
1212

src/bin/lpython.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,7 @@ int link_executable(const std::vector<std::string> &infiles,
12491249
if (compiler_options.enable_cpython) {
12501250
std::string py_version = "3.10";
12511251
std::string py_flags = R"(-I $CONDA_PREFIX/include/python)" + py_version + R"( -L$CONDA_PREFIX/lib -Wl,-rpath -Wl,$CONDA_PREFIX/lib -lpython)" + py_version + R"()";
1252-
if (compiler_options.enable_cnumpy) {
1252+
if (compiler_options.link_numpy) {
12531253
py_flags += R"( -I$CONDA_PREFIX/lib/python)" + py_version + R"(/site-packages/numpy/core/include)";
12541254
}
12551255
cmd += " " + py_flags;
@@ -1565,7 +1565,7 @@ int main(int argc, char *argv[])
15651565
app.add_flag("--get-rtl-dir", print_rtl_dir, "Print the path to the runtime library file");
15661566
app.add_flag("--verbose", compiler_options.verbose, "Print debugging statements");
15671567
app.add_flag("--enable-cpython", compiler_options.enable_cpython, "Enable CPython runtime");
1568-
app.add_flag("--enable-cnumpy", compiler_options.enable_cnumpy, "Enable C-Numpy runtime");
1568+
app.add_flag("--link-numpy", compiler_options.link_numpy, "Enable NumPy runtime (implies --enable-cpython)");
15691569

15701570
// LSP specific options
15711571
app.add_flag("--show-errors", show_errors, "Show errors when LSP is running in the background");
@@ -1613,6 +1613,10 @@ int main(int argc, char *argv[])
16131613
compiler_options.enable_bounds_checking = true;
16141614
}
16151615

1616+
if (compiler_options.link_numpy) {
1617+
compiler_options.enable_cpython = true;
1618+
}
1619+
16161620
if (arg_version) {
16171621
std::string version = LFORTRAN_VERSION;
16181622
std::cout << "LPython version: " << version << std::endl;

src/libasr/codegen/asr_to_c.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ R"(
934934
body += "\n";
935935
}
936936

937-
if (compiler_options.enable_cnumpy) {
937+
if (compiler_options.link_numpy) {
938938
user_defines.insert("NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION");
939939
headers.insert("numpy/arrayobject.h");
940940
body +=

src/libasr/utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct CompilerOptions {
5959
bool verbose = false;
6060
bool pass_cumulative = false;
6161
bool enable_cpython = false;
62-
bool enable_cnumpy = false;
62+
bool link_numpy = false;
6363
std::vector<std::string> import_paths;
6464
Platform platform;
6565

0 commit comments

Comments
 (0)