How to hundle gcc link options(like whole-archive, --allow-multiple-definition) in CMake?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

How to hundle gcc link options(like whole-archive, --allow-multiple-definition) in CMake?

Chaos Zhang
Hi, all,

Thanks for taking your time to review my email. I have a demo project and it's structure like as below:

top_dir
    CMakeLists.txt
    sub_dir1
        CMakeLists.txt
    sub_dir2
        CMakeLists.txt

top_dir/sub_dir1/CMakeLists.txt used to build `lib1` by using `add_library(lib1 ...)`,
top_dir/sub_dir2/CMakeLists.txt used to build `exe1` with linking lib1 by `target_link_library(exe1 lib1)`.
And the content of top_dir/CMakeLists.txt is as below:

add_subdirectory(sub_dir2)
add_subdirectory(sub_dir1)

Normally, when build target exe1, cmake will check dependency so `lib1` will be built before building exe1. The problem is I am transfering an existed makefile project into CMake, and there are many gcc link options, like "whole-archive ... no-whole-archive, allow-mutiple-definition", if use like `target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a --no-whole-archive")`(The form like this, and this may not work, it just a e.g.), cmake seem don't built `lib1` any more. Is there any way i can use target_link_library like `target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a")` and cmake link dependency checking still work, or other way i can transfer these gcc link options into cmake?

Thanks a lot,
Chao
Reply | Threaded
Open this post in threaded view
|

Re: How to hundle gcc link options(like whole-archive, --allow-multiple-definition) in CMake?

Chuck Atkins
Hi Chao,

You want to let CMake to as much of the work for you as possible.  You're still trying to explicitly pass the path to the library file to target_link_libraries.  If you look at the line:

target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a --no-whole-archive")

there's no CMake target name so CMake can't know about the dependency.  However, if you use the target name instead:

top_dir/CMakeLists.txt:
cmake_minimum_required(VERSION 3.0)
project(foo)
add_subdirectory(sub_dir2)
add_subdirectory(sub_dir1)

top_dir/sub_dir1/CMakeLists.txt
add_library(L1 1.c)

top_dit/sub_dir2/CMakeLists.txt
add_executable(exe1 main.c)
target_link_libraries(exe1 "-Wl,--whole-archive" L1 "-Wl,--no-whole-archive")


Notice how in the target_link_libraries line for exe1, the link options are separate instead of 1 big string combining them all and the actual CMake target name, L1, is used instead of the output file libL1.a.  You can see the resulting output is what you want:

$ make VERBOSE=1
...
[100%] Linking C executable exe1
...
/usr/bin/cc     CMakeFiles/exe1.dir/main.c.o  -o exe1 -rdynamic -Wl,--whole-archive ../sub_dir1/libL1.a -Wl,--no-whole-archive


Generally speaking, always use target names in a CMakeLists.txt instead of the actual output file.  There are a few situations where you may need the actual file name but they are uncommon and even then you would do it through target properties and generator expressions rather than hard code the library file name.

- Chuck

On Mon, May 30, 2016 at 8:35 AM, Chaos Zhang <[hidden email]> wrote:
Hi, all,

Thanks for taking your time to review my email. I have a demo project and
it's structure like as below:

top_dir
    CMakeLists.txt
    sub_dir1
        CMakeLists.txt
    sub_dir2
        CMakeLists.txt

top_dir/sub_dir1/CMakeLists.txt used to build `lib1` by using
`add_library(lib1 ...)`,
top_dir/sub_dir2/CMakeLists.txt used to build `exe1` with linking lib1 by
`target_link_library(exe1 lib1)`.
And the content of top_dir/CMakeLists.txt is as below:

add_subdirectory(sub_dir2)
add_subdirectory(sub_dir1)

Normally, when build target exe1, cmake will check dependency so `lib1` will
be built before building exe1. The problem is I am transfering an existed
makefile project into CMake, and there are many gcc link options, like
"whole-archive ... no-whole-archive, allow-mutiple-definition", if use like
`target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a
--no-whole-archive")`(The form like this, and this may not work, it just a
e.g.), cmake seem don't built `lib1` any more. Is there any way i can use
target_link_library like `target_link_library(exe1 "-Wl, --whole-archive
../sub_dir1/liblib1.a")` and cmake link dependency checking still work, or
other way i can transfer these gcc link options into cmake?

