Building the Shared Library

prik turns Fortran source into a Python extension module. The final module is a native shared library that Python imports directly.

This page continues with scale.f90 from the Common Beginner Workflow.

Build

Run prik on the source file and choose a build directory:

python3 -m prik src/scale.f90 --out-dir build/scale

The shared library and the generated build files are written to build/scale. By default, the module name comes from the source filename. Use --out to choose it explicitly:

python3 -m prik src/scale.f90 --out scale_api --out-dir build/scale_api

Choose a Compiler

GNU Fortran is the default. Use --compiler to choose Intel IFX or LLVM Flang:

# Intel IFX + ICX
python3 -m prik src/scale.f90 \
  --compiler ifx \
  --out scale_ifx \
  --out-dir build/scale_ifx

# LLVM Flang + Clang
python3 -m prik src/scale.f90 \
  --compiler flang \
  --out scale_flang \
  --out-dir build/scale_flang

The executable may be an absolute path or a versioned name such as gfortran-13 or flang-22. Its matching C compiler—gcc, icx, or clang—must also be available. prik keeps both compilers in the same family.

GNU, IFX, and Flang are tested on Linux. See Compiler Toolchains for versions and other recognized options.

Import

Add the build directory to Python's search path, then import the module by its name:

import sys

sys.path.insert(0, "build/scale_api")

import scale_api

The shared-library filename includes a platform- and Python-specific suffix, but the import uses only the module name.

Multiple Source Files

Pass every wrapped source file in one command. Choosing the module name explicitly keeps the result clear:

python3 -m prik src/types.f90 src/solver.f90 \
  --out solver \
  --out-dir build/solver

prik reads module and submodule dependencies from the wrapped sources. Files whose dependencies are ready compile concurrently; independent external procedures can all compile together. The original input order is still used for the final link.

By default, prik uses the CPUs available to the current process. Limit compiler concurrency with --jobs, or select a serial build with --jobs 1:

python3 -m prik src/types.f90 src/solver.f90 \
  --jobs 4 \
  --out solver \
  --out-dir build/solver

Additional native libraries and dependencies outside the supplied wrapped sources remain explicit build inputs; prik does not search for them automatically.

Python callers set jobs=N on build_fortran_extension(...), build_pyi_extension(...), or manifest replay.

Use a Makefile

To inspect or customize the build commands, generate a Makefile without compiling:

python3 -m prik generate --makefile src/scale.f90 --out-dir build/scale

Edit Makefile.prik before running make when customization is needed. Its most useful settings are near the top:

Setting What it changes
FC Fortran compiler
PRIK_LD Command that creates the shared library
PRIK_FFLAGS Extra Fortran compiler flags
PRIK_CFLAGS Extra C binding compiler flags
PRIK_LDFLAGS Extra linker flags

The build targets and commands follow these settings and normally do not need editing. Then build the shared library:

make -f build/scale/Makefile.prik

You can pass the same ordered list of source files used in the previous example. This workflow requires GNU Make.

Compatibility

The shared library is not universal. It must match the target machine's operating system and architecture, Python and NumPy, and required compiler libraries. Rebuilding it on the target machine is the safest choice.