<!DOCTYPE html><html><head><title></title><style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style></head><body><div><br></div><div><br></div><div>On Mon, Oct 14, 2019, at 9:13 AM, David Aldrich wrote:<br></div><blockquote type="cite" id="qt"><div dir="ltr"><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size">Hi</span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"> </span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size">I am trying to convert a large software project from makefiles
to CMake. The project is organised as a set of shared ‘star’ libraries, linked
to a static ‘kernel’ library. The current directory arrangement is:</span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"> </span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|--stars</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|     |--
star1_lib</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|              |--
source files</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|              |--
makefile</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|     |-- star2_lib</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|              |-- source files</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|              |-- makefile</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|     |-- solibs</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|              |-- Release</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|                     |-- <star>.so files</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|--kernel</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|     |-- source files</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|     |-- makefile</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|     |-- Release</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|              |-- kernel.a</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">|--application</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">      |--
makefile</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">      |--
Release</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">               |--
myapp.exe</span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><span style="font-family:"Courier New"" class="font"><span style="font-size:8pt" class="size">    </span></span></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size">In high-level terms, how could I implement this using CMake,
such that invoking ‘make’ in directory ‘application’ invokes a make of each shared
and static library, and links them to form ‘myapp.exe’?</span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"><a name="_MailAutoSig"> </a></span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size">(I understand the basics of CMake,
the issue here is how to handle the make of source code and libraries spread
across a directory hierarchy).</span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"> </span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size">Best regards</span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size"> </span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><span style="font-family:Calibri, sans-serif" class="font"><span style="font-size:11pt" class="size">David</span></span><br></p><p style="margin: 0cm 0cm 0.0001pt;" class="qt-MsoNormal"><br></p></div><div><br></div></blockquote><div>add_subdirectory() can accept relative paths to outside the "root" source tree.<br></div><div>So the main CMakeLists.txt would be located in ./application.<br></div><div>Then do:<br></div><div> add_subdirectory(../kernel kernel)<br></div><div>add_subdirectory(../stars/stars1_lib stars1_lib)<br></div><div><br></div><div>./kernel/CMakeLists.txt would list it's files, and etcetera.<br></div><div><br></div><div>I've use this method in the past for handling applications that are meant to target Windows, Linux, and embedded systems.<br></div><div>Then by using variables to determine with platform / target ertain kernel and library characteristics are used.<br></div><div>Everything is built in the build directory for that particular platform / target.<br></div><div>This allows for app_target1, app_target2, app_target3, ..., build directories to be totally independent.<br></div><div><br></div><div>--<br></div><div>F<br></div></body></html>