File: ccore.mk

package info (click to toggle)
python-pyclustering 0.10.1.2-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 11,128 kB
  • sloc: cpp: 38,888; python: 24,311; sh: 384; makefile: 105
file content (158 lines) | stat: -rwxr-xr-x 3,394 bytes parent folder | download | duplicates (2)
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#
# @authors Andrei Novikov (pyclustering@yandex.ru)
# @date 2014-2020
# @copyright BSD-3-Clause
#


# Tools
RM = rm -rf
MKDIR = mkdir -p
AR = ar rcs


# C++ standard depending on operating system
UNAME = $(shell uname -s | tr '[:upper:]' '[:lower:]')
ifeq ($(findstring cygwin, $(UNAME)), cygwin)
	OSNAME = win
	CPLUS_STANDARD = gnu++14
	CFLAG_PIC = 
else
	ifeq ($(UNAME), darwin)
		OSNAME = macos
	else
		OSNAME = linux
	endif

	CPLUS_STANDARD = c++14
	CFLAG_PIC = -fPIC
endif


# Compiler (g++ compiler is used by default)
ifeq ($(COMPILER), clang)
	CC = scan-build clang++ -c
	LD = scan-build clang++
else
	CC = g++ -c
	LD = g++
endif


# Target flag depending on platform
ifeq ($(PLATFORM), 32-bit)
	CFLAG_PLATFORM = -m32
	LFLAG_PLATFORM = -m32
else 
	ifeq ($(PLATFORM), 64-bit)
		CFLAG_PLATFORM = -m64
		LFLAG_PLATFORM = -m64
	else
		PLATFORM = 64-bit
		CFLAG_PLATFORM = -m64
		LFLAG_PLATFORM = -m64
	endif
endif


# Definitions
DEFINITION_FLAGS =


# Warnings
WARNING_FLAGS = -Wall -Wpedantic


# Shared library file
SHARED_LIB_DEPLOY_DIRECTORY = ../pyclustering/core/$(PLATFORM)/$(OSNAME)
SHARED_LIB_DIRECTORY = .
SHARED_LIB = $(SHARED_LIB_DIRECTORY)/libpyclustering.so


# Static library file
STATIC_LIB_DIRECTORY = .
STATIC_LIB = libpyclustering.a


# Project sources
MODULES = . cluster container differential interface nnet parallel utils

PROJECT_DIRECTORY = .
INCLUDE_DIRECTORY = $(PROJECT_DIRECTORY)/include/
SOURCES_DIRECTORY = src
SOURCES_DIRECTORIES = $(addprefix $(SOURCES_DIRECTORY)/, $(MODULES))
SOURCES = $(foreach SUBDIR, $(SOURCES_DIRECTORIES), $(wildcard $(SUBDIR)/*.cpp))

INCLUDES = -I$(INCLUDE_DIRECTORY)

LIBRARIES =


# Toolchain arguments
CFLAGS = -O2 -MMD -MP -pthread -std=$(CPLUS_STANDARD) $(CFLAG_PIC) $(CFLAG_PLATFORM) $(WARNING_FLAGS) $(DEFINITION_FLAGS)
LFLAGS = -shared -pthread $(LFLAG_PLATFORM) $(LIBRARIES)


# Project objects
OBJECTS_ROOT = obj
OBJECTS_DIRECTORY = $(OBJECTS_ROOT)/ccore/$(PLATFORM)
OBJECTS_DIRECTORIES = $(addprefix $(OBJECTS_DIRECTORY)/, $(MODULES)) $(SHARED_LIB_DIRECTORY)
OBJECTS = $(patsubst $(SOURCES_DIRECTORY)/%.cpp, $(OBJECTS_DIRECTORY)/%.o, $(SOURCES))


# Dependencies
DEPENDENCIES = $(OBJECTS:.o=.d)


# Targets
.PHONY: cppcheck
cppcheck:
	cppcheck --version
	cppcheck --inline-suppr --error-exitcode=1 --std=c++14 --inconclusive --enable=warning,style,performance,information,portability -I $(INCLUDE_DIRECTORY) $(SOURCES_DIRECTORY)


.PHONY: ccore
ccore: shared_library_definitions mkdirs $(SHARED_LIB) deploy


.PHONY: shared_library_definitions
shared_library_definitions:
	$(eval DEFINITION_FLAGS := -DEXPORT_PYCLUSTERING_INTERFACE)


.PHONY: ccore_static
ccore_static: mkdirs $(STATIC_LIB)


.PHONY: mkdirs
mkdirs: $(OBJECTS_DIRECTORIES)

.PHONY: deploy
deploy: $(SHARED_LIB)
	echo "Copy C++ shared library to Python pyclustering."
	cp $(SHARED_LIB) $(SHARED_LIB_DEPLOY_DIRECTORY)

$(OBJECTS_DIRECTORIES):
	$(MKDIR) $@


.PHONY:
clean:
	$(RM) $(OBJECTS_DIRECTORY) $(SHARED_LIB) $(STATIC_LIB)


# Build targets
$(SHARED_LIB): $(OBJECTS)
	$(LD) $(LFLAGS) $^ -o $@


$(STATIC_LIB): $(OBJECTS)
	$(AR) $@ $^


$(OBJECTS_DIRECTORY)/%.o: $(SOURCES_DIRECTORY)/%.cpp
	$(CC) $(CFLAGS) $(INCLUDES) $(LIBRARIES) $< -o $@


# Include dependencies
-include $(DEPENDENCIES)