include /ioc/tools/sls_ioc.makefile

# The offline build also creates a build/ directory. Always run the IOC
# build recipe so the source Makefile can check its own dependencies.
.PHONY: default build clean

IOC_STARTUP_FILE := $(notdir $(firstword $(wildcard *_startup.script)))
IOC_PARAMS_FILE := $(notdir $(firstword $(wildcard *_parameters.yaml)))
IOC_NAME ?= $(patsubst %_startup.script,%,$(IOC_STARTUP_FILE))
ifeq ($(IOC_NAME),)
IOC_NAME := $(patsubst %_parameters.yaml,%,$(IOC_PARAMS_FILE))
endif

CPP_LOGIC_ROOT ?= $(abspath ../..)
PYTHON ?= python3
GENERATE_QT ?= 1
IOC_QT_PANEL := qt/$(IOC_NAME)_cpp_logic.ui
IOC_QTGEN := $(CPP_LOGIC_ROOT)/utils/cpp_logic_ioc_qtgen.py
IOC_SUBS_FILE := cfg/libmain.so_cpp_logic.subs

# Python's ctypes library is built locally, independently of the IOC module.
CXX ?= c++
VIEWER_CXXFLAGS ?= -O2 -std=c++17 -Wall -Wextra -pedantic
ifeq ($(shell uname -s),Darwin)
VIEWER_LIBRARY := build/libarm.dylib
VIEWER_SHARED := -dynamiclib
else
VIEWER_LIBRARY := build/libarm.so
VIEWER_SHARED := -shared
endif

.PHONY: viewer-lib
viewer-lib: $(VIEWER_LIBRARY)

$(VIEWER_LIBRARY): src/c_api.cpp src/kinematics.hpp
	mkdir -p $(@D)
	$(CXX) $(VIEWER_CXXFLAGS) -fPIC $(VIEWER_SHARED) -o $@ src/c_api.cpp

.PHONY: pvs ui

pvs:
	$(MAKE) -C src stage

ui: pvs
	if [ "$(GENERATE_QT)" = "1" ]; then $(PYTHON) $(IOC_QTGEN) --input $(IOC_SUBS_FILE) --output $(IOC_QT_PANEL) --pv-prefix "$(IOC_NAME):" --title "$(IOC_NAME) cpp_logic PVs"; fi

# Local numerical checks are independent of the PSI IOC build.
ECMC_ROOT ?= ../ecmc
.PHONY: test test-logic logic
logic: build

build/test_kinematics: tests/test_kinematics.cpp src/kinematics.hpp
	mkdir -p $(@D)
	$(CXX) $(VIEWER_CXXFLAGS) -Isrc -o $@ $<

test: viewer-lib build/test_kinematics
	./build/test_kinematics
	$(PYTHON) python/viewer.py --self-test
	$(PYTHON) tests/test_epics_source.py

build/test_logic: tests/test_logic.cpp src/logic.cpp src/kinematics.hpp
	mkdir -p $(@D)
	$(CXX) $(VIEWER_CXXFLAGS) -I$(ECMC_ROOT)/devEcmcSup/logic -o $@ $<

test-logic: build/test_logic
	./build/test_logic
