| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- # Copyright 2019 Rene Rivera
- # Copyright 2017 Steven Watanabe
- # Copyright 2016 Vladimir Prus
- # Copyright 2017 Edward Diener
- # Distributed under the Boost Software License, Version 1.0.
- # (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
- import "class" : new ;
- import bison ;
- import errors ;
- import feature ;
- import indirect ;
- import os ;
- # import package ;
- import path ;
- import set ;
- import stage : add-install-dir ;
- import toolset ;
- import type ;
- import virtual-target ;
- path-constant SELF : . ;
- project b2
- : build-dir .build
- : requirements
- <cxxstd>11
- <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS=1
- <toolset>msvc:<define>_CRT_NONSTDC_NO_DEPRECATE=1
- ;
- #|
- Build the engine and its dependencies outside of the simple core build scripts.
- This allows us to keep the core build scripts as simple as possible. And lets
- us support more functionality for development of the engine core.
- |#
- #|
- Define custom yyacc tool.
- |#
- feature.feature yyacc : : dependency free ;
- toolset.flags yyacc TOOL <yyacc> ;
- exe yyacc
- : src/engine/yyacc.cpp
- : ;
- explicit yyacc ;
- rule yyacc-gen ( project name : property-set : sources * )
- {
- local relevant = [ toolset.relevant $(__name__).yyacc ] ;
- local a = [ new action $(sources[1]) : $(__name__).yyacc : [ $(property-set).add $(relevant) ] ] ;
- local targets ;
- for local n in $(name:S=).y $(name:S=)tab.h
- {
- targets += [ virtual-target.register
- [ new file-target $(n) exact : [ type.type $(n) ]
- : $(project) : $(a)
- ] ] ;
- }
- return $(targets) ;
- }
- actions yyacc bind TOOL
- {
- "$(TOOL)" "$(<)" "$(>)"
- }
- generate jamgram.y
- : src/engine/jamgram.yy
- : <generating-rule>@yyacc-gen
- <location>src/engine
- <yyacc>yyacc <dependency>yyacc
- ;
- explicit jamgram.y ;
- #|
- Define grammar translation with Bison.
- |#
- BISON = [ os.environ BISON ] ;
- BISON ?= bison ;
- local BISON_IN_PATH = [ path.glob [ os.executable-path ] : $(BISON[1]) $(BISON[1]).* ] ;
- rule grammar ( target : source : properties * )
- {
- # LOCATE on $(target) = $(source:D) ;
- BISON on $(target) = $(BISON) ;
- }
- actions grammar
- {
- "$(BISON)" --yacc --defines -o "$(<[1])" "$(>)"
- }
- if $(BISON_IN_PATH)
- {
- make jamgram.cpp
- : src/engine/jamgram.y
- : @grammar
- : <dependency>jamgram.y
- <location>src/engine ;
- }
- else
- {
- errors.warning "Bison generator program '$(BISON:J= )' not found. Skipping grammar build." ;
- alias jamgram.cpp
- : src/engine/jamgram.cpp ;
- }
- explicit jamgram.cpp ;
- #|
- Define the b2 executable. Sources are based on platform.
- TODO: Make platform specific source be no-ops when not needed.
- |#
- local python-exe = [ MATCH --with-python=(.*) : [ modules.peek : ARGV ] ] ;
- local python-include ;
- local python-ldlib ;
- if $(python-exe)
- {
- python-include = [ SHELL
- "$(python-exe) -c \"import sysconfig; print(sysconfig.get_path('include'));\""
- : strip-eol ] ;
- python-libdir = [ SHELL
- "$(python-exe) -c \"import sysconfig; import os.path; print(sysconfig.get_config_var('LIBDIR'));\""
- : strip-eol ] ;
- python-ldlib = [ MATCH ".*(python.*)" : [ SHELL
- "$(python-exe) -c \"import sysconfig; import os.path; print(sysconfig.get_config_var('LIBRARY'));\""
- : strip-eol ] ] ;
- python-ldlib = $(python-ldlib:S=) ;
- lib python
- :
- : <name>$(python-ldlib) <search>$(python-libdir)
- :
- : <include>$(python-include) <define>HAVE_PYTHON ;
- }
- else
- {
- alias python ;
- }
- obj jamgram.obj
- : jamgram.cpp
- : <toolset>gcc:<cxxflags>-Wno-free-nonheap-object
- ;
- explicit jamgram.obj ;
- local b2_src =
- [ glob src/engine/*.cpp src/engine/modules/*.cpp :
- src/engine/*nt.cpp src/engine/*unix.cpp src/engine/*vms.cpp
- src/engine/yyacc.cpp src/engine/mkjambase.cpp
- src/engine/check_*.cpp
- src/engine/jamgram.cpp
- ] ;
- local b2_src_nt = [ glob src/engine/*nt.cpp ] ;
- local b2_src_unix = [ glob src/engine/*unix.cpp ] ;
- local b2_src_vms = [ glob src/engine/*vms.cpp ] ;
- local unix_os = [ set.difference [ feature.values <target-os> ] : windows vms ] ;
- exe b2
- : $(b2_src)
- jamgram.obj
- python
- : <target-os>windows:<source>$(b2_src_nt)
- <target-os>vms:<source>$(b2_src_vms)
- <target-os>$(unix_os):<source>$(b2_src_unix)
- <toolset>msvc:<find-static-library>kernel32
- <toolset>msvc:<find-static-library>advapi32
- <toolset>msvc:<find-static-library>user32
- ;
- explicit b2 ;
- #|
- Installation of the engine, build, and example files.
- |#
- feature.feature b2-install-layout : standard portable : incidental propagated ;
- add-install-dir b2prefix-standard : : prefix ;
- add-install-dir b2bindir-standard : : bindir ;
- add-install-dir b2coredir-standard : boost-build/src : datarootdir ;
- add-install-dir b2examplesdir-standard : boost-build/examples : datarootdir ;
- add-install-dir b2prefix-portable : : prefix ;
- add-install-dir b2bindir-portable : : b2prefix-portable ;
- add-install-dir b2coredir-portable : .b2 : b2prefix-portable ;
- add-install-dir b2examplesdir-portable : .b2/examples : b2prefix-portable ;
- local ext = "" ;
- if [ os.on-windows ] || [ os.on-vms ]
- {
- ext = ".exe" ;
- }
- install b2-engine
- : $(SELF)/src/engine/b2$(ext)
- : <b2-install-layout>standard:<location>(b2bindir-standard)
- <b2-install-layout>portable:<location>(b2bindir-portable)
- ;
- explicit b2-engine ;
- local examples ;
- for local e in [ glob-tree-ex $(SELF)/example : * : . .svn ]
- {
- if [ CHECK_IF_FILE [ path.native $(e) ] ]
- {
- examples += $(e) ;
- }
- }
- install b2-examples
- : # What to install
- $(examples)
- : # What is the root of the directory
- <install-source-root>example
- # Which subdir of $prefix/share
- <b2-install-layout>standard:<location>(b2examplesdir-standard)
- <b2-install-layout>portable:<location>(b2examplesdir-portable)
- ;
- explicit b2-examples ;
- local .core-sources =
- $(SELF)/src/build-system.jam
- [ path.glob-tree $(SELF)/src/build : *.jam ]
- [ path.glob-tree $(SELF)/src/contrib : *.jam ]
- [ path.glob-tree $(SELF)/src/kernel : *.jam ]
- [ path.glob-tree $(SELF)/src/options : *.jam ]
- [ path.glob-tree $(SELF)/src/util : *.jam ]
- [ path.glob-tree $(SELF)/src/tools : *.jam *.xml *.xsl *.doxyfile *.hpp doxproc.py ]
- ;
- if $(python-exe)
- {
- .core-sources +=
- [ path.glob-tree $(SELF)/src/build : *.py ]
- [ path.glob-tree $(SELF)/src/contrib : *.py ]
- [ path.glob-tree $(SELF)/src/kernel : *.py ]
- [ path.glob-tree $(SELF)/src/options : *.py ]
- [ path.glob-tree $(SELF)/src/util : *.py ]
- [ path.glob-tree $(SELF)/src/tools : *.py : doxproc.py ]
- ;
- }
- install b2-core
- : # What to install
- $(.core-sources)
- : # What is the root of the directory
- <install-source-root>src
- # Which subdir of $prefix/share
- <b2-install-layout>standard:<location>(b2coredir-standard)
- <b2-install-layout>portable:<location>(b2coredir-portable)
- ;
- explicit b2-core ;
- #|
- Only install example files when requested to avoid bloating install footprint.
- |#
- if --with-examples in [ modules.peek : ARGV ]
- {
- alias install : b2-engine b2-core b2-examples ;
- }
- else
- {
- alias install : b2-engine b2-core ;
- }
- explicit install ;
|