
# Boost.Context Library Build Jamfile

#          Copyright Oliver Kowalke 2009.
# Distributed under the Boost Software License, Version 1.0.
#    (See accompanying file LICENSE_1_0.txt or copy at
#          http://www.boost.org/LICENSE_1_0.txt)

import common ;
import feature ;
import indirect ;
import modules ;
import os ;
import toolset ;
 import ../../config/checks/config : requires ;

feature.feature segmented-stacks : on : optional propagated composite ;
feature.compose <segmented-stacks>on : <define>BOOST_USE_SEGMENTED_STACKS ;

feature.feature htm : tsx : optional propagated composite ;
feature.compose <htm>tsx : <define>BOOST_USE_TSX ;

feature.feature valgrind : on : optional propagated composite ;
feature.compose <valgrind>on : <define>BOOST_USE_VALGRIND ;

project boost/context
    : requirements
      <target-os>windows:<define>_WIN32_WINNT=0x0601
      <toolset>gcc,<segmented-stacks>on:<cxxflags>-fsplit-stack
      <toolset>gcc,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
      <toolset>gcc,<segmented-stacks>on:<linkflags>"-static-libgcc"
      <toolset>clang,<segmented-stacks>on:<cxxflags>-fsplit-stack
      <toolset>clang,<segmented-stacks>on:<cxxflags>-DBOOST_USE_SEGMENTED_STACKS
      <toolset>clang,<segmented-stacks>on:<linkflags>"-static-libgcc"
      <toolset>intel,<link>shared:<define>BOOST_CONTEXT_EXPORT=EXPORT
      <toolset>intel,<link>static:<define>BOOST_CONTEXT_EXPORT=
      <toolset>msvc,<link>shared:<define>BOOST_CONTEXT_EXPORT=EXPORT
      <toolset>msvc,<link>static:<define>BOOST_CONTEXT_EXPORT=
      <toolset>clang-win,<link>shared:<define>BOOST_CONTEXT_EXPORT=EXPORT
      <toolset>clang-win,<link>static:<define>BOOST_CONTEXT_EXPORT=
      <link>shared:<define>BOOST_CONTEXT_DYN_LINK=1
      <define>BOOST_CONTEXT_SOURCE
      <threading>multi
    : usage-requirements
      <link>shared:<define>BOOST_CONTEXT_DYN_LINK=1
      <optimization>speed:<define>BOOST_DISABLE_ASSERTS
      <variant>release:<define>BOOST_DISABLE_ASSERTS
    : source-location ../src
    ;


local rule default_binary_format ( )
{
    local tmp = elf ;
    if [ os.name ] = "NT" { tmp = pe ; }
    else if [ os.name ] = "CYGWIN" { tmp = pe ; }
    else if [ os.name ] = "AIX" { tmp = xcoff ; }
    else if [ os.name ] = "MACOSX" { tmp = mach-o ; }
    return $(tmp) ;
}

feature.feature binary-format
   : elf
     mach-o
     pe
     xcoff
   : propagated
   ;
feature.set-default binary-format : [ default_binary_format ] ;


local rule default_abi ( )
{
    local tmp = sysv ;
    if [ os.name ] = "NT" { tmp = ms ; }
    else if [ os.name ] = "CYGWIN" { tmp = ms ; }
    else if [ os.platform ] = "ARM" { tmp = aapcs ; }
    else if [ os.platform ] = "MIPS" { tmp = o32 ; }
    return $(tmp) ;
}

feature.feature abi
   : aapcs
     eabi
     ms
     n32
     n64
     o32
     o64
     sysv
     x32
   : propagated
   ;
feature.set-default abi : [ default_abi ] ;


feature.feature context-impl
    : fcontext
      ucontext
      winfib
    : propagated
      composite
    ;
feature.set-default context-impl : fcontext ;
feature.compose <context-impl>ucontext : <define>BOOST_USE_UCONTEXT ;
feature.compose <context-impl>winfib : <define>BOOST_USE_WINFIB ;

# ARM
# ARM/AAPCS/ELF
alias asm_sources
   : asm/make_arm_aapcs_elf_gas.S
     asm/jump_arm_aapcs_elf_gas.S
     asm/ontop_arm_aapcs_elf_gas.S
   : <abi>aapcs
     <address-model>32
     <architecture>arm
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_arm_aapcs_elf_gas.S
     asm/jump_arm_aapcs_elf_gas.S
     asm/ontop_arm_aapcs_elf_gas.S
   : <abi>aapcs
     <address-model>32
     <architecture>arm
     <binary-format>elf
     <toolset>gcc
   ;

alias asm_sources
   : asm/make_arm_aapcs_elf_gas.S
     asm/jump_arm_aapcs_elf_gas.S
     asm/ontop_arm_aapcs_elf_gas.S
   : <abi>aapcs
     <address-model>32
     <architecture>arm
     <binary-format>elf
     <toolset>qcc
   ;

# ARM/AAPCS/MACH-O
alias asm_sources
   : asm/make_arm_aapcs_macho_gas.S
     asm/jump_arm_aapcs_macho_gas.S
     asm/ontop_arm_aapcs_macho_gas.S
   : <abi>aapcs
     <address-model>32
     <architecture>arm
     <binary-format>mach-o
     <toolset>clang
   ;

alias asm_sources
   : asm/make_arm_aapcs_macho_gas.S
     asm/jump_arm_aapcs_macho_gas.S
     asm/ontop_arm_aapcs_macho_gas.S
   : <abi>aapcs
     <address-model>32
     <architecture>arm
     <binary-format>mach-o
     <toolset>darwin
   ;

# ARM/AAPCS/PE
alias asm_sources
   : asm/make_arm_aapcs_pe_armasm.asm
     asm/jump_arm_aapcs_pe_armasm.asm
     asm/ontop_arm_aapcs_pe_armasm.asm
     untested.cpp
   : <abi>aapcs
     <address-model>32
     <architecture>arm
     <binary-format>pe
     <toolset>msvc
   ;

# ARM64
# ARM64/AAPCS/ELF
alias asm_sources
   : asm/make_arm64_aapcs_elf_gas.S
     asm/jump_arm64_aapcs_elf_gas.S
     asm/ontop_arm64_aapcs_elf_gas.S
   : <abi>aapcs
     <address-model>64
     <architecture>arm
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_arm64_aapcs_elf_gas.S
     asm/jump_arm64_aapcs_elf_gas.S
     asm/ontop_arm64_aapcs_elf_gas.S
   : <abi>aapcs
     <address-model>64
     <architecture>arm
     <binary-format>elf
     <toolset>gcc
   ;

# ARM64/AAPCS/MACH-O
alias asm_sources
   : asm/make_arm64_aapcs_macho_gas.S
     asm/jump_arm64_aapcs_macho_gas.S
     asm/ontop_arm64_aapcs_macho_gas.S
   : <abi>aapcs
     <address-model>64
     <architecture>arm
     <binary-format>mach-o
     <toolset>clang
   ;

alias asm_sources
   : asm/make_arm64_aapcs_macho_gas.S
     asm/jump_arm64_aapcs_macho_gas.S
     asm/ontop_arm64_aapcs_macho_gas.S
   : <abi>aapcs
     <address-model>64
     <architecture>arm
     <binary-format>mach-o
     <toolset>darwin
   ;

# MIPS
# MIPS32/O32/ELF
alias asm_sources
   : asm/make_mips32_o32_elf_gas.S
     asm/jump_mips32_o32_elf_gas.S
     asm/ontop_mips32_o32_elf_gas.S
   : <abi>o32
     <address-model>32
     <architecture>mips1
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_mips32_o32_elf_gas.S
     asm/jump_mips32_o32_elf_gas.S
     asm/ontop_mips32_o32_elf_gas.S
   : <abi>o32
     <address-model>32
     <architecture>mips1
     <binary-format>elf
     <toolset>gcc
   ;

# MIPS64/N64/ELF
alias asm_sources
   : asm/make_mips64_n64_elf_gas.S
     asm/jump_mips64_n64_elf_gas.S
     asm/ontop_mips64_n64_elf_gas.S
   : <abi>n64
     <address-model>64
     <architecture>mips1
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_mips64_n64_elf_gas.S
     asm/jump_mips64_n64_elf_gas.S
     asm/ontop_mips64_n64_elf_gas.S
   : <abi>n64
     <address-model>64
     <architecture>mips1
     <binary-format>elf
     <toolset>gcc
   ;

# POWERPC_32
# POWERPC_32/SYSV/ELF
alias asm_sources
   : asm/make_ppc32_sysv_elf_gas.S
     asm/jump_ppc32_sysv_elf_gas.S
     asm/ontop_ppc32_sysv_elf_gas.S
     asm/tail_ppc32_sysv_elf_gas.cpp
   : <abi>sysv
     <address-model>32
     <architecture>power
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_ppc32_sysv_elf_gas.S
     asm/jump_ppc32_sysv_elf_gas.S
     asm/ontop_ppc32_sysv_elf_gas.S
     asm/tail_ppc32_sysv_elf_gas.cpp
   : <abi>sysv
     <address-model>32
     <architecture>power
     <binary-format>elf
     <toolset>gcc
   ;

alias asm_sources
   : asm/make_ppc32_sysv_macho_gas.S
     asm/jump_ppc32_sysv_macho_gas.S
     asm/ontop_ppc32_sysv_macho_gas.S
   : <abi>sysv
     <address-model>32
     <architecture>power
     <binary-format>mach-o
     <toolset>darwin
   ;

#POWERPC_32/SYSV/XCOFF
alias asm_sources
   : asm/make_ppc32_sysv_xcoff_gas.S
     asm/jump_ppc32_sysv_xcoff_gas.S
     asm/ontop_ppc32_sysv_xcoff_gas.S
   : <abi>sysv
     <address-model>32
     <architecture>power
     <binary-format>xcoff
     <toolset>clang
   ;

alias asm_sources
   : asm/make_ppc32_sysv_xcoff_gas.S
     asm/jump_ppc32_sysv_xcoff_gas.S
     asm/ontop_ppc32_sysv_xcoff_gas.S
   : <abi>sysv
     <address-model>32
     <architecture>power
     <binary-format>xcoff
     <toolset>gcc
   ;

# POWERPC_64
# POWERPC_64/SYSV/ELF
alias asm_sources
   : asm/make_ppc64_sysv_elf_gas.S
     asm/jump_ppc64_sysv_elf_gas.S
     asm/ontop_ppc64_sysv_elf_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>power
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_ppc64_sysv_elf_gas.S
     asm/jump_ppc64_sysv_elf_gas.S
     asm/ontop_ppc64_sysv_elf_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>power
     <binary-format>elf
     <toolset>gcc
   ;

# POWERPC_64/SYSV/MACH-O
alias asm_sources
   : asm/make_ppc64_sysv_macho_gas.S
     asm/jump_ppc64_sysv_macho_gas.S
     asm/ontop_ppc64_sysv_macho_gas.S
     untested.cpp
   : <abi>sysv
     <address-model>64
     <architecture>power
     <binary-format>mach-o
     <toolset>clang
   ;

alias asm_sources
   : asm/make_ppc64_sysv_macho_gas.S
     asm/jump_ppc64_sysv_macho_gas.S
     asm/ontop_ppc64_sysv_macho_gas.S
     untested.cpp
   : <abi>sysv
     <address-model>64
     <architecture>power
     <binary-format>mach-o
     <toolset>darwin
   ;

# POWERPC_64/SYSV/XCOFF
alias asm_sources
   : asm/make_ppc64_sysv_xcoff_gas.S
     asm/jump_ppc64_sysv_xcoff_gas.S
     asm/ontop_ppc64_sysv_xcoff_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>power
     <binary-format>xcoff
     <toolset>clang
   ;

