Search code examples
qtjenkinscontinuous-integrationbuild-process

Configuring Qt builds with Jenkins


I have several Qt projects that are dependent upon a Qt library that I've developed. The project files (.pro) for projects which use the library define the LIBS and PRE_TARGETDEPS paths. For example: -

PRE_TARGETDEPS += ../ProjectLibrary_Qt_5_2_1_clang_64bit-Debug/projectlibrary.dylib

LIBS += -L../ProjectLibrary_Qt_5_2_1_clang_64bit-Debug -lProjectLibrary

As you can see, there is a defined path to the linked library and they have been building with Shadow Builds, via Qt Creator. The file hierarchy is like this: -

  • Projects
    • ProjectLibrary_Qt_5_2_1_clang_64bit-Debug
      • ProjectLib.dylib (the built library)
    • DependentProject
      • DependentProject.pro

(dylib is an OSX extension, but it could equally be .lib for Windows, or .so for linux)

However, Jenkins creates a different folder structure:-

  • jobs
    • ProjectLib
      • workspace
        • Project.dylib
    • DependentProject
      • workspace
        • DependentProject.pro

Now there is an extra directory (workspace), which would need this reflected in the .pro file and the names of the folders are different.

Obviously, If I just call qmake on the .pro with a Jenkins build, the path to the library is going to be wrong.

So, do I need to create a separate .pro just to be able to reflect the paths when building with Jenkins, or is there another way to handle specifying the location of libraries in the project file, for Jenkins, without having to change the directory structures?


Solution

  • Solution 1) Based on your current build configration

    Modify your .pro file like this :

    isEmpty(PROJECT_PATH) {
        PROJECT_PATH=../ProjectLibrary_Qt_5_2_1_clang_64bit-Debug
    }
    
    LIBS += -L$${PROJECT_PATH} -lProjectLibrary
    

    Then in Jenkins , you should pass PROJECT_PATH={path to your project} to qmake

    Solution 2)

    Using git submodule to fetch ProjectLibrary as a part of your building project. Then you don't need to build the ProjectLibrary by Qt Creator manually.