We recently added a new feature for xmake:

you need not write any make-like file (xmake.lua, makefile.am, cmakelist.txt, etc.) and also build it directly.

It will scan all source files and generate xmake.lua automatically for building project.

And xmake will detect ‘main’ function in source file in order to distinguish between static libraries and executable programs.

(Currently, only projects with single-level directory are supported)

Compile open source libraries

Although this approach has some limitations, but it is sufficient to complie and run some temporary codes for testing.

For example, we downloaded a zlib-1.2.10 source and want to compile it.

We only need to enter the zlib source directory and run the following command:

$ cd zlib-1.2.10 $ xmake

It’s done, the output results:

xmake.lua not found, scanning files .. target(zlib-1.2): static [+]: ./adler32.c [+]: ./compress.c [+]: ./crc32.c [+]: ./deflate.c [+]: ./gzclose.c [+]: ./gzlib.c [+]: ./gzread.c [+]: ./gzwrite.c [+]: ./infback.c [+]: ./inffast.c [+]: ./inflate.c [+]: ./inftrees.c [+]: ./trees.c [+]: ./uncompr.c [+]: ./zutil.c xmake.lua generated, scan ok!👌 checking for the architecture ... x86_64 checking for the Xcode SDK version for macosx ... 10.12 checking for the target minimal version ... 10.12 checking for the c compiler (cc) ... xcrun -sdk macosx clang checking for the c++ compiler (cxx) ... xcrun -sdk macosx clang checking for the objc compiler (mm) ... xcrun -sdk macosx clang checking for the objc++ compiler (mxx) ... xcrun -sdk macosx clang++ checking for the swift compiler (sc) ... xcrun -sdk macosx swiftc checking for the assember (as) ... xcrun -sdk macosx clang checking for the linker (ld) ... xcrun -sdk macosx clang++ checking for the static library archiver (ar) ... xcrun -sdk macosx ar checking for the static library extractor (ex) ... xcrun -sdk macosx ar checking for the shared library linker (sh) ... xcrun -sdk macosx clang++ checking for the debugger (dd) ... xcrun -sdk macosx lldb checking for the golang compiler (go) ... go configure { ex = "xcrun -sdk macosx ar" , sh = "xcrun -sdk macosx clang++" , host = "macosx" , ar = "xcrun -sdk macosx ar" , buildir = "build" , as = "xcrun -sdk macosx clang" , plat = "macosx" , xcode_dir = "/Applications/Xcode.app" , arch = "x86_64" , mxx = "xcrun -sdk macosx clang++" , go = "go" , target_minver = "10.12" , ccache = "ccache" , mode = "release" , clean = true , cxx = "xcrun -sdk macosx clang" , cc = "xcrun -sdk macosx clang" , dd = "xcrun -sdk macosx lldb" , kind = "static" , ld = "xcrun -sdk macosx clang++" , xcode_sdkver = "10.12" , sc = "xcrun -sdk macosx swiftc" , mm = "xcrun -sdk macosx clang" } configure ok! clean ok! [00%]: ccache compiling.release ./adler32.c [06%]: ccache compiling.release ./compress.c [13%]: ccache compiling.release ./crc32.c [20%]: ccache compiling.release ./deflate.c [26%]: ccache compiling.release ./gzclose.c [33%]: ccache compiling.release ./gzlib.c [40%]: ccache compiling.release ./gzread.c [46%]: ccache compiling.release ./gzwrite.c [53%]: ccache compiling.release ./infback.c [60%]: ccache compiling.release ./inffast.c [66%]: ccache compiling.release ./inflate.c [73%]: ccache compiling.release ./inftrees.c [80%]: ccache compiling.release ./trees.c [86%]: ccache compiling.release ./uncompr.c [93%]: ccache compiling.release ./zutil.c [100%]: archiving.release libzlib-1.2.a build ok!👌

Xmake will scan the current directory to detect all source codes and it do not found main function.

So it should be static library project and we build it as a static library: libzlib-1.2.a

We did not write any make-like files (xmake.lua, ..) and did not use the makefile of zlib project.

It is compiled directly and a xmake.lua file was generated which we can edit this xmake.lua to build more complicated project.

The content of the generated xmake.lua:

-- define target target ( "zlib-1.2" ) -- set kind set_kind ( "static" ) -- add files add_files ( "./adler32.c" ) add_files ( "./compress.c" ) add_files ( "./crc32.c" ) add_files ( "./deflate.c" ) add_files ( "./gzclose.c" ) add_files ( "./gzlib.c" ) add_files ( "./gzread.c" ) add_files ( "./gzwrite.c" ) add_files ( "./infback.c" ) add_files ( "./inffast.c" ) add_files ( "./inflate.c" ) add_files ( "./inftrees.c" ) add_files ( "./trees.c" ) add_files ( "./uncompr.c" ) add_files ( "./zutil.c" )

Fastly compile and run testing code

For example, I want to write a simple program in the main.c only to echo ‘hello world!’.

If we use gcc to compile and run it, need run two commands:

gcc ./main.c -o demo ./demo

If we use xmake to run it, only need run:

xmake run

Or

xmake r

It’s done, the output results is:

hello world!

If we have a lot of code files, need also run only one command:

xmake run

It’s so easy and convenient.

Multi-language support

This feature of code detection and real-time compilation not only supports c / c ++, also supports objc / swift and it will support golang in future.

For example, we downloaded a ios open source framework code ‘fmdb’:

. ├── FMDB.h ├── FMDatabase.h ├── FMDatabase.m ├── FMDatabaseAdditions.h ├── FMDatabaseAdditions.m ├── FMDatabasePool.h ├── FMDatabasePool.m ├── FMDatabaseQueue.h ├── FMDatabaseQueue.m ├── FMResultSet.h └── FMResultSet.m

There are no any make-like files in it’s project directory.

We uses xmake to build it directly as a ios static library:

$ xmake f -p iphoneos; xmake

The output results are:

xmake.lua not found, scanning files .. target(FMDB): static [+]: ./FMDatabase.m [+]: ./FMDatabaseAdditions.m [+]: ./FMDatabasePool.m [+]: ./FMDatabaseQueue.m [+]: ./FMResultSet.m xmake.lua generated, scan ok!👌 checking for the architecture ... armv7 checking for the Xcode SDK version for iphoneos ... 10.1 checking for the target minimal version ... 10.1 checking for the c compiler (cc) ... xcrun -sdk iphoneos clang checking for the c++ compiler (cxx) ... xcrun -sdk iphoneos clang checking for the objc compiler (mm) ... xcrun -sdk iphoneos clang checking for the objc++ compiler (mxx) ... xcrun -sdk iphoneos clang++ checking for the assember (as) ... gas-preprocessor.pl xcrun -sdk iphoneos clang checking for the linker (ld) ... xcrun -sdk iphoneos clang++ checking for the static library archiver (ar) ... xcrun -sdk iphoneos ar checking for the static library extractor (ex) ... xcrun -sdk iphoneos ar checking for the shared library linker (sh) ... xcrun -sdk iphoneos clang++ checking for the swift compiler (sc) ... xcrun -sdk iphoneos swiftc configure { ex = "xcrun -sdk iphoneos ar" , ccache = "ccache" , host = "macosx" , ar = "xcrun -sdk iphoneos ar" , buildir = "build" , as = "/usr/local/share/xmake/tools/utils/gas-preprocessor.pl xcrun -sdk iphoneos clang" , arch = "armv7" , mxx = "xcrun -sdk iphoneos clang++" , cxx = "xcrun -sdk iphoneos clang" , target_minver = "10.1" , xcode_dir = "/Applications/Xcode.app" , clean = true , sh = "xcrun -sdk iphoneos clang++" , cc = "xcrun -sdk iphoneos clang" , ld = "xcrun -sdk iphoneos clang++" , mode = "release" , kind = "static" , plat = "iphoneos" , xcode_sdkver = "10.1" , sc = "xcrun -sdk iphoneos swiftc" , mm = "xcrun -sdk iphoneos clang" } configure ok! clean ok! [00%]: ccache compiling.release ./FMDatabase.m [20%]: ccache compiling.release ./FMDatabaseAdditions.m [40%]: ccache compiling.release ./FMDatabasePool.m [60%]: ccache compiling.release ./FMDatabaseQueue.m [80%]: ccache compiling.release ./FMResultSet.m [100%]: archiving.release libFMDB.a build ok!👌

Compile multiple executables at the same time

$ cd jpeg-6b $ xmake

The output results are:

xmake.lua not found, scanning files .. target(jpeg-6b): static [+]: ./cdjpeg.c [+]: ./example.c [+]: ./jcapimin.c [+]: ./jcapistd.c [+]: ./jccoefct.c [+]: ./jccolor.c [+]: ./jcdctmgr.c [+]: ./jchuff.c [+]: ./jcinit.c [+]: ./jcmainct.c [+]: ./jcmarker.c [+]: ./jcmaster.c [+]: ./jcomapi.c [+]: ./jcparam.c [+]: ./jcphuff.c [+]: ./jcprepct.c [+]: ./jcsample.c [+]: ./jctrans.c [+]: ./jdapimin.c [+]: ./jdapistd.c [+]: ./jdatadst.c [+]: ./jdatasrc.c [+]: ./jdcoefct.c [+]: ./jdcolor.c [+]: ./jddctmgr.c [+]: ./jdhuff.c [+]: ./jdinput.c [+]: ./jdmainct.c [+]: ./jdmarker.c [+]: ./jdmaster.c [+]: ./jdmerge.c [+]: ./jdphuff.c [+]: ./jdpostct.c [+]: ./jdsample.c [+]: ./jdtrans.c [+]: ./jerror.c [+]: ./jfdctflt.c [+]: ./jfdctfst.c [+]: ./jfdctint.c [+]: ./jidctflt.c [+]: ./jidctfst.c [+]: ./jidctint.c [+]: ./jidctred.c [+]: ./jmemansi.c [+]: ./jmemmgr.c [+]: ./jmemname.c [+]: ./jmemnobs.c [+]: ./jquant1.c [+]: ./jquant2.c [+]: ./jutils.c [+]: ./rdbmp.c [+]: ./rdcolmap.c [+]: ./rdgif.c [+]: ./rdppm.c [+]: ./rdrle.c [+]: ./rdswitch.c [+]: ./rdtarga.c [+]: ./transupp.c [+]: ./wrbmp.c [+]: ./wrgif.c [+]: ./wrppm.c [+]: ./wrrle.c [+]: ./wrtarga.c target(ansi2knr): binary [+]: ./ansi2knr.c target(cjpeg): binary [+]: ./cjpeg.c target(ckconfig): binary [+]: ./ckconfig.c target(djpeg): binary [+]: ./djpeg.c target(jpegtran): binary [+]: ./jpegtran.c target(rdjpgcom): binary [+]: ./rdjpgcom.c target(wrjpgcom): binary [+]: ./wrjpgcom.c xmake.lua generated, scan ok!👌 checking for the architecture ... x86_64 checking for the Xcode SDK version for macosx ... 10.12 checking for the target minimal version ... 10.12 checking for the c compiler (cc) ... xcrun -sdk macosx clang checking for the c++ compiler (cxx) ... xcrun -sdk macosx clang checking for the objc compiler (mm) ... xcrun -sdk macosx clang checking for the objc++ compiler (mxx) ... xcrun -sdk macosx clang++ checking for the swift compiler (sc) ... xcrun -sdk macosx swiftc checking for the assember (as) ... xcrun -sdk macosx clang checking for the linker (ld) ... xcrun -sdk macosx clang++ checking for the static library archiver (ar) ... xcrun -sdk macosx ar checking for the static library extractor (ex) ... xcrun -sdk macosx ar checking for the shared library linker (sh) ... xcrun -sdk macosx clang++ checking for the debugger (dd) ... xcrun -sdk macosx lldb checking for the golang compiler (go) ... go configure { ex = "xcrun -sdk macosx ar" , sh = "xcrun -sdk macosx clang++" , host = "macosx" , ar = "xcrun -sdk macosx ar" , buildir = "build" , as = "xcrun -sdk macosx clang" , plat = "macosx" , xcode_dir = "/Applications/Xcode.app" , arch = "x86_64" , mxx = "xcrun -sdk macosx clang++" , go = "go" , target_minver = "10.12" , ccache = "ccache" , mode = "release" , clean = true , cxx = "xcrun -sdk macosx clang" , cc = "xcrun -sdk macosx clang" , dd = "xcrun -sdk macosx lldb" , kind = "static" , ld = "xcrun -sdk macosx clang++" , xcode_sdkver = "10.12" , sc = "xcrun -sdk macosx swiftc" , mm = "xcrun -sdk macosx clang" } configure ok! clean ok! [00%]: ccache compiling.release ./cdjpeg.c [00%]: ccache compiling.release ./example.c [00%]: ccache compiling.release ./jcapimin.c [00%]: ccache compiling.release ./jcapistd.c [00%]: ccache compiling.release ./jccoefct.c [00%]: ccache compiling.release ./jccolor.c [01%]: ccache compiling.release ./jcdctmgr.c [01%]: ccache compiling.release ./jchuff.c [01%]: ccache compiling.release ./jcinit.c [01%]: ccache compiling.release ./jcmainct.c [01%]: ccache compiling.release ./jcmarker.c [02%]: ccache compiling.release ./jcmaster.c [02%]: ccache compiling.release ./jcomapi.c [02%]: ccache compiling.release ./jcparam.c [02%]: ccache compiling.release ./jcphuff.c [02%]: ccache compiling.release ./jcprepct.c [03%]: ccache compiling.release ./jcsample.c [03%]: ccache compiling.release ./jctrans.c [03%]: ccache compiling.release ./jdapimin.c [03%]: ccache compiling.release ./jdapistd.c [03%]: ccache compiling.release ./jdatadst.c [04%]: ccache compiling.release ./jdatasrc.c [04%]: ccache compiling.release ./jdcoefct.c [04%]: ccache compiling.release ./jdcolor.c [04%]: ccache compiling.release ./jddctmgr.c [04%]: ccache compiling.release ./jdhuff.c [05%]: ccache compiling.release ./jdinput.c [05%]: ccache compiling.release ./jdmainct.c [05%]: ccache compiling.release ./jdmarker.c [05%]: ccache compiling.release ./jdmaster.c [05%]: ccache compiling.release ./jdmerge.c [06%]: ccache compiling.release ./jdphuff.c [06%]: ccache compiling.release ./jdpostct.c [06%]: ccache compiling.release ./jdsample.c [06%]: ccache compiling.release ./jdtrans.c [06%]: ccache compiling.release ./jerror.c [07%]: ccache compiling.release ./jfdctflt.c [07%]: ccache compiling.release ./jfdctfst.c [07%]: ccache compiling.release ./jfdctint.c [07%]: ccache compiling.release ./jidctflt.c [07%]: ccache compiling.release ./jidctfst.c [08%]: ccache compiling.release ./jidctint.c [08%]: ccache compiling.release ./jidctred.c [08%]: ccache compiling.release ./jmemansi.c [08%]: ccache compiling.release ./jmemmgr.c [08%]: ccache compiling.release ./jmemname.c [09%]: ccache compiling.release ./jmemnobs.c [09%]: ccache compiling.release ./jquant1.c [09%]: ccache compiling.release ./jquant2.c [09%]: ccache compiling.release ./jutils.c [09%]: ccache compiling.release ./rdbmp.c [10%]: ccache compiling.release ./rdcolmap.c [10%]: ccache compiling.release ./rdgif.c [10%]: ccache compiling.release ./rdppm.c [10%]: ccache compiling.release ./rdrle.c [10%]: ccache compiling.release ./rdswitch.c [11%]: ccache compiling.release ./rdtarga.c [11%]: ccache compiling.release ./transupp.c [11%]: ccache compiling.release ./wrbmp.c [11%]: ccache compiling.release ./wrgif.c [11%]: ccache compiling.release ./wrppm.c [12%]: ccache compiling.release ./wrrle.c [12%]: ccache compiling.release ./wrtarga.c [12%]: archiving.release libjpeg-6b.a [12%]: ccache compiling.release ./wrjpgcom.c [25%]: linking.release wrjpgcom [25%]: ccache compiling.release ./ansi2knr.c [37%]: linking.release ansi2knr [37%]: ccache compiling.release ./jpegtran.c [50%]: linking.release jpegtran [50%]: ccache compiling.release ./djpeg.c [62%]: linking.release djpeg [62%]: ccache compiling.release ./ckconfig.c [75%]: linking.release ckconfig [75%]: ccache compiling.release ./rdjpgcom.c [87%]: linking.release rdjpgcom [87%]: ccache compiling.release ./cjpeg.c [100%]: linking.release cjpeg build ok!👌

In addition to a static library, we also compiled some other executable programs.

target(ansi2knr): binary [+]: ./ansi2knr.c target(cjpeg): binary [+]: ./cjpeg.c target(ckconfig): binary [+]: ./ckconfig.c target(djpeg): binary [+]: ./djpeg.c target(jpegtran): binary [+]: ./jpegtran.c target(rdjpgcom): binary [+]: ./rdjpgcom.c target(wrjpgcom): binary [+]: ./wrjpgcom.c

Manual configuration

we need add them before compiling if the source code requires some special compiler options

For example: