-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
112 lines (94 loc) · 3.67 KB
/
Makefile
File metadata and controls
112 lines (94 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
CC = gcc
FAST_FLAG = -Ofast
ifeq ($(UNAME_S),Darwin)
FAST_FLAG = -O3 -ffast-math
endif
ifeq ($(DEBUG), 1)
CFLAGS += -march=native -O0 -g
else
CFLAGS += -Wall -march=native $(FAST_FLAG) -Wfatal-errors
endif
TARGET = softviterbi
PYTHON = python3
WHEEL_TEST_ENV = wheel_test_venv
UNITTEST_VENV = tests/venv
ifeq ($(OS),Windows_NT)
SHELL := cmd.exe
RM = del /Q
RMDIR = rmdir /S /Q
MOVE = move /y
DEVNULL = nul
LIBRARY_TARGET = $(TARGET).dll
ACTIVATE_TEST_VENV = .\$(WHEEL_TEST_ENV)\Scripts\activate
ACTIVATE_UNITTEST_GENERATION_VENV = .\$(UNITTEST_VENV)\Scripts\activate
EXE = .exe
SEP=\\
PYTHON_FROM_VENV = $(SEP)Scripts$(SEP)python$(EXE)
PYTHON := $(shell cmd /C "for %C in (python python3 py) do @where %C >nul 2>nul && (echo call %C& exit /b 0)")
else
RM = rm -f
RMDIR = rm -rf
MOVE = mv
DEVNULL = /dev/null
LIBRARY_TARGET = lib$(TARGET).so
ACTIVATE_TEST_VENV = . $(WHEEL_TEST_ENV)/bin/activate
ACTIVATE_UNITTEST_GENERATION_VENV = . $(UNITTEST_VENV)/bin/activate
EXE =
SEP=/
PYTHON_FROM_VENV = $(SEP)bin$(SEP)python$(EXE)
endif
PYTHON_PACKAGE_DIR = python_package
PYTHON_PACKAGE_LIB = $(PYTHON_PACKAGE_DIR)$(SEP)$(TARGET)$(SEP)$(LIBRARY_TARGET)
SETUP_PY = $(PYTHON_PACKAGE_DIR)$(SEP)setup.py
UNITTEST_TARGET = $(TARGET)_unittest$(EXE)
BOLD_TEXT := \033[1m
RESET_TEXT := \033[0m
all: $(TARGET)
$(TARGET): main.c
$(CC) $(CFLAGS) -o $@ $^
lib: main.c
$(CC) $(CFLAGS) -Wno-unused-function -shared -fPIC -DASLIB -o $(LIBRARY_TARGET) $^
generate_unittest:
-$(RMDIR) $(UNITTEST_VENV)
$(PYTHON) -m venv $(UNITTEST_VENV)
$(ACTIVATE_UNITTEST_GENERATION_VENV) && pip install -r tests/requirements.txt
$(UNITTEST_VENV)$(PYTHON_FROM_VENV) tests/generate_unittest.py
unittest:
$(CC) $(CFLAGS) -DUNITTEST -o $(UNITTEST_TARGET) main.c
test: unittest
./$(UNITTEST_TARGET)
wheel: lib
$(MOVE) $(LIBRARY_TARGET) $(PYTHON_PACKAGE_LIB)
$(PYTHON) -m pip show setuptools >$(DEVNULL) 2>&1 || $(PYTHON) -m pip install setuptools >$(DEVNULL)
$(PYTHON) -m pip show wheel >$(DEVNULL) 2>&1 || $(PYTHON) -m pip install wheel >$(DEVNULL)
cd $(PYTHON_PACKAGE_DIR) && $(PYTHON) setup.py bdist_wheel -d . >$(DEVNULL) 2>&1
-$(RMDIR) build $(TARGET).egg-info
$(MOVE) $(PYTHON_PACKAGE_DIR)$(SEP)*.whl .
cd $(PYTHON_PACKAGE_DIR) && rm -rf dist build *.egg-info
test_python: wheel
-$(RMDIR) $(WHEEL_TEST_ENV)
$(PYTHON) -m venv $(WHEEL_TEST_ENV)
$(ACTIVATE_TEST_VENV) && \
$(WHEEL_TEST_ENV)$(PYTHON_FROM_VENV) -m pip install --find-links=. $(TARGET) && \
$(WHEEL_TEST_ENV)$(PYTHON_FROM_VENV) tests$(SEP)unittest.py
test_all: test test_python
@$(MAKE) -s clean >$(DEVNULL) 2>&1
help:
@echo "$(TARGET) make commands:"
@echo "\tmake\t\t\t\tmakes $(BOLD_TEXT)$(TARGET)$(RESET_TEXT) executable"
@echo "\tmake lib\t\t\tmakes $(BOLD_TEXT)$(LIBRARY_TARGET)$(RESET_TEXT)"
@echo "\tmake generate_unittest\t\tmakes $(BOLD_TEXT)unittest.c$(RESET_TEXT) and $(BOLD_TEXT)unittest.py$(RESET_TEXT) (may take a few minutes)"
@echo "\tmake unittest\t\t\tcompiles $(BOLD_TEXT)unittest.c$(RESET_TEXT)"
@echo "\tmake test\t\t\truns $(BOLD_TEXT)$(UNITTEST_TARGET)$(RESET_TEXT)"
@echo "\tmake wheel\t\t\tmakes $(TARGET) python package's $(BOLD_TEXT)wheel file$(RESET_TEXT)"
@echo "\tmake test_python\t\ttests the python package"
@echo "\tmake test_all\t\t\truns all available tests"
@echo "\tmake clean\t\t\tcleans extra files"
@echo "\tmake help\t\t\tdisplays this message"
clean:
-$(RM) $(TARGET) $(TARGET).exe $(TARGET)_unittest* $(LIBRARY_TARGET)
-$(RMDIR) dist build *.egg-info tests$(SEP)venv $(WHEEL_TEST_ENV)
-$(RM) $(TARGET)*.whl $(LIBRARY_TARGET) $(PYTHON_PACKAGE_LIB)
-$(RMDIR) $(PYTHON_PACKAGE_DIR)$(SEP)$(TARGET).egg-info
-$(RM) $(PYTHON_PACKAGE_DIR)$(SEP)*.whl
-$(RMDIR) $(PYTHON_PACKAGE_DIR)$(SEP)$(TARGET)$(SEP)__pycache__