speaker-calibration 2.2.88 → 2.2.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +71 -71
- package/.eslintrc.json +40 -40
- package/.gitignore +81 -0
- package/.prettierignore +69 -69
- package/.prettierrc +14 -14
- package/LICENSE +20 -20
- package/README.md +133 -133
- package/__mocks__/fileMock.js +1 -1
- package/__mocks__/styleMock.js +1 -1
- package/babel.config.js +3 -3
- package/coverage/clover.xml +71 -71
- package/coverage/coverage-final.json +224 -224
- package/coverage/lcov-report/PythonServerInterface.js.html +265 -265
- package/coverage/lcov-report/base.css +354 -354
- package/coverage/lcov-report/block-navigation.js +82 -82
- package/coverage/lcov-report/index.html +123 -123
- package/coverage/lcov-report/prettify.css +101 -101
- package/coverage/lcov-report/prettify.js +937 -937
- package/coverage/lcov-report/sorter.js +189 -189
- package/coverage/lcov-report/src/index.html +121 -121
- package/coverage/lcov-report/src/server/PythonServerInterface.js.html +268 -268
- package/coverage/lcov-report/src/server/index.html +123 -123
- package/coverage/lcov-report/src/tasks/audioCalibrator.js.html +499 -499
- package/coverage/lcov-report/src/tasks/audioRecorder.js.html +412 -412
- package/coverage/lcov-report/src/tasks/index.html +143 -143
- package/coverage/lcov-report/src/tasks/volume/index.html +123 -123
- package/coverage/lcov-report/src/tasks/volume/volume.js.html +409 -409
- package/coverage/lcov-report/src/utils.js.html +172 -172
- package/coverage/lcov.info +91 -91
- package/dist/example/fetch-languages-sheets.js +77 -77
- package/dist/example/i18n.js +35846 -35846
- package/dist/example/index.html +47 -47
- package/dist/example/listener.html +62 -62
- package/dist/example/listener.js +95 -95
- package/dist/example/server.js +51 -51
- package/dist/example/speaker.html +145 -145
- package/dist/example/speakerUI.js +273 -273
- package/dist/example/styles.css +92 -92
- package/dist/main.js +17 -17
- package/dist/mlsGen.js +6814 -6814
- package/dist/mlsGen.wasm +0 -0
- package/dist/package-lock.json +1018 -1018
- package/dist/package.json +18 -18
- package/doc/AudioCalibrator.html +417 -417
- package/doc/AudioPeer.html +251 -251
- package/doc/AudioRecorder.html +195 -195
- package/doc/ImpulseResponse.html +215 -215
- package/doc/Listener.html +308 -308
- package/doc/MlsGenInterface.html +226 -226
- package/doc/MyEventEmitter.html +274 -274
- package/doc/PythonServerAPI.html +109 -109
- package/doc/Speaker.html +276 -276
- package/doc/Takes%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +128 -128
- package/doc/Takes%20the%20url%20of%20the%20current%20site%0Aand%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +138 -138
- package/doc/Takes%20the%20url%20of%20the%20current%20site%20and%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +137 -137
- package/doc/Volume.html +88 -88
- package/doc/audioCalibrator.js.html +179 -179
- package/doc/audioPeer.js.html +175 -175
- package/doc/audioRecorder.js.html +163 -163
- package/doc/creates%20a%20new%20AudioRecorder%20instance.%20%0ASets%20up%20the%20audio%20context%20and%20file%20reader..html +114 -114
- package/doc/fonts/OpenSans-Bold-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-BoldItalic-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-Italic-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-Light-webfont.svg +1830 -1830
- package/doc/fonts/OpenSans-LightItalic-webfont.svg +1834 -1834
- package/doc/fonts/OpenSans-Regular-webfont.svg +1830 -1830
- package/doc/global.html +308 -308
- package/doc/index.html +58 -58
- package/doc/listener.js.html +170 -170
- package/doc/mlsGen_mlsGenInterface.js.html +117 -117
- package/doc/myEventEmitter.js.html +124 -124
- package/doc/peer-connection_audioPeer.js.html +188 -188
- package/doc/peer-connection_listener.js.html +311 -311
- package/doc/peer-connection_speaker.js.html +381 -381
- package/doc/scripts/linenumber.js +25 -25
- package/doc/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/doc/scripts/prettify/lang-css.js +24 -24
- package/doc/scripts/prettify/prettify.js +640 -640
- package/doc/server_PythonServerAPI.js.html +160 -160
- package/doc/speaker.js.html +248 -248
- package/doc/styles/jsdoc-default.css +371 -371
- package/doc/styles/prettify-jsdoc.css +111 -111
- package/doc/styles/prettify-tomorrow.css +163 -163
- package/doc/tasks_audioCalibrator.js.html +207 -207
- package/doc/tasks_audioRecorder.js.html +190 -190
- package/doc/tasks_impulse-response_impulseResponse.js.html +442 -442
- package/doc/tasks_impulse-response_mlsGen_mlsGenInterface.js.html +175 -175
- package/doc/tasks_volume_volume.js.html +185 -185
- package/doc/utils.js.html +105 -105
- package/jest.config.js +173 -173
- package/netlify.toml +26 -26
- package/package.json +69 -69
- package/src/config/firebase.js +26 -26
- package/src/index.html +21 -21
- package/src/main.js +23 -23
- package/src/myEventEmitter.js +83 -83
- package/src/peer-connection/audioPeer.js +151 -151
- package/src/peer-connection/listener.js +318 -318
- package/src/peer-connection/peerErrors.js +25 -25
- package/src/peer-connection/speaker.js +458 -456
- package/src/server/PythonServerAPI.js +636 -595
- package/src/tasks/audioCalibrator.js +308 -308
- package/src/tasks/audioRecorder.js +291 -291
- package/src/tasks/combination/combination.js +2235 -2169
- package/src/tasks/combination/mlsGen/mlsGen.cpp +98 -98
- package/src/tasks/combination/mlsGen/mlsGen.hpp +303 -303
- package/src/tasks/combination/mlsGen/mlsGenInterface.js +131 -131
- package/src/tasks/combination/mlsGen/mlsGenTest.cpp +180 -180
- package/src/tasks/impulse-response/impulseResponse.js +610 -610
- package/src/tasks/impulse-response/mlsGen/mlsGen.cpp +98 -98
- package/src/tasks/impulse-response/mlsGen/mlsGen.hpp +303 -303
- package/src/tasks/impulse-response/mlsGen/mlsGenInterface.js +131 -131
- package/src/tasks/impulse-response/mlsGen/mlsGenTest.cpp +180 -180
- package/src/tasks/volume/volume.cpp +2 -2
- package/src/tasks/volume/volume.hpp +22 -22
- package/src/tasks/volume/volume.js +279 -279
- package/src/utils.js +88 -88
- package/webpack.config.js +37 -37
- package/makefile +0 -74
package/src/utils.js
CHANGED
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
/** .
|
|
2
|
-
* .
|
|
3
|
-
* .
|
|
4
|
-
* Utlity function to pause execution for a given time
|
|
5
|
-
*
|
|
6
|
-
* @param {number} seconds
|
|
7
|
-
* @returns {Promise}
|
|
8
|
-
* @example
|
|
9
|
-
*/
|
|
10
|
-
const sleep = seconds =>
|
|
11
|
-
new Promise(resolve => {
|
|
12
|
-
setTimeout(resolve, seconds * 1000);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
/** .
|
|
16
|
-
* .
|
|
17
|
-
* .
|
|
18
|
-
* Uiltity function to create and save a CSV file from a buffer
|
|
19
|
-
*
|
|
20
|
-
* @param {*} data
|
|
21
|
-
* @param {*} filename
|
|
22
|
-
* @example
|
|
23
|
-
*/
|
|
24
|
-
const saveToCSV = (data, filename = 'recordedMLSignal.csv') => {
|
|
25
|
-
// console.log(data)
|
|
26
|
-
let csvContent = 'data:text/csv;charset=utf-8,';
|
|
27
|
-
|
|
28
|
-
data.forEach((val, idx) => {
|
|
29
|
-
csvContent += `${idx},${val}\r\n`;
|
|
30
|
-
});
|
|
31
|
-
const encodedUri = encodeURI(csvContent);
|
|
32
|
-
const link = document.createElement('a');
|
|
33
|
-
link.setAttribute('href', encodedUri);
|
|
34
|
-
link.setAttribute('download', filename);
|
|
35
|
-
document.body.appendChild(link);
|
|
36
|
-
link.click();
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const saveToJSON = (data, filename = 'recordedMLSignal.json') => {
|
|
40
|
-
const jsonData = JSON.stringify(data, null, 2);
|
|
41
|
-
const blob = new Blob([jsonData], { type: 'application/json' });
|
|
42
|
-
const url = URL.createObjectURL(blob);
|
|
43
|
-
const link = document.createElement('a');
|
|
44
|
-
link.setAttribute('href', url);
|
|
45
|
-
link.setAttribute('download', filename);
|
|
46
|
-
document.body.appendChild(link);
|
|
47
|
-
link.click();
|
|
48
|
-
URL.revokeObjectURL(url);
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
/** .
|
|
53
|
-
* .
|
|
54
|
-
* .
|
|
55
|
-
* Utility function to create a buffer from a CSV file
|
|
56
|
-
*
|
|
57
|
-
* @param {*} csvString
|
|
58
|
-
* @param {*} delimiter
|
|
59
|
-
* @returns
|
|
60
|
-
* @example
|
|
61
|
-
*/
|
|
62
|
-
const csvToArray = (csvString, delimiter = ',') =>
|
|
63
|
-
csvString
|
|
64
|
-
.trim()
|
|
65
|
-
.split('\n')
|
|
66
|
-
.map(row => parseFloat(row.trim().split(delimiter)[1]));
|
|
67
|
-
|
|
68
|
-
const findMinValue = (array) => {
|
|
69
|
-
let minValue = array[0];
|
|
70
|
-
for (let i = 1; i < array.length; i++) {
|
|
71
|
-
if (array[i] < minValue) {
|
|
72
|
-
minValue = array[i];
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return minValue;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const findMaxValue = (array) => {
|
|
79
|
-
let maxValue = array[0];
|
|
80
|
-
for (let i = 1; i < array.length; i++) {
|
|
81
|
-
if (array[i] > maxValue) {
|
|
82
|
-
maxValue = array[i];
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return maxValue;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export {sleep, saveToCSV, saveToJSON, csvToArray,findMinValue,findMaxValue};
|
|
1
|
+
/** .
|
|
2
|
+
* .
|
|
3
|
+
* .
|
|
4
|
+
* Utlity function to pause execution for a given time
|
|
5
|
+
*
|
|
6
|
+
* @param {number} seconds
|
|
7
|
+
* @returns {Promise}
|
|
8
|
+
* @example
|
|
9
|
+
*/
|
|
10
|
+
const sleep = seconds =>
|
|
11
|
+
new Promise(resolve => {
|
|
12
|
+
setTimeout(resolve, seconds * 1000);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
/** .
|
|
16
|
+
* .
|
|
17
|
+
* .
|
|
18
|
+
* Uiltity function to create and save a CSV file from a buffer
|
|
19
|
+
*
|
|
20
|
+
* @param {*} data
|
|
21
|
+
* @param {*} filename
|
|
22
|
+
* @example
|
|
23
|
+
*/
|
|
24
|
+
const saveToCSV = (data, filename = 'recordedMLSignal.csv') => {
|
|
25
|
+
// console.log(data)
|
|
26
|
+
let csvContent = 'data:text/csv;charset=utf-8,';
|
|
27
|
+
|
|
28
|
+
data.forEach((val, idx) => {
|
|
29
|
+
csvContent += `${idx},${val}\r\n`;
|
|
30
|
+
});
|
|
31
|
+
const encodedUri = encodeURI(csvContent);
|
|
32
|
+
const link = document.createElement('a');
|
|
33
|
+
link.setAttribute('href', encodedUri);
|
|
34
|
+
link.setAttribute('download', filename);
|
|
35
|
+
document.body.appendChild(link);
|
|
36
|
+
link.click();
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const saveToJSON = (data, filename = 'recordedMLSignal.json') => {
|
|
40
|
+
const jsonData = JSON.stringify(data, null, 2);
|
|
41
|
+
const blob = new Blob([jsonData], { type: 'application/json' });
|
|
42
|
+
const url = URL.createObjectURL(blob);
|
|
43
|
+
const link = document.createElement('a');
|
|
44
|
+
link.setAttribute('href', url);
|
|
45
|
+
link.setAttribute('download', filename);
|
|
46
|
+
document.body.appendChild(link);
|
|
47
|
+
link.click();
|
|
48
|
+
URL.revokeObjectURL(url);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
/** .
|
|
53
|
+
* .
|
|
54
|
+
* .
|
|
55
|
+
* Utility function to create a buffer from a CSV file
|
|
56
|
+
*
|
|
57
|
+
* @param {*} csvString
|
|
58
|
+
* @param {*} delimiter
|
|
59
|
+
* @returns
|
|
60
|
+
* @example
|
|
61
|
+
*/
|
|
62
|
+
const csvToArray = (csvString, delimiter = ',') =>
|
|
63
|
+
csvString
|
|
64
|
+
.trim()
|
|
65
|
+
.split('\n')
|
|
66
|
+
.map(row => parseFloat(row.trim().split(delimiter)[1]));
|
|
67
|
+
|
|
68
|
+
const findMinValue = (array) => {
|
|
69
|
+
let minValue = array[0];
|
|
70
|
+
for (let i = 1; i < array.length; i++) {
|
|
71
|
+
if (array[i] < minValue) {
|
|
72
|
+
minValue = array[i];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return minValue;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const findMaxValue = (array) => {
|
|
79
|
+
let maxValue = array[0];
|
|
80
|
+
for (let i = 1; i < array.length; i++) {
|
|
81
|
+
if (array[i] > maxValue) {
|
|
82
|
+
maxValue = array[i];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return maxValue;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export {sleep, saveToCSV, saveToJSON, csvToArray,findMinValue,findMaxValue};
|
package/webpack.config.js
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer');
|
|
3
|
-
|
|
4
|
-
const config = {
|
|
5
|
-
entry: {
|
|
6
|
-
main: './src/main.js',
|
|
7
|
-
},
|
|
8
|
-
output: {
|
|
9
|
-
path: path.resolve(__dirname, 'dist'),
|
|
10
|
-
filename: '[name].js',
|
|
11
|
-
library: {
|
|
12
|
-
name: 'speakerCalibrator',
|
|
13
|
-
type: 'umd',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
module: {
|
|
17
|
-
rules: [
|
|
18
|
-
{
|
|
19
|
-
test: /\.css$/,
|
|
20
|
-
use: ['style-loader', 'css-loader'],
|
|
21
|
-
},
|
|
22
|
-
],
|
|
23
|
-
},
|
|
24
|
-
plugins: [],
|
|
25
|
-
resolve: {
|
|
26
|
-
fallback: {
|
|
27
|
-
path: require.resolve('path-browserify'),
|
|
28
|
-
fs: false,
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
if (process.env.WEBPACK_ANALYZE === 'true') {
|
|
34
|
-
config.plugins.push(new BundleAnalyzerPlugin());
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
module.exports = config;
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer');
|
|
3
|
+
|
|
4
|
+
const config = {
|
|
5
|
+
entry: {
|
|
6
|
+
main: './src/main.js',
|
|
7
|
+
},
|
|
8
|
+
output: {
|
|
9
|
+
path: path.resolve(__dirname, 'dist'),
|
|
10
|
+
filename: '[name].js',
|
|
11
|
+
library: {
|
|
12
|
+
name: 'speakerCalibrator',
|
|
13
|
+
type: 'umd',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
module: {
|
|
17
|
+
rules: [
|
|
18
|
+
{
|
|
19
|
+
test: /\.css$/,
|
|
20
|
+
use: ['style-loader', 'css-loader'],
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
plugins: [],
|
|
25
|
+
resolve: {
|
|
26
|
+
fallback: {
|
|
27
|
+
path: require.resolve('path-browserify'),
|
|
28
|
+
fs: false,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
if (process.env.WEBPACK_ANALYZE === 'true') {
|
|
34
|
+
config.plugins.push(new BundleAnalyzerPlugin());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
module.exports = config;
|
package/makefile
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
##################################### UTILITIES ######################################
|
|
2
|
-
COM_COLOR = \033[0;34m
|
|
3
|
-
OBJ_COLOR = \033[0;36m
|
|
4
|
-
OK_COLOR = \033[0;32m
|
|
5
|
-
ERROR_COLOR = \033[0;31m
|
|
6
|
-
WARN_COLOR = \033[0;33m
|
|
7
|
-
NO_COLOR = \033[m
|
|
8
|
-
|
|
9
|
-
OK_STRING = "[OK]"
|
|
10
|
-
ERROR_STRING = "[ERROR]"
|
|
11
|
-
WARN_STRING = "[WARNING]"
|
|
12
|
-
COM_STRING = "Compiling..."
|
|
13
|
-
|
|
14
|
-
define run_and_test
|
|
15
|
-
printf "%b" "$(COM_COLOR)$(COM_STRING) $(OBJ_COLOR)$(@F)$(NO_COLOR)\r"; \
|
|
16
|
-
$(1) 2> $@.log; \
|
|
17
|
-
RESULT=$$?; \
|
|
18
|
-
if [ $$RESULT -ne 0 ]; then \
|
|
19
|
-
printf "%-60b%b" "$(COM_COLOR)$(COM_STRING)$(OBJ_COLOR) $@" "$(ERROR_COLOR)$(ERROR_STRING)$(NO_COLOR)\n" ; \
|
|
20
|
-
elif [ -s $@.log ]; then \
|
|
21
|
-
printf "%-60b%b" "$(COM_COLOR)$(COM_STRING)$(OBJ_COLOR) $@" "$(WARN_COLOR)$(WARN_STRING)$(NO_COLOR)\n" ; \
|
|
22
|
-
else \
|
|
23
|
-
printf "%-60b%b" "$(COM_COLOR)$(COM_STRING)$(OBJ_COLOR) $(@F)" "$(OK_COLOR)$(OK_STRING)$(NO_COLOR)\n" ; \
|
|
24
|
-
fi; \
|
|
25
|
-
cat $@.log; \
|
|
26
|
-
rm -f $@.log; \
|
|
27
|
-
exit $$RESULT
|
|
28
|
-
endef
|
|
29
|
-
|
|
30
|
-
##################################### WASM ########################################
|
|
31
|
-
PROJECT_NAME = mlsGen
|
|
32
|
-
|
|
33
|
-
# directories
|
|
34
|
-
DIST_DIR = ./dist/
|
|
35
|
-
SRC_DIR = $(addprefix ./src/tasks/impulse-response/,$(PROJECT_NAME)/)
|
|
36
|
-
|
|
37
|
-
# WASM files
|
|
38
|
-
SRC_FILE := $(addprefix $(SRC_DIR),$(PROJECT_NAME).cpp) # SRC_DIR + PROJECT_NAME + .cpp
|
|
39
|
-
OBJ_FILE := $(addprefix $(SRC_DIR),$(PROJECT_NAME).o)
|
|
40
|
-
OUTPUT_WASM_JS := $(addprefix $(DIST_DIR),$(PROJECT_NAME).js) # DIST_DIR + PROJECT_NAME + .js
|
|
41
|
-
OUTPUT_WASM := $(addprefix $(DIST_DIR),$(PROJECT_NAME).wasm) # DIST_DIR + PROJECT_NAME + .wasm
|
|
42
|
-
OUTPUT := $(addprefix $(DIST_DIR),$(PROJECT_NAME).*) # DIST_DIR + PROJECT_NAME + .*
|
|
43
|
-
|
|
44
|
-
# emcc compiler options
|
|
45
|
-
EMCC = em++ # emcc compiler front end
|
|
46
|
-
STD = --std=c++17 # C++ standard
|
|
47
|
-
OPTIMIZE = -O3 # Optimization level O0 ~ 28.8 kB, O1 ~ 20.3 kB, O2 ~ 20.3 kB, O3 ~ 19.7 kB
|
|
48
|
-
ENV = -s ENVIRONMENT='web' # environment
|
|
49
|
-
NOENTRY = --no-entry # no entry point (no main function)
|
|
50
|
-
MODULARIZE = -s MODULARIZE=1 -s 'EXPORT_NAME="createMLSGenModule"' # puts all of the generated JavaScript into a factory function
|
|
51
|
-
BIND = -lembind # links against embind library
|
|
52
|
-
MEMORY_CHECKS = -s ASSERTIONS=1 -fsanitize=address -g2
|
|
53
|
-
|
|
54
|
-
# gcc compiler options
|
|
55
|
-
GCC = gcc # gcc compiler front end
|
|
56
|
-
|
|
57
|
-
# KISSFFT Library
|
|
58
|
-
KISS_LIB= /Users/hugo/Desktop/dev/easyeyes/speaker-calibration/src/tasks/impulse-response/kissfft/libkissfft-float.a
|
|
59
|
-
KISS_H= -I /Users/hugo/Desktop/dev/easyeyes/speaker-calibration/src/tasks/impulse-response/kissfft/
|
|
60
|
-
|
|
61
|
-
# build the WASM + JS glue module, linked with embind
|
|
62
|
-
$(PROJECT_NAME)_bind: # $(OBJ_FILE)
|
|
63
|
-
@mkdir -p $(@D)
|
|
64
|
-
@$(call run_and_test, $(EMCC) $(STD) $(BIND) $(SRC_FILE) -o $(OUTPUT_WASM_JS) $(MODULARIZE) $(OPTIMIZE) $(ENV) $(MEMORY_CHECKS) $(KISS_H) $(KISS_LIB))
|
|
65
|
-
|
|
66
|
-
# clean the WASM + JS files
|
|
67
|
-
.PHONY: clean
|
|
68
|
-
clean:
|
|
69
|
-
@mkdir -p $(@D)
|
|
70
|
-
@$(call run_and_test, rm -f $(OUTPUT))
|
|
71
|
-
|
|
72
|
-
.PHONY: rebuild
|
|
73
|
-
rebuild:
|
|
74
|
-
@make clean; make $(PROJECT_NAME)_bind
|