SYNOPSIS
me --benchmark --configuration --configure /path/to/source --continue --debug --deploy directory --depth level --diagnose --dump --endian [big|little] --file file.me --force --gen [make|nmake|sh|vs|xcode|main|start] --get field --help --import --keep --log logSpec --nolocal --nocross --out path --overwrite --pre --prefix dir=path --prefixes [debian|embedthis|opt] --profile [debug|release|...] --quiet --rebuild --reconfigure --release --rom --set [feature=value] --sets [set,set,...] --show --static --unicode --unset feature --version --verbose --watch msec] --why] --with PACK[=PATH] --without PACK [targets|actions] ...
DESCRIPTION
MakeMe and its "me" command is modern replacement for the venerable make and not so popular autoconf utilities. MakeMe manages the building of programs and products by effectively determining which pieces have been updated and thus which components need to be rebuilt. It easily handles MakeMe provides a higher level of abstraction to easily specify the targets to build (libraries, executables, files and script output). It can build directly on Linux, Mac or Windows and cross compile for other platforms. It will generate native projects for Visual Studio, XCode, Make, Nmake and shell scripts. MakeMe builds fast without the complexity of autoconf and make. MakeMe was initiated after evaluating Make, CMake and GYP for use by Appweb and Ejscript in an embedded, cross-compilation environment. While all three can be made to work, at Embedthis, we were expending a large percentage of time on the build system and less on the actual product. Our design goals were: . Create a build too to be used by Embedthis for its own products . Be portable across the major Unix platforms and Windows . Easily manage cross-compilation and cross-compilers for embedded targets . Generate native projects for IDE integration . Build quickly, reliably and flexibly on Windows without requiring Cygwin . Support for the entire build cycle: C dependencies, compilation, test and packaging . Support modular discovery, configuration and integration of external third-party packages . Be hackable and extendable
FEATURES
MakeMe has the following major features: . Configuration and component discovery (replaces autoconf) . Compiler capability sleuthing . Generation of a configuration source header (me.h) . Generation of Xcode, Visual Studio, Make, Nmake and shell script projects . Automatic C/C++ source code dependencies . Projects can aggregate multiple MakeMe files without using recursion . Cross platform. Easily handles Windows, Linux and Mac builds . Easy cross-compilation . Building outside source tree for read-only file systems . MakeMe files are Javascript source and are easily modified and extended . Multiple build profiles (debug, release, ...) . Very fast configuration and building, even on windows
NICE BITS
While MakeMe has a strong feature set, there are some characteristics that make building with MakeMe especially nice: . Unified project view. No "make" style recursion required. . MakeMe configuration may be comprised by multiple MakeMe files . MakeMe file targets and scripts are relative to their own directory Me.load({ targets: { /* Build the rocket executable */ rocket: { type: 'exe', sources: ['*.c'], }, }, }) To build the rocket, enter: me rocket
INVOCATION
When 'me' is invoked, it searches for a 'start.me' file in the current directory. If one if not found, it searches up the parent directory chain for one. MakeMe then loads this 'start.me' file and commences processing its build instuctions. A 'start.me' may in turn load other MakeMe files.
STANDALONE USES
A standalone start.me file may be used to express simple build targets that do not requiring any prior configuration step. The 'start.me' file contains targets that specify the recipies to build those targets.
CONFIGURED PRODUCTS
Some products require a configuration phase prior to building with MakeMe. Configuration involves discovering the tools and components available on the current system and the available compiler tool chain support. For configured products, 'me' is first invoked with a "configure" target. MakeMe then reads a 'main.me' file which describes the project, and generates a 'start.me' and 'platform.me' file that describes the system.
TARGETS
MakeMe is typically invoked with zero or more targets to build. If invoked with zero targets, MakeMe will build all the out-of-date targets. If a one or more targets are specified, only those targets will be brought up to date. To build all targets: me To build several named targets: me libengine librocket space-program MakeMe pre-defines several targets: For example, this is a typical 'settings' configuration. settings: { name: 'mpr', description: 'Multithreaded Portable Runtime', version: '4.0.5', }, The 'configure' properties define the required and optional packages that should be discovered. configure: { requires: [ 'osdep' ], discovers: [ 'ssl' ], }, The 'requires' property defines the packages that are required to be present on the system to build. The
CROSS COMPILING
To build a product for platform different to that of the local system is called cross compiling. Sometimes this cross compiling is just for a different instruction set (say x64 instead of x86). Other times it is for a completely different operating system and/or CPU architecture. In such cases a cross-compiler may be required to build for the target platform. MakeMe supports cross compiling via the 'me -platform OS-ARCH configure' switch. This adds a platform to the list of platforms to be made when building. Multiple platforms may be specified and the 'local' platform alias may be used for the local development platform. Some products require local building to make tools that are required to build for any platform. These products add a "platforms: ['local']" property to their settings collection in the main.me file. This automatically adds the local platform to the platforms list and is the same as adding '-platform local' on the command line when configuring. me --platform windows-x64-debug -configure . This will create a windows-x64-debug.me configuration file and a start.es that references it. The platform switch does not need to be respecified after configuration.
PROJECT GENERATION
MakeMe can generate generate complete project files for building using: make, nmake, Visual Studio, Xcode or plain shell scripts. MakeMe uses the '--gen' switch to specify the projects to build. MakeMe is capable of cross-generating projects for non-native platforms. For example: you can generate an Xcode project for Mac OS X on a Windows system. targets { first: { build: "print('Build First')", }, second: { depends: ['first'], build: "print('Build Second')", }, } Before MakeMe begins building, it parses the entire MakeMe file configuration and determines which targets depend on what. It then builds the targets in the required build order. It successfully detects and handles dependency loops.
DEFAULTS
Often targets need very similar configuration. MakeMe provides a 'defaults' set of properties that are inherited by all targets. It also provides an 'internal' set of properties that are inherited by only the targets in the same MakeMe file. For example: defaults: { '+defines': [ 'TUNE=SPEED ], '+libraries': [ 'math' ], } This will use the 'TUNE=SPEED' compiler define when compiling all source files, and the 'math' library when linking executables (and libraries on some systems).
OVERRIDING
MakeMe has default command flags for the compiler, linker and other tools. These can be overridden by providing environment variables containing alternate flags to use. Use CFLAGS to provide compiler flags, DFLAGS for pre-processor definitions, IFLAGS for compiler include paths and LDFLAGS for linker flags. If these flags are provided to 'me' when building, they apply to that run only. If the flags are provide when configuring, they are saved in the generated platform file and apply to all subsequent runs.
DEBUGGING
With Make and other build tools, it is difficult to determine why a target is or is not being built. MakeMe provides a '--why' switch to diagnose problematic build sequences. This switch displays the reason why each target was or was not built. In a complex project containing many MakeMe files, it can be helpful to see the entire MakeMe configuration in one file. Use the '--dump' switch to save a copy of the entire configuration. In the dump, build defaults --configuration Display the current configuration. This displays the configuration for each package and the build settings. --configure /path/to/source/tree Configure the project to prepare for building. This configures MakeMe for building the project based on the instructions specified in a 'main.me' located in the specified path source tree. When run, 'me' will create a platform configuration MakeMe file, a build output directory and me.h header. The configuration directory is of the form: build/OS-ARCH-PROFILE where OS may be freebsd, linux, macosx, solaris, vxworks, windows and ARCH is arm, mips, ppc, x64 or x86. PROFILE is typically set to debug or release. For example: 'build/macosx-x64-debug'. MakeMe will use the settings.required and settings.discover properties in the main.me for a list of packages to use. When configuring, MakeMe will search for these packages and will create definitions in the configuration MakeMe file for later use. --continue Continue to build despite any build errors. Normal operation is to stop building if any build errors are encountered. --debug Enable a debug build. This enables the settings.debug property which controls whether debug symbols will be created when compiling. --deploy directory Install the product to the deployment directory. This is useful to stage the required files to install on a system. Use --sets to define the file sets to deploy. --depth level Set the unit test depth level. --diagnose Run MakeMe with stack backtrace display on errors. --dump Dump the aggregate MakeMe configuration into a single dump MakeMe file. --endian [big|little] --gen [make|nmake|sh|vs|xcode|main|start] Generate files. This option can be used to generate initial start.me or main.me files or IDE project and makefiles. The --gen start, option can be used to create a stand-alone sample start.me file. The --gen main, option can be used to create a sample main.me file when starting a new product. Project files are created under the 'projects' directory. The projects are based on the current configuration. If cross-generating projects, you will typically need to also use -configure. --get field Get a field from the MakeMe DOM. This can be used to display any MakeMe file value. Unlike --set, this applies to any MakeMe DOM value and not just to settings. For example: 'me --get settings.version'. --import Import the standard MakeMe configuration "makeme" directory into the local source tree. --keep Keep some intermediate build files. This is currently used by some documentation generation targets. --log logName[:logLevel] Specify a file to log internal execution messages. MakeMe will log execution related trace to the log file. The log level specifies the desired verbosity of output. Level 0 is the least verbose and level 5 is the most. The '-v' switch is an alias for '--log stderr:2'. --nocross Don't cross-build. Build only for the local development system. --nolocal Don't build for the local development system. Build only for the cross platforms. --out path Save MakeMe trace output to a file instead of displaying to the console. --overwrite Overwrite existing files. --prefix dir=path Set the installation directory prefix. Various products utilize different prefixes. Typical prefixes are: root, base, state, data, app, vapp, bin, etc, inc, log, spool, src, web. For those familiar with autoconf, the major autoconf prefixe switches are supported and mapped as follows: --prefix to root, --bindir to bin, --libdir to lib, --includedir to inc, --sysconfdir to etc, --libexec to app, --logfiledir to log, --htdocsdir to web, and --manualdir to man. --prefixes debian|embedthis|opt Select an installation prefix package. Debian specifies the debian recommended installation locations. Embedthis products install by default with a prefix of /usr/local/lib/PRODUCT and symlink exectuables to /usr/local/bin. The opt prefix set installs with a prefix of "/opt". --profile defaultProfile Set the default profile if unspecified. Typical profiles are: 'debug', 'dev', 'stage', 'prod' or 'release'. The profile is used in constructing the build output directory. You may specify override properties in the main.me profiles[PROFILE] collection. --quiet Quiet operation. Suppresses output trace. --rebuild Rebuild the specified targets. Can also use 'me rebuild'. --reconfigure Re-run configuration using the prior configuration settings. --release Enable a release build. This disables the settings.debug property and compiles without debug symbols. --rom Configure setting to build for systems without a file system. This enables the ROM file system. Use the makerom utility to process required files into C source code for building with the application. --set key=value Set a settings property to a given value. For example: 'me -set version=1.0' will update the settings.version property. Use this libraries. Same as --set static=true. --unicode Set the character size to wide. --unset key=value Clear a settings property. Use this when running 'me configure' to persist your changes in the configuration MakeMe file. --version Print the ejs command version and exit. --verbose Run in verbose mode with more trace about MakeMe activities. --watch msec Watch for changes and rebuild if required. This will sleep for the requested number of milliseconds between checking for changes. This can also be invoked as 'me watch' which will check every second for changes. --why Display why each target was or was not built. --with PACK[=path] Build with the named pack located at the optional path. If the path is ommitted, a search is performed for the pack at default locations. Packs must have a pack description file installed under 'makeme/packs' in the MakeMe installation. --without PACK Build without the named pack.
REPORTING BUGS
Report bugs to dev@embedthis.com.
COPYRIGHT
Copyright © Embedthis Software. MakeMe and Ejscript are a trademarks of Embedthis Software.
SEE ALSO
pak
Man(1) output converted with man2html