summaryrefslogtreecommitdiffhomepage
path: root/lib
AgeCommit message (Collapse)Author
2021-10-21Added testing support for cross-MinGW builds.Chris Reuter
This adds a build_config that will cross-build a Windows executable using the MinGW cross-compiler and will also run the unit (i.e. 'rake test') using Wine. For this to work, I made some modifications to the underlying test scripts as well as some minor changes to a couple of the tests themselves.
2021-08-07docs: fix case of mrubyJohn Bampton
2021-07-09Mrbgem gem_init.c compilation correctionNathan Ladd
When `disable_cdump` is declared on a Mrbgem spec, the procedure for loading MRuby code from the gem's `mrblib` directory is slightly different; instead of loading the mrblib code as a Proc built from the compiled irep, the compiled irep is loaded directly. The header files `mruby.h` and `mruby/proc.h` are needed only when the irep is loaded directly. They are currently included only when presym is disabled, they should be included whenever either presym is disabled *or* when `disable_cdump` is called. The `cdump?` predicate method happens to return true in either case (presym disabled *or* cdump disabled), so this change should be safe.
2021-05-31Fix typo in `lib/mruby/presym.rb`KOBAYASHI Shuji
2021-04-17`MRuby::Presym` no longer needs `Rake::DSL`KOBAYASHI Shuji
2021-04-02Merge branch 'define-MRB_NO_GEMS-if-disable_libmruby-is-specified' of ↵Yukihiro "Matz" Matsumoto
https://github.com/shuujii/mruby into shuujii-define-MRB_NO_GEMS-if-disable_libmruby-is-specified
2021-03-22Use global defines for `mruby-bin-debugger`KOBAYASHI Shuji
2021-03-22build: provide global defines by `build.defines`.Yukihiro "Matz" Matsumoto
2021-03-21command.rb: replace `%w()` to plain `[]`.Yukihiro "Matz" Matsumoto
2021-03-18lib/mruby/build.rb: refactoring `ensure` clause; ref #5381Yukihiro "Matz" Matsumoto
2021-03-17Allow `break` in `build_config`.dearblue
If I break out of a block given to `MRuby::Build.new` with `break` or `throw`, I will get a seemingly inexplicable error because the `presym`-related initialization is not done. ```console % cat build_config1.rb MRuby::Build.new do toolchain break end % rake CONFIG=build_config1.rb rake aborted! external mrbc or mruby-bin-mrbc gem in current('host') or 'host' build is required /var/tmp/mruby/lib/mruby/build.rb:332:in `mrbcfile' /var/tmp/mruby/tasks/mrblib.rake:9:in `block in <top (required)>' /var/tmp/mruby/lib/mruby/build.rb:18:in `instance_eval' /var/tmp/mruby/lib/mruby/build.rb:18:in `block in each_target' /var/tmp/mruby/lib/mruby/build.rb:17:in `each' /var/tmp/mruby/lib/mruby/build.rb:17:in `each_target' /var/tmp/mruby/tasks/mrblib.rake:1:in `<top (required)>' /var/tmp/mruby/Rakefile:27:in `load' /var/tmp/mruby/Rakefile:27:in `<top (required)>' (See full trace by running task with --trace) ``` If a non-exceptional global jump occurs, it can be initialized by `ensure` to solve this problem.
2021-02-17Merge pull request #5357 from k0kubun/lock-depthYukihiro "Matz" Matsumoto
Skip --depth=1 when it's locked
2021-02-16Skip --depth=1 when it's lockedTakashi Kokubun
2021-02-14Add `-s` option to `mrbc` for make variable staticKOBAYASHI Shuji
2021-02-12Do not collect linker options from binary gems; close #5210Yukihiro "Matz" Matsumoto
Binary gems are mrbgems that set `spec.bins` in their `mrbgem.rake`, and usually their names are prefixed with `mruby-bin-`.
2021-02-06`compile_as_cxx` should generate a path under` conf.build_dir`dearblue
If the current directory is different from `MRUBY_ROOT` and it has` conf.build_dir` and `conf.enable_cxx_exception` set, it was generating a pathname outside of` build_dir`. As a result, in some cases files unrelated to mruby could be linked. ```console % pwd /tmp/mruby/1/2/3/4/5/6 % mruby_dir=/tmp/mruby/a/b/c/d/mruby % cat my_config.rb MRuby::Build.new("host", "build/to/custom/directory") do toolchain enable_cxx_exception end % rake MRUBY_CONFIG=my_config.rb -f $mruby_dir/Rakefile > logs % grep CXX logs CXX a/b/c/d/mruby/src/error-cxx.cxx -> a/b/c/d/mruby/src/error-cxx.o CXX a/b/c/d/mruby/src/gc-cxx.cxx -> a/b/c/d/mruby/src/gc-cxx.o CXX a/b/c/d/mruby/src/vm-cxx.cxx -> a/b/c/d/mruby/src/vm-cxx.o CXX a/b/c/d/mruby/mrbgems/mruby-compiler/core/codegen-cxx.cxx -> a/b/c/d/mruby/mrbgems/mruby-compiler/core/codegen-cxx.o CXX a/b/c/d/mruby/mrbgems/mruby-compiler/core/y.tab-cxx.cxx -> a/b/c/d/mruby/mrbgems/mruby-compiler/core/y.tab-cxx.o CXX ../a/b/c/d/mruby/src/error-cxx.cxx -> ../a/b/c/d/mruby/src/error-cxx.o CXX ../a/b/c/d/mruby/src/gc-cxx.cxx -> ../a/b/c/d/mruby/src/gc-cxx.o CXX ../a/b/c/d/mruby/src/vm-cxx.cxx -> ../a/b/c/d/mruby/src/vm-cxx.o ```
2021-02-06Exclude `<build-dir>/mrbc/**/*` from rake target rulesdearblue
Prevents the auto-generated mrbc target source code from being compiled under host conditions. This is because a build error occurred when `conf.enable_cxx_exception` was set.
2021-02-05Define `MRB_NO_GEMS` if `disable_libmruby` is specifiedKOBAYASHI Shuji
2021-02-04Fix breakage where builds except `host` don't refer` mrbc` in `host`KOBAYASHI Shuji
Build error occurred under the following conditions. * `host` build is presym enabled and unspecified `mruby-bin-mrbc` gem. * Build except `host` unspecified `mruby-bin-mrbc` gem and mrbcfile. ### Example #### Build configuration ```ruby MRuby::Build.new{|conf| conf.toolchain} MRuby::Build.new("host2"){|conf| conf.toolchain} ``` #### Error ```console rake aborted! external mrbc or mruby-bin-mrbc gem in current('host2') or 'host' build is required /mruby/lib/mruby/build.rb:326:in `mrbcfile' /mruby/tasks/mrblib.rake:9:in `block in <top (required)>' /mruby/lib/mruby/build.rb:18:in `instance_eval' /mruby/lib/mruby/build.rb:18:in `block in each_target' /mruby/lib/mruby/build.rb:17:in `each' /mruby/lib/mruby/build.rb:17:in `each_target' /mruby/tasks/mrblib.rake:1:in `<top (required)>' /mruby/Rakefile:27:in `load' /mruby/Rakefile:27:in `<top (required)>' ```
2021-01-31Change `.o.d` back to `.d` because `.pi.d` is no longer createdKOBAYASHI Shuji
2021-01-29Build internal mrbc in an internal directorydearblue
2021-01-28Refine `preprocess_options`; ref d95ffb036KOBAYASHI Shuji
If we modify an option that may have been specified by users, we may make unintended changes, so it is better not to modify it as much as possible, IMO.
2021-01-28Stop generating `build/<build>/src/*.pi.d`.Yukihiro "Matz" Matsumoto
2021-01-27Add symbol names as comments to `presym_length_table`; ref #5303Yukihiro "Matz" Matsumoto
2021-01-27Add `static` modifiers to preallocated symbols tables; ref #5303Yukihiro "Matz" Matsumoto
2021-01-27Split `presym_table` for reduced program sizeKOBAYASHI Shuji
Because a structure that is an element of `presym_table` has padding, split it into individual arrays for name and length. #### Result (64-bit CPU with full-core gembox) | | mruby | libmruby.a | |--------|------------|------------| | Before | 1,087,444B | 1,476,872B | | After | 1,079,340B | 1,469,784B |
2021-01-27Rename `.i` created for presym scan to `.pi`KOBAYASHI Shuji
This is because compiler's `-save-temps=obj` option creates `.i` with the same name.
2021-01-12Merge branch 'reorganize-ci' of https://github.com/dearblue/mruby into ↵Yukihiro "Matz" Matsumoto
dearblue-reorganize-ci
2021-01-10Unified `target_class` and `env` of `mrb_callinfo`dearblue
If there is `env`, `env->c` means `target_class`.
2021-01-10Fix build error in cross-build with presymKOBAYASHI Shuji
Fix the following issues. * https://github.com/mruby/mruby/pull/5220#issuecomment-757204258 * https://github.com/mruby/mruby/pull/5220#issuecomment-757205572
2021-01-09Remove unnecessary `#include` in generated filesKOBAYASHI Shuji
2021-01-08Delay test code build until `rake test`KOBAYASHI Shuji
With this change, the test code will not be built unless `rake test` is run, so there will be almost no side effects even if `enable_test` is always set (but, gems specified by `add_test_dependency` are included in `libmruby.a`). Also added are `test: build` task, which only builds the test code (including the main code), and `test: run` task, which only runs tests independent of build. Therefore, the idiom for building in parallel and not running tests in parallel is `rake -m test:build && rake test:run`.
2021-01-06Merge branch 'improve-source-scanning-for-presym' of ↵Yukihiro "Matz" Matsumoto
https://github.com/shuujii/mruby into shuujii-improve-source-scanning-for-presym
2020-12-19Avoid using `MRuby::CrossBuild.current`dearblue
This is because `MRuby::Build.currrent` and `MRuby::CrossBuild.current` are assignments to different instance variables.
2020-12-16Guess toolchain when `MRuby::Build#toolchain` argument is omittedKOBAYASHI Shuji
2020-12-15Output build log at the time of installationKOBAYASHI Shuji
2020-12-13Improve source scanning for presymKOBAYASHI Shuji
The accuracy is greatly improved by using the C preprocessor to scan C sources for presym. C preprocessor can perfectly interpret all comments and preprocessor directives, so it can detect all symbols defined, for example `mrbgems/mruby-socket/src/const.cstub`. Also, as described later, this change will greatly improve the accuracy of presym detection from Ruby sources. ## Result The number of lines in the `presym` file for all gems is as follows: ```console Previous: 999 (false positive = 89, undetected = 297) New: 1207 ``` ## Build process The new build process (with presym) is as follows: 1. Build `mrbc` without presym (more on building without presym later). 2. Compile Ruby sources to C struct format with the `mrbc` created in step 1, and create` mrblib.c` and `gem_init.c`. Note that the symbols in the created files are output as `MRB_SYM` family macros or `mrb_intern_lit` instead of IDs (details will be described later). 3. C preprocessor processes C sources including the created files of step 2 and outputs them as `.i` files. In these files, for example, `MRB_IVSYM(foo)` is converted to `<@! "@" "foo" !@>` and `mrb_define_module(mrb, "Foo")` is converted to `<@! "Foo" !@>`. 4. Scan the files created in step 3 and create `presym` and` presym.inc` files. The files created in step 2 should output all static symbols defined in Ruby sources, including local variables, so we can detect all presyms by just scanning C sources without scanning Ruby sources directly. Further, by this process, the files to be scanned becomes the same as the files to be compiled, so that there is no excess or deficiency. ## Related changes The following changes have been made in relation to realizing this feature. ### Allow build without presym It enables build without presym to achieve the "Build process: 1". This incorporates #5202, see its issue for details. Note that when presym is enabled, even adding a local variable to a Ruby source may change contents of presym and require recompilation of almost all C sources. This is inconvenient, especially during trial and error in development, but this feature is also useful because it does not cause this problem if presym is disabled. ### Automatically create build target for `mrbc` without presym The `mrbc` used in the "Build process: 1" will be built by automatically creating a build target for it. The build name is `SOURCE_BUILD_NAME/mrbc`. ### Constantize output of C struct format by `mrbc` To realizing the "Build process: 2", as mentioned above, symbol IDs are not output directly in C struct format output by `mrbc`. As a result, the output becomes constant regardless of the state of presym at the time of `mrbc` build, and it is possible to detect symbols of Ruby sources in the same way as other C sources. Note that `mrb_intern_lit` is used for symbols that do not become presym, but in this state, the corresponding element in the symbol array cannot be statically initialized, so it is initialized at run time (therefore, in this case, the `const` qualifier is not added to the symbol array). ### Specify arbitrary `mrbc` file To realizing the "Build process: 2", enabled to specify `mrbc` created by another build target or pre-built` mrbc`. Use `MRuby::Build#mrbcfile =` to specify it explicitly. You can omit the "Build process: 1" by specifying pre-built `mrbc`, and you can always use an optimized build to compile Ruby sources faster. I think changes that affect the output of `mrbc` are rare, so in many cases it helps to improve efficiency. With presym, the build will be a little slower due to more build steps, but this feature will improve it a bit. ### Create presym files for each build target This feature was proposed at #5194 and merged once, but was reverted in 5c205e6e due to problems especially with cross-compilation. It has been introduced again because this change solves the problem. The presym files will be created below. * `build/NAME/presym` * `build/NAME/include/mruby/presym.inc` ### Other changes * Because presym detection accuracy is greatly improved as mentioned above, `MRuby::Gem::Specification#cdump?` is set to true by default, and `disable_cdump` is added instead of `enable_cdump`. Also, support for gem specific presym files has been discontinued (https://github.com/mruby/mruby/issues/5151#issuecomment-730967232). * Previously, `mrbc` was automatically created for the `host` build, but it will not be created if the build target for `mrbc` mentioned above is automatically created. At this time, `mrbc` file of the `mrbc` build is copied to` bin/`. * Two types of `.d` files will be created, `.o.d` and `.i.d`. oThis is because if `.i` depends on `presym.inc`, the dependency will circulate, so the `.d` file cannot be shared. * Changed file created with `enable_cxx_exception` to `X-cxx.cxx` from `X.cxx` to use the mruby standard Rake rule. ### Note Almost all C sources will need to be recompiled if there are any changes to `persym.inc` (if not recompiled properly, it will often result in run-time error). If `gcc` toolchain is used, dependencies are resolved by the `.d` file, so it become automatically recompile target, but if not (e.g. MSVC), it is necessary to manually make it recompile target. Also, even if `gcc` toolchain is used, it may not become recompile target if external gems does not use the mruby standard Rake rule. In particular, if the standard rule is overwritten, such as https://github.com/mruby/mruby/pull/5112/files, `.d` file will not be read, so be careful.
2020-12-06Call `super` before creating `host` build in `MRuby::CrossBuild#initialize`KOBAYASHI Shuji
Call `super` (`block`) ahead so that creation of the `host` build can be skipped if pre-built `mrbc` can be specified in the future. close #5213.
2020-12-05Remove unused `@endian` in `MRuby::CrossBuild#initialize`KOBAYASHI Shuji
2020-12-05Make it possible that `libmruby.a` is not createdKOBAYASHI Shuji
Previously, `libmruby.a` was created even if only `mruby-bin-mrbc` or` mruby-compiler` was specified for gem, but by specifying `disable_libmruby`, the creation of `libmruby.a` can be suppressed. ### Note The https://github.com/mruby/mruby/pull/5084#issuecomment-723521971 incompatibility seems to be difficult for users to avoid, so the original behavior has been restored. Therefore, if we need `mrbc` other than the `host` build, we need to explicitly specify `mruby-bin-mrbc` gem. Due to the above changes, `build_config/boxing.rb` etc. will not work, but I have added` mruby-bin-mrbc` to `default.gembox` to fix it. I don't think this change is a big deal because originally `mruby-compiler` was included.
2020-12-02Merge pull request #5198 from shuujii/remove-unused-Rake-rulesYukihiro "Matz" Matsumoto
Remove unused Rake rules
2020-12-01Revert "Create presym files for each build target" (58ba883e)KOBAYASHI Shuji
Due to the above changes, it may not work with the existing build configurations in cross-compilation (even if we can build without presym), therefore revert it once (ref https://github.com/mruby/mruby/pull/5202#issuecomment-735412643). Sorry for the lack of consideration.
2020-11-28Remove unused Rake rulesKOBAYASHI Shuji
Currently, the source file language in the core is C only, and C++, Objective-C, and Assembly are not used, so Rake rules for them are removed.
2020-11-26Create presym files for each build targetKOBAYASHI Shuji
Previously, presym files were always created in `build/{presym,presym.inc}`. However, this constraint is inconvenient because it is common to use multiple build configurations and build targets in a single mruby tree. Therefore, change to create presym file for each build target.
2020-11-25Allow compiler name in build log to be customizedKOBAYASHI Shuji
For example, in the case of the C++ compiler, it is output as `CXX build/host/src/gc.cxx -> build/host/src/gc.cxx.o` (FYI, in the case of `enable_cxx_abi`, it outputs `CC ...` because the option to compile as C++ is added to C compiler).
2020-11-24Merge pull request #5178 from abinoam/fix_mruby_config_settingYukihiro "Matz" Matsumoto
Fix #5177 by setting MRUBY_CONFIG early
2020-11-23Fix #5177 - set MRUBY_CONFIG earlyAbinoam Praxedes Marques Junior
2020-11-23Merge pull request #5181 from ↵Yukihiro "Matz" Matsumoto
shuujii/raise-an-exception-instead-of-exiting-when-mrbc-fails Raise an exception instead of exiting when `mrbc` fails
2020-11-23Change output condition in `_pp`KOBAYASHI Shuji
* Output even with `rake -v` (to help debugging) * Not output when `rake -s`
2020-11-23Raise an exception instead of exiting when `mrbc` failsKOBAYASHI Shuji