alias asm_sources
   : asm/make_ppc64_sysv_xcoff_gas.S
     asm/jump_ppc64_sysv_xcoff_gas.S
     asm/ontop_ppc64_sysv_xcoff_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>power
     <binary-format>xcoff
     <toolset>gcc
   ;

# POWERPC universal
# POWERPC_32_64/SYSV/MACH-O
alias asm_sources
   : asm/make_ppc32_ppc64_sysv_macho_gas.S
     asm/jump_ppc32_ppc64_sysv_macho_gas.S
     asm/ontop_ppc32_ppc64_sysv_macho_gas.S
   : <abi>sysv
     <address-model>32_64
     <architecture>power
     <binary-format>mach-o
   ;

# RISCV64
# RISCV64/SYSV/ELF
alias asm_sources
   : asm/make_riscv64_sysv_elf_gas.S
     asm/jump_riscv64_sysv_elf_gas.S
     asm/ontop_riscv64_sysv_elf_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>riscv
     <binary-format>elf
     <toolset>gcc
   ;

# S390X
# S390X/SYSV/ELF
alias asm_sources
   : asm/make_s390x_sysv_elf_gas.S
     asm/jump_s390x_sysv_elf_gas.S
     asm/ontop_s390x_sysv_elf_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>s390x
     <binary-format>elf
     <toolset>gcc
   ;

# X86
# X86/SYSV/ELF
alias asm_sources
   : asm/make_i386_sysv_elf_gas.S
     asm/jump_i386_sysv_elf_gas.S
     asm/ontop_i386_sysv_elf_gas.S
   : <abi>sysv
     <address-model>32
     <architecture>x86
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_i386_sysv_elf_gas.S
     asm/jump_i386_sysv_elf_gas.S
     asm/ontop_i386_sysv_elf_gas.S
   : <abi>sysv
     <address-model>32
     <architecture>x86
     <binary-format>elf
     <toolset>gcc
   ;

alias asm_sources
   : asm/make_i386_sysv_elf_gas.S
     asm/jump_i386_sysv_elf_gas.S
     asm/ontop_i386_sysv_elf_gas.S
   : <abi>sysv
     <address-model>32
     <architecture>x86
     <binary-format>elf
     <toolset>intel
   ;

# X86/SYSV/MACH-O
alias asm_sources
   : asm/make_i386_sysv_macho_gas.S
     asm/jump_i386_sysv_macho_gas.S
     asm/ontop_i386_sysv_macho_gas.S
   : <abi>sysv
     <address-model>32
     <architecture>x86
     <binary-format>mach-o
     <toolset>clang
   ;

alias asm_sources
   : asm/make_i386_sysv_macho_gas.S
     asm/jump_i386_sysv_macho_gas.S
     asm/ontop_i386_sysv_macho_gas.S
   : <abi>sysv
     <address-model>32
     <architecture>x86
     <binary-format>mach-o
     <toolset>darwin
   ;

# X86/MS/PE
alias asm_sources
   : asm/make_i386_ms_pe_gas.asm
     asm/jump_i386_ms_pe_gas.asm
     asm/ontop_i386_ms_pe_gas.asm
     dummy.cpp
   : <abi>ms
     <address-model>32
     <architecture>x86
     <binary-format>pe
     <toolset>clang
   ;

alias asm_sources
   : asm/make_i386_ms_pe_masm.asm
     asm/jump_i386_ms_pe_masm.asm
     asm/ontop_i386_ms_pe_masm.asm
     dummy.cpp
   : <abi>ms
     <address-model>32
     <architecture>x86
     <binary-format>pe
     <toolset>clang-win
   ;

alias asm_sources
   : asm/make_i386_ms_pe_gas.asm
     asm/jump_i386_ms_pe_gas.asm
     asm/ontop_i386_ms_pe_gas.asm
     dummy.cpp
   : <abi>ms
     <address-model>32
     <architecture>x86
     <binary-format>pe
     <toolset>gcc
   ;

alias asm_sources
   : asm/make_i386_ms_pe_masm.asm
     asm/jump_i386_ms_pe_masm.asm
     asm/ontop_i386_ms_pe_masm.asm
     dummy.cpp
   : <abi>ms
     <address-model>32
     <architecture>x86
     <binary-format>pe
     <toolset>intel
   ;

alias asm_sources
   : asm/make_i386_ms_pe_masm.asm
     asm/jump_i386_ms_pe_masm.asm
     asm/ontop_i386_ms_pe_masm.asm
     dummy.cpp
   : <abi>ms
     <address-model>32
     <architecture>x86
     <binary-format>pe
     <toolset>msvc
   ;

# X86_64
# X86_64/SYSV/ELF
alias asm_sources
   : asm/make_x86_64_sysv_elf_gas.S
     asm/jump_x86_64_sysv_elf_gas.S
     asm/ontop_x86_64_sysv_elf_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>x86
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_x86_64_sysv_elf_gas.S
     asm/jump_x86_64_sysv_elf_gas.S
     asm/ontop_x86_64_sysv_elf_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>x86
     <binary-format>elf
     <toolset>gcc
   ;

alias asm_sources
   : asm/make_x86_64_sysv_elf_gas.S
     asm/jump_x86_64_sysv_elf_gas.S
     asm/ontop_x86_64_sysv_elf_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>x86
     <binary-format>elf
     <toolset>intel
   ;

# X86_64/SYSV/MACH-O
alias asm_sources
   : asm/make_x86_64_sysv_macho_gas.S
     asm/jump_x86_64_sysv_macho_gas.S
     asm/ontop_x86_64_sysv_macho_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>x86
     <binary-format>mach-o
     <toolset>clang
   ;

alias asm_sources
   : asm/make_x86_64_sysv_macho_gas.S
     asm/jump_x86_64_sysv_macho_gas.S
     asm/ontop_x86_64_sysv_macho_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>x86
     <binary-format>mach-o
     <toolset>darwin
   ;

alias asm_sources
   : asm/make_x86_64_sysv_macho_gas.S
     asm/jump_x86_64_sysv_macho_gas.S
     asm/ontop_x86_64_sysv_macho_gas.S
   : <abi>sysv
     <address-model>64
     <architecture>x86
     <binary-format>mach-o
     <toolset>intel
   ;

# X86_64/MS/PE
alias asm_sources
   : asm/make_x86_64_ms_pe_gas.asm
     asm/jump_x86_64_ms_pe_gas.asm
     asm/ontop_x86_64_ms_pe_gas.asm
     dummy.cpp
   : <abi>ms
     <address-model>64
     <architecture>x86
     <binary-format>pe
     <toolset>clang
   ;

alias asm_sources
   : asm/make_x86_64_ms_pe_masm.asm
     asm/jump_x86_64_ms_pe_masm.asm
     asm/ontop_x86_64_ms_pe_masm.asm
     dummy.cpp
   : <abi>ms
     <address-model>64
     <architecture>x86
     <binary-format>pe
     <toolset>clang-win
   ;

alias asm_sources
   : asm/make_x86_64_ms_pe_gas.asm
     asm/jump_x86_64_ms_pe_gas.asm
     asm/ontop_x86_64_ms_pe_gas.asm
     dummy.cpp
   : <abi>ms
     <address-model>64
     <architecture>x86
     <binary-format>pe
     <toolset>gcc
   ;

alias asm_sources
   : asm/make_x86_64_ms_pe_masm.asm
     asm/jump_x86_64_ms_pe_masm.asm
     asm/ontop_x86_64_ms_pe_masm.asm
     dummy.cpp
   : <abi>ms
     <address-model>64
     <architecture>x86
     <binary-format>pe
     <toolset>intel
   ;

alias asm_sources
   : asm/make_x86_64_ms_pe_masm.asm
     asm/jump_x86_64_ms_pe_masm.asm
     asm/ontop_x86_64_ms_pe_masm.asm
     dummy.cpp
   : <abi>ms
     <address-model>64
     <architecture>x86
     <binary-format>pe
     <toolset>msvc
   ;

# X86_64/SYSV/X32
alias asm_sources
   : asm/make_x86_64_sysv_elf_gas.S
     asm/jump_x86_64_sysv_elf_gas.S
     asm/ontop_x86_64_sysv_elf_gas.S
   : <abi>x32
     <address-model>64
     <architecture>x86
     <binary-format>elf
     <toolset>clang
   ;

alias asm_sources
   : asm/make_x86_64_sysv_elf_gas.S
     asm/jump_x86_64_sysv_elf_gas.S
     asm/ontop_x86_64_sysv_elf_gas.S
   : <abi>x32
     <address-model>64
     <architecture>x86
     <binary-format>elf
     <toolset>gcc
   ;

alias asm_sources
   : asm/make_x86_64_sysv_elf_gas.S
     asm/jump_x86_64_sysv_elf_gas.S
     asm/ontop_x86_64_sysv_elf_gas.S
   : <abi>x32
     <address-model>64
     <architecture>x86
     <binary-format>elf
     <toolset>intel
   ;

#X86 universal
alias asm_sources
   : asm/make_i386_x86_64_sysv_macho_gas.S
     asm/jump_i386_x86_64_sysv_macho_gas.S
     asm/ontop_i386_x86_64_sysv_macho_gas.S
   : <abi>sysv
     <address-model>32_64
     <architecture>x86
     <binary-format>mach-o
   ;

# COMBINED
alias asm_sources
   : asm/make_combined_sysv_macho_gas.S
     asm/jump_combined_sysv_macho_gas.S
     asm/ontop_combined_sysv_macho_gas.S
   : <abi>sysv
     <architecture>combined
     <binary-format>mach-o
   ;

explicit asm_sources ;


# fcontext_t
alias impl_sources
    : asm_sources
    : <context-impl>fcontext
    ;

# ucontext_t
alias impl_sources
    : continuation.cpp
      fiber.cpp
    : <context-impl>ucontext
    [ requires cxx11_auto_declarations
               cxx11_constexpr
               cxx11_defaulted_functions
               cxx11_final
               cxx11_hdr_thread
               cxx11_hdr_tuple
               cxx11_lambdas
               cxx11_noexcept
               cxx11_nullptr
               cxx11_rvalue_references
               cxx11_template_aliases
               cxx11_thread_local
               cxx11_variadic_templates ]
    ;

# WinFiber
alias impl_sources
    : continuation.cpp
      fiber.cpp
    : <context-impl>winfib
    [ requires cxx11_auto_declarations
               cxx11_constexpr
               cxx11_defaulted_functions
               cxx11_final
               cxx11_hdr_thread
               cxx11_hdr_tuple
               cxx11_lambdas
               cxx11_noexcept
               cxx11_nullptr
               cxx11_rvalue_references
               cxx11_template_aliases
               cxx11_thread_local
               cxx11_variadic_templates ]
    ;

explicit impl_sources ;

obj cxx11_hdr_mutex_check : ../build/cxx11_hdr_mutex.cpp ;
explicit cxx11_hdr_mutex_check ;
local cxx11_mutex = [ check-target-builds
      cxx11_hdr_mutex_check "C++11 mutex"
    :
    : <library>/boost/thread//boost_thread
  ] ;

alias stack_traits_sources
    : windows/stack_traits.cpp
    : <target-os>windows
    :
    : $(cxx11_mutex)
    ;

alias stack_traits_sources
    : posix/stack_traits.cpp
    :
    :
    : $(cxx11_mutex)
    ;

explicit stack_traits_sources ;

lib boost_context
   : impl_sources
     stack_traits_sources
   ;

boost-install boost_context ;
