The xmake online documentation site

EuuHao e7aa8ff64f Fix wrong spelling 4 years ago
about 4b5c195c86 update sponsor 4 years ago
assets 7eaebc7819 improve set_toolchains 5 years ago
cn 151abcd668 fix some links 6 years ago
guide 4c11d625ae update docs 4 years ago
manual e7aa8ff64f Fix wrong spelling 4 years ago
mirror e7aa8ff64f Fix wrong spelling 4 years ago
package de9b905a94 fix typo 4 years ago
pages 151abcd668 fix some links 6 years ago
plugin c5681c187e add set_group 5 years ago
theme fca2f66781 add theme style 5 years ago
zh-cn e7aa8ff64f Fix wrong spelling 4 years ago
.gitignore d34adc9ef7 Add .vscode to .gitignore 4 years ago
.nojekyll 9078c01303 first commit 8 years ago
CNAME 2136f9677b Create CNAME 7 years ago
README.md 70999e3780 fix links 4 years ago
_coverpage.md 37287e1d37 update version 4 years ago
_navbar.md b8e7b258d0 update links 5 years ago
_sidebar.md 8258c3b914 Add package interface link 4 years ago
baidu_verify_Bls5XAaIE7.html 7465695265 add baidu verify file 5 years ago
build.lua dcab137d3d fix mirror links 5 years ago
getting_started.md ac2a50f5f4 update get starting 4 years ago
google89aa5c9614676133.html f903fabd3b add files 5 years ago
index.html 46e33bd1ce fix links 4 years ago
psget.text 4c6d592ef6 raname 5 years ago
robots.txt acbe816674 update sitemap script 5 years ago
shget.text 3dd0db9c22 rename 5 years ago
sitemap.xml de9b905a94 fix typo 4 years ago
sogousiteverification.txt 1e14ee0bda add sogou verfile 5 years ago
sw.js 0fa4535ea5 add pwa 6 years ago

README.md

Supporting the project

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 🙏

Introduction

xmake is a lightweight cross-platform build utility based on Lua. It uses xmake.lua to maintain project builds. Compared with makefile/CMakeLists.txt, the configuration syntax is more concise and intuitive. It is very friendly to novices and can quickly get started in a short time. Let users focus more on actual project development.

It can compile the project directly like Make/Ninja, or generate project files like CMake/Meson, and it also has a built-in package management system to help users solve the integrated use of C/C++ dependent libraries.

If you want to know more, please refer to: Documents, Github and Gitee and also welcome to join our community.

Installation

via curl

bash <(curl -fsSL https://xmake.io/shget.text)

via wget

bash <(wget https://xmake.io/shget.text -O -)

via powershell

Invoke-Expression (Invoke-Webrequest 'https://xmake.io/psget.text' -UseBasicParsing).Content

Simple description

Package dependences

An official xmake package repository: xmake-repo

Build project

$ xmake

Run target

$ xmake run console

Debug target

$ xmake run -d console

Configure platform

$ xmake f -p [windows|linux|macosx|android|iphoneos ..] -a [x86|arm64 ..] -m [debug|release]
$ xmake

Menu configuration

$ xmake f --menu

Build as fast as ninja

The test project: xmake-core

Multi-task parallel compilation

buildsystem Termux (8core/-j12) buildsystem MacOS (8core/-j12)
xmake 24.890s xmake 12.264s
ninja 25.682s ninja 11.327s
cmake(gen+make) 5.416s+28.473s cmake(gen+make) 1.203s+14.030s
cmake(gen+ninja) 4.458s+24.842s cmake(gen+ninja) 0.988s+11.644s

Single task compilation

buildsystem Termux (-j1) buildsystem MacOS (-j1)
xmake 1m57.707s xmake 39.937s
ninja 1m52.845s ninja 38.995s
cmake(gen+make) 5.416s+2m10.539s cmake(gen+make) 1.203s+41.737s
cmake(gen+ninja) 4.458s+1m54.868s cmake(gen+ninja) 0.988s+38.022s

Package management

Download and build

Processing architecture

Supported package repositories

  • Official package repository xmake-repo (tbox >1.6.1)
  • Official package manager Xrepo
  • User-built repositories
  • Conan (conan::openssl/1.1.1g)
  • Conda (conda::libpng 1.3.67)
  • Vcpkg (vcpkg:ffmpeg)
  • Homebrew/Linuxbrew (brew::pcre2/libpcre2-8)
  • Pacman on archlinux/msys2 (pacman::libcurl)
  • Apt on ubuntu/debian (apt::zlib1g-dev)
  • Clib (clib::clibs/[email protected])
  • Dub (dub::log 0.4.3)

Supported platforms

  • Windows (x86, x64)
  • macOS (i386, x86_64, arm64)
  • Linux (i386, x86_64, cross-toolchains ..)
  • *BSD (i386, x86_64)
  • Android (x86, x86_64, armeabi, armeabi-v7a, arm64-v8a)
  • iOS (armv7, armv7s, arm64, i386, x86_64)
  • WatchOS (armv7k, i386)
  • MSYS (i386, x86_64)
  • MinGW (i386, x86_64, arm, arm64)
  • Cygwin (i386, x86_64)
  • Wasm (wasm32)
  • Cross (cross-toolchains ..)

Supported toolchains

$ xmake show -l toolchains
xcode         Xcode IDE
vs            VisualStudio IDE
yasm          The Yasm Modular Assembler
clang         A C language family frontend for LLVM
go            Go Programming Language Compiler
dlang         D Programming Language Compiler
gfortran      GNU Fortran Programming Language Compiler
zig           Zig Programming Language Compiler
sdcc          Small Device C Compiler
cuda          CUDA Toolkit
ndk           Android NDK
rust          Rust Programming Language Compiler
llvm          A collection of modular and reusable compiler and toolchain technologies
cross         Common cross compilation toolchain
nasm          NASM Assembler
gcc           GNU Compiler Collection
mingw         Minimalist GNU for Windows
gnu-rm        GNU Arm Embedded Toolchain
envs          Environment variables toolchain
fasm          Flat Assembler
tinycc        Tiny C Compiler
emcc          A toolchain for compiling to asm.js and WebAssembly
icc           Intel C/C++ Compiler
ifort         Intel Fortran Compiler
muslcc        The musl-based cross-compilation toolchains

Supported Languages

  • C
  • C++
  • Objective-C and Objective-C++
  • Swift
  • Assembly
  • Golang
  • Rust
  • Dlang
  • Fortran
  • Cuda
  • Zig

Support Features

  • Simple project configuration syntax
  • Direct build support, without relying on any third-party back-end make tools
  • Support cross platform
  • Support cross compilation
  • Multi-task parallel compilation support
  • C++20 Module-TS support
  • Support cross-platform C/C++ dependency packages
  • Support self-built distributed and third-party package repositories
  • Support multi-language mixed compilation
  • Flexible lua scripts, rich extension modules
  • Support for generating vsproj/cmake/makefile/compile_commands files
  • REPL interactive execution support
  • Incremental compilation support, automatic analysis of header dependency files
  • Fast switching toolchains
  • Automatic pull toolchain and dependency package integration

Supported Projects

  • Static Library
  • Shared Library
  • Console
  • Cuda Program
  • Qt Application
  • WDK Driver (umdf/kmdf/wdm)
  • WinSDK Application
  • MFC Application
  • iOS/MacOS Application
  • Framework and Bundle Program (iOS/MacOS)

More Examples

Debug and release modes

add_rules("mode.debug", "mode.release")

target("console")
    set_kind("binary")
    add_files("src/*.c")
    if is_mode("debug") then
        add_defines("DEBUG")
    end

Custom scripts

target("test")
    set_kind("binary")
    add_files("src/*.c")
    after_build(function (target)
        print("hello: %s", target:name())
        os.exec("echo %s", target:targetfile())
    end)

Automatic integration of dependent packages

Download and use packages in xmake-repo or third-party repositories:

add_requires("tbox >1.6.1", "libuv master", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8")
add_requires("conan::openssl/1.1.1g", {alias = "openssl", optional = true, debug = true})
target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_packages("tbox", "libuv", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8", "openssl")

In addition, we can also use the xrepo command to quickly install dependent packages.

Qt QuickApp Program

target("test")
    add_rules("qt.quickapp")
    add_files("src/*.cpp")
    add_files("src/qml.qrc")

Cuda Program

target("test")
    set_kind("binary")
    add_files("src/*.cu")
    add_cugencodes("native")
    add_cugencodes("compute_35")

WDK/UMDF Driver Program

target("echo")
    add_rules("wdk.driver", "wdk.env.umdf")
    add_files("driver/*.c")
    add_files("driver/*.inx")
    add_includedirs("exe")

target("app")
    add_rules("wdk.binary", "wdk.env.umdf")
    add_files("exe/*.cpp")

More wdk driver program examples (umdf/kmdf/wdm), please see WDK Program Examples

iOS/MacOS Application

target("test")
    add_rules("xcode.application")
    add_files("src/*.m", "src/**.storyboard", "src/*.xcassets")
    add_files("src/Info.plist")

Framework and Bundle Program (iOS/MacOS)

target("test")
    add_rules("xcode.framework") -- or xcode.bundle
    add_files("src/*.m")
    add_files("src/Info.plist")

OpenMP Program

add_requires("libomp", {optional = true})
target("loop")
    set_kind("binary")
    add_files("src/*.cpp")
    add_rules("c++.openmp")
    add_packages("libomp")

Zig Program

target("test")
    set_kind("binary")
    add_files("src/*.zig")

Automatically fetch remote toolchain

fetch the special version of llvm

We use clang in llvm-10 to compile the project.

add_requires("llvm 10.x", {alias = "llvm-10"})
target("test")
    set_kind("binary")
    add_files("src/*.c)
    set_toolchains("llvm@llvm-10")
````

#### Fetch cross-compilation toolchain

We can also pull the specified cross-compilation tool chain to compile the project.

lua add_requires("muslcc") target("test")

set_kind("binary")
add_files("src/*.c)
set_toolchains("@muslcc")

#### Fetch toolchain and packages

We can also use the specified muslcc cross-compilation toolchain to compile and integrate all dependent packages

lua add_requires("muslcc") add_requires("zlib", "libogg", {system = false})

set_toolchains("@muslcc")

target("test")

set_kind("binary")
add_files("src/*.c")
add_packages("zlib", "libogg")

## Plugins

#### Generate IDE project file plugin(makefile, vs2002 - vs2019 .. )

bash $ xmake project -k vsxmake -m "debug;release" # New vsproj generator (Recommended) $ xmake project -k vs -m "debug;release" $ xmake project -k cmake $ xmake project -k ninja $ xmake project -k compile_commands


#### Run the custom lua script plugin

bash $ xmake l ./test.lua $ xmake l -c "print('hello xmake!')" $ xmake l lib.detect.find_tool gcc $ xmake l

print("hello xmake!") {1, 2, 3} < {

1,
2,
3

}


More builtin plugins, please see: [Builtin plugins](https://xmake.io/#/plugin/builtin_plugins)

Please download and install more other plugins from the plugins repository [xmake-plugins](https://github.com/xmake-io/xmake-plugins).

## IDE/Editor Integration

* [xmake-vscode](https://github.com/xmake-io/xmake-vscode)

<img src="https://raw.githubusercontent.com/xmake-io/xmake-vscode/master/res/problem.gif" width="650px" />

* [xmake-sublime](https://github.com/xmake-io/xmake-sublime)

<img src="https://raw.githubusercontent.com/xmake-io/xmake-sublime/master/res/problem.gif" width="650px" />

* [xmake-idea](https://github.com/xmake-io/xmake-idea)

<img src="https://raw.githubusercontent.com/xmake-io/xmake-idea/master/res/problem.gif" width="650px" />

* [xmake.vim](https://github.com/luzhlon/xmake.vim) (third-party, thanks [@luzhlon](https://github.com/luzhlon))

### XMake Gradle Plugin (JNI)

We can uses [xmake-gradle](https://github.com/xmake-io/xmake-gradle) plugin to compile JNI library in gradle.

plugins { id 'org.tboox.gradle-xmake-plugin' version '1.0.6' }

android {

externalNativeBuild {
    xmake {
        path "jni/xmake.lua"
    }
}

}


The `xmakeBuild` will be injected to `assemble` task automatically if the gradle-xmake-plugin has been applied.

console $ ./gradlew app:assembleDebug

Task :nativelib:xmakeConfigureForArm64 Task :nativelib:xmakeBuildForArm64

xmake build [ 50%]: ccache compiling.debug nativelib.cc [ 75%]: linking.debug libnativelib.so [100%]: build ok! install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/arm64-v8a Task :nativelib:xmakeConfigureForArmv7 Task :nativelib:xmakeBuildForArmv7 xmake build [ 50%]: ccache compiling.debug nativelib.cc [ 75%]: linking.debug libnativelib.so [100%]: build ok! install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/armeabi-v7a Task :nativelib:preBuild Task :nativelib:assemble Task :app:assembleDebug ```

Technical Support

We also provide paid technical support to help users quickly solve related problems. For details, please click the image link below:

Or you can also consider sponsoring us to get technical support services, [Become a sponsor]

Who is using Xmake?

Please click User List to view the complete user list.

If you are using xmake, welcome to submit the information to the above list through PR, so that let more users can known how many users are using xmake.

Ihis also let users to use xmake more confidently, and we will also have more motivation to maintain it continuously, so that the xmake project and the community will grow stronger.

Contacts

Thanks

This project exists thanks to all the people who have contributed: