|
18 | 18 |
|
19 | 19 | # VARIABLES # |
20 | 20 |
|
21 | | -ifndef VERBOSE |
22 | | - QUIET := @ |
23 | | -else |
24 | | - QUIET := |
25 | | -endif |
26 | | - |
27 | | -# Determine the OS ([1][1], [2][2]). |
28 | | -# |
29 | | -# [1]: https://en.wikipedia.org/wiki/Uname#Examples |
30 | | -# [2]: http://stackoverflow.com/a/27776822/2225624 |
31 | | -OS ?= $(shell uname) |
32 | | -ifneq (, $(findstring MINGW,$(OS))) |
33 | | - OS := WINNT |
34 | | -else |
35 | | -ifneq (, $(findstring MSYS,$(OS))) |
36 | | - OS := WINNT |
37 | | -else |
38 | | -ifneq (, $(findstring CYGWIN,$(OS))) |
39 | | - OS := WINNT |
40 | | -else |
41 | | -ifneq (, $(findstring Windows_NT,$(OS))) |
42 | | - OS := WINNT |
43 | | -endif |
44 | | -endif |
45 | | -endif |
46 | | -endif |
| 21 | +# Determine the OS: |
| 22 | +UNAME := $(shell uname -s) |
47 | 23 |
|
48 | 24 | # Define the program used for compiling C source files: |
49 | | -ifdef C_COMPILER |
50 | | - CC := $(C_COMPILER) |
| 25 | +ifdef CC |
| 26 | + CC := $(CC) |
51 | 27 | else |
52 | 28 | CC := gcc |
53 | 29 | endif |
54 | 30 |
|
55 | | -# Define the command-line options when compiling C files: |
56 | | -CFLAGS ?= \ |
57 | | - -std=c99 \ |
58 | | - -O3 \ |
59 | | - -Wall \ |
60 | | - -pedantic |
| 31 | +# Define the command-line options when compiling C source files: |
| 32 | +CFLAGS ?= -O3 -std=c99 |
61 | 33 |
|
62 | | -# Determine whether to generate position independent code ([1][1], [2][2]). |
63 | | -# |
64 | | -# [1]: https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options |
65 | | -# [2]: http://stackoverflow.com/questions/5311515/gcc-fpic-option |
66 | | -ifeq ($(OS), WINNT) |
67 | | - fPIC ?= |
| 34 | +# Define the program for removing files: |
| 35 | +REMOVE ?= rm -f |
| 36 | + |
| 37 | +# Determine extension for shared libraries based on the OS: |
| 38 | +ifeq ($(UNAME), Darwin) |
| 39 | + SHARED_EXT := dylib |
68 | 40 | else |
69 | | - fPIC ?= -fPIC |
| 41 | + SHARED_EXT := so |
70 | 42 | endif |
71 | 43 |
|
72 | | -# List of includes (e.g., `-I /foo/bar -I /beep/boop/include`): |
73 | | -INCLUDE ?= |
74 | | - |
75 | | -# List of source files: |
76 | | -SOURCE_FILES ?= |
| 44 | +# Define the command for running the example: |
| 45 | +RUN ?= ./example |
77 | 46 |
|
78 | | -# List of libraries (e.g., `-lopenblas -lpthread`): |
79 | | -LIBRARIES ?= |
| 47 | +# TARGETS # |
80 | 48 |
|
81 | | -# List of library paths (e.g., `-L /foo/bar -L /beep/boop`): |
82 | | -LIBPATH ?= |
83 | | - |
84 | | -# List of C targets: |
85 | | -c_targets := example.out |
| 49 | +# Default target. |
| 50 | +# |
| 51 | +# This target is the default target. |
86 | 52 |
|
| 53 | +all: clean build run |
87 | 54 |
|
88 | | -# RULES # |
| 55 | +.PHONY: all |
89 | 56 |
|
90 | | -#/ |
91 | | -# Compiles source files. |
92 | | -# |
93 | | -# @param {string} [C_COMPILER] - C compiler (e.g., `gcc`) |
94 | | -# @param {string} [CFLAGS] - C compiler options |
95 | | -# @param {(string|void)} [fPIC] - compiler flag determining whether to generate position independent code (e.g., `-fPIC`) |
96 | | -# @param {string} [INCLUDE] - list of includes (e.g., `-I /foo/bar -I /beep/boop/include`) |
97 | | -# @param {string} [SOURCE_FILES] - list of source files |
98 | | -# @param {string} [LIBPATH] - list of library paths (e.g., `-L /foo/bar -L /beep/boop`) |
99 | | -# @param {string} [LIBRARIES] - list of libraries (e.g., `-lopenblas -lpthread`) |
100 | | -# |
101 | | -# @example |
102 | | -# make |
| 57 | +# Compile C source. |
103 | 58 | # |
104 | | -# @example |
105 | | -# make all |
106 | | -#/ |
107 | | -all: $(c_targets) |
| 59 | +# This target compiles C source files. |
108 | 60 |
|
109 | | -.PHONY: all |
| 61 | +build: example.c tinymt32.c tinymt32.h |
| 62 | + $(CC) $(CFLAGS) -o example example.c tinymt32.c |
110 | 63 |
|
111 | | -#/ |
112 | | -# Compiles C source files. |
113 | | -# |
114 | | -# @private |
115 | | -# @param {string} CC - C compiler (e.g., `gcc`) |
116 | | -# @param {string} CFLAGS - C compiler flags |
117 | | -# @param {(string|void)} fPIC - compiler flag determining whether to generate position independent code (e.g., `-fPIC`) |
118 | | -# @param {string} INCLUDE - list of includes (e.g., `-I /foo/bar`) |
119 | | -# @param {string} SOURCE_FILES - list of source files |
120 | | -# @param {string} LIBPATH - list of library paths (e.g., `-L /foo/bar`) |
121 | | -# @param {string} LIBRARIES - list of libraries (e.g., `-lopenblas`) |
122 | | -#/ |
123 | | -$(c_targets): %.out: %.c |
124 | | - $(QUIET) $(CC) $(CFLAGS) $(fPIC) $(INCLUDE) -o $@ $(SOURCE_FILES) $< $(LIBPATH) -lm $(LIBRARIES) |
| 64 | +.PHONY: build |
125 | 65 |
|
126 | | -#/ |
127 | | -# Runs compiled examples. |
| 66 | +# Run the example. |
128 | 67 | # |
129 | | -# @example |
130 | | -# make run |
131 | | -#/ |
132 | | -run: $(c_targets) |
133 | | - $(QUIET) ./$< |
| 68 | +# This target runs the compiled example. |
| 69 | + |
| 70 | +run: build |
| 71 | + $(RUN) |
134 | 72 |
|
135 | 73 | .PHONY: run |
136 | 74 |
|
137 | | -#/ |
138 | | -# Removes generated files. |
| 75 | +# Remove generated files. |
139 | 76 | # |
140 | | -# @example |
141 | | -# make clean |
142 | | -#/ |
| 77 | +# This target removes any generated files. |
| 78 | + |
143 | 79 | clean: |
144 | | - $(QUIET) -rm -f *.o *.out |
| 80 | + $(REMOVE) example *.o *.$(SHARED_EXT) |
145 | 81 |
|
146 | 82 | .PHONY: clean |
0 commit comments