[Cmake] Auto-generating exports for Windows DLLs

William A. Hoffman billlist at nycap . rr . com
Fri, 31 Oct 2003 08:51:31 -0500


--=====================_1136265==_
Content-Type: text/plain; charset="us-ascii"

I talk about this in the cmake book on page 43.  I have a small
example that works with a perl script.   It only works with visual studio.
I have attached the example files.  What is really needed now is a non-perl
version of makedef that works with borland and visual studio.


-Bill

At 03:39 PM 10/30/2003, Amitha Perera wrote:
>Hi all
>
>Is anyone working on automatically generating the .def files to create
>DLLs with Windows?
>
>I've looked briefly at this, and can get it to work with Makefiles
>(NMake). It is more difficult with Visual Studio, because the object
>files are in some "random" (Debug, Release, RelWithDebInfo)
>sub-directory of the build tree. In order to automatically generate
>the .def file, I need a list of the object files that will go into the
>library. Is there a way to get this list in a project file?
>
>Thanks,
>Amitha.
>_______________________________________________
>Cmake mailing list
>Cmake at www . cmake . org
>http://www . cmake . org/mailman/listinfo/cmake 

--=====================_1136265==_
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: attachment; filename="createdef.bat"

echo %1 %2 
shift 
shift

echo %1

--=====================_1136265==_
Content-Type: application/octet-stream; name="makedef.pl"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="makedef.pl"

IyBwZXJsIHNjcmlwdCB0byBjcmVhdGUgYSBkbGwgZm9yIHdpbmRvd3MgdXNpbmcgVmlzdWFsIGMr
KyA1LjAKIyBUaGlzIHNjcmlwdCB1c2UgZHVtcGJpbiBmcm9tIHZpc3VhbCBjKysgdG8gZXh0cmFj
dCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzLgoKaWYgKCQjQVJHViA8IDEpCnsKICAgIHByaW50
ICQjQVJHViAuICJcbiI7CiAgICAmcHJpbnRfdXNhZ2U7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnQgdXNhZ2Ug
YW5kIGV4aXQuCnN1YiBwcmludF91c2FnZQp7CiAgICBwcmludCBTVERFUlIgIlVzYWdlOiBtYWtl
ZGVmLnBsIGRlZmZpbGUgbGlicmFyeW5hbWUgb2JqMSBvYmoyIC4uLiBcbiI7CiAgICBwcmludCBT
VERFUlIgImRlZmZpbGUgaXMgdGhlIG5hbWUgb2YgdGhlIGRlZiB0byBiZSBjcmVhdGVkLlxuIjsK
ICAgIGV4aXQgMTsKfQoKCiMgZ2V0IHRoZSBkZWYgZmlsZSBuYW1lCiRkZWZfZmlsZSA9ICRBUkdW
WzBdOwpzaGlmdDsKIyBnZXQgdGhlIGxpYnJhcnkgZmlsZSBuYW1lCiRsaWJfbmFtZSA9ICRBUkdW
WzBdOwpzaGlmdDsKIyBnZXQgdGhlIG9iamVjdCBkaXJlY3RvcnkgbmFtZQokb2JqX2RpciA9ICRB
UkdWWzBdOwpzaGlmdDsKIyBub3cgZ2V0IHRoZSAub2JqIGZpbGUgbmFtZXMKJG9ial9maWxlX25h
bWVzID0gIiI7CiRvbmVvYmogPSAiIjsKd2hpbGUgKCRBUkdWWzBdKQp7CiAgICBpZiggJEFSR1Zb
MF0gPX4gL1wub2JqJC8gKQogICAgewoJJG9uZW9iaiA9ICRBUkdWWzBdOwogICAgICAgIHByaW50
ICRvYmpfZGlyIC4gIlxcIiAuICRBUkdWWzBdIC4gIlxuIjsKCSRvYmpfZmlsZV9uYW1lcyA9ICRv
YmpfZmlsZV9uYW1lcyAuICIgIiAuICRvYmpfZGlyIC4gIlxcIiAuICRBUkdWWzBdOwogICAgfQog
ICAgaWYoICRBUkdWWzBdID1+IC9cLmxpYiQvICkKICAgIHsKCSRsaWJyYXJ5X25hbWVzID0gJGxp
YnJhcnlfbmFtZXMgLiAiICIgLiAkQVJHVlswXTsKICAgIH0KICAgIHNoaWZ0Owp9CnByaW50ICJv
YmpfZmlsZV9uYW1lcyAkb2JqX2ZpbGVfbmFtZXMgXG4iOwokbGlicmFyeV9uYW1lID0gJGxpYl9u
YW1lOwokbGlicmFyeV9uYW1lID1+IHN8LiovfHxnOwokbGlicmFyeV9uYW1lID1+IHN8XC5kbGx8
fDsKJGRpZl9maWxlX25vX2RpciA9IAojJGRlZl9maWxlID0gIiRvYmpfZGlyXFwkbGlicmFyeV9u
YW1lLmRlZiI7CiRkbGxfZmlsZSA9ICIkbGlicmFyeV9uYW1lLmRsbCI7CgoKcHJpbnQgU1RERVJS
ICJDcmVhdGUgJGRlZl9maWxlIGZyb20gJG9ial9maWxlX25hbWVzXG4iOwpwcmludCBTVERFUlIg
ImxpYnJhcnlfbmFtZSAiIC4gJGxpYnJhcnlfbmFtZSAuICJcbiI7CnByaW50IFNUREVSUiAiZGVm
X2ZpbGUgIiAuICRkZWZfZmlsZSAuICJcbiI7CnByaW50IFNUREVSUiAiZGxsX2ZpbGUgIiAuICRk
bGxfZmlsZSAuICJcbiI7CnByaW50IFNUREVSUiAib2JqX2RpciAiIC4gJG9ial9kaXIgLiAiXG4i
OwoKCiMgY3JlYXRlIC5kZWYgZmlsZSBmcm9tIG9iamVjdCBmaWxlcyAKJmNyZWF0ZV9kZWZfZmls
ZTsKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KIyBjcmVhdGUgdGhlIC5kZWYgZmlsZSB0byBjcmVhdGUgdGhlIGxpYnJhcnkgZnJv
bQojIHRoaXMgY2FsbHMgZHVtcGJpbiBmcm9tIHZjNTAgCiMgVE9ETzogcmVhZCBpbiB0aGUgb2xk
IC5kZWYgZmlsZSBhbmQga2VlcCB0aGUgc2FtZSBvcmRpbmFsIG51bWJlcnMKIyAgICAgICBmb3Ig
dGhlIG5ldyAuZGVmIGZpbGUuCiMKc3ViIGNyZWF0ZV9kZWZfZmlsZQp7CiAgICBvcGVuKE9VVEZJ
TEUsIj4kZGVmX2ZpbGUiKSB8fCBkaWUgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJyRkZWZfZmls
ZSdcbiI7CiAgICAKICAgIHByaW50IE9VVEZJTEUgIkxJQlJBUlkgJGxpYnJhcnlfbmFtZSBcbiI7
CiAgICBwcmludCBPVVRGSUxFICJFWEVUWVBFIFdJTkRPV1NcbiI7CiMgICAgcHJpbnQgT1VURklM
RSAiQ09ERSBQUkVMT0FEIE1PVkVBQkxFIERJU0NBUkRBQkxFXG4iOwojICAgIHByaW50IE9VVEZJ
TEUgIkRBVEEgUFJFTE9BRCBNL09WRUFCTEUgTVVMVElQTEVcblxuIjsKICAgIHByaW50IE9VVEZJ
TEUgIkVYUE9SVFNcbiI7CgogICAgJG9yZGluYWxfY291bnRlciA9IDA7CiAgICAKICAgICRzeW1i
b2xmaWxlID0gJG9ial9kaXIgLiAiXFwiIC4gJGxpYnJhcnlfbmFtZSAuICIuc3ltIjsKICAgIHBy
aW50ICJkdW1wYmluIC9zeW1ib2xzIC9vdXQ6JHN5bWJvbGZpbGUgJG9ial9maWxlX25hbWVzIjsK
ICAgIHN5c3RlbSgiZHVtcGJpbiAvc3ltYm9scyAvb3V0OiRzeW1ib2xmaWxlICRvYmpfZmlsZV9u
YW1lcyIpOwogICAgCiAgICBvcGVuKElORklMRSwkc3ltYm9sZmlsZSApIHx8IGRpZSAiQ2FuJ3Qg
b3BlbiBzeW1ib2xmaWxlICckc3ltYm9sZmlsZSdcbiI7CiAgICAKICAgIHdoaWxlICghZW9mKElO
RklMRSkpIHsKCQoJJGxpbmUgPSA8SU5GSUxFPjsKCglAdG9rZW5saXN0ID0gc3BsaXQoIiAiLCRs
aW5lKTsKCQoJaWYgKEB0b2tlbmxpc3RbMl0gbmUgIlVOREVGIikKCXsKCSAgICBpZigoJGxpbmUg
PX4gL25vdHlwZVxzXChcKVxzLyB8fCAkbGluZSA9fiAvbm90eXBlLyApICYmCgkgICAgICAgKCgk
bGluZSA9fiAvRXh0ZXJuYWxccytcfCAoXFMrKVxzKyguKykkLykgfHwKCQkoJGxpbmUgPX4gL0V4
dGVybmFsXHMrXHwgKFxTKykoKS8pKSApCgkgICAgewoJCSRzeW1ib2wgPSAkMTsKCQkkcmVmZXJl
bmNlID0gJDI7CgkJCgkJIyB0aGlzIGlzIGZvciBqdXN0IHBsYWluIEMgZnVuY3Rpb25zIHRoYXQg
aGF2ZSBvbmx5IG9uZQoJCSMgc3ltYm9sIGFuZCBpdCBpcyBub3QgbWFuZ2xlZAoJCWlmKCRyZWZl
cmVuY2UgZXEgIiIpewoJCSAgICAkcmVmZXJlbmNlID0gJDE7CgkJICAgICMgcmVtb3ZlIHRoZSBp
bml0aWFsIHVuZGVyc2NvcmUgZm9yIEMgZnVuY3Rpb25zCgkJICAgICRzeW1ib2wgPX4gcy9eXy8v
OwoJCX0KCQkjIHdlIGRvIG5vdCB3YW50IGRlbGV0ZWluZyBkZXN0cnVjdG9yJ3MgZXhwb3J0ZWQK
CQllbHNpZiAoICRsaW5lID1+IC9kZWxldGluZyBkZXN0cnVjdG9yLyApIHsKCQkgICAgJHJlZmVy
ZW5jZSA9ICIiOwoJCX0KCQkjIHB1YmxpYyBjbGFzcyBtZW1iZXJzCgkJZWxzaWYgKCAkbGluZSA9
fiAvXChwdWJsaWM6ICguKylcKSQvICkgewoJCSAgICAkcmVmZXJlbmNlID0gJDE7CgkJfQoJCSMg
cHJvdGVjdGVkIGNsYXNzIG1lbWJlcnMKCQllbHNpZiAoICRsaW5lID1+IC9cKHByb3RlY3RlZDog
KC4rKVwpJC8gCgkJICAgICAgICYmICRleGNsdWRlX3Byb3RlY3RlZF9zeW1ib2xzICkKCQl7CgkJ
ICAgICRyZWZlcmVuY2UgPSAiIjsKCQl9CgkJIyBwcml2YXRlIGNsYXNzIG1lbWJlcnMKCQllbHNp
ZiAoICRsaW5lID1+IC9cKHByaXZhdGU6ICguKylcKSQvIAoJCSAgICAgICAmJiAkZXhjbHVkZV9w
cml2YXRlX3N5bWJvbHMgKSB7CgkJICAgICRyZWZlcmVuY2UgPSAiIjsKCQl9CgkJIyByZW1vdmUg
dGhlIF9fdGhpc2NhbGwgZnJvbSB0aGUgcmVmZXJlbmNlCgkJJHJlZmVyZW5jZSA9fiBzL19fdGhp
c2NhbGwgLy87CgkJIyBhd2Y6IGZvciB2YzYwIHJlbW92ZSB0aGUgX3JlYWxAIHRoYXQgaXQgZ2Vu
cyBmb3IgZnAgY29uc3RzCgkJaWYgKCRsaW5lID1+IC9ub3R5cGVccytFeHRlcm5hbFxzK1x8XHMr
X19yZWFsXEAvKSB7CgkJICAgICRyZWZlcmVuY2UgPSAnJzsKCQl9CgkJIyBpZiB3ZSBzdGlsbCBo
YXZlIGEgcmVmZXJlbmNlIHRoZW4gb3V0cHV0IHRoZSBzeW1ib2wKCQlpZiAoJHJlZmVyZW5jZSBu
ZSAiIikgewoJCSAgICBwcmludCBPVVRGSUxFICI7XG47ICRyZWZlcmVuY2VcbiI7CgkJICAgIAoJ
CSAgICAjIG5vdHlwZSAoKSBpcyBhIGZ1bmN0aW9uIGFuZCBwbGFpbiBub3R5cGUgaXMgREFUQQoJ
CSAgICAjIGZvciB0aGUgREFUQSB0byB3b3JrIGl0IG11c3QgYWxzbyBoYXZlIGRsbGltcG9ydCBp
biBmcm9udCBvZiBpdCEKCQkgICAgaWYoICRsaW5lID1+IC9ub3R5cGVcc1woXClccy8gKSAKCQkg
ICAgewoJCQlwcmludCBPVVRGSUxFIHNwcmludGYoIiVzXG4iLCRzeW1ib2wpOwoJCSAgICB9CgkJ
ICAgIGVsc2UKCQkgICAgewoJCQkjIFZDNiBkb2Vzbid0IGxpa2UgREFUQT8KCQkJcHJpbnQgT1VU
RklMRSBzcHJpbnRmKCIlc1xuIiwkc3ltYm9sKTsKCQkgICAgfQoJCSAgICAkb3JkaW5hbF9jb3Vu
dGVyKys7CgkJICAgIAoJCSAgICAkc3ltYm9sdGFibGV7JHN5bWJvbH0gPSAkcmVmZXJlbmNlOwoJ
CX0gZWxzZSB7CgkJICAgIHByaW50IE9VVEZJTEUgIjsgcmVqZWN0ICRsaW5lIjsKCQl9CgkgICAg
fQoJfQogICAgfQogICAgY2xvc2UoSU5GSUxFKTsKICAgIHVubGluaygkc3ltYm9sZmlsZSk7CiAg
ICBjbG9zZShPVVRGSUxFKTsKfQo=
--=====================_1136265==_
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: attachment; filename="myexe.cxx"

#include <iostream>
#include "mylib.h"
int main()
{
  std::cout << myTen() << "\n";
  std::cout << myEight() << "\n";
}

--=====================_1136265==_
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: attachment; filename="mylib2.cxx"

int myEight()
{
  return 8;
}

--=====================_1136265==_
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: attachment; filename="mylib.cxx"

#include "mylib.h"

int myTen()
{
  return 10;
}

--=====================_1136265==_
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: attachment; filename="mylib.h"

int myTen();
int myEight();

--=====================_1136265==_
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: attachment; filename="CMakeLists.txt"

SET(SOURCES mylib.cxx mylib2.cxx)
STRING(REGEX REPLACE "\\.cxx" ".obj" OBJECTS "${SOURCES}")
ADD_LIBRARY(mylib SHARED ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/mylib.def)
SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/mylib.def PROPERTIES GENERATED 1)
ADD_EXECUTABLE(myexe myexe.cxx)
TARGET_LINK_LIBRARIES(myexe mylib)

SET(OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
STRING(REGEX REPLACE "/" "\\\\" OUTDIR ${OUTDIR})
ADD_CUSTOM_COMMAND(
  TARGET mylib PRE_LINK 
  COMMAND perl 
  ARGS ${CMAKE_CURRENT_SOURCE_DIR}/makedef.pl ${CMAKE_CURRENT_BINARY_DIR}\\mylib.def mylib ${OUTDIR} ${OBJECTS} 
  COMMENT "Create .def file")


  
--=====================_1136265==_--