Examples
Makefile
[tool.just-buildit]
command = "make"
TARGET := $(JUST_BUILDIT_OUTPUT_DIR)/$(JUST_BUILDIT_NAME)$(JUST_BUILDIT_EXT_SUFFIX)
all: $(TARGET)
$(TARGET):
$(CC) $(JUST_BUILDIT_LDFLAGS) \
-I$(JUST_BUILDIT_INCLUDE_DIR) \
src/mylib/mylib.c \
-o $(TARGET) \
$(JUST_BUILDIT_LIBS)
CMake
[tool.just-buildit]
command = "make pyext"
pyext:
cmake -B _build -DPython3_EXECUTABLE=$(JUST_BUILDIT_PYTHON)
cmake --build _build --target mylib
find _build -maxdepth 3 -name "$(JUST_BUILDIT_NAME)$(JUST_BUILDIT_EXT_SUFFIX)" \
-exec cp {} $(JUST_BUILDIT_OUTPUT_DIR)/ \;
.PHONY: pyext
# CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(mylib C)
find_package(Python3 COMPONENTS Development.Module REQUIRED)
Python3_add_library(mylib MODULE src/mylib.c)
set_target_properties(mylib PROPERTIES
OUTPUT_NAME "$ENV{JUST_BUILDIT_NAME}"
SUFFIX "$ENV{JUST_BUILDIT_EXT_SUFFIX}"
PREFIX "")
Meson
[tool.just-buildit]
command = "make pyext"
pyext:
meson setup _build --reconfigure -Dbuildtype=release
meson compile -C _build
find _build -name "*$(JUST_BUILDIT_EXT_SUFFIX)" \
-exec cp {} $(JUST_BUILDIT_OUTPUT_DIR)/ \;
# meson.build
project('mylib', 'c')
py = import('python').find_installation()
py.extension_module('mylib', 'src/mylib.c', install: false)
Mixed pure Python + C extension
A package with a Python API wrapping a C core:
src/mylib/
__init__.py # pure Python
utils.py # pure Python
_core.c # C extension
[tool.just-buildit]
command = "make"
EXT := $(JUST_BUILDIT_OUTPUT_DIR)/mylib/_core$(JUST_BUILDIT_EXT_SUFFIX)
all: $(EXT)
cp src/mylib/*.py $(JUST_BUILDIT_OUTPUT_DIR)/mylib/
$(EXT):
mkdir -p $(JUST_BUILDIT_OUTPUT_DIR)/mylib
$(CC) $(JUST_BUILDIT_LDFLAGS) \
-I$(JUST_BUILDIT_INCLUDE_DIR) \
src/mylib/_core.c \
-o $(EXT) \
$(JUST_BUILDIT_LIBS)
import mylib loads the Python package; mylib._core is the compiled
extension — both land in the wheel from a single $JUST_BUILDIT_OUTPUT_DIR.