From c8f45798b9890adff5bb64297d36c1e3fea1cea6 Mon Sep 17 00:00:00 2001 From: "Whitney.Jackson" Date: Mon, 26 Mar 2012 00:06:29 -0500 Subject: [PATCH] make the build process friendlier --- .gitignore | 1 + Makefile.PL | 25 ++++++---- q/k.h | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+), 9 deletions(-) create mode 100644 q/k.h diff --git a/.gitignore b/.gitignore index 56b1df8..3502a49 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ K-*.tar.gz MYMETA.json MYMETA.yml K.c +q/c.o diff --git a/Makefile.PL b/Makefile.PL index 0e1aa19..a0d5c8f 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -6,19 +6,26 @@ use ExtUtils::Depends; mkdir 'build'; my $pkg = ExtUtils::Depends->new('K::Raw'); -my $q_home = '/home/wjackson/q'; -my $q_include = "$q_home/include"; -my $q_lib = "$q_home/lib"; +my $c_o = defined $ENV{QOBJ} ? $ENV{QOBJ} + : -f 'q/c.o' ? 'q/c.o' + : undef + ; + +if (!defined $c_o && !-f $c_o) { + die q{*** Unable to find the required file c.o which is distributed by } + . q{kx.com. Set the environment variable QOBJ to the location of c.o } + . q{or download the appropriate file and place it into the q } + . q{directory. Find the correct file for you system here: } + . q{http://kx.com/q. For example the url for the 32 bit linux file is } + . q{http://kx.com/q/l32/c.o .} + ; +} checklibs( - libpath => $q_lib, - incpath => $q_include, - lib => 'k', header => 'k.h', ); -$pkg->set_inc("-I$q_include"); -$pkg->set_libs("-L$q_lib -lk"); +$pkg->set_inc("-Iq"); $pkg->add_xs('K.xs'); $pkg->add_pm( './lib/K/Raw.pm' => '$(INST_LIBDIR)/K/Raw.pm', @@ -29,7 +36,7 @@ $pkg->save_config('build/IFiles.pm'); makemaker_args( $pkg->get_makefile_vars, - OBJECT => '$(O_FILES)', # link all the C files too + OBJECT => "\$(O_FILES) $c_o", # link all the C files too ); name 'K'; diff --git a/q/k.h b/q/k.h new file mode 100644 index 0000000..d7d5d46 --- /dev/null +++ b/q/k.h @@ -0,0 +1,137 @@ +#ifndef KX +#define KX +typedef char*S,C;typedef unsigned char G;typedef short H;typedef int I;typedef long long J;typedef float E;typedef double F;typedef void V; +#ifdef __cplusplus +extern"C"{ +#endif +#if KXVER>=3 +typedef struct k0{signed char m,a,t;C u;I r;union{G g;H h;I i;J j;E e;F f;S s;struct k0*k;struct{J n;G G0[1];};};}*K; +extern K ktn(I,J),kpn(S,J); +#define DO(n,x) {J i=0,_i=(n);for(;i<_i;++i){x;}} +#else +typedef struct k0{I r;H t,u;union{G g;H h;I i;J j;E e;F f;S s;struct k0*k;struct{I n;G G0[1];};};}*K; +extern K ktn(I,I),kpn(S,I); +#define DO(n,x) {I i=0,_i=(n);for(;i<_i;++i){x;}} +#endif +#ifdef __cplusplus +} +#endif +//#include +// vector accessors, e.g. kF(x)[i] for float&datetime +#define kG(x) ((x)->G0) +#define kC(x) kG(x) +#define kH(x) ((H*)kG(x)) +#define kI(x) ((I*)kG(x)) +#define kJ(x) ((J*)kG(x)) +#define kE(x) ((E*)kG(x)) +#define kF(x) ((F*)kG(x)) +#define kS(x) ((S*)kG(x)) +#define kK(x) ((K*)kG(x)) + +// type bytes qtype ctype accessor +#define KB 1 // 1 boolean char kG +#define KG 4 // 1 byte char kG +#define KH 5 // 2 short short kH +#define KI 6 // 4 int int kI +#define KJ 7 // 8 long long kJ +#define KE 8 // 4 real float kE +#define KF 9 // 8 float double kF +#define KC 10 // 1 char char kC +#define KS 11 // * symbol char* kS + +#define KP 12 // 8 timestamp long kJ (nanoseconds from 2000.01.01) +#define KM 13 // 4 month int kI (months from 2000.01.01) +#define KD 14 // 4 date int kI (days from 2000.01.01) + +#define KN 16 // 8 timespan long kJ (nanoseconds) +#define KU 17 // 4 minute int kI +#define KV 18 // 4 second int kI +#define KT 19 // 4 time int kI (millisecond) + +#define KZ 15 // 8 datetime double kF (DO NOT USE) + +// table,dict +#define XT 98 // x->k is XD +#define XD 99 // kK(x)[0] is keys. kK(x)[1] is values. + +#ifdef __cplusplus +extern"C"{ +#endif +extern I khpun(const S,I,const S,I),khpu(const S,I,const S),khp(const S,I),ymd(I,I,I),dj(I);extern V r0(K),sd0(I),m9(),kclose(I);extern S sn(S,I),ss(S); +extern K ktj(I,J),ka(I),kb(I),kg(I),kh(I),ki(I),kj(J),ke(F),kf(F),kc(I),ks(S),kd(I),kz(F),kt(I),sd1(I,K(*)(I)),dl(V*f,I), + knk(I,...),kp(S),ja(K*,V*),js(K*,S),jk(K*,K),k(I,const S,...),xT(K),xD(K,K),ktd(K),r1(K),krr(S),orr(S),dot(K,K),b9(I,K),d9(K); +#ifdef __cplusplus +} +#endif + +// nulls(n?) and infinities(w?) +#define nh ((I)0xFFFF8000) +#define wh ((I)0x7FFF) +#define ni ((I)0x80000000) +#define wi ((I)0x7FFFFFFF) +#ifdef WIN32 +#define nj ((J)0x8000000000000000) +#define wj ((J)0x7FFFFFFFFFFFFFFF) +#define nf (log(-1.0)) +#define wf (-log(0.0)) +#define isnan _isnan +#define finite _finite +extern double log(); +#else +#define nj 0x8000000000000000LL +#define wj 0x7FFFFFFFFFFFFFFFLL +#define nf (0/0.0) +#define wf (1/0.0) +#define closesocket(x) close(x) +#endif + +// remove more clutter +#define O printf +#define R return +#define Z static +#define P(x,y) {if(x)R(y);} +#define U(x) P(!(x),0) +#define SW switch +#define CS(n,x) case n:x;break; +#define CD default + +#define ZV Z V +#define ZK Z K +#define ZH Z H +#define ZI Z I +#define ZJ Z J +#define ZE Z E +#define ZF Z F +#define ZC Z C +#define ZS Z S + +#define K1(f) K f(K x) +#define K2(f) K f(K x,K y) +#define TX(T,x) (*(T*)((G*)(x)+8)) +#define xr x->r +#define xt x->t +#define xu x->u +#define xn x->n +#define xx xK[0] +#define xy xK[1] +#define xg TX(G,x) +#define xh TX(H,x) +#define xi TX(I,x) +#define xj TX(J,x) +#define xe TX(E,x) +#define xf TX(F,x) +#define xs TX(S,x) +#define xk TX(K,x) +#define xG x->G0 +#define xH ((H*)xG) +#define xI ((I*)xG) +#define xJ ((J*)xG) +#define xE ((E*)xG) +#define xF ((F*)xG) +#define xS ((S*)xG) +#define xK ((K*)xG) +#define xC xG +#define xB ((G*)xG) + +#endif +