Coder Social home page Coder Social logo

mob's Introduction

Table of contents

Quick start

> git clone https://github.com/ModOrganizer2/mob
> cd mob
> bootstrap
> mob -d c:\somewhere build

Extended start

Qt - CLI based install using aqt

aqt is a CLI installer for Qt, it makes installing Qt extremely quick and painless, and doesn't require a login

Installing aqt via package manager

  • Start an administrative terminal
  • Install aqt using one of the two popular packaage managers
    • winget install --id=miurahr.aqtinstall -e
    • choco install aqt

Installing aqt via python/pip

Using aqt

  • Open a terminal with administrative rights, and run
aqt install-qt --outputdir "C:\Qt" windows desktop 6.7.0 win64_msvc2019_64 -m qtwebengine qtimageformats qtpositioning qtserialport qtwebchannel qtwebsockets

Qt - Manual installation

  • Install Qt 6.7.0 (Installer) and select these components:
    • MSVC 2019 64-bit
    • Additional Libraries:
      • Qt WebEngine (display nexus pages)
      • Qt Image Formats (display images in image tab and preview)
      • Qt Positioning (required by QtWebEngine)
      • Qt Serial Port (required by Qt Core)
      • Qt WebChannel (required by QtWebEngine)
      • Qt WebSockets (Nexus api/download)
    • Optional:
      • Qt Source Files
      • Qt Debug Files

Visual Studio

  • Install Visual Studio 2022 (Installer)
    • Desktop development with C++
    • Desktop .NET desktop development (needed by OMOD and FOMOD installers)
    • Individual Components:
      • .Net Framework 4.8 SDK
      • .Net Framework 4.7.2 targeting pack (OMOD targets 4.8 but VS still requires the package for other .Net components)
      • Windows Universal C Runtime
      • C++ ATL for latest v143 build Tools (x86 & x64)
      • C++ /CLI support for v143 build Tools (Latest) (for OMOD and FOMOD installers)
      • Windows 11 SDK (get latest)
      • C++ Build Tools core features
      • Git for Windows (Skip if you have this already installed outside of the VS installer)
      • CMake tools for Windows (Skip if you have this already installed outside of the VS installer)

Setting up MOB

  • Open a shell. If you've installed Git or CMake through the VS installer, they won't be on your PATH, so you must use x64 Native Tools Command Prompt for VS 2022.- Pick a folder to develop MO2 in, for these steps it'll be C:\dev
  • Execute these commands
mkdir C:\dev
cd C:\dev
git clone https://github.com/ModOrganizer2/mob
./bootstrap.ps1
mob -d C:\dev\modorganizer build
  • Once mob is finished, everything will be in C:\dev\modorganizer. Mod Organizer can be run from install\bin\ModOrganizer.exe. The Visual Studio solution for Mod Organizer itself is build\modorganizer_super\modorganizer\vsbuild\organizer.sln.

Prebuilts

Some third-parties are not normally built from source, but this can be changed in the options by setting the various tasks in [prebuilt] to false. If OpenSSL is built from source, perl is required (Strawberry Perl 5.30.2.1 installer).

Changing options

mob has two ways of setting options: from INI files, the MOBINI environment variable, or from the command line.

INI files

mob builds a list of available INI files in order of priority. Higher numbers override lower numbers:

  1. The master INI mob.ini in the directory where mob.exe lives (required).
  2. Any files set in MOBINI (separated by semicolons).
  3. Another mob.ini in the current directory.
  4. Files given with --ini.

Use mob inis to see the list of INI files in order. If --no-default-inis is given, mob will skip 1) and 2). The first INI it finds after that is considered the master.

Command line

Any option can be overridden from the command like with -s task:section/key=value, where task: is optional. Some options have shortcuts, such as --dry for -s global/dry=true and -l5 for -s global:output_log_level=5. See mob options for the list of options.

INI format

Inside the INI file are [sections] and key = value pairs. The [task] section is special because it can be changed for specific tasks instead of globally. Any value under a [task_name:task] section will only apply to a task named task_name. The list of available tasks can be seen with mob list. See Task names.

Options

[global]

