do ifopt help echo "Available options are: debug - Build debug instead of release verbose - Show system commands instead of decorated messages clean - Clean temp files (use with debug to clean debug files) zdoom.pk3 - (Re)build just zdoom.pk3, even if it already exists To use with MinGW, compile cbuild.c into an executable using: gcc -O2 -W -Wall -Werror -o cbuild.exe cbuild.c Or if you have a sh-compatible shell, you can run the cbuild.c file directly or have it automatically compile itself with GCC by passing --make-compiled " exit 0 done # Here's the main script. All commands are case in-sensitive. # 'Ifopt' will check if the following word was passed on the command line, and execute the # rest of the line if so. The reverse, 'ifnopt', also exists. ifopt verbose verbose 1 ifopt debug CONFIG = Debug # VAR?=foo will only set the var if it's unset. Note that if you want spaces, put '' or "" # quotes around the value. VAR+=foo will append foo to the very end of the existing var. # And, VAR-=foo will remove all occurences of foo from the var. CONFIG ?= Release OPTLEVEL ?= 2 ARCH_TYPE ?= pentium TUNE_TYPE ?= athlon-xp RELEASETARGET ?= zdoomgcc DEBUGTARGET ?= zdoomgccd DEBUGOBJDIR = debugobj RELEASEOBJDIR = releaseobj CPPFLAGS = "-DHAVE_FILELENGTH -D__forceinline=inline -Izlib -IFLAC -Isrc -Isrc/sdl -Isrc/g_doom -Isrc/g_heretic -Isrc/g_hexen -Isrc/g_raven -Isrc/g_strife -Isrc/g_shared -Isrc/oplsynth -Isrc/sound" LDFLAGS = "-lFLAC++ -lFLAC -lz -lfmod `sdl-config --libs`" CFLAGS = "`sdl-config --cflags` " do ifopt debug OBJDIR = "${DEBUGOBJDIR}" CFLAGS += "-Wall -Wno-unused -g3" CPPFLAGS += " -D_DEBUG" CXXFLAGS = "${CFLAGS}" NASMFLAGS = "-g" TARGET = "${DEBUGTARGET}" else OBJDIR = "${RELEASEOBJDIR}" CFLAGS += "-march=${ARCH_TYPE} -mtune=${TUNE_TYPE} -Wall -Wno-unused -O${OPTLEVEL} -fomit-frame-pointer -ffunction-sections -fvtable-gc -fno-rtti" CPPFLAGS += " -DNDEBUG" CXXFLAGS = "${CFLAGS}" LDFLAGS += " -s -Wl,--gc-sections,-Map=zdoomgcc.map" TARGET = "${RELEASETARGET}" done ifnplat win32 CPPFLAGS += " -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp" # This is where the object and dependancy files go when compiled OBJ_DIR = "${OBJDIR}" DEP_DIR = "${OBJDIR}" do ifnopt clean EVILCLEAN = 0 ifnexist "${OBJ_DIR}" mkdir "${OBJ_DIR}" ifopt zdoom.pk3 goto makewad do if "${NOASM}"="" # This sets a custom command to run durring a compile for files with the # given extension. <@> is replaced with the output file, is the source, # and <*> is the raw name as given to the compile command, without the # extension do ifplat win32 associate 'nas' 'nasmw -o <@> -f win32 ' else ifplat unix associate 'nas' 'nasm -o <@> -f elf -DM_TARGET_LINUX ' else echo '' echo Disabling assembly for this platform. echo '' goto no_asm done CPPFLAGS = "-DUSEASM ${CPPFLAGS}" else #:no_asm CPPFLAGS = "-DNOASM ${CPPFLAGS}" done # Set the compile and link commands. 'Compile' will compile the list of sourcefiles and # store their names until another Compile is encountered (if you wish to add to a previous # list, use 'Compileadd'). # # C sources are compiled with: # ${CC} ${CPPFLAGS} ${CFLAGS} ${DEP_OPT}${DEP_DIR}/file-sans-ext${DEP_EXT} ${OUT_OPT}${OBJ_DIR}/file-sans-ext${OBJ_EXT} ${SRC_OPT}detected-source-path/file-with-ext # # and for C++ sources: # ${CXX} ${CPPFLAGS} ${CXXFLAGS} ${DEP_OPT}${DEP_DIR}/file-sans-ext${DEP_EXT} ${OUT_OPT}${OBJ_DIR}/file-sans-ext${OBJ_EXT} ${SRC_OPT}detected-source-path/file-with-ext # # A source file will not be compiled if the object file exists and is newer than the source. # Or if the associated dependancy file exists, all of the object's dependancies are older # than the object. # # If DEP_OPT is unset, the whole DEP_* section will be removed from the command line. Files # with unknown extensions are silently ignored (but will still be passed to Linkexec with # their name "object-ified"). # # 'Linkexec' executes: # ${LD} ${OUT_OPT}file${EXE_EXT} ${LDFLAGS} # # It will not link if the target executable exists and is newer than all of the objects it's # linking with. COMPILER = Compile LINK = Linkexec # This is where it can find the sources. src_paths src src/g_doom src/g_heretic src/g_hexen src/g_raven src/g_strife \ src/g_shared src/oplsynth src/sound src/sdl else # Override the compile and link commands with rmobj and rmexec. A quick way to delete # the objects and executables while dealing with only one list. No, rmobj will not # delete the specified source file, but rather the object and dependancy files that would # result from compiling the specified source. EVILCLEAN = 1 COMPILER = -rmobj LINK = -rmexec done ${COMPILER} "autostart.cpp \ a.nas \ misc.nas \ tmap.nas \ tmap2.nas \ tmap3.nas \ am_map.cpp \ b_bot.cpp \ b_func.cpp \ b_game.cpp \ b_move.cpp \ b_think.cpp \ bbannouncer.cpp \ c_bind.cpp \ c_cmds.cpp \ c_console.cpp \ c_cvars.cpp \ c_dispatch.cpp \ c_expr.cpp \ cmdlib.cpp \ colormatcher.cpp \ configfile.cpp \ ct_chat.cpp \ d_dehacked.cpp \ d_main.cpp \ d_net.cpp \ d_netinfo.cpp \ d_protocol.cpp \ decallib.cpp \ decorations.cpp \ dobject.cpp \ dobjtype.cpp \ doomdef.cpp \ doomstat.cpp \ dsectoreffect.cpp \ dthinker.cpp \ empty.cpp \ f_finale.cpp \ f_wipe.cpp \ farchive.cpp \ files.cpp \ g_game.cpp \ g_hub.cpp \ g_level.cpp \ gameconfigfile.cpp \ gi.cpp \ hu_scores.cpp \ info.cpp \ infodefaults.cpp \ lumpconfigfile.cpp \ m_alloc.cpp \ m_argv.cpp \ m_bbox.cpp \ m_cheat.cpp \ m_fixed.cpp \ m_menu.cpp \ m_misc.cpp \ m_options.cpp \ m_png.cpp \ m_random.cpp \ mus2midi.cpp \ nodebuild.cpp \ nodebuild_events.cpp \ nodebuild_extract.cpp \ nodebuild_gl.cpp \ nodebuild_utility.cpp \ p_acs.cpp \ p_buildmap.cpp \ p_ceiling.cpp \ p_conversation.cpp \ p_doors.cpp \ p_effect.cpp \ p_enemy.cpp \ p_floor.cpp \ p_interaction.cpp \ p_lights.cpp \ p_lnspec.cpp \ p_map.cpp \ p_maputl.cpp \ p_mobj.cpp \ p_pillar.cpp \ p_plats.cpp \ p_pspr.cpp \ p_saveg.cpp \ p_sectors.cpp \ p_setup.cpp \ p_sight.cpp \ p_spec.cpp \ p_switch.cpp \ p_teleport.cpp \ p_terrain.cpp \ p_things.cpp \ p_tick.cpp \ p_trace.cpp \ p_user.cpp \ p_writemap.cpp \ p_xlat.cpp \ po_man.cpp \ r_anim.cpp \ r_bsp.cpp \ r_data.cpp \ r_draw.cpp \ r_drawt.cpp \ r_main.cpp \ r_plane.cpp \ r_segs.cpp \ r_sky.cpp \ r_things.cpp \ r_polymost.cpp \ s_advsound.cpp \ s_environment.cpp \ s_playlist.cpp \ s_sndseq.cpp \ s_sound.cpp \ sc_man.cpp \ skins.cpp \ st_stuff.cpp \ stats.cpp \ stringtable.cpp \ tables.cpp \ tempfiles.cpp \ thingdef.cpp \ thingdef_codeptr.cpp \ thingdef_exp.cpp \ v_collection.cpp \ v_draw.cpp \ v_font.cpp \ v_palette.cpp \ v_pfx.cpp \ v_text.cpp \ v_video.cpp \ vectors.cpp \ name.cpp \ zstring.cpp \ zstrformat.cpp \ w_wad.cpp \ wi_stuff.cpp \ a_arachnotron.cpp \ a_archvile.cpp \ a_bossbrain.cpp \ a_bruiser.cpp \ a_cacodemon.cpp \ a_cyberdemon.cpp \ a_demon.cpp \ a_doomartifacts.cpp \ a_doomhealth.cpp \ a_doomimp.cpp \ a_doommisc.cpp \ a_doomplayer.cpp \ a_doomweaps.cpp \ a_fatso.cpp \ a_keen.cpp \ a_lostsoul.cpp \ a_painelemental.cpp \ a_possessed.cpp \ a_revenant.cpp \ a_scriptedmarine.cpp \ a_spidermaster.cpp \ doom_sbar.cpp \ a_beast.cpp \ a_chicken.cpp \ a_clink.cpp \ a_dsparil.cpp \ a_hereticartifacts.cpp \ a_hereticimp.cpp \ a_heretickeys.cpp \ a_hereticmisc.cpp \ a_hereticplayer.cpp \ a_hereticweaps.cpp \ a_ironlich.cpp \ a_knight.cpp \ a_mummy.cpp \ a_snake.cpp \ a_wizard.cpp \ heretic_sbar.cpp \ a_bats.cpp \ a_bishop.cpp \ a_blastradius.cpp \ a_boostarmor.cpp \ a_centaur.cpp \ a_clericboss.cpp \ a_clericflame.cpp \ a_clericholy.cpp \ a_clericmace.cpp \ a_clericplayer.cpp \ a_clericstaff.cpp \ a_demons.cpp \ a_dragon.cpp \ a_ettin.cpp \ a_fighteraxe.cpp \ a_fighterboss.cpp \ a_fighterhammer.cpp \ a_fighterplayer.cpp \ a_fighterquietus.cpp \ a_firedemon.cpp \ a_flechette.cpp \ a_fog.cpp \ a_healingradius.cpp \ a_heresiarch.cpp \ a_hexenspecialdecs.cpp \ a_iceguy.cpp \ a_korax.cpp \ a_mageboss.cpp \ a_magecone.cpp \ a_magelightning.cpp \ a_mageplayer.cpp \ a_magestaff.cpp \ a_magewand.cpp \ a_mana.cpp \ a_pig.cpp \ a_puzzleitems.cpp \ a_serpent.cpp \ a_spike.cpp \ a_summon.cpp \ a_teleportother.cpp \ a_weaponpieces.cpp \ a_wraith.cpp \ hexen_sbar.cpp \ a_artiegg.cpp \ a_artitele.cpp \ a_minotaur.cpp \ a_ravenambient.cpp \ a_acolyte.cpp \ a_alienspectres.cpp \ a_coin.cpp \ a_crusader.cpp \ a_entityboss.cpp \ a_inquisitor.cpp \ a_loremaster.cpp \ a_macil.cpp \ a_oracle.cpp \ a_programmer.cpp \ a_reaver.cpp \ a_rebels.cpp \ a_sentinel.cpp \ a_spectral.cpp \ a_stalker.cpp \ a_strifeammo.cpp \ a_strifebishop.cpp \ a_strifeitems.cpp \ a_strifeplayer.cpp \ a_strifestuff.cpp \ a_strifeweapons.cpp \ a_templar.cpp \ a_thingstoblowup.cpp \ strife_sbar.cpp \ a_action.cpp \ a_artifacts.cpp \ a_bridge.cpp \ a_camera.cpp \ a_debris.cpp \ a_decals.cpp \ a_flashfader.cpp \ a_fountain.cpp \ a_hatetarget.cpp \ a_keys.cpp \ a_lightning.cpp \ a_movingcamera.cpp \ a_pickups.cpp \ a_quake.cpp \ a_secrettrigger.cpp \ a_sectoraction.cpp \ a_sharedmisc.cpp \ a_skies.cpp \ a_soundenvironment.cpp \ a_soundsequence.cpp \ a_spark.cpp \ a_waterzone.cpp \ a_weaponpiece.cpp \ a_weapons.cpp \ hudmessages.cpp \ shared_sbar.cpp \ fmopl.cpp \ mlkernel.cpp \ mlopl.cpp \ mlopl_io.cpp \ opl_mus_player.cpp \ fmodsound.cpp \ i_music.cpp \ i_sound.cpp \ music_cd.cpp \ music_flac.cpp \ music_midi_midiout.cpp \ music_midi_stream.cpp \ music_midi_timidity.cpp \ music_mod.cpp \ music_mus_midiout.cpp \ music_mus_opl.cpp \ music_stream.cpp \ sample_flac.cpp \ crashcatcher.c \ i_input.cpp \ i_net.cpp \ i_cd.cpp \ i_main.cpp \ i_system.cpp \ hardware.cpp \ i_movie.cpp \ sdlvideo.cpp \ autozend.cpp" ${LINK} "${TARGET}" # If we're not cleaning and zdoom.pk3 exists, exit now. if "${EVILCLEAN}"="0" ifexist zdoom.pk3 exit 0 #:makewad CFLAGS = '-Os -Wall -fomit-frame-pointer' LDFLAGS = '-s -lz' src_paths tools/makewad ${COMPILER} makewad.c ioapi.c zip.c ${LINK} tools/makewad/makewad LDFLAGS = '-s' src_paths tools/xlatcc ${COMPILER} xlat-parse.tab.c gen.c ${LINK} tools/xlatcc/xlatcc src_paths tools/dehsupp ${COMPILER} parse.tab.c ${LINK} tools/dehsupp/dehsupp do if "${EVILCLEAN}"="1" -rm "${OBJ_DIR}" -rm "${DEP_DIR}" -rm zdoomgcc.map -rm zdoom.pk3 else chdir wadsrc do ifret 0 -call ../tools/makewad/makewad zdoom.lst ifret 0 -copy zdoom.pk3 ../ chdir .. done done