AUTOCONF = autoconf CC = @CC@ CFLAGS = -c @CFLAGS@ @DEFS@ -I../include -I../src LD = @CC@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ V = 0 GCLIB = libxmp-gc.a .c.o: @CMD='$(CC) -MMD $(CFLAGS) -o $*.o $<'; \ if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo CC $*.o ; fi; \ eval $$CMD # # Tests # # REPLAYERS = mod ft2 st3 it QUIRKS = SMPLOADERS = 8bit 16bit delta signal endian skip DEPACKERS = pp sqsh s404 mmcmp zip zip_filtered zip_store zip_zip64 \ arc_method2 arc_method3 arc_method4 arc_method8 arc_method9 \ arc_subdir_6 arc_subdir_spark spark arcfs arcfs_subdir \ gzip compress rar j2b lzx lzx_merge lzx_store bzip2 xz \ lha_l0_lzhuff1 lha_l0_lzhuff5 lha_l1_lzhuff5 \ lha_l1_lzhuff6 lha_l1_lzhuff7 lha_l2_lzhuff7 \ lha_l0_filtered lha_l1_filtered lha_l2_filtered \ vorbis vorbis_8bit \ it_sample_8bit it_sample_16bit PROWIZARD = zen fuchs starpack EFFECTS = 0_arpeggio 1_slide_up 2_slide_down \ 4_vibrato a_volslide \ 8_setpan \ c_volset \ e9_retrig ed_delay ef_invert_loop \ f_set_speed \ volslide track_volslide \ okt_arpeggio per_slide per_toneporta \ panbrello globalvol gvol_slide s3m_bpm it_bpm fine_vibrato \ it_panslide it_vcol_g it_break_to_row it_multi_retrig \ it_smooth_macro reverse line_jump \ pastnote_cut pastnote_off pastnote_fade \ set_nna_cut set_nna_cont set_nna_off set_nna_fade \ note_slide note_slide_retrig \ persistent_slide persistent_vslide persistent_vibrato \ it_g00_nosuck it_l00_nosuck it_fine_vol_row_delay \ far_slide far_toneporta far_retrig far_noteoffset \ far_vibrato far_vibrato_per far_volslide far_tempo \ ult_toneporta API = get_format_list create_context free_context \ test_module load_module load_module_from_memory \ load_module_from_file load_module_from_callbacks \ test_module_from_file test_module_from_memory \ test_module_from_callbacks \ start_player play_buffer \ set_position prev_position set_position_midfx set_row \ set_player stop_module restart_module seek_time \ channel_mute channel_vol inject_event scan_module API_SMIX = smix_play_instrument smix_load_sample smix_play_sample \ smix_channel_pan STORLEK = 01_arpeggio_pitch_slide \ 02_arpeggio_no_value \ 03_compatible_gxx_off \ 04_compatible_gxx_on \ 05_gxx_fine_slides_memory \ 06_volume_column_and_fine_slides \ 07_note_cut_with_sample \ 08_out_of_range_delays \ 09_sample_change_no_note \ 10_pattern_loop \ 11_infinite_pattern_loop \ 12_tremor \ 13_tremor_with_old_effects \ 14_pingpong_loop_and_sample_number \ 15_retrigger \ 16_global_volume \ 17_pattern_row_delay \ 18_sample_number_new_note \ 19_random_waveform \ 20_pan_swing_and_set_pan \ 21_pitch_slide_limits \ 22_zero_cut_and_delay \ 23_portamento_with_no_note \ 24_short_envelope_loops \ 25_portamento_and_pitch_slide OPENMPT_XM = 3xxins \ 3xx_no_old_samp \ 3xx_no_old_samp_noft \ arpeggio \ arpeggioclamp \ arpslide \ delay1 \ delay2 \ delay3 \ delaycombination \ delaycut \ e90 \ envloops \ envoff \ envretrig \ finetune \ finevol_linkmem \ glissando \ key_off \ keyoff2 \ keyoff_instr \ notelimit \ notelimit2 \ noteoff \ noteoff2 \ noteofffade \ noteoffvolume \ offdelay \ offsetrange \ panmemory \ panmemory2 \ panoff \ panslidemem \ pathead \ patterndelays \ patterndelaysretrig \ patloop_break \ patloop_weird \ pickup \ porta_linkmem \ porta_offset \ porta_pickup \ setenvpos \ toneportamentomemory \ tremolowaveforms \ tremor \ tremorinstr \ tremorrecover \ vibratowaveforms OPENMPT_IT = autovibrato_reset \ bidi_loops \ carrynna \ cut_carry \ emptyslot \ envloopescape \ envloops \ envofflength \ envreset \ extreme_filter_test_1 \ fade_porta \ filter_7f \ filterenvreset \ filter_nna \ filter_reset \ filter_reset_carry \ finevolcolslide \ flt_env_carry \ fltmacro \ freqreset_noins \ globalvol_invalid \ gxsmp \ gxsmp2 \ gxxtest \ ins_flt_porta_reset \ instrumentnumberchange \ linearslides \ macro_extended_param \ macro_lastnote \ multizxx \ nomap \ noteoff2 \ noteoff3 \ noteoffinstr \ off_porta \ off_porta_compatgxx \ panreset \ porta_offset \ portainsnum \ portainsnumcompat \ portajuststoppednote \ portareset \ portasample \ portasamplecompat \ randompan \ retrig \ retrig_short \ s77 \ s7xinsnum \ samplenumberchange \ scx \ smpinspansurround \ stoppedinstrswap \ susafterloop \ swaptest \ swing1 \ swing2 \ swing3 \ vol_env_carry \ volcolmemory \ volume_macro_letters \ wnoteoff \ zxxsecrets OPENMPT_S3M = amigalimits \ freqlimits \ parammemory \ patterndelaysretrig \ periodlimit \ portasmpchange OPENMPT_MOD = amigalimitsfinetune \ arpwraparound \ delaybreak \ finetune \ patternjump \ portasmpchange \ portatarget \ ptoffset \ vibratoreset MIXER = interpolation_default interpolation_loop bidi_sync \ mono_8bit_nearest mono_16bit_nearest \ stereo_8bit_nearest stereo_16bit_nearest \ mono_8bit_linear mono_16bit_linear \ stereo_8bit_linear stereo_16bit_linear \ mono_8bit_linear_filter mono_16bit_linear_filter \ stereo_8bit_linear_filter stereo_16bit_linear_filter \ mono_8bit_spline mono_16bit_spline \ stereo_8bit_spline stereo_16bit_spline \ mono_8bit_spline_filter mono_16bit_spline_filter \ stereo_8bit_spline_filter stereo_16bit_spline_filter \ downmix_8bit downmix_16bit mpt116_preamp READ = file_32bit_little_endian file_32bit_big_endian \ file_24bit_little_endian file_24bit_big_endian \ file_16bit_little_endian file_16bit_big_endian \ file_8bit \ mem_32bit_little_endian mem_32bit_big_endian \ mem_16bit_little_endian mem_16bit_big_endian \ mem_hio mem_hio_nosize file_hio_pipe WRITE = file_32bit_little_endian file_32bit_big_endian \ file_16bit_little_endian file_16bit_big_endian \ file_8bit PLAYER = read_event scan period_amiga period_mod_range pan \ med_extsample med_hold med_instruments med_ss2defpitch \ med_synth med_synth_2 \ hmn_extras \ note_off_ft2 note_off_it \ virtual_channel nna_cut nna_cont nna_off nna_fade dct_note \ s3m_sample_porta \ it_channel_filter it_cut_invalid_ins \ it_fade_env_reset it_fade_env_reset_carry \ it_keyoff it_note_after_cut it_note_delay_nna it_sample_porta \ it_sus_after_loop_bidi it_default_volume \ it_duplicate_check_transpose it_portamento_nna_sample \ it_portamento_offset it_portamento_sustain \ it_portamento_after_keyoff it_portamento_after_keyoff_cg \ it_portamento_after_cut_fade it_portamento_after_cut_fade_cg \ it_portamento_envelope_reset it_portamento_envelope_reset_cg \ xm_portamento_envelope_reset xm_portamento_target \ xm_keyoff_with_instrument \ ft2_note_noins_after_keyoff \ ft2_note_noins_after_invalid_ins \ invalid_period invalid_mod_length invalid_mod_channels \ it_noteoff_nosuck mdl_period mtm_tempo sample_sync LOADER = 6chn mod_adpcm4 mod_noterange mod_noterange2 mod_scrm mod_notawow \ mod_invalid mod_tdz3 mod_dt \ nst \ ust \ wow wow_extra \ m15 m15_invalid m15_invalid2 m15_invalid3 m15_invalid4 \ m15_invalid5 m15_invalid6 m15_orderquirk m15_short_rip \ s3m s3m_adpcm s3m_schism \ xm102 xm_adpcm xm_xmlite xm_short xm_instsamples \ it it_adpcm it_oldins it_schism it_invalid_fx \ 669 \ abk \ arch \ asylum \ chiptracker \ coco coco_patalign \ dbm dbm_rows dbm_penv dbm_venv \ digi \ dsmi dsmi_08 dsmi_09 dsmi_10 dsmi_10_trunc \ dsmi_track0 dsmi_note7f dsmi_pan dsmi_vol \ dtm \ emod \ far far_fx \ flt flt8 \ fnk \ gdm gdm_fx gdm_fx2 \ hmn \ ice \ imf \ ims \ j2b \ liq liq_no \ masi \ masi16 \ mdl0 mdl \ med2 med3 med4 med4_decvol \ mmd0 mmd0_compattempo mmd1_longpat \ mmd3 mmd_iff3oct mmdc \ mfp \ mgt \ mtm \ okt \ ptm \ pt36 \ rtm \ sfx \ stim \ stm stm_blankpat stm_v1 \ stx \ sym sym_4096pat sym_fx sym_lzwquirk \ ult \ xmf \ ac1d \ crb crb2 \ di \ eureka \ fc_m \ fuchs \ fuzzac \ gmc \ hrt \ ksm \ mp_noid \ novotrade \ np1 np2 np3 \ nru \ p40a p40b p41a p50a p60 p61 \ pha pha_short \ pm10 pm18 \ pp10_1 pp10_2 pp10_3 pp10_4 \ pp21_1 pp21_2 \ pp30_1 pp30_2 \ pru1 pru2 \ skyt \ starpack \ tdd \ titanics \ tp1 tp2 tp3 \ unic unic_id0 unic2 \ wn \ xann PROBLEMATIC = length_data_jack \ length_condom_corruption \ length_klisje_paa_klisje \ length_killvictor \ length_nebulos \ length_roadblast \ length_ode2ptk \ length_flowerpower \ length_space_traveller \ length_listen \ FUZZER = misc \ mod_no_null_terminator \ mod_no_valid_orders \ mod_scan_row_limit \ st_invalid_sample_count \ st_truncated \ s3m_invalid_sample_size \ s3m_invalid_sample_size2 \ xm_invalid \ xm_orders_mismatch \ xm_vorbis_crash \ xm_vorbis_leak \ xm_vorbis_truncated \ xm_zero_samples \ it_dca_3 \ it_invalid_compressed \ it_long_patterns \ it_truncated_header \ it_truncated_pattern \ 669_truncated \ abk_0_instruments \ abk_test_title \ abk_truncated \ amf_truncated \ amf_truncated2 \ arch_duplicate_chunk \ arch_invalid_patterns \ asy_invalid_samples \ chip_truncated \ coco_invalid_sequence \ dbm_chunk_order \ dbm_invalid_instruments \ dbm_name_buffer_overflow \ dbm_sample_count \ dbm_truncated \ dbm_truncated_inst \ digi_truncated \ dt_channels_bound \ dt_duplicate_chunk \ dt_instrument_count \ dt_invalid_loop \ dt_truncated \ emod_duplicate_chunk \ far_truncated \ flt_umr \ fnk_channels_bound \ fnk_invalid_sample_size \ fnk_patterns_bound \ fnk_truncated \ gal4_duplicate_instrument \ gal4_env_point_bound \ gal4_invalid_sample_num \ gal4_truncated \ gal5_channels_bound \ gal5_duplicate_instrument \ gal5_invalid_sample_num \ gal5_truncated \ gal5_truncated_info \ gdm_invalid_sample_size \ gdm_samples_bound \ gdm_truncated \ gdm_truncated_header \ hmn_truncated \ ice_truncated \ imf_truncated \ ims_scan_loop \ ims_truncated_magic \ liq_no_valid_orders \ liq_truncated \ masi_invalid_length \ masi_seek_loop \ masi_truncated \ masi16_invalid \ mdl_duplicate_chunk \ mdl_duplicate_is_chunk \ mdl_duplicate_pa_chunk \ mdl_duplicate_sa_chunk \ mdl_ii_after_is \ mdl_invalid_chunk_order \ mdl_invalid_run \ mdl_invalid_sample \ mdl_truncated \ mdl_umr \ med2_truncated \ med3_invalid_pattern \ med4_instrument_name \ med4_invalid_iff \ med4_invalid_sample \ mfp_truncated \ mgt_patterns_bound \ mmd0_sample_count \ mmd1_channel_count \ mmd1_invalid \ mmd3_invalid \ mmd3_invalid_mmdinfo \ mmd3_invalid_sample_size \ mtm_channels_bound \ okt_duplicate_chunk \ okt_invalid_chunk_order \ okt_sbod_leak \ pt3_ptdt_leak \ pt3_truncated \ ptm_truncated \ rtm_truncated \ rtm_zero_samples \ sfx_truncated \ stim_truncated \ stm_patterns_bound \ stx_instruments_bound \ stx_truncated \ sym_bad_sigmadelta \ sym_truncated \ sym_truncated_lzw \ ult_channels_bound \ ult_invalid_sample \ ult_invalid_tracks \ ult_truncated \ ult_v000 \ umx_invalid \ prowizard_ac1d_invalid \ prowizard_di_invalid \ prowizard_di_truncated \ prowizard_eureka_truncated \ prowizard_fuchs_invalid \ prowizard_heatseek_128_patterns \ prowizard_heatseek_truncated \ prowizard_ksm_truncated \ prowizard_noiserun_invalid \ prowizard_noiserun_truncated \ prowizard_novotrade_invalid \ prowizard_np2_invalid \ prowizard_np3_invalid \ prowizard_p40_invalid \ prowizard_p50_127_patterns \ prowizard_p50_truncated \ prowizard_p61a_invalid \ prowizard_p61a_truncated \ prowizard_pha_invalid \ prowizard_pm10c_invalid \ prowizard_pm10c_zero_length \ prowizard_pm18a_invalid \ prowizard_pm18a_zero_length \ prowizard_pp10_invalid \ prowizard_pp21_truncated \ prowizard_pp30_invalid \ prowizard_starpack_invalid \ prowizard_starpack_truncated \ prowizard_theplayer_invalid \ prowizard_titanics_truncated \ prowizard_tp1_invalid \ prowizard_tp3_invalid \ prowizard_unic_truncated \ prowizard_xann_invalid \ prowizard_zen_invalid \ depack_arc_invalid \ depack_arc_pak10 \ depack_arc_slow_rle \ depack_arcfs_invalid \ depack_bz2_invalid \ depack_bz2_truncated \ depack_compress_invalid \ depack_gz_invalid \ depack_lha_invalid \ depack_lha_truncated \ depack_lzx_invalid \ depack_muse_truncated \ depack_pp20_invalid \ depack_s404_invalid \ depack_sqsh_invalid \ depack_sqsh_truncated \ depack_zip_truncated \ play_mod_bad_invloop \ play_s3m_low_period_vibrato \ play_xm_bad_env_sustain \ play_xm_bad_instrument \ play_xm_vol_env_clamp \ play_it_bad_env \ play_it_bad_loop \ play_it_bad_set_nna \ play_it_bad_sustain \ play_it_extreme_filter \ play_it_globalvol_marker \ play_it_offset_reverse \ play_it_row_0_loop_row_delay \ play_it_sustain_bidi \ play_669_low_freq \ play_abk_0_length_track \ play_asylum_bad_effects \ play_dbm_inst_no_samples \ play_far_highbpm \ play_gdm_bad_loop \ play_hmn_bad_loop_index \ play_hmn_bad_megaarp \ play_mdl_high_c5spd \ play_mdl_zero_samples \ play_med4_0_chn_invalid_ord \ play_mmd1_synth_bad_tables \ play_stm_bad_note_toneporta \ SYNTH = #adlib #spectrum CASE1_TESTS = $(addprefix new_note_no_ins_,$(REPLAYERS)) \ $(addprefix new_note_same_ins_,$(REPLAYERS)) \ $(addprefix new_note_valid_ins_,$(REPLAYERS)) \ $(addprefix new_note_invalid_ins_,$(REPLAYERS)) CASE2_TESTS = $(addprefix no_note_same_ins_,$(REPLAYERS)) \ $(addprefix no_note_valid_ins_,$(REPLAYERS)) \ $(addprefix no_note_invalid_ins_,$(REPLAYERS)) CASE3_TESTS = $(addprefix porta_no_ins_,$(REPLAYERS)) \ $(addprefix porta_same_ins_,$(REPLAYERS)) \ $(addprefix porta_valid_ins_,$(REPLAYERS)) \ $(addprefix porta_invalid_ins_,$(REPLAYERS)) QUIRK_TESTS = $(addprefix quirk_,$(QUIRKS)) \ $(addprefix no_quirk_,$(QUIRKS)) SMPLOAD_TESTS = $(addprefix sample_load_,$(SMPLOADERS)) DEPACK_TESTS = $(addprefix depack_,$(DEPACKERS)) PROWIZARD_TESTS = $(addprefix prowizard_,$(PROWIZARD)) EFFECT_TESTS = $(addprefix effect_,$(EFFECTS)) SEQUENCER_TESTS = prev_order_start prev_order_skip prev_order_start_seq \ next_order_skip STORLEK_TESTS = $(addprefix storlek_,$(STORLEK)) OPENMPT_XM_TESTS= $(addprefix openmpt_xm_,$(OPENMPT_XM)) OPENMPT_IT_TESTS= $(addprefix openmpt_it_,$(OPENMPT_IT)) OPENMPT_S3M_TESTS= $(addprefix openmpt_s3m_,$(OPENMPT_S3M)) OPENMPT_MOD_TESTS= $(addprefix openmpt_mod_,$(OPENMPT_MOD)) MIXER_TESTS = $(addprefix mixer_,$(MIXER)) READ_TESTS = $(addprefix read_,$(READ)) WRITE_TESTS = $(addprefix write_,$(WRITE)) PLAYER_TESTS = $(addprefix player_,$(PLAYER)) LOADER_TESTS = $(addprefix loader_,$(LOADER)) SYNTH_TESTS = $(addprefix synth_,$(SYNTH)) API_TESTS = $(addprefix api_,$(API)) $(addprefix api_,$(API_SMIX)) FUZZER_TESTS = $(addprefix fuzzer_,$(FUZZER)) PROBLEM_TESTS = $(addprefix module_,$(PROBLEMATIC)) TESTS = $(READ_TESTS) \ $(WRITE_TESTS) \ $(SMPLOAD_TESTS) \ $(DEPACK_TESTS) \ $(PROWIZARD_TESTS) \ string_adjustment \ $(LOADER_TESTS) \ $(API_TESTS) \ $(QUIRK_TESTS) \ $(CASE1_TESTS) \ $(CASE2_TESTS) \ $(CASE3_TESTS) \ $(NNA_TESTS) \ $(EFFECT_TESTS) \ $(SEQUENCER_TESTS) \ $(STORLEK_TESTS) \ $(OPENMPT_XM_TESTS) \ $(OPENMPT_IT_TESTS) \ $(OPENMPT_S3M_TESTS) \ $(OPENMPT_MOD_TESTS) \ $(PLAYER_TESTS) \ $(MIXER_TESTS) \ $(SYNTH_TESTS) \ $(FUZZER_TESTS) \ $(PROBLEM_TESTS) TEST_NAMES = $(addprefix test_,$(TESTS)) MAIN_OBJS = util.o main.o simple_module.o compare_mixer_data.o TEST_OBJS = $(MAIN_OBJS) $(TEST_NAMES:=.o) TEST_DFILES = Makefile $(TEST_OBJS:.o=.c) test.h md5.h data TEST_PATH = . SRC_PATH = ../src TEST_INTERNAL = md5.o win32.o hio.o load_helpers.o loaders/itsex.o dataio.o scan.o \ loaders/sample.o loaders/common.o filetype.o period.o memio.o \ depackers/xfnmatch.o far_extras.o lfo.o T_OBJS = $(addprefix $(TEST_PATH)/,$(TEST_OBJS)) \ $(addprefix $(SRC_PATH)/,$(TEST_INTERNAL)) GCT_OBJS = $(addprefix $(TEST_PATH)/,$(TEST_OBJS)) default-test: check dist-test: mkdir -p $(DIST)/$(TEST_PATH) cp -RPp $(addprefix $(TEST_PATH)/,$(TEST_DFILES)) $(DIST)/$(TEST_PATH) clean: fuzzerclean @rm -f core *~ $(T_OBJS) @rm -f *.o @rm -f *.d distclean: clean @rm -f config.log config.status Makefile all_tests.c libxmp-tests* .test .read_test write_test vc-prepare: $(TEST_PATH)/all_tests.txt @echo Generate Makefile.vc @sed -e 's!@MAINSRCS@!\\\r\n $(subst /,\\,$(MAIN_OBJS:.o=.c \\\r\n))!' \ -e 's!@XMPSRCS@!\\\r\n $(subst .o,.c \\\r\n,$(subst /,\\,$(addprefix $(SRC_PATH)/,$(TEST_INTERNAL))))!' \ Makefile.vc.in > Makefile.vc sinclude $(T_OBJS:.o=.d) # # Utilities # utilities: gen_mixer_data gen_module_data xmpchk gen_mixer_data: gen_mixer_data.o @CMD='$(LD) $(LDFLAGS) -o $@ gen_mixer_data.o -L../lib -lxmp'; \ if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \ eval $$CMD gen_module_data: gen_module_data.o util.o ${SRC_PATH}/hio.o ${SRC_PATH}/dataio.o ${SRC_PATH}/memio.o ${SRC_PATH}/md5.o @CMD='$(LD) $(LDFLAGS) -o $@ $^ -L../lib -lxmp $(LIBS)'; \ if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \ eval $$CMD xmpchk: libxmp_fuzz.o ${SRC_PATH}/loaders/vorbis.o @CMD='$(LD) $(LDFLAGS) -o $@ $^ -L../lib -lxmp $(LIBS)'; \ if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \ eval $$CMD # # Run standard tests # check: $(TEST_PATH)/all_tests.c $(TEST_PATH)/all_tests.txt $(TEST_PATH)/libxmp-tests cd $(TEST_PATH); LD_LIBRARY_PATH=../lib DYLD_LIBRARY_PATH=../lib LIBRARY_PATH=../lib:$$LIBRARY_PATH PATH=$$PATH:../lib ./libxmp-tests $(TEST_PATH)/libxmp-tests: $(T_OBJS) @CMD='$(LD) $(LDFLAGS) -o $@ $(T_OBJS) $(LIBS) -L../lib -lxmp'; \ if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \ eval $$CMD # # Run coverage test # covercheck: coverclean $(TEST_PATH)/all_tests.c $(TEST_PATH)/libxmp-covertest cd $(TEST_PATH); LD_LIBRARY_PATH=../lib DYLD_LIBRARY_PATH=../lib LIBRARY_PATH=../lib:$$LIBRARY_PATH ./libxmp-covertest ||: lcov -c -b .. -d .. -k src -k ../include --rc lcov_branch_coverage=1 -o libxmp.cov rm -Rf coverage genhtml -o coverage --rc lcov_branch_coverage=1 libxmp.cov coverclean: @rm -f $(GCOBJS) ../lib/$(GCLIB) $(TEST_PATH)/libxmp-covertest: $(GCT_OBJS) ../lib/$(GCLIB) @CMD='$(LD) $(LDFLAGS) -o $@ $(GCT_OBJS) ../lib/$(GCLIB) -lgcov $(LIBS)'; \ if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \ eval $$CMD ../lib/$(GCLIB): make -C .. coverage $(TEST_PATH)/main.o: $(TEST_PATH)/main.c $(TEST_PATH)/all_tests.c $(TEST_PATH)/test.h $(TEST_PATH)/all_tests.c $(TEST_PATH)/test.h $(TEST_PATH)/main.c: $(TEST_PATH)/all_tests.c $(addprefix $(TEST_PATH)/,$(TEST_OBJS)): $(TEST_PATH)/all_tests.c $(TEST_PATH)/all_tests.c: $(TEST_PATH)/Makefile @echo > $@; \ for i in $(TEST_NAMES); do \ echo "declare_test($$i);" >> $@; \ done $(TEST_PATH)/all_tests.txt: $(TEST_PATH)/Makefile @$(RM) $@; \ for i in $(TEST_NAMES); do \ echo "$$i" >> $@; \ done $(addprefix $(SRC_PATH)/,$(TEST_INTERNAL)): $(SRC_PATH)/player.h # # Fuzzers # FUZZLIB_PATH = .fuzzer FUZZ_ASAN_FLAGS = -O3 -fsanitize=fuzzer,address,undefined -fno-sanitize-recover=all -fno-sanitize=shift-base -fno-omit-frame-pointer -g -DLIBXMP_LIBFUZZER FUZZ_MSAN_FLAGS = -O3 -fsanitize=fuzzer,memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -DLIBXMP_LIBFUZZER FUZZLIB_ASAN_FLAGS = $(subst fuzzer,fuzzer-no-link,$(FUZZ_ASAN_FLAGS)) FUZZLIB_MSAN_FLAGS = $(subst fuzzer,fuzzer-no-link,$(FUZZ_MSAN_FLAGS)) FUZZ_CC ?= clang .PHONY: fuzzers fuzzerclean $(FUZZLIB_PATH) fuzzers: libxmp_fuzz_asan libxmp_fuzz_msan fuzzerclean: rm -rf $(FUZZLIB_PATH) libxmp_fuzz_asan libxmp_fuzz_msan $(FUZZLIB_PATH): rm -rf $(FUZZLIB_PATH) mkdir -p $(FUZZLIB_PATH) (BASE=$$(pwd); cd .. && git checkout-index -a --prefix "$$BASE/$(FUZZLIB_PATH)/") $(FUZZLIB_PATH)/libxmp-asan.a: $(FUZZLIB_PATH) (cd $(FUZZLIB_PATH) && \ $(AUTOCONF) && \ CC="$(FUZZ_CC)" CFLAGS="$(FUZZLIB_ASAN_FLAGS)" LDFLAGS="$(FUZZLIB_ASAN_FLAGS)" ./configure && \ $(MAKE) static && \ cp lib/libxmp.a libxmp-asan.a && \ $(MAKE) distclean) $(FUZZLIB_PATH)/libxmp-msan.a: $(FUZZLIB_PATH) | $(FUZZLIB_PATH)/libxmp-asan.a (cd $(FUZZLIB_PATH) && \ $(AUTOCONF) && \ CC="$(FUZZ_CC)" CFLAGS="$(FUZZLIB_MSAN_FLAGS)" LDFLAGS="$(FUZZLIB_MSAN_FLAGS)" ./configure && \ $(MAKE) static && \ cp lib/libxmp.a libxmp-msan.a && \ $(MAKE) distclean) libxmp_fuzz_asan: libxmp_fuzz.c $(FUZZLIB_PATH)/libxmp-asan.a @CMD='$(FUZZ_CC) $(FUZZ_ASAN_FLAGS) -o $@ $< -L$(FUZZLIB_PATH) -lxmp-asan'; \ if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \ eval $$CMD libxmp_fuzz_msan: libxmp_fuzz.c $(FUZZLIB_PATH)/libxmp-msan.a @CMD='$(FUZZ_CC) $(FUZZ_MSAN_FLAGS) -o $@ $< -L$(FUZZLIB_PATH) -lxmp-msan'; \ if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \ eval $$CMD