Option Type Description
dry bool Whether filesystem operations are simulated. Note that many operations will fail and that the build process will most probably not complete. This is mostly useful to get a dump of the options.
redownload bool For build, re-downloads archives even if they already exist.
reextract bool For build, re-extracts archives even if the target directory already exists, in which case it is deleted first.
reconfigure bool For build, tries to delete just enough so that configure tools (such as cmake) will run from scratch.
rebuild bool For build, tries to delete just enough so that build tools (such as msbuild) will run from scratch.
clean_task bool For build, whether tasks are cleaned.
fetch_task bool For build, whether tasks are fetched (download, git, etc.)
build_task bool For build, whether tasks are built (msbuild, jobm etc.)
output_log_level [0-6] The log level for stdout: 0=silent, 1=errors, 2=warnings, 3=info (default), 4=debug, 5=trace, 6=dump. Note that 6 will dump a lot of stuff, such as debug information from curl during downloads.
file_log_level [0-6] The log level for the log file.
log_file path The path to a log file.
ignore_uncommitted bool When --redownload or --reextract is given, directories controlled by git will be deleted even if they contain uncommitted changes.

[task]

Options for individual tasks. Can be [task_name:task], where task_name is the name of a task (see mob list) , super for all MO tasks or a glob like installer_*.

Option Type Description
enabled bool Whether this task is enabled. Disabled tasks are never built. When specifying task names with mob build task1 task2..., all tasks except those given are turned off.
configuration enum Which configuration to build, should be one of Debug, Release or RelWithDebInfo with RelWithDebInfo being the default.

Common git options

Unless otherwise stated, applies to any task that is a git repo.

Option Type Description
mo_org string The organisation name when pulling from Github. Only applies to ModOrganizer projects, plus NCC and usvfs.
mo_branch string The branch name when pulling from Github. Only applies to ModOrganizer projects, plus NCC and usvfs.
mo_master string The fallback branch name when pulling from Github. Only applies to ModOrganizer projects, plus NCC and usvfs.
This branch is used when mo_branch does not exists. If this value is empty, the fallback mechanism is disabled (default behavior).
no_pull bool If a repo is already cloned, a git pull will be done on it every time mob build is run. Set to false to never pull and build with whatever is in there.
ignore_ts bool Marks all the .ts files in a repo with --assume-unchanged. Note that mob git ignore-ts off can be used to revert it.
git_url_prefix string When cloning a repo, the URL will be $(git_url_prefix)mo_org/repo.git.
git_shallow bool When true, clones with --depth 1 to avoid having to fetch all the history. Defaults to true for third-parties.

Git credentials

These are used to set user.name and user.email. Applies to any task that is a git repo.

Option Type Description
git_username string Username
git_email string Email

Origin and upstream remotes

When git clones, it automatically creates a remote named origin for the URL that was cloned. When set_origin_remote is true, this will:

  1. Rename origin to upstream, and
  2. Create a new origin with the given parameters.
Option Type Description
set_origin_remote bool Enables the feature
remote_org string Organisation on Github for the new remote. The URL will be [email protected]:org/git_file, where git_file is the repo.git file for the current task.
remote_key string A PuTTY key, saved in remote.origin.puttykeyfile. Optional.
remote_no_push_upstream bool Sets the push URL for upstream to nopushurl to avoid accidental pushes.
remote_push_default_origin bool Sets origin as the default push remote.

For example, this will create an origin remote for all ModOrganizer2 projects and mark all .ts files as --assume-unchanged.

[super:task]
ignore_ts                  = true
git_username               = isanae
git_email                  = [email protected]
set_origin_remote          = true
remote_org                 = isanae
remote_key                 = private.ppk
remote_no_push_upstream    = true
remote_push_default_origin = true

[tools]

The various tools in this section are used verbatim when creating processes and so will be looked in the PATH environment variable. vcvars is best left empty, it will be found using the vswhere.exe that's bundled as a third-party.

[prebuilt]

Some tasks can use prebuilt binaries instead of building from source.

[versions]

The versions for all the tasks.

[paths]

The only path that's required is prefix, which is where mob will put everything. Within this directory will be build/, downloads/ and install/. Everything else is derived from it.

If mob is unable to find the Qt installation directory, it can be specified in qt_install. This directory should contain bin/, include/, etc. It's typically something like C:\Qt\6.5.1\msvc2019_64\. The other path qt_bin will be derived from it, it's just $qt_install/bin/.

Command line

Do mob --help for global options and the list of available commands. Do mob <command> --help for more help about a command.

To use global options with command options, ensure command options are together, with no global options in the middle.

Global options

Option Description
--ini Adds an INI file, see INI files.
--dry Simulates filesystem operations. Note that many operations will fail and that the build process will stop with errors. This is mostly useful to get a dump of the options.
-log-level The log level for stdout: 0=silent, 1=errors, 2=warnings, 3=info (default), 4=debug, 5=trace, 6=dump. Note that 6 will dump a lot of stuff, such as debug information from curl during downloads.
--destination The build directory where mob will put everything.
--set Sets an option: -s task:section/key=value.
--no-default-inis Does not auto detect INI files, only uses --ini.

build

Builds tasks. The order in which tasks have to be built is handled by mob, but dependencies will not be built automatically when specifying tasks manually. That is, mob build will build python before pyqt, but mob build pyqt will not build python. Many tasks will be able to run in parallel, but not all, either because they hog the CPU (such as usvfs) or because they have dependencies that have to be built first.

If any task fails to build, all the active tasks are aborted as quickly as possible.

Task names

Each task has a name, some have more. MO tasks for example have a full name that corresponds to their git repo (such as modorganizer-game_features) and a shorter name (such as game_features). Both can be used interchangeably. The task name can also be super, which refers to all repos hosted on the Mod Organizer Github account, minus libbsarch, usvfs and NexusClientCli. Globs can be used, like installer_*. See mob list for a list of all available tasks.

Options

Option Description
--redownload Re-downloads files. If a download file is found in prefix/downloads, it is never re-downloaded. This will delete the file and download it again.
--reextract Deletes the source directory for a task and re-extracts archives. If the directory is controlled by git, deletes it and clones again. If git finds modifications in the directory, the operation is aborted (see --ignore-uncommitted-changes.
--reconfigure Reconfigures the task by running cmake, configure scripts, etc. Some tasks might have to delete the whole source directory.
--rebuild Cleans and rebuilds projects. Some tasks might have to delete the whole source directory
--new Implies all the four flags above.
--clean-task,
--no-clean-task
Sets whether tasks are cleaned. With --no-clean-task, the flags above are ignored.
--fetch-task,
--no-fetch-task
Sets whether tasks are fetched. With --no-fetch-task, nothing is downloaded, extracted, cloned or pulled.
--build-task,
--no-build-task
Sets whether tasks are built. With --no-build-task, nothing is ever built or installed.
--pull,
--no-pull
For repos that are controlled by git, whether to pull repos that are already cloned. With --no-pull, once a repo is cloned, it is never updated automatically.
--revert-ts,
--no-revert-ts
Most projects will generate .ts files for translations. These files are typically not committed to Github and so will often conflict when trying to pull. With --revert-ts, any .ts file is reverted before pulling.
--ignore-uncommitted-changes With --reextract, ignores repos that have uncommitted changes and deletes the directory without confirmation.
--keep-msbuild mob starts a lot of msbuild.exe processes, some of which hold locks on the build directory. Because that's pretty darn annoying, mob will kill all msbuild.exe processes when it finished, unless this flag is given.
<task>... List of tasks to run, see Task names.

list

Lists all the available task names. If a task has multiple names, they are all shown, separated by a comma.

Options

Option Description
--all Shows a task tree to see which are built in parallel.
<task>... This is the same list of tasks that can be given in the build command. With --all, this will only show the tasks that would be built.

options

Lists all the options after parsing the INIs and the command line.

release

Creates a release in prefix/releases. Only supports devbuilds for now. A release is made out of three archives:

  • Binaries from prefix/install/bin;
  • PDBs from prefix/install/pdb;
  • Sources from various directories in prefix/build.

The archive filename is Mod.Organizer-version-suffix-what.7z, where:

  • version is taken from ModOrganizer.exe, version.rc or from --version;
  • suffix is the optional --suffix argument;
  • what is either nothing, src or pdbs.

Options

Option Description
--bin,
--no-bin
Whether the binary archive is created [default: yes]
--pdbs,
--no-pdbs
Whether the PDBs archive is created [default: yes]
--src,
--no-src
Whether the source archive is created [default: yes]
--version-from-exe Retrieves version information from ModOrganizer.exe [default]
--version-from-rc Retrieves version information from modorganizer/src/version.rc
--rc <PATH> Overrides the path to version.rc
--version <VERSION> Overrides the version string, ignores --version-from-exe and --version-from-rc
--output-dir <PATH> Sets the output directory to use instead of prefix/releases
--suffix <SUFFIX> Optional suffix to add to the archive filenames
--force mob will refuse to create a source archive over 20MB because it would probably be incorrect. This ignores the file size warnings and creates the archive regardless of its size.

git

Various commands to manage the git repos. Includes usvfs, NexusClientCli and all the projects under modorganizer_super.

set-remotes

Does the same thing as the when set_origin_remotes is set in the INI: renames origin to upstream and adds a new origin with the options below. See Origin and upstream remotes.

Option Description
--username <USERNAME> Git username
--email <EMAIL> Git email
--key <PATH> Path to a putty key
--no-push Disables pushing to upstream by changing the push url to nopushurl to avoid accidental pushes
--push-origin Sets the new origin remote as the default push target
<path> Only use this repo instead of going through all of them

add-remote

Simply adds a new remote with the given parameters to all the git repos.

Option Description
-name <NAME> Name of new remote
--username <USERNAME> Git username
--key <PATH> Path to a putty key
--push-origin Sets this new remote as the default push target
<path> Only use this repo instead of going through all of them

cmake

Runs cmake in a directory, as if mob had done it as part of the build process for a modorganizer project. The cmake invocation will contain all variables required for cmake_common to work.

By default, this runs:

cmake
  -G "Visual Studio version year"
  -A x64
  -DCMAKE_BUILD_TYPE=Release
  -DCMAKE_INSTALL_MESSAGE=NEVER
  <all defines>
  --log-level=ERROR
  --no-warn-unused-cli
  ..

Options

Option Description
--generator <GEN> Sets the -G option
--cmd Sets the last bit of the command, defaults to ..
--x86, --x64 Whether to use the 32-bit or 64-bit vcvars. If --generator is not given, also sets -A.
--install-prefix <PATH> Passes -DCMAKE_INSTALL_PREFIX=<path> to cmake

inis

Shows a list of the all the INIs that would be loaded, in order of priority. See INI files.

mob's People

Contributors

al12rs avatar anyoldname3 avatar dakraid avatar erri120 avatar holt59 avatar isanae avatar lostdragonist avatar mikael-capelle avatar qudix avatar ryan-rsm-mckenzie avatar silarn avatar twinki14 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

mob's Issues

Warn if tools are x86

Using "Developer Command Prompt for VS 2019" sets the paths for x86. Detect it and warn.

Generic branch and commit hashes for git projects

Some tasks support branch names, other commits. Have a generic way of specifying either for all tasks that use git. Right now, googletest on master is failing and it'd be real nice to have a commit hash for it.

Unhandled exception in mob::for_each_ts()

Not handling non existing prefix with ignore_ts=true.

.\mob --dry -d C:\MO2-dev\build --ini c:\dev\mob.ini build modorganizer
0.15     [modorganizer]                        running task
0.15     [modorganizer]                        fetching


mob has crashed
*****************************

unhandled exception: recursive_directory_iterator::recursive_directory_iterator: The system cannot find the path specified.: "C:\MO2-dev\build\build\modorganizer_super\modorganizer"

00007FF64699DEC7 C:\dev\projects\mob\src\utility.cpp:47 private: void __cdecl mob::process::read_pipes(bool) __ptr64
00007FF6469A6ABB C:\dev\projects\mob\src\utility.cpp:120 mob::terminate_handler
00007FF646C4895F minkernel\crts\ucrt\src\appcrt\misc\terminate.cpp:49 terminate
00007FF646BDC528 D:\agent\_work\5\s\src\vctools\crt\vcruntime\src\eh\frame.cpp:770 FindHandler<__FrameHandler4>
00007FF646BDDF13 D:\agent\_work\5\s\src\vctools\crt\vcruntime\src\eh\frame.cpp:350 __InternalCxxFrameHandler<__FrameHandler4>
00007FF646BD5C6B D:\agent\_work\5\s\src\vctools\crt\vcruntime\src\eh\risctrnsctrl.cpp:288 __CxxFrameHandler4
00007FFA8E4A11CF __chkstk
00007FFA8E46A209 RtlRaiseException
00007FFA8E469FC3 RtlRaiseException
00007FFA8B79A799 RaiseException
00007FF646BD3DF0 D:\agent\_work\5\s\src\vctools\crt\vcruntime\src\eh\throw.cpp:75 _CxxThrowException
00007FF64686CFD9 C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.28826\include\filesystem:1812 std::filesystem::_Throw_fs_error
00007FF646971A73 C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.28826\include\filesystem:2835 std::filesystem::recursive_directory_iterator::recursive_directory_iterator
00007FF646A2A58C C:\dev\projects\mob\src\tools\git.cpp:344 mob::for_each_ts<`mob::git::do_ignore_ts'::`2'::<lambda_1> >
00007FF646A3119F C:\dev\projects\mob\src\tools\git.cpp:374 mob::git::do_ignore_ts
00007FF646A30F79 C:\dev\projects\mob\src\tools\git.cpp:286 mob::git::do_clone
00007FF646A31102 C:\dev\projects\mob\src\tools\git.cpp:246 mob::git::do_clone_or_pull
00007FF646A3156B C:\dev\projects\mob\src\tools\git.cpp:199 mob::git::do_run
00007FF646A3FF66 C:\dev\projects\mob\src\tools\tools.cpp:46 mob::tool::run
00007FF646A0BF5E C:\dev\projects\mob\src\tasks\task.cpp:592 mob::task::run_tool_impl
00007FF6469B2DFE C:\dev\projects\mob\src\tasks\task.h:134 mob::task::run_tool<mob::git &>
00007FF6469CA845 C:\dev\projects\mob\src\tasks\modorganizer.cpp:90 `mob::modorganizer::do_fetch'::`2'::<lambda_2>::operator()
00007FF6469C9033 C:\dev\projects\mob\src\utility.h:177 mob::instrumentable<7>::instrument<1,`mob::modorganizer::do_fetch'::`2'::<lambda_2> >
00007FF6469CBF9E C:\dev\projects\mob\src\tasks\modorganizer.cpp:95 mob::modorganizer::do_fetch
00007FF646A00FE5 C:\dev\projects\mob\src\tasks\task.cpp:497 ``mob::task::fetch'::`2'::<lambda_1>::operator()'::`2'::<lambda_1>::operator()
00007FF6469FA7D2 C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.28826\include\type_traits:1597 std::invoke<``mob::task::fetch'::`2'::<lambda_1>::operator()'::`2'::<lambda_1> &>
00007FF6469F5162 C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.28826\include\type_traits:1641 std::_Invoker_ret<void,1>::_Call<``mob::task::fetch'::`2'::<lambda_1>::operator()'::`2'::<lambda_1> &>
00007FF646A03BF9 C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.28826\include\functional:907 std::_Func_impl_no_alloc<``mob::task::fetch'::`2'::<lambda_1>::operator()'::`2'::<lambda_1>,void>::_Do_call
00007FF646840FBC C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.28826\include\functional:955 std::_Func_class<void>::operator()
00007FF646A0C30D C:\dev\projects\mob\src\tasks\task.cpp:380 mob::task::threaded_run
00007FF646A01688 C:\dev\projects\mob\src\tasks\task.cpp:511 `mob::task::fetch'::`2'::<lambda_1>::operator()
00007FF646A00C6A C:\dev\projects\mob\src\utility.h:63 `mob::start_thread<`mob::task::fetch'::`2'::<lambda_1> >'::`2'::<lambda_1>::operator()
00007FF6469FA952 C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.28826\include\type_traits:1597 std::invoke<`mob::start_thread<`mob::task::fetch'::`2'::<lambda_1> >'::`2'::<lambda_1> >
00007FF6469F73DC C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.28826\include\thread:44 std::thread::_Invoke<std::tuple<`mob::start_thread<`mob::task::fetch'::`2'::<lambda_1> >'::`2'::<lambda_1> >,0>
00007FF646C48A4C minkernel\crts\ucrt\src\appcrt\startup\thread.cpp:97 thread_start<unsigned int (__cdecl*)(void *),1>
00007FFA8DCC7BD4 BaseThreadInitThunk
00007FFA8E46CE51 RtlUserThreadStart

Sort task names

When task names are given to build, sort them in the same order as in the main list.

Fallback org and branch

Add or change options to allow for multiple org/branch pairs to try when checking out projects.

Make `super` an alias

super is currently a special case in mob, it should be possible to make it an alias instead.

Split logs

Add an option to split the logs into one file per task.

Optional submodules

Add an option to avoid adding submodules for MO repos, would make things slightly faster.

Checkout for PRs

Add something like build --pr repo/123:

  1. Find the remote branch for the PR from the github API;
  2. Attempt to checkout this org and branch for all MO projects;
  3. Fall back on main org/branch if it's not found (see #13);

Allow not creating the "super" git repository

The "super" git repository is kind of huge with all the submodules, and is not updated (as far as I can tell) when doing a simple mob build super so when using git-enhanced command line such as posh-git, doing anything in modorganizer_super is very slow since the command line as to be updated each time.

Feature: Add an option (maybe under super task) to not create the "main" repository.

On a side note, the following repository are not added as submodules currently, this might be a bug?

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        fnistool/
        form43_checker/
        installer/
        preview_dds/
        tool_configurator/

Weird font(?) change when building `gtest`

When mob "build and install" gtest, I often (always?) get a weird font change (or something similar) in the console:

image

It always happens on the gtest task.


Reference font just to confirm:

image

Delete all bypass files

Add an option to delete all bypass files for a task. Search for bypass_file, it's in third parties like pyqt and python.

Add filters for msbuild compiler errors, redirect to stderr

When building fails because of compiler errors, msbuild will output a failure message to stderr, but the actual compiler error is in stdout, which is considered trace level. Add a filter for msbuild stdout that redirects error message (: error C\d+ or something) to stderr.

Allow single process builds

Add an option to disable all the multiprocess options given to various tools (there's a bunch). Appveyor in particular seems to get really starved.

Add tasks from the ini

Add modorganizer tasks from the ini, run them at the end of the build. The main problem is that tasks are currently added way before the ini is loaded.

Auto-detect prefix in parent directories

When running mob without a -d, mob looks for a .ini in the current folder to check if it has a paths/prefix entry, and use it.

It would be nice if mob could look up the parent folders as well, so that one could typically do mob cmake ./vsbuild within one of the MO2 projects.

Curl sometimes hangs

I've seen mob hang inside curl several times, not doing anything. No clue why.

Stop using global clean flags from tools

Right now, tools like git will delete stuff themselves when flags like --redownload are passed. It was initially convenient because a lot of tasks use git, but I don't like it. Make each task responsible for deleting their own stuff.

Allow SSH Git URLs

As the title says ;)

I tried to do it by adding a use_ssh option, and it works for cloning (or the initial pull, don't really know how you do it).

Then I noticed it did not work for remote_XXX, so I modified the git code to handle remote_url instead of org/name and then I noticed that git_command heavily rely on this so I gave up since that would break a lots of things.

Add --reconfigure

Separate --rebuild into a new --reconfigure options, which reruns cmake, openssl configure, etc.

Add parsing errors on the command line

This works:

.\mob -d C:\MO2-dev\build build --ini ..\another.ini

but this doesn't:

.\mob -d C:\MO2-dev\build build --ini ..\another.ini modorganizer

because once modorganizer is added, --ini becomes part of the build command instead of the global options. clipp doesn't seem to have anything good for reporting errors (this is actually parsed fine, but modorganizer is considered "blocked", whatever that means).

Figure out better error reporting instead of just dumping a useless usage.

Can't build mob with VS2022 (v17.2.4)

Fails with the following error on a clean checkout of the QT6 branch

D:\dev\mob>bootstrap.bat
D:\dev\mob\src\utility\algo.h(148,63): error C2672: 'std::declval': no matching overloaded function found [D:\dev\mob\v
s\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(148,46): error C2974: 'std::declval': invalid template argument for '_Ty', type expected
[D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(149,7): error C2976: 'std::vector': too few template arguments [D:\dev\mob\vs\mob.vcxproj
]
D:\dev\mob\src\utility\algo.h(147): error C2641: cannot deduce template arguments for 'std::vector' [D:\dev\mob\vs\mob.
vcxproj]
D:\dev\mob\src\utility\algo.h(147): error C2783: 'std::vector<_Ty,_Alloc> std::vector(void) noexcept(<expr>)': could no
t deduce template argument for '_Ty' [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(147,1): error C2780: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc>)': expe
cts 1 arguments - 0 provided [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(148,63): error C2672: 'std::declval': no matching overloaded function found [D:\dev\mob\v
s\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(148,46): error C2974: 'std::declval': invalid template argument for '_Ty', type expected
[D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(149,7): error C2976: 'std::vector': too few template arguments [D:\dev\mob\vs\mob.vcxproj
]
D:\dev\mob\src\utility\algo.h(147): error C2641: cannot deduce template arguments for 'std::vector' [D:\dev\mob\vs\mob.
vcxproj]
D:\dev\mob\src\utility\algo.h(147): error C2783: 'std::vector<_Ty,_Alloc> std::vector(void) noexcept(<expr>)': could no
t deduce template argument for '_Ty' [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(147,1): error C2780: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc>)': expe
cts 1 arguments - 0 provided [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(197,23): error C2641: cannot deduce template arguments for 'std::vector' [D:\dev\mob\vs\mob
.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2780: 'std::vector<conditional_t<std::_Is_from_primary<std::iterator_traits
<remove_cv<remove_reference<_Ty>::type>::type>>,std::indirectly_readable_traits<remove_cv<remove_reference<_Ty>::type>:
:type>,std::iterator_traits<remove_cv<remove_reference<_Ty>::type>::type>>::value_type,_Alloc> std::vector(_Iter,_Iter,
_Alloc)': expects 3 arguments - 1 provided [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2780: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc> &&,const
 _Identity<_Alloc>::type &) noexcept(<expr>)': expects 2 arguments - 1 provided [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2784: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc> &&) noex
cept': could not deduce template argument for 'std::vector<_Ty,_Alloc> &&' from 'std::vector' [D:\dev\mob\vs\mob.vcxpro
j]
D:\dev\mob\src\core\env.cpp(198,53): error C2784: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc> &&) noex
cept': could not deduce template argument for 'std::vector<_Ty,_Alloc> &&' from 'std::vector' [D:\dev\mob\vs\mob.vcxpro
j]
D:\dev\mob\src\core\env.cpp(198,53): error C2780: 'std::vector<_Ty,_Alloc> std::vector(const std::vector<_Ty,_Alloc> &,
const _Identity<_Alloc>::type &)': expects 2 arguments - 1 provided [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2784: 'std::vector<_Ty,_Alloc> std::vector(const std::vector<_Ty,_Alloc> &)
': could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'std::vector' [D:\dev\mob\vs\mob.vcxpr
oj]
D:\dev\mob\src\core\env.cpp(198,53): error C2784: 'std::vector<_Ty,_Alloc> std::vector(const std::vector<_Ty,_Alloc> &)
': could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'std::vector' [D:\dev\mob\vs\mob.vcxpr
oj]
D:\dev\mob\src\core\env.cpp(198,53): error C2784: 'std::vector<_Ty,_Alloc> std::vector(std::initializer_list<_Elem>,con
st _Alloc &)': could not deduce template argument for 'std::initializer_list<_Elem>' from 'std::vector' [D:\dev\mob\vs\
mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2784: 'std::vector<_Ty,_Alloc> std::vector(std::initializer_list<_Elem>,con
st _Alloc &)': could not deduce template argument for 'std::initializer_list<_Elem>' from 'std::vector' [D:\dev\mob\vs\
mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2780: 'std::vector<_Ty,_Alloc> std::vector(_Iter,_Iter,const _Alloc &)': ex
pects 3 arguments - 1 provided [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2780: 'std::vector<_Ty,_Alloc> std::vector(const allocator_traits<allocator
_traits<_Alloc>::rebind_alloc<_Ty>>::size_type,const _Ty &,const _Alloc &)': expects 3 arguments - 1 provided [D:\dev\m
ob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2780: 'std::vector<_Ty,_Alloc> std::vector(void) noexcept(<expr>)': expects
 0 arguments - 1 provided [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2784: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc>)': could
 not deduce template argument for 'std::vector<_Ty,_Alloc>' from 'std::vector' [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(198,53): error C2784: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc>)': could
 not deduce template argument for 'std::vector<_Ty,_Alloc>' from 'std::vector' [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\core\env.cpp(200,11): error C2672: 'join': no matching overloaded function found [D:\dev\mob\vs\mob.vcxp
roj]
D:\dev\mob\src\core\env.cpp(200,29): error C2784: 'auto mob::join(const std::vector<_Ty,std::allocator<_Ty>> &,const Se
p &,To)': could not deduce template argument for 'const std::vector<_Ty,std::allocator<_Ty>> &' from 'const std::vector
' [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(148,63): error C2672: 'std::declval': no matching overloaded function found [D:\dev\mob\v
s\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(148,46): error C2974: 'std::declval': invalid template argument for '_Ty', type expected
[D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(149,7): error C2976: 'std::vector': too few template arguments [D:\dev\mob\vs\mob.vcxproj
]
D:\dev\mob\src\utility\algo.h(147): error C2641: cannot deduce template arguments for 'std::vector' [D:\dev\mob\vs\mob.
vcxproj]
D:\dev\mob\src\utility\algo.h(147): error C2783: 'std::vector<_Ty,_Alloc> std::vector(void) noexcept(<expr>)': could no
t deduce template argument for '_Ty' [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(147,1): error C2780: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc>)': expe
cts 1 arguments - 0 provided [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(147): error C2783: 'std::vector<_Ty,_Alloc> std::vector(void) noexcept(<expr>)': could no
t deduce template argument for '_Ty' [D:\dev\mob\vs\mob.vcxproj]
D:\dev\mob\src\utility\algo.h(147,1): error C2780: 'std::vector<_Ty,_Alloc> std::vector(std::vector<_Ty,_Alloc>)': expe
cts 1 arguments - 0 provided [D:\dev\mob\vs\mob.vcxproj]
if (! $?) {
    Write-Error "Build failed"
    exit $LastExitCode
} : Build failed
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
    ```

Removing readonly flag can't be interrupted

When mob tries to delete a directory but gets an access denied error, it assumes files in the directory are read-only. The 7z archive in particular has all files marked as read-only. So op::remove_readonly() will go through all directory recursively and try to chmod every single file. With log level 5 (the default for the log file), this logs a line per file (maybe change the level to dump for this line?)

Since it's in a tight loop in op, it can't be interrupted because the flag actually lives in task. Find a way to propagate this flag to op functions in general. Maybe also set it somewhere in context?

Implement full release

The release command only supports devbuilds for now, add an option for a full release, including translations, installer, etc.

Refuse to have a prefix inside mob

This can cause issues, especially since there's already a build folder in mob. Maybe allow in a subfolder, but definitely not in the root.

Refactor build loops

A couple of tasks are repeating operations in a loop because they might fail, mostly because of multiprocess builds with jom (nmm, openssl, etc.) Refactor this into something more general.

Nexus Info tab problem

Sorry for my English. When I click on the Nexus Info tab (in mod information) my computer freezes, the screen starts to turn off and on. The task manager cannot be called. I have to reload via reset. The same thing happens when I press the button to sort plugins using LOOT (above the list of mods). If I run LOOT without MO there is no problem. There was nothing like this with other programs / games. I use MO for Skyrim LE, Fallout3 and NV.
Windows 7 SP1 64bit system. Videocard Asus HD7750.

Allow batch mod install

At present MO2 only allows for a single mod to be installed at a time; this is fine if you are building your list 1 by 1 or over time, but if you have a copy of all your favorite mods downloaded and stored somewhere as their original archive files and there are say, 100+ of them, then doing this by hand 1 at a time manually is honestly a form of torture.

MO2 could really do with an option to either select multiple in the open file dialog, or a supplementary install multiple option in the file menu so that one can batch install a large collection of mods in one go.

I know it's possible to place the archives in the downloads folder, but again the downloads section on the right does not allow the selection of multiple items, so this does not really negate the aforementioned torture, it only swaps the open dialog step with a scroll and select step.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.