Compilation issues on Linux/CMake with Musescore 2.1 zip archive
I encountered several compilation issues for Musescore 2.1 zip archive on Linux Fedore 25 using cmake.
I am trying to make a more recent RPM package on Fedora copr.
I tested my build and it looks ok.
Setup:
- compilation was performed in a build directory
- LAM was disabled (as in Fedora spec)
- prefix is /usr/local
- other options as default
Comments
0) make or cmake ???
Manual don't mention cmake but make. Why ???
1) Issue when lame is off in ccmake: we have to clear LAME_XXX variables else it complains these variables are unset.
2) all.h
Scanning dependencies of target manpages
[ 0%] Generating mscore.1.gz
Man pages have been compressed ready for installation.
Creating symlink alias for man pages.
Symlink alias: musescore.1.gz -> mscore.1.gz
[ 0%] Built target manpages
Scanning dependencies of target qtsingleapp_autogen
make[2]: *** No rule to make target 'all.h', needed by 'thirdparty/singleapp/src/CMakeFiles/qtsingleapp_autogen'. Stop.
CMakeFiles/Makefile2:8789: recipe for target 'thirdparty/singleapp/src/CMakeFiles/qtsingleapp_autogen.dir/all' failed
make[1]: *** [thirdparty/singleapp/src/CMakeFiles/qtsingleapp_autogen.dir/all] Error 2
Makefile:151: recipe for target 'all' failed
make: *** [all] Error 2
I copied manually all.h from source to continue
3) Then g++ complains about -fPIC due to Qt setup
(unfortunately I lost the error message)
I added it to compile all.h
/usr/lib64/ccache/c++ -fPIC -x c++-header -g -I/usr/include/qt5/ ... -o all.h.gch all.h
4) MP3 code issue (LAM is disabled)
cc1plus: warning: /home/scratch/sources/MuseScore-2.1-build/all.h.gch: created and used with differing settings of '-maccumulate-outgoing-args'
[ 83%] Linking CXX executable mscore
^[O3S^[O3SCMakeFiles/mscore.dir/loginmanager.cpp.o: In function
Ms::LoginManager::onGetMediaUrlRequestReady(QByteArray)':
Ms::MuseScore::saveMp3(Ms::Score*, QString const&)'/home/scratch/sources/MuseScore-2.1/mscore/loginmanager.cpp:406: undefined reference to
CMakeFiles/mscore.dir/uploadscoredialog.cpp.o: In function
Ms::UploadScoreDialog::showOrHideUploadAudio()':
Ms::MuseScore::canSaveMp3()'/home/scratch/sources/MuseScore-2.1/mscore/uploadscoredialog.cpp:196: undefined reference to
collect2: error: ld returned 1 exit status
mscore/CMakeFiles/mscore.dir/build.make:5885: recipe for target 'mscore/mscore' failed
make[2]: *** [mscore/mscore] Error 1
CMakeFiles/Makefile2:324: recipe for target 'mscore/CMakeFiles/mscore.dir/all' failed
make[1]: *** [mscore/CMakeFiles/mscore.dir/all] Error 2
Makefile:151: recipe for target 'all' failed
make: *** [all] Error 2
I fixed theses 2 methods
- void UploadScoreDialog::showOrHideUploadAudio()
- void LoginManager::onGetMediaUrlRequestReady(QByteArray ba)
5) At install
-- Up-to-date: /usr/local/stow/MuseScore-2.1/share/mscore-2.1/wallpaper/paper5.png
CMake Error at share/locale/cmake_install.cmake:36 (file):
file INSTALL cannot find
"/home/scratch/sources/MuseScore-2.1/share/locale/mscore_af.qm".
Call Stack (most recent call first):
share/cmake_install.cmake:43 (include)
cmake_install.cmake:57 (include)
Makefile:73: recipe for target 'install' failed
make: *** [install] Error 1
These files are not generated ???
In reply to 0) make or cmake ???… by fabricesalvaire
The qm files are generated on
make lrelease
.Also don't forget the
make revision
Why not taking the sources from github?
Also check the developers' handbook.
MuseScore 2.1 needs Qt 5.4
In reply to the qm files are generated… by Jojo-Schmitz
> the qm files are generated on 'make lrelease'
Ok it fixes the installation, I missed it
> Why not taking the sources from github?
I got stable source from https://musescore.org/fr/download/musescore.tar.bz2
Same content that on github
It don't make sense for packaging to git clone
> Also check the developers' handbook.
https://musescore.org/en/developers-handbook/compilation/compile-instru…
make script is doing roughly the same things that what I did
It is broken if we disable LAM
> MuseScore 2.1 needs Qt 5.4
Fedora 25 is shipped with Qt 5.7, I don't believe it is an issue.
Anyway other issues are probably due to issues in CMakelist or code.
Version 2.0 compiled fine.
I can't provide a RPM package until Muscore compile without hacks.
In reply to > the qm files are generated… by fabricesalvaire
Qt 5.7 is a issue. master needs 5.8 or later, 2.x needs 5.4, the last version to supply Web Engine (or some such), needed for the online center. This is documented in several places, at least for Mac and Windows.
The LAME issue got fixed later, in 2.2, check #201146: MuseScore 2.1 fails to build with BUILD_LAME=FALSE,
git cherry-pick 0b82c14e8c
Reg.
make lrelease
see also https://musescore.org/en/developers-handbook/compilation/compile-instru…In reply to Qt 5.7 is a issue. master… by Jojo-Schmitz
It is Qt5WebKit which was removed in Qt 5.6 core, but it is shipped as a third party in Fedora. So it is not a problem.
I believe there is still an issue for LAME in main CMakelists.txt, a fix is:
Remaining problem is all.h, I tried several time using make release, it fails for some reasons. I could not figure out what is wrong in CMakelist. I have to run make release twice. (I am using CMake 3.9.1) It seems
ADD_CUSTOM_TARGET(mops1 DEPENDS ${PROJECT_BINARY_DIR}/all.h)
doesn't work as expected.In reply to It is Qt5WebKit which was… by fabricesalvaire
Yes, QtWebKit is what I meant. Still Qt-5.7 may have other issues, still the recommendation would be to use Qt 5.4, like for the other platforms, Windows and Mac.
That CMakefile.txt change looks reasonable but might not be needed, if LAME_INCLUDE_DIR were not set at all, and it shouldn't be if nither the include dir nor the library is found on your system (by build/FindLame.cmake)
I've upgraded from CMake 3.8 to 4.9.3 on Windows and it still works, but with a new warning:
CMake Deprecation Warning at CMakeLists.txt:42 (cmake_policy):
The OLD behavior for policy CMP0020 will be removed from a future version
of CMake.
The cmake-policies(7) manual explains that the OLD behaviors of all
policies are deprecated and that a policy should be set to OLD only under
specific short-term circumstances. Projects should be ported to the NEW
behavior and not rely on setting a policy to OLD.
In reply to That CMakefile.txt change… by Jojo-Schmitz
I finally succeeded to build an updated RPM package with minor changes and a hack for all.h
see
https://copr.fedorainfracloud.org/coprs/fabricesalvaire/mao
https://github.com/FabriceSalvaire/copr-mao/tree/master/musescore
In reply to 0) make or cmake ???… by fabricesalvaire
After a year and some versions, while building MS from scratch (new machine, new OS version, ...), I find that point 4) above (or a variant of it) is still pending in file
mscore/network/loginmanager.cpp
:[ 40%] Linking CXX executable mscore
CMakeFiles/mscore.dir/network/loginmanager.cpp.o: In function Ms::ApiRequestBuilder::build() const:
[project_source_dir]/mscore/network/loginmanager.cpp:863: undefined reference to Ms::ApiInfo::clientIdHeader
[project_source_dir]/mscore/network/loginmanager.cpp:864: undefined reference to Ms::ApiInfo::apiKeyHeader
CMakeFiles/mscore.dir/network/loginmanager.cpp.o: In function Ms::ApiWebEngineRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo&):
[project_source_dir]/mscore/network/loginmanager.cpp:881: undefined reference to Ms::ApiInfo::clientIdHeader
[project_source_dir]/mscore/network/loginmanager.cpp:882: undefined reference to Ms::ApiInfo::apiKeyHeader
clang: error: linker command failed with exit code 1 (use -v to see invocation)
System: Linux Mint 18.3, Qt 9.0, sources git-cloned this morning.
Notes (if they are relevant):
1 - in order to avoid missing header errors, I had to turn off BUILD_PULSEAUDIO and BUILD_PORTMIDI.
2 - There are 140,000 (yes 140,000, it is not a type) warnings, mostly about overriding virtual functions: something need tweaking?
In reply to After a year and some… by Miwarre
I guess you need Qt WebEngine?
Qt 9.0???
Qt 5.9.7 or 5.12.1 are the ones you should be using
In reply to After a year and some… by Miwarre
Yes, "Qt 9.0" was actually Qt 5.9.0, sorry (I tend to consider "5." implied... ;) ).
Thanks for reviewing this issue and for your suggestion. I have to say that I did not understand what the Qt version (or the presence of Qt WebEngine) may have to do with locating a
Ms::
ownMs::ApiInfo
static member variable but, as I have lost the "feeling" for MS source code long ago, I tried your suggestion, using Qt 5.12.1 (different build directory, so there was no left-over from the previous attempt with Qt 5.9.0).But, in fact, using Qt 5.12.1 makes no difference at all and the same errors quoted above remain.
Any other idea?
In reply to Yes, "Qt 9.0" was actually… by Miwarre
You have installed the WebEngine component of Qt too?
In reply to Yes, "Qt 9.0" was actually… by Miwarre
Maybe you want to join the developers' chat on telegram, might be easier to get you and your dev-env back into business that way?
In reply to Yes, "Qt 9.0" was actually… by Miwarre
Yes, I installed Qt WebEngine of Qt 5.12.1. In fact, I installed everything of Qt 5.1.2.1, except: Android ARM (64 and V7), sources, Qt Script and Qt Debug Info Files.
However, I still fail to understand why this could be relevant. The errors refer to 2 (static) member variables of the MuseScore own
Ms::ApiInfo
class which the linker is unable to locate.Note that the
mscore/network/loginmanager.cpp
source file is compiled into the relevant/[build_dir]/mscore/CMakeFiles/mscore.dir/network/loginmanager.cpp.o
object module, so all resolutions required at compile time are working; the problem is with the linker and with theMs::ApiInfo
class.Then, of course, I may miss somethig obvious...
In reply to Yes, I installed Qt… by Miwarre
May not be related to WebEngine, but that stuff does get used very nearby.
In reply to After a year and some… by Miwarre
This is related to my latest PR on login mechanism updating, and the code seems to be a bit incorrect here. The missing variables are constexpr static members of
ApiInfo
class (see the code), and compliers seem to inline them usually which avoids linkage errors. However before C++17 the standard doesn't require this to work so, and requires a definition of such variables be present at namespace scope.So in order to resolve this try to put definitions of these variables in loginmanager.cpp, something like
If it works, it would probably be good to put these changes into mainline MuseScore code.
In reply to After a year and some… by Miwarre
Eventually the solution was replacing
clang
as a C++ compiler withg++
.As this is a (relatively) recently configured machine I mostly used for other purposes with a recently installed OS and Qt, I didn't notice (well, I did notice, but I didn't care) it defaulted to using
clang
; after switching tog++
and rebuilding MuseScore from scratch, the source compiled correctly; in addition the 90,000+ warning messages are now reduced to 8, which is reasonable.Perhaps, it might be useful to someone else too...
In reply to Eventually the solution was… by Miwarre
And these warnings might be taken care of in https://github.com/musescore/MuseScore/pull/4398