star-sf

Set of surface and volume scattering functions
git clone git://git.meso-star.fr/star-sf.git
Log | Files | Refs | README | LICENSE

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 ]