Makefile

Wed, 16 Jan 2013 00:34:11 +0000

author
Philip Pemberton <philpem@philpem.me.uk>
date
Wed, 16 Jan 2013 00:34:11 +0000
changeset 122
b214cf455ff2
parent 112
a392eb8f9806
child 128
3246b74d96bc
child 137
994d03cdcba2
permissions
-rw-r--r--

[wd2010] use size_t for init filesize, make disc init more verbose

philpem@0 1 # Phil's multiplatform makefile template
philpem@0 2 # With auto-incrementing build number and automatic version.h generation
philpem@14 3 # Version 1.9, 2010-02-15
philpem@0 4 #
philpem@0 5 # The latest version of this Makefile can be found at http://www.philpem.me.uk/
philpem@0 6 #
philpem@0 7 #
philpem@0 8 # Copyright (c) 2010 Philip Pemberton <code@philpem.me.uk>
philpem@0 9 #
philpem@0 10 # Permission is hereby granted, free of charge, to any person obtaining a copy
philpem@0 11 # of this software and associated documentation files (the "Software"), to deal
philpem@0 12 # in the Software without restriction, including without limitation the rights
philpem@0 13 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
philpem@0 14 # copies of the Software, and to permit persons to whom the Software is
philpem@0 15 # furnished to do so, subject to the following conditions:
philpem@0 16 #
philpem@0 17 # The above copyright notice and this permission notice shall be included in
philpem@0 18 # all copies or substantial portions of the Software.
philpem@0 19 #
philpem@0 20 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
philpem@0 21 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
philpem@0 22 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
philpem@0 23 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
philpem@0 24 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
philpem@0 25 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
philpem@0 26 # THE SOFTWARE.
philpem@0 27 #
philpem@0 28 #
philpem@0 29 # Instructions for use:
philpem@0 30 # Run 'make init' to create the required directories
philpem@0 31 # Add your source files to the 'SOURCES' list, and change the TARGET filename
philpem@0 32 # Set the desired build type and platform in the BUILD_TYPE and PLATFORM
philpem@0 33 # variables respectively
philpem@0 34 # Set your project type (C only, or C++) in the SRC_TYPE variable
philpem@0 35 # Add any libraries you need to link against to the 'LIB' list
philpem@0 36 # Run 'make'
philpem@0 37 #
philpem@0 38 # Object files are created in the 'obj' subdirectory, from source code in the
philpem@0 39 # 'src' directory. Dependency files are created in the 'dep' directory from
philpem@0 40 # the same source code the object files are created from.
philpem@0 41 #
philpem@0 42 # Supported targets are:
philpem@0 43 # all Build everything.
philpem@0 44 # update-revision Increment the build number without building anything.
philpem@0 45 # clean-versioninfo Delete src/version.h (will be rebuilt on the next
philpem@0 46 # 'make all').
philpem@0 47 # init Initialise the build system for a new project.
philpem@0 48 # WARNING: overwrites .buildnum and src/version.h.in!
philpem@0 49 # cleandep Delete all dependency files.
philpem@0 50 # clean Delete all dependency, intermediate and target files.
philpem@0 51 # tidy Delete all dependency and intermediate files, leaving
philpem@0 52 # the target file intact.
philpem@0 53 #
philpem@0 54 # If you want to reset the build number to zero, delete '.buildnum'. This
philpem@0 55 # should be done whenever the major or minor version changes. Excluding
philpem@0 56 # .buildnum from version control may also be a good idea, depending on how
philpem@0 57 # you want your build numbers to work.
philpem@0 58 #
philpem@0 59 # The BUILD_TYPE variable contains the current build type. There are two
philpem@0 60 # supported build types:
philpem@0 61 # debug Debug mode - object files are compiled with debug information
philpem@0 62 # and the target is left unstripped.
philpem@0 63 # release Release mode - object files are not compiled with debug info,
philpem@0 64 # and the target is fed through strip to remove redundant
philpem@0 65 # data.
philpem@0 66 #
philpem@0 67 # The PLATFORM variable contains the current target platform. There are two
philpem@0 68 # supported platforms:
philpem@0 69 # linux GNU/Linux with GNU Compiler Collection
philpem@0 70 # win32 Windows 32-bit with MinGW
philpem@0 71 #
philpem@0 72 # The EXTSRC variable is used to specify other files to build. It is typically
philpem@0 73 # used to specify platform or build-type specific source files, e.g.
philpem@0 74 #
philpem@0 75 # ifeq ($(BUILD_TYPE),debug-memwatch)
philpem@0 76 # CFLAGS += -g -ggdb
philpem@0 77 # CPPFLAGS += -DMEMWATCH
philpem@0 78 # INCPATH += ./memwatch
philpem@0 79 # EXTSRC += memwatch/memwatch.c
philpem@0 80 # endif
philpem@0 81 #
philpem@0 82 # (example taken from one of my projects that allowed the use of Memwatch to
philpem@0 83 # track down memory allocation/deallocation bugs)
philpem@0 84 #
philpem@0 85 #
philpem@0 86 # Change history:
philpem@14 87 # 1.9 - Bugfix -- if CFLAGS contained a forward-slash, sed would fall over.
philpem@14 88 # Also added SDL support and fixed the date/time formats. To use SDL,
philpem@14 89 # set ENABLE_SDL to "yes".
philpem@0 90 # 1.8 - Now supports the use of the wxWidgets GUI framework. To turn
philpem@0 91 # this on, set ENABLE_WX to "yes".
philpem@0 92 # 1.7 - Now creates a basic Hgignore file and directory keepers for the
philpem@0 93 # dep and obj directories.
philpem@0 94 # 1.6 - Added CFLAGS and CXXFLAGS to the command-lines for the dependency
philpem@0 95 # building commands. This was causing issues with C99 / C++0x mode.
philpem@0 96 # 1.5 - Added support for Mercurial revision (changeset ID) display
philpem@0 97 # Fixed a few issues with Subversion support (svn: and version 0 would
philpem@0 98 # be displayed for exported code)
philpem@0 99 #
philpem@0 100
philpem@0 101 ####
philpem@0 102 # Build configuration
philpem@0 103 ####
philpem@0 104
philpem@0 105 # version information -- major.minor.extra
philpem@0 106 # note that VER_EXTRA can be overridden on the command line, e.g.:
philpem@0 107 # make VER_EXTRA=12345 all
philpem@0 108 VER_MAJOR = 0
philpem@0 109 VER_MINOR = 0
philpem@0 110 VER_EXTRA ?=
philpem@0 111
philpem@0 112 # build platform: win32 or linux
philpem@0 113 PLATFORM ?= linux
philpem@0 114 # build type: release or debug
philpem@0 115 BUILD_TYPE ?= debug
philpem@0 116
philpem@0 117 # target executable
philpem@6 118 TARGET = freebee
philpem@0 119
philpem@0 120 # source files that produce object files
philpem@112 121 SRC = main.c state.c memory.c wd279x.c wd2010.c keyboard.c
philpem@18 122 SRC += musashi/m68kcpu.c musashi/m68kdasm.c musashi/m68kops.c musashi/m68kopac.c musashi/m68kopdm.c musashi/m68kopnz.c
philpem@0 123
philpem@0 124 # source type - either "c" or "cpp" (C or C++)
philpem@0 125 SRC_TYPE = c
philpem@0 126
philpem@0 127 # additional object files that don't necessarily include source
philpem@0 128 EXT_OBJ =
philpem@0 129 # libraries to link in -- these will be specified as "-l" parameters, the -l
philpem@0 130 # is prepended automatically
philpem@3 131 LIB =
philpem@0 132 # library paths -- where to search for the above libraries
philpem@3 133 LIBPATH =
philpem@0 134 # include paths -- where to search for #include files (in addition to the
philpem@0 135 # standard paths
philpem@3 136 INCPATH =
philpem@0 137 # garbage files that should be deleted on a 'make clean' or 'make tidy'
philpem@0 138 GARBAGE = obj/musashi/m68kmake obj/musashi/m68kmake.exe obj/musashi/m68kmake.o
philpem@0 139
philpem@0 140 # extra dependencies - files that we don't necessarily know how to build, but
philpem@0 141 # that are required for building the application; e.g. object files or
philpem@0 142 # libraries in sub or parent directories
philpem@0 143 EXTDEP =
philpem@0 144
philpem@0 145 # Extra libraries
philpem@0 146 # wxWidgets: set to "yes" to enable, anything else to disable
philpem@0 147 ENABLE_WX = no
philpem@0 148 # wxWidgets: list of wxWidgets libraries to enable
philpem@0 149 WX_LIBS = std
philpem@3 150 # SDL: set to "yes" to enable, anything else to disable
philpem@3 151 ENABLE_SDL = yes
philpem@0 152
philpem@0 153 ####
philpem@0 154 # Win32 target-specific settings
philpem@0 155 ####
philpem@0 156 ifeq ($(strip $(PLATFORM)),win32)
philpem@0 157 # windows executables have a .exe suffix
philpem@0 158 TARGET := $(addsuffix .exe,$(TARGET))
philpem@0 159 # console mode application
philpem@0 160 EXT_CFLAGS = -mconsole
philpem@0 161 endif
philpem@0 162
philpem@0 163
philpem@0 164 ####
philpem@0 165 # Tool setup
philpem@0 166 ####
philpem@0 167 MAKE = make
philpem@0 168 CC = gcc
philpem@0 169 CXX = g++
philpem@0 170 CFLAGS = -Wall -pedantic -std=gnu99 $(EXT_CFLAGS)
philpem@0 171 CXXFLAGS= -Wall -pedantic -std=gnu++0x $(EXT_CXXFLAGS)
philpem@0 172 LDFLAGS = $(EXT_LDFLAGS)
philpem@0 173 RM = rm
philpem@0 174 STRIP = strip
philpem@0 175
philpem@0 176 ###############################################################################
philpem@0 177 # You should not need to touch anything below here, unless you're adding a new
philpem@0 178 # platform or build type (or changing the version string format)
philpem@0 179 ###############################################################################
philpem@0 180
philpem@0 181 ####
philpem@0 182 # A quick sanity check on the platform type
philpem@0 183 ####
philpem@0 184 ifneq ($(PLATFORM),linux)
philpem@0 185 ifneq ($(PLATFORM),win32)
philpem@0 186 $(error Platform '$(PLATFORM)' not supported. Supported platforms are: linux, win32)
philpem@0 187 endif
philpem@0 188 endif
philpem@0 189
philpem@0 190 ####
philpem@0 191 # Version info generation
philpem@0 192 ####
philpem@0 193 # get the current build number
philpem@0 194 VER_BUILDNUM = $(shell cat .buildnum)
philpem@0 195
philpem@0 196 #### --- begin Subversion revision grabber ---
philpem@0 197 # there are two ways to get the SVN revision - use svnversion, or use svn info
philpem@0 198 # then pipe through awk. which one you use is up to you.
philpem@0 199 VER_SVNREV = $(shell LANG=C svn info 2>/dev/null || echo 'Revision: exported' | awk '/^Revision:/ { print$$2 }' )
philpem@0 200 #VER_SVNREV = $(shell svnversion .)
philpem@0 201
philpem@0 202 # if the version string is "exported", then the CSD was not checked out of SVN
philpem@0 203 # note that if the CSD is not an SVN checkout, then @@svnrev@@ will be set to
philpem@0 204 # zero.
philpem@0 205 ifeq ($(VER_SVNREV),exported)
philpem@0 206 VER_VCS = none
philpem@0 207 VER_VCSREV = 0
philpem@0 208 else
philpem@0 209 VER_VCS = svn
philpem@0 210 VER_VCSREV = $(VER_SVNREV)
philpem@0 211 endif
philpem@0 212
philpem@0 213 #### --- begin Mercurial revision grabber ---
philpem@0 214 # If SVN didn't give us a revision, try Mercurial instead
philpem@0 215 ifeq ($(VER_VCS),none)
philpem@0 216 # get the current Mercurial changeset number
philpem@0 217 VER_HGREV=$(shell ((hg tip --template "{node|short}") || echo "000000000000") 2>/dev/null)
philpem@0 218 ifneq ($(VER_HGREV),000000000000)
philpem@0 219 # a non-empty repo
philpem@0 220 VER_VCS = hg
philpem@0 221 VER_VCSREV = $(VER_HGREV)
philpem@0 222 else
philpem@0 223 # either an empty Hg repo, or no repo at all
philpem@0 224 VER_VCS = none
philpem@0 225 VER_VCSREV = 0
philpem@0 226 endif
philpem@0 227 endif
philpem@0 228
philpem@0 229 #### --- end version grabbers ---
philpem@0 230
philpem@0 231 # start creating the revision string
philpem@0 232 VER_FULLSTR = $(VER_MAJOR).$(VER_MINOR).$(VER_BUILDNUM)$(VER_EXTRA)
philpem@0 233
philpem@0 234 # if this is a VCS release, include the SVN revision in the version string
philpem@0 235 # also create a revision string that is either "svn:12345", "hg:12345" or
philpem@0 236 # blank
philpem@0 237 ifneq ($(VER_VCS),none)
philpem@0 238 VER_FULLSTR += ($(VER_VCS) $(VER_VCSREV))
philpem@0 239 VER_VCSSTR = $(VER_VCS):$(VER_VCSREV)
philpem@0 240 else
philpem@0 241 VER_VCSSTR =
philpem@0 242 endif
philpem@0 243
philpem@0 244
philpem@0 245 ####
philpem@0 246 # Build-type specific configuration
philpem@0 247 ####
philpem@0 248 ifeq ($(BUILD_TYPE),debug)
philpem@0 249 CFLAGS += -g -ggdb -DDEBUG
philpem@0 250 CXXFLAGS += -g -ggdb -DDEBUG
philpem@0 251 else
philpem@0 252 ifeq ($(BUILD_TYPE),release)
philpem@0 253 CFLAGS += -O2
philpem@0 254 CXXFLAGS += -O2
philpem@0 255 else
philpem@0 256 $(error Unsupported build type: '$(BUILD_TYPE)')
philpem@0 257 endif
philpem@0 258 endif
philpem@0 259
philpem@0 260 ####
philpem@0 261 # wxWidgets support
philpem@0 262 ####
philpem@0 263 ifeq ($(ENABLE_WX),yes)
philpem@0 264 ifeq ($(BUILD_TYPE),debug)
philpem@0 265 LIBLNK += `wx-config --debug --libs $(WX_LIBS)`
philpem@0 266 CFLAGS += `wx-config --debug --cflags $(WX_LIBS)`
philpem@0 267 CXXFLAGS += `wx-config --debug --cxxflags $(WX_LIBS)`
philpem@0 268 CPPFLAGS += `wx-config --debug --cppflags $(WX_LIBS)`
philpem@0 269 else
philpem@0 270 ifeq ($(BUILD_TYPE),release)
philpem@0 271 LIBLNK += `wx-config --libs $(WX_LIBS)`
philpem@0 272 CFLAGS += `wx-config --cflags $(WX_LIBS)`
philpem@0 273 CPPFLAGS += `wx-config --cppflags $(WX_LIBS)`
philpem@0 274 CXXFLAGS += `wx-config --cxxflags $(WX_LIBS)`
philpem@0 275 else
philpem@0 276 $(error Unsupported build type: '$(BUILD_TYPE)')
philpem@0 277 endif
philpem@0 278 endif
philpem@0 279 endif
philpem@0 280
philpem@0 281 ####
philpem@3 282 # SDL support
philpem@3 283 ####
philpem@3 284 ifeq ($(ENABLE_SDL),yes)
philpem@13 285 LIBLNK += $(shell sdl-config --libs)
philpem@13 286 CFLAGS += $(shell sdl-config --cflags)
philpem@3 287 endif
philpem@3 288
philpem@3 289
philpem@3 290 ####
philpem@0 291 # rules
philpem@0 292 ####
philpem@0 293
philpem@0 294 # object files
philpem@0 295 OBJ = $(addprefix obj/, $(addsuffix .o, $(basename $(SRC))) $(EXT_OBJ)) $(addsuffix .o, $(basename $(EXTSRC)))
philpem@0 296
philpem@0 297 # dependency files
philpem@0 298 DEPFILES = $(addprefix dep/, $(addsuffix .d, $(basename $(SRC))) $(EXT_OBJ)) $(addsuffix .d, $(basename $(EXTSRC)))
philpem@0 299
philpem@0 300 # path commands
philpem@0 301 LIBLNK += $(addprefix -l, $(LIB))
philpem@0 302 LIBPTH += $(addprefix -L, $(LIBPATH))
philpem@0 303 INCPTH += $(addprefix -I, $(INCPATH))
philpem@0 304
philpem@0 305 CPPFLAGS += $(INCPTH)
philpem@0 306
philpem@0 307 ####
philpem@0 308 # Make sure there is at least one object file to be linked in
philpem@0 309 ####
philpem@0 310 ifeq ($(strip $(OBJ)),)
philpem@0 311 $(error Unable to build: no object or source files specified in Makefile)
philpem@0 312 endif
philpem@0 313
philpem@0 314 ####
philpem@0 315 # targets
philpem@0 316 ####
philpem@0 317 .PHONY: default all update-revision versionheader clean-versioninfo init cleandep clean tidy
philpem@0 318
philpem@0 319 all: update-revision
philpem@0 320 @$(MAKE) versionheader
philpem@0 321 $(MAKE) $(TARGET)
philpem@0 322
philpem@0 323 # increment the current build number
philpem@0 324 NEWBUILD=$(shell expr $(VER_BUILDNUM) + 1)
philpem@0 325 update-revision:
philpem@0 326 @echo $(NEWBUILD) > .buildnum
philpem@0 327
philpem@0 328 versionheader:
philpem@13 329 @sed -e 's/@@datetime@@/$(shell LC_ALL=C date +"%a %d-%b-%Y %T %Z")/g' \
philpem@13 330 -e 's/@@date@@/$(shell LC_ALL=C date +"%a %d-%b-%Y")/g' \
philpem@13 331 -e 's/@@time@@/$(shell LC_ALL=C date +"%T %Z")/g' \
philpem@0 332 -e 's/@@whoami@@/$(shell whoami)/g' \
philpem@0 333 -e 's/@@hostname@@/$(shell hostname)/g' \
philpem@0 334 -e 's|@@compiler@@|$(shell $(CC) $(CFLAGS) -v 2>&1 | tail -n 1 | sed -e "s;|;/;")|g' \
philpem@0 335 -e 's/@@majorver@@/$(VER_MAJOR)/g' \
philpem@0 336 -e 's/@@minorver@@/$(VER_MINOR)/g' \
philpem@0 337 -e 's/@@extraver@@/$(subst \",,$(VER_EXTRA))/g' \
philpem@0 338 -e 's/@@buildnum@@/$(VER_BUILDNUM)/g' \
philpem@0 339 -e 's/@@buildtype@@/$(BUILD_TYPE)/g' \
philpem@0 340 -e 's/@@vcs@@/$(VER_VCS)/g' \
philpem@0 341 -e 's/@@vcsrev@@/$(VER_VCSREV)/g' \
philpem@0 342 -e 's/@@vcsstr@@/$(VER_VCSSTR)/g' \
philpem@0 343 -e 's/@@fullverstr@@/$(VER_FULLSTR)/g' \
philpem@14 344 -e 's#@@cflags@@#$(CFLAGS)#g' \
philpem@0 345 < src/version.h.in > src/version.h
philpem@0 346
philpem@0 347 # version.h creation stuff based on code from the Xen makefile
philpem@0 348 clean-versioninfo:
philpem@0 349 @if [ ! -r src/version.h -o -O src/version.h ]; then \
philpem@0 350 rm -f src/version.h; \
philpem@0 351 fi
philpem@0 352 @echo 0 > .buildnum
philpem@0 353
philpem@0 354 # initialise the build system for a new project
philpem@0 355 init:
philpem@0 356 @mkdir -p src dep obj
philpem@0 357 @echo "This file is a directory-keeper. Do not delete it." > dep/.keepme
philpem@0 358 @echo "This file is a directory-keeper. Do not delete it." > obj/.keepme
philpem@0 359 @echo 0 > .buildnum
philpem@0 360 @echo 'syntax: glob' > .hgignore
philpem@0 361 @echo 'obj/*.o' >> .hgignore
philpem@0 362 @echo 'dep/*.d' >> .hgignore
philpem@0 363 @echo '*~' >> .hgignore
philpem@0 364 @echo '.*.sw?' >> .hgignore
philpem@13 365 @echo '#define VER_COMPILE_DATETIME "@@datetime@@"' > src/version.h.in
philpem@14 366 @echo '#define VER_COMPILE_DATE "@@date@@"' >> src/version.h.in
philpem@14 367 @echo '#define VER_COMPILE_TIME "@@time@@"' >> src/version.h.in
philpem@14 368 @echo '#define VER_COMPILE_BY "@@whoami@@"' >> src/version.h.in
philpem@14 369 @echo '#define VER_COMPILE_HOST "@@hostname@@"' >> src/version.h.in
philpem@14 370 @echo '#define VER_COMPILER "@@compiler@@"' >> src/version.h.in
philpem@14 371 @echo '#define VER_BUILD_TYPE "@@buildtype@@"' >> src/version.h.in
philpem@14 372 @echo '#define VER_CFLAGS "@@cflags@@"' >> src/version.h.in
philpem@14 373 @echo '' >> src/version.h.in
philpem@14 374 @echo '#define VER_MAJOR @@majorver@@' >> src/version.h.in
philpem@14 375 @echo '#define VER_MINOR @@minorver@@' >> src/version.h.in
philpem@14 376 @echo '#define VER_BUILDNUM @@buildnum@@' >> src/version.h.in
philpem@14 377 @echo '#define VER_EXTRA "@@extraver@@"' >> src/version.h.in
philpem@14 378 @echo '#define VER_VCSREV "@@vcsstr@@"' >> src/version.h.in
philpem@14 379 @echo '' >> src/version.h.in
philpem@14 380 @echo '#define VER_FULLSTR "@@fullverstr@@"' >> src/version.h.in
philpem@14 381 @echo '' >> src/version.h.in
philpem@0 382 @echo Build system initialised
philpem@0 383
philpem@0 384 # remove the dependency files
philpem@0 385 cleandep:
philpem@0 386 -rm $(DEPFILES)
philpem@0 387
philpem@0 388 # remove the dependency files and any target or intermediate build files
philpem@0 389 clean: cleandep clean-versioninfo
philpem@0 390 -rm $(OBJ) $(TARGET) $(GARBAGE)
philpem@0 391
philpem@0 392 # remove any dependency or intermediate build files
philpem@0 393 tidy: cleandep clean-versioninfo
philpem@0 394 -rm $(OBJ) $(GARBAGE)
philpem@0 395
philpem@0 396 #################################
philpem@0 397
philpem@0 398 $(TARGET): $(OBJ) $(EXTDEP)
philpem@0 399 ifeq ($(SRC_TYPE),c)
philpem@0 400 $(CC) $(CXXFLAGS) $(LDFLAGS) $(OBJ) $(LIBPTH) $(LIBLNK) -o $@
philpem@0 401 else
philpem@0 402 $(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJ) $(LIBPTH) $(LIBLNK) -o $@
philpem@0 403 endif
philpem@0 404 ifeq ($(BUILD_TYPE),release)
philpem@0 405 $(STRIP) $(TARGET)
philpem@0 406 endif
philpem@0 407
philpem@0 408 ###
philpem@0 409 # extra rules
philpem@0 410 # example:
philpem@0 411 #src/parser.c: src/parser.h
philpem@0 412
philpem@0 413
philpem@0 414 ####
philpem@0 415 ## musashi build rules
philpem@0 416 # 68k CPU builder
philpem@0 417 obj/musashi/m68kmake: obj/musashi/m68kmake.o
philpem@0 418 $(CC) $(CFLAGS) $(CPPFLAGS) obj/musashi/m68kmake.o -o $@
philpem@0 419 # 68k CPU sources
philpem@3 420 src/musashi/m68kops.h src/musashi/m68kops.c src/musashi/m68kopac.c src/musashi/m68kopdm.c src/musashi/m68kopnz.c: obj/musashi/m68kmake src/musashi/m68k_in.c
philpem@0 421 ./obj/musashi/m68kmake src/musashi src/musashi/m68k_in.c
philpem@0 422
philpem@0 423 ####
philpem@0 424 # make object files from C source files
philpem@0 425 obj/%.o: src/%.c
philpem@0 426 $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
philpem@0 427
philpem@0 428 ##
philpem@0 429 # make object files from C++ source files
philpem@0 430 obj/%.o: src/%.cc
philpem@0 431 $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $< -o $@
philpem@0 432
philpem@0 433 obj/%.o: src/%.cpp
philpem@0 434 $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $< -o $@
philpem@0 435
philpem@0 436 ###
philpem@0 437 # make C files from yacc/bison source
philpem@0 438 src/%.h src/%.c: src/%.y
philpem@0 439 $(YACC) $(YFLAGS) -d $<
philpem@0 440 mv -f y.tab.c $*.c
philpem@0 441 mv -f y.tab.h $*.h
philpem@0 442
philpem@0 443 ###
philpem@0 444 # make C files from lex/flex source
philpem@0 445 src/%.c: src/%.l
philpem@0 446 $(LEX) $(LFLAGS) -o$@ $<
philpem@0 447
philpem@0 448 ###
philpem@0 449 # make dependencies for our source files
philpem@0 450 dep/%.d: src/%.c
philpem@0 451 $(CC) -MM $(CFLAGS) $(CPPFLAGS) $< > $@.$$$$; \
philpem@0 452 sed 's,\($*\)\.o[ :]*,obj/\1.o $@ : ,g' < $@.$$$$ > $@; \
philpem@0 453 rm -f $@.$$$$
philpem@0 454
philpem@0 455 dep/%.d: src/%.cpp
philpem@0 456 $(CXX) -MM $(CXXFLAGS) $(CPPFLAGS) $< > $@.$$$$; \
philpem@0 457 sed 's,\($*\)\.o[ :]*,obj/\1.o $@ : ,g' < $@.$$$$ > $@; \
philpem@0 458 rm -f $@.$$$$
philpem@0 459
philpem@0 460 dep/%.d: src/%.cc
philpem@0 461 $(CXX) -MM $(CXXFLAGS) $(CPPFLAGS) $< > $@.$$$$; \
philpem@0 462 sed 's,\($*\)\.o[ :]*,obj/\1.o $@ : ,g' < $@.$$$$ > $@; \
philpem@0 463 rm -f $@.$$$$
philpem@0 464
philpem@0 465 ####
philpem@0 466 # pull in the dependency files, but only for 'make $(TARGET)'
philpem@0 467 ####
philpem@0 468
philpem@0 469 ifeq ($(MAKECMDGOALS),$(TARGET))
philpem@0 470 -include $(DEPFILES)
philpem@0 471 endif