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