Makefile (7676B)
1 # Copyright (C) 2016-2018, 2021-2025 |Méso|Star> (contact@meso-star.com) 2 # 3 # This program is free software: you can redistribute it and/or modify 4 # it under the terms of the GNU General Public License as published by 5 # the Free Software Foundation, either version 3 of the License, or 6 # (at your option) any later version. 7 # 8 # This program is distributed in the hope that it will be useful, 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 # GNU General Public License for more details. 12 # 13 # You should have received a copy of the GNU General Public License 14 # along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 .POSIX: 17 .SUFFIXES: # Clean up default inference rules 18 19 include config.mk 20 21 LIBNAME_STATIC = libssf.a 22 LIBNAME_SHARED = libssf.so 23 LIBNAME = $(LIBNAME_$(LIB_TYPE)) 24 25 default: library 26 all: library tests 27 28 ################################################################################ 29 # Star-SF building 30 ################################################################################ 31 SRC =\ 32 src/ssf.c\ 33 src/ssf_beckmann_distribution.c\ 34 src/ssf_blinn_distribution.c\ 35 src/ssf_bsdf.c\ 36 src/ssf_fresnel.c\ 37 src/ssf_fresnel_constant.c\ 38 src/ssf_fresnel_dielectric_conductor.c\ 39 src/ssf_fresnel_dielectric_dielectric.c\ 40 src/ssf_fresnel_no_op.c\ 41 src/ssf_lambertian_reflection.c\ 42 src/ssf_microfacet_distribution.c\ 43 src/ssf_microfacet_reflection.c\ 44 src/ssf_phase.c\ 45 src/ssf_phase_discrete.c\ 46 src/ssf_phase_hg.c\ 47 src/ssf_phase_rayleigh.c\ 48 src/ssf_phase_rdgfa.c\ 49 src/ssf_pillbox_distribution.c\ 50 src/ssf_specular_dielectric_dielectric_interface.c\ 51 src/ssf_specular_reflection.c\ 52 src/ssf_thin_specular_dielectric.c 53 OBJ = $(SRC:.c=.o) 54 DEP = $(SRC:.c=.d) 55 56 CFLAGS_LIB = $(CFLAGS_SO) $(CFLAGS_SIMD) $(INCS) -DSSF_SHARED_BUILD 57 LDFLAGS_LIB = $(LDFLAGS_SO) $(LIBS) 58 59 library: .config $(DEP) 60 @$(MAKE) -fMakefile $$(for i in $(DEP); do echo -f $${i}; done) \ 61 $$(if [ -n "$(LIBNAME)" ]; then\ 62 echo "$(LIBNAME)";\ 63 else\ 64 echo "$(LIBNAME_SHARED)";\ 65 fi) 66 67 $(DEP) $(OBJ): config.mk 68 69 $(LIBNAME_SHARED): $(OBJ) 70 $(CC) $(CFLAGS_LIB) -o $@ $(OBJ) $(LDFLAGS_LIB) 71 72 $(LIBNAME_STATIC): libssf.o 73 $(AR) -rc $@ $? 74 $(RANLIB) $@ 75 76 libssf.o: $(OBJ) 77 $(LD) -r $(OBJ) -o $@ 78 $(OBJCOPY) $(OCPFLAGS) $@ 79 80 .config: config.mk 81 if [ "$(SIMD_WIDTH)" = "128" ] || [ "$(SIMD_WIDTH)" = "256" ]; then \ 82 $(PKG_CONFIG) --atleast-version $(RSIMD_VERSION) rsimd; \ 83 fi 84 $(PKG_CONFIG) --atleast-version $(RSYS_VERSION) rsys 85 $(PKG_CONFIG) --atleast-version $(SSP_VERSION) star-sp 86 echo "config done" > $@ 87 88 .SUFFIXES: .c .d .o 89 .c.d: 90 @$(CC) $(CFLAGS_LIB) -MM -MT "$(@:.d=.o) $@" $< -MF $@ 91 92 .c.o: 93 $(CC) $(CFLAGS_LIB) -c $< -o $@ 94 95 ################################################################################ 96 # Installation 97 ################################################################################ 98 PKG_RSIMD = rsimd >= $(RSIMD_VERSION), 99 PKG_SIMD_128 = $(PKG_RSIMD) 100 PKG_SIMD_256 = $(PKG_RSIMD) 101 PKG_SIMD = $(PKG_SIMD_$(SIMD_WIDTH)) 102 103 pkg: 104 sed -e 's#@PREFIX@#$(PREFIX)#g'\ 105 -e 's#@VERSION@#$(VERSION)#g'\ 106 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ 107 -e 's#@SSP_VERSION@#$(SSP_VERSION)#g'\ 108 -e 's#@SIMD@#$(PKG_SIMD)#g'\ 109 ssf.pc.in > ssf.pc 110 111 ssf-local.pc: ssf.pc.in 112 sed -e '1d'\ 113 -e 's#^includedir=.*#includedir=./src/#'\ 114 -e 's#^libdir=.*#libdir=./#'\ 115 -e 's#@VERSION@#$(VERSION)#g'\ 116 -e 's#@RSYS_VERSION@#$(RSYS_VERSION)#g'\ 117 -e 's#@SSP_VERSION@#$(SSP_VERSION)#g'\ 118 -e 's#@SIMD@#$(PKG_SIMD)#g'\ 119 ssf.pc.in > $@ 120 121 install: library pkg 122 install() { mode="$$1"; prefix="$$2"; shift 2; \ 123 mkdir -p "$${prefix}"; \ 124 cp "$$@" "$${prefix}"; \ 125 chmod "$${mode}" "$$@"; \ 126 }; \ 127 install 755 "$(DESTDIR)$(LIBPREFIX)" $(LIBNAME); \ 128 install 644 "$(DESTDIR)$(LIBPREFIX)/pkgconfig" ssf.pc; \ 129 install 644 "$(DESTDIR)$(INCPREFIX)/star" src/ssf.h; \ 130 install 644 "$(DESTDIR)$(PREFIX)/share/doc/star-sf" COPYING README.md 131 132 uninstall: 133 rm -f "$(DESTDIR)$(LIBPREFIX)/$(LIBNAME)" 134 rm -f "$(DESTDIR)$(LIBPREFIX)/pkgconfig/ssf.pc" 135 rm -f "$(DESTDIR)$(INCPREFIX)/star/ssf.h" 136 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-sf/COPYING" 137 rm -f "$(DESTDIR)$(PREFIX)/share/doc/star-sf/README.md" 138 139 clean: clean_test 140 rm -f $(OBJ) $(DEP) $(LIBNAME) 141 rm -f .config .test libssf.o ssf.pc ssf-local.pc 142 143 ################################################################################ 144 # Tests 145 ################################################################################ 146 TEST_SRC =\ 147 src/test_ssf_beckmann_distribution.c\ 148 src/test_ssf_blinn_distribution.c\ 149 src/test_ssf_bsdf.c\ 150 src/test_ssf_fresnel.c\ 151 src/test_ssf_fresnel_constant.c\ 152 src/test_ssf_fresnel_dielectric_conductor.c\ 153 src/test_ssf_fresnel_dielectric_dielectric.c\ 154 src/test_ssf_fresnel_no_op.c\ 155 src/test_ssf_lambertian_reflection.c\ 156 src/test_ssf_microfacet_distribution.c\ 157 src/test_ssf_microfacet_reflection.c\ 158 src/test_ssf_phase.c\ 159 src/test_ssf_phase_discrete.c\ 160 src/test_ssf_phase_hg.c\ 161 src/test_ssf_phase_rayleigh.c\ 162 src/test_ssf_phase_rdgfa.c\ 163 src/test_ssf_pillbox_distribution.c\ 164 src/test_ssf_specular_dielectric_dielectric_reflection.c\ 165 src/test_ssf_specular_reflection.c\ 166 src/test_ssf_thin_specular_dielectric.c 167 TEST_OBJ = $(TEST_SRC:.c=.o) 168 TEST_DEP = $(TEST_SRC:.c=.d) 169 TEST_TGT = $(TEST_SRC:.c=.t) 170 171 PKG_CONFIG_LOCAL = PKG_CONFIG_PATH="./:$${PKG_CONFIG_PATH}" $(PKG_CONFIG) 172 PC_TEST = rsys star-sp ssf-local $(RSIMD_PC_$(SIMD_WIDTH)) 173 INCS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --cflags $(PC_TEST)) 174 LIBS_TEST = $$($(PKG_CONFIG_LOCAL) $(PCFLAGS) --libs $(PC_TEST)) -lm 175 176 CFLAGS_TEST = $(CFLAGS_EXE) $(INCS_TEST) 177 LDFLAGS_TEST = $(LDFLAGS_EXE) $(LIBS_TEST) 178 179 tests: library $(TEST_DEP) $(TEST_TGT) 180 @$(MAKE) -fMakefile \ 181 $$(for i in $(TEST_DEP); do echo -f"$${i}"; done) \ 182 $$(for i in $(TEST_TGT); do echo -f"$${i}"; done) \ 183 test_list 184 185 $(TEST_TGT): 186 @{ \ 187 exe="$$(basename "$@" ".t")"; \ 188 printf '%s: %s\n' "$${exe}" $(@:.t=.o); \ 189 printf 'test_list: %s\n' "$${exe}"; \ 190 } > $@ 191 192 $(TEST_DEP): config.mk ssf-local.pc 193 @$(CC) $(CFLAGS_TEST) -MM -MT "$(@:.d=.o) $@" $(@:.d=.c) -MF $@ 194 195 $(TEST_OBJ): config.mk ssf-local.pc 196 $(CC) $(CFLAGS_TEST) -c $(@:.o=.c) -o $@ 197 198 test_ssf_beckmann_distribution \ 199 test_ssf_blinn_distribution \ 200 test_ssf_bsdf \ 201 test_ssf_fresnel \ 202 test_ssf_fresnel_constant \ 203 test_ssf_fresnel_dielectric_conductor \ 204 test_ssf_fresnel_dielectric_dielectric \ 205 test_ssf_fresnel_no_op \ 206 test_ssf_lambertian_reflection \ 207 test_ssf_microfacet_distribution \ 208 test_ssf_microfacet_reflection \ 209 test_ssf_phase \ 210 test_ssf_phase_discrete \ 211 test_ssf_phase_hg \ 212 test_ssf_phase_rayleigh \ 213 test_ssf_phase_rdgfa \ 214 test_ssf_pillbox_distribution \ 215 test_ssf_specular_dielectric_dielectric_reflection \ 216 test_ssf_specular_reflection \ 217 test_ssf_thin_specular_dielectric \ 218 : config.mk ssf-local.pc $(LIBNAME) 219 $(CC) $(CFLAGS_TEST) -o $@ src/$@.o $(LDFLAGS_TEST) 220 221 clean_test: 222 rm -f $(TEST_DEP) $(TEST_OBJ) $(TEST_TGT) 223 for i in $(TEST_SRC); do rm -f "$$(basename "$${i}" ".c")"; done 224 225 test: tests 226 @err=0; \ 227 check() { name="$$1"; exe="$$2"; shift 2; \ 228 printf '%s' "$${name}"; \ 229 if "./$${exe}" "$$@"> /dev/null 2>&1; then \ 230 printf '\n'; \ 231 else \ 232 printf ': error %s\n' "$$?"; \ 233 err=$$((err+1)); \ 234 fi \ 235 }; \ 236 for i in $(TEST_SRC); do \ 237 test="$$(basename "$${i}" ".c")"; \ 238 if [ "$${test}" != "test_ssf_phase_rdgfa" ]; then \ 239 check "$${test}" "$${test}"; \ 240 elif [ "$(SIMD_WIDTH)" = "128" ]; then \ 241 check "$${test}_simd_128" "$${test}" simd_128; \ 242 elif [ "$(SIMD_WIDTH)" = "256" ]; then \ 243 check "$${test}_simd_256" "$${test}" simd_256; \ 244 else \ 245 check "$${test}_simd_none" "$${test}" simd_none; \ 246 fi; \ 247 done; \ 248 [ "$${err}" -eq 0 ]