Thanks a lot,
Chao



--
View this message in context: http://cmake.3232098.n2.nabble.com/How-to-hundle-gcc-link-options-like-whole-archive-allow-multiple-definition-in-CMake-tp7593563.html
Sent from the CMake mailing list archive at Nabble.com.
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake


--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: How to hundle gcc link options(like whole-archive, --allow-multiple-definition) in CMake?

Chaos Zhang
This post was updated on .
Thanks for your generous help, Mr. Atkins, what you answer me worked well and solved my question. I would keep 'always use target names in a CMakeLists.txt instead of the actual output file' in my mind. :-)

Chao
Chuck Atkins wrote
Hi Chao,

You want to let CMake to as much of the work for you as possible.  You're
still trying to explicitly pass the path to the library file to
target_link_libraries.  If you look at the line:

target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a
--no-whole-archive")

there's no CMake target name so CMake can't know about the dependency.
However, if you use the target name instead:

top_dir/CMakeLists.txt:
cmake_minimum_required(VERSION 3.0)
project(foo)
add_subdirectory(sub_dir2)
add_subdirectory(sub_dir1)

top_dir/sub_dir1/CMakeLists.txt
add_library(L1 1.c)

top_dit/sub_dir2/CMakeLists.txt
add_executable(exe1 main.c)
target_link_libraries(exe1 "-Wl,--whole-archive" *L1*
"-Wl,--no-whole-archive")

Notice how in the target_link_libraries line for exe1, the link options are
separate instead of 1 big string combining them all and the actual CMake
target name, L1, is used instead of the output file libL1.a.  You can see
the resulting output is what you want:

$ make VERBOSE=1
...
[100%] Linking C executable exe1
...
/usr/bin/cc     CMakeFiles/exe1.dir/main.c.o  -o exe1 -rdynamic
*-Wl,--whole-archive
../sub_dir1/libL1.a -Wl,--no-whole-archive*

Generally speaking, always use target names in a CMakeLists.txt instead of
the actual output file.  There are a few situations where you may need the
actual file name but they are uncommon and even then you would do it
through target properties and generator expressions rather than hard code
the library file name.

- Chuck

On Mon, May 30, 2016 at 8:35 AM, Chaos Zhang <[hidden email]> wrote:

> Hi, all,
>
> Thanks for taking your time to review my email. I have a demo project and
> it's structure like as below:
>
> top_dir
>     CMakeLists.txt
>     sub_dir1
>         CMakeLists.txt
>     sub_dir2
>         CMakeLists.txt
>
> top_dir/sub_dir1/CMakeLists.txt used to build `lib1` by using
> `add_library(lib1 ...)`,
> top_dir/sub_dir2/CMakeLists.txt used to build `exe1` with linking lib1 by
> `target_link_library(exe1 lib1)`.
> And the content of top_dir/CMakeLists.txt is as below:
>
> add_subdirectory(sub_dir2)
> add_subdirectory(sub_dir1)
>
> Normally, when build target exe1, cmake will check dependency so `lib1`
> will
> be built before building exe1. The problem is I am transfering an existed
> makefile project into CMake, and there are many gcc link options, like
> "whole-archive ... no-whole-archive, allow-mutiple-definition", if use like
> `target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a
> --no-whole-archive")`(The form like this, and this may not work, it just a
> e.g.), cmake seem don't built `lib1` any more. Is there any way i can use
> target_link_library like `target_link_library(exe1 "-Wl, --whole-archive
> ../sub_dir1/liblib1.a")` and cmake link dependency checking still work, or
> other way i can transfer these gcc link options into cmake?
>
> Thanks a lot,
> Chao
>
>
>
> --
> View this message in context:
> http://cmake.3232098.n2.nabble.com/How-to-hundle-gcc-link-options-like-whole-archive-allow-multiple-definition-in-CMake-tp7593563.html
> Sent from the CMake mailing list archive at Nabble.com.
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake
>